Skip to content

Commit b2d95fa

Browse files
committed
minor: optimize project config
1 parent eb7648e commit b2d95fa

File tree

4 files changed

+165
-38
lines changed

4 files changed

+165
-38
lines changed

.cdns.yaml.example

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
ns:
2+
ip: 10.8.10.253
3+
4+
dns:
5+
admin: george.dev
6+
listen: 0.0.0.0:2553
7+
nsname: dev
8+
records:
9+
- ca.svc.dev:
10+
type: A
11+
value: 10.0.88.254
12+
- dns.svc.dev:
13+
type: A
14+
value: 10.0.88.253
15+
protocol: both
16+
17+
http:
18+
tls:
19+
mode: acme # The tls mode support "acme" and "file".
20+
domain: dns.svc.dev
21+
listen: 0.0.0.0:8443
22+
23+
soa:
24+
domain: dev
25+
ingress:
26+
ip: 10.8.10.252
27+
logging:
28+
level: INFO
29+
30+
providers:
31+
acme:
32+
33+
server: https://ca.svc.dev/acme/acme/directory
34+
storage: /Users/George/Develop/Go/src/cdns/certs
35+
file:
36+
tlsKey: /certs/domain.tld.key
37+
tlsCert: /certs/domain.tld.crt

.env.example

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
# General configration
2-
CDNS_ENV=production
2+
CDNS_NS_IP=10.8.10.253
3+
CDNS_SOA_DOMAIN=dev
4+
CDNS_INGRESS_IP=10.8.10.252
35
CDNS_LOGGING_LEVEL=INFO
46

57
# DNS configration
8+
CDNS_DNS_ADMIN=george.dev
9+
CDNS_DNS_NSNAME=dev
610
CDNS_DNS_LISTEN=0.0.0.0:53
711
CDNS_DNS_PROTOCOL=both
812

913
# API configuration
1014
CDNS_HTTP_TLS_MODE=acme
1115
CDNS_HTTP_DOMAIN=cdns.svc.dev
1216
CDNS_HTTP_LISTEN=0.0.0.0:443
13-
CDNS_HTTP_USERNAME=traefik
14-
CDNS_HTTP_PASSWORD=
1517

1618
# TLS ACME provider
1719
CDNS_PROVIDERS_ACME_EMAIL=[email protected]

config/config.go

Lines changed: 118 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package config
22

