From 898bb32318db01fc5b1458b008a935aa2513e614 Mon Sep 17 00:00:00 2001 From: Josako Date: Tue, 2 Sep 2025 16:42:21 +0200 Subject: [PATCH] - Added PgAdmin4 tool to the cluster setup. --- .../Production Setup/cluster-install.md | 45 ++++++ .../port forward pgadmin 4 als service.md | 138 ++++++++++++++++++ .../base/infrastructure/00-namespaces.yaml | 11 +- .../secrets/clustersecretstore-scaleway.yaml | 19 +++ .../base/secrets/eveai-external-secrets.yaml | 4 +- .../base/tools/pgadmin/externalsecrets.yaml | 57 ++++++++ .../manifests/base/tools/pgadmin/values.yaml | 45 ++++++ 7 files changed, 316 insertions(+), 3 deletions(-) create mode 100644 documentation/Production Setup/port forward pgadmin 4 als service.md create mode 100644 scaleway/manifests/base/secrets/clustersecretstore-scaleway.yaml create mode 100644 scaleway/manifests/base/tools/pgadmin/externalsecrets.yaml create mode 100644 scaleway/manifests/base/tools/pgadmin/values.yaml diff --git a/documentation/Production Setup/cluster-install.md b/documentation/Production Setup/cluster-install.md index 7a16983..4cbd948 100644 --- a/documentation/Production Setup/cluster-install.md +++ b/documentation/Production Setup/cluster-install.md @@ -418,6 +418,51 @@ kubectl get ingress -n eveai-staging kubectl get certificates -n eveai-staging ``` +### Phase 7: Install PgAdmin Tool + +#### Secret eveai-pgadmin-admin in Scaleway Secret Manager aanmaken (indien niet bestaat) + +2 Keys: +- `PGADMIN_DEFAULT_EMAIL`: E-mailadres voor de admin +- `PGADMIN_DEFAULT_PASSWORD`: voor de admin + +#### Secrets deployen + +```bash +kubectl apply -f scaleway/manifests/base/tools/pgadmin/externalsecrets.yaml + +# Check +kubectl get externalsecret -n tools +kubectl get secret -n tools | grep pgadmin +``` + +#### Helm chart toepassen + +```bash +helm repo add runix https://helm.runix.net +helm repo update +helm install pgadmin runix/pgadmin4 \ + -n tools \ + --create-namespace \ + -f scaleway/manifests/base/tools/pgadmin/values.yaml + +# Check status +kubectl get pods,svc -n tools +kubectl logs -n tools deploy/pgadmin-pgadmin4 || true +``` + +#### Port Forward, Local Access + +```bash +# Find the service name (often "pgadmin") +kubectl -n tools get svc +# Forward local port 8080 to service port 80 +kubectl -n tools port-forward svc/pgadmin-pgadmin4 8080:80 +# Browser: http://localhost:8080 +# Login with PGADMIN_DEFAULT_EMAIL / PGADMIN_DEFAULT_PASSWORD (from eveai-pgadmin-admin) +``` + + ## Verification and Testing ### Check Infrastructure Status diff --git a/documentation/Production Setup/port forward pgadmin 4 als service.md b/documentation/Production Setup/port forward pgadmin 4 als service.md new file mode 100644 index 0000000..4e10af8 --- /dev/null +++ b/documentation/Production Setup/port forward pgadmin 4 als service.md @@ -0,0 +1,138 @@ +### Kort antwoord +- Ja, je kunt kubectl port-forward als een systemd service draaien op je Linux-machine. +- Ja, je kunt eender welke lokale poort gebruiken (niet beperkt tot 8080), via het formaat LOCAL:REMOTE (bijv. 18080:80). +- Ja, je kunt de lokale forward achter Nginx Proxy Manager (NPM) zetten. Let wel op extra beveiliging als je dit publiek maakt. + +--- + +### 1) Port-forward als Linux service (systemd) +Hiermee start de forward automatisch bij boot en herstart hij bij fouten. + +#### Benodigd +- Werkende kubeconfig voor jouw user (zodat `kubectl` verbinding kan maken met je cluster). +- De juiste servicenaam (bijv. `pgadmin-pgadmin4`). Controleer met: + - `kubectl -n tools get svc` + +Onderstaande voorbeelden binden op localhost (127.0.0.1) voor veiligheid. Pas de servicenaam en poorten aan naar jouw situatie. + +#### Stap 1: Wrapper-script +Maak `/usr/local/bin/pf-pgadmin.sh`: +```bash +#!/usr/bin/env bash +set -euo pipefail + +# Optioneel, als je kubeconfig niet in ~/.kube/config staat: +# export KUBECONFIG=/home//.kube/config + +NAMESPACE="tools" +SERVICE="pgadmin-pgadmin4" # pas aan indien anders +LOCAL_PORT="18080" # kies je eigen lokale poort +REMOTE_PORT="80" # servicepoort in de cluster + +# Bind alleen op localhost voor veiligheid +exec kubectl -n "${NAMESPACE}" port-forward --address=127.0.0.1 "svc/${SERVICE}" "${LOCAL_PORT}:${REMOTE_PORT}" +``` +Maak uitvoerbaar: +```bash +sudo chmod +x /usr/local/bin/pf-pgadmin.sh +``` + +#### Stap 2: systemd unit +Maak `/etc/systemd/system/pgadmin-portforward.service`: +```ini +[Unit] +Description=Kubernetes port-forward for pgAdmin (tools namespace) +After=network-online.target +Wants=network-online.target + +[Service] +User= +Group= +# Eventueel: Environment=KUBECONFIG=/home//.kube/config +ExecStart=/usr/local/bin/pf-pgadmin.sh +Restart=always +RestartSec=3 +KillSignal=SIGINT + +[Install] +WantedBy=multi-user.target +``` +Vervang `` door je gebruikersnaam. + +Activeer en start: +```bash +sudo systemctl daemon-reload +sudo systemctl enable pgadmin-portforward +sudo systemctl start pgadmin-portforward +sudo systemctl status pgadmin-portforward +``` +Logs volgen: +```bash +journalctl -u pgadmin-portforward -f +``` +Hierna staat pgAdmin lokaal op http://127.0.0.1:18080. + +Beveiligingstip: laat `--address=127.0.0.1` staan. Wil je LAN-toegang, overweeg dan `--address=0.0.0.0` maar beveilig met firewall/IP-allowlist op de host. + +--- + +### 2) Andere lokale poort gebruiken +Je kunt de lokale poort zelf kiezen met `LOCAL:REMOTE`: +- Voorbeeld: 18080 lokaal naar 80 in de cluster: + - `kubectl -n tools port-forward svc/pgadmin-pgadmin4 18080:80` +- Je kunt meerdere forwards tegelijk draaien zolang elke lokale poort uniek is. + +--- + +### 3) Beschikbaar maken via Nginx Proxy Manager (NPM) +Ik ga uit van Nginx Proxy Manager (de reverse proxy UI). Als je Node Package Manager bedoelde, laat het weten. + +Doel: NPM publiceert een hostnaam en reverse-proxy’t naar jouw lokale forward op 127.0.0.1:18080. + +Voorwaarden: +- De port-forward draait stabiel (bijv. via systemd op poort 18080). +- NPM draait op dezelfde host (aanbevolen) of kan de host bereiken waar de forward draait. + +Stappen in NPM: +1) Login in NPM. +2) Add Proxy Host: + - Domain Names: bijv. `pgadmin.local.mijnlan` (LAN) of een publiek domein (alleen als strikt noodzakelijk). + - Scheme: `http` + - Forward Hostname/IP: `127.0.0.1` (als NPM op dezelfde host draait) of het LAN-IP van de host met de port-forward. + - Forward Port: `18080` +3) SSL: + - LAN: vaak geen SSL nodig. + - Publiek: vraag Let’s Encrypt aan in NPM, zet Force SSL/HTTP2/HSTS aan. +4) Access List / Security: + - Sterk aanbevolen: IP-allowlist, Basic Auth of SSO voor publieke toegang. + +Belangrijke waarschuwing: +- Een publieke NPM-proxy naar pgAdmin vergroot het aanvalsoppervlak. Gebruik sterke admin-credentials (heb je), overweeg extra Basic Auth/SSO, en houd pgAdmin up-to-date. + +Alternatief voor publieke toegang: +- Cloudflared/Zero Trust tunnel of inlets tunnel naar een subdomein met policies. +- Of later een Kubernetes Ingress met dedicated host + TLS, zoals eerder besproken. + +--- + +### Alternatieven en tips +- SSH-tunnel: kan ook, maar kubectl port-forward is vaak het eenvoudigst (gebruikt de K8s API). +- kubefwd: handig als je meerdere services tegelijk lokaal wilt resolven. +- Teamtoegang: liever een VPN (Tailscale/WireGuard) dan publieke NPM. Bind de forward op 127.0.0.1 en laat teamleden via VPN op je host browsen. + +--- + +### Troubleshooting +- Niet-startende service: bekijk `journalctl -u pgadmin-portforward -f`. Vaak is kubeconfig-onbereikbaar de oorzaak; zet `Environment=KUBECONFIG=...` in de unit of export in het script. +- Verkeerde servicenaam: check met `kubectl -n tools get svc` en pas aan in je script. +- Poort bezet: kies een andere lokale poort (bijv. 18081). +- NPM werkt niet: controleer of NPM dezelfde host is (dan 127.0.0.1 gebruiken), anders gebruik het LAN-IP; check firewall. + +--- + +### Samenvatting +- Service: ja, via systemd; voorbeeldscript en unit hierboven. +- Andere poort: ja, stel de linkerzijde van LOCAL:REMOTE in (bijv. 18080:80). +- NPM: ja, reverse proxy naar 127.0.0.1:18080; voeg extra beveiliging toe als je het publiek maakt. + +Als je wilt, kan ik het script en de unit exact invullen met jouw servicenaam en gewenste poort. Stuur me de output van `kubectl -n tools get svc` en je Linux-gebruikersnaam. \ No newline at end of file diff --git a/scaleway/manifests/base/infrastructure/00-namespaces.yaml b/scaleway/manifests/base/infrastructure/00-namespaces.yaml index 6511e1d..4fc0e90 100644 --- a/scaleway/manifests/base/infrastructure/00-namespaces.yaml +++ b/scaleway/manifests/base/infrastructure/00-namespaces.yaml @@ -13,4 +13,13 @@ metadata: name: monitoring labels: environment: staging - app: monitoring \ No newline at end of file + app: monitoring + +--- +apiVersion: v1 +kind: Namespace +metadata: + name: tools + labels: + environment: staging + app: tools \ No newline at end of file diff --git a/scaleway/manifests/base/secrets/clustersecretstore-scaleway.yaml b/scaleway/manifests/base/secrets/clustersecretstore-scaleway.yaml new file mode 100644 index 0000000..e259392 --- /dev/null +++ b/scaleway/manifests/base/secrets/clustersecretstore-scaleway.yaml @@ -0,0 +1,19 @@ +apiVersion: external-secrets.io/v1 +kind: ClusterSecretStore +metadata: + name: scaleway-cluster-secret-store +spec: + provider: + scaleway: + region: "fr-par" + projectId: "ad7d2ed9-252b-4b2a-9f4c-daca3edc4c4b" + accessKey: + secretRef: + name: scaleway-credentials + namespace: eveai-staging + key: access-key + secretKey: + secretRef: + name: scaleway-credentials + namespace: eveai-staging + key: secret-key diff --git a/scaleway/manifests/base/secrets/eveai-external-secrets.yaml b/scaleway/manifests/base/secrets/eveai-external-secrets.yaml index d8950c2..5bfde85 100644 --- a/scaleway/manifests/base/secrets/eveai-external-secrets.yaml +++ b/scaleway/manifests/base/secrets/eveai-external-secrets.yaml @@ -7,8 +7,8 @@ metadata: spec: refreshInterval: 300s secretStoreRef: - name: scaleway-secret-store - kind: SecretStore + name: scaleway-cluster-secret-store + kind: ClusterSecretStore target: name: eveai-secrets creationPolicy: Owner diff --git a/scaleway/manifests/base/tools/pgadmin/externalsecrets.yaml b/scaleway/manifests/base/tools/pgadmin/externalsecrets.yaml new file mode 100644 index 0000000..cafb613 --- /dev/null +++ b/scaleway/manifests/base/tools/pgadmin/externalsecrets.yaml @@ -0,0 +1,57 @@ +apiVersion: external-secrets.io/v1 +kind: ExternalSecret +metadata: + name: pgadmin-admin + namespace: tools +spec: + refreshInterval: 300s + secretStoreRef: + name: scaleway-cluster-secret-store + kind: ClusterSecretStore + target: + name: pgadmin-admin + creationPolicy: Owner + data: + - secretKey: PGADMIN_DEFAULT_EMAIL + remoteRef: + key: name:eveai-pgadmin-admin + property: PGADMIN_DEFAULT_EMAIL + - secretKey: PGADMIN_DEFAULT_PASSWORD + remoteRef: + key: name:eveai-pgadmin-admin + property: PGADMIN_DEFAULT_PASSWORD +--- +apiVersion: external-secrets.io/v1 +kind: ExternalSecret +metadata: + name: pgadmin-db + namespace: tools +spec: + refreshInterval: 300s + secretStoreRef: + name: scaleway-cluster-secret-store + kind: ClusterSecretStore + target: + name: pgadmin-db + creationPolicy: Owner + data: + - secretKey: DB_HOST + remoteRef: + key: name:eveai-postgresql + property: DB_HOST + - secretKey: DB_PORT + remoteRef: + key: name:eveai-postgresql + property: DB_PORT + - secretKey: DB_USER + remoteRef: + key: name:eveai-postgresql + property: DB_USER + - secretKey: DB_PASS + remoteRef: + key: name:eveai-postgresql + property: DB_PASS + - secretKey: DB_NAME + remoteRef: + key: name:eveai-postgresql + property: DB_NAME diff --git a/scaleway/manifests/base/tools/pgadmin/values.yaml b/scaleway/manifests/base/tools/pgadmin/values.yaml new file mode 100644 index 0000000..7566764 --- /dev/null +++ b/scaleway/manifests/base/tools/pgadmin/values.yaml @@ -0,0 +1,45 @@ +# values.yaml for runix/pgadmin4 +image: + repository: dpage/pgadmin4 + pullPolicy: IfNotPresent + +replicaCount: 1 + +resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 500m + memory: 512Mi + +persistence: + enabled: true + accessModes: + - ReadWriteOnce + size: 2Gi + # Set your storageClass if needed (Scaleway CSI), leave null to use default + storageClass: null + +service: + type: ClusterIP + port: 80 + +# Use existing secret for admin password; admin email configured via env.email +existingSecret: pgadmin-admin +secretKeys: + pgadminPasswordKey: PGADMIN_DEFAULT_PASSWORD + +# Set admin email used by pgAdmin (not read from secret by this chart) +env: + email: pieter@askeveai.com + +# No ingress: we access via kubectl port-forward +ingress: + enabled: false + +# SecurityContext defaults are fine; can be tuned later +securityContext: + runAsUser: 5050 + fsGroup: 5050 + runAsNonRoot: true