Variables marked Required are validated on boot: Postiz will fail to start
if they’re missing or malformed.
Required core
These six variables are non-optional for any deployment.DATABASE_URL Required
PostgreSQL connection string used by Prisma.
REDIS_URL Required
Redis connection string used for queues, rate limiting, and short-lived caches.
JWT_SECRET Required
A long random string used to sign session JWTs. Rotating this invalidates every existing session.
FRONTEND_URL Required
The URL the browser uses to reach the Postiz frontend. Used as the OAuth redirect base and for email links.
NEXT_PUBLIC_BACKEND_URL Required
The URL the browser uses to reach the Postiz backend.
BACKEND_INTERNAL_URL Required
The URL the frontend SSR server uses to reach the backend from inside your network. If everything runs in the same container/host, this is usually http://localhost:3000.
Application behaviour
DISABLE_REGISTRATION
Set to true to allow only a single user signup and then disable the sign-up page. Useful for self-host where you want full control.
API_LIMIT
Per-hour limit on the public-API create-post endpoint. Defaults to 90. It is a single value for the whole instance and does not tier by plan: channel and post quotas do that instead.
Note that the shipped docker-compose.yaml sets API_LIMIT: 30, which is lower than the default. Raise it if you drive Postiz from scripts.
RUN_CRON
When set, the backend process runs the scheduled-task workers. Leave unset on API-only instances when workers are deployed separately.
RESTRICT_UPLOAD_DOMAINS
Comma-separated allowlist of domains for /public/v1/upload-from-url. If set, only URLs whose hostname matches an entry are accepted.
DISALLOW_PLUS
When set, blocks the upgrade UI elements pointing to paid plans. Used for self-host deployments that don’t want to surface cloud-only billing.
IS_GENERAL
Branding and product-line switch. It controls page titles, which sign-in providers are offered, the default landing route, and a handful of labels. Set it to "true", which is what the shipped compose file does.
DISABLE_IMAGE_COMPRESSION
When truthy, the frontend skips client-side image compression on upload. Set this if you need pixel-exact originals at the cost of larger uploads.
DISABLE_SSRF_PROTECTION
When connecting providers that take a self-hosted URL (WordPress, Mastodon, Lemmy, Listmonk, Bluesky PDS, etc.), posting media to such providers, fetching webhooks, or handling /public/v1/upload-from-url, Postiz fetches the URL server-side and blocks requests that resolve to private, internal, loopback, or link-local IPs to prevent SSRF. Blocked requests surface as fetch failed with Error: Blocked IP in the backend or orchestrator logs. Set to true to disable the guard. Set it on both the backend and orchestrator containers.
NOT_SECURED
MAIN_URL
Primary application URL used for absolute links in some emails and SEO metadata. Falls back to FRONTEND_URL when not set.
EXTENSION_ID
The Chrome Extension ID for cookie-based platform integrations (e.g. Skool). See the Chrome Extension guide.
MOBILE_APP_SCHEME
URL scheme used for deep-linking from emails into the mobile app.
Storage
See also: Cloudflare R2 and Uploads & Storage.OAuth sign-in (OIDC)
See also: OAuth configuration.Temporal (workflow orchestration)
Since v2.12.0, Postiz uses Temporal for scheduled posts and background workflows. Self-host deployments need to run a Temporal stack (the official docker-compose ships with one). See the Temporal migration guide.Public API & MCP
AI / generation
Short-link providers
If a Postiz user configures short-link replacement, Postiz proxies link shortening through one of the configured providers. Pick one set.Dub.co
Short.io
Kutt.it
LinkDrip
Payments
Removed
These appear in older.env examples and in the shipped compose file, but nothing in Postiz reads them any more. Delete them.
STRIPE_SIGNING_KEY_CONNECT, FEE_AMOUNT, NOWPAYMENTS_API_KEY, NOWPAYMENTS_AMOUNT, SLACK_SIGNING_SECRET, NX_ADD_PLUGINS
Analytics & tracking (frontend)
All of these are optional. Frontend readsNEXT_PUBLIC_* at build time.

