// Package main — Gebos MQTT → Postgres ingester. // // Skeleton. Target: < 200 lines. // // Subscribes to topics of the form `t//d//`, // extracts tenant_id and device_id from the topic, writes rows into // public.telemetry on db-host as the gebos_ingest role (BYPASSRLS). package main import ( "context" "log" "os" "os/signal" "syscall" ) func main() { broker := os.Getenv("GEBOS_MQTT_BROKER") pgURL := os.Getenv("GEBOS_POSTGRES_URL") pgPassword := os.Getenv("GEBOS_POSTGRES_PASSWORD") if broker == "" || pgURL == "" || pgPassword == "" { log.Fatal("GEBOS_MQTT_BROKER, GEBOS_POSTGRES_URL and GEBOS_POSTGRES_PASSWORD must be set") } ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() // TODO: // 1. pgxpool.New with password injected into the DSN // 2. paho MQTT client.Connect, Subscribe("t/+/d/+/+") // 3. on message: parse topic → (tenant_id, device_id, metric), parse // payload (JSON for now), INSERT INTO public.telemetry // 4. batch with a short flush interval (50–100ms) for throughput // 5. shutdown on ctx.Done log.Printf("gebos-ingester: broker=%s db= (stub)", broker) <-ctx.Done() log.Println("gebos-ingester: shutting down") }