Self-hosting with Docker
Wazzly is yours to run. No monthly seat fees, no vendor lock-in — pay once, host it on your own box, and keep replying forever.
This guide walks you through a Docker-based deployment. The commands below are illustrative placeholders — swap in your own values, image tags, and paths before running anything in production.
What you’ll need
Before you start, make sure you have:
- A Linux VPS — any modern distro (Ubuntu 22.04+ or Debian 12+ works well). 2 vCPU and 2 GB of RAM is a comfortable starting point.
- Docker + Docker Compose — the engine plus the
composeplugin, recent versions. - A domain — something like
crm.yourcompany.com, with DNS you can point at the server. - A Postgres database — either the bundled container from the compose file, or a managed Postgres you already trust.
Under the hood, Wazzly is a FastAPI backend (the API, webhooks, and worker) talking to a Next.js frontend (the inbox and admin UI). Docker Compose wires them together with Postgres.
1. Clone the source
You own the source, so grab it and check out the version you want to run.
# Placeholder — use your own repo URL / release tag
git clone https://github.com/your-org/wazzly.git
cd wazzly
git checkout v1.0.0
2. Configure your .env
Copy the example file and fill in your own secrets. At minimum you’ll set the database URL, your Meta WhatsApp API tokens, and the app secret used to sign sessions.
cp .env.example .env
# .env — placeholder values, replace every one of these
# Database
DATABASE_URL=postgresql://wazzly:change-me@db:5432/wazzly
# Meta WhatsApp Cloud API
WHATSAPP_PHONE_NUMBER_ID=000000000000000
WHATSAPP_BUSINESS_ACCOUNT_ID=000000000000000
WHATSAPP_ACCESS_TOKEN=EAAG...replace-me
WHATSAPP_WEBHOOK_VERIFY_TOKEN=pick-a-long-random-string
# App
APP_SECRET=generate-a-long-random-secret
APP_BASE_URL=https://crm.yourcompany.com
Keep .env out of version control — it holds live credentials.
3. Bring it up
Build the images and start the stack in the background.
# Placeholder — your compose file may name services differently
docker compose up -d --build
Check that the backend, frontend, and database are all healthy:
docker compose ps
docker compose logs -f backend
4. Run the migrations
The first time you start (and after upgrades), apply the database schema. The FastAPI backend ships migrations you run from inside its container.
# Placeholder — run migrations against your Postgres
docker compose exec backend alembic upgrade head
5. Point your domain and add TLS
Aim your DNS A record at the server’s IP, then put the app behind a reverse proxy that terminates TLS. Caddy or Nginx both work — here’s a placeholder Caddy snippet that handles certificates automatically:
# Caddyfile — placeholder
crm.yourcompany.com {
reverse_proxy frontend:3000
}
api.yourcompany.com {
reverse_proxy backend:8000
}
Reload the proxy, then open https://crm.yourcompany.com and sign in.
You’re live
That’s it — your own Wazzly instance, running on your own hardware, under your own domain. White-label it, extend the source, and never pay a per-seat bill again.
These steps are intentionally generic. Treat the commands as a starting template and adapt the service names, ports, and secrets to your setup.