Appearance
Migrating from Fly.io
Fly.io runs Docker images as Machines in many regions. Fjordrun runs containers in one region (Nuremberg, Germany) and builds them for you from your repository. Most Fly apps move over without code changes.
Concept map
| Fly.io | Fjordrun |
|---|---|
| App | Service (in a project) |
| Separate apps for staging and production | Environments in one project |
fly.toml | Service settings in the dashboard (start command, port, healthcheck, replicas, resources) |
Dockerfile, or fly launch scanners | Fjordrun builder: a repository Dockerfile always wins; otherwise Node.js framework detection, or Nixpacks for other languages |
[http_service] internal_port | Port of the service (default 8080) |
[[http_service.checks]] | Healthcheck path |
[processes] groups | One service per process from the same repository (a web service and worker services) |
release_command | Prefix the start command, for example npx prisma migrate deploy && node server.js |
[[vm]] size | vCPU and memory limits per replica; billed on actual use |
auto_stop_machines / min_machines_running = 0 | Sleep when idle |
| Machine count | Replicas |
fly secrets | Service variables |
| Fly Volumes | Volumes (one per service) |
<app>.internal private networking | <service>.<environment>.internal (Private networking) |
| Fly Postgres / Upstash Redis | PostgreSQL / Redis templates |
*.fly.dev | *.fjordrun.app generated domains |
flyctl | fjordrun CLI |
| Multiple regions | One region during the beta: nbg1 (Regions) |
Steps
- Create a project on Fjordrun and add a service from your GitHub repository. If the repository has a
Dockerfile(most Fly apps do), Fjordrun builds it as it is. - Port: set Settings → Deploy → Port to the
internal_portfromfly.toml, or make the app listen on$PORT. - Healthcheck: copy the path of your HTTP check into Healthcheck path.
- Other processes: for each extra entry under
[processes], add a service from the same repository with kind worker and that command as its start command. - Secrets: Fly does not show secret values again, so copy them from where you keep them (your password manager or
.envfiles) into the raw variables editor asKEY=valuelines. Replace hostnames that end in.internalwith references to the new services, for exampleDATABASE_URL=${{Postgres.DATABASE_URL}}. - Volumes and databases: attach a volume at the same mount path, create databases from templates, and move the data (below).
- Deploy, test on the generated
*.fjordrun.appdomain, then move your custom domain.
Images you build yourself must include linux/arm64: during the beta Fjordrun's servers are arm64 machines. See Docker. Images that Fjordrun builds from your repository need no change.
PostgreSQL
Open a tunnel to the Fly database and dump it from your machine:
bash
fly proxy 15432:5432 -a <postgres-app>
# in a second terminal
pg_dump "postgresql://postgres:<password>@localhost:15432/<database>" \
--format=custom --no-owner --no-acl --file=fly.dumpFjordrun databases are private, so restore from a container inside the project, as described in Railway → Databases.
Stop writes to the old database (for example scale the app to zero with fly scale count 0) before the final dump.
Files on Fly Volumes
Copy files out with fly ssh sftp get (or create a tar archive in the Machine with fly ssh console and download it), then upload them to the Fjordrun service's volume from a temporary container in the same way as a database dump.
Domains
Add the custom domain in Fjordrun and create the TXT verification record. When the new deployment works, replace the Fly A/AAAA (or CNAME) records with a CNAME to edge.fjordrun.app, and remove the certificate on Fly (fly certs remove). See Domains and HTTPS.
Pricing differences
Fly bills Machines by size and running time. Fjordrun bills the CPU and memory a service actually uses: €12 per vCPU-month and €6 per GB-month (excl. VAT), with plans from €0 (Trial), €5 (Hobby) and €20 (Pro) that include the same amount of usage. See Usage-based pricing.