Tutorials

Step-by-step tutorials

Self-host the apps you use, deploy your framework to a server you own, and move off a managed platform. Every guide shows the manual way and the one-click way.

Self-host open-source apps

Self-host a Mastodon server

Run a real Mastodon instance with Postgres, Redis, the streaming API and Sidekiq as separate services, behind Caddy HTTPS, with backups.

Self-host AFFiNE, an open-source Notion alternative

Run AFFiNE, the open-source Notion and Miro alternative, with Postgres and Redis in Docker Compose, Caddy HTTPS, backups and an upgrade path.

Self-host Castopod to publish a podcast

Run Castopod with MariaDB and Redis in Docker Compose behind Caddy HTTPS, publish an RSS feed you own, and back up the audio volume.

Self-host changedetection.io to watch web pages

Run changedetection.io on a $6/month server to get notified when any web page changes: price drops, restocks, or a notice page updating.

Self-host Chatwoot with Postgres, Redis and Sidekiq

Run your own Chatwoot support inbox on a VPS you control, with Postgres, Redis, a Sidekiq worker and HTTPS, from a bare server to a working login.

Self-host Ghost with MySQL

Run Ghost on your own server with MySQL, Docker Compose and Caddy, including real backups, HTTPS, and a tested upgrade path.

Self-host Gitea for your own Git server

Run Gitea on your own server with Docker Compose, HTTPS through Caddy and Git over SSH, plus a backup you have tested by restoring it.

Self-host Healthchecks.io to monitor cron jobs

Run Healthchecks.io on your own server with Docker, Postgres and HTTPS: the full Compose setup, SMTP alerts, backups and the one-click shortcut.

Self-host Immich for your photo library

Run Immich, the open-source Google Photos alternative, on your own server with Docker, Postgres and HTTPS through Caddy, and point your phone at it.

Self-host Jitsi Meet for video calls

Run Jitsi Meet, the open-source video conferencing platform, on your own Docker server with HTTPS, and the one port that trips up most setups.

Self-host LibreChat for your own ChatGPT-style app

Run LibreChat with MongoDB in Docker Compose behind Caddy HTTPS, with real secrets generated, registration locked down and backups in place.

Self-host MediaCMS for video hosting

Run MediaCMS with Postgres, Redis and a separate Celery worker for transcoding in Docker Compose, behind Caddy HTTPS, with backups.

Self-host Meilisearch for fast search

Run Meilisearch in Docker Compose behind Caddy HTTPS, with a real master key, a backup snapshot and an upgrade path you can repeat.

Self-host Memos for notes

Run Memos, a lightweight self-hosted note-taking app, on your own $6/month droplet with HTTPS, backups and an upgrade path.

Self-host Metabase with Postgres

Run Metabase, the open-source BI tool, on your own server with Docker, its own Postgres metadata database, and HTTPS through Caddy, no per-seat license.

Self-host n8n on a $6 server

Run n8n on your own $6/month droplet with Postgres and HTTPS: the full Docker Compose setup, backups, upgrades and the one-click shortcut.

Self-host Rocket.Chat for team chat

Run Rocket.Chat on your own Hetzner server with a MongoDB replica set, HTTPS, backups and an upgrade path, start to finish.

Self-host Umami analytics

Run Umami on your own server with Docker Compose, Postgres and automatic HTTPS through Caddy, with backups you have restored at least once.

Self-host Uptime Kuma for status pages and alerts

Run Uptime Kuma on your own server with Docker Compose and Caddy HTTPS, add backups and upgrades, and see the one-click path too.

Self-host Vaultwarden, the Bitwarden-compatible password manager

Run your own Bitwarden-compatible vault with Vaultwarden, Docker Compose and Caddy, with a hashed admin token and a working backup.

Deploy your framework to your own server

Deploy a Go web app to Hetzner

Build and ship a Go net/http service with Postgres on a Hetzner server using Docker, Compose and Caddy, with backups and a repeatable upgrade path.

Deploy a Rails app to DigitalOcean

A full walkthrough: deploy a Dockerized Rails app with Postgres and HTTPS on a $12/month DigitalOcean droplet, with backups and upgrades.

Deploy a Rails app to Hetzner

