Skip to content

Commit acdeb1f

Browse files
committed
remove gw from k8s manifest, add agent fix ctrl vault for certs
1 parent 3f16ac9 commit acdeb1f

File tree

10 files changed

+215
-207
lines changed

10 files changed

+215
-207
lines changed

deployment/docker-compose.yaml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,11 +273,17 @@ services:
273273
UNKEY_CLICKHOUSE_URL: "clickhouse://default:password@clickhouse:9000?secure=false&skip_verify=true"
274274
UNKEY_REDIS_URL: "redis://redis:6379"
275275

276+
# Vault - General secrets (env vars, API keys)
276277
UNKEY_VAULT_S3_URL: "http://s3:3902"
277-
UNKEY_VAULT_S3_BUCKET: "acme-vault"
278+
UNKEY_VAULT_S3_BUCKET: "vault"
278279
UNKEY_VAULT_S3_ACCESS_KEY_ID: "minio_root_user"
279280
UNKEY_VAULT_S3_ACCESS_KEY_SECRET: "minio_root_password"
280281
UNKEY_VAULT_MASTER_KEYS: "Ch9rZWtfMmdqMFBJdVhac1NSa0ZhNE5mOWlLSnBHenFPENTt7an5MRogENt9Si6wms4pQ2XIvqNSIgNpaBenJmXgcInhu6Nfv2U="
282+
# ACME Vault - Let's Encrypt certificates
283+
UNKEY_ACME_VAULT_S3_URL: "http://s3:3902"
284+
UNKEY_ACME_VAULT_S3_BUCKET: "acme-vault"
285+
UNKEY_ACME_VAULT_S3_ACCESS_KEY_ID: "minio_root_user"
286+
UNKEY_ACME_VAULT_S3_ACCESS_KEY_SECRET: "minio_root_password"
281287

282288
krane:
283289
build:
@@ -367,11 +373,17 @@ services:
367373
UNKEY_RESTATE_HTTP_PORT: "9080"
368374
UNKEY_RESTATE_REGISTER_AS: "http://ctrl:9080"
369375

376+
# Vault - General secrets (env vars, API keys)
370377
UNKEY_VAULT_S3_URL: "http://s3:3902"
371-
UNKEY_VAULT_S3_BUCKET: "acme-vault"
378+
UNKEY_VAULT_S3_BUCKET: "vault"
372379
UNKEY_VAULT_S3_ACCESS_KEY_ID: "minio_root_user"
373380
UNKEY_VAULT_S3_ACCESS_KEY_SECRET: "minio_root_password"
374381
UNKEY_VAULT_MASTER_KEYS: "Ch9rZWtfMmdqMFBJdVhac1NSa0ZhNE5mOWlLSnBHenFPENTt7an5MRogENt9Si6wms4pQ2XIvqNSIgNpaBenJmXgcInhu6Nfv2U="
382+
# ACME Vault - Let's Encrypt certificates
383+
UNKEY_ACME_VAULT_S3_URL: "http://s3:3902"
384+
UNKEY_ACME_VAULT_S3_BUCKET: "acme-vault"
385+
UNKEY_ACME_VAULT_S3_ACCESS_KEY_ID: "minio_root_user"
386+
UNKEY_ACME_VAULT_S3_ACCESS_KEY_SECRET: "minio_root_password"
375387

376388
# Build configuration
377389
UNKEY_BUILD_S3_URL: "${UNKEY_BUILD_S3_URL:-http://s3:3902}"

go/Tiltfile

Lines changed: 32 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ start_observability = 'all' in services or 'observability' in services
2626
start_planetscale = 'all' in services or 'planetscale' in services
2727
start_restate = 'all' in services or 'restate' in services
2828
start_api = 'all' in services or 'api' in services
29-
start_gw = 'all' in services or 'gateway' in services or 'gw' in services
3029
start_ctrl = 'all' in services or 'ctrl' in services
3130
start_krane = 'all' in services or 'krane' in services
3231
start_dashboard = 'all' in services or 'dashboard' in services
32+
start_agent = 'all' in services or 'agent' in services
3333

