SELF_HOSTING.md
in the repository; this page summarizes the public setup path and the checks
that usually matter first.
Start here when you want an operator-managed deployment for your team. By the
end of setup, you should have a reachable Roomote URL, sign-in, a
source-control provider, an inference provider, at least one environment, and a
first reviewable Roomote task.
One-command install
SSH into a fresh Ubuntu or Debian server (x86_64 or arm64, 4 GB+ RAM) and run:--domain roomote.example.com for a
production install on your own domain.
Prefer to read what you are about to run as root? Download, inspect, then run
the same script:
Setup checklist
Have these ready before the wizard asks for them:- a public HTTPS URL for the deployment, especially when source-control or chat callbacks need to reach it
- a sign-in provider for the people who will use the deployment
- a source-control provider account with permission to install or configure the app for the repositories Roomote should reach
- an inference provider API key, such as OpenRouter, Anthropic, or OpenAI
- a communications provider workspace, such as Slack, Microsoft Teams, or Telegram, if your team wants to start work from chat
- at least one repository that can become the first Roomote environment
Day-2 operations
The installer also sets up theroomote host CLI for common operations:
roomote backup prompts for a passphrase and writes a versioned .roomote
bundle under /opt/roomote/backups. The bundle contains PostgreSQL, the
deployment configuration and encryption/signing keys, local MinIO artifacts,
schema metadata, and the exact deployed image identities. Store the passphrase
separately in your secret manager; the backup cannot be restored without it.
Use roomote backup --include-redis when queued work, BullMQ schedules,
sessions, and other transient Redis state must survive. Backups briefly stop
application writers (and active Docker task workers) so the included stores
share a documented consistency point. If object storage is external, the
bundle records its endpoint and bucket but does not copy its objects; keep a
provider-level backup of that bucket.
Restore only after installing Roomote on the replacement host:
.env (including ENCRYPTION_KEY), repopulates
empty PostgreSQL/MinIO/Redis volumes, and starts the recorded Roomote release.
Upgrades and rollback
roomote upgrade is designed so a bad release cannot strand your deployment:
- A backup comes first. Every upgrade creates an encrypted pre-upgrade
bundle under
/opt/roomote/backupsbefore anything changes. Pass a passphrase with--backup-passphrase-file(orROOMOTE_BACKUP_PASSPHRASE); otherwise one is generated and stored next to the bundle. Use--skip-backupto opt out. - Migrations run before services are replaced. Database migrations apply in a single transaction while the previous release keeps serving. If a migration fails, the schema rolls back, the previous configuration is restored, and the previous release stays up.
- Rollback is one command. Every release’s schema keeps the previous
release working, so
roomote rollbackre-deploys the prior release without touching the database.roomote upgrade <tag>does the same for any retained tag, and restoring the pre-upgrade bundle is the last-resort path that also rewinds data.
Deployment modes
- One-command install —
deploy/install.shon an existing server, using published GHCR images. - Local development —
pnpm devruns the services from your checkout with PM2 for fast source edits. - Production Compose with Caddy —
docker-compose.production.ymladds a Caddy container as the HTTPS entrypoint for your app and preview domains, and runs the containerized stack in production mode with per-install secrets (locally or on a server).
Requirements
- An inference provider API key (OpenRouter, Anthropic, OpenAI, and others).
- A GitHub account — the setup wizard creates the GitHub App for you.
- For Slack, Microsoft Teams, and Telegram: a workspace where you can install an app; the setup wizard prefills the Slack app manifest for you.
Verify the deployment
After setup, run a small task that uses the first environment. A healthy deployment should let you:- sign in from the public Roomote URL
- connect source control and see the expected repositories
- create or select an environment
- start a task from the dashboard or chat
- inspect the task transcript, logs, and any generated diff or artifact
- open a preview when the task starts a web app
Common issues
- Callbacks fail. Confirm the deployment has a public HTTPS URL and that the source-control or communications provider is using that exact URL.
- The first task cannot clone a repository. Check source-control installation scope and repository permissions.
- The agent cannot run useful commands. Add missing services, environment variables, setup commands, or tool versions to the environment.
- Chat messages do not reach Roomote. Confirm the app is installed, invited to the channel, and using the current callback URL.