最近把本博客的评论系统从 Waline 迁移到了 Artalk。主要原因就是 Waline 是纯 js 实现, NodeJS 运行时有点太重了;最近正在把服务整合到新小鸡上,遂迁移。

Artalk 够轻够简单,完全单文件化,连静态资源都被嵌入了可执行文件;不过总比臃肿的 nodejs 要好。 Artalk 另一个优势是可配置项更多,文档更详细,看着就更像个正经项目(然而是高三大佬写的

安装依赖

我们使用 PostgreSQL。首先安装依赖,下载可执行文件

LATEST=v2.8.7
apt install postgresql
wget https://github.com/ArtalkJS/Artalk/releases/download/${LATEST}/artalk_${LATEST}_linux_amd64.tar.gz
tar xf artalk_${LATEST}_linux_amd64.tar.gz
mv artalk_${LATEST}_linux_amd64/artalk /usr/local/bin
rm -r artalk_${LATEST}_linux_amd64.tar.gz artalk_${LATEST}_linux_amd64

配置数据库

-- sudo -u postgres psql
CREATE USER artalk WITH PASSWORD '<CUSTOM PASSWORD>';
CREATE DATABASE artalk_db OWNER artalk;
GRANT ALL PRIVILEGES ON DATABASE artalk_db TO artalk;

配置文件

尽管示例有很多配置项,实际上都可以网页上 ui 配置。配置文件只需要写最基本的暴露端口和数据库配置就行。(不过文件权限是个问题)

/etc/artalk.yml

host: "127.0.0.1"
port: 23333

app_key: <CUSTOM KEY>
locale: zh-CN
timezone: Asia/Shanghai

log:
  enabled: true
  filename: /var/log/artalk/access.log

db:
  type: pgsql
  name: artalk_db
  host: localhost
  port: 5432
  user: artalk
  password: <CUSTOM PASSWORD>

守护进程

我们用 systemd。我个人比较喜欢 DynamicUser

/lib/systemd/system/artalk.service

[Unit]
Description=Artalk
Documentation=https://artalk.js.org/guide/

[Service]
DynamicUser=yes
StateDirectory=artalk
LogsDirectory=artalk
WorkingDirectory=/var/lib/artalk
ExecStart=/usr/local/bin/artalk -c /etc/artalk.yml server
Restart=on-abnormal

StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

然后 systemctl daemon-reload && systemctl start artalk && systemctl status artalk 启动。

设置管理员

现在这个 artalk 能 localhost 访问了,但是没有管理员账户。

运行 artalk -c /etc/artalk.yml admin 命令,按照提示填用户密码,artalk 会写到数据库里的。

反向代理

我个人比较喜欢只暴露 nginx 的 80 和 443,其他的全放在防火墙后面。这样最大的好处是——可以通过 /etc/nginx/sites-enabled 方便地管理单机网站。

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name <COMMENT DOMAIN>;
    ssl_certificate <CERT PATH>;
    ssl_certificate_key <KEY PATH>;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Range $http_range;
        proxy_set_header If-Range $http_if_range;
        proxy_redirect off;
        proxy_pass http://127.0.0.1:23333;
        client_max_body_size 100m; # 与 artalk 配置项保持相同
    }
}

其他配置