使用Railway.app部署artalk评论系统
作为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 Settings
的Automatic Deployments
更改为对应分支就可以轻松管理Railway.app的各项服务了
那么接下来,我们便从main中分出artalk分支来配置artalk并新建一个Dockerfile文件
git checkout -b artalk
touch Dockerfile
将以下内容写入其中
FROM artalk/artalk-go
WORKDIR /
COPY ./data /data
ENTRYPOINT ["/entrypoint.sh"]
EXPOSE 23366
CMD ["server", "-c", "/data/artalk.yml"]
接下来,就需要写入配置文件了,由于截止文章写成,artalk文档并没有提及通过环境变量配置参数,那么直接指定和修改配置文件就是唯一的选择,这也导致一个问题:每次对配置的修改都必须通过配置文件和git提交推送,这意味着无法在Artalk内可视化编辑配置
Artalk已经支持通过环境变量来配置了,具体请看下一小节
文件树如下:
.
├── Dockerfile
└── data
├── artalk.yml
└── ip2region.xdb
此处的artalk.yml
与ip2region.xdb
分别为配置文件与ip归属地数据库。
数据持久化
artalk默认使用sqlite持久化数据,但Railway.app虽然有提供挂载的存储点,但功能极其简陋,只能通过服务访问,其他方式皆无效。
因此Railway.app的全栈性就发挥了出来—-项目内创建redis和postgresql并将相关参数填入配置文档即可
由于没有环境变量配置,此时只能手动复制Railway.app提供的参数填入artalk.yml
了
即便如此,也仅建议通过环境变量配置数据库,毕竟配置项太多了,还是直接配置文件舒服些
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
粘贴以下内容实现一键配置:
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并没有提供进入容器执行命令的方式,那么直接在配置文件中写入第一个管理员才能成功进入控制面板
admin_users:
- name: ""
email: ""
password: "(bcrypt)$2y$10$******"
badge_name: "博主"
badge_color: "#0083FF"
password需要用命令行生成加密采样的版本,以下示例命令适用于Debian/Ubuntu:
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多分支的方式解决