Install on Railway

One click. Managed volume. Custom domain support. Roughly two minutes end-to-end.

Deploy

  1. Click Deploy on Railway. Sign in if prompted.

  2. Pick a project name and a region close to you (US-East, EU-West, AP-Southeast, etc.).

  3. Railway provisions a service from ghcr.io/mddanishyusuf/maillayer-pro:1, attaches a 1 GB volume at /app/data, and assigns a *.up.railway.app URL.

  4. Visit the URL once the deploy goes green. Sign up — the first account becomes the owner.

AUTH_SECRET

The container generates one on first boot and writes it to /app/data/.auth_secret. Subsequent restarts read the same value, so encrypted credentials (Stripe keys, Firebase service accounts, etc.) keep decrypting cleanly.

Back up the secret
Copy AUTH_SECRET from the first-boot logs into Railway → Variables. That way a volume reset doesn't lose it.

Custom domain

Service → SettingsDomains + Custom Domain. Add a CNAME at your registrar pointing at the provided target. Railway handles HTTPS via Let's Encrypt automatically.

Once it resolves, set APP_URL=https://your-domain.com in Variables so tracking links and unsubscribe URLs use the right host.

Replicas

Stay at 1 replica
SQLite is single-writer and the queue/cron run in-process. Multiple replicas will corrupt the database and run every job N times. Keep Replicas = 1.

Volume management

  • Resize: Settings → Volumes → grow the disk. No data loss.
  • Inspect: the volume's mount path is /app/data. Use Railway's CLI to railway run ls /app/data for a quick peek.
  • Backup: the container takes nightly VACUUM backups in /app/data/backups. See Backups.