阿熊的Caddy+Hugo+Acme.sh配置填坑笔记

前言

最近想比较一下caddy和nginx的服务及功能,

设定的目标是用hugo搭建一个静态站点然后通过Caddy服务起来提供

https://axiong.me 的访问。

于是就走上了一条不断踩坑的不归路,在此记录一下踩坑、填坑的过程。

第〇个踩到的坑:github的CNAME站点不支持https

理论上站点也可以放在github的gh-pages上,所以我就尝试了

Hugo托管到Github的流程说明

Tips

我用的是gh-pages的分支方案 项目master分支根节点可以加gitignore忽略掉hugo的发布路径public,方便测试 注意安装主题的话最好用submodule的方式而不是文档中的git clone,比如:

1
git submodule add https://github.com/christianmendoza/hugo-smpl-theme themes/hugo-smpl-theme

这样后续部署的时候才不会遇到尴尬的项目没法自动部署的问题。

问题

github的CNAME站点不支持https

不过@根域名CNAME记录和MX记录TXT记录冲突,蛋疼(免费邮局服务不想放),而且MD不支持https,所以,方案被我毙掉了。

解决方案

自己有vps就可以任性一下了,也顺便捣腾一下Caddy的https服务

第一个踩到的坑:Caddy自动申请证书不成功

就是Caddy自动申请 Let’s Encrypt 的请求总是总是timeout, 不知道是不是因为解析服务用cloudxns的问题,而caddy目前还没有cloudxns的组件。

解决方案

Acme.sh 这个自动脚本做配置做证书的issue和renew,注意要采用dns的api模式,毕竟到这一步Caddy的服务还被申请证书卡着。

参考:Acme.sh说明

1. 证书申请

1
acme.sh --issue --dns -d axiong.me

2. 到解析服务商后台添加对应的Txt记录

我的是cloudxns基本上就是加一条的Txt类型记录,_acme-challenge为主host部分记录,内容部分是acme终端中给出的。

3. 重新生成证书

1
acme.sh  --renew   -d axiong.me

4. 到你的解析服务商后台申请API的key和secret

参考链接

Acme.sh的DNSApi的配置说明

5. 导出/安装证书到本地供后续Caddy使用

1
acme.sh  --installcert  -d axiong.me --key-file /etc/ssl/caddy/certs/axiong.me/ssl.key --fullchain-file /etc/ssl/caddy/certs/axiong.me/fullchain.cer --reloadcmd "systemctl restart caddy"

按照acme.sh的说明,它的crontab脚本会自动续期证书。

免费ssl证书问题至此算是告一段落。

第二个踩到的坑:Caddy+Hugo组合配置问题

网上有Caddy+Hugo的教程:

都有一些小坑,比如:

  • caddy的插件有依赖必须通过他官方的服务整合编译,上面的配置中依赖http.hugo,http.minify,http.git等
  • caddy的官方下载如果插件加多了很可能给你返回500,安装失败
  • caddy的hugo插件,hugo指令必须是环境变量里支持的,我适用golang开发环境的hugo如果作为系统服务就会找不到
  • caddy的配置问题,errors节点里不能配置log指令

解决方案

查文档,看官方说明,例子。

1. caddy+插件下载问题,至少需要http.git,http.minify,http.hugo

精简插件数量只装必要的

Caddy官方的下载页面可以定制,定制完毕页面最下方有命令行指令参考

https://caddyserver.com/download

一键安装指令:

1
curl https://getcaddy.com | bash -s personal dns,hook.service,http.git,http.hugo,http.minify,tls.dns.rfc2136

或者用下载链接下载后解压缩后把caddy放到/usr/local/bin/caddy

1
wget -O "caddy.tar.gz" "https://caddyserver.com/download/linux/amd64?plugins=dns,hook.service,http.git,http.hugo,http.minify,tls.dns.rfc2136&license=personal"

2. hugo指令必须是环境变量里支持的,去官方直接下载发行版的安装包

注意apt-get或者snap安装的版本会比较老,建议直接去 https://github.com/gohugoio/hugo/releases 下载 比如ubuntu用的.deb的包 下载后安装

1
sudo dpkg -i hugo_xxx_Linux-64bit.deb

第三个踩到的坑:Caddy的ulimit问题

其实不算是Caddy的锅,系统的limits配置我的vps没调整,Caddy会报

