- Added PgAdmin4 tool to the cluster setup.

This commit is contained in:
Josako
2025-09-02 16:42:21 +02:00
parent b0e1ad6e03
commit 898bb32318
7 changed files with 316 additions and 3 deletions

View File

@@ -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

View File

@@ -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/<user>/.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=<jouw-linux-user>
Group=<jouw-linux-user>
# Eventueel: Environment=KUBECONFIG=/home/<jouw-linux-user>/.kube/config
ExecStart=/usr/local/bin/pf-pgadmin.sh
Restart=always
RestartSec=3
KillSignal=SIGINT
[Install]
WantedBy=multi-user.target
```
Vervang `<jouw-linux-user>` 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-proxyt 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 Lets 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.

View File

@@ -13,4 +13,13 @@ metadata:
name: monitoring
labels:
environment: staging
app: monitoring
app: monitoring
---
apiVersion: v1
kind: Namespace
metadata:
name: tools
labels:
environment: staging
app: tools

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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