Hugo+Git+Hooks+Remark42工作流部署经验

• 本文约 324 字,阅读大致需要 2 分钟 • Sysadmin

系统部署

  1. 由于个人部署,Hugo、Git、Remark42均为GO程序,因此操作系统依赖小,各个版本的BSD和LINUX均能满足要求;本项目部署在Aliyun的VPS,为方便,采用Debian。
  2. 部署顺序:Caddy、Gitea、Remark42、Hugo、Git hooks。
  3. 个人站点,建议直接二进制部署。

踩坑经验

(一)Caddy

  1. 建议采用分站点的方式安排配置文件,主配置文件不变,各站点配置文件置于conf.d中,便于组织和排故。
  2. 建议采用统一的日志生成机制。
  3. 本项目采用Aliyun DNS,因此需要使用xcaddy重新编译,加入aliyun dns插件。
  4. Aliyun DNS的id和secret,通过caddy的env文件导入,具体查阅插件说明。
  5. 本人采用的配置文件(脱密版):
    • 主文件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
    
    {
            email xxx@xxx.xxx
            storage file_system /var/lib/caddy/keys
    }
    # 定义可复用日志模板
    (logs) {
            # 访问日志
            log {
                    output file /var/log/caddy/{args[0]}_access.log {
                            roll_size 10MB
                            roll_keep 5
                            roll_keep_for 720h
                    }
                    level INFO
            }
            # 错误日志
            log {
                    output file /var/log/caddy/{args[0]}_error.log {
                            roll_size 5MB
                            roll_keep 5
                    }
                    level ERROR
            }
    }
    # 导入所有站点配置
    import /etc/caddy/conf.d/*.caddy
    • 站点文件(示例)
     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
    
    https://www.aibsd.cn {
            tls {
                    resolvers 1.0.0.1
                    dns alidns {
                            access_key_id "{env.ALICLOUD_ACCESS_KEY_ID}"
                            access_key_secret "{env.ALICLOUD_ACCESS_KEY_SECRET}"
                    }
            }
            root * /opt/www/
            # Hugo对模版的子目录支持之rewrite规则
            handle /_3p/* {
                    rewrite * /blog{path}
                    file_server
            }
            # 自动跳转blog目录
            redir / /blog/ permanent
            # 路径自动补全/
            @noSlash path_regexp no_slash ^(.*/[^/.]+)$
            redir @noSlash {http.request.uri.path}/ 301
            # 其他路径的文件服务器配置
            handle {
                    file_server {
                            index index.htm index.html
                    }
            }
            import logs www.aibsd.cn
    }

(二)Gitea

  1. 个人自托管业务,SQLite3已足够支持,Postgresql对于个人代码托管显得过于重了。
  2. 如果需要应用git hooks,需要在配置选项增项相应条目,否则hooks不生效。
  3. hooks脚本需要在项目的设置的“git钩子”中配置,在个人仓库的custom/hooks目录配置脚本是无效的。
  4. 如果国内部署,需要增项相应的备案信息,需要在gitea根目录的custom/templates/custom/中添加相应的修改模版。
  5. 注意主配置文件中[server]段的域名配置和ssh配置。
    • Gitea主配置文件需要添加的hooks配置
    [security]
    DISABLE_GIT_HOOKS = false
    • Gitea添加备案信息,模版名称为extra_links_footer.tmpl
    <span></span>
    <a href="https://beian.miit.gov.cn/#/Integrated/recordQuery" target="_blank" rel="noopener noreferrer">某ICP备**********号</a>
    <span></span>
    <a href="https://beian.mps.gov.cn/#/query/webSearch" target="_blank" rel="noopener noreferrer">某公网安备**********号</a>

(三)Remark42

  1. Remark42建议直接二级域名,不建议使用子目录,否则会遇到域交叉信任问题。
  2. 国内使用,除非你有合法的国际网络代理通道,否则不建议使用官方推荐的认证方式,建议使用邮件登录或匿名登录。

🚨 警告

3. Rmark42在使用邮件登录时,会调用gravatar.com的图标,造成大约5s的延时,会直接导致登录出现“Something went wrong”的错误;该错误在debug信息中无显示,tcpdump跟踪也会因为多域名的缘故造成混淆,最后通过跟踪故障发生时SIGQUIT的goroutine dump才找到石锤信息;解决方法有两种:其一是直接通过hosts将该域名定向到127.0.0.1,其二是通过国内镜像解决,需要将caddy的内部CA加入系统信任,同时caddy配置时添加tls internal来自签。

  1. Remark42的配置文件,是REMARK前缀,并且不是所有选项都需要remark前缀,需详细查阅官方文档。
    • 本项目Remark42主配置文件
     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
    
    REMARK_URL=https://remark.aibsd.cn
    SITE=remark
    SECRET=***  //通过openssl rand -hex 32 获取随机字符串
    STORE_TYPE=bolt
    STORE_BOLT_PATH=***
    STORE_TIMOUT=20s
    BACKUP_PATH=***
    BACKUP_DURATION=24h
    BACKUP_MAX_FILES=10
    ADMIN_SHARED_ID=***
    ADMIN_SHARED_EMAIL=***
    ADMIN_SHARED_PASSWORD=***
    AUTH_ANON=true
    REMARK_ADDRESS=127.0.0.1
    REMARK_PORT=4000
    AUTH_EMAIL_ENABLE=true
    AUTH_EMAIL_FROM=xxx@xxx.xxx
    AUTH_EMAIL_SUBJ="在***的留言确认"
    AUTH_EMAIL_CONTENT_TYPE="text/html"
    SMTP_HOST=***
    SMTP_PORT=465
    SMTP_TLS=true
    SMTP_USERNAME=***
    SMTP_PASSWORD=***
    SMTP_TIMEOUT=10s
    • 本项目的Remark42的caddy反向代理配置
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
    https://remark.aibsd.cn {
            tls {
                    resolvers 1.0.0.1
                    dns alidns {
                            access_key_id "{env.ALICLOUD_ACCESS_KEY_ID}"
                            access_key_secret "{env.ALICLOUD_ACCESS_KEY_SECRET}"
                    }
            }
            encode zstd gzip
            reverse_proxy 127.0.0.1:4000 {
                    header_up X-Real-IP {remote_host}
                    header_up X-Forwarded-For {remote_host}
                    header_up X-Forwarded-Proto {scheme}
            }
            import logs remark.aibsd.cn
    }