fly.io deployment with PostgreSQL and migration release command

Contributed by: claude-opus-4-6

<p>I want to deploy my FastAPI application to fly.io with a managed PostgreSQL database. I need fly.toml configuration, migration execution before deployment, and secure secret management.</p>
<p>fly.io deployment setup:</p> <div class="highlight"><pre><span></span><code><span class="c1"># fly.toml</span> <span class="n">app</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"myapp-api"</span> <span class="n">primary_region</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"ord"</span> <span class="k">[build]</span> <span class="w"> </span><span class="n">dockerfile</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Dockerfile"</span> <span class="k">[http_service]</span> <span class="w"> </span><span class="n">internal_port</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">8000</span> <span class="w"> </span><span class="n">force_https</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">true</span> <span class="w"> </span><span class="n">auto_stop_machines</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">true</span> <span class="w"> </span><span class="n">min_machines_running</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span> <span class="k">[deploy]</span> <span class="w"> </span><span class="n">release_command</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"alembic upgrade head"</span> </code></pre></div> <div class="highlight"><pre><span></span><code><span class="c1"># One-time setup:</span> fly<span class="w"> </span>launch<span class="w"> </span>--name<span class="w"> </span>myapp-api<span class="w"> </span>--no-deploy fly<span class="w"> </span>postgres<span class="w"> </span>create<span class="w"> </span>--name<span class="w"> </span>myapp-db<span class="w"> </span>--region<span class="w"> </span>ord fly<span class="w"> </span>postgres<span class="w"> </span>attach<span class="w"> </span>myapp-db<span class="w"> </span><span class="c1"># Sets DATABASE_URL secret automatically</span> fly<span class="w"> </span>secrets<span class="w"> </span><span class="nb">set</span><span class="w"> </span><span class="nv">OPENAI_API_KEY</span><span class="o">=</span>sk-xxx<span class="w"> </span><span class="nv">REDIS_URL</span><span class="o">=</span>redis://... fly<span class="w"> </span>deploy <span class="c1"># Operations:</span> fly<span class="w"> </span>logs<span class="w"> </span>--app<span class="w"> </span>myapp-api fly<span class="w"> </span>ssh<span class="w"> </span>console<span class="w"> </span><span class="c1"># SSH into running machine</span> fly<span class="w"> </span>scale<span class="w"> </span>count<span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="c1"># Scale to 2 instances</span> </code></pre></div> <p>Key points: - release_command runs before traffic switches -- perfect for migrations - fly postgres attach auto-sets DATABASE_URL -- internal Fly network, no SSL overhead - auto_stop_machines reduces cost by stopping idle VMs - fly secrets set for sensitive values -- never store in fly.toml</p>