Deployment & operations
Deploying DNS Panel with Docker, Dokploy, or PM2, controlling migrations, and using the audit and DNS query logs.
This page covers running DNS Panel in production: the three supported deployment paths, how database migrations are applied, and the operational logs available to admins.
Docker
A Dockerfile is included. By default, migrations run on container start. To take
control of when migrations run, set SKIP_MIGRATIONS=true and apply them separately:
npm run db:migrateThis is useful when several replicas start at once and you want exactly one of them (or a dedicated job) to run the migration.
Dokploy
For Dokploy, set the environment variables as the application environment so they are
shared across all replicas. Use the internal connection string of the managed Postgres
resource for DATABASE_URL.
Because cookies are signed with AUTH_SECRET, that value must be identical on every
replica — otherwise sessions and passkey challenges won't validate across instances. See
Installation & configuration for the full variable reference.
PM2
PM2 runs the process via ecosystem.config.cjs:
npm run pm2 # start
npm run pm2:restart # restart
npm run pm2:stop # stopThe production server listens on port 3010 (npm run start).
Logs
Two operational logs are available to admins:
- Audit log — records all security-relevant actions in the panel (logins, user and role changes, permission changes, zone/record edits). Stored in PostgreSQL.
- DNS query log — surfaces DNS query activity from Technitium.
Use these to review who changed what and to investigate DNS resolution behavior.