1
caddy: WARNING: File descriptor limit 1024 is too low for production servers. At least 8192 is recommended. Fix with "ulimit -n 8192". 

解决方案

临时解决方案就是执行提示里的

1
ulimit -n 8192

再跑caddy,彻底的解决方案是修改系统的limits配置:

1
sudo vim /etc/security/limits.conf

追加 对文件句柄的配置设定

1
2
3
4
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

第四个踩到的坑:Caddy的默认端口是2015

Caddy的配置有个坑,如果tls不是他它自动签发的模式,的情况下 http的端口用的是2015。

参见

解决方案

手工配置自动跳转

1
2
3
4
5
6
7
http://axiong.me {
    redir https://axiong.me
}
https://axiong.me {
  tls ssl.cer ssl.key
  ...
}

第五个踩到的坑:Caddy自启动的Systemd配置问题

配置Caddy的Systemd自启动遇到

1
caddy.service: Failed at step NAMESPACE spawning /usr/local/bin/caddy: No such file or directory

启动不了

参考 https://caddy.community/t/starting-with-systemd-failed-at-step-namespace-spawning-usr-local-bin-caddy-no-such-file-or-directory/423

改吧改吧,然后转角遇到爱,尼玛,又出现

1
2
ExecStart=/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp (code=exited, status=226/NAMESPACE)
 Main PID: xxx (code=exited, status=226/NAMESPACE)

解决方案

死活找不到原因,怒了,重新按社区贡献的配置文档重新整了一遍,

参考 https://github.com/mholt/caddy/tree/master/dist/init/linux-systemd 文档,并下载caddy.service作为模板

重新一步步把用户权限配置了一遍,搞定,不在出现226/NAMESPACE问题。

优化完善Caddy配置

查Caddy的官方文档,完整的解决配置文件Caddyfile内容问题

修改后的完整示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
http://axiong.me {
    redir https://axiong.me
}
https://axiong.me {
    #tls off
    #tls admin@example.com
    tls /etc/ssl/caddy/certs/axiong.me/fullchain.cer /etc/ssl/caddy/certs/axiong.me/ssl.key
    minify
    gzip
    log / /var/log/caddy/pub-axiong.me_access.log "{combined}" {
        rotate_size 100 # Rotate a log when it reaches 100 MB
        rotate_age  14  # Keep rotated log files for 14 days
        rotate_keep 10  # Keep at most 10 rotated log files
        rotate_compress # Compress rotated log files in gzip format
    }
    errors /var/log/caddy/pub-axiong.me_error.log {
        404 404.html # Not Found
        rotate_size 100 # Rotate a log when it reaches 100 MB
        rotate_age  14  # Keep rotated log files for 14 days
        rotate_keep 10  # Keep at most 10 rotated log files
        rotate_compress # Compress rotated log files in gzip format
    }
    root /var/www/axiong.me/public
    git {
        repo https://github.com/nickfan/axiong.me
        path /var/www/axiong.me
        then hugo --destination=/var/www/axiong.me/public
        hook /webhook [你在github后台设置的webhook的口令]
        hook_type github
        clone_args --recursive
        pull_args --recurse-submodules
        interval 3600
    }
    hugo
}

其中webhook就是你代码托管服务比如github上代码repo后台设定中添加一下webhook这样代码提交以后就会自动构建你的新静态网站 比如我的托管在github上webhook.settings设定在 https://github.com/nickfan/axiong.me/settings/hooks

添加webhook,PayloadURL填写你域名/webhook,比如我的:

1
https://axiong.me/webhook

content-type选json secret填写和Caddyfile中的口令保持一致 其他保持默认即可。

至此Caddy才算是初步可以看了。

  • 有访问日志、有错误日志,日志都有rotate不会撑满磁盘。
  • 有minify+gzip做输出优化
  • 免费自定义ssl证书,有钱你换DV,OV级别的我也没意见
  • 自动http->https跳转
  • 改完站点提交代码后webhook自动发布上线

TODO

webhook的配置可以从Caddyfile配置中用环境变量替换出来,放到Systemd的附加配置里,比如加个override.conf之类的,更完善。

android终端环境配置

效果图

惯例,先看最终执行效果图

termux-screenshot

android客户端软件清单

android-app-list

无需root的终端app,基于busybox