3434
# Apply RBAC
3535
k8s_yaml('k8s/manifests/rbac.yaml')
@@ -95,7 +95,7 @@ if start_s3:
9595
k8s_yaml('k8s/manifests/s3.yaml')
9696
k8s_resource(
9797
's3',
98-
port_forwards=['9000:9000', '9001:9001'],
98+
port_forwards=['3902:3902', '3903:3903'],
9999
resource_deps=[],
100100
labels=['storage']
101101
)
@@ -141,7 +141,7 @@ if start_observability:
141141
)
142142

143143
# Build Unkey binary locally (independent of infrastructure)
144-
if start_api or start_gw or start_ctrl or start_krane:
144+
if start_api or start_ctrl or start_krane:
145145
print("Building Unkey binary...")
146146
# Build locally first for faster updates
147147
local_resource(
@@ -187,39 +187,6 @@ if start_api:
187187
trigger_mode=TRIGGER_MODE_MANUAL if debug_mode else TRIGGER_MODE_AUTO
188188
)
189189

190-
# Gateway service (1 replica)
191-
if start_gw:
192-
print("Setting up Gateway service...")
193-
194-
docker_build_with_restart(
195-
'unkey-gw:latest',
196-
'.',
197-
dockerfile='Dockerfile.tilt',
198-
entrypoint=['/unkey', 'run', 'gw'],
199-
only=['./bin'],
200-
live_update=[
201-
sync('./bin/unkey', '/unkey'),
202-
],
203-
ignore=['./cmd/api', './cmd/ctrl', './apps/api', './apps/ctrl']
204-
)
205-
206-
k8s_yaml('k8s/manifests/gw.yaml')
207-
208-
# Build dependency list
209-
gw_deps = []
210-
if start_mysql: gw_deps.append('mysql')
211-
# Add compilation dependency for Unkey services
212-
gw_deps.append('unkey-compile')
213-
214-
k8s_resource(
215-
'gw',
216-
port_forwards=['8080:8080', '8443:8443'],
217-
resource_deps=gw_deps,
218-
labels=['unkey'],
219-
auto_init=True,
220-
trigger_mode=TRIGGER_MODE_MANUAL if debug_mode else TRIGGER_MODE_AUTO
221-
)
222-
223190
# Ctrl service (1 replica)
224191
if start_ctrl:
225192
print("Setting up Ctrl service...")
@@ -287,6 +254,30 @@ if start_krane:
287254
trigger_mode=TRIGGER_MODE_AUTO
288255
)
289256

257+
# Agent service
258+
if start_agent:
259+
print("Setting up Agent service...")
260+
docker_build(
261+
'unkey-agent:latest',
262+
'../apps/agent',
263+
dockerfile='../apps/agent/Dockerfile',
264+
)
265+
k8s_yaml('k8s/manifests/agent.yaml')
266+
267+
# Build dependency list
268+
agent_deps = []
269+
if start_s3: agent_deps.append('s3')
270+
if start_clickhouse: agent_deps.append('clickhouse')
271+
272+
k8s_resource(
273+
'agent',
274+
port_forwards='8082:8080',
275+
resource_deps=agent_deps,
276+
labels=['unkey'],
277+
auto_init=True,
278+
trigger_mode=TRIGGER_MODE_AUTO
279+
)
280+
290281
# Dashboard service
291282
if start_dashboard:
292283
print("Setting up Dashboard service...")
@@ -306,6 +297,7 @@ if start_dashboard:
306297
dashboard_deps = []
307298
if start_planetscale: dashboard_deps.append('planetscale')
308299
if start_clickhouse: dashboard_deps.append('clickhouse')
300+
if start_agent: dashboard_deps.append('agent')
309301

310302
k8s_resource(
311303
'dashboard',
@@ -326,9 +318,9 @@ if start_planetscale: active_services.append('planetscale')
326318
if start_observability: active_services.extend(['prometheus', 'otel-collector'])
327319
if start_restate: active_services.append('restate')
328320
if start_api: active_services.append('api')
329-
if start_gw: active_services.append('gw')
330321
if start_ctrl: active_services.append('ctrl')
331322
if start_dashboard: active_services.append('dashboard')
323+
if start_agent: active_services.append('agent')
332324

333325
print("""
334326
Tilt is ready!
@@ -340,13 +332,14 @@ Web UI: http://localhost:10350
340332
Services available via Tilt port forwards:
341333
Dashboard: http://localhost:3000
342334
API: http://localhost:7070
343-
Gateway: http://localhost:8080
344335
Ctrl: http://localhost:7091
345336
Krane: http://localhost:8090
337+
Agent: http://localhost:8082
346338
Restate Ingress: http://localhost:8081
347339
Restate Admin: http://localhost:9070
348340
Prometheus: http://localhost:9090
349-
S3 Console: http://localhost:9000
341+
S3 API: http://localhost:3902
342+
S3 Console: http://localhost:3903
350343
ClickHouse: http://localhost:8123
351344
352345
Tips:

go/apps/ctrl/config.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,12 @@ type Config struct {
125125
Clock clock.Clock
126126

127127
// --- Vault Configuration ---
128+
// VaultMasterKeys are the master encryption keys for both vaults
128129
VaultMasterKeys []string
129-
VaultS3 S3Config
130+
// VaultS3 is used for general secrets (env vars, API keys, etc.)
131+
VaultS3 S3Config
132+
// AcmeVaultS3 is used specifically for ACME/Let's Encrypt certificate storage
133+
AcmeVaultS3 S3Config
130134

131135
// --- ACME/Cloudflare Configuration ---
132136
Acme AcmeConfig

go/apps/ctrl/run.go

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,18 +82,18 @@ func Run(ctx context.Context, cfg Config) error {
8282
logger.Info("TLS is enabled, server will use HTTPS")
8383
}
8484

85+
// Create vault service for general secrets (env vars, API keys, etc.)
8586
var vaultSvc *vault.Service
86-
if len(cfg.VaultMasterKeys) > 0 {
87-
var vaultStorage storage.Storage
88-
vaultStorage, err = storage.NewS3(storage.S3Config{
87+
if len(cfg.VaultMasterKeys) > 0 && cfg.VaultS3.URL != "" {
88+
vaultStorage, vaultStorageErr := storage.NewS3(storage.S3Config{
8989
Logger: logger,
9090
S3URL: cfg.VaultS3.URL,
9191
S3Bucket: cfg.VaultS3.Bucket,
9292
S3AccessKeyID: cfg.VaultS3.AccessKeyID,
9393
S3AccessKeySecret: cfg.VaultS3.AccessKeySecret,
9494
})
95-
if err != nil {
96-
return fmt.Errorf("unable to create vault storage: %w", err)
95+
if vaultStorageErr != nil {
96+
return fmt.Errorf("unable to create vault storage: %w", vaultStorageErr)
9797
}
9898

9999
vaultSvc, err = vault.New(vault.Config{
@@ -104,6 +104,32 @@ func Run(ctx context.Context, cfg Config) error {
104104
if err != nil {
105105
return fmt.Errorf("unable to create vault service: %w", err)
106106
}
107+
logger.Info("Vault service initialized", "bucket", cfg.VaultS3.Bucket)
108+
}
109+
110+
// Create separate vault service for ACME certificates
111+
var acmeVaultSvc *vault.Service
112+
if len(cfg.VaultMasterKeys) > 0 && cfg.AcmeVaultS3.URL != "" {
113+
acmeVaultStorage, acmeStorageErr := storage.NewS3(storage.S3Config{
114+
Logger: logger,
115+
S3URL: cfg.AcmeVaultS3.URL,
116+
S3Bucket: cfg.AcmeVaultS3.Bucket,
117+
S3AccessKeyID: cfg.AcmeVaultS3.AccessKeyID,
118+
S3AccessKeySecret: cfg.AcmeVaultS3.AccessKeySecret,
119+
})
120+
if acmeStorageErr != nil {
121+
return fmt.Errorf("unable to create ACME vault storage: %w", acmeStorageErr)
122+
}
123+
124+
acmeVaultSvc, err = vault.New(vault.Config{
125+
Logger: logger,
126+
Storage: acmeVaultStorage,
127+
MasterKeys: cfg.VaultMasterKeys,
128+
})
129+
if err != nil {
130+
return fmt.Errorf("unable to create ACME vault service: %w", err)
131+
}
132+
logger.Info("ACME vault service initialized", "bucket", cfg.AcmeVaultS3.Bucket)
107133
}
108134

109135
// Initialize database
@@ -247,7 +273,7 @@ func Run(ctx context.Context, cfg Config) error {
247273
restateSrv.Bind(hydrav1.NewCertificateServiceServer(certificate.New(certificate.Config{
248274
Logger: logger,
249275
DB: database,
250-
Vault: vaultSvc,
276+
Vault: acmeVaultSvc,
251277
})))
252278
restateSrv.Bind(hydrav1.NewProjectServiceServer(projectWorkflow.New(projectWorkflow.Config{
253279
Logger: logger,

go/cmd/ctrl/main.go

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,27 @@ var Cmd = &cli.Command{
6060
cli.String("spiffe-socket-path", "Path to SPIFFE agent socket for mTLS authentication. Default: /var/lib/spire/agent/agent.sock",
6161
cli.Default("/var/lib/spire/agent/agent.sock"), cli.EnvVar("UNKEY_SPIFFE_SOCKET_PATH")),
6262

63-
// Vault Configuration
64-
cli.StringSlice("vault-master-keys", "Vault master keys for encryption",
63+
// Vault Configuration - General secrets (env vars, API keys)
64+
cli.StringSlice("vault-master-keys", "Vault master keys for encryption (shared by both vaults)",
6565
cli.Required(), cli.EnvVar("UNKEY_VAULT_MASTER_KEYS")),
66-
cli.String("vault-s3-url", "S3 Compatible Endpoint URL",
67-
cli.Required(), cli.EnvVar("UNKEY_VAULT_S3_URL")),
68-
cli.String("vault-s3-bucket", "S3 bucket name",
69-
cli.Required(), cli.EnvVar("UNKEY_VAULT_S3_BUCKET")),
70-
cli.String("vault-s3-access-key-id", "S3 access key ID",
71-
cli.Required(), cli.EnvVar("UNKEY_VAULT_S3_ACCESS_KEY_ID")),
72-
cli.String("vault-s3-access-key-secret", "S3 secret access key",
73-
cli.Required(), cli.EnvVar("UNKEY_VAULT_S3_ACCESS_KEY_SECRET")),
66+
cli.String("vault-s3-url", "S3 endpoint URL for general vault",
67+
cli.EnvVar("UNKEY_VAULT_S3_URL")),
68+
cli.String("vault-s3-bucket", "S3 bucket for general vault (env vars, API keys)",
69+
cli.EnvVar("UNKEY_VAULT_S3_BUCKET")),
70+
cli.String("vault-s3-access-key-id", "S3 access key ID for general vault",
71+
cli.EnvVar("UNKEY_VAULT_S3_ACCESS_KEY_ID")),
72+
cli.String("vault-s3-access-key-secret", "S3 secret access key for general vault",
73+
cli.EnvVar("UNKEY_VAULT_S3_ACCESS_KEY_SECRET")),
74+
75+
// ACME Vault Configuration - Let's Encrypt certificates
76+
cli.String("acme-vault-s3-url", "S3 endpoint URL for ACME vault",
77+
cli.EnvVar("UNKEY_ACME_VAULT_S3_URL")),
78+
cli.String("acme-vault-s3-bucket", "S3 bucket for ACME vault (Let's Encrypt certs)",
79+
cli.EnvVar("UNKEY_ACME_VAULT_S3_BUCKET")),
80+
cli.String("acme-vault-s3-access-key-id", "S3 access key ID for ACME vault",
81+
cli.EnvVar("UNKEY_ACME_VAULT_S3_ACCESS_KEY_ID")),
82+
cli.String("acme-vault-s3-access-key-secret", "S3 secret access key for ACME vault",
83+
cli.EnvVar("UNKEY_ACME_VAULT_S3_ACCESS_KEY_SECRET")),
7484

7585
// Build Configuration
7686
cli.String("build-backend", "Build backend to use: 'docker' for local, 'depot' for production. Default: depot",
@@ -167,14 +177,20 @@ func action(ctx context.Context, cmd *cli.Command) error {
167177
APIKey: cmd.String("api-key"),
168178
SPIFFESocketPath: cmd.String("spiffe-socket-path"),
169179

170-
// Vault configuration
180+
// Vault configuration - General secrets
171181
VaultMasterKeys: cmd.StringSlice("vault-master-keys"),
172182
VaultS3: ctrl.S3Config{
173-
ExternalURL: cmd.String(""),
174183
URL: cmd.String("vault-s3-url"),
175184
Bucket: cmd.String("vault-s3-bucket"),
176-
AccessKeySecret: cmd.String("vault-s3-access-key-secret"),
177185
AccessKeyID: cmd.String("vault-s3-access-key-id"),
186+
AccessKeySecret: cmd.String("vault-s3-access-key-secret"),
187+
},
188+
// ACME Vault configuration - Let's Encrypt certificates
189+
AcmeVaultS3: ctrl.S3Config{
190+
URL: cmd.String("acme-vault-s3-url"),
191+
Bucket: cmd.String("acme-vault-s3-bucket"),
192+
AccessKeyID: cmd.String("acme-vault-s3-access-key-id"),
193+
AccessKeySecret: cmd.String("acme-vault-s3-access-key-secret"),
178194
},
179195

180196
// Build configuration

go/k8s/manifests/agent.yaml

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
---
2+
apiVersion: apps/v1
3+
kind: Deployment
4+
metadata:
5+
name: agent
6+
namespace: unkey
7+
labels:
8+
app: agent
9+
spec:
10+
replicas: 1
11+
selector:
12+
matchLabels:
13+
app: agent
14+
template:
15+
metadata:
16+
labels:
17+
app: agent
18+
spec:
19+
containers:
20+
- name: agent
21+
image: unkey-agent:latest
22+
imagePullPolicy: Never
23+
ports:
24+
- containerPort: 8080
25+
- containerPort: 9095
26+
env:
27+
- name: PORT
28+
value: "8080"
29+
- name: RPC_PORT
30+
value: "9095"
31+
- name: AUTH_TOKEN
32+
value: "agent-auth-secret"
33+
- name: VAULT_S3_URL
34+
value: "http://s3:3902"
35+
- name: VAULT_S3_BUCKET
36+
value: "vault"
37+
- name: VAULT_S3_ACCESS_KEY_ID
38+
value: "minio_root_user"
39+
- name: VAULT_S3_ACCESS_KEY_SECRET
40+
value: "minio_root_password"
41+
- name: VAULT_MASTER_KEYS
42+
value: "Ch9rZWtfMmdqMFBJdVhac1NSa0ZhNE5mOWlLSnBHenFPENTt7an5MRogENt9Si6wms4pQ2XIvqNSIgNpaBenJmXgcInhu6Nfv2U="
43+
- name: CLICKHOUSE_URL
44+
value: "clickhouse://default:password@clickhouse:9000"
45+
command: ["/usr/local/bin/unkey", "agent", "--config", "config.docker.json"]
46+
initContainers:
47+
- name: wait-for-dependencies
48+
image: busybox:1.36
49+
command:
50+
[
51+
"sh",
52+
"-c",
53+
"until nc -z s3 3902 && nc -z clickhouse 9000; do echo waiting for dependencies; sleep 2; done;",
54+
]
55+
56+
---
57+
apiVersion: v1
58+
kind: Service
59+
metadata:
60+
name: agent
61+
namespace: unkey
62+
labels:
63+
app: agent
64+
spec:
65+
selector:
66+
app: agent
67+
ports:
68+
- name: http
69+
port: 8080
70+
targetPort: 8080
71+
protocol: TCP
72+
- name: rpc
73+
port: 9095
74+
targetPort: 9095
75+
protocol: TCP
76+
type: ClusterIP

0 commit comments

Comments
 (0)