← Back to Module Index
Module 10 · Technical Setup

Technical Setup

This module is for the person who installs, configures, and maintains ZippCRM. It covers Docker deployment (recommended), environment variables, database management, and common operational tasks.

Who uses thisSystem administrator, DevOps, IT team
StackPython 3.12 · PostgreSQL 16 · Nginx · Docker

Docker Installation (Recommended)

1

Prerequisites

Install Docker Desktop (Mac/Windows) or Docker Engine + Compose plugin (Linux). Verify: docker --version and docker compose version.

2

Copy the ZippCRM deployment package

Place the docker-compose.yml and .env.example files in a clean folder, e.g., /opt/zippcrm/.

3

Create your .env file

cp .env.example .env — then edit .env with a text editor. Fill in DATABASE_URL, ZIPPCRM_LICENSE_KEY, PORTAL_URL, and SMTP settings.

4

Start the stack

docker compose up -d — this starts postgres, backend, and frontend containers. First start takes 2–5 minutes as the database is seeded.

5

Verify it's running

Open http://localhost:3002 in your browser. You should see the ZippCRM login page. API health: http://localhost:8088/health

6

Log in as admin

Default credentials: admin@zippcrm.local / password from your .env ADMIN_PASSWORD variable.

First-time loginAfter first login, immediately change the admin password: go to Admin → Users → click your user → Change Password. The default password in .env is not secure for production.

Critical Environment Variables

VariableRequiredDescription
DATABASE_URLYesFull PostgreSQL connection string. Format: postgresql://user:pass@host:port/dbname
ZIPPCRM_LICENSE_KEYYesYour Enterprise license key. Must match in both .env and docker-compose.yml
PORTAL_URLYesThe public URL clients use to reach the portal. Sets CORS headers and email links
JWT_SECRETYesRandom 64-char string for JWT signing. Generate: openssl rand -hex 32
SMTP_HOST / _PORT / _USERNAME / _PASSWORDFor emailTransactional email configuration. Without this, no emails are sent to clients
SCHEDULER_ENABLEDMulti-pod onlySet true on exactly one instance. Leave unset (defaults to true) for single-server Docker
ANTHROPIC_API_KEYFor AI CopilotEnables Claude-based AI Copilot features in the UI
S3_ENDPOINT / _BUCKET / _ACCESS_KEY / _SECRET_KEYMulti-pod onlyObject storage for documents when running multiple backend replicas

Database Management

Backups

1

Manual backup

docker exec zippcrm-postgres pg_dump -U zippcrm zippcrm > backup_$(date +%Y%m%d).sql

2

Restore from backup

docker exec -i zippcrm-postgres psql -U zippcrm zippcrm < backup_20260428.sql

3

Automated backups

Add a cron job: 0 2 * * * docker exec zippcrm-postgres pg_dump -U zippcrm zippcrm > /backups/zippcrm_$(date +\%Y\%m\%d).sql

Upgrading ZippCRM

1

Pull the new image

docker compose pull

2

Restart with new image

docker compose up -d --build — the backend runs database migrations automatically on startup

3

Verify after upgrade

Check http://localhost:8088/health and log in. If the backend fails to start, check docker compose logs backend for migration errors

Common Operational Tasks

TaskCommand / Location
View backend logsdocker compose logs -f backend
Restart backend onlydocker compose restart backend
Check scheduler statusAdmin → System → Scheduler, or docker compose logs backend | grep scheduler
Reset admin passworddocker exec -it zippcrm-postgres psql -U zippcrm -c "UPDATE users SET password_hash = ... WHERE email='admin@zippcrm.local';" — contact Zippcoin support for the hash utility
Check disk usagedocker system df and du -sh /var/lib/docker/volumes/zippcrm_pgdata
Full stack restartdocker compose down && docker compose up -d

SSL / HTTPS Setup

For production, always use HTTPS. The recommended approach is to put a reverse proxy (nginx or Caddy) in front of ZippCRM and terminate TLS there.

1

Install Caddy (easiest option)

apt install caddy on Ubuntu. Caddy auto-provisions Let's Encrypt certificates.

2

Create /etc/caddy/Caddyfile

Add: zippcrm.yourfirm.com { reverse_proxy localhost:3002 }

3

Restart Caddy

systemctl restart caddy — certificate is provisioned automatically within 60 seconds.

4

Update PORTAL_URL in .env

Change to https://zippcrm.yourfirm.com and restart: docker compose restart backend

Never run ZippCRM on HTTP in productionClient data, invoice PDFs, and regulatory documents travel over the connection. Always use HTTPS before giving clients access to the portal.