---
title: "Deploy Ruby on Rails and PostgreSQL over MCP with while.sh"
url: https://while.sh/en/guides/deploy-rails/
author: "Aloïs Oddon, co-founder of Nextmap"
updated: 2026-11-02
---

# Deploy a Ruby on Rails app and its PostgreSQL database from your AI agent, over MCP

Your Rails app is leaving Heroku, or never went there. Connected to while over MCP, your AI agent deploys it in France, with its PostgreSQL database backed up every day and a ready-made Rails Dockerfile.

## Prerequisites

- A Ruby on Rails 7.1 app or newer, with its Gemfile.lock.
- An AI agent that works in a terminal: Claude Code, Codex, Cursor or Gemini CLI.

## Step 1: Give your agent these instructions

Open your agent in your app's folder, and paste these instructions into it:

```text titre="Instructions"
Connect to while with my account (while.sh/agents), then deploy my app.
```

Without an account, your agent deploys your app as a trial, in one request. To keep it, open the link it gives you and create your account.

With your account, your agent adds while's MCP server itself. If it asks you to, restart it. On the first call to while, a page opens in your browser. In Claude Code, if it doesn't open, type /mcp, choose while, then Authenticate. On that page, choose your app, or "A new app", then click Authorize.

## Step 2: Open your app

Your agent gives you your app's address, for example `https://mon-appli.while.cloud`, over HTTPS.

## What your agent does

It writes while.yaml at the root of your app:

```yaml titre="while.yaml"
apiVersion: while/v1
project: mon-appli
services:
  - name: web
    port: 8080
    health:
      path: /up
    resources:
      memory: 512Mi
databases:
  - name: main
```

Rails is detected from its Gemfile, and your agent receives a Dockerfile ready to build: several stages, precompiled static assets, and a user without administrator rights. Your agent adds it to your app. If your app already has the Rails Dockerfile, your agent adapts it, starting with the port.

At startup, `bin/rails db:prepare` creates the database or applies the migrations (source 2), then Rails serves your pages. The Rails `/up` route tells while that your app is ready (source 1). Your agent also generates the `SECRET_KEY_BASE` key and stores it in while's vault. With Rails 8, it connects the Solid Cache, Solid Queue and Solid Cable databases to the same PostgreSQL database.

## Set up Rails behind PgBouncer

> You, to your agent: Check that the migrations work behind PgBouncer.

`DATABASE_URL` goes through PgBouncer in transaction mode. Your agent turns off the migrations' advisory locks, which PgBouncer doesn't keep from one transaction to the next:

```yaml titre="config/database.yml"
production:
  primary:
    url: <%= ENV["DATABASE_URL"] %>
    advisory_locks: false
```

## Add a Sidekiq worker

> You, to your agent: Add a Sidekiq worker to send the emails.

Your agent declares a worker, with the same image and the `bundle exec sidekiq` command, and a Redis-compatible cache for its queue, connected with its password. It declares the cache with `durable: true`: pending jobs survive a restart, and none is evicted when memory is full.

## Query your database from your agent

> You, to your agent: How many orders did we get yesterday?

Your agent reads your database in SQL through while's MCP server, with your permissions on the data, and it can't write to it.

## Back up before a migration

> You, to your agent: Take a backup before the migration.

Your agent starts a backup, followed right away by a test: a throwaway database is created from it, and its tables are read back. Each database is also backed up every day.

## Restrict your app to your colleagues

> You, to your agent: Restrict the app to people in the company.

Your agent adds two lines to the service:

```yaml titre="while.yaml"
    access: internal
    email_domains: [acme.com]
```

Once your Google Workspace or Microsoft 365 is linked to while, on the Pro plan, your colleagues open it with their usual account, and your code receives their name and email address, with no sign-in page to write.

## Move to your own domain

> You, to your agent: Put the app on app.acme.com.

Your agent declares the domain, you add the DNS records it gives you, and the HTTPS certificate follows.

## Fix a vulnerability in your dependencies

> You, to your agent: Fix the vulnerabilities in our dependencies.

Your app's dependencies are checked against known vulnerabilities at every deployment, then every day. Your agent is warned about a serious vulnerability, and updates the package involved.

## Go back to the previous version

> You, to your agent: Go back to the previous version.

In the 30 minutes after a deployment, the previous version comes back in a second. After that, it takes a few seconds. Once the previous version is back, your agent reads what broke in while's logs, fixes it and deploys again.

## Next steps

- [Leave Heroku for while](/en/guides/migrate-from-heroku/)
- [Compare the Heroku alternatives](/en/comparisons/heroku-alternatives/)
- [Deploy a Docker container](/en/guides/deploy-docker-container/)

## Sources

1. [Ruby on Rails, the /up route (Rails::HealthController)](https://api.rubyonrails.org/classes/Rails/HealthController.html), 2026-11-02
2. [Ruby on Rails, preparing the database with bin/rails db:prepare](https://guides.rubyonrails.org/active_record_migrations.html#preparing-the-database), 2026-11-02

## Questions

### Do I need to write a Dockerfile?

No. Rails is detected, and your agent receives a Dockerfile ready to build. If your app already has the Rails one, your agent adapts it: the port, and the Solid Cache and Solid Queue databases.

### Are my migrations applied?

Yes, at every startup, by bin/rails db:prepare, which also creates the database the first time.

### I'm on Heroku: how do I move over?

Your agent takes over the code, copies the database from a Heroku export (pg_dump) restored by a job, and carries over your environment variables.

### What about Sidekiq?

Your agent adds a worker, with the same image, and a durable Redis-compatible cache for its queue: its jobs survive a restart.

### Where is my app hosted?

In France, by Nextmap, a French company.
