pocketbase
PocketBase backend for CoreDNS
Name
pocketbase - PocketBase backend for CoreDNS
Description
This plugin uses PocketBase as a backend to store DNS records. These will then can served by CoreDNS. The backend uses a
simple single table data structure that can add and remove records from the DNS server.
Syntax
pocketbase {
[listen LISTEN]
[data_dir DATA_DIR]
[su_email SU_EMAIL]
[su_password SU_PASSWORD]
[default_ttl DEFAULT_TTL]
[cache_capacity CACHE_CAPACITY]
}
listen pocketbase listening http address, default to [::]:8090,
data_dir directory to store pocketbase data, default to pb_data,
su_email superuser login email, can be overwritten by environment variable COREDNS_PB_SUPERUSER_EMAIL, default to su@pocketbase.internal,
su_password superuser password, can be overwritten by environment variable COREDNS_PB_SUPERUSER_PWD, default to pwd@pocketbase.internal,
default_ttl default ttl to use, default to 30,
cache_capacity zone data cache capacity, 0 to disable cache, default to 0.
Features
Supported Record Types
- A
- AAAA
- CNAME
- SOA
- TXT
- NS
- MX
- CAA
- SRV
P.S.wildcard records supported
Cache
Use github.com/dgraph-io/ristretto as in-memory cache handler, handle cache refreshing with PocketBase event subscription mechanism.
Concept
PocketBase
PocketBase use sqlite3 as storage, and comes with a web console.
This plugin with init a super user and dns model in PocketBase, the admin console with look like

Model in PocketBase
type Record struct {
Zone string `db:"zone" json:"zone"` // The DNS zone this record belongs to
Name string `db:"name" json:"name"` // The name of the record (without the zone)
RecordType string `db:"record_type" json:"record_type"` // The type of DNS record (A, AAAA, TXT, etc.)
Ttl uint32 `db:"ttl" json:"ttl"` // Time to live for the record in seconds
Content string `db:"content" json:"content"` // The content of the record in JSON format
}
DNS records
DNS records content stored as JSON.
// ARecord represents an A (IPv4) DNS record
type ARecord struct {
Ip net.IP `json:"ip"` // IPv4 address
}
// AAAARecord represents an AAAA (IPv6) DNS record
type AAAARecord struct {
Ip net.IP `json:"ip"` // IPv6 address
}
// TXTRecord represents a TXT DNS record
type TXTRecord struct {
Text string `json:"text"` // Text content of the record
}
// CNAMERecord represents a CNAME DNS record
type CNAMERecord struct {
Host string `json:"host"` // Target hostname
Zone string `json:"zone"` // Zone of the record
}
// NSRecord represents an NS (Name Server) DNS record
type NSRecord struct {
Host string `json:"host"` // Name server hostname
}
// MXRecord represents an MX (Mail Exchange) DNS record
type MXRecord struct {
Host string `json:"host"` // Mail server hostname
Preference uint16 `json:"preference"` // Priority of the mail server
}
// SRVRecord represents an SRV (Service) DNS record
type SRVRecord struct {
Priority uint16 `json:"priority"` // Priority of the service
Weight uint16 `json:"weight"` // Weight for load balancing
Port uint16 `json:"port"` // Port number of the service
Target string `json:"target"` // Target hostname
}
// SOARecord represents an SOA (Start of Authority) DNS record
type SOARecord struct {
Ns string `json:"ns"` // Primary name server
MBox string `json:"mbox"` // Email address of the administrator
Refresh uint32 `json:"refresh"` // Refresh interval in seconds
Retry uint32 `json:"retry"` // Retry interval in seconds
Expire uint32 `json:"expire"` // Expiration time in seconds
MinTtl uint32 `json:"minttl"` // Minimum TTL in seconds
}
// CAARecord represents a CAA (Certification Authority Authorization) DNS record
type CAARecord struct {
Flag uint8 `json:"flag"` // Critical flag
Tag string `json:"tag"` // Property identifier
Value string `json:"value"` // Property value
}
Setup (as an external plugin)
Add this as an external plugin in plugin.cfg file from CoreDNS repo
pocketbase:github.com/tinkernels/coredns-pocketbase
P.S.place pocketbase above cache plugin is recommended.
Then run
$ go generate
$ go build
Add any required modules to CoreDNS code as prompted.
Credits
Inspired by