Installation & configuration
Requirements, install steps, the full environment-variable reference, first-admin setup, and the npm scripts for DNS Panel.
This page gets DNS Panel running: install dependencies, configure the environment, apply the database schema, and create the first admin user.
Requirements
- Node.js 20.9+ (required by Next.js 16)
- PostgreSQL — stores users, passkeys, passwords, zone permissions, and the audit log
- Technitium DNS Server with the web API enabled (default port
5380) - A Technitium API token — create one under Administration → create API token
Install
Install dependencies from the project root:
npm installDerive your environment file from the example, then fill in the values described below:
cp .env.example .envApply the database schema:
npm run db:migrate # apply existing migrations
# or, for a quick local setup:
npm run db:push # push the schema directly to the DBStart the development server:
npm run devThe panel is then available at http://localhost:3000.
Environment variables
| Variable | Required | Description |
|---|---|---|
TECHNITIUM_URL | yes | Base URL of the Technitium server, e.g. http://localhost:5380/ |
TECHNITIUM_TOKEN | yes | Technitium API token |
DATABASE_URL | yes | PostgreSQL connection string |
SETUP_SECRET | yes | Secret that /setup requires to create the first admin |
AUTH_SECRET | yes* | HMAC secret for session and passkey-challenge cookies (openssl rand -base64 48). Identical across all replicas. |
RP_ID | yes | WebAuthn relying-party ID = the exact domain (no scheme, no port) |
NEXTAUTH_URL | yes | Full origin URL of the domain |
RP_NAME | no | Display name shown during passkey registration (default: DNS-Panel) |
DEFAULT_CATALOG | no | Catalog that new zones are added to (otherwise the first existing one) |
SKIP_MIGRATIONS | no | true to skip running migrations on container start |
* AUTH_SECRET is mandatory in production and whenever you run multiple replicas,
otherwise cookies won't validate across instances. Generate a value with:
openssl rand -base64 48RP_ID must equal the exact domain the panel is served on (no scheme, no port), and
NEXTAUTH_URL must be the full origin of that domain. In production this origin must
use https; http is only valid for localhost, because WebAuthn (passkeys) requires
a secure context and will otherwise silently fail. For local development the defaults
are RP_ID=localhost and NEXTAUTH_URL=http://localhost:3000.
Create the first admin
The panel has no seeded account. Create the first admin through the /setup route:
- Open
/setupin the browser. - Enter
SETUP_SECRET, plus the admin email and name. - Log in, then under Settings register a passkey and/or set a password.
See Authentication & permissions for how passkeys, passwords, and roles work after this point.
npm scripts
| Script | Purpose |
|---|---|
npm run dev | Dev server (Turbopack), port 3000 |
npm run build | Production build |
npm run start | Production server, port 3010 |
npm run lint | ESLint over app and lib |
npm test | Unit tests (node test runner) |
npm run db:generate | Generate a migration from the schema |
npm run db:migrate | Apply migrations |
npm run db:push | Push the schema directly to the DB (local) |
npm run db:studio | Drizzle Studio (DB UI) |