Deploy Appwrite (Full Stack)
Appwrite 2.2 full stack: auth, DB, storage, realtime. Firebase alternative
scheduler
Just deployed
postgresql
Just deployed
realtime
Just deployed
maintenance
Just deployed
appwrite
Just deployed
redis
Just deployed
mongodb
Just deployed
Just deployed
autogravity
Just deployed
router
Just deployed
interval
Just deployed
worker
Just deployed
Just deployed
Deploy and Host Appwrite on Railway
Appwrite is an open source backend-as-a-service: authentication, databases, file storage, realtime subscriptions, and messaging behind one API, with a web console to manage it all. This template deploys the full Appwrite 2.2 self-hosted stack as 13 wired services with one public domain.
About Hosting Appwrite
Appwrite is normally a 30+ container Docker Compose stack with a traefik reverse
proxy routing by hostname and path. On Railway it runs as a set of small services:
the API, the console, realtime, a combined queue worker, scheduled tasks,
PostgreSQL (main database), MongoDB (DocumentsDB), Redis, and two Appwrite helper
services. A tiny Caddy router replaces traefik: it owns the public domain and
splits /v1 API traffic from console pages and /v1/realtime websockets, so
SDKs, the console, and realtime all share one domain exactly like upstream.
First boot takes 2 to 4 minutes while MongoDB initializes its replica set and Appwrite provisions its schemas. If the console loads before the API is ready, wait a minute and refresh.
Common Use Cases
- Backend for web and mobile apps: email/password and OAuth auth, teams, databases with permissions, file storage, realtime subscriptions.
- Self-hosted Firebase-style backend for prototypes and side projects.
- Internal tools backend with the console as admin UI.
Dependencies for Appwrite Hosting
Deployment Dependencies
No external accounts or keys are required. All secrets are generated at deploy time. Everything runs on Railway's private network; only the router has a public domain.
Implementation Details
After deploy, open the public domain, create the root account (first signup),
then an organization and a project. Use https:///v1 as the API
endpoint in your SDKs.
Deliberate cuts, honestly documented:
- Functions and Sites do not work. They need Docker socket access, which Railway does not expose.
- Usage statistics are disabled (
_APP_USAGE_STATS=disabled). To re-enable, add your own ClickHouse and set_APP_CONNECTIONS_DB_USAGE,_APP_CONNECTIONS_DB_EXECUTIONS, and_APP_USAGE_STATS=enabled. - Custom domains for projects do not work (upstream relies on traefik issuing certificates). The main domain is unaffected.
- Storage is local disk. Uploads and downloads work through the API service. For
production, set
_APP_STORAGE_DEVICE=S3and the_APP_STORAGE_S3_*variables. - Email is not configured. Set
_APP_SMTP_*on theappwrite,worker, andmaintenanceservices for password recovery and invites.
Troubleshooting:
- Boot logs show a ~30 second "execution schema setup" retry loop. Harmless: that store backs function execution logs, which are not in use.
- Do not lower
_APP_WORKER_MAX_COROUTINESbelow 8 on the worker; the queue connection pool is sized by it and jobs will start failing. - The PostgreSQL volume must stay mounted at
/var/lib/postgresql(PG18 layout).
Why Deploy Appwrite on Railway?
Railway turns a 30-container compose file into a one-click deploy: private networking between services, persistent volumes, generated secrets, and a single managed domain with TLS. No VPS, no reverse proxy config, no certificate management.
Template Content
scheduler
appwrite/appwrite:2.2.0_APP_REDIS_PASS
_APP_REDIS_USER
_APP_SMTP_SECURE
_APP_LOGGING_CONFIG
_APP_STORAGE_S3_BUCKET
_APP_STORAGE_S3_SECRET
_APP_VCS_GITHUB_APP_ID
_APP_DOCKER_HUB_PASSWORD
_APP_DOCKER_HUB_USERNAME
_APP_STORAGE_S3_ENDPOINT
_APP_VCS_GITEA_CLIENT_ID
_APP_VCS_GITHUB_APP_NAME
_APP_VCS_GITLAB_ENDPOINT
_APP_MESSAGE_SMS_TEST_DSN
_APP_VCS_GITHUB_CLIENT_ID
_APP_VCS_GITLAB_CLIENT_ID
_APP_VCS_ORIGIN_CLIENT_ID
_APP_CONSOLE_GITHUB_APP_ID
_APP_CONSOLE_GITHUB_SECRET
_APP_CONSOLE_GITLAB_APP_ID
_APP_CONSOLE_GITLAB_SECRET
_APP_CONSOLE_GOOGLE_APP_ID
_APP_CONSOLE_GOOGLE_SECRET
_APP_CONSOLE_WHITELIST_IPS
_APP_MESSAGE_PUSH_TEST_DSN
_APP_STORAGE_LINODE_BUCKET
_APP_STORAGE_LINODE_SECRET
_APP_STORAGE_S3_ACCESS_KEY
_APP_STORAGE_WASABI_BUCKET
_APP_STORAGE_WASABI_SECRET
_APP_DATABASE_SHARED_TABLES
_APP_MESSAGE_EMAIL_TEST_DSN
_APP_SMS_PROJECTS_DENY_LIST
_APP_SYSTEM_RESPONSE_FORMAT
_APP_VCS_ORIGIN_PRIVATE_KEY
_APP_CONSOLE_GITLAB_ENDPOINT
_APP_CUSTOM_DOMAIN_DENY_LIST
_APP_VCS_BITBUCKET_CLIENT_ID
_APP_VCS_GITEA_CLIENT_SECRET
_APP_ASSISTANT_OPENAI_API_KEY
_APP_CONSOLE_BITBUCKET_APP_ID
_APP_CONSOLE_BITBUCKET_SECRET
_APP_CONSOLE_WHITELIST_EMAILS
_APP_STORAGE_BACKBLAZE_BUCKET
_APP_STORAGE_BACKBLAZE_SECRET
_APP_STORAGE_DO_SPACES_BUCKET
_APP_STORAGE_DO_SPACES_SECRET
_APP_VCS_GITHUB_CLIENT_SECRET
_APP_VCS_GITLAB_CLIENT_SECRET
_APP_DATABASE_SHARED_NAMESPACE
_APP_STORAGE_LINODE_ACCESS_KEY
_APP_STORAGE_WASABI_ACCESS_KEY
_APP_VCS_GITHUB_WEBHOOK_SECRET
_APP_VCS_GITLAB_WEBHOOK_SECRET
_APP_VCS_BITBUCKET_CLIENT_SECRET
_APP_STORAGE_BACKBLAZE_ACCESS_KEY
_APP_STORAGE_DO_SPACES_ACCESS_KEY
_APP_VCS_BITBUCKET_WEBHOOK_SECRET
_APP_MIGRATIONS_FIREBASE_CLIENT_ID
_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
postgresql
appwrite/postgres:0.1.0realtime
appwrite/appwrite:2.2.0_APP_REDIS_PASS
_APP_REDIS_USER
_APP_SMTP_SECURE
_APP_LOGGING_CONFIG
_APP_STORAGE_S3_BUCKET
_APP_STORAGE_S3_SECRET
_APP_VCS_GITHUB_APP_ID
_APP_DOCKER_HUB_PASSWORD
_APP_DOCKER_HUB_USERNAME
_APP_STORAGE_S3_ENDPOINT
_APP_VCS_GITEA_CLIENT_ID
_APP_VCS_GITHUB_APP_NAME
_APP_VCS_GITLAB_ENDPOINT
_APP_MESSAGE_SMS_TEST_DSN
_APP_VCS_GITHUB_CLIENT_ID
_APP_VCS_GITLAB_CLIENT_ID
_APP_VCS_ORIGIN_CLIENT_ID
_APP_CONSOLE_GITHUB_APP_ID
_APP_CONSOLE_GITHUB_SECRET
_APP_CONSOLE_GITLAB_APP_ID
_APP_CONSOLE_GITLAB_SECRET
_APP_CONSOLE_GOOGLE_APP_ID
_APP_CONSOLE_GOOGLE_SECRET
_APP_CONSOLE_WHITELIST_IPS
_APP_MESSAGE_PUSH_TEST_DSN
_APP_STORAGE_LINODE_BUCKET
_APP_STORAGE_LINODE_SECRET
_APP_STORAGE_S3_ACCESS_KEY
_APP_STORAGE_WASABI_BUCKET
_APP_STORAGE_WASABI_SECRET
_APP_DATABASE_SHARED_TABLES
_APP_MESSAGE_EMAIL_TEST_DSN
_APP_SMS_PROJECTS_DENY_LIST
_APP_SYSTEM_RESPONSE_FORMAT
_APP_VCS_ORIGIN_PRIVATE_KEY
_APP_CONSOLE_GITLAB_ENDPOINT
_APP_CUSTOM_DOMAIN_DENY_LIST
_APP_VCS_BITBUCKET_CLIENT_ID
_APP_VCS_GITEA_CLIENT_SECRET
_APP_ASSISTANT_OPENAI_API_KEY
_APP_CONSOLE_BITBUCKET_APP_ID
_APP_CONSOLE_BITBUCKET_SECRET
_APP_CONSOLE_WHITELIST_EMAILS
_APP_STORAGE_BACKBLAZE_BUCKET
_APP_STORAGE_BACKBLAZE_SECRET
_APP_STORAGE_DO_SPACES_BUCKET
_APP_STORAGE_DO_SPACES_SECRET
_APP_VCS_GITHUB_CLIENT_SECRET
_APP_VCS_GITLAB_CLIENT_SECRET
_APP_DATABASE_SHARED_NAMESPACE
_APP_STORAGE_LINODE_ACCESS_KEY
_APP_STORAGE_WASABI_ACCESS_KEY
_APP_VCS_GITHUB_WEBHOOK_SECRET
_APP_VCS_GITLAB_WEBHOOK_SECRET
_APP_VCS_BITBUCKET_CLIENT_SECRET
_APP_STORAGE_BACKBLAZE_ACCESS_KEY
_APP_STORAGE_DO_SPACES_ACCESS_KEY
_APP_VCS_BITBUCKET_WEBHOOK_SECRET
_APP_MIGRATIONS_FIREBASE_CLIENT_ID
_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
maintenance
appwrite/appwrite:2.2.0_APP_REDIS_PASS
_APP_REDIS_USER
_APP_SMTP_SECURE
_APP_LOGGING_CONFIG
_APP_STORAGE_S3_BUCKET
_APP_STORAGE_S3_SECRET
_APP_VCS_GITHUB_APP_ID
_APP_DOCKER_HUB_PASSWORD
_APP_DOCKER_HUB_USERNAME
_APP_STORAGE_S3_ENDPOINT
_APP_VCS_GITEA_CLIENT_ID
_APP_VCS_GITHUB_APP_NAME
_APP_VCS_GITLAB_ENDPOINT
_APP_MESSAGE_SMS_TEST_DSN
_APP_VCS_GITHUB_CLIENT_ID
_APP_VCS_GITLAB_CLIENT_ID
_APP_VCS_ORIGIN_CLIENT_ID
_APP_CONSOLE_GITHUB_APP_ID
_APP_CONSOLE_GITHUB_SECRET
_APP_CONSOLE_GITLAB_APP_ID
_APP_CONSOLE_GITLAB_SECRET
_APP_CONSOLE_GOOGLE_APP_ID
_APP_CONSOLE_GOOGLE_SECRET
_APP_CONSOLE_WHITELIST_IPS
_APP_MESSAGE_PUSH_TEST_DSN
_APP_STORAGE_LINODE_BUCKET
_APP_STORAGE_LINODE_SECRET
_APP_STORAGE_S3_ACCESS_KEY
_APP_STORAGE_WASABI_BUCKET
_APP_STORAGE_WASABI_SECRET
_APP_DATABASE_SHARED_TABLES
_APP_MESSAGE_EMAIL_TEST_DSN
_APP_SMS_PROJECTS_DENY_LIST
_APP_SYSTEM_RESPONSE_FORMAT
_APP_VCS_ORIGIN_PRIVATE_KEY
_APP_CONSOLE_GITLAB_ENDPOINT
_APP_CUSTOM_DOMAIN_DENY_LIST
_APP_VCS_BITBUCKET_CLIENT_ID
_APP_VCS_GITEA_CLIENT_SECRET
_APP_ASSISTANT_OPENAI_API_KEY
_APP_CONSOLE_BITBUCKET_APP_ID
_APP_CONSOLE_BITBUCKET_SECRET
_APP_CONSOLE_WHITELIST_EMAILS
_APP_STORAGE_BACKBLAZE_BUCKET
_APP_STORAGE_BACKBLAZE_SECRET
_APP_STORAGE_DO_SPACES_BUCKET
_APP_STORAGE_DO_SPACES_SECRET
_APP_VCS_GITHUB_CLIENT_SECRET
_APP_VCS_GITLAB_CLIENT_SECRET
_APP_DATABASE_SHARED_NAMESPACE
_APP_STORAGE_LINODE_ACCESS_KEY
_APP_STORAGE_WASABI_ACCESS_KEY
_APP_VCS_GITHUB_WEBHOOK_SECRET
_APP_VCS_GITLAB_WEBHOOK_SECRET
_APP_VCS_BITBUCKET_CLIENT_SECRET
_APP_STORAGE_BACKBLAZE_ACCESS_KEY
_APP_STORAGE_DO_SPACES_ACCESS_KEY
_APP_VCS_BITBUCKET_WEBHOOK_SECRET
_APP_MIGRATIONS_FIREBASE_CLIENT_ID
_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
appwrite
appwrite/appwrite:2.2.0_APP_REDIS_PASS
_APP_REDIS_USER
_APP_SMTP_SECURE
_APP_LOGGING_CONFIG
_APP_STORAGE_S3_BUCKET
_APP_STORAGE_S3_SECRET
_APP_VCS_GITHUB_APP_ID
_APP_DOCKER_HUB_PASSWORD
_APP_DOCKER_HUB_USERNAME
_APP_STORAGE_S3_ENDPOINT
_APP_VCS_GITEA_CLIENT_ID
_APP_VCS_GITHUB_APP_NAME
_APP_VCS_GITLAB_ENDPOINT
_APP_MESSAGE_SMS_TEST_DSN
_APP_VCS_GITHUB_CLIENT_ID
_APP_VCS_GITLAB_CLIENT_ID
_APP_VCS_ORIGIN_CLIENT_ID
_APP_CONSOLE_GITHUB_APP_ID
_APP_CONSOLE_GITHUB_SECRET
_APP_CONSOLE_GITLAB_APP_ID
_APP_CONSOLE_GITLAB_SECRET
_APP_CONSOLE_GOOGLE_APP_ID
_APP_CONSOLE_GOOGLE_SECRET
_APP_CONSOLE_WHITELIST_IPS
_APP_MESSAGE_PUSH_TEST_DSN
_APP_STORAGE_LINODE_BUCKET
_APP_STORAGE_LINODE_SECRET
_APP_STORAGE_S3_ACCESS_KEY
_APP_STORAGE_WASABI_BUCKET
_APP_STORAGE_WASABI_SECRET
_APP_DATABASE_SHARED_TABLES
_APP_MESSAGE_EMAIL_TEST_DSN
_APP_SMS_PROJECTS_DENY_LIST
_APP_SYSTEM_RESPONSE_FORMAT
_APP_VCS_ORIGIN_PRIVATE_KEY
_APP_CONSOLE_GITLAB_ENDPOINT
_APP_CUSTOM_DOMAIN_DENY_LIST
_APP_VCS_BITBUCKET_CLIENT_ID
_APP_VCS_GITEA_CLIENT_SECRET
_APP_ASSISTANT_OPENAI_API_KEY
_APP_CONSOLE_BITBUCKET_APP_ID
_APP_CONSOLE_BITBUCKET_SECRET
_APP_CONSOLE_WHITELIST_EMAILS
_APP_STORAGE_BACKBLAZE_BUCKET
_APP_STORAGE_BACKBLAZE_SECRET
_APP_STORAGE_DO_SPACES_BUCKET
_APP_STORAGE_DO_SPACES_SECRET
_APP_VCS_GITHUB_CLIENT_SECRET
_APP_VCS_GITLAB_CLIENT_SECRET
_APP_DATABASE_SHARED_NAMESPACE
_APP_STORAGE_LINODE_ACCESS_KEY
_APP_STORAGE_WASABI_ACCESS_KEY
_APP_VCS_GITHUB_WEBHOOK_SECRET
_APP_VCS_GITLAB_WEBHOOK_SECRET
_APP_VCS_BITBUCKET_CLIENT_SECRET
_APP_STORAGE_BACKBLAZE_ACCESS_KEY
_APP_STORAGE_DO_SPACES_ACCESS_KEY
_APP_VCS_BITBUCKET_WEBHOOK_SECRET
_APP_MIGRATIONS_FIREBASE_CLIENT_ID
_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
redis
redis:7.4.7-alpinemongodb
mongo:8.2.5autogravity
ghcr.io/appwrite/autogravity:0.0.10router
caddy:2-alpineinterval
appwrite/appwrite:2.2.0_APP_REDIS_PASS
_APP_REDIS_USER
_APP_SMTP_SECURE
_APP_LOGGING_CONFIG
_APP_STORAGE_S3_BUCKET
_APP_STORAGE_S3_SECRET
_APP_VCS_GITHUB_APP_ID
_APP_DOCKER_HUB_PASSWORD
_APP_DOCKER_HUB_USERNAME
_APP_STORAGE_S3_ENDPOINT
_APP_VCS_GITEA_CLIENT_ID
_APP_VCS_GITHUB_APP_NAME
_APP_VCS_GITLAB_ENDPOINT
_APP_MESSAGE_SMS_TEST_DSN
_APP_VCS_GITHUB_CLIENT_ID
_APP_VCS_GITLAB_CLIENT_ID
_APP_VCS_ORIGIN_CLIENT_ID
_APP_CONSOLE_GITHUB_APP_ID
_APP_CONSOLE_GITHUB_SECRET
_APP_CONSOLE_GITLAB_APP_ID
_APP_CONSOLE_GITLAB_SECRET
_APP_CONSOLE_GOOGLE_APP_ID
_APP_CONSOLE_GOOGLE_SECRET
_APP_CONSOLE_WHITELIST_IPS
_APP_MESSAGE_PUSH_TEST_DSN
_APP_STORAGE_LINODE_BUCKET
_APP_STORAGE_LINODE_SECRET
_APP_STORAGE_S3_ACCESS_KEY
_APP_STORAGE_WASABI_BUCKET
_APP_STORAGE_WASABI_SECRET
_APP_DATABASE_SHARED_TABLES
_APP_MESSAGE_EMAIL_TEST_DSN
_APP_SMS_PROJECTS_DENY_LIST
_APP_SYSTEM_RESPONSE_FORMAT
_APP_VCS_ORIGIN_PRIVATE_KEY
_APP_CONSOLE_GITLAB_ENDPOINT
_APP_CUSTOM_DOMAIN_DENY_LIST
_APP_VCS_BITBUCKET_CLIENT_ID
_APP_VCS_GITEA_CLIENT_SECRET
_APP_ASSISTANT_OPENAI_API_KEY
_APP_CONSOLE_BITBUCKET_APP_ID
_APP_CONSOLE_BITBUCKET_SECRET
_APP_CONSOLE_WHITELIST_EMAILS
_APP_STORAGE_BACKBLAZE_BUCKET
_APP_STORAGE_BACKBLAZE_SECRET
_APP_STORAGE_DO_SPACES_BUCKET
_APP_STORAGE_DO_SPACES_SECRET
_APP_VCS_GITHUB_CLIENT_SECRET
_APP_VCS_GITLAB_CLIENT_SECRET
_APP_DATABASE_SHARED_NAMESPACE
_APP_STORAGE_LINODE_ACCESS_KEY
_APP_STORAGE_WASABI_ACCESS_KEY
_APP_VCS_GITHUB_WEBHOOK_SECRET
_APP_VCS_GITLAB_WEBHOOK_SECRET
_APP_VCS_BITBUCKET_CLIENT_SECRET
_APP_STORAGE_BACKBLAZE_ACCESS_KEY
_APP_STORAGE_DO_SPACES_ACCESS_KEY
_APP_VCS_BITBUCKET_WEBHOOK_SECRET
_APP_MIGRATIONS_FIREBASE_CLIENT_ID
_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
worker
appwrite/appwrite:2.2.0_APP_REDIS_PASS
_APP_REDIS_USER
_APP_SMTP_SECURE
_APP_LOGGING_CONFIG
_APP_STORAGE_S3_BUCKET
_APP_STORAGE_S3_SECRET
_APP_VCS_GITHUB_APP_ID
_APP_DOCKER_HUB_PASSWORD
_APP_DOCKER_HUB_USERNAME
_APP_STORAGE_S3_ENDPOINT
_APP_VCS_GITEA_CLIENT_ID
_APP_VCS_GITHUB_APP_NAME
_APP_VCS_GITLAB_ENDPOINT
_APP_MESSAGE_SMS_TEST_DSN
_APP_VCS_GITHUB_CLIENT_ID
_APP_VCS_GITLAB_CLIENT_ID
_APP_VCS_ORIGIN_CLIENT_ID
_APP_CONSOLE_GITHUB_APP_ID
_APP_CONSOLE_GITHUB_SECRET
_APP_CONSOLE_GITLAB_APP_ID
_APP_CONSOLE_GITLAB_SECRET
_APP_CONSOLE_GOOGLE_APP_ID
_APP_CONSOLE_GOOGLE_SECRET
_APP_CONSOLE_WHITELIST_IPS
_APP_MESSAGE_PUSH_TEST_DSN
_APP_STORAGE_LINODE_BUCKET
_APP_STORAGE_LINODE_SECRET
_APP_STORAGE_S3_ACCESS_KEY
_APP_STORAGE_WASABI_BUCKET
_APP_STORAGE_WASABI_SECRET
_APP_DATABASE_SHARED_TABLES
_APP_MESSAGE_EMAIL_TEST_DSN
_APP_SMS_PROJECTS_DENY_LIST
_APP_SYSTEM_RESPONSE_FORMAT
_APP_VCS_ORIGIN_PRIVATE_KEY
_APP_CONSOLE_GITLAB_ENDPOINT
_APP_CUSTOM_DOMAIN_DENY_LIST
_APP_VCS_BITBUCKET_CLIENT_ID
_APP_VCS_GITEA_CLIENT_SECRET
_APP_ASSISTANT_OPENAI_API_KEY
_APP_CONSOLE_BITBUCKET_APP_ID
_APP_CONSOLE_BITBUCKET_SECRET
_APP_CONSOLE_WHITELIST_EMAILS
_APP_STORAGE_BACKBLAZE_BUCKET
_APP_STORAGE_BACKBLAZE_SECRET
_APP_STORAGE_DO_SPACES_BUCKET
_APP_STORAGE_DO_SPACES_SECRET
_APP_VCS_GITHUB_CLIENT_SECRET
_APP_VCS_GITLAB_CLIENT_SECRET
_APP_DATABASE_SHARED_NAMESPACE
_APP_STORAGE_LINODE_ACCESS_KEY
_APP_STORAGE_WASABI_ACCESS_KEY
_APP_VCS_GITHUB_WEBHOOK_SECRET
_APP_VCS_GITLAB_WEBHOOK_SECRET
_APP_VCS_BITBUCKET_CLIENT_SECRET
_APP_STORAGE_BACKBLAZE_ACCESS_KEY
_APP_STORAGE_DO_SPACES_ACCESS_KEY
_APP_VCS_BITBUCKET_WEBHOOK_SECRET
_APP_MIGRATIONS_FIREBASE_CLIENT_ID
_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
