前言
背景
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