更舒服的编码键盘

快速切换键盘(通知栏输入法切换)

非常简单的远程键盘输入,你所需要的只是一个telnet终端工具(windows的telnet命令或者SecureCRT,XShell之类的都可以) 打开Remote Keyboard后会告诉你本机的服务地址和端口 同时你选中的输入法是Remote Keyboard 在你的终端工具/指令中连接上此ip端口即可

1
telnet 192.168.1.247 2323

然后就尽情的输入吧,不过话说,有台式机还要在手机玩,应该是缺乏安全感吧。

remote_keyboard-telnet-screenshot

这货也是基于busybox的,不过属于一次性集成n多包的那种,目前没看到追加包的办法只有rpm指令,如果内置的功能够用,这个备选也不错。

如果你仅仅是需要远程登录到服务器临时解决一下问题的话这个ssh终端工具也许会更适合你。

准备

如果你愿意认真读Termux的帮助文档,这里的很多废话可以略过,想省时间的话看下面:

触屏键盘

  • 触屏键盘手机的实体键位中的音量减相当于linux中的Control键(CTRL)
  • 触屏键盘手机的实体键位中的音量加相当于linux中的Alt键(ALT)或一些特殊功能键
  • 触屏键盘记得按音量加 + Q键 开启扩展功能键视图会比较方便输入

安装包管理器

debian/ubuntu的包管理器的那一套的简装版

  • 安装包 apt install xxx

  • 搜索包 apt search xxx

  • 卸载包 apt remove xxx

  • 列出已安装包 apt list --installed

所有的apt命令也可以用pkg命令替代 比如pkg install 等价于apt install

我本地配置基本环境所用到的包清单:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
aria2
coreutils
curl
git
golang
gzip
less
lftp
nano
openssh
screenfetch
vim
wget
zsh
termux-tools

挂载点配置

运行指令:

1
termux-setup-storage

具体的挂载点可以参考 https://termux.com/storage.html 在这里就不展开说了

交互终端配置

你可以安装zsh来提供更便捷的使用体验

1
apt install zsh

切换zsh为默认shell:

1
chsh -s zsh

注意你的配置里locale的设置应该会无效,至少我目前是把服务端的.profile修改后再使用的

默认的zsh啥也木有,而网上的oh-my-zsh又没办法直接安装在termux里 有人已经做好了移植版:

https://github.com/Cabbagec/termux-ohmyzsh

安装指令:

1
2
3

sh -c "$(curl -fsSL https://github.com/Cabbagec/termux-ohmyzsh/raw/master/install.sh)"

记得先apt install 我上面包列表中的curl至少。

最后可以根据自己的个人喜好修改一下~/.zshrc配置中的主题

个人比较喜好ys主题,诸君请随意。

手机ssh服务

除了Remote Keyboard这种歪脖看手机屏幕,电脑键盘打字的方式,更传统的方式是把手机当服务器ssh连进来玩。

apt install openssh 之后即可,不过有几点注意的地方:

  • sshd需要手工跑一下

  • 有1024低端口安全限制所以这里sshd的服务是开在8022端口上的

  • 因为Termux是不需要root的系统,所以一般情况下你登录的用户名需要你自己看一下:

1
whoami
  • ssh登录是key公钥模式登录,你可以先手工scp远程的公钥到本地的路径再cat追加到~/.ssh/authorized_keys中然后在客户机以密钥对的私钥登录
1
ssh -p8022 xxx@192.168.1.247

其中xxx是你whoami中查到的值

  • 如果你要从手机上ssh到其他服务器

最简单的办法,copy私钥到~/.ssh/id_rsa位置然后在zsh里开启ssh-agent插件:

1
2
plugin=(git ssh-agent)

或者你也可以试试在自己的.profile或者其他交互启动脚本中追加:

1
2
3
4
5

if [ -f ~/.ssh/id_rsa ]; then
    ssh-add -K ~/.ssh/id_rsa 2>/dev/null
fi

杂谈

这货虽然是busybox组装的但是基础组件都能慢慢堆叠,

虽然环境简陋了点,但好歹真正的应急移动办公也算有点着落

另外私钥还是要保管好的说。

除此之外,有aria2可以用来当下载服务用,路径记得设在外面的挂载点里,配合android端的ui,你懂的。

