https://postqueen.example.com. Every command is written out. Plan on about thirty minutes, most of it downloads.
What you need
postqueen.example.com with your own name everywhere on this page.
Install
Create the server
203.0.113.42, and the SSH login it gives you.Point the domain at it
postqueen (or @ for the bare domain), value the server’s IP address. Then check from your own computer:Connect and install Docker
root. The last command prints the Compose version, which has to be v2.24 or newer. Every command from here runs on the server.Open only SSH and the web ports
Clone the Compose repository
docker-compose.yaml and the dynamicconfig folder Temporal reads at start.Bind port 4007 to the server itself
docker-compose.yaml, change the postqueen service’s port line:"4007:5000" leaves PostQueen reachable over plain HTTP on port 4007 from anywhere.Write the .env file
/api on the last one and leave off trailing slashes. Do not add NOT_SECURED: the site runs on HTTPS.Pin the image
ghcr.io/gkhankinay/postqueen-app:latest, which moves with every release. Pin a release tag so an upgrade happens when you choose:v. The GitHub Releases page is not kept current, so do not take the version from there. Later, only ever move the tag forward: Backups and upgrades explains why.Start PostQueen
Backend started successfully on port 3000, then press Ctrl+C. Read the lines just after it: the backend checks its settings and prints each problem as a Configuration issue, but keeps running either way. Then check that it answers on the server:HTTP/1.1 200 OK.Add HTTPS
https://postqueen.example.com loads.Nginx and Traefik work too.Create your account, then close sign-up
https://postqueen.example.com and sign up. That first account owns the install.Everyone who should have an account on this install has to sign up now, before you close it. Then add this line to .env:docker restart or
docker compose restart keeps the old container and its old environment.In the folder that holds docker-compose.yaml, recreate only the postqueen service:docker compose down for a settings change: on
a host that runs other Compose services in the same project, it stops them too. On Kubernetes, see
Kubernetes with Helm.Connect channels
Eight networks need no setup: Bluesky, DEV, Hashnode, Lemmy, Listmonk, Nostr and WordPress take a key or login in the connect form, and Moltbook registers an agent. For the others, register a developer app with the network, put its keys in.env, recreate the postqueen container, then open Channels and choose Add Channel. Channel developer apps lists each network’s variables, redirect URI and setup page.
If something is not right
The site does not load
The site does not load
curl -I http://localhost:4007 fails on the server, PostQueen is not up: docker compose logs postqueen says why. If it works but the domain does not, check DNS with dig +short postqueen.example.com and the proxy’s own log.Sign-in fails or does not stick
Sign-in fails or does not stick
FRONTEND_URL has to be exactly the address in the browser, with https:// and no trailing slash. The backend accepts requests only from that address and MAIN_URL. Look for the backend’s warnings:NOT_SECURED=true to work around it on a public server.Connecting a channel fails at the network
Connecting a channel fails at the network
FRONTEND_URL + /integrations/social/ + the network’s name. If FRONTEND_URL changed after you registered the app, update the redirect URI in the network’s console. A missing or wrong key shows up as an error page on the network’s side, not in PostQueen.Containers restart in a loop
Containers restart in a loop
docker stats shows usage, and docker compose logs postqueen shows why it stopped. The stack needs about 4 GB.Everyone was signed out after a restart
Everyone was signed out after a restart
JWT_SECRET changed. Put the old value back, or accept that everyone signs in again. Self-hosting troubleshooting covers what else a changed key breaks.