Skip to content

Commit

Permalink
Merge pull request #196 from innogames/docker_compose_powerdns
Browse files Browse the repository at this point in the history
Add PowerDNS database and nameserver service
  • Loading branch information
kofrezo committed Nov 22, 2021
2 parents a73f788 + ee6af51 commit 8109f75
Show file tree
Hide file tree
Showing 6 changed files with 168 additions and 2 deletions.
11 changes: 11 additions & 0 deletions .docker/pdns-auth/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
FROM powerdns/pdns-auth-46:latest

ARG GPGSQL_HOST
ARG GPGSQL_PORT
ARG GPGSQL_DBNAME
ARG GPGSQL_USER
ARG GPGSQL_PASSWORD

COPY entrypoint.sh ~/

ENTRYPOINT ["~/entrypoint.sh"]
13 changes: 13 additions & 0 deletions .docker/pdns-auth/entrypoint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#!/bin/bash

cat <<EOF > /etc/powerdns/pdns.d/pdns.local.gpgsql.conf
launch+=gpgsql
gpgsql-host=$GPGSQL_HOST
gpgsql-port=$GPGSQL_PORT
gpgsql-dbname=$GPGSQL_DBNAME
gpgsql-password=$GPGSQL_PASSWORD
gpgsql-dnssec=no
EOF

# https://github.com/PowerDNS/pdns/blob/master/Dockerfile-auth#L106
/usr/bin/tini -- /usr/local/sbin/pdns_server-startup
102 changes: 102 additions & 0 deletions .docker/pdns-db/pdns-schema.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
#!/bin/bash

set -e

# See https://docs.powerdns.com/authoritative/backends/generic-postgresql.html
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
CREATE TABLE domains (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(6) NOT NULL,
notified_serial BIGINT DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL,
CONSTRAINT c_lowercase_name CHECK (((name)::TEXT = LOWER((name)::TEXT)))
);
CREATE UNIQUE INDEX name_index ON domains(name);
CREATE TABLE records (
id BIGSERIAL PRIMARY KEY,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(65535) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
disabled BOOL DEFAULT 'f',
ordername VARCHAR(255),
auth BOOL DEFAULT 't',
CONSTRAINT domain_exists
FOREIGN KEY(domain_id) REFERENCES domains(id)
ON DELETE CASCADE,
CONSTRAINT c_lowercase_name CHECK (((name)::TEXT = LOWER((name)::TEXT)))
);
CREATE INDEX rec_name_index ON records(name);
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
CREATE INDEX recordorder ON records (domain_id, ordername text_pattern_ops);
CREATE TABLE supermasters (
ip INET NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) NOT NULL,
PRIMARY KEY(ip, nameserver)
);
CREATE TABLE comments (
id SERIAL PRIMARY KEY,
domain_id INT NOT NULL,
name VARCHAR(255) NOT NULL,
type VARCHAR(10) NOT NULL,
modified_at INT NOT NULL,
account VARCHAR(40) DEFAULT NULL,
comment VARCHAR(65535) NOT NULL,
CONSTRAINT domain_exists
FOREIGN KEY(domain_id) REFERENCES domains(id)
ON DELETE CASCADE,
CONSTRAINT c_lowercase_name CHECK (((name)::TEXT = LOWER((name)::TEXT)))
);
CREATE INDEX comments_domain_id_idx ON comments (domain_id);
CREATE INDEX comments_name_type_idx ON comments (name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);
CREATE TABLE domainmetadata (
id SERIAL PRIMARY KEY,
domain_id INT REFERENCES domains(id) ON DELETE CASCADE,
kind VARCHAR(32),
content TEXT
);
CREATE INDEX domainidmetaindex ON domainmetadata(domain_id);
CREATE TABLE cryptokeys (
id SERIAL PRIMARY KEY,
domain_id INT REFERENCES domains(id) ON DELETE CASCADE,
flags INT NOT NULL,
active BOOL,
published BOOL DEFAULT TRUE,
content TEXT
);
CREATE INDEX domainidindex ON cryptokeys(domain_id);
CREATE TABLE tsigkeys (
id SERIAL PRIMARY KEY,
name VARCHAR(255),
algorithm VARCHAR(50),
secret VARCHAR(255),
CONSTRAINT c_lowercase_name CHECK (((name)::TEXT = LOWER((name)::TEXT)))
);
CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);
EOSQL
3 changes: 3 additions & 0 deletions .docker/pdns-db/postgres.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
log_min_duration_statement = 0
listen_addresses = '0.0.0.0'
log_statement = 'all'
9 changes: 8 additions & 1 deletion .env.dist
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
# db service database settings
POSTGRES_VERSION=14

# db service database settings
POSTGRES_DB=serveradmin
POSTGRES_USER=serveradmin
POSTGRES_PASSWORD=serveradmin
POSTGRES_HOST=db

# PowerDNS db service database settings
POSTGRES_PDNS_DB=pdns
POSTGRES_PDNS_USER=pdns
POSTGRES_PDNS_PASSWORD=pdns
POSTGRES_PDNS_HOST=pdns-db

# Credentials for default super user (requires Django >= 3.x)
DJANGO_SUPERUSER_USERNAME=serveradmin
DJANGO_SUPERUSER_EMAIL=serveradmin@example.com
Expand Down
32 changes: 31 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,34 @@ services:
- "8000:8000"
command: "./run.sh"
depends_on:
- db
- db
- pdns-db

pdns-db:
tty: true
image: "postgres:${POSTGRES_VERSION}"
environment:
- POSTGRES_DB=${POSTGRES_PDNS_DB}
- POSTGRES_USER=${POSTGRES_PDNS_USER}
- POSTGRES_PASSWORD=${POSTGRES_PDNS_PASSWORD}
volumes:
- ".docker/pdns-db/postgres.conf:/etc/postgresql/postgres.conf:ro"
- ".docker/pdns-db/pdns-schema.sh:/docker-entrypoint-initdb.d/pdns-schema.sh:ro"
ports:
- "6432:5432"
command: "-c config_file=/etc/postgresql/postgres.conf"

pdns-auth:
tty: true
build: .docker/pdns-auth
environment:
- GPGSQL_HOST=${POSTGRES_PDNS_HOST}
- GPGSQL_PORT=5432
- GPGSQL_DBNAME=${POSTGRES_PDNS_DB}
- GPGSQL_USER=${POSTGRES_PDNS_USER}
- GPGSQL_PASSWORD=${POSTGRES_PDNS_PASSWORD}
ports:
- "1053:53"
- "1053:53/udp"
depends_on:
- pdns-db

0 comments on commit 8109f75

Please sign in to comment.