English | 中文
Run the self-hosted memo service memos on fly.io. Automatically backup the database to B2 with litestream.
🙏 Thanks for linkding-on-fly, the project is inspired by it. If you want to deploy memos with litestream function locally, please visit hu3rror/memos-litestream
- fly.io account
- Backblaze account or other B2 service account
- [Optional] If you want to build your own docker image, clone repository from hu3rror/memos-litestream.
hu3rror/memos-on-fly-build has been deprecated and the maintenance is moved to hu3rror/memos-litestream
If you have used this image before, you can simply change the build image section of your fly.toml to the new image like this:
[build]
- image = "hu3rror/memos-fly:latest"
+ image = "ghcr.io/hu3rror/memos-litestream:latest"
The new image is universal for both fly.io and local runs~
- Follow the instructions to install fly's command-line interface
flyctl
. - log into flyctl.
flyctl auth login
do not setup Postgres and do not deploy yet!
flyctl launch
This command creates a fly.toml
file.
You can take fly.example.toml in this repository as a reference and modify according to the comments.
[build]
image = "ghcr.io/hu3rror/memos-litestream:latest"
[env]
LITESTREAM_REPLICA_BUCKET = "<filled_later>" # change to your litestream bucket name
LITESTREAM_REPLICA_ENDPOINT = "<filled_later>" # change to your litestream endpoint url
LITESTREAM_REPLICA_PATH = "memos_prod.db" # keep the default or change to whatever path you want
ℹ️ If you want to use another storage provider, check litestream's "Replica Guides" section and adjust the config as needed.
- Log into B2 and create a bucket. Instead of adjusting the litestream config directly, we will add storage configuration to
fly.toml
. - Now you can set the values of
LITESTREAM_REPLICA_ENDPOINT
andLITESTREAM_REPLICA_BUCKET
to your[env]
section. - Then, create an access key for this bucket. Add the key to fly's secret store (Don't add
<
and>
).flyctl secrets set LITESTREAM_ACCESS_KEY_ID="<keyId>" LITESTREAM_SECRET_ACCESS_KEY="<applicationKey>"
-
Create a persistent volume. Fly's free tier includes
3GB
of storage across your VMs. Sincememos
is very light on storage, a1GB
volume will be more than enough for most use cases. It's possible to change volume size later. A how-to can be found in the "scale persistent volume" section below.flyctl volumes create memos_data --region <your_region> --size <size_in_gb>
For example:
flyctl volumes create memos_data --region hkg --size 1
-
Attach the persistent volume to the container by adding a
mounts
section tofly.toml
.[[mounts]] source = "memos_data" destination = "/var/opt/memos"
[http_service]
internal_port = 5230 # change to 5230
flyctl deploy
If all is well, you can now access memos by running flyctl open
. You should see its login page.
🎊 Just enjoy using memos!
You can check the status of memos's docker image built by GitHub Actions.
If the latest docker image has been released to Docker Hub, you can upgrade memos easily by flyctl deploy
in your project's folder.
If you wish, you can configure a custom domain for your install.
- you should be able to log into your memos instance.
- there should be an initial replica of your database in your B2 bucket.
- your user data should survive a restart of the VM.
Litestream continuously backs up your database by persisting its WAL to B2, once per second.
There are two ways to verify these backups:
- run the docker image locally or on a second VM. Verify the DB restores correctly.
- swap the fly volume for a new one and verify the DB restores correctly.
We will focus on 2 as it simulates an actual data loss scenario. This procedure can also be used to scale your volume to a different size.
Start by making a manual backup of your data:
- ssh into the VM and copy the DB to a remote. If only you are using your instance, you can also export bookmarks as HTML.
- make a snapshot of the B2 bucket in the B2 admin panel.
Now list all fly volumes and note the id of the memos_data
volume. Then, delete the volume.
flyctl volumes list
flyctl volumes delete <id>
This will result in a dead VM after a few seconds. Create a new memos_data
volume. Your application should automatically attempt to restart. If not, restart it manually.
When the application starts, you should see the successful restore in the logs.
[info] No database found, attempt to restore from a replica.
[info] Finished restoring the database.
[info] Starting litestream & memos service.
Assuming one 256MB VM and a 3GB volume, this setup fits within Fly's free tier. 1 Backups with B2 are free as well. 2
Check that your B2 secrets and environment variables are correct.
Check the output of flyctl doctor
, every line should be marked as PASSED. If Pinging WireGuard
fails, try flyctl wireguard reset
and flyctl agent restart
.
Just run flyctl deploy --no-cache
This is due to the fly.toml v2 update, you can modify your fly.toml like:
[http_service]
auto_stop_machines = false # change to `false` if you use telegram bot