Files
eveAI/documentation/Production Setup/port forward pgadmin 4 als service.md
2025-09-02 16:42:21 +02:00

5.3 KiB
Raw Blame History

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:

#!/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:

sudo chmod +x /usr/local/bin/pf-pgadmin.sh

Stap 2: systemd unit

Maak /etc/systemd/system/pgadmin-portforward.service:

[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:

sudo systemctl daemon-reload
sudo systemctl enable pgadmin-portforward
sudo systemctl start pgadmin-portforward
sudo systemctl status pgadmin-portforward

Logs volgen:

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.