Plainwire Self-Hosting2.0

Quick start

This path gets a production-shaped Plainwire installation running without enabling Scylla.

1. Prepare a Linux host#

Use a current 64-bit Linux distribution. Debian 13, Ubuntu 24.04 LTS or newer, Fedora Server, and similar maintained distributions are reasonable choices. Give the machine a stable public IP or a reliable DNS endpoint.

Recommended small-instance starting point:

4 vCPU
8 GB RAM
80 GB SSD
1 Gbit/s network where available

A smaller box can run Plainwire, but storage, builds, uploads, and TURN traffic compete for resources quickly.

2. Create DNS#

Point a hostname such as chat.example.com at the server. If you self-host coturn, create turn.example.com too.

3. Install Docker Engine and Compose#

Follow Docker's distribution-specific installation instructions. Verify:

docker version
docker compose version

Do not expose the Docker daemon over an unauthenticated TCP socket.

4. Prepare configuration#

Copy examples/production/plainwire.env.example to a private deployment directory and replace every CHANGE_ME value.

Generate secrets locally:

scripts/generate-secrets.sh

Keep the resulting environment file mode 0600.

5. Start PostgreSQL and Redis#

Use examples/production/compose.yaml as a reference. It deliberately keeps PostgreSQL and Redis off public host ports.

docker compose --env-file plainwire.env up -d db redis

Wait until both are healthy.

6. Run Plainwire#

Set PLAINWIRE_IMAGE to the image you built from the upstream source, then:

docker compose --env-file plainwire.env up -d --no-deps app

Keep these settings for the first boot:

PLAINWIRE_REDIS_ENABLED=true
PLAINWIRE_MESSAGE_BACKEND=postgres
PLAINWIRE_SCYLLA_ENABLED=false

7. Start HTTPS#

The included production Compose stack has a Caddy service and matching Caddyfile. Set PLAINWIRE_HOST to the public hostname, then start it:

docker compose --env-file plainwire.env up -d caddy

If you prefer a host-installed proxy, omit the Caddy service and follow the Caddy or nginx guide instead. Only the reverse proxy should be publicly reachable on the application path.

8. Configure TURN#

Use either coturn or Cloudflare Realtime TURN. A public chat service with calls should set:

PLAINWIRE_REQUIRE_TURN=true

9. Verify#

Check the service locally and through the public origin:

docker compose --env-file plainwire.env exec app curl --fail http://127.0.0.1:8080/api/health
curl --fail https://chat.example.com/api/health
curl --fail https://chat.example.com/api/version

Then use two accounts and two different networks to test messages, uploads, calls, screen sharing, reconnect, and session revocation.

10. Back up before inviting users#

Back up PostgreSQL, the upload directory, and the private environment file. Test a restore into a separate environment before calling the backup plan complete.

Continue with Production launch checklist.

Plainwire Self-Hosting Handbook · verified against Plainwire 2.0.0 · 2026-09-17