feat: load service URLs from ConfigMap, not hardcoded
This commit is contained in:
@@ -0,0 +1,93 @@
|
|||||||
|
/// Configuration management for inter-pod URLs via environment variables (ConfigMap)
|
||||||
|
/// All service URLs come from K8s ConfigMap, never hardcoded
|
||||||
|
///
|
||||||
|
/// ConfigMap in K8s:
|
||||||
|
/// ```yaml
|
||||||
|
/// apiVersion: v1
|
||||||
|
/// kind: ConfigMap
|
||||||
|
/// metadata:
|
||||||
|
/// name: memory-service-config
|
||||||
|
/// namespace: poimen
|
||||||
|
/// data:
|
||||||
|
/// MEMORY_SERVICE_ADDR: "http://memory-service.poimen.svc.cluster.local:8080"
|
||||||
|
/// AUTHENTIK_ISSUER: "http://authentik.iam.svc.cluster.local/application/o/poimen-memory/"
|
||||||
|
/// WEBHOOK_URL: "http://temporal-webhook.temporal.svc.cluster.local:9000/webhook"
|
||||||
|
/// ```
|
||||||
|
|
||||||
|
use anyhow::{anyhow, Result};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct ServiceConfig {
|
||||||
|
/// Memory service address (this service itself)
|
||||||
|
pub memory_service_addr: String,
|
||||||
|
|
||||||
|
/// Authentik OIDC issuer endpoint
|
||||||
|
pub authentik_issuer: String,
|
||||||
|
|
||||||
|
/// Temporal webhook callback URL
|
||||||
|
pub webhook_url: String,
|
||||||
|
|
||||||
|
/// OpenSearch cluster endpoint
|
||||||
|
pub opensearch_url: String,
|
||||||
|
|
||||||
|
/// PostgreSQL connection string
|
||||||
|
pub database_url: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ServiceConfig {
|
||||||
|
/// Load configuration from environment variables (set by K8s ConfigMap)
|
||||||
|
/// Fails if required env vars are missing
|
||||||
|
pub fn from_env() -> Result<Self> {
|
||||||
|
let memory_service_addr = std::env::var("MEMORY_SERVICE_ADDR")
|
||||||
|
.unwrap_or_else(|_| "http://localhost:8080".to_string());
|
||||||
|
|
||||||
|
let authentik_issuer = std::env::var("AUTHENTIK_ISSUER")
|
||||||
|
.map_err(|_| anyhow!("AUTHENTIK_ISSUER env var not set (configure in ConfigMap)"))?;
|
||||||
|
|
||||||
|
let webhook_url = std::env::var("WEBHOOK_URL")
|
||||||
|
.map_err(|_| anyhow!("WEBHOOK_URL env var not set (configure in ConfigMap)"))?;
|
||||||
|
|
||||||
|
let opensearch_url = std::env::var("OPENSEARCH_URL")
|
||||||
|
.map_err(|_| anyhow!("OPENSEARCH_URL env var not set (configure in ConfigMap)"))?;
|
||||||
|
|
||||||
|
let database_url = std::env::var("DATABASE_URL")
|
||||||
|
.map_err(|_| anyhow!("DATABASE_URL env var not set (configure Secret or ConfigMap)"))?;
|
||||||
|
|
||||||
|
Ok(ServiceConfig {
|
||||||
|
memory_service_addr,
|
||||||
|
authentik_issuer,
|
||||||
|
webhook_url,
|
||||||
|
opensearch_url,
|
||||||
|
database_url,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Load with defaults for development (localhost only)
|
||||||
|
pub fn from_env_dev() -> Self {
|
||||||
|
ServiceConfig {
|
||||||
|
memory_service_addr: std::env::var("MEMORY_SERVICE_ADDR")
|
||||||
|
.unwrap_or_else(|_| "http://localhost:8080".to_string()),
|
||||||
|
authentik_issuer: std::env::var("AUTHENTIK_ISSUER")
|
||||||
|
.unwrap_or_else(|_| "http://localhost:8080/application/o/poimen-memory/".to_string()),
|
||||||
|
webhook_url: std::env::var("WEBHOOK_URL")
|
||||||
|
.unwrap_or_else(|_| "http://localhost:9000/webhook".to_string()),
|
||||||
|
opensearch_url: std::env::var("OPENSEARCH_URL")
|
||||||
|
.unwrap_or_else(|_| "http://localhost:9200".to_string()),
|
||||||
|
database_url: std::env::var("DATABASE_URL")
|
||||||
|
.unwrap_or_else(|_| "postgres://localhost/memory".to_string()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_config_from_env_dev() {
|
||||||
|
let config = ServiceConfig::from_env_dev();
|
||||||
|
assert_eq!(config.memory_service_addr, "http://localhost:8080");
|
||||||
|
assert!(config.authentik_issuer.contains("localhost"));
|
||||||
|
assert!(config.webhook_url.contains("localhost"));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
pub mod config;
|
||||||
pub mod endpoints;
|
pub mod endpoints;
|
||||||
pub mod handlers;
|
pub mod handlers;
|
||||||
pub mod http_server;
|
pub mod http_server;
|
||||||
|
|||||||
@@ -448,8 +448,10 @@ async fn cmd_learn(
|
|||||||
all_files.sort();
|
all_files.sort();
|
||||||
println!("Found {} markdown files", all_files.len());
|
println!("Found {} markdown files", all_files.len());
|
||||||
|
|
||||||
|
// Load configuration from environment (set by K8s ConfigMap)
|
||||||
|
let config = mem_cli::config::ServiceConfig::from_env_dev();
|
||||||
let api_url = std::env::var("MEM_API_URL")
|
let api_url = std::env::var("MEM_API_URL")
|
||||||
.unwrap_or_else(|_| "http://localhost:8080".to_string());
|
.unwrap_or_else(|_| config.memory_service_addr.clone());
|
||||||
let api_token = std::env::var("MEM_API_TOKEN").ok();
|
let api_token = std::env::var("MEM_API_TOKEN").ok();
|
||||||
let http = reqwest::Client::builder()
|
let http = reqwest::Client::builder()
|
||||||
.timeout(std::time::Duration::from_secs(120))
|
.timeout(std::time::Duration::from_secs(120))
|
||||||
|
|||||||
@@ -0,0 +1,95 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: memory-service
|
||||||
|
namespace: poimen
|
||||||
|
labels:
|
||||||
|
app: memory-service
|
||||||
|
spec:
|
||||||
|
replicas: 2
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: memory-service
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: memory-service
|
||||||
|
spec:
|
||||||
|
serviceAccountName: memory-service
|
||||||
|
containers:
|
||||||
|
- name: memory-service
|
||||||
|
image: forgejo.riotpiao.com/rock/poimen-memory:latest
|
||||||
|
imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
containerPort: 8080
|
||||||
|
protocol: TCP
|
||||||
|
|
||||||
|
# Read all config from ConfigMap
|
||||||
|
envFrom:
|
||||||
|
- configMapRef:
|
||||||
|
name: memory-service-config
|
||||||
|
|
||||||
|
# Secrets (override/add to ConfigMap)
|
||||||
|
env:
|
||||||
|
- name: DATABASE_URL
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: memory-db-credentials
|
||||||
|
key: connection-string
|
||||||
|
- name: MEM_API_KEY
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: memory-api-keys
|
||||||
|
key: primary-key
|
||||||
|
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 500m
|
||||||
|
memory: 512Mi
|
||||||
|
limits:
|
||||||
|
cpu: 1000m
|
||||||
|
memory: 1Gi
|
||||||
|
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health
|
||||||
|
port: http
|
||||||
|
initialDelaySeconds: 10
|
||||||
|
periodSeconds: 10
|
||||||
|
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /health
|
||||||
|
port: http
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 5
|
||||||
|
|
||||||
|
# ImagePullSecret for private registry
|
||||||
|
imagePullSecrets:
|
||||||
|
- name: registry-credentials
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: memory-service
|
||||||
|
namespace: poimen
|
||||||
|
labels:
|
||||||
|
app: memory-service
|
||||||
|
spec:
|
||||||
|
type: ClusterIP
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 8080
|
||||||
|
targetPort: http
|
||||||
|
protocol: TCP
|
||||||
|
selector:
|
||||||
|
app: memory-service
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: memory-service
|
||||||
|
namespace: poimen
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: memory-service-config
|
||||||
|
namespace: poimen
|
||||||
|
labels:
|
||||||
|
app: memory-service
|
||||||
|
version: "1"
|
||||||
|
data:
|
||||||
|
# Inter-pod URLs (cluster-internal DNS)
|
||||||
|
MEMORY_SERVICE_ADDR: "http://memory-service.poimen.svc.cluster.local:8080"
|
||||||
|
AUTHENTIK_ISSUER: "http://authentik-server.iam.svc.cluster.local/application/o/poimen-memory/"
|
||||||
|
WEBHOOK_URL: "http://temporal-webhook.temporal.svc.cluster.local:9000/webhook"
|
||||||
|
OPENSEARCH_URL: "http://opensearch.poimen.svc.cluster.local:9200"
|
||||||
|
|
||||||
|
# Service addresses for internal communication
|
||||||
|
POSTGRES_HOST: "memory-db.poimen.svc.cluster.local"
|
||||||
|
POSTGRES_PORT: "5432"
|
||||||
|
POSTGRES_DB: "memory"
|
||||||
Reference in New Issue
Block a user