Deploy a Rails app to a Hetzner server with Postgres, Caddy HTTPS and nightly backups using Docker Compose, plus a repeatable release process.

Deploy an Express app to DigitalOcean

Run an Express 5 app with a Postgres-backed route on a DigitalOcean droplet, behind Caddy for HTTPS, plus the shortcut that skips the setup.

Deploy Django to DigitalOcean

Run a Django app on a DigitalOcean droplet with Postgres, gunicorn and Caddy for HTTPS, plus the one-click path that skips the setup.

Deploy Django with Celery to Hetzner

Run Django, gunicorn, Celery and Postgres on a Hetzner server with Docker Compose, Caddy and HTTPS, from scratch to production.

Deploy FastAPI to Hetzner

Run a FastAPI app in production on a Hetzner Cloud server: Postgres, Alembic migrations and Caddy for HTTPS, all in Docker.

Deploy Flask to DigitalOcean

Run a Flask app in production on a DigitalOcean Droplet: gunicorn, Postgres and Flask-Migrate behind Caddy for HTTPS, all in Docker.

Deploy Laravel to Hetzner

Run Laravel in production on a Hetzner Cloud server with FrankenPHP, MySQL, a queue worker and the scheduler in Docker, with HTTPS set up automatically.

Deploy Next.js to DigitalOcean

Run a production Next.js app on a DigitalOcean droplet: a standalone Docker build, Caddy for automatic HTTPS, and a repeatable way to ship updates.

Deploy Next.js to Hetzner

Build a Next.js app in standalone output mode, containerize it, and serve it behind Caddy with HTTPS on a Hetzner Cloud server.

Deploy Nuxt to Hetzner

Build a Nuxt app with its Nitro node-server output, containerize it, and serve it behind Caddy with HTTPS on a Hetzner Cloud server.

Deploy Phoenix to Hetzner

Build a Phoenix release and run it in production on a Hetzner Cloud server, with Postgres and Caddy for HTTPS, all in Docker with mix release.

Deploy Spring Boot to Hetzner

Package a Spring Boot app as a layered Docker image, add Postgres and Caddy HTTPS, and run it on a Hetzner server with backups and a release step.

Deploy SvelteKit to Hetzner

Build a SvelteKit app with adapter-node, containerize it, and serve it behind Caddy with HTTPS on a Hetzner Cloud server you control.

Move off a managed platform

Move a Django app from Heroku to DigitalOcean

Migrate a production Django app off Heroku to a DigitalOcean droplet: Dockerize it, pull the Postgres data across, map config vars, and cut DNS over.

Move a Next.js app from Vercel to your own server

Take a Next.js app off Vercel and onto a server you own: environment variables, a standalone Docker build, HTTPS, cron jobs and a safe DNS cutover.

Move a Rails app from Heroku to Hetzner, step by step

Migrate a production Rails app off Heroku to Hetzner: Dockerize it, pull the Postgres data across, map config vars, and cut DNS over safely.

Move from Fly.io to your own server

Export your app's image, secrets and Postgres data from Fly and run them on a server you own, with Docker Compose and Caddy.

Move from Railway to your own server

Export your Railway app and its Postgres database, stand them up on your own VPS behind Caddy, and the one-click import that does most of it for you.

Move from Render to your own server

A full walkthrough for moving a Render web service and its Postgres database to a server you own, with HTTPS and backups set up at the end.

Move off Heroku Key-Value Store (Redis)

Heroku renamed its Redis add-on to Key-Value Store. Here's how to run your own Redis instead, move the data over, and keep your app working.

Move off Heroku Postgres without losing data

Capture a Heroku Postgres backup, restore it into a new database, verify every row, and cut over without downtime or data loss.

Replace Heroku review apps with pull request previews

Build your own per-PR preview environments with GitHub Actions and Docker, then see what a hosted version with sleep-on-idle looks like.

Replace Heroku Scheduler with cron jobs on your server

Heroku Scheduler's jobs aren't guaranteed to run on time or at all. Here's how to replace them with cron on your own server, with locking and real logs.

Deploy your first app on a server you own.

Attach a machine with a host, a user and an SSH key, or let Railyard create one in your cloud account. It installs the rest and watches it come online.

Free plan, no card, and 14 days of Pro for every new team. One flat price per team.