coredns_pocketbase

package module
v1.0.0-beta.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 10, 2025 License: Apache-2.0 Imports: 6 Imported by: 0

README

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

PocketBase admin console

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

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
cmd
Package handler provides configuration management for the CoreDNS PocketBase integration.
Package handler provides configuration management for the CoreDNS PocketBase integration.
pocketbase/cache
Package cache provides caching functionality for DNS records and zones.
Package cache provides caching functionality for DNS records and zones.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL