fly.io 的使用体验 & Self-host Memos卡片笔记

fly.io 类似于heroku,能帮忙托管运行App,是一种PaaS服务。昨天我在尝试自搭(self host) 一款名为memos的基于web的zettelkasten笔记应用时,在官方推荐的部署方式中发现了这个平台。

简单来说,fly.io能帮你快速部署一款app。部署时,你需要安装它的cli工具flyctl,然后利用它生成(flyctl launch)一份部署的配置文件fly.toml。在这份文件中,你只需填入docker image的地址(一般在docker hub里)、litestream备份信息和fly volume的信息(storage,可以理解为划分储存空间?类似amazon S3),就可以直接通过这份config指定的信息,将你的app从docker hub部署到fly.io上。

按照我的理解,其中 docker image是你的app的代码,fly volume是你的硬盘/储存空间,litestream会按秒级间隔同步拷贝memos的sqlite数据库的WAL数据流到Backblaze B2以实现数据备份。有了数据备份,就算memos的上游发布新版本,或是fly.io机房着火,你也能从B2获取当前最新的闪照(snapshot),这应该也是为什么memos部署指南提到可以通过swap到一个新的fly volume来检验是否成功备份。

因为memos算是高强度使用的应用了,后期数据量会暴涨,难免会有scalability和数据迁移的问题,根据Add export markdown files #1178Export memos to file #778, Memos似乎不打算直接在用户界面实现导出(which I think is not justified, since not every user has access to the home directory after all),应该只能把docker目录下的sqlite数据库定期拖下来备份。

因为fly的app本质就是一个docker容器,这时候就需要使用fly的ssh工具flyctl ssh。查阅help手册后知道应该用sftp来拷贝vm上的文件。根据这则回复,可以用fly ssh sftp shell进入sftp的shell,然后用get命令来下载特定文件。

1
get var/opt/memos/memos_prod.db memos_prod.db

或者精简版的命令, 直接用fly ssh sftp get

1
fly ssh sftp get var/opt/memos/memos_prod.db memos_prod.db

注意,fly sftp应该不是标准的openSSH的sftp,而是一种 platform-independent solution,它在get文件时不会overwrite本地文件,如果同名local file存在会get失败,所以每次get前要删除local file.