Migrate from Fly.io
Fly.io apps are Docker images, so they usually deploy on Zenavo with the same Dockerfile. fly.toml is not read; its settings map onto the service as below.
How Fly.io maps to Zenavo
| Fly.io | Zenavo |
|---|---|
| App | A service in a project on one server |
[build] with a Dockerfile | The Dockerfile in the root directory |
internal_port of [http_service] | The service's HTTP port |
[env] and secrets | Variables |
[processes] | One service per process from the same repository, with that startup command |
[deploy] release_command | A command run before the app starts, in the startup command |
[[mounts]] volumes | Volumes |
| HTTP checks | An HTTP health check |
<app>.internal and Flycast | <hostname>.zenavo.internal (Private Networking) |
| Regions, auto stop and start | One server per project; services keep running |
fly certs | Automatic Let's Encrypt certificates |
1. Deploy the app
- Add a server and create a project.
- Add Service → GitHub, pick the repository; the preview should show Dockerfile. Set the HTTP port to the app's
internal_port. - Add one service per entry in
[processes]with its command, and a volume for each[[mounts]]at the same path.
2. Copy the variables
Copy [env] into Variable → Edit Raw Variables. fly secrets list shows only names, not values, so take the values from where you keep them. Point database URLs at Zenavo's databases, such as DATABASE_URL=${POSTGRESQL_CONNECTION_STRING}.
3. Move the data
PostgreSQL. Open a tunnel to the Fly Postgres app and take a plain SQL dump; Zenavo does not read pg_dump's custom format:
fly proxy 15432:5432 -a my-db
pg_dump --no-owner --no-acl "postgres://postgres:PASSWORD@localhost:15432/my_app" | gzip > fly.sql.gzUpload and restore it under a new PostgreSQL service's Backup & Restore tab, with the same major version (Uploading a backup).
Volumes. Pack the volume into an uncompressed archive on the machine, then download it:
fly ssh console -a my-app -C "tar cf /tmp/data.tar -C /data ."
fly ssh sftp get /tmp/data.tar -a my-appRestore data.tar into the new, empty volume from the service's Backup & Restore tab, with the project stopped (Backup & Restore).
4. Switch the domain
Bind the domain under Networking, then replace the A and AAAA records that point at Fly with an A record to the server's IP address (Domains & HTTPS).