up: ## start services docker compose -f docker/docker-compose.yml up -d postgres redis meilisearch languagetool down: ## stop services (data kept) docker compose -f docker/docker-compose.yml down reset-db: ## DESTRUCTIVE: wipe db + search + blobs, re-migrate docker compose -f docker/docker-compose.yml down -v rm -rf var/blobs && mkdir -p var/blobs docker compose -f docker/docker-compose.yml up -d --wait postgres redis meilisearch cd backend && alembic upgrade head api: uvicorn app.main:create_app --factory --reload --port 8000 --app-dir backend worker: ## run both sync + jobs in one process (dev) cd backend && WORKER_ROLE=all python -m workers.run worker-sync: ## run only the account-sync supervisor cd backend && WORKER_ROLE=sync python -m workers.run worker-jobs: ## run only the arq job consumers (interactive + bulk) cd backend && WORKER_ROLE=jobs python -m workers.run web: cd frontend && npm run dev test: cd backend && pytest -q && cd ../frontend && npx vitest run mail-test: ## start throwaway IMAP/SMTP server docker compose -f docker/docker-compose.yml up -d greenmail # --- production (NAS / single-host Docker deploy; see docs/nas-install.md) --- prod-init: ## generate docker/.env.prod + data dirs ./deploy/webmail.sh init prod-up: ## start the production stack ./deploy/webmail.sh up prod-down: ## stop the production stack (data kept) ./deploy/webmail.sh down prod-status: ## what is running, versions, disk, backups ./deploy/webmail.sh status prod-update: ## backup -> migrate -> roll -> health-gate (auto-rollback on failure) ./deploy/webmail.sh update prod-backup: ## take a verified database dump now ./deploy/webmail.sh backup prod-doctor: ## pre-flight checks on a deployment ./deploy/webmail.sh doctor prod-images: ## build production images locally (no push) docker build -f docker/Dockerfile.backend -t webmail/backend:local . docker build -f docker/Dockerfile.frontend -t webmail/web:local .