Skip to content

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.ioFjordrun
AppService (in a project)
Separate apps for staging and productionEnvironments in one project
fly.tomlService settings in the dashboard (start command, port, healthcheck, replicas, resources)
Dockerfile, or fly launch scannersFjordrun builder: a repository Dockerfile always wins; otherwise Node.js framework detection, or Nixpacks for other languages
[http_service] internal_portPort of the service (default 8080)
[[http_service.checks]]Healthcheck path
[processes] groupsOne service per process from the same repository (a web service and worker services)
release_commandPrefix the start command, for example npx prisma migrate deploy && node server.js
[[vm]] sizevCPU and memory limits per replica; billed on actual use
auto_stop_machines / min_machines_running = 0Sleep when idle
Machine countReplicas
fly secretsService variables
Fly VolumesVolumes (one per service)
<app>.internal private networking<service>.<environment>.internal (Private networking)
Fly Postgres / Upstash RedisPostgreSQL / Redis templates
*.fly.dev*.fjordrun.app generated domains
flyctlfjordrun CLI
Multiple regionsOne region during the beta: nbg1 (Regions)

Steps ​

  1. 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.
  2. Port: set Settings → Deploy → Port to the internal_port from fly.toml, or make the app listen on $PORT.
  3. Healthcheck: copy the path of your HTTP check into Healthcheck path.
  4. 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.
  5. Secrets: Fly does not show secret values again, so copy them from where you keep them (your password manager or .env files) into the raw variables editor as KEY=value lines. Replace hostnames that end in .internal with references to the new services, for example DATABASE_URL=${{Postgres.DATABASE_URL}}.
  6. Volumes and databases: attach a volume at the same mount path, create databases from templates, and move the data (below).
  7. Deploy, test on the generated *.fjordrun.app domain, 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.dump

Fjordrun 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.

Fjordrun is hosted in the EU (Hetzner, Nuremberg, Germany). Private beta.