Twikoo的自建后端与自动更新

用户身份
普通用户, 用户名为zhyoch
  1. 全局安装twikoo:

    1
    
    sudo npm i -g tkserver@latest
    
  2. 创建twikoo工作目录:

    1
    
    mkdir /home/zhyoch/project/twikoo/
    

    twikoo会在此目录下生成data文件夹存放数据文件db.json*db.json.0存储具体评论, db.json.1存储twikoo前端控制面板的配置, db.json.2存储文章属性。

  3. 创建/etc/systemd/system/twikoo.service并写入以下内容:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    [Unit]
    Description=Twikoo后端
    
    [Service]
    Type=simple
    WorkingDirectory=/home/zhyoch/project/twikoo
    ExecStart=nohup tkserver
    Restart=on-failure
    RestartSec=10
    ExecStop=/bin/kill $MAINPID
    
    [Install]
    WantedBy=multi-user.target
    
  4. 重新加载守护程序:

    1
    
    sudo systemctl daemon-reload
    
  5. 设置twikoo.service自启动并立刻启动:

    1
    
    sudo systemctl enable --now twikoo.service
    
  6. 检查运行状态:

    1
    
    sudo systemctl status twikoo.service
    
  7. 注意/home/zhyoch/project/twikoo的权限归属, 最好是分配给当前普通用户。

    1
    
    sudo chown -R zhyoch:zhyoch /home/zhyoch/project/twikoo
    

首先参考Nginx部署Hugo站点设置一系列仓库, 然后按照以下步骤操作:

  1. 创建更新脚本/home/zhyoch/project/twikoo/upgrade.sh并写入以下内容:

     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
    
    #!/bin/bash
    
    PROD="/home/zhyoch/project/blog"
    WORK="/home/zhyoch/project/twikoo"
    
    LATEST=$(npm view tkserver version)
    LOCAL=$(npm ls tkserver -g | grep @ | cut -d '@' -f 2)
    
    if [ "$LATEST" != "$LOCAL" ]; then
        echo "==========更新Twikoo前端=========="
        cd $WORK
        wget -O - https://mirrors.cloud.tencent.com/npm/twikoo/-/twikoo-$LATEST.tgz | tar -zxf -
        mv package/dist/twikoo.all.min.js $PROD/themes/DoIt/assets/lib/twikoo/twikoo.all.min.js
        rm -rf package
    
        echo "==========正在提交到Git仓库=========="
        cd $PROD
        git pull
        git add -A
        git commit -m "更新Twikoo至$LATEST"
        git push -f origin master
    
        echo "==========更新Twikoo后端=========="
        systemctl stop twikoo.service
        npm i -g tkserver@latest
        systemctl start twikoo.service
    else
        echo "==========当前Twikoo已是最新版本$LATEST=========="
    fi
    
  2. 授予可执行权限:

    1
    
    chmod +x /home/zhyoch/project/twikoo/upgrade.sh
    
  3. sudo crontab -e设置crontab, 添加以下内容:

    1
    
    0 1 * * 1 flock -xn /tmp/twikoo-upgrade.lock -c '/home/zhyoch/project/twikoo/upgrade.sh > /dev/null 2>&1 &'
    
    注意
    这里要为root用户创建定时任务而不是为普通用户创建, 因为upgrade.sh中需要通过systemd管理twikoo后端服务, 普通用户会因权限不足而不能执行这一过程。
  4. 由于Nginx部署Hugo站点中设置的.git/hooks/post-receive在接收到push后会在/home/zhyoch/project/blog自动构建Hugo站点, 所以闭环成功🎉。