Fly.io 部署 Artalk 评论系统

3 mins to read

最近写了几篇博客,发现博客原来使用的 Valine 评论系统已经年久失修,被 LeanCloud 冻结停止服务了,于是在多个评论系统中选中了 Artalk 重新部署博客评论系统。

Artalk 支持 Docker 形式部署,故需要部署在 CVM 上或者支持 Docker 的 PaaS 上,而我的 CVM 基本是实验环境,经常重建,不太适合评论系统此类需要稳定部署的应用,另外老牌的 Heroku 要下线免费套餐,之前看到网上有推荐 fly.io ,提供有限的免费额度,跑小博客的评论系统完全足够了。

Artalk 是一款简洁的自托管评论系统,你可以在服务器上轻松部署并置入前端页面中。

Fly.io 的核心功能是分布式的应用部署与执行,可以轻松部署和运行多种类型的应用程序(包括 Web 应用、API 应用、容器应用等),支持多种编程语言和框架,例如 Go、Rust、Python、Node.js 等,可以自动水平扩展和负载均衡。Fly.io 利用了全球范围内分布的 20 多个数据中心和数千个云计算节点,提供了高可用的、低延迟的应用程序部署和全球分发服务。

安装 flyctl

fly.io 的 Docker 形式部署目前还不能在页面直接进行,需根据官方文档安装 cli 工具(如 macOS):

brew install flyctl

创建 Fly.io 应用

Fly.io 的 Docker 部署文档:https://fly.io/docs/languages-and-frameworks/dockerfile/,常规的应用简要步骤: 0. 创建 dockerfile

  1. flyctl launch 创建应用(此步骤会新建 fly.toml 配置文件)
  2. 创建 storage
  3. 配置使用 storage
  4. 执行 deploy

但由于 fly.io 无法配置挂载,所以首次部署时 Artalk 会因为没有配置文件无法启动,所以我在模板仓库里面使用了 entrypoint.sh 脚本拷贝配置文件到部署副本内。

我新建了一个部署模板,Git Clone 模板仓库:https://github.com/wayjam/artalk-deploy

(1) 初始化应用

flyctl launch

(2) 创建 Storage

flyctl volumes create data --size 1 --app 上一步初始化的应用名

如果 Storage 名不是 data 则需要修改 fly.toml 的 mounts。

(3) 创建 Artalk 配置

下载配置模板到 Git 仓库根目录:

wget -O artalk.yml https://raw.githubusercontent.com/ArtalkJS/Artalk/master/conf/artalk.example.zh-CN.yml

根据 Artalk 文档 以及自身站点场景修改配置。

不建议修改监听端口,修改后需要更新 fly.toml 且监听端口不会暴露到外部,暴露端口在 fly.toml 中另外声明。

(4) 使用 Postgres 数据库

Artalk 默认使用 sqlite3 作为 DB 存储,Fly.io 同时也支持创建 Postgres 数据库,所以也可以创建一个 Postgres 数据库给 Artalk 使用。

flyctl postgres create

创建完数据库会显示 DB 的连接信息,

连接数据库实例 & 创建数据库

flyctl postgres connect -a wayjam-db
create database artalk;

修改连接信息

将数据库连接信息填入 artalk.yaml

(5) 部署

  • 首次部署 or 需要上传本地配置到部署副本flyctl deploy --build-target with-conf --remote-only
  • 不上传本地配置到部署副本flyctl deploy --build-target base --remote-only

我的模板仓库使用了 Dockerfile 的 multistage 提供的两种部署选项是为了兼容部署场景:是否要上传本地 conf 到远端的场景。用处主要在于首次部署的场景,其他需要更改远端配置的场景可以使用下面提到的 ssh 手工更改或者 sftp 上传。但远端编辑的体验肯定比不上在本地修改再上传。

(6) SSH 连接到副本

flyctl 中内建了很多有用的命令,比如 flyctl ssh console 就可以连接到远程副本。

总结

目前 Fly.io 部署应用基本上没有遇到不可解决的问题,但总体易用性还是比不上 Heroku,很多问题文档没有特别说明的还需到官方论坛去查找解决办法。

本文以 Artalk 的部署为例展示一个完整应用的部署生命周期,希望也可以给到部署其他应用一个参考。