33
import (
4+
"errors"
45
"github.com/betterde/cdns/internal/journal"
56
"github.com/spf13/viper"
67
"os"
@@ -13,77 +14,76 @@ const TLSModeFile = "file"
1314
var Conf *Config
1415

1516
type Config struct {
16-
NS NS `yaml:"ns"`
17-
SOA SOA `yaml:"soa"`
18-
DNS DNS `yaml:"dns"`
19-
HTTP HTTP `yaml:"http"`
20-
Ingress Ingress `yaml:"ingress"`
21-
Logging Logging `yaml:"logging"`
22-
Providers Providers `yaml:"providers"`
17+
NS NS `yaml:"ns" mapstructure:"NS"`
18+
SOA SOA `yaml:"soa" mapstructure:"SOA"`
19+
DNS DNS `yaml:"dns" mapstructure:"DNS"`
20+
HTTP HTTP `yaml:"http" mapstructure:"HTTP"`
21+
Ingress Ingress `yaml:"ingress" mapstructure:"INGRESS"`
22+
Logging Logging `yaml:"logging" mapstructure:"LOGGING"`
23+
Providers Providers `yaml:"providers" mapstructure:"PROVIDERS"`
2324
}
2425

2526
type NS struct {
26-
IP string `yaml:"ip"`
27+
IP string `yaml:"ip" mapstructure:"IP"`
2728
}
2829

2930
type Logging struct {
30-
Level string `yaml:"level"`
31+
Level string `yaml:"level" mapstructure:"LEVEL"`
3132
}
3233

3334
type DNS struct {
34-
Admin string `yaml:"admin"`
35-
Listen string `yaml:"listen"`
36-
NSName string `yaml:"nsname"`
37-
Records map[string]Record `yaml:"records"`
38-
Protocol string `yaml:"protocol"`
35+
Admin string `yaml:"admin" mapstructure:"ADMIN"`
36+
Listen string `yaml:"listen" mapstructure:"LISTEN"`
37+
NSName string `yaml:"nsname" mapstructure:"NSNAME"`
38+
Records map[string]Record `yaml:"records" mapstructure:"RECORDS"`
39+
Protocol string `yaml:"protocol" mapstructure:"PROTOCOL"`
3940
}
4041

4142
type HTTP struct {
42-
TLS TLS `yaml:"tls"`
43-
Domain string `yaml:"domain"`
44-
Listen string `yaml:"listen"`
45-
Username string `yaml:"username"`
46-
Password string `yaml:"password"`
43+
TLS TLS `yaml:"tls" mapstructure:"TLS"`
44+
Domain string `yaml:"domain" mapstructure:"DOMAIN"`
45+
Listen string `yaml:"listen" mapstructure:"LISTEN"`
4746
}
4847

4948
type Record struct {
50-
Type string `yaml:"type"`
51-
Value string `yaml:"value"`
49+
Type string `yaml:"type" mapstructure:"TYPE"`
50+
Value string `yaml:"value" mapstructure:"VALUE"`
5251
}
5352

5453
type Ingress struct {
55-
IP string `yaml:"ip"`
54+
IP string `yaml:"ip" mapstructure:"IP"`
5655
}
5756

5857
type Providers struct {
59-
ACME ACME `yaml:"acme"`
60-
File File `yaml:"file"`
58+
ACME ACME `yaml:"acme" mapstructure:"ACME"`
59+
File File `yaml:"file" mapstructure:"FILE"`
6160
}
6261

6362
type TLS struct {
64-
Mode string `yaml:"mode"`
63+
Mode string `yaml:"mode" mapstructure:"MODE"`
6564
}
6665

6766
type SOA struct {
68-
Domain string `yaml:"domain"`
67+
Domain string `yaml:"domain" mapstructure:"DOMAIN"`
6968
}
7069

7170
type ACME struct {
72-
Email string `yaml:"email"`
73-
Server string `yaml:"server"`
74-
Storage string `yaml:"storage"`
71+
Email string `yaml:"email" mapstructure:"EMAIL"`
72+
Server string `yaml:"server" mapstructure:"SERVER"`
73+
Storage string `yaml:"storage" mapstructure:"STORAGE"`
7574
}
7675

7776
type File struct {
78-
TLSKey string `yaml:"tlsKey"`
79-
TLSCert string `yaml:"tlsCert"`
77+
TLSKey string `yaml:"tlsKey" mapstructure:"TLSKEY"`
78+
TLSCert string `yaml:"tlsCert" mapstructure:"TLSCERT"`
8079
}
8180

8281
func Parse(file string) {
8382
if file != "" {
8483
viper.SetConfigFile(file)
8584
} else {
8685
viper.AddConfigPath(".")
86+
viper.SetConfigType("yaml")
8787
viper.SetConfigName(".cdns")
8888
viper.AddConfigPath("/etc/cdns")
8989
}
@@ -92,10 +92,94 @@ func Parse(file string) {
9292
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
9393
viper.SetEnvPrefix("CDNS")
9494

95+
var notFoundError viper.ConfigFileNotFoundError
96+
9597
// If a config file is found, read it in.
96-
if err := viper.ReadInConfig(); err != nil {
97-
journal.Logger.Sugar().Errorf("Failed to read configuration file: %s", err)
98-
os.Exit(1)
98+
if err := viper.ReadInConfig(); err != nil && errors.As(err, &notFoundError) {
99+
viper.SetDefault("DNS.LISTEN", "0.0.0.0:53")
100+
viper.SetDefault("DNS.PROTOCOL", "both")
101+
viper.SetDefault("HTTP.LISTEN", "0.0.0.0:443")
102+
viper.SetDefault("LOGGING.LEVEL", "DEBUG")
103+
104+
err = viper.BindEnv("NS.IP", "CDNS_NS_IP")
105+
if err != nil {
106+
journal.Logger.Sugar().Error(err)
107+
}
108+
109+
err = viper.BindEnv("DNS.ADMIN", "CDNS_DNS_ADMIN")
110+
if err != nil {
111+
journal.Logger.Sugar().Error(err)
112+
}
113+
114+
err = viper.BindEnv("DNS.NSNAME", "CDNS_DNS_NSNAME")
115+
if err != nil {
116+
journal.Logger.Sugar().Error(err)
117+
}
118+
119+
err = viper.BindEnv("DNS.LISTEN", "CDNS_DNS_LISTEN")
120+
if err != nil {
121+
journal.Logger.Sugar().Error(err)
122+
}
123+
124+
err = viper.BindEnv("DNS.PROTOCOL", "CDNS_DNS_PROTOCOL")
125+
if err != nil {
126+
journal.Logger.Sugar().Error(err)
127+
}
128+
129+
err = viper.BindEnv("SOA.DOMAIN", "CDNS_SOA_DOMAIN")
130+
if err != nil {
131+
journal.Logger.Sugar().Error(err)
132+
}
133+
134+
err = viper.BindEnv("HTTP.TLS.MODE", "CDNS_HTTP_TLS_MODE")
135+
if err != nil {
136+
journal.Logger.Sugar().Error(err)
137+
}
138+
139+
err = viper.BindEnv("HTTP.DOMAIN", "CDNS_HTTP_DOMAIN")
140+
if err != nil {
141+
journal.Logger.Sugar().Error(err)
142+
}
143+
144+
err = viper.BindEnv("HTTP.LISTEN", "CDNS_HTTP_LISTEN")
145+
if err != nil {
146+
journal.Logger.Sugar().Error(err)
147+
}
148+
149+
err = viper.BindEnv("INGRESS.IP", "CDNS_INGRESS_IP")
150+
if err != nil {
151+
journal.Logger.Sugar().Error(err)
152+
}
153+
154+
err = viper.BindEnv("LOGGING.LEVEL", "CDNS_LOGGING_LEVEL")
155+
if err != nil {
156+
journal.Logger.Sugar().Error(err)
157+
}
158+
159+
err = viper.BindEnv("PROVIDERS.ACME.EMAIL", "CDNS_PROVIDERS_ACME_EMAIL")
160+
if err != nil {
161+
journal.Logger.Sugar().Error(err)
162+
}
163+
164+
err = viper.BindEnv("PROVIDERS.ACME.SERVER", "CDNS_PROVIDERS_ACME_SERVER")
165+
if err != nil {
166+
journal.Logger.Sugar().Error(err)
167+
}
168+
169+
err = viper.BindEnv("PROVIDERS.ACME.STORAGE", "CDNS_PROVIDERS_ACME_STORAGE")
170+
if err != nil {
171+
journal.Logger.Sugar().Error(err)
172+
}
173+
174+
err = viper.BindEnv("PROVIDERS.FILE.TLSKEY", "CDNS_PROVIDERS_FILE_TLSKEY")
175+
if err != nil {
176+
journal.Logger.Sugar().Error(err)
177+
}
178+
179+
err = viper.BindEnv("PROVIDERS.FILE.TLSCERT", "CDNS_PROVIDERS_FILE_TLSCERT")
180+
if err != nil {
181+
journal.Logger.Sugar().Error(err)
182+
}
99183
}
100184

101185
// read in environment variables that match

docker-compose.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,14 @@ services:
4747
- ca.svc.dev:10.0.8.253
4848
environment:
4949
# General configuration
50-
- CDNS_ENV=production
50+
- CDNS_NS_IP=
51+
- CDNS_SOA_DOMAIN=dev
52+
- CDNS_INGRESS_IP=
5153
- CDNS_LOGGING_LEVEL=INFO
5254

5355
# DNS configuration
56+
- CDNS_DNS_ADMIN=
57+
- CDNS_DNS_NSNAME=
5458
- CDNS_DNS_LISTEN=0.0.0.0:53
5559
- CDNS_DNS_PROTOCOL=both
5660

0 commit comments

Comments
 (0)