Provisioning & Orchestration
Purpose
The provisioner manages the full lifecycle of slices — from creating databases and Docker containers to assigning them to users and destroying them on cancellation. It maintains a warm pool of at least 1 available slice so new users never wait.
Architecture
Provisioning Steps
- Calculate next available port (5001, 5003, 5005…)
- Create PostgreSQL database:
wa_slice_{N} - Apply CRM schema from
/home/ubuntu/whatsapp/deploy/saas/slice-schema.sql - Grant all permissions to
wa_slicedatabase user - Create data directories:
/data/slices/{N}/media/and/data/slices/{N}/session/ - Start Docker container with resource limits, volume mounts, database URL
- Register in
gateway.slicestable (status: available) - Wait for health check (up to 60s, polling every 2s)
Destruction Steps
- Stop Docker container
- Remove Docker container
- Drop PostgreSQL database (
wa_slice_{N}) - Delete data directory (
/data/slices/{N}/) - Unlink user (set
slice_id = NULL) - Delete row from
gateway.slices
Assignment Flow
When a user registers (and billing is disabled or payment confirmed):
- Query for first available slice:
SELECT id FROM gateway.slices WHERE status = 'available' ORDER BY id LIMIT 1 - Update slice:
status = 'assigned', user_id = {userId} - Update user:
slice_id = {sliceId} - If no available slices, user enters “provisioning wait” screen (polls every 3s)
- Monitor loop detects available < 1, auto-provisions a new slice within ~60s
Pool Management
The ensureSlicePool() function runs every monitor cycle (60s):
- Find users with no slice → try to assign available slices
- Count available slices
- If below minimum (1) → provision a new slice
- After provisioning → try to assign any still-waiting users
A provisioning lock prevents concurrent provisioning operations.
API Endpoints
| Endpoint | Method | Auth | Purpose |
|---|---|---|---|
/orchestrator/provision |
POST | Admin key | Manually provision a new slice |
/orchestrator/destroy/:sliceId |
POST | Admin key | Destroy a specific slice |
/orchestrator/status |
GET | Admin key | Overview of all slices + containers + memory |
Handshakes
| Step | Command | Target |
|---|---|---|
| Create DB | sudo -u postgres psql -c "CREATE DATABASE..." |
PostgreSQL |
| Apply schema | sudo -u postgres psql -d {db} -f {schema} |
PostgreSQL |
| Grant perms | sudo -u postgres psql -d {db} -c "GRANT ALL..." |
PostgreSQL |
| Create dirs | sudo mkdir -p /data/slices/{N}/... |
Filesystem |
| Start container | docker run -d --name wank-slice-{N} ... |
Docker |
| Health check | curl http://127.0.0.1:{port}/api/health |
Slice |
Status
Operational. Auto-provisioning maintains warm pool. 2 slices currently assigned, pool management active.