{
  "manifest_version": "1",
  "slug": "migrate-railway",
  "title": "Apps from Railway",
  "headline": "Migrate a Railway project to exe.dev",
  "description": "Move a Railway project to an exe.dev VM: services, variables, Postgres and Redis data, volumes, cron, and domains, with API keys kept where the VM can't read them.",
  "category": "migration",
  "tags": [
    "railway",
    "migrate from railway",
    "railway alternative",
    "railway app",
    "railpack",
    "nixpacks",
    "railway postgres",
    "railway redis",
    "railway cron",
    "railway volumes",
    "docker compose",
    "api keys",
    "secrets"
  ],
  "url": "https://exe.dev/deploy/migrate-railway",
  "markdown_url": "https://exe.dev/deploy/migrate-railway.md",
  "upstream": {
    "website": "https://railway.com",
    "source": "https://github.com/railwayapp/cli",
    "docs": "https://docs.railway.com",
    "license": "MIT (Railway CLI and Railpack); your code is yours"
  },
  "example_vm_name": "my-app",
  "time": "1 hour",
  "stack": [
    {
      "name": "Your services",
      "detail": "Each Railway service in Docker Compose, built with its Dockerfile or with Railpack; the public one on port 8000",
      "port": 8000,
      "data": "~/app"
    },
    {
      "name": "Postgres and Redis",
      "detail": "The same images as Railway's templates, with your data",
      "data": "~/app/volumes"
    },
    {
      "name": "Integrations",
      "detail": "Your API keys for Stripe, OpenAI, and others, kept by exe.dev outside the VM"
    },
    {
      "name": "The move kit",
      "detail": "The hand-over, the scripts, and the report",
      "data": "~/railway"
    }
  ],
  "access": [
    {
      "url": "https://my-app.exe.xyz/",
      "who": "private",
      "what": "the app, until you make the move"
    },
    {
      "url": "https://www.example.com/",
      "who": "public",
      "what": "the app, after the move"
    },
    {
      "url": "ssh my-app.exe.xyz",
      "who": "private",
      "what": "the shell; `git push exe main` deploys"
    }
  ],
  "delivers": [
    "Your Railway services, variables, and data running on the VM, with the same `*.railway.internal` names, at https://my-app.exe.xyz/.",
    "`git push exe main` deploying like Railway: build, pre-deploy command, health check, and the old build kept if anything fails.",
    "A list of the API keys that can move into exe.dev integrations, where the VM can't read them.",
    "A report in `~/railway/report.md`, and your steps for the move."
  ],
  "deployable": true,
  "deploy": {
    "new_vm_url": "https://exe.dev/new?prompt=Set%20up%20Apps%20from%20Railway%20on%20this%20VM%20by%20following%20the%20exe.dev%20recipe%20at%20https%3A%2F%2Fexe.dev%2Fdeploy%2Fmigrate-railway.md%20from%20top%20to%20bottom.%0A%0AThe%20recipe%27s%20example%20VM%20name%20is%20my-app.%20This%20VM%27s%20name%20is%20the%20output%20of%20%60hostname%60%3A%20use%20it%20wherever%20the%20recipe%20writes%20my-app.%20Skip%20the%20step%20that%20creates%20the%20VM%3B%20you%20are%20on%20it.%0A%0AYou%20are%20done%20when%20all%20of%20these%20are%20true.%20Check%20each%20one%20yourself%3A%0A-%20Your%20Railway%20services%2C%20variables%2C%20and%20data%20running%20on%20the%20VM%2C%20with%20the%20same%20%60%2A.railway.internal%60%20names%2C%20at%20https%3A%2F%2Fmy-app.exe.xyz%2F.%0A-%20%60git%20push%20exe%20main%60%20deploying%20like%20Railway%3A%20build%2C%20pre-deploy%20command%2C%20health%20check%2C%20and%20the%20old%20build%20kept%20if%20anything%20fails.%0A-%20A%20list%20of%20the%20API%20keys%20that%20can%20move%20into%20exe.dev%20integrations%2C%20where%20the%20VM%20can%27t%20read%20them.%0A-%20A%20report%20in%20%60~%2Frailway%2Freport.md%60%2C%20and%20your%20steps%20for%20the%20move.%0A%0ARead%20the%20whole%20recipe%2C%20including%20the%20closed%20details%2C%20and%20do%20%22Rehearse%20the%0Amove%20by%20hand%22%20in%20order%2C%20skipping%20VM%20creation%3B%20the%20rest%20of%20the%20page%20is%20for%0Athe%20owner.%20Use%20the%20kit%27s%20scripts%20as%20published.%20Change%20compose.yaml%20only%0Awhere%20this%20project%20needs%20it%2C%20and%20list%20the%20changes%20in%20the%20report.%0AYou%20need%20the%20owner%20once%2C%20early%3A%20show%20them%20the%20commands%20in%20%22Hand%20over%20the%0Aproject%22%20with%20this%20VM%27s%20name%2C%20and%20wait%20until%20~%2Frailway%2Fhanded-over%20exists%0Aand%20each%20repository%20in%20~%2Fgit%20has%20a%20commit.%20Install%20the%20rest%20meanwhile.%0ANever%20run%20railway%20commands%20yourself%2C%20never%20ask%20for%20a%20Railway%20token%2C%20and%0Anever%20connect%20to%20Railway%27s%20databases%3A%20the%20addresses%20in%20~%2Frailway%20are%20live%0Aproduction%20ones.%20Never%20run%20railway%2Fmove%20or%20handover%20--move%2C%20change%20DNS%2C%0Aor%20run%20share%20set-public%3A%20the%20move%20is%20the%20owner%27s%20call.%20Keep%20the%20cron%0Ajobs%20off%20until%20then.%0AKeep%20variable%20values%20out%20of%20your%20replies%20and%20the%20report.%20Never%20ask%20the%0Aowner%20to%20paste%20an%20API%20key%20into%20the%20conversation%3A%20API%20keys%20go%20into%0Aintegrations%2C%20which%20the%20owner%20adds%3B%20sealed%20variables%20the%20owner%20sets%20with%0Arailway%2Fimport%20set%20over%20SSH.%0AIf%20the%20project%20needs%20something%20exe.dev%20can%27t%20do%20%28public%20TCP%20ports%20other%0Athan%20HTTP%2C%20several%20regions%2C%20MySQL%20or%20MongoDB%20data%29%2C%20put%20it%20in%20the%20report%0Aand%20ask.%0AFinish%20with%20the%20report%27s%20summary%2C%20https%3A%2F%2F%3Cvm%3E.exe.xyz%2F%2C%20the%20keys%20that%0Acould%20move%20to%20integrations%2C%20and%20the%20owner%27s%20steps%20in%20%22Make%20the%20move%22%0Awith%20this%20VM%27s%20name%20and%20the%20project%27s%20domains.%0A%0AFinish%20with%20the%20URLs%20I%20should%20open.%0A",
    "terminal": "curl -fsSL https://exe.dev/deploy/migrate-railway/prompt.txt | ssh exe.dev new --prompt=/dev/stdin",
    "prompt": "Set up Apps from Railway on this VM by following the exe.dev recipe at https://exe.dev/deploy/migrate-railway.md from top to bottom.\n\nThe recipe's example VM name is my-app. This VM's name is the output of `hostname`: use it wherever the recipe writes my-app. Skip the step that creates the VM; you are on it.\n\nYou are done when all of these are true. Check each one yourself:\n- Your Railway services, variables, and data running on the VM, with the same `*.railway.internal` names, at https://my-app.exe.xyz/.\n- `git push exe main` deploying like Railway: build, pre-deploy command, health check, and the old build kept if anything fails.\n- A list of the API keys that can move into exe.dev integrations, where the VM can't read them.\n- A report in `~/railway/report.md`, and your steps for the move.\n\nRead the whole recipe, including the closed details, and do \"Rehearse the\nmove by hand\" in order, skipping VM creation; the rest of the page is for\nthe owner. Use the kit's scripts as published. Change compose.yaml only\nwhere this project needs it, and list the changes in the report.\nYou need the owner once, early: show them the commands in \"Hand over the\nproject\" with this VM's name, and wait until ~/railway/handed-over exists\nand each repository in ~/git has a commit. Install the rest meanwhile.\nNever run railway commands yourself, never ask for a Railway token, and\nnever connect to Railway's databases: the addresses in ~/railway are live\nproduction ones. Never run railway/move or handover --move, change DNS,\nor run share set-public: the move is the owner's call. Keep the cron\njobs off until then.\nKeep variable values out of your replies and the report. Never ask the\nowner to paste an API key into the conversation: API keys go into\nintegrations, which the owner adds; sealed variables the owner sets with\nrailway/import set over SSH.\nIf the project needs something exe.dev can't do (public TCP ports other\nthan HTTP, several regions, MySQL or MongoDB data), put it in the report\nand ask.\nFinish with the report's summary, https://\u003cvm\u003e.exe.xyz/, the keys that\ncould move to integrations, and the owner's steps in \"Make the move\"\nwith this VM's name and the project's domains.\n\nFinish with the URLs I should open.\n",
    "prompt_url": "https://exe.dev/deploy/migrate-railway/prompt.txt"
  },
  "updated": "2026-10-30",
  "related": [
    "migrate-heroku",
    "migrate-digitalocean-droplet",
    "agent-secrets",
    "docker-compose",
    "postgres",
    "dev-test-prod"
  ],
  "alternatives": [
    "Railway"
  ],
  "files": [
    "https://exe.dev/deploy/migrate-railway/backup",
    "https://exe.dev/deploy/migrate-railway/check",
    "https://exe.dev/deploy/migrate-railway/deploy",
    "https://exe.dev/deploy/migrate-railway/handover",
    "https://exe.dev/deploy/migrate-railway/import",
    "https://exe.dev/deploy/migrate-railway/move",
    "https://exe.dev/deploy/migrate-railway/restore"
  ]
}
