关于hexo:Hexo博客部署的终极解决办法云域名HttpsNginx镜像Docker部署

3次阅读

共计 4597 个字符,预计需要花费 12 分钟才能阅读完成。

前言

背景

17 年在大学用 Hexo 部署了第一个博客后,始终对 Hexo 集体博客进行革新降级。最开始是挂载在 Github.io,后用 Nginx 迁徙至自有域名 chanchun.net,在起初启用了 GitHooks 让 Hexo 构建产物间接 SSH 推送至云,再起初通过 letsencrypt 降级了 Https。自从 Oracle Cloud 凋谢了收费实例后,始终想把博客服务迁徙到收费的云上(无奈工作太忙,也怪搬瓦工服务器太难用)。那么与其从 0 开始迁徙,还不如把始终以来的积淀(Https、GitHooks、Nginx)也一起 Docker 化掉。不便当前持续迁徙,也给本人想折腾博客的人一个我认为最终极的解决方案。

你须要筹备什么

云根底配置

  • 买一个 Niubility 的域名(举荐国外域名注册商)
  • 买一个 Niubility 云服务实例(举荐国外云服务商)
  • 把你的域名 DNS 解析至你的云公网 IP(失效工夫预计从 0 -48 小时不等)

Hexo 熟能生巧

  • 相熟 Hexo 的基本操作,相熟hexo init hexo new hexo clean hexo generate hexo server hexo deploy 等命令,并能启动 Hexo 服务构建出动态 html,如果曾经搭建过了简略的博客零碎就更棒棒

Docker

  • 理解一下 Docker 基本操作docker build docker run 等等一系列操作

正题

思路

第一步,新建一个 hexo-docker 工程来构建 Docker 镜像(基于 Nginx 镜像),外面有且仅蕴含 Dockerfile 和初始 Nginx 配置。Dockerfile 中形容了 Githooks 挂载地址,装置好了 Certbot 命令,并退出初始 Nginx 配置。

第二步,在云服务中间接 Docker Run 起结构好的镜像,进入镜像生成好 letsencrypt 证书,配置好近程 SSH 提供给 Hexo Deploy。

第三步,配置好本地的 Hexo 代码,Hexo Deploy 就能看到带绿锁的自有域名的博客了。

Show Code

Dockerfile

# 基于 Nginx 镜像
FROM nginx:latest

#换国内的源,这里用网易源
RUN sed -i 's#http://deb.debian.org#https://mirrors.163.com#g' /etc/apt/sources.list
RUN sed -i 's#http://security.debian.org#https://mirrors.163.com#g' /etc/apt/sources.list

