Production deployment
For a guided Dokploy installation, use Install Bubllio CRM with Dokploy.
For a guided Dokploy installation, use Install Bubllio CRM with Dokploy.
This runbook deploys Bubllio CRM as three containers: PostgreSQL, the Django API behind Gunicorn, and the React application behind Nginx. Put a TLS-terminating reverse proxy or managed load balancer in front of port 8080. Do not expose the PostgreSQL or Django containers directly to the internet.
First deployment
-
Copy
.env.production.exampleto.env.productionon the server. -
Replace every
CHANGE_MEvalue. Never commit the resulting file. -
Point the public DNS record at the TLS proxy or load balancer.
-
Start the immutable application images:
docker compose --env-file .env.production -f compose.production.yaml up -d --build -
Verify container health and the public readiness endpoint:
docker compose --env-file .env.production -f compose.production.yaml ps curl --fail https://crm.example.com/health/ -
Open the application, complete the supported setup flow, and test an invitation, password reset, and installation SMTP message.
-
Setup locks itself automatically after success. Optionally remove
BUBLLIO_SETUP_TOKENduring a later maintenance deployment as defense in depth; an immediate restart is not required.
The backend entrypoint applies migrations before Gunicorn starts and collects
Django admin static files. The public frontend sends same-origin /api/
requests to Django, so the browser never needs database or API credentials.
TLS and proxy requirements
The outer proxy must terminate HTTPS and overwrite X-Forwarded-Proto with
https. Set DJANGO_TRUST_X_FORWARDED_PROTO=true only while Django remains
reachable exclusively through these trusted proxies. Start HSTS at the example
one-hour value; increase it only after HTTPS operation and every relevant
subdomain have been verified.
Updates
Before updating, complete and verify a database backup. Pull the selected GitHub
release or immutable image, rebuild/start the services, then check /health/
and the critical customer flow. Keep the previous release identifier available
for rollback. A database migration may require a forward-fix rather than an
application-only rollback.
Backups
Store database backups outside the application host or Docker volume, encrypt
them, define retention, and test a restore in an isolated environment. After the
real job succeeds, report it to Bubllio with record_backup_event as described
in Updating and backups. The application export is useful for
portability but is not a database backup.
Remaining provider-specific work
The repository cannot choose or configure the public domain, TLS provider, firewall, off-host backup storage, transactional email account, monitoring vendor, or alert recipients. Record those decisions with the pilot evidence and run the full checklist in Pilot production readiness before onboarding a customer.
Simplicity Rules
Bubllio uses Django REST Framework on the backend and React, TanStack Router, TanStack Query, Axios, Zustand, Material UI, React Hook Form, and Zod on the frontend. These tools already cover the application needs. New ab
Install Bubllio CRM with Dokploy
This guide is written for the person responsible for the company server. It does not require Django, React, or Docker development knowledge.
