前言

背景

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.listRUN sed -i 's#http://security.debian.org#https://mirrors.163.com#g' /etc/apt/sources.list#更新Docker中的apt-getRUN rm -Rf /var/lib/apt/lists/* && apt-get update#装置Git,挂载Githooks钩子,并将产物搁置在var/www/hexo中RUN apt-get install -y gitRUN git init --bare ~/blogs.gitRUN mkdir -p /var/www/hexoRUN echo "git --work-tree=/var/www/hexo --git-dir=/root/blogs.git checkout -f" >~/blogs.git/hooks/post-receiveRUN chmod a+x ~/blogs.git/hooks/post-receive#SSH初始化RUN apt-get install -y openssh-serverRUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -yRUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -yRUN ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -y#装置CertbotRUN apt-get install -y certbotRUN apt-get install -y python3-certbot-nginx#初始化Nginx配置挂载,这里抉择间接笼罩所有配置ADD nginx/hexo.conf /etc/nginx/nginx.conf#裸露22 SSH#裸露80 HTTP#裸露443 HTTPSEXPOSE 22EXPOSE 80EXPOSE 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