diff --git a/docker-compose.yml b/docker-compose.yml index 7cffb186..ec70270c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,279 +1,288 @@ version: '3' services: coturn: build: context: ./docker/coturn/ container_name: kolab-coturn healthcheck: interval: 10s test: "kill -0 $$(cat /tmp/turnserver.pid)" timeout: 5s retries: 30 environment: - TURN_PUBLIC_IP=${COTURN_PUBLIC_IP} - TURN_LISTEN_PORT=3478 - TURN_STATIC_SECRET=${COTURN_STATIC_SECRET} hostname: sturn.mgmt.com image: kolab-coturn network_mode: host restart: on-failure tty: true kolab: build: context: ./docker/kolab/ container_name: kolab privileged: true depends_on: mariadb: condition: service_healthy + pdns: + condition: service_healthy extra_hosts: - "kolab.mgmt.com:127.0.0.1" environment: - LDAP_HOST=127.0.0.1 - LDAP_ADMIN_BIND_DN="cn=Directory Manager" - LDAP_ADMIN_BIND_PW=Welcome2KolabSystems - DB_HOST=mariadb - DB_ROOT_PASSWORD=Welcome2KolabSystems - DB_HKCCP_DATABASE=${DB_DATABASE} - DB_HKCCP_USERNAME=${DB_USERNAME} - DB_HKCCP_PASSWORD=${DB_PASSWORD} - DB_KOLAB_DATABASE=kolab - DB_KOLAB_USERNAME=kolab - DB_KOLAB_PASSWORD=Welcome2KolabSystems - DB_RC_USERNAME=roundcube - DB_RC_PASSWORD=Welcome2KolabSystems - SSL_CERTIFICATE=${KOLAB_SSL_CERTIFICATE:?err} - SSL_CERTIFICATE_FULLCHAIN=${KOLAB_SSL_CERTIFICATE_FULLCHAIN:?err} - SSL_CERTIFICATE_KEY=${KOLAB_SSL_CERTIFICATE_KEY:?err} - IMAP_HOST=127.0.0.1 - IMAP_PORT=11993 - MAIL_HOST=127.0.0.1 - MAIL_PORT=10587 healthcheck: interval: 10s test: test -f /tmp/kolab-init.done timeout: 5s retries: 30 + # This makes docker's dns, resolve via pdns for this container. + # Please note it does not affect /etc/resolv.conf + dns: 172.18.0.11 hostname: kolab.mgmt.com image: kolab networks: - kolab tmpfs: - /run - /tmp - /var/run - /var/tmp tty: true volumes: - ./ext/:/src/:ro - /etc/letsencrypt/:/etc/letsencrypt/:ro - ./docker/certs/ca.cert:/etc/pki/tls/certs/ca.cert:ro - ./docker/certs/ca.cert:/etc/pki/ca-trust/source/anchors/ca.cert:ro - ./docker/certs/kolab.hosted.com.cert:${KOLAB_SSL_CERTIFICATE:?err} - ./docker/certs/kolab.hosted.com.chain.pem:${KOLAB_SSL_CERTIFICATE_FULLCHAIN:?err} - ./docker/certs/kolab.hosted.com.key:${KOLAB_SSL_CERTIFICATE_KEY:?err} - ./docker/kolab/utils:/root/utils:ro - /sys/fs/cgroup:/sys/fs/cgroup:ro - imap:/imapdata - ldap:/ldapdata mariadb: container_name: kolab-mariadb environment: - MARIADB_ROOT_PASSWORD=Welcome2KolabSystems - TZ="+02:00" - DB_HKCCP_DATABASE=${DB_DATABASE} - DB_HKCCP_USERNAME=${DB_USERNAME} - DB_HKCCP_PASSWORD=${DB_PASSWORD} healthcheck: interval: 10s test: test -e /var/run/mysqld/mysqld.sock timeout: 5s retries: 30 image: mariadb:latest networks: - kolab volumes: - ./docker/mariadb/mysql-init/:/docker-entrypoint-initdb.d/ - mariadb:/var/lib/mysql haproxy: build: context: ./docker/haproxy/ healthcheck: interval: 10s test: "kill -0 $$(cat /var/run/haproxy.pid)" timeout: 5s retries: 30 container_name: kolab-haproxy hostname: haproxy.hosted.com image: kolab-haproxy networks: - kolab tmpfs: - /run - /tmp - /var/run - /var/tmp tty: true volumes: - ./docker/certs/:/etc/certs/:ro - /etc/letsencrypt/:/etc/letsencrypt/:ro pdns: build: context: ./docker/pdns/ container_name: kolab-pdns + hostname: pdns depends_on: mariadb: condition: service_healthy healthcheck: interval: 10s test: "systemctl status pdns || exit 1" timeout: 5s retries: 30 - hostname: pdns - image: apheleia/kolab-pdns + image: kolab-pdns networks: - - kolab + kolab: + ipv4_address: 172.18.0.11 tmpfs: - /run - /tmp - /var/run - /var/tmp tty: true volumes: - /sys/fs/cgroup:/sys/fs/cgroup:ro proxy: build: context: ./docker/proxy/ args: APP_WEBSITE_DOMAIN: ${APP_WEBSITE_DOMAIN:?err} SSL_CERTIFICATE: ${PROXY_SSL_CERTIFICATE:?err} SSL_CERTIFICATE_KEY: ${PROXY_SSL_CERTIFICATE_KEY:?err} healthcheck: interval: 10s test: "kill -0 $$(cat /run/nginx.pid)" timeout: 5s retries: 30 container_name: kolab-proxy hostname: ${APP_WEBSITE_DOMAIN:?err} image: kolab-proxy networks: - kolab tmpfs: - /run - /tmp - /var/run - /var/tmp tty: true volumes: - ./docker/certs/:/etc/certs/:ro - /etc/letsencrypt/:/etc/letsencrypt/:ro ports: - "443:443" redis: build: context: ./docker/redis/ healthcheck: interval: 10s test: "redis-cli ping || exit 1" timeout: 5s retries: 30 container_name: kolab-redis hostname: redis image: redis networks: - kolab volumes: - ./docker/redis/redis.conf:/usr/local/etc/redis/redis.conf:ro # ports: # - "6379:6379" swoole: build: context: ./docker/swoole/ container_name: kolab-swoole image: apheleia/swoole:4.8.x webapp: build: context: ./docker/webapp/ container_name: kolab-webapp image: kolab-webapp healthcheck: interval: 10s test: "/src/kolabsrc/artisan octane:status || exit 1" timeout: 5s retries: 30 depends_on: kolab: condition: service_healthy redis: condition: service_healthy networks: - kolab volumes: - ./src:/src/kolabsrc.orig:ro ports: - "8000:8000" tests: build: context: ./docker/tests/ container_name: kolab-tests image: kolab-tests depends_on: kolab: condition: service_healthy networks: - kolab volumes: - ./src:/src/kolabsrc.orig:ro worker: build: context: ./docker/worker/ container_name: kolab-worker depends_on: - kolab hostname: worker image: kolab-worker networks: - kolab tmpfs: - /run - /tmp - /var/run - /var/tmp tty: true volumes: - ./src:/home/worker/src.orig:ro - /sys/fs/cgroup:/sys/fs/cgroup:ro meet: build: context: ./docker/meet/ healthcheck: interval: 10s test: "curl --insecure -H 'X-AUTH-TOKEN: ${MEET_SERVER_TOKEN}' --fail https://localhost:12443/meetmedia/api/health || exit 1" timeout: 5s retries: 30 environment: - WEBRTC_LISTEN_IP=${MEET_WEBRTC_LISTEN_IP:?err} - PUBLIC_DOMAIN=${MEET_PUBLIC_DOMAIN:?err} - LISTENING_HOST=0.0.0.0 - LISTENING_PORT=12443 - TURN_SERVER=${MEET_TURN_SERVER} - TURN_STATIC_SECRET=${COTURN_STATIC_SECRET} - AUTH_TOKEN=${MEET_SERVER_TOKEN:?err} - WEBHOOK_TOKEN=${MEET_WEBHOOK_TOKEN:?err} - WEBHOOK_URL=${APP_PUBLIC_URL:?err}/api/webhooks/meet - SSL_CERT=/etc/pki/tls/certs/meet.${APP_WEBSITE_DOMAIN:?err}.cert - SSL_KEY=/etc/pki/tls/private/meet.${APP_WEBSITE_DOMAIN:?err}.key network_mode: host container_name: kolab-meet image: kolab-meet volumes: - ./meet/server:/src/meet/:ro - ./docker/certs/meet.${APP_WEBSITE_DOMAIN}.cert:/etc/pki/tls/certs/meet.${APP_WEBSITE_DOMAIN}.cert - ./docker/certs/meet.${APP_WEBSITE_DOMAIN}.key:/etc/pki/tls/private/meet.${APP_WEBSITE_DOMAIN}.key networks: kolab: driver: bridge + ipam: + config: + - subnet: "172.18.0.0/24" volumes: mariadb: imap: ldap: diff --git a/docker/mariadb/mysql-init/setup.sh b/docker/mariadb/mysql-init/setup.sh index dd264200..5a89cc8c 100755 --- a/docker/mariadb/mysql-init/setup.sh +++ b/docker/mariadb/mysql-init/setup.sh @@ -1,8 +1,79 @@ #!/bin/bash MYSQL_PWD=$MARIADB_ROOT_PASSWORD mysql --protocol=socket -uroot -hlocalhost --socket="/run/mysqld/mysqld.sock" << EOF CREATE DATABASE IF NOT EXISTS ${DB_HKCCP_DATABASE}; CREATE USER '${DB_HKCCP_USERNAME}'@'%' IDENTIFIED BY '${DB_HKCCP_PASSWORD}'; GRANT ALL PRIVILEGES ON ${DB_HKCCP_DATABASE}.* TO '${DB_HKCCP_USERNAME}'@'%' IDENTIFIED BY '${DB_HKCCP_PASSWORD}'; FLUSH PRIVILEGES; EOF + +# Powerdns setup according to https://github.com/PowerDNS/pdns/blob/master/modules/gmysqlbackend/schema.mysql.sql +# Required for the first boot, afterwards the laravel migration will take over. +# This is only required so pdns can start cleanly, indexes etc are handled by the laravel migration. +MYSQL_PWD=$MARIADB_ROOT_PASSWORD mysql --protocol=socket -uroot -hlocalhost --socket="/run/mysqld/mysqld.sock" ${DB_HKCCP_DATABASE} << EOF +CREATE TABLE powerdns_domains ( + id INT AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + master VARCHAR(128) DEFAULT NULL, + last_check INT DEFAULT NULL, + type VARCHAR(8) NOT NULL, + notified_serial INT UNSIGNED DEFAULT NULL, + account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL, + options VARCHAR(64000) DEFAULT NULL, + catalog VARCHAR(255) DEFAULT NULL, + PRIMARY KEY (id) +) Engine=InnoDB CHARACTER SET 'latin1'; + +CREATE TABLE powerdns_records ( + id BIGINT AUTO_INCREMENT, + domain_id INT DEFAULT NULL, + name VARCHAR(255) DEFAULT NULL, + type VARCHAR(10) DEFAULT NULL, + content VARCHAR(64000) DEFAULT NULL, + ttl INT DEFAULT NULL, + prio INT DEFAULT NULL, + disabled TINYINT(1) DEFAULT 0, + ordername VARCHAR(255) BINARY DEFAULT NULL, + auth TINYINT(1) DEFAULT 1, + PRIMARY KEY (id) +) Engine=InnoDB CHARACTER SET 'latin1'; + +CREATE TABLE powerdns_masters ( + ip VARCHAR(64) NOT NULL, + nameserver VARCHAR(255) NOT NULL, + account VARCHAR(40) CHARACTER SET 'utf8' NOT NULL, + PRIMARY KEY (ip, nameserver) +) Engine=InnoDB CHARACTER SET 'latin1'; + +CREATE TABLE powerdns_comments ( + id INT AUTO_INCREMENT, + domain_id INT NOT NULL, + name VARCHAR(255) NOT NULL, + type VARCHAR(10) NOT NULL, + modified_at INT NOT NULL, + account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL, + comment TEXT CHARACTER SET 'utf8' NOT NULL, + PRIMARY KEY (id) +) Engine=InnoDB CHARACTER SET 'latin1'; + + +CREATE TABLE powerdns_cryptokeys ( + id INT AUTO_INCREMENT, + domain_id INT NOT NULL, + flags INT NOT NULL, + active BOOL, + published BOOL DEFAULT 1, + content TEXT, + PRIMARY KEY(id) +) Engine=InnoDB CHARACTER SET 'latin1'; + + +CREATE TABLE powerdns_tsigkeys ( + id INT AUTO_INCREMENT, + name VARCHAR(255), + algorithm VARCHAR(50), + secret VARCHAR(255), + PRIMARY KEY (id) +) Engine=InnoDB CHARACTER SET 'latin1'; + +EOF diff --git a/docker/pdns/Dockerfile b/docker/pdns/Dockerfile index a4920898..a75296c6 100644 --- a/docker/pdns/Dockerfile +++ b/docker/pdns/Dockerfile @@ -1,37 +1,37 @@ FROM fedora:35 ENV container docker ENV SYSTEMD_PAGER='' RUN dnf -y install \ --setopt 'tsflags=nodocs' \ bind-utils \ - cronie \ iproute \ iptables \ + iputils \ net-tools \ pdns \ pdns-backend-mysql \ pdns-recursor \ pdns-tools \ procps-ng \ vim-enhanced \ wget \ which && \ dnf clean all COPY pdns.conf /etc/pdns/pdns.conf COPY recursor.conf /etc/pdns-recursor/recursor.conf -RUN systemctl enable pdns && systemctl enable pdns-recursor +RUN systemctl disable systemd-resolved && systemctl enable pdns && systemctl enable pdns-recursor # This is how we could run pdns without systemd # ENV PDNS_guardian=yes \ # PDNS_setuid=pdns \ # PDNS_setgid=pdns \ # PDNS_launch=gmysql # CMD ["/usr/sbin/pdns_server", "--guardian=no", "--daemon=no", "--disable-syslog", "--log-timestamp=no", "--write-pid=no"] CMD ["/lib/systemd/systemd", "--system"] -EXPOSE 9953 9953/udp +EXPOSE 53 53/udp diff --git a/docker/pdns/pdns.conf b/docker/pdns/pdns.conf index acf09c42..07ecf0f0 100644 --- a/docker/pdns/pdns.conf +++ b/docker/pdns/pdns.conf @@ -1,69 +1,69 @@ launch=gmysql log-dns-details query-logging=yes -local-address=127.0.0.1:5300, [::1]:5300 +local-address=127.0.0.1:5300 edns-subnet-processing -gmysql-host=127.0.0.1 +gmysql-host=mariadb gmysql-dbname=kolabdev gmysql-password=kolab gmysql-user=kolabdev gmysql-activate-domain-key-query=UPDATE powerdns_cryptokeys SET active=1 WHERE domain_id=(SELECT id FROM domains WHERE name=?) AND powerdns_cryptokeys.id=? gmysql-add-domain-key-query=INSERT INTO powerdns_cryptokeys (domain_id, flags, active, content) SELECT id, ?, ?, ? FROM powerdns_domains WHERE name=? gmysql-any-id-query=SELECT content,ttl,prio,type,domain_id,disabled,name,auth FROM powerdns_records WHERE disabled=0 AND name=? AND domain_id=? gmysql-any-query=SELECT content,ttl,prio,type,domain_id,disabled,name,auth FROM powerdns_records WHERE disabled=0 AND name=? gmysql-basic-query=SELECT content,ttl,prio,type,domain_id,disabled,name,auth FROM powerdns_records WHERE disabled=0 AND type=? AND name=? gmysql-clear-domain-all-keys-query=delete FROM powerdns_cryptokeys WHERE domain_id=(SELECT id FROM powerdns_domains WHERE name=?) gmysql-clear-domain-all-metadata-query=delete FROM powerdns_domain_settings WHERE domain_id=(SELECT id FROM powerdns_domains WHERE name=?) gmysql-clear-domain-metadata-query=delete FROM powerdns_domain_settings WHERE domain_id=(SELECT id FROM powerdns_domains WHERE name=?) AND powerdns_domain_settings.kind=? gmysql-deactivate-domain-key-query=UPDATE powerdns_cryptokeys SET active=0 WHERE domain_id=(SELECT id FROM powerdns_domains WHERE name=?) AND powerdns_cryptokeys.id=? gmysql-delete-comment-rrset-query=DELETE FROM powerdns_comments WHERE domain_id=? AND name=? AND type=? gmysql-delete-comments-query=DELETE FROM powerdns_comments WHERE domain_id=? gmysql-delete-domain-query=delete FROM powerdns_domains WHERE name=? gmysql-delete-empty-non-terminal-query=delete FROM powerdns_records WHERE domain_id=? AND name=? AND type is null gmysql-delete-names-query=delete FROM powerdns_records WHERE domain_id=? AND name=? gmysql-delete-rrset-query=delete FROM powerdns_records WHERE domain_id=? AND name=? AND type=? gmysql-delete-tsig-key-query=delete FROM powerdns_tsigkeys WHERE name=? gmysql-delete-zone-query=delete FROM powerdns_records WHERE domain_id=? gmysql-get-all-domain-metadata-query=SELECT kind,content FROM powerdns_domains, powerdns_domain_settings WHERE powerdns_domain_settings.domain_id=powerdns_domains.id AND name=? gmysql-get-all-domains-query=SELECT powerdns_domains.id, powerdns_domains.name, powerdns_records.content, powerdns_domains.type, powerdns_domains.master, powerdns_domains.notified_serial, powerdns_domains.last_check, powerdns_domains.account FROM powerdns_domains LEFT JOIN powerdns_records ON powerdns_records.domain_id=powerdns_domains.id AND powerdns_records.type='SOA' AND powerdns_records.name=powerdns_domains.name WHERE powerdns_records.disabled=0 OR ? gmysql-get-domain-metadata-query=SELECT content FROM powerdns_domains, powerdns_domain_settings WHERE powerdns_domain_settings.domain_id=powerdns_domains.id AND name=? AND powerdns_domain_settings.kind=? gmysql-get-last-inserted-key-id-query=SELECT LAST_INSERT_ID() gmysql-get-order-after-query=SELECT ordername FROM powerdns_records WHERE ordername > ? AND domain_id=? AND disabled=0 AND ordername IS NOT NULL ORDER BY 1 ASC LIMIT 1 gmysql-get-order-before-query=SELECT ordername, name FROM powerdns_records WHERE ordername <= ? AND domain_id=? AND disabled=0 AND ordername IS NOT NULL ORDER BY 1 desc LIMIT 1 gmysql-get-order-first-query=SELECT ordername FROM powerdns_records WHERE domain_id=? AND disabled=0 AND ordername IS NOT NULL ORDER BY 1 ASC LIMIT 1 gmysql-get-order-last-query=SELECT ordername, name FROM powerdns_records WHERE ordername != '' AND domain_id=? AND disabled=0 AND ordername IS NOT NULL ORDER BY 1 desc LIMIT 1 gmysql-get-tsig-key-query=SELECT algorithm, secret FROM powerdns_tsigkeys WHERE name=? gmysql-get-tsig-keys-query=SELECT name,algorithm, secret FROM powerdns_tsigkeys gmysql-id-query=SELECT content,ttl,prio,type,domain_id,disabled,name,auth FROM powerdns_records WHERE disabled=0 AND type=? AND name=? AND domain_id=? gmysql-info-all-master-query=SELECT d.id, d.name, d.notified_serial, r.content FROM powerdns_records r join powerdns_domains d on r.name=d.name WHERE r.type='SOA' AND r.disabled=0 AND d.type='MASTER' gmysql-info-all-slaves-query=SELECT id,name,master,last_check FROM powerdns_domains WHERE type='SLAVE' gmysql-info-zone-query=SELECT id,name,master,last_check,notified_serial,type,account FROM powerdns_domains WHERE name=? gmysql-insert-comment-query=INSERT INTO powerdns_comments (domain_id, name, type, modified_at, account, comment) VALUES (?, ?, ?, ?, ?, ?) gmysql-insert-empty-non-terminal-order-query=INSERT INTO powerdns_records (type,domain_id,disabled,name,ordername,auth,content,ttl,prio) values (null,?,0,?,?,?,NULL,NULL,NULL) gmysql-insert-record-query=INSERT INTO powerdns_records (content,ttl,prio,type,domain_id,disabled,name,ordername,auth) values (?,?,?,?,?,?,?,?,?) gmysql-insert-zone-query=INSERT INTO powerdns_domains (type,name,master,account,last_check,notified_serial) values(?,?,?,?,NULL,NULL) gmysql-list-comments-query=SELECT domain_id,name,type,modified_at,account,comment FROM powerdns_comments WHERE domain_id=? gmysql-list-domain-keys-query=SELECT powerdns_cryptokeys.id, flags, active, content FROM powerdns_domains, powerdns_cryptokeys WHERE powerdns_cryptokeys.domain_id=powerdns_domains.id AND name=? gmysql-list-query=SELECT content,ttl,prio,type,domain_id,disabled,name,auth FROM powerdns_records WHERE (disabled=0 OR ?) AND domain_id=? ORDER BY name, type gmysql-list-subzone-query=SELECT content,ttl,prio,type,domain_id,disabled,name,auth FROM powerdns_records WHERE disabled=0 AND (name=? OR name like ?) AND domain_id=? gmysql-nullify-ordername-and-update-auth-query=UPDATE powerdns_records SET ordername=NULL,auth=? WHERE domain_id=? AND name=? AND disabled=0 gmysql-nullify-ordername-and-update-auth-type-query=UPDATE powerdns_records SET ordername=NULL,auth=? WHERE domain_id=? AND name=? AND type=? AND disabled=0 gmysql-remove-domain-key-query=delete FROM powerdns_cryptokeys WHERE domain_id=(SELECT id FROM powerdns_domains WHERE name=?) AND powerdns_cryptokeys.id=? gmysql-remove-empty-non-terminals-from-zone-query=delete FROM powerdns_records WHERE domain_id=? AND type is null gmysql-search-comments-query=SELECT domain_id,name,type,modified_at,account,comment FROM powerdns_comments WHERE name LIKE ? OR comment LIKE ? LIMIT ? gmysql-search-records-query=SELECT content,ttl,prio,type,domain_id,disabled,name,auth FROM powerdns_records WHERE name LIKE ? OR content LIKE ? LIMIT ? gmysql-set-domain-metadata-query=INSERT INTO powerdns_domain_settings (domain_id, kind, content) SELECT id, ?, ? FROM powerdns_domains WHERE name=? gmysql-set-tsig-key-query=REPLACE INTO powerdns_tsigkeys (name,algorithm,secret) values(?,?,?) gmysql-supermaster-query=SELECT account FROM powerdns_masters WHERE ip=? AND nameserver=? gmysql-update-account-query=UPDATE powerdns_domains SET account=? WHERE name=? gmysql-update-kind-query=UPDATE powerdns_domains SET type=? WHERE name=? gmysql-update-lastcheck-query=UPDATE powerdns_domains SET last_check=? WHERE id=? gmysql-update-master-query=UPDATE powerdns_domains SET master=? WHERE name=? gmysql-update-ordername-and-auth-query=UPDATE powerdns_records SET ordername=?,auth=? WHERE domain_id=? AND name=? AND disabled=0 gmysql-update-ordername-and-auth-type-query=UPDATE powerdns_records SET ordername=?,auth=? WHERE domain_id=? AND name=? AND type=? AND disabled=0 gmysql-update-serial-query=UPDATE powerdns_domains SET notified_serial=? WHERE id=? diff --git a/docker/pdns/recursor.conf b/docker/pdns/recursor.conf index 8b1f7412..82540227 100644 --- a/docker/pdns/recursor.conf +++ b/docker/pdns/recursor.conf @@ -1,4 +1,6 @@ -local-address=127.0.0.1 -local-port=9953 +local-address=0.0.0.0 +local-port=53 allow-from=0.0.0.0/0 forward-zones=_woat.kolab.org=127.0.0.1:5300 +# Forward everything else to the docker resolver, so we can still resolve other containers when using pdns +forward-zones-recurse=.=127.0.0.11 diff --git a/src/database/migrations/2020_06_04_115409_create_powerdns_tables.php b/src/database/migrations/2020_06_04_115409_create_powerdns_tables.php index 1f40f025..c9860ece 100644 --- a/src/database/migrations/2020_06_04_115409_create_powerdns_tables.php +++ b/src/database/migrations/2020_06_04_115409_create_powerdns_tables.php @@ -1,147 +1,156 @@ bigIncrements('id'); $table->string('name', 255)->unique()->index(); $table->string('master', 128)->nullable(); $table->datetime('last_check')->nullable(); $table->string('type', 6)->default('NATIVE'); $table->integer('notified_serial')->unsigned()->nullable(); $table->string('account', 40)->nullable(); $table->timestamps(); } ); Schema::create( 'powerdns_records', function (Blueprint $table) { $table->bigIncrements('id'); $table->bigInteger('domain_id')->unsigned(); $table->string('name', 255)->nullable(); $table->string('type', 10)->nullable(); $table->longtext('content')->nullable(); $table->integer('ttl')->unsigned()->nullable(); $table->integer('prio')->unsigned()->nullable(); $table->boolean('disabled')->default(false); $table->binary('ordername')->nullable(); $table->boolean('auth')->default(true); $table->timestamps(); $table->foreign('domain_id')->references('id')->on('powerdns_domains') ->onDelete('cascade'); $table->index('domain_id'); $table->index(['name', 'type']); //$table->index('ordername'); } ); Schema::create( 'powerdns_masters', function (Blueprint $table) { $table->string('ip', 64); $table->string('nameserver', 255); $table->string('account', 40); $table->primary(['ip', 'nameserver']); $table->timestamps(); } ); Schema::create( 'powerdns_comments', function (Blueprint $table) { $table->bigIncrements('id'); $table->bigInteger('domain_id')->unsigned(); $table->string('name', 255); $table->string('type', 10); $table->string('account', 40)->nullable(); $table->text('comment'); $table->timestamps(); $table->index(['name', 'type']); $table->index(['domain_id', 'updated_at']); $table->foreign('domain_id')->references('id')->on('powerdns_domains') ->onDelete('cascade'); } ); Schema::create( 'powerdns_domain_settings', function (Blueprint $table) { $table->bigIncrements('id'); $table->bigInteger('domain_id')->unsigned(); $table->string('kind', 32); $table->text('content'); $table->timestamps(); $table->foreign('domain_id')->references('id')->on('powerdns_domains') ->onDelete('cascade'); } ); Schema::create( 'powerdns_cryptokeys', function (Blueprint $table) { $table->bigIncrements('id'); $table->bigInteger('domain_id')->unsigned(); $table->integer('flags'); $table->boolean('active'); $table->text('content'); $table->timestamps(); $table->index('domain_id'); $table->foreign('domain_id')->references('id')->on('powerdns_domains') ->onDelete('cascade'); } ); Schema::create( 'powerdns_tsigkeys', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name', 255); $table->string('algorithm', 50); $table->string('secret', 255); $table->timestamps(); $table->index(['name', 'algorithm']); } ); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('powerdns_tsigkeys'); Schema::dropIfExists('powerdns_cryptokeys'); Schema::dropIfExists('powerdns_domain_settings'); Schema::dropIfExists('powerdns_comments'); Schema::dropIfExists('powerdns_masters'); Schema::dropIfExists('powerdns_records'); Schema::dropIfExists('powerdns_domains'); } }