golang装好了之后还能起个本地web服务玩玩,总之爱折(zhuang)腾(bi)的朋友不容错过。

github上hexo静态博客自动部署配置笔记

前言

越来越觉得时间不够用,千头万绪,容我喝口水。。

写blog的频率还赶不上wordpress的安全更新的推送频率,思考了一下还是决定把博客迁移到github上来,动机:

  1. wordpress的强大对于我等懒人实在是太折腾了。
  2. https+全静态,后续维护不想再折腾太多。
  3. 不怕忘了续费,哪怕百年之后也算留点痕迹。(但愿github在10年之内能继续服务下去,至少感觉比国内的服务靠谱一点,关站的几率较小)

方案

目前来说看了一眼 https://www.staticgen.com/

jekyll最火,ruby的,环境配置方面感觉有点担心 hugo其次, golang的,虽然最快,最强大,但从写博客的角度出发而言,功能不多,而且貌似教程不多。 hexo再次,node的,教程挺多,还有比较成熟的主题,就他了。

  • 建站工具: hexo + NexT 主题模板
  • github公共主页静态页面网站
  • bitbucket后端项目源码
  • codeship持续集成自动发布

预备

  1. git本地配置+ssh公钥配置
  2. github账号
  3. bitbucket账号
  4. codeship账号

安装

  • 安装hexo
1
npm install -g hexo-cli
  • 生成并初始化博客
1
hexo init myblog
  • 安装NexT主题 (下载最新版本的主题并mv到myblog/themes/next路径)
1
2
3
4
5
cd myblog
wget https://github.com/iissnan/hexo-theme-next/archive/v5.1.1.tar.gz
tar zxf v5.1.1.tar.gz
mv hexo-theme-next-5.1.1 themes/next
rm -rf v5.1.1.tar.gz

参考链接:

使用

基本页面

  • 关于 页面
1
hexo new page about

内容自己填写

  • tags 页面
1
hexo new page tags

内容:

1
2
3
4
5
6
---
title: tags
date: 2017-07-25 15:06:12
type: "tags"
comments: false
---
  • categories 页面
1
hexo new page categories

内容:

1
2
3
4
5
6
7
---
title: categories
date: 2017-07-25 16:21:02
type: "categories"
comments: false
---

新建文章

1
hexo new "hello world"

文章源文件存储在source/_posts/

不用的文章删掉文件重新发布即可。

本地测试

1
hexo s -g

访问 http://localhost:4000 预览效果。

清理

1
hexo clean

手工发布

1
hexo d -g

自动发布配置

  • 在bitbucket上新建私有项目(部分配置key需要保密)
  • 在codeship中导入此私有项目
  • 在codeship中查看deploy-keys发布公钥,并在github的对应静态站点中配置此发布公钥并允许write写入权限
  • 配置codeship基础setup初始化指令:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10

nvm install 6.11.1
npm install hexo-cli -g
npm install
# or, if you prefer to use yarn
#yarn install

git config --global user.email "yourname@example.com"
git config --global user.name "yourname"

注意记得指令中配置git的全局配置,不然部署流程可能失败

  • 删掉test的commands的pipeline 指令,不需要
  • 配置deploy部署指令的分支为master
  • 配置部署指令的脚本为custom scripts:
1
2
hexo clean
hexo d -g

注意:如果你使用了algolia的三方服务组件的情况下: 你的codeship配置中环境变量要加上HEXO_ALGOLIA_INDEXING_KEY的变量 并且在algolia 新建对应的索引用的apikey,设置流程参考:hexo-algolia

部署脚本的指令也要改为:

1
2
3
4
hexo clean
hexo g
hexo algolia
hexo d
  • 写点内容到你的博客中,并提交push到bitbucket的项目中去(source/_posts/中新建xxx.md的日志文件)

等着发布完成的通知

查看你的静态博客站点看效果吧。

当前这篇文章就是在bitbucket的在线创建文件编辑器(支持markdown)中编写的。

TODO

在线图床可以用imgur或者七牛的服务,如果写文字为主也可以本地存图,

完整的想好好的像medium、简书之类的服务在线码字贴图的话,

一种方案就是写个前后端编辑器处理上传文件服务和提交/获取bitbucket项目文件。 再牛一点就是纯h5方案前端集成图床的api接口+bitbucket的服务接口。