#更新 Docker 中的 apt-get
RUN rm -Rf /var/lib/apt/lists/* && apt-get update

#装置 Git,挂载 Githooks 钩子,并将产物搁置在 var/www/hexo 中
RUN apt-get install -y git
RUN git init --bare ~/blogs.git
RUN mkdir -p /var/www/hexo
RUN echo "git --work-tree=/var/www/hexo --git-dir=/root/blogs.git checkout -f" >~/blogs.git/hooks/post-receive
RUN chmod a+x ~/blogs.git/hooks/post-receive

#SSH 初始化
RUN apt-get install -y openssh-server
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -y
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -y
RUN ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -y

#装置 Certbot
RUN apt-get install -y certbot
RUN apt-get install -y python3-certbot-nginx

#初始化 Nginx 配置挂载,这里抉择间接笼罩所有配置
ADD nginx/hexo.conf /etc/nginx/nginx.conf

#裸露 22 SSH
#裸露 80 HTTP
#裸露 443 HTTPS
EXPOSE 22
EXPOSE 80
EXPOSE 443

Nginx 配置

user nginx;
worker_processes auto;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {worker_connections 1024;}

http {
  include /etc/nginx/mime.types;
  default_type application/octet-stream;

  log_format main '$remote_addr - $remote_user [$time_local]"$request"''$status $body_bytes_sent "$http_referer" ''"$http_user_agent""$http_x_forwarded_for"';

  access_log /var/log/nginx/access.log main;

  sendfile on;
  #tcp_nopush     on;

  keepalive_timeout 65;

  #gzip  on;

  #include /etc/nginx/conf.d/*.conf;
  server {
    listen 80;
    server_name chanchun.net; #记得改成本人的域名

    location / {
      root /var/www/hexo; #要和刚刚的 Githooks 目录对应上
      index index.html index.htm;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {root /usr/share/nginx/html;}
  }
}

我曾经将代码上传到了 Github,给个星星?

构建和启动

构建

docker build -t hexo-docker .

启动

这里要在云上 Run 了,如果在本机跑的化能跑起来然而没法持续搞证书了。至于怎么把构建好的镜像转移到云上呢?各位搞开源的 Docker Hub 也行,间接 Copy 也行。

留神这里应用了 volume 计划,为后续申请证书的挂载做筹备

docker run -v $(pwd)/letsencrypt:/etc/letsencrypt -d -p 80:80 -p 443:443 -p 8004:22 hexo-docker

我曾经将构建出的 Docker 镜像上传到了 Docker Hub,给个星星?

配置证书

进入 Docker Container

docker exec -it "[your_container_name]" /bin/bash

申请证书

咱们在用 Dockfile 来构建的时候曾经装置了 Certbot,咱们能够利用 Certbot 帮忙装置 Https 证书,同时 Certbot 会自动识别上文中配置的 Nginx 文件,退出证书验证和 443 端口凋谢。

certbot --nginx -d "[your_domain.com]"

这里就依照提醒一步一步走就是了,最初见到 congratulation! 就能证实证书曾经装置好了,因为咱们在 docker run 时采纳了 volume 计划,生成出的证书会挂载到云服务的$(pwd)/letsencrypt 目录下,并关联到 Docker 外部的 /etc/letsencrypt 目录。这样能保障镜像中不带 CA 证书,解耦的同时也确保 Docker 在迁徙的时候的安全性。

能够看到/etc/nginx/nginx.conf 曾经退出了 443 端口和证书门路。

server {
  server_name chanchun.net;

  location / {
    root /var/www/hexo;
    index index.html index.htm;
  }

  error_page 500 502 503 504 /50x.html;
  location = /50x.html {root /usr/share/nginx/html;}

  listen 443 ssl; # managed by Certbot
  ssl_certificate /etc/letsencrypt/live/chanchun.net/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/chanchun.net/privkey.pem; # managed by Certbot
  include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

证书更新

/usr/bin/certbot renew

Letsencrypt 3 个月就须要更新一次,很多人用自动更新工作来实现更新。我这边就不想用了,因为我感觉每个月收到提醒邮件后上云更新一把是一件很欢快的事。如果你须要自动更新能够应用上面命令

echo "0 0 1 * * /usr/bin/certbot renew --quiet" >> /etc/crontabs/root

配置 Hexo Deploy 的 SSH

还是在 Docker 镜像内操作,不须要来到 Docker 镜像外部。如果来到了看上述“进入 Docker Container”命令。

顺次执行上面的命令吧,留神 your_ssh_public_key 改成本人电脑上的公钥,在~/.ssh/xxx.pub 中。

mkdir ~/.ssh
echo "[your_ssh_public_key]" > ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
mkdir /run/sshd
/usr/sbin/sshd

Hexo 推送

祝贺你胜利在即,到这一步曾经能够退出 Docker 镜像,并且退出云服务器了(有没有发现齐全没改云服务器自身的配置,感叹 Docker 切实弱小!)。接下来都是间接在本机操作。

更改 Hexo _config.yml 配置

deploy:
  type: git
  repo: root@hexo-test:/root/blogs.git #Docker 中 8004 端口作为 SSH 端口,但 repo 没法写端口号,写一个 hexo-test 作为 config
  branch: master

新增 ~/.ssh/config 文件

~/.ssh/config中配置你的云服务公网 ip,ssh 端口即可(依照文章来就是 8004)

Host hexo-test
  HostName [your_remote_server_ip]
  Port 8004

推送 Hexo

hexo deploy

Success! 当hexo deploy 胜利之后,你的博客就能够通过域名拜访了,并且带有小绿锁哦。

总结一下

这套计划有三解耦:云服务和 Docker 解耦,证书(在云服务上)和 Docker 解耦,HTML 动态资源和 Docker 解耦(Githooks)。同时 Nginx 也无需手工配置。这套计划不仅可用于博客,只有是动态文件的部署,都能实用。

最初求个赞吧:Github,Docker Hub

正文完
 0