# Dokploy Deployment Guide ## Prerequisites - Dokploy server at 191.101.0.153 (Hostinger KVM2) - Dokploy API key in Bitwarden ("dokploy api key") - Gitea repos created at git.infra.nkode.tech ## Compose File Structure Every app uses `docker-compose.dokploy.yml`: ```yaml services: api: build: context: ./apps/api # or ./api, ./backend dockerfile: Dockerfile restart: unless-stopped ports: - 3001 environment: - DATABASE_URL=${DATABASE_URL} - PORT=3001 - NODE_ENV=production - APP_URL=${APP_URL} - ALLOWED_ORIGINS=${ALLOWED_ORIGINS} - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET} - HAMMER_API_KEY=${HAMMER_API_KEY} command: sh -c 'bun run db:push && bun run src/index.ts' web: build: context: ./apps/web # or ./web, ./frontend dockerfile: Dockerfile restart: unless-stopped ports: - 80 depends_on: - api ``` ## Deployment Steps 1. Push code to Gitea 2. Create compose in Dokploy: - Source type: raw compose with git URL - Set env vars in Dokploy UI 3. Configure domains in Dokploy: - API: `api..donovankelly.xyz` → api service port - Web: `app..donovankelly.xyz` → web service port 4. Enable HTTPS (Dokploy handles Let's Encrypt) 5. Deploy and verify health check ## Domain Pattern - Test: `test-.donovankelly.xyz` - Production: `.donovankelly.xyz` - API: `api..donovankelly.xyz` (or `api.todo.donovankelly.xyz`) - Frontend: `app..donovankelly.xyz` (or `app.todo.donovankelly.xyz`) ## Environment Variables Set in Dokploy compose env (not in docker-compose file): - All `${VAR}` references resolve from Dokploy env settings - Generate secrets with `openssl rand -hex 32` - Store everything in Bitwarden immediately after creating