Skip to content

Commit 7028fa2

Browse files
authored
Headscale config (#97)
* refactor: headscale config * chore: add contributor
1 parent 8a2e0d1 commit 7028fa2

File tree

2 files changed

+61
-100
lines changed

2 files changed

+61
-100
lines changed

CONTRIBUTORS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ We contributors to Daytona:
1111
* Chad Metcalf (@metcalfc)
1212
* Toma Puljak (@tpuljak)
1313
* Nikola Balic (@nkkko)
14+
* Goran Draganic (@gdraganic)

pkg/server/headscale/config.go

Lines changed: 60 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -5,41 +5,78 @@ package headscale
55

66
import (
77
"fmt"
8+
"io/fs"
9+
"net/netip"
810
"os"
911
"path"
1012
"time"
1113

1214
"github.com/daytonaio/daytona/internal/util"
1315
"github.com/daytonaio/daytona/pkg/server/config"
14-
server_types "github.com/daytonaio/daytona/pkg/types"
15-
"github.com/juanfont/headscale/hscontrol/types"
16+
"github.com/daytonaio/daytona/pkg/types"
17+
hstypes "github.com/juanfont/headscale/hscontrol/types"
1618
"github.com/rs/zerolog"
1719
"github.com/rs/zerolog/log"
18-
"gopkg.in/yaml.v2"
20+
"tailscale.com/tailcfg"
21+
"tailscale.com/types/dnstype"
1922
)
2023

21-
func getConfig(serverConfig *server_types.ServerConfig) (*types.Config, error) {
24+
func getConfig(serverConfig *types.ServerConfig) (*hstypes.Config, error) {
2225
configDir, err := config.GetConfigDir()
2326
if err != nil {
2427
return nil, fmt.Errorf("failed to get config directory: %w", err)
2528
}
2629

27-
err = types.LoadConfig(path.Join(configDir, "headscale", "config.yaml"), true)
28-
if err != nil {
29-
return nil, fmt.Errorf("failed to load headscale configuration: %w", err)
30-
}
31-
32-
cfg, err := types.GetHeadscaleConfig()
33-
if err != nil {
34-
return nil, err
30+
cfg := &hstypes.Config{
31+
DBtype: "sqlite3",
32+
ServerURL: fmt.Sprintf("https://%s.%s", serverConfig.Id, serverConfig.Frps.Domain),
33+
Addr: fmt.Sprintf("127.0.0.1:%d", serverConfig.HeadscalePort),
34+
EphemeralNodeInactivityTimeout: 5 * time.Minute,
35+
NodeUpdateCheckInterval: 10 * time.Second,
36+
BaseDomain: "daytona.local",
37+
DERP: hstypes.DERPConfig{
38+
ServerEnabled: true,
39+
AutomaticallyAddEmbeddedDerpRegion: true,
40+
ServerRegionID: 999,
41+
ServerRegionCode: "local",
42+
ServerRegionName: "Daytona embedded DERP",
43+
Paths: []string{},
44+
ServerPrivateKeyPath: path.Join(configDir, "headscale", "derp_server_private.key"),
45+
UpdateFrequency: 24 * time.Hour,
46+
AutoUpdate: true,
47+
STUNAddr: "0.0.0.0:3478",
48+
},
49+
Log: hstypes.LogConfig{
50+
Format: "text",
51+
},
52+
IPPrefixes: []netip.Prefix{
53+
netip.MustParsePrefix("fd7a:115c:a1e0::/48"),
54+
netip.MustParsePrefix("100.64.0.0/10"),
55+
},
56+
DNSConfig: &tailcfg.DNSConfig{
57+
Proxied: true,
58+
Nameservers: []netip.Addr{
59+
netip.MustParseAddr("127.0.0.11"),
60+
netip.MustParseAddr("1.1.1.1"),
61+
},
62+
Resolvers: []*dnstype.Resolver{
63+
{
64+
Addr: "127.0.0.11",
65+
},
66+
{
67+
Addr: "1.1.1.1",
68+
},
69+
},
70+
},
71+
DBpath: path.Join(configDir, "headscale", "headscale.db"),
72+
UnixSocket: path.Join(configDir, "headscale", "headscale.sock"),
73+
UnixSocketPermission: fs.FileMode.Perm(0700),
74+
NoisePrivateKeyPath: path.Join(configDir, "headscale", "noise_private.key"),
75+
CLI: hstypes.CLIConfig{
76+
Timeout: 10 * time.Second,
77+
},
3578
}
3679

37-
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
38-
log.Logger = log.Output(zerolog.ConsoleWriter{
39-
Out: &util.DebugLogWriter{},
40-
TimeFormat: time.RFC3339,
41-
})
42-
4380
logLevelEnv, logLevelSet := os.LookupEnv("LOG_LEVEL")
4481
if logLevelSet {
4582
cfg.Log.Level, err = zerolog.ParseLevel(logLevelEnv)
@@ -51,16 +88,11 @@ func getConfig(serverConfig *server_types.ServerConfig) (*types.Config, error) {
5188
}
5289

5390
zerolog.SetGlobalLevel(cfg.Log.Level)
54-
55-
cfg.Log.Format = "text"
56-
57-
cfg.ServerURL = fmt.Sprintf("http://127.0.0.1:%d", serverConfig.HeadscalePort)
58-
cfg.Addr = fmt.Sprintf("127.0.0.1:%d", serverConfig.HeadscalePort)
59-
60-
cfg.DBpath = path.Join(configDir, "headscale", "headscale.db")
61-
cfg.UnixSocket = path.Join(configDir, "headscale", "headscale.sock")
62-
cfg.NoisePrivateKeyPath = path.Join(configDir, "headscale", "noise_private.key")
63-
cfg.DERP.ServerPrivateKeyPath = path.Join(configDir, "headscale", "derp_server_private.key")
91+
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
92+
log.Logger = log.Output(zerolog.ConsoleWriter{
93+
Out: &util.DebugLogWriter{},
94+
TimeFormat: time.RFC3339,
95+
})
6496

6597
return cfg, nil
6698
}
@@ -76,76 +108,4 @@ func init() {
76108
log.Error().Err(err).Msg("failed to create headscale directory")
77109
return
78110
}
79-
80-
if _, err := os.Stat(path.Join(c, "headscale", "config.yaml")); os.IsNotExist(err) {
81-
yamlString, err := yaml.Marshal(defaultConfig)
82-
if err != nil {
83-
log.Error().Err(err).Msg("failed to marshal default headscale configuration")
84-
return
85-
}
86-
87-
err = os.WriteFile(path.Join(c, "headscale", "config.yaml"), yamlString, 0600)
88-
if err != nil {
89-
log.Error().Err(err).Msg("failed to write default headscale configuration")
90-
return
91-
}
92-
}
93-
}
94-
95-
var defaultConfig map[string]interface{} = map[string]interface{}{
96-
"acl_policy_path": " ",
97-
"acme_email": " ",
98-
"acme_url": "https://acme-v02.api.letsencrypt.org/directory",
99-
"db_type": "sqlite3",
100-
"derp": map[string]interface{}{
101-
"auto_update_enabled": true,
102-
"paths": []interface{}{},
103-
"server": map[string]interface{}{
104-
"automatically_add_embedded_derp_region": true,
105-
"enabled": true,
106-
"ipv4": "1.2.3.4",
107-
"ipv6": "2001:db8::1",
108-
"region_code": "headscale",
109-
"region_id": 999,
110-
"region_name": "Headscale Embedded DERP",
111-
"stun_listen_addr": "0.0.0.0:3478",
112-
},
113-
"update_frequency": "24h",
114-
"urls": []interface{}{"https://controlplane.tailscale.com/derpmap/default"},
115-
},
116-
"disable_check_updates": false,
117-
"dns_config": map[string]interface{}{
118-
"base_domain": "example.com",
119-
"domains": []interface{}{},
120-
"magic_dns": true,
121-
"nameservers": []interface{}{"1.1.1.1"},
122-
"override_local_dns": true,
123-
},
124-
"ephemeral_node_inactivity_timeout": "5m",
125-
"grpc_allow_insecure": false,
126-
"grpc_listen_addr": "127.0.0.1:50443",
127-
"ip_prefixes": []interface{}{
128-
"fd7a:115c:a1e0::/48",
129-
"100.64.0.0/10",
130-
},
131-
"log": map[string]interface{}{
132-
"format": "text",
133-
"level": "info",
134-
},
135-
"logtail": map[string]interface{}{
136-
"enabled": false,
137-
},
138-
"metrics_listen_addr": "127.0.0.1:9090",
139-
"node_update_check_interval": "10s",
140-
"noise": map[string]interface{}{
141-
"private_key_path": "/",
142-
},
143-
"randomize_client_port": false,
144-
"server_url": "http://127.0.0.1:8000",
145-
"tls_cert_path": "",
146-
"tls_key_path": "",
147-
"tls_letsencrypt_cache_dir": "/var/lib/headscale/cache",
148-
"tls_letsencrypt_challenge_type": "HTTP-01",
149-
"tls_letsencrypt_hostname": "",
150-
"tls_letsencrypt_listen": ":http",
151111
}

0 commit comments

Comments
 (0)