Backend started successfully on port 3000, the backend checks its settings and logs each problem as a Configuration issue. It keeps running either way, so read those lines first.
Start-up
The container restarts in a loop, or gets killed
The container restarts in a loop, or gets killed
docker stats shows usage, and dmesg on the host shows the kernel killing a process.On v3.6.121 the container restarts in a loop with a data loss warning
On v3.6.121 the container restarts in a loop with a data loss warning
--accept-data-loss. v3.6.121 applied the schema without that flag, which stopped installs that came from a release older than v3.6.107. Move the image to v3.6.122 or newer and recreate the container. See Backups and upgrades.The backend stops: UPLOAD_DIRECTORY is not set
The backend stops: UPLOAD_DIRECTORY is not set
STORAGE_PROVIDER is "local" but UPLOAD_DIRECTORY is not set. Local storage needs a folder. In the official image, set UPLOAD_DIRECTORY=/uploads and NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY=uploads, as the Compose file does. See Uploads and storage.The database connection is refused
The database connection is refused
DATABASE_URL. Inside a container, localhost is the container itself: use the service name, postqueen-postgres in the Compose file. docker compose logs postqueen-postgres should show database system is ready to accept connections. Outside Compose, the container must be on the same Docker network as the database.A port is already in use
A port is already in use
docker-compose.yaml. If you move 4007, change the port in MAIN_URL, FRONTEND_URL and NEXT_PUBLIC_BACKEND_URL too.Building from source runs out of memory
Building from source runs out of memory
NODE_OPTIONS="--max-old-space-size=4096" pnpm run build, but not above the machine’s memory. On a small server, pull the published image instead of building.Sign-in
Signing in returns to the login page
Signing in returns to the login page
FRONTEND_URL must match the address in the browser exactly, with the scheme and without a trailing slash. On plain HTTP, the cookie needs NOT_SECURED=true, which is for a local try only.Origin not allowed
Origin not allowed
FRONTEND_URL and MAIN_URL. Opening PostQueen on any other host or port is refused. Set both to the address people use.Everyone was signed out after a restart
Everyone was signed out after a restart
JWT_SECRET changed. It signs every session. If ENCRYPTION_KEY was never set, the same value also encrypted the API key and the stored credentials of networks such as Bluesky and WordPress, and those stop working too. Put the old value back: that recovers everything. Then set ENCRYPTION_KEY to that same value before you rotate JWT_SECRET. See Encryption keys.Continue with Google is denied, or only some accounts get in
Continue with Google is denied, or only some accounts get in
YOUTUBE_CLIENT_ID and YOUTUBE_CLIENT_SECRET, and its redirect URI FRONTEND_URL + /integrations/social/youtube. While the Google app is in Testing, only its listed test users can sign in: publish it, or add the person. See YouTube setup.Google consent works, then sign-in fails with invalid_client
Google consent works, then sign-in fails with invalid_client
invalid_client from Google’s token endpoint: YOUTUBE_CLIENT_SECRET does not belong to that client. Add a new secret to the same web client in Google Cloud, put it in .env, and recreate the container. Google shows a secret in full only when you create it.New accounts stay inactive
New accounts stay inactive
REQUIRE_EMAIL_ACTIVATION=true with a mail provider that cannot deliver. Fix email, or remove the setting.Connecting channels
Connecting worked yesterday and fails after a domain change
Connecting worked yesterday and fails after a domain change
FRONTEND_URL. Update the redirect URI in each network’s developer console to the new address.fetch failed, with Blocked IP in the log
fetch failed, with Blocked IP in the log
DISABLE_SSRF_PROTECTION=true. Otherwise fix DNS so the name resolves to a public address.fetch failed without Blocked IP
fetch failed without Blocked IP
HTTPS_PROXY, so behind an egress proxy allow the hosts at the network layer. Self-hosting overview lists the main ones.Hide a network from Add Channel
Hide a network from Add Channel
HIDDEN_PROVIDERS to the identifiers to hide, for example tiktok,x, and recreate the container. Connected channels keep working. MIGRATE_PROVIDERS moves channels to another network on their next reconnect: see Hide or move a network.Posts and background work
Posts are scheduled and never publish
Posts are scheduled and never publish
temporal container is healthy (docker compose ps) and that TEMPORAL_ADDRESS points at it. Both the backend and the orchestrator must reach it. Running from source, pnpm run dev-backend starts no orchestrator: use pnpm run dev.Posts that failed to schedule are never picked up
Posts that failed to schedule are never picked up
RUN_CRON is not set, so the recurring recovery workflow never started. Set RUN_CRON=true on one backend. The Helm chart does not set it.A post failed
A post failed
Uploads and email
Uploaded images do not show
Uploaded images do not show
UPLOAD_DIRECTORY must be /uploads and NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY must be uploads. After a domain change, old files keep the old address until you set PREVIOUS_FRONTEND_URLS. See Uploads and storage.Posts with media fail on Instagram, Facebook or Threads
Posts with media fail on Instagram, Facebook or Threads
413 Request Entity Too Large
413 Request Entity Too Large
client_max_body_size 1G; in Nginx. See Nginx.No email arrives
No email arrives
EMAIL_PROVIDER must be exactly resend or nodemailer, with EMAIL_FROM_ADDRESS and EMAIL_FROM_NAME set. Without them nothing is sent and nothing fails. See Email.Platform questions
Can I run it on Vercel or another serverless host?
Can I run it on Vercel or another serverless host?
Can I run more than one container?
Can I run more than one container?
RUN_CRON on one of them only.