使用Railway.app部署artalk评论系统

AI 摘要
文章介绍了作者作为DevOps的Oneman选手,在使用各种服务中遇到的问题和解决方案。作者通过将博客网页放在Cloudflare Pages,统计放在Railway.app,配置放在Github,API放在Cloudflare workers等方式进行部署和配置。对于评论系统Artalk,作者通过使用Docker镜像和配置文件的方式进行部署。作者还介绍了在Railway.app中创建Redis和PostgreSQL来确保数据持久化,并提供了一键配置的方法。最后,作者提供了一些关于使用Dockerfile进行Serverless部署的实用建议。
注意
本文最后更新于 2023-09-01,文中内容可能已过时。

作为DevOps的Oneman选手,我不喜欢运维(

毕竟博客、评论、统计这种需要保证SLA的东西,服务提供商们在专业领域绝对可以秒杀我,就像我把密码管理器切换到了1Password一样。

所以,我的博客网页在Cloudflare Pages,统计在Railway.app,配置在Github,api在Cloudflare workers…

那么,评论系统Artalk该放在哪儿?之前使用Twikoo时可以轻松部署于vercel,而artalk官方文档并没有提供任何Serverless的部署方式。

好在artalk提供了Docker镜像,这让我们可以简单改造下写成Dockerfile

Railway.app的主要部署方式就是Dockerfile,既然只有文本文件和配置的修改,一个小技巧是创建一个GitHub Private repo并授权给Railway.app Application,每一个独立配置便分出一个人branch来存放,只需要将railway中service SettingsAutomatic Deployments更改为对应分支就可以轻松管理Railway.app的各项服务了

那么接下来,我们便从main中分出artalk分支来配置artalk并新建一个Dockerfile文件

1
2
git checkout -b artalk
touch Dockerfile

将以下内容写入其中

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
FROM artalk/artalk-go

WORKDIR /

COPY ./data /data

ENTRYPOINT ["/entrypoint.sh"]

EXPOSE 23366

CMD ["server", "-c", "/data/artalk.yml"]

接下来,就需要写入配置文件了,由于截止文章写成,artalk文档并没有提及通过环境变量配置参数,那么直接指定和修改配置文件就是唯一的选择,这也导致一个问题:每次对配置的修改都必须通过配置文件和git提交推送,这意味着无法在Artalk内可视化编辑配置

Artalk已经支持通过环境变量来配置了,具体请看下一小节

文件树如下:

1
2
3
4
5
.
├── Dockerfile
└── data
    ├── artalk.yml
    └── ip2region.xdb

此处的artalk.ymlip2region.xdb分别为配置文件与ip归属地数据库。

artalk默认使用sqlite持久化数据,但Railway.app虽然有提供挂载的存储点,但功能极其简陋,只能通过服务访问,其他方式皆无效。

因此Railway.app的全栈性就发挥了出来—-项目内创建redis和postgresql并将相关参数填入配置文档即可

由于没有环境变量配置,此时只能手动复制Railway.app提供的参数填入artalk.yml

即便如此,也仅建议通过环境变量配置数据库,毕竟配置项太多了,还是直接配置文件舒服些

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
db:
  type: "pgsql"
  file: "./data/artalk.db"
  name: "railway"
  host: "containers-**.railway.app"
  port: **
  user: "postgres"
  password: "******"
  charset: "utf8mb4"
  table_prefix: ""

cache:
  enabled: true
  type: "redis"
  expires: 30
  warm_up: false
  server: "containers-**.railway.app:**"
  redis:
    network: "tcp"
    username: "default"
    password: "******"
    db: 0

Artalk已经实现通过环境变量配置了,也可以直接在Railway.app环境变量配置处打开RAW editor粘贴以下内容实现一键配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
ATK_CACHE_ENABLED=true
ATK_CACHE_SERVER=${{Redis.REDISHOST}}:${{Redis.REDISPORT}}
ATK_CACHE_REDIS_PASSWORD=${{Redis.REDISPASSWORD}}
ATK_CACHE_TYPE=redis
ATK_DB_HOST=${{Postgres.PGHOST}}
ATK_DB_NAME=${{Postgres.PGDATABASE}}
ATK_DB_PASSWORD=${{Postgres.PGPASSWORD}}
ATK_DB_PORT=${{Postgres.PGPORT}}
ATK_DB_TYPE=pgsql
ATK_DB_USER=${{Postgres.PGUSER}}
PORT=23366
坑点!

如果复制了上面的环境变量配置,那以下内容可跳过

按理说现在已经可以git提交并推送,让Railway.app来构建了。确实,这能构建成功,甚至运行日志都十分正常,但访问自定义绑定的域名永远是Failed。问题出在哪里?

实际上,Railway.app号称可以自动检测监听端口并对外开放,但这个就是不成功(

解决方法也很简单,推送到远端、Railway.app构建完成后,环境变量增加一个PORT并设置为23366即可

由于Railway.app并没有提供进入容器执行命令的方式,那么直接在配置文件中写入第一个管理员才能成功进入控制面板

1
2
3
4
5
6
admin_users:
  - name: ""
    email: ""
    password: "(bcrypt)$2y$10$******"
    badge_name: "博主"
    badge_color: "#0083FF"

password需要用命令行生成加密采样的版本,以下示例命令适用于Debian/Ubuntu:

1
2
3
sudo apt install apache2-utils -y
unset HISTFILE
htpasswd -bnBC 10 "" "your_password" | tr -d ':'

输出字符串前加入(bcrypt)填入password字段即可

详情参见文档

至此,一个简单的Railway.app部署artalk的方案便完成了,过程简单但其中有许多可以借鉴于其他Dockerfile Serverless部署项目上。

  • 该Dockerfile可以作为一个模板改造不支持Serverless部署的项目
  • 可以通过提前将配置放在repo的方式配置不支持环境变量的项目
  • 需配置PORT变量来保证Railway.app监听并开放此端口
  • 当存在多个不复杂项目依赖同一外部服务时,可以考虑一个repo多分支的方式解决