最近写了几篇博客,发现博客原来使用的 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
flyctl launch创建应用(此步骤会新建fly.toml配置文件)- 创建 storage
- 配置使用 storage
- 执行 deploy
但由于 fly.io 无法配置挂载,所以首次部署时 Artalk 会因为没有配置文件无法启动,所以我在模板仓库里面使用了 entrypoint.sh 脚本拷贝配置文件到部署副本内。
我新建了一个部署模板,Git Clone 模板仓库:https://github.com/wayjam/artalk-deploy
(1) 初始化应用

(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 使用。

创建完数据库会显示 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 的部署为例展示一个完整应用的部署生命周期,希望也可以给到部署其他应用一个参考。























