Related documentation
Deploy the Roe app to your host
Roe splits up your site into 2 parts:
- The app:
/currentwhich holds the Rails app that runs Roe and builds your site. - The
/sitewhich holds all pages, posts, content, media, themes, databases, etc.
-
Deploy: pushes and installs the Roe app to a web host -
Site Sync: pushes/syncs your site content with your web host
Roe CMS supports two deployment options: Fly.io (recommended for hands-off deloyment, a littl pricier) and Kamal which works on any host that supports VPS like DigitalOcean (recommended for bring-your-own-host, not too much more work).
Both routes use Docker images under the hood, but Fly removes most of the server-side setup work — no SSH keys, no Docker Hub account, no provisioning. If you’re not sure which to pick, start with Fly.
This document covers Fly.io first, then Kamal + DigitalOcean (for a specific host walk-through)
For any deploy target:
- Good idea to add your site URL set in Settings → site.yml (e.g.
https://yoursite.com).
Fly.io
Fly is the most hands-off path to a live Roe site. You install the CLI tool (flyctl), sign in, click Deploy from Roe’s admin, and Fly handles the rest — image builds, container hosting, persistent storage, SSL, and routing. Great user experience - can cost a bit more than other VPSs.
Create a Fly Account
- Go to fly.io and sign up.
- Add a payment method. Fly offers free credit for new accounts; small Roe sites typically run for under $10 per month.
Install flyctl
flyctl is Fly’s command-line tool. This is used by Roe to DEPLOY the app.
Mac (Homebrew):
brew install flyctl
Mac / Linux (official installer):
curl -L https://fly.io/install.sh | sh
Windows (PowerShell):
iwr https://fly.io/install.ps1 -useb | iex
Verify it’s installed:
fly version
Authenticate
Sign in to Fly from your terminal — this gives flyctl an API token to your account so Roe’s deploy job can build and deploy images on your behalf:
fly auth login
This opens a browser window for you to confirm. After login, flyctl stores the token under ~/.fly/.
Create Your App
You only do this once. Pick a globally-unique name for your app — this becomes part of your .fly.dev URL until you point a custom domain at it.
Navigate to: path/to/roe/current.
fly apps create site-name-roe
If the name is taken, Fly will tell you and you can try another.
Configure Roe for Fly
Details here: Settings → Global → Deployment
Deploy
In Admin → Updates & Deploy, click DEPLOY. Roe runs fly deploy behind the scenes:
- Builds a Docker image from your current Roe install.
- Pushes it to Fly’s registry.
- Provisions the volume for your
/siteand database storage if it doesn’t exist yet. - Starts a container running Roe.
- Sets
RAILS_MASTER_KEYand your admin credentials as Fly secrets, so the live container can decrypt config and let you log in immediately.
Expect 5–10 minutes for the first deploy. Subsequent deploys are faster (2–4 minutes) because Fly caches Docker layers.
The deploy log streams live in the admin panel — you’ll see each step as it runs.
Verify the Deploy
- Once the deploy completes, your site is live at:
https://site-name-roe.fly.dev - Visit it in a browser. If you’ve started to add content to your local Roe site, sync it to Fly with Site Sync (covered next). If not, you’ll see Roe’s empty-site placeholder.
- Sign in to the live admin at
https://site-name-roe.fly.dev/adminusing the same email and password you use locally.
Site Sync (push site content to Fly)
The first deploy ships the Rails app but not your /site folder (your content). Send your local content to the live site via Site Sync:
- On your local admin, go to Admin → Site Sync.
- The Live Site URL field will be pre-filled with your
https://site-name-roe.fly.devaddress. If not, paste it in and clickSAVE SETTINGS. - Come back to Roe and click
REFRESH SYNC STATUSat the top. You should see “Last contact with Live site: less than a minute ago” — that confirms the API connection works. - Type
LIVEto confirm and clickPUSH TO LIVE.
The first time you do this, it might take a little bit but future syncs will be much faster as there will be less to sync. The page will auto-refresh as your site syncs and let you know when it’s finished. Reload your live site to see everything.
Custom Domain and SSL
Fly issues a https://<your-app-name>.fly.dev URL automatically with SSL — you can launch with that. When you have a custom domain, follow along with Fly’s documentation to set it up: Custom domains
Remember to update the Site URL here: Admin → Settings → site.yml if you haven’t already.
Going Forward: Routine Deploys
After the first deploy, everything’s set up. Routine deploys are one click:
- Go to: Admin → Updates & Deploy and click
DEPLOY.- If there have been any code changes, click
AUTO-COMMIT & DEPLOYor commit yourself and clickREFRESH, thenDEPLOY
- If there have been any code changes, click
- Wait for the streaming log to show “Deploy completed successfully”.
- Reload your live site.
Kamal (Standard Rails Deployment) + DigitalOcean
Set Up a Docker Registry
Kamal builds the Roe image locally and pushes it to a Docker registry. Your host pulls from this registry to deploy the app. Docker Hub is the easiest option for getting started.
Create a Docker Hub Account
- Go to hub.docker.com and sign up.
- Verify your email.
Generate a Personal Access Token
Don’t use your account password — generate a dedicated token instead:
- Docker Hub → Account Settings → Personal Access Tokens → Generate New Token
- Description:
roe-kamal-deploy - Expiration:
None(or pick the longest option offered) - Permissions: Read, Write, Delete (Kamal needs all three)
- Copy the token immediately — Docker Hub only shows it once
- Paste this into Roe: Settings → deploy.yml → Registry token
Configure Roe for Kamal
Details here: Settings → Global → Deployment
Install the Docker Desktop App
By default, Roe builds your Docker image on your computer. To do this, you need Docker running. If you don’t have it set up, download the Docker Desktop app and launch the app. Docker will be running after that.
Deploy
First Deploy
The first time you deploy, use kamal setup. This:
- Installs Docker on the droplet (if not present)
- Logs into Docker Hub from the droplet
- Builds the Roe image
- Pushes it to Docker Hub
- Pulls it on the droplet and starts the container
In your terminal: Open the Roe app/current folder
cd /path/to/your/roe/current
In your terminal: run kamal setup
kamal setup
Expect 5–10 minutes on first run. Subsequent deploys will be one click on your Updates & Deploy page. Just click DEPLOY.
In the future, if there are any changes to Roe’s code, you’ll be prompted to commit the changes before deploy:
- Click
AUTO COMMIT & DEPLOYor commit the changes yourself and clickREFRESH. ThenDEPLOY.
Verify the Deploy
Once kamal setup finishes, hit your droplet’s IP in a browser:
http://<your-droplet-ip>
Sign In on the Droplet
Sign in at http://<your-droplet-ip>/admin using the same email and password you use locally.
Site Sync (push site content to your live site)
The first deploy ships the Rails app but not your /site folder (your content). Send your local content to the live site via Site Sync:
- On your local admin, go to Admin → Site Sync.
- The Live Site URL field will be pre-filled with your Site URL. If you haven’t setup a custom domain for DigitalOcean yet, use
<your-droplet-ip>address for now and paste it here. - Come back to Roe and click
REFRESH SYNC STATUSat the top. You should see “Last contact with Live site: less than a minute ago” — that confirms the API connection works. - Type
LIVEto confirm and clickPUSH TO LIVE.
The first time you do this, it might take a little bit but future syncs will be much faster as there will be less to sync. The page will auto-refresh as your site syncs and let you know when it’s finished. Reload your live site to see everything.
Custom Domain and SSL (when ready)
For your first deploy you can run on the droplet’s IP over plain HTTP. When you have a domain ready: follow these DigitalOcean’s (or your host’s) instructions for setting up a custom domain: How to add Custom Domains
Once you have your custom domain pointed at your Droplet, you should add this to your Kamal → Custom domain at Settings → deploy.yml
Going Forward: Routine Deploys
After the first deploy, everything’s set up. Routine deploys are one click:
- Go to: Admin → Updates & Deploy and click
DEPLOY.- If there have been any code changes, click
AUTO-COMMIT & DEPLOYor commit yourself and clickREFRESH, thenDEPLOY
- If there have been any code changes, click
- Wait for the streaming log to show “Deploy completed successfully”.
- Reload your live site.