Deploy Postiz — Self-Hosted Social Scheduler, 30+ Platforms
Self-host Postiz — schedule 30+ platforms, no per-channel fees
Redis
Just deployed
/data
Postiz
Just deployed
/uploads
Just deployed
/var/lib/postgresql/data
Deploy and Host Postiz on Railway
Postiz is the open-source alternative to Buffer, Hypefury, and Later — schedule, publish, and analyze content across 30+ platforms from one dashboard, with AI-assisted writing and no per-channel fees. This template deploys the current version of Postiz correctly, including the Temporal workflow engine recent releases require to actually run scheduled posts — the multi-service piece that breaks most self-hosted attempts. Everything is pre-wired over private networking so posts publish on schedule from the first deploy.
What This Template Deploys
| Service | Purpose |
|---|---|
| Postiz | The scheduling app, dashboard, and API (Next.js + Node.js) |
| PostgreSQL (app) | Postiz's own database — posts, accounts, and history |
| Redis | Job queues and caching |
| Temporal | Workflow engine that executes scheduled posts (required on current versions) |
| PostgreSQL (Temporal) | Temporal's separate database — kept apart from Postiz's |
| Elasticsearch | Temporal's workflow visibility store |
All services connect over Railway's private network — no database or queue ports are public. Persistent volumes hold uploads, both databases, and Redis data.
About Hosting
Postiz looks simple, but recent versions have a hard architectural requirement that catches almost everyone self-hosting — this template handles it.
Current Postiz requires Temporal — it won't run scheduled posts without it. As of v2.12, Postiz depends on Temporal, a workflow orchestration engine, to execute scheduled posts — the app can't do its core job without it. Temporal in turn needs its own separate PostgreSQL database and an Elasticsearch instance. That's why a naive "Postiz + Postgres + Redis" deploy on the latest version appears to run but silently never publishes. This template includes the full Temporal stack, wired correctly, so posts actually go out.
The Elasticsearch dotted-variable fix is Railway-specific. Elasticsearch expects config like cluster.routing.allocation.disk.watermark.low, but Railway rejects env var names with dots. This template uses a wrapped image that bakes the config into elasticsearch.yml at build time and fixes volume permissions on startup, so it runs where a stock image fails.
The URL variables must match your Railway domain for OAuth. MAIN_URL, FRONTEND_URL, and NEXT_PUBLIC_BACKEND_URL must point at your Railway public domain, because social platforms use them for OAuth callbacks. This template sets them automatically, so connecting X, LinkedIn, and the rest works once you add each platform's API keys.
Lock down registration after your first login. Postiz allows open signup by default. Create your admin account, then set DISABLE_REGISTRATION=true and redeploy so no one else can register.
Pin the version, and expect a first-boot pause. The template pins a specific release rather than latest. On first deploy, Postiz may need a moment (or a manual restart) after Temporal's 30–60 second auto-setup — a one-time ordering quirk, not a failure.
Typical cost: ~$15–25/month on Railway for the full stack, since Temporal and Elasticsearch add services beyond the base app. Postiz is open source and free — versus Buffer's per-channel pricing that climbs fast.
How It Compares
| Postiz (self-hosted) | Buffer | Hypefury | Later | |
|---|---|---|---|---|
| Cost model | Flat infra | Per channel/month | Subscription | Per social set |
| Platforms | 30+ incl. Fediverse | ~6 | X-focused | Visual-focused |
| AI content | Built-in | Add-on | Yes | Limited |
| Data ownership | Full — your infra | Vendor | Vendor | Vendor |
| API / MCP publishing | Yes | Limited | No | No |
| Self-hostable | Yes | No | No | No |
Buffer, Hypefury, and Later are polished but priced per channel or seat and keep your data on their servers. Postiz gives you 30+ platforms including Mastodon and the Fediverse, AI-assisted writing, and programmatic publishing via API/MCP — self-hosted, with your accounts and content on infrastructure you own and no per-channel fees.
Deploy in Under 5 Minutes
- Click Deploy on Railway — all services build and wire together (~5 minutes)
- Confirm the URL variables point at your Railway domain and
JWT_SECRETis set - Wait for Temporal's auto-setup, then open your Postiz domain and register the first admin account
- Set
DISABLE_REGISTRATION=trueand redeploy to lock signups - In Settings → Providers, add OAuth credentials for each platform and start scheduling
Common Use Cases
- Buffer alternative without per-channel fees — schedule unlimited channels at flat cost instead of paying per profile
- Multi-platform scheduling — post to X, LinkedIn, Instagram, Facebook, Threads, Mastodon, Reddit, and more from one calendar
- Fediverse publishing — one of the few schedulers with real Mastodon and Fediverse support
- Agency and team workflows — manage many clients' accounts with team access, on your own infrastructure
Configuration
| Variable | Required | Description |
|---|---|---|
MAIN_URL | Required | Your Railway public domain — used for OAuth callbacks |
FRONTEND_URL / NEXT_PUBLIC_BACKEND_URL | Required | Same public domain (the backend adds /api) |
JWT_SECRET | Required | Signs auth tokens — auto-generated at deploy; keep it stable |
DATABASE_URL | Auto-injected | Postiz's PostgreSQL via Railway reference variable |
REDIS_URL | Auto-injected | Redis connection via Railway reference variable |
TEMPORAL_ADDRESS | Auto-injected | Temporal server's private address on port 7233 |
DISABLE_REGISTRATION | Recommended | Set true after creating your admin account |
Current Postiz needs the full Temporal stack. On v2.12+, scheduled posts won't execute without Temporal, its own PostgreSQL, and Elasticsearch. This template includes and wires all of them — a "Postiz + Postgres + Redis"-only deploy silently won't publish. Match the URL variables and lock registration.
MAIN_URL,FRONTEND_URL, andNEXT_PUBLIC_BACKEND_URLmust be your Railway domain for OAuth to work. After first login, setDISABLE_REGISTRATION=trueand redeploy.
Dependencies for Postiz Hosting
- Railway account — ~$15–25/month for the full Temporal-inclusive stack
- PostgreSQL ×2, Redis, Temporal, and Elasticsearch (all included and wired)
- OAuth API credentials for each social platform you connect
- Persistent volumes for uploads and databases (included)
Deployment Dependencies
- Postiz GitHub Repository
- Postiz Documentation
- Postiz Official Docker Compose
- Railway Private Networking
Implementation Details
The template runs a pinned Postiz release (ghcr.io/gitroomhq/postiz-app) as a unified Next.js + Node.js app, backed by its own PostgreSQL and Redis, plus a full Temporal stack: the Temporal server, a dedicated Temporal PostgreSQL, and an Elasticsearch visibility store. Services connect through Railway reference variables (DATABASE_URL, REDIS_URL, TEMPORAL_ADDRESS) over the private network, and PORT is set explicitly as a Railway variable rather than a Dockerfile default so routing reaches the container.
Since v2.12, Temporal is a hard dependency for executing scheduled posts, which is why the stack is larger than older Postgres-and-Redis-only setups. The Elasticsearch service uses a wrapped image because Railway rejects dotted env var names; the wrapper writes the required config into elasticsearch.yml at build time and fixes volume permissions via a custom entrypoint. Public URL variables are set to the Railway domain so OAuth callbacks resolve, and the JWT secret is auto-generated. Data persists across the provisioned volumes, so scheduled posts, accounts, and history survive redeploys; on first boot, Postiz may need a restart after Temporal's auto-setup completes.
Frequently Asked Questions
Why does Postiz need so many services now? Since v2.12, Postiz uses Temporal to execute scheduled posts, and Temporal needs its own PostgreSQL and Elasticsearch. Without them, the app runs but never publishes — which is why this template includes the full stack.
My older Postiz template stopped scheduling — why? Likely because it predates the Temporal requirement. On current versions, a Postgres-and-Redis-only setup starts but can't run the scheduler. This template adds the Temporal stack that recent Postiz needs.
Why the custom Elasticsearch image? Railway rejects environment variable names with dots, which Elasticsearch's config uses. The wrapped image bakes that config into a file at build time so it runs on Railway, where the stock image fails.
Does my data persist? Yes — Postiz's database and uploads and Temporal's database all live on volumes, so scheduled posts, accounts, and history survive redeploys.
Which platforms does Postiz support? 30+, including X, LinkedIn, Instagram, Facebook, Threads, Reddit, Mastodon, and other Fediverse platforms — broader than most managed schedulers, with API/MCP publishing.
Why Deploy Postiz on Railway?
Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.
By deploying Postiz on Railway you get a self-hosted social scheduler that actually works on the current version — the required Temporal engine included and wired, the Railway-specific Elasticsearch fix applied, and OAuth URLs set automatically. Schedule 30+ platforms with AI-assisted content and no per-channel fees, on infrastructure you own.
Template Content