KB: magitek-ops
← All workspaces9213 results — page 5 of 185
| Title | Domain | Type | Severity | Source | Freshness | Updated |
|---|---|---|---|---|---|---|
| SC-03: 20 vCPUer allokert — overprovisionert | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-suitecrm.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### SC-03: 20 vCPUer allokert — overprovisionert
- **Symptom:** VM har 20 cores, bruker minimalt
- **Losning:** Ufarlig (KVM deler cores), kan reduseres til 4-8
### SC-04: UFW inaktiv inne i VM
- **Symptom:** `ufw status` viser inactive
- **Losning:** Akseptabelt med Proxmox firewall=1. Vurder UFW som defense-in-depth.
### SC-05: defaultExt frontend extension deaktivert etter upgrade
- **Symptom:** Upgrade til 8.9.2 advarte om deaktivering
- **Losning:** Se suitecrm-dev workspace for detaljer
### SC-06: Ingen swap konfigurert (FIKSET 2026-03-15)
- **Var:** `free -h` viste 0 swap
- **Fikset:** 4 GB swap konfigurert
### SC-07: /var/tmp permissions eid av www-data (FIKSET 2026-03-15)
- **Var:** /var/tmp eid av www-data, manglende sticky bit
- **Fikset:** Riktige permissions gjenopprettet (root:root, 1777)
---
## Monitoring & Ressursovervaking
| Verktoy | Status | Intervall | Hva det gjor |
|---------|--------|-----------|-------------|
| **sysstat (sar)** | Installert | 10 min | Systemvid CPU/mem/disk historikk |
| **atop** | Aktiv (systemd) | 10 sek | Per-prosess CPU/mem/disk logging med tilbakespoling |
| **PCP (pmlogger)** | Aktiv (systemd) | Granulart | Metrikkarkiv, kan kobles til Grafana |
### Hurtigkommandoer
```bash
# CPU-historikk (sar)
sar -u -s HH:MM:00
# Spol tilbake — se hvilken prosess som brukte CPU (atop)
atop -r /var/log/atop/atop_$(date +%Y%m%d) -b HH:MM
# PCP metrikkquery
pmval -a /var/log/pcp/pmlogger/$(hostname)/ kernel.all.cpu.user -t 10sec
```
### Konfig
- Atop logfiler: `/var/log/atop/atop_YYYYMMDD`, intervall 10s (`/etc/default/atop` LOGINTERVAL=10)
- PCP arkiv: `/var/log/pcp/pmlogger/$(hostname)/`, pmcd + pmlogger aktive, pcp-zeroconf installert
- sar: default 10 min — for grovt for korte spikes, bruk atop
---
## App-Domain Referanser
For SuiteCRM applikasjonsutvikling (arkitektur, extensions, MCP, translations, gotchas):
- **Workspace:** `/var/www/suitecrm-dev/`
- **Expert:** `coordination/experts/suitecrm/CURRENT-architecture.md`
- **Customizations:** `coordination/experts/suitecrm/CURRENT-customizations.md`
- **Agent:** `/suitecrm` (suitecrm-specialist)
---
|
||||||
| Snapshots (per 2026-03-13) | operations/magitek-server-ops/kontoret/services | knowledge | low | CURRENT-suitecrm.md | 100 | 2026-03-20 02:00:44 |
|
Body:
## Snapshots (per 2026-03-13)
| Navn | Tidspunkt | Beskrivelse |
|------|-----------|-------------|
| Pre_upgrade | 18:41 | For initial kartlegging |
| pre-upgrade-20260313 | 19:12 | For oppgradering fra 8.9.0 |
| post-upgrade-892-20260313 | 19:17 | Etter oppgradering til 8.9.2 |
---
## Apache VHost
| Egenskap | Verdi |
|----------|-------|
| **Config** | /etc/apache2/sites-enabled/suitecrm.conf |
| **ServerName** | crm.dittdomene.no (PLACEHOLDER) |
| **DocumentRoot** | /var/www/suitecrm/public |
| **Options** | AllowOverride All, FollowSymLinks |
---
## Sikkerhet
- **Firewall:** UFW inaktiv inne i VM — Proxmox firewall=1 pa net0 gir beskyttelse
- **IP-tildeling:** DHCP med statisk reservasjon pa pfSense kontoret (MAC BC:24:11:EA:6C:8C)
- **DNS-server:** 172.20.0.6 (Pi-hole kontoret)
- **Gateway:** 172.20.0.1 (pfSense kontoret)
---
## Brukere
| Kontekst | Bruker | Rolle |
|----------|--------|-------|
| System (OS) | heine (uid 1000) | Hovedbruker |
| MySQL | admin / Ansjos123 | DB admin (localhost only) |
| SuiteCRM | kinga | CRM Admin (is_admin=1) |
---
## Vanlige Operasjoner
### Restart Apache
```bash
ssh suitecrm "echo 'Ansjos123' | sudo -S systemctl restart apache2"
```
### Sjekk SuiteCRM-versjon
```bash
ssh suitecrm "cat /var/www/suitecrm/suitecrm/core/app/Resources/legacy/.env | grep SUITE"
```
### Sjekk cron-logg
```bash
ssh suitecrm "tail -50 /var/log/suitecrm-cron.log"
```
### Sjekk MySQL-status
```bash
ssh suitecrm "echo 'Ansjos123' | sudo -S systemctl status mysql"
```
### Sjekk diskbruk
```bash
ssh suitecrm "df -h / && du -sh /var/www/suitecrm"
```
---
## Kjente Gotchas (Infrastruktur)
### SC-01: Apache ServerName er placeholder
- **Symptom:** ServerName i suitecrm.conf er "crm.dittdomene.no"
- **Losning:** Fungerer fordi NPM handterer domene-ruting, men bor oppdateres
### SC-02: DATABASE_URL tom i .env
- **Symptom:** DATABASE_URL i .env er tom
- **Arsak:** Normalt for SuiteCRM 8 — bruker legacy config.php dbconfig
- **Losning:** Ikke et problem. Ikke fyll inn manuelt.
|
||||||
| Reverse Proxy | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-suitecrm.md | 100 | 2026-03-20 02:00:44 |
|
Body:
## Reverse Proxy
Trafikk flyter via to NPM-instanser avhengig av kilde:
### NPM Kontoret (172.20.0.42) — Proxy Host #11
| Egenskap | Verdi |
|----------|-------|
| **Domene** | suitecrm.magitek.no |
| **Forward** | http://172.20.0.102:80 |
| **SSL** | Custom SSL (cert npm-48) |
| **Force SSL** | Ja |
| **HSTS** | Ja |
| **Access control** | Basic auth + IP whitelist (172.20.0.0/24, 62.97.227.206, 81.167.27.54, 193.212.224.198) |
### NPM Hjemme (192.168.86.16) — Proxy Host #206
| Egenskap | Verdi |
|----------|-------|
| **Domene** | suitecrm.magitek.no |
| **Forward** | http://172.20.0.102:80 (via WireGuard, ~14ms) |
| **SSL** | Let's Encrypt (cert #325, utloper 2026-06-11) |
| **Opprettet** | 2026-03-13 |
| **Block exploits** | Ja |
| **Websocket** | Ja (upgrade tillatt) |
---
## DNS
| Kilde | Oppslag | Resolves til |
|-------|---------|-------------|
| Pi-hole kontoret (172.20.0.6) | suitecrm.magitek.no | 172.20.0.42 (NPM kontoret, direkte LAN) |
| Pi-hole hjemme (CT 101, px5) | suitecrm.magitek.no | 192.168.86.16 (NPM hjemme, lokal) |
| Public DNS (Webhuset/Cloudflare) | suitecrm.magitek.no | 81.167.27.54 (wildcard *.magitek.no) |
---
## Trafikkflyt
```
Fra kontoret: Klient → Pi-hole → NPM kontoret (172.20.0.42) → 172.20.0.102:80 (~1ms)
Fra hjemme: Klient → Pi-hole → NPM hjemme (192.168.86.16) → WireGuard → 172.20.0.102:80 (~14ms)
Fra internett: Public DNS → 81.167.27.54 → pfSense hjemme → NPM hjemme → WireGuard → 172.20.0.102:80
```
---
## Cron
| Jobb | Schedule | Bruker | Merknad |
|------|----------|--------|---------|
| SuiteCRM scheduler | `* * * * *` | www-data | `cd /var/www/suitecrm && php bin/console suitecrm:app:cron >> /var/log/suitecrm-cron.log 2>&1` |
| PHP session cleanup | Hver 30. min | system | Standard PHP gc |
---
## Backup
| Egenskap | Verdi |
|----------|-------|
| **Proxmox backup-jobb** | px1 daglig backup |
| **Schedule** | Kl 02:00 |
| **Storage** | extbackup |
| **Mode** | Snapshot |
| **Lagt til** | 2026-03-13 |
| **Forste backup** | 2026-03-13, 9m37s, incremental, 32 GB disk, 15.98 GB sparse |
| **Verifisert** | 2026-03-15 — VM 122 bekreftet i `/etc/pve/jobs.cfg` |
---
|
||||||
| Identitet | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-suitecrm.md | 100 | 2026-03-20 02:00:44 |
|
Body:
# Infrastructure Sub-Expert: SuiteCRM
**Version:** 2.1
**Date:** 2026-03-15
**Parent:** coordination/experts/operations/magitek-server-ops/CURRENT.md
**Load:** coordination/experts/operations/magitek-server-ops/kontoret/services/CURRENT-suitecrm.md
**NOTE:** App-domain content (architecture, development guide, translations, MCP tools,
developer gotchas, customization registry) has been migrated to `/var/www/suitecrm-dev/`
workspace. This file covers INFRASTRUCTURE ONLY.
---
## Identitet
| Egenskap | Verdi |
|----------|-------|
| **Hostname** | suitecrm |
| **VM/CT ID** | VM 122 |
| **Type** | KVM VM |
| **Proxmox Host** | px1 (172.20.0.34, kontoret) |
| **LAN IP** | 172.20.0.102 (DHCP static reservation, MAC BC:24:11:EA:6C:8C) |
| **Lokasjon** | Kontoret (172.20.0.x) |
| **OS** | Ubuntu 24.04.3 LTS (Noble Numbat), kernel 6.8.0-87-generic |
| **CPU** | 20 cores, 1 socket, x86-64-v2-AES |
| **RAM** | 8 GB (balloon min 1 GB), bruker ~1.3 GB (17%) |
| **Swap** | 4 GB |
| **Disk** | 80 GB on raid10 (raid10:vm-122-disk-0), LVM 78 GB, 18% brukt (13 GB av 77 GB) |
| **Rolle** | SuiteCRM 8 CRM-system |
| **Status** | Aktiv |
---
## Tilgang
| Metode | Detaljer |
|--------|----------|
| SSH | `ssh suitecrm` eller `ssh heine@172.20.0.102` |
| WebGUI | https://suitecrm.magitek.no |
| Proxmox konsoll | px1 WebGUI → VM 122 |
**Credentials:**
- SSH: heine / Ansjos123
- sudo: krever passord (`echo 'Ansjos123' | sudo -S`)
---
## Stack
| Komponent | Versjon |
|-----------|---------|
| SuiteCRM | 8.9.2 |
| Apache | 2.4 |
| PHP | 8.3.6 |
| MySQL | 8.0.43 |
**APP_ENV:** prod
**DocumentRoot:** /var/www/suitecrm/public
**App disk usage:** 1.4 GB
---
## Tjenester
| Tjeneste | Port | Status | Merknad |
|----------|------|--------|---------|
| Apache | :80 | Aktiv | SuiteCRM DocumentRoot |
| MySQL | :3306 | Aktiv | Kun localhost |
| SSH | :22 | Aktiv | Nokkelautentisering |
| QEMU agent | - | Aktiv | Proxmox gjesteverktoy |
---
## PHP-moduler
Alle nodvendige installert: curl, gd, imap, intl, ldap, mbstring, mysqli, mysqlnd, pdo_mysql, soap, zip, PDO
---
|
||||||
| v1.0 - 2026-03-04 | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-pihole-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### v1.0 - 2026-03-04
- Opprettet CT 108 pa pmox15 (Ubuntu 24.04 LTS)
- Pi-hole v6.4 + Unbound rekursiv DNS
- 77 526 blokkerte domener (StevenBlack)
- 9 lokale DNS-oppforinger for kontoret
- Speiler hjemme-oppsettet (CT 132 pa px5)
|
||||||
| Pi-hole v6: `restartdns` er ugyldig | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-pihole-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### Pi-hole v6: `restartdns` er ugyldig
Pi-hole v6 har ikke `restartdns`-kommandoen. Bruk `pihole reloaddns` i stedet. Agenter som bruker gamle v5-mønstre vil få feil.
### `pihole` binary ikke i PATH ved `pct exec`
`pct exec <CTID> -- pihole ...` finner ikke binary. Bruk full sti:
```bash
pct exec 108 -- /usr/local/bin/pihole reloaddns
```
## Changelog
### v1.5 - 2026-03-19
- PERMANENT FIX: monitoring-k.magitek.no og monitoring.magitek.no lagt til i dns.hosts (pihole.toml)
- Root cause: dnsmasq address= alene var intermittent pga FTL cache CNAME-poisoning (px10.magitek.no -> 192.168.86.16)
- dns.hosts returnerer TTL=0 og overstyrerer aldri av cache — permanent losning
- Oppdatert PIHOLE-K-01 gotcha med full rotarsak og regel for fremtidige split-horizon-domener
- dnsmasq 99-monitoring.conf beholdt som backup-lag
### v1.4 - 2026-03-04
- 8.8.8.8 fjernet som sekundær DNS fra pfSense DHCP — kun Pi-hole (172.20.0.6) serveres nå
- Forhindrer at Windows-klienter bruker offentlig DNS som gir feil IP via Cloudflare wildcard
- Oppdatert "Neste steg"-seksjon for å reflektere dette
### v1.3 - 2026-03-04
- La til `laravel-v11` og `laravelserver-v11` som lokale DNS-oppforinger (172.20.0.94)
- Oppdatert SSH config `20-kontoret-direct`: `Host laravel-v11 laravelserver-v11` (alias)
- Dokumentert gotcha: SSH-hostnames vs DNS ved overgang fra pfSense til Pi-hole
### v1.2 - 2026-03-04
- Hjemme split DNS: 46 hjemme-domener (*.magitek.no, *.hsal.no, *.nativja.no, *.trubadurheine.no) peker til NPM hjemme (192.168.86.16) via WireGuard
- Trafikk fra kontoret til hjemme-tjenester gar na over kryptert WG-tunnel (~15ms), ikke via internett
- Statisk rute lagt til pa laravelserver-v11: 192.168.86.0/24 via 172.20.0.1 (persistent via netplan)
### v1.1 - 2026-03-04
- Split DNS implementert: 25+ kontoret-domener (*.magitek.no + *.nativja.no) peker til NPM LAN-IP (172.20.0.42)
- pfSense DHCP DNS endret fra 8.8.8.8,1.1.1.1 til 172.20.0.6,8.8.8.8
- Alle kontoret-tjenester nå tilgjengelige via LAN uten hairpin NAT
|
||||||
| Sjekk monitoring-k override | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-pihole-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### Sjekk monitoring-k override
`ssh root@172.20.0.33 "pct exec 108 -- bash -lc 'grep -n \"etc_dnsmasq_d\" /etc/pihole/pihole.toml; sed -n \"1,20p\" /etc/dnsmasq.d/99-monitoring.conf'"``
## Neste steg (manuelt)
### ~~Pek pfSense DHCP til denne DNS-en~~ — FERDIG (2026-03-04)
pfSense DHCP nå konfigurert med DNS Server 1 = 172.20.0.6. DNS Server 2 (8.8.8.8) er FJERNET.
Kun Pi-hole (172.20.0.6) serveres som DNS til DHCP-klienter på kontoret.
8.8.8.8 ble fjernet fordi Windows-klienter brukte offentlig DNS som fallback og fikk feil IP via Cloudflare wildcard (81.167.27.54 i stedet for 172.20.0.42).
### Legg til flere adlists
Kun StevenBlack er aktivert. Vurder a legge til:
- OISD (oisd.nl) — bred dekning
- Hagezi (github.com/hagezi) — multi-kategori
## Gotchas / Kjente fallgruver
PIHOLE-K-01: monitoring-*.magitek.no MÅ bruke dns.hosts, IKKE bare dnsmasq address=
- Symptom: `monitoring-k.magitek.no` gir `ERR_SSL_UNRECOGNIZED_NAME` intermittent fra kontoret.
- Cause: `dnsmasq address=` alene er utilstrekkelig. Pi-hole FTL cacher CNAME-response fra Unbound (monitoring-k -> px10.magitek.no) og resolver CNAME-target via dns.hosts (px10.magitek.no -> 192.168.86.16 = NPM hjemme). Dette gir feil NPM-instans. Problemet er intermittent fordi `pihole reloaddns` flusher cachen midlertidig, men CNAME re-entrer cachen etter TTL-utlop.
- Fix (permanent, applied 2026-03-19): Legg domenet i `dns.hosts` (pihole.toml) som returnerer TTL=0 og ALDRI caches. Behold dnsmasq address= som backup. Gjort for bade `monitoring-k.magitek.no` og `monitoring.magitek.no`.
- Regel: ALLE nye split-horizon-domener som bruker Cloudflare CNAME ma legges i dns.hosts, IKKE bare dnsmasq.
### SSH-hostnames vs DNS
Nar Pi-hole overtar som DNS fra pfSense, mister klienter oppslag for hostnames som pfSense resolvet via DHCP-leases eller host overrides. SSH config-aliaser (f.eks. `laravel-v11`) som IKKE har eksplisitt `HostName` med IP i SSH config, vil feile med "Could not resolve hostname".
**Losning:** Alle SSH-hostnames som brukes i VSCode workspaces MÅ enten:
1. Ha eksplisitt `HostName <IP>` i SSH config (anbefalt), ELLER
2. Finnes som lokal DNS-oppforing i Pi-hole
**Windows gotcha:** Etter DNS-endring ma `ipconfig /flushdns` kjores for a fjerne cachet negativt svar. Nextcloud SSH-config sync kan ha forsinkelse — rediger lokalt pa maskinen for umiddelbar effekt.
|
||||||
| Domain Overrides (dns.hosts + dnsmasq backup) | operations/magitek-server-ops/kontoret/services | knowledge | low | CURRENT-pihole-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
## Domain Overrides (dns.hosts + dnsmasq backup)
| FQDN | Answer | Primary mechanism | Backup mechanism | Source refs |
|------|--------|-------------------|------------------|-------------|
| `monitoring-k.magitek.no` | `172.20.0.42` | `dns.hosts` in pihole.toml | `address=` in `/etc/dnsmasq.d/99-monitoring.conf:1` | bug-crusher-ops 2026-03-19 (permanent fix) |
| `monitoring.magitek.no` | `172.20.0.42` | `dns.hosts` in pihole.toml | `address=` in `/etc/dnsmasq.d/99-monitoring.conf:2` | bug-crusher-ops 2026-03-19 (permanent fix) |
Flow: kontoret klient -> Pi-hole kontoret -> `172.20.0.42` (NPM kontoret) -> `172.20.0.76:3000` (mon-kontoret Grafana)
**KRITISK LEKSJON:** `dns.hosts` i pihole.toml har hogeste prioritet i Pi-hole v6 og returnerer TTL=0 (aldri cachet). `dnsmasq address=` direktiver alene er UTILSTREKKELIG for domener med Cloudflare CNAME fordi Pi-hole FTL sin cache folger CNAME-kjeden og lander pa `px10.magitek.no` -> `192.168.86.16` (fra annen dns.hosts-oppforing). Bruk ALLTID dns.hosts for split-horizon overrides.
## Unbound-konfigurasjon
| Parameter | Verdi |
|-----------|-------|
| Config | /etc/unbound/unbound.conf.d/pi-hole.conf |
| Interface | 127.0.0.1 (kun loopback) |
| Port | 5335 |
| IPv4 | Ja |
| IPv6 | Nei |
| Threads | 1 |
| Prefetch | Ja |
| EDNS buffer | 1232 |
| harden-glue | Ja |
| harden-dnssec-stripped | Ja |
| Private ranges | Alle RFC1918 + link-local |
## Vanlige Operasjoner
### Sjekk status
```bash
ssh root@172.20.0.33 "pct exec 108 -- bash -lc '/usr/local/bin/pihole status'"
```
### Oppdater gravity (blokkerings-lister)
```bash
ssh root@172.20.0.33 "pct exec 108 -- bash -lc '/usr/local/bin/pihole -g'"
```
### Reload DNS (etter config-endring)
```bash
ssh root@172.20.0.33 "pct exec 108 -- bash -lc '/usr/local/bin/pihole reloaddns'"
```
### Se topp blokkerte domener
```bash
ssh root@172.20.0.33 "pct exec 108 -- bash -lc '/usr/local/bin/pihole -t'"
```
### Legg til lokal DNS-oppforing (v6)
Rediger `/etc/pihole/pihole.toml` → `dns.hosts` array, deretter:
```bash
ssh root@172.20.0.33 "pct exec 108 -- bash -c 'systemctl restart pihole-FTL'"
```
|
||||||
| Pi-hole Versjon | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-pihole-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
## Pi-hole Versjon
| Komponent | Versjon |
|-----------|---------|
| Pi-hole Core | v6.4 |
| Web Interface | v6.4.1 |
| FTL | v6.5 |
## Blokkering
| Parameter | Verdi |
|-----------|-------|
| **Blokkerte domener** | 77 526 |
| **Adlists** | 1 (StevenBlack/hosts) |
| **Blokkering aktiv** | Ja |
| **DNSSEC** | Nei (i Pi-hole, men Unbound har harden-dnssec-stripped) |
| **Query logging** | Ja |
| **Listening mode** | LOCAL |
## Lokal DNS (pihole.toml hosts)
Pi-hole v6 bruker `dns.hosts` i `/etc/pihole/pihole.toml` (IKKE custom.list som v5):
| IP | Hostname(s) |
|----|-------------|
| 172.20.0.1 | pfsense.loc |
| 172.20.0.6 | pihole.loc, pihole-kontoret.loc |
| 172.20.0.32 | pmox10.loc |
| 172.20.0.33 | pmox15.loc |
| 172.20.0.34 | px1.loc |
| 172.20.0.42 | npm.loc, npm-kontoret.loc |
| 172.20.0.94 | reportmaker.loc, laravelserver.loc, laravel-v11, laravelserver-v11 |
| 172.20.0.95 | ssh-server.loc |
| 172.20.0.104 | docker1.loc |
| **172.20.0.42** | **px1.magitek.no, pmox10.magitek.no, pmox15.magitek.no** |
| **172.20.0.42** | **pfsense-kolsk.magitek.no, npm-kolsk.magitek.no** |
| **172.20.0.42** | **zyxel1920.magitek.no, freshtomato.magitek.no** |
| **172.20.0.42** | **mainwp.magitek.no, todo.magitek.no** |
| **172.20.0.42** | **reportmaker.magitek.no, packages.magitek.no** |
| **172.20.0.42** | **skymirror.magitek.no, hostclone.magitek.no** |
| **172.20.0.42** | **suitecrm.magitek.no, duplicati-kolsk.magitek.no** |
| **172.20.0.42** | **monitoring-k.magitek.no, monitoring.magitek.no** |
| **172.20.0.42** | **px1.nativja.no, nativja.no, www.nativja.no** |
| **172.20.0.42** | **nx.nativja.no, frappe.nativja.no, pfsense.nativja.no** |
| **172.20.0.42** | **zyxel1920.nativja.no, freshtomato.nativja.no** |
| **172.20.0.42** | **mainwp.nativja.no, todo.nativja.no, webserver1.nativja.no** |
| **192.168.86.16** | **px5.magitek.no, px2.magitek.no, px3.magitek.no** |
| **192.168.86.16** | **pbs1.magitek.no, pbsm.magitek.no, pfsense.magitek.no** |
| **192.168.86.16** | **nc.magitek.no, nc-aio.magitek.no, nc-office.magitek.no** |
| **192.168.86.16** | **nc.hsal.no, nc-aio.hsal.no** |
| **192.168.86.16** | **nc.nativja.no, nc-aio.nativja.no, nc-office.nativja.no** |
| **192.168.86.16** | **truenas.magitek.no, nas1.magitek.no** |
| **192.168.86.16** | **bookstack.magitek.no, duplicati.magitek.no, postiz.magitek.no** |
| **192.168.86.16** | **pihole.magitek.no, n8n.magitek.no, mautic.magitek.no** |
| **192.168.86.16** | **bitwarden.magitek.no, homepage.magitek.no, homelab.magitek.no** |
| **192.168.86.16** | **plex.magitek.no, jellyfin.magitek.no, linkwarden.magitek.no** |
| **192.168.86.16** | **vpn.magitek.no** |
| **192.168.86.16** | **idrac1.magitek.no, idrac2.magitek.no, idrac3.magitek.no** |
| **192.168.86.16** | **bi.hsal.no, grocy.hsal.no, hd.hsal.no, learn.hsal.no** |
| **192.168.86.16** | **observium.hsal.no, notat-kinga.hsal.no, kinga.magitek.no** |
**Merk:** Hjemme-domener (192.168.86.16) rutes via WireGuard site-to-site tunnel, ikke internett.
**Merk:** Kundesider (www.magitek.no, www.borilden.no, www.healthyhair.no, www.trubadurheine.no) er BEVISST ekskludert — de gar via internett sa utviklere ser realistisk kundeopplevelse.
|
||||||
| Identitet | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-pihole-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
# Infrastructure Sub-Expert: pihole-kontoret (Pi-hole DNS)
**Version:** 1.5
**Date:** 2026-03-19
**Parent:** coordination/experts/operations/magitek-server-ops/CURRENT.md
**Load:** coordination/experts/operations/magitek-server-ops/kontoret/services/CURRENT-pihole-kontoret.md
**Sources:** MP-0011, Session b7663763-0ed5-48b2-95d5-3c8a45829459 (2026-03-19)
**Verification note:** 2026-03-19 update is documented from session handoff plus MP-0011; direct SSH re-check was blocked in the training sandbox.
---
## Identitet
| Egenskap | Verdi |
|----------|-------|
| **Hostname** | pihole-kontoret |
| **Type** | LXC Container (CT 108) pa pmox15 |
| **LAN IP** | 172.20.0.6 |
| **Gateway** | 172.20.0.1 (pfSense kontoret) |
| **Lokasjon** | Kontoret (172.20.0.x) |
| **OS** | Ubuntu 24.04 LTS (Noble) |
| **Rolle** | DNS-server med annonse/tracker-blokkering + lokal DNS |
| **Status** | Aktiv |
| **Onboot** | Ja |
| **Web UI** | http://172.20.0.6/admin |
## Tilgang
| Metode | Detaljer |
|--------|----------|
| SSH (via pmox15) | `ssh root@172.20.0.33 "pct exec 108 -- bash"` |
| SSH (direkte) | `ssh root@172.20.0.6` (passord: Ansjos123) |
| Web UI | http://172.20.0.6/admin (passord: Ansjos123) |
| CLI | `ssh root@172.20.0.33 "pct exec 108 -- bash -lc '/usr/local/bin/pihole <cmd>'"` |
## Ressurser
| Ressurs | Tildelt |
|---------|---------|
| **CPU** | 1 core |
| **RAM** | 512 MB |
| **Swap** | 256 MB |
| **Disk** | 4 GB (local-lvm) |
| **Arch** | amd64, unprivileged, nesting=1 |
## Tjenester
| Tjeneste | Port | Status | Rolle |
|----------|------|--------|-------|
| **pihole-FTL** | 53 (UDP/TCP) | Running | DNS-server + blokkering |
| **Unbound** | 5335 (loopback) | Running | Rekursiv DNS-resolver |
| **Web UI** | 80 + 443 | Running | Pi-hole admin panel |
### DNS-arkitektur
```
Klienter (172.20.0.x)
|
v port 53
Pi-hole FTL (172.20.0.6)
| blokkerer annonser/trackere
| svarer pa lokale DNS-oppforinger (pihole.toml hosts + dnsmasq includes)
|
v port 5335 (loopback)
Unbound (rekursiv resolver)
| spor rot-servere direkte
v
Root DNS servers
```
**Ingen ekstern DNS-forwarder** — Unbound gjor full rekursiv oppslag direkte mot rot-serverne.
|
||||||
| SSH-04: VS Code Remote + OAuth callback-servere krever port-forwarding | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-ssh-server.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### SSH-04: VS Code Remote + OAuth callback-servere krever port-forwarding
- **Symptom:** Codex CLI (eller andre dev-verktøy med OAuth) åpner browser-redirect til `http://localhost:PORT/auth/callback` — men koblingen feiler med "connection refused" eller siden henger uten respons
- **Årsak:** Verktøyet starter en lokal OAuth callback-server på serveren (f.eks. `127.0.0.1:1455`). Browseren kjører lokalt på din maskin — ikke på serveren — og kan ikke nå server-porten direkte
- **Løsning:**
1. VS Code Ports-panel: Åpne "PORTS"-fanen → klikk "Forward a Port" → skriv inn portnummeret (f.eks. `1455`) → start OAuth-flyten på nytt
2. Eller manuelt fra terminal: `ssh -L 1455:127.0.0.1:1455 heine@172.20.0.94`
- Porten MÅ være forwardet **FØR** du starter auth-flyten
- **Gjelder:** Codex CLI (port 1455), GitHub CLI (port variabel), alle andre OAuth-baserte dev-verktøy
- **Kilde:** Audit 0014, 2026-03-19
### SSH-05: `getent hosts localhost` returnerer kun `::1` (IPv6)
- **Symptom:** `getent hosts localhost` returnerer kun `::1` selv om `/etc/hosts` inneholder `127.0.0.1 localhost`
- **Årsak:** systemd-resolved returnerer begge adresser via NSS, men `getent` prioriterer IPv6. `resolvectl query localhost` viser begge adresser korrekt
- **Dette er ikke et DNS-problem** — det er normal IPv4/IPv6 dual-stack-oppførsel
- **Verifiser:** `resolvectl query localhost` → skal vise både `127.0.0.1` og `::1`
- **Kilde:** Audit 0014, 2026-03-19
---
## Changelog
### v1.0 - 2026-02-28
- Initial version basert på brukerens Windows SSH config (HERMES)
- Dokumentert begge jump hosts (VM 113 kontoret, ub-sshtunnel hjemme)
- NAT-konfigurasjon, tilgangsmetoder, og klient-kontekster
- Anbefaling for delt SSH config via Include-direktiv
|
||||||
| Verification and Testing | operations/magitek-server-ops/kontoret/services | knowledge | low | CURRENT-ssh-server.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### Verification and Testing
Verify SSH config is correctly parsed:
```bash
ssh -G TU-px5 | grep -E "^(hostname|proxyjump|user)"
# Output:
# user heine
# proxyjump jump-hjemme
# hostname 192.168.86.116
```
List all available hosts:
```bash
ssh -G * 2>/dev/null | grep -E "^host " | sort | uniq
```
Test a tunneled connection (dry-run):
```bash
ssh -vvv TU-px5 exit # Verbose output shows ProxyJump chain
```
### Edge Cases: Windows Forward Slashes
On Windows (HERMES, ORION), SSH config Include paths must use **forward slashes** even though Windows paths use backslashes:
Correct (Windows):
```
Include C:/Users/heine/Nextcloud/DevOps/ssh-config/00-defaults
```
Incorrect:
```
Include C:\Users\heine\Nextcloud\DevOps\ssh-config\00-defaults
```
This is due to SSH config parser expecting Unix-style paths. When using symlinks (mklink), SSH follows them correctly.
---
## Sikkerhet
- Jump-serverne er **eneste ekstern SSH-inngang** til begge LAN
- Alle andre servere er kun tilgjengelig via LAN eller via jump host
- ForwardAgent er aktivert i mange SSH config-entries — vær bevisst på agent forwarding-risiko
- Port 12322 er valgt (ikke standard 22) for å unngå støy fra script kiddies
---
## Kjente Gotchas
### SSH-01: px5.magitek.no:22 er IKKE åpen
- **Symptom:** `ssh root@px5.magitek.no` → Connection timed out
- **Årsak:** Kun port 12322 er NATet, ikke 22
- **Løsning:** Bruk `-J heine@81.167.27.54:12322` som jump, deretter SSH til px5 LAN IP (192.168.86.116)
### SSH-02: Host key verification failure på NPM
- **Symptom:** `ssh heine@172.20.0.42` → Host key verification failed
- **Årsak:** NPM-serverens host key ikke i known_hosts
- **Løsning:** `ssh-keyscan 172.20.0.42 >> ~/.ssh/known_hosts`
### SSH-03: ForwardAgent risiko
- **Symptom:** Mange hosts har `ForwardAgent yes`
- **Årsak:** Bekvemmelighet for multi-hop SSH
- **Risiko:** Kompromittert mellomserver kan misbruke forwarded keys
- **Løsning:** Vurder å begrense ForwardAgent til kun jump hosts
|
||||||
| Naming Conventions | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-ssh-server.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### Naming Conventions
**Host alias prefixes:**
- `TU-{host}` — Tunneled version of a host (requires ProxyJump via jump server)
- `LAN-{host}` — Direct LAN-only access (no tunnel needed)
- No prefix — Used when context is clear (jump hosts, defaults)
**Examples:**
```bash
ssh laravelserver-v11 # Direct (on same LAN)
ssh TU-px5 # Tunneled (via jump-hjemme if on kontoret, or vice versa)
ssh jump-kontoret # Jump host itself
ssh heine@TU-nextcloud # Explicit user on tunneled host
```
### Content of Shared Config Files
**00-defaults** (global SSH settings):
```
Host *
AddKeysToAgent yes
IdentitiesOnly yes
StrictHostKeyChecking accept-new
UserKnownHostsFile ~/.ssh/known_hosts
ServerAliveInterval 300
ServerAliveCountMax 2
ControlMaster auto
ControlPath ~/.ssh/control-%h-%p-%r
```
**10-jump-hosts** (jump host definitions):
```
Host jump-kontoret
HostName 62.97.227.206
Port 12322
User heine
ForwardAgent yes
Host jump-hjemme
HostName 81.167.27.54
Port 12322
User heine
ForwardAgent yes
```
**20-kontoret-direct** (kontoret LAN, no tunnel needed):
```
Host laravelserver-v11
HostName 172.20.0.94
User heine
Host npm-kontoret
HostName 172.20.0.42
User heine
Host docker1
HostName 172.20.0.104
User heine
Host ssh-server
HostName 172.20.0.95
User heine
```
**30-hjemme-direct** (hjemme LAN, no tunnel needed from hjemme location):
```
Host px5
HostName 192.168.86.116
User root
Host px1
HostName 192.168.86.10
User root
Host wp-01
HostName 192.168.86.166
User heine
Host nextcloud
HostName 192.168.86.233
User heine
```
**40-tunnels-local** (machine-specific, local only):
For **laravelserver-v11** (on kontoret, tunnels to hjemme):
```
Host TU-px5
HostName 192.168.86.116
ProxyJump jump-hjemme
User root
Host TU-px1
HostName 192.168.86.10
ProxyJump jump-hjemme
User root
Host TU-nextcloud
HostName 192.168.86.233
ProxyJump jump-hjemme
User heine
Host TU-wp-01
HostName 192.168.86.166
ProxyJump jump-hjemme
User heine
```
For **HERMES** (on hjemme, tunnels to kontoret):
```
Host TU-laravelserver-v11
HostName 172.20.0.94
ProxyJump jump-kontoret
User heine
Host TU-npm-kontoret
HostName 172.20.0.42
ProxyJump jump-kontoret
User heine
Host TU-docker1
HostName 172.20.0.104
ProxyJump jump-kontoret
User heine
```
For **ORION** (on kontoret, tunnels to hjemme): Same as laravelserver-v11.
|
||||||
| Linux Sync: laravelserver-v11 | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-ssh-server.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### Linux Sync: laravelserver-v11
The Linux server uses a cron job to sync shared files from Nextcloud WebDAV every 15 minutes.
**Sync script location:** `~/.ssh/sync-ssh-config.sh`
```bash
#!/bin/bash
# Sync SSH config files from Nextcloud WebDAV
NEXTCLOUD_URL="https://nc.magitek.no/remote.php/dav/files/admin/DevOps/ssh-config"
CREDS="admin:Ansjos123456"
CONFIG_D="$HOME/.ssh/config.d"
mkdir -p "$CONFIG_D"
# Sync only shared files (00, 10, 20, 30)
for file in 00-defaults 10-jump-hosts 20-kontoret-direct 30-hjemme-direct; do
curl -s -u "$CREDS" "$NEXTCLOUD_URL/$file" -o "$CONFIG_D/$file"
done
chmod 600 "$CONFIG_D"/*
```
**Cron entry:**
```
*/15 * * * * ~/.ssh/sync-ssh-config.sh
```
Verify sync status:
```bash
ls -la ~/.ssh/config.d/
# Check modification times — should be recent if cron is running
```
### Windows Sync: HERMES and ORION
Both Windows machines use the **Nextcloud desktop client** installed and running with sync enabled.
**Setup (run once as Administrator):**
```powershell
# 1. Ensure Nextcloud client is installed and `DevOps/ssh-config/` is synced locally
$nc = "C:\Users\heine\Nextcloud\DevOps\ssh-config"
if (-not (Test-Path $nc)) {
Write-Error "Nextcloud sync folder not found at $nc"
exit 1
}
# 2. Create config.d folder
mkdir -Force C:\Users\heine\.ssh\config.d | Out-Null
# 3. Create main config file with Include directive
@"
Include config.d/*
"@ | Set-Content C:\Users\heine\.ssh\config -Encoding UTF8
# 4. Create symlinks to Nextcloud-synced files (requires mklink or junction)
cmd /c mklink "C:\Users\heine\.ssh\config.d\00-defaults" "$nc\00-defaults"
cmd /c mklink "C:\Users\heine\.ssh\config.d\10-jump-hosts" "$nc\10-jump-hosts"
cmd /c mklink "C:\Users\heine\.ssh\config.d\20-kontoret-direct" "$nc\20-kontoret-direct"
cmd /c mklink "C:\Users\heine\.ssh\config.d\30-hjemme-direct" "$nc\30-hjemme-direct"
# 5. Copy appropriate machine-specific tunnel file
# For HERMES (tunnels to kontoret):
copy "$nc\40-tunnels-local.HERMES" "C:\Users\heine\.ssh\config.d\40-tunnels-local"
# For ORION (tunnels to hjemme):
# copy "$nc\40-tunnels-local.ORION" "C:\Users\heine\.ssh\config.d\40-tunnels-local"
# 6. Verify setup
ssh -G TU-px5
```
**Auto-sync:** Nextcloud client continuously monitors `DevOps/ssh-config/` and downloads changes within seconds.
|
||||||
| Centralized SSH Config (Nextcloud-synced) | operations/magitek-server-ops/kontoret/services | knowledge | low | CURRENT-ssh-server.md | 100 | 2026-03-20 02:00:44 |
|
Body:
## Centralized SSH Config (Nextcloud-synced)
### Architecture
Shared SSH configuration files are centrally stored in Nextcloud at `DevOps/ssh-config/` and synced to client machines:
**Shared files (alle maskiner):**
- `00-defaults` — Global SSH settings (StrictHostKeyChecking, AddKeysToAgent, etc.)
- `10-jump-hosts` — Jump host definitions for kontoret and hjemme
- `20-kontoret-direct` — Kontoret LAN hosts (172.20.0.x subnet)
- `30-hjemme-direct` — Hjemme LAN hosts (192.168.86.x subnet)
**Local files (machine-specific, NOT synced):**
- `40-tunnels-local` — ProxyJump tunnel definitions unique to each machine's location and role
This architecture enables:
- Single source of truth for global SSH settings and stable host configurations
- Consistent host naming across all machines
- Machine-specific tunnel routing without editing shared files
- Easy onboarding of new machines by just creating their `40-tunnels-local`
### File Structure
Per-machine `~/.ssh/` layout:
```
~/.ssh/
├── config # Single line: Include config.d/*
├── config.d/
│ ├── 00-defaults # (synced from Nextcloud)
│ ├── 10-jump-hosts # (synced from Nextcloud)
│ ├── 20-kontoret-direct # (synced from Nextcloud)
│ ├── 30-hjemme-direct # (synced from Nextcloud)
│ └── 40-tunnels-local # (NOT synced) Machine-specific tunnels
└── SSH-CONFIG-README.md # Quick reference (optional)
```
The `config` file contains a single Include directive:
```
Include config.d/*
```
SSH reads all files in `config.d/` in alphabetical order, allowing modular organization and preventing conflicts.
### Sync Methods by Machine
| Machine | Platform | Location | Sync Method | 40-tunnels Target |
|---------|----------|----------|-------------|-------------------|
| **HERMES** (laptop) | Windows | Hjemme | Nextcloud desktop client (auto-sync) | Tunnels to kontoret |
| **laravelserver-v11** (server) | Linux | Kontoret | WebDAV cron job (every 15 min) | Tunnels to hjemme |
| **ORION** (workstation) | Windows | Kontoret | Nextcloud desktop client (auto-sync) | Tunnels to hjemme |
**Nextcloud WebDAV endpoint:**
- URL: `https://nc.magitek.no/remote.php/dav/files/admin/DevOps/ssh-config/`
- Credentials: `admin:Ansjos123456`
|
||||||
| NAT-konfigurasjon (pfsense hjemme) | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-ssh-server.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### NAT-konfigurasjon (pfsense hjemme)
```
Public: 81.167.27.54:12322
↓ pfsense NAT
LAN: 192.168.86.192:22 (ub-sshtunnel)
```
### Tilgang
| Metode | Detaljer |
|--------|----------|
| SSH (fra hjemme LAN) | `ssh heine@192.168.86.192` |
| SSH (fra kontoret/eksternt) | `ssh -p 12322 heine@81.167.27.54` |
| SSH (via Windows alias, HERMES) | `ssh Opprette_ssh-tunnel` (med LocalForward) |
| Via Proxmox | Trenger VM/CT ID (TODO) |
### Bruk som jump host
```bash
# Fra server på kontoret (laravelserver-v11) → hjemme
ssh -J heine@81.167.27.54:12322 root@192.168.86.116 # → px5
ssh -J heine@81.167.27.54:12322 root@192.168.86.166 # → wp-01
ssh -J heine@81.167.27.54:12322 heine@192.168.86.233 # → nextcloud
# I Windows SSH config (ProxyJump-syntaks, fra ORION)
Host TU-Nextcloud
HostName 192.168.86.233
ProxyJump heine@81.167.27.54:12322
User heine
```
---
## Klient-kontekster og SSH Config
### Tre klienter — tre forskjellige configs
| Klient | Plattform | SSH Config-sti | Tunnel-retning |
|--------|-----------|----------------|----------------|
| **laravelserver-v11** | Linux | `/home/heine/.ssh/config` (TODO: opprett) | → hjemme via 81.167.27.54:12322 |
| **HERMES** (laptop) | Windows | `C:\Users\heine\.ssh\config` | → kontoret via 62.97.227.206:12322 |
| **ORION** (arbeidsstasjon) | Windows | `C:\Users\heine\.ssh\config` | → hjemme via 81.167.27.54:12322 |
### Navnekonvensjon i SSH config
- **TU-** prefix = Tunnelert host (krever ProxyJump)
- **LAN-** prefix = Direkte LAN-tilgang (ingen tunnel)
- **(heine)/(root)** suffix = Bruker
### Delt SSH Config — IMPLEMENTERT (2026-02-28)
Modulær SSH config med delte filer via Nextcloud og maskin-spesifikke tunnel-filer.
**Struktur på alle maskiner:**
```
~/.ssh/
├── config ← "Include config.d/*" (én linje)
├── config.d/
│ ├── 00-defaults ← Symlink → Nextcloud (DELT)
│ ├── 10-jump-hosts ← Symlink → Nextcloud (DELT)
│ ├── 20-kontoret-direct ← Symlink → Nextcloud (DELT)
│ ├── 30-hjemme-direct ← Symlink → Nextcloud (DELT)
│ └── 40-tunnels-local ← Lokal fil (MASKIN-SPESIFIKK!)
├── templates/ ← Referanse-filer (ikke i config.d!)
│ ├── 40-tunnels-local.HERMES
│ └── 40-tunnels-local.ORION
└── SSH-CONFIG-README.md ← Dokumentasjon
```
**VIKTIG:** Kun aktive config-filer i `config.d/` — SSH parser ALT der via `Include`.
**Navnekonvensjon:**
- `TU-{host}` = Tunnelert versjon av `{host}` (via ProxyJump)
- `jump-kontoret` = Jump host for kontoret (62.97.227.206:12322)
- `jump-hjemme` = Jump host for hjemme (81.167.27.54:12322)
**Synk-regler:**
- `00-defaults`, `10-jump-hosts`, `20-kontoret-direct`, `30-hjemme-direct` → **Nextcloud-synk**
- `40-tunnels-local` → **ALDRI synkes** (ulik per maskin)
- `.HERMES` og `.ORION` filene er referanser — kopier riktig en til `40-tunnels-local`
**Bruk:**
```bash
# Direkte (kontoret LAN, ingen tunnel)
ssh laravelserver-v11 # → heine@172.20.0.94
# Via tunnel (hjemme fra kontoret)
ssh TU-px5 # → root@192.168.86.116 via jump-hjemme
ssh TU-nextcloud # → heine@192.168.86.233 via jump-hjemme
# Verifiser config parsing
ssh -G TU-px5 | grep proxyjump # → proxyjump jump-hjemme
```
**Nextcloud-synk:**
- **Server:** nc.magitek.no (192.168.86.233)
- **Synk-mappe på Nextcloud:** `/DevOps/ssh-config/`
- **Lokal synk-sti (Windows):** `C:\Users\heine\Nextcloud\DevOps\ssh-config\`
- **Desktop-klient:** Installert på HERMES + ORION, synker automatisk
**Oppsett på Windows (HERMES/ORION) — kjøres én gang som Administrator:**
```powershell
# 1. Opprett mapper
mkdir C:\Users\heine\.ssh\config.d
# 2. Hovedfil
Set-Content C:\Users\heine\.ssh\config -Value "Include config.d/*"
# 3. Symlinker til Nextcloud-synkede filer
$nc = "C:\Users\heine\Nextcloud\DevOps\ssh-config"
cmd /c mklink "C:\Users\heine\.ssh\config.d\00-defaults" "$nc\00-defaults"
cmd /c mklink "C:\Users\heine\.ssh\config.d\10-jump-hosts" "$nc\10-jump-hosts"
cmd /c mklink "C:\Users\heine\.ssh\config.d\20-kontoret-direct" "$nc\20-kontoret-direct"
cmd /c mklink "C:\Users\heine\.ssh\config.d\30-hjemme-direct" "$nc\30-hjemme-direct"
# 4. Maskin-spesifikk tunnel-fil (HERMES eller ORION)
copy "$nc\40-tunnels-local.HERMES" "C:\Users\heine\.ssh\config.d\40-tunnels-local"
# ORION: copy "$nc\40-tunnels-local.ORION" "C:\Users\heine\.ssh\config.d\40-tunnels-local"
# 5. Verifiser
ssh -G TU-px5
```
**Referanseimplementering:** `/home/heine/.ssh/config.d/` på laravelserver-v11 (fullt operativ, verifisert).
Serveren har ingen Nextcloud-klient — filer ligger direkte (ikke symlinket).
---
|
||||||
| Oversikt | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-ssh-server.md | 100 | 2026-03-20 02:00:44 |
|
Body:
# Infrastructure Sub-Expert: SSH Jump Servers
**Version:** 1.0
**Date:** 2026-02-28
**Parent:** coordination/experts/operations/magitek-server-ops/CURRENT.md
**Load:** coordination/experts/operations/magitek-server-ops/CURRENT-ssh-server.md
---
## Oversikt
Magitek-infrastrukturen bruker **to SSH jump hosts** — én per lokasjon — for å muliggjøre cross-site tilgang. Begge eksponeres via pfsense NAT på port 12322.
---
## Jump Host: Kontoret (VM 113)
| Egenskap | Verdi |
|----------|-------|
| **Hostname** | ssh-server |
| **VM/CT ID** | 113 |
| **Type** | VM (Ubuntu) |
| **Proxmox Host** | px1 |
| **LAN IP** | 172.20.0.95 |
| **Lokasjon** | Kontoret (Kolskogheiane 12) |
| **OS** | Ubuntu (TODO: bekreft versjon) |
| **Rolle** | SSH jump host — gir ekstern tilgang til kontorets LAN |
| **Status** | Aktiv |
### NAT-konfigurasjon (pfsense kontoret)
```
Public: 62.97.227.206:12322
↓ pfsense NAT
LAN: 172.20.0.95:22 (VM 113, ssh-server)
```
### Tilgang
| Metode | Detaljer |
|--------|----------|
| SSH (fra kontoret LAN) | `ssh heine@172.20.0.95` |
| SSH (fra hjemme/eksternt) | `ssh -p 12322 heine@62.97.227.206` |
| SSH (via Windows alias, HERMES) | `ssh ssh_server_nativja.no` eller `ssh SSH_server_magitek` |
| Via Proxmox | `pct exec 113 -- kommando` (hvis LXC) eller `qm guest exec 113 -- kommando` (hvis VM) |
### Bruk som jump host
```bash
# Fra laptop hjemme (HERMES) → kontoret
ssh -J heine@62.97.227.206:12322 heine@172.20.0.94 # → reportmaker
ssh -J heine@62.97.227.206:12322 heine@172.20.0.42 # → NPM
ssh -J heine@62.97.227.206:12322 heine@172.20.0.104 # → docker1
# I Windows SSH config (ProxyJump-syntaks)
Host TU-Laravelserver-v-11(heine)
HostName 172.20.0.94
ProxyJump heine@62.97.227.206:12322
User heine
```
---
## Jump Host: Hjemme (ub-sshtunnel)
| Egenskap | Verdi |
|----------|-------|
| **Hostname** | ub-sshtunnel |
| **VM/CT ID** | TODO: bekreft |
| **Type** | VM/CT (Ubuntu) |
| **Proxmox Host** | px5 |
| **LAN IP** | 192.168.86.192 |
| **Lokasjon** | Hjemme (Skeisstøa 37c) |
| **OS** | Ubuntu (TODO: bekreft versjon) |
| **Rolle** | SSH jump host — gir ekstern tilgang til hjemme-LANet |
| **Status** | Aktiv |
|
||||||
| v1.2 - 2026-03-01 | operations/magitek-server-ops/kontoret/services | knowledge | info | CURRENT-npm-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### v1.2 - 2026-03-01
- Proxy host ID 17: zyxel1920.nativja.no (stunnel → ZyXEL XS1920)
- Forward scheme: https, port 8443, advanced config: `proxy_ssl_verify off;`
- SSL certificate ID 18: zyxel1920.nativja.no (utløper 2026-05-30)
- Access list 5 "LAN_Kontor_hjemme_Scandic" nå med 4 proxy hosts
- Dokumentert access lists-tabell
- Stunnel proxy (CT 133, 172.20.0.5:8443) som backend for ZyXEL switch
### v1.1 - 2026-02-28 (Update 2)
- Lagt til WebGUI og SSH credentials (nå i CURRENT-credentials.md)
- Gotcha NPM-K-02: Dokumentert agent-endret passord
- Gotcha NPM-K-03: Packeton packages.json autentisering-krav
- Gotcha NPM-K-04: NPM API token-format og levetid
- Packeton: Added deploy key for GitHub, DNS info, auth requirements
- Klargjort at brukeren må verifisere hvilken passord som fungerer
### v1.0 - 2026-02-28
- Initial versjon — kartlegging under TASK-009 (packages.magitek.no oppsett)
- Hostname: nginxpm-ub2404, IP: 172.20.0.42, Ubuntu 24.04
- Docker compose i /home/heine/, SQLite DB (ikke MariaDB)
- Packeton-container pa port 8088
- NPM API-passord tilbakestilt og dokumentert
- packages.magitek.no proxy host (ID 16) + SSL-sertifikat (ID 17) opprettet
- Gotchas NPM-K-01 til NPM-K-04 dokumentert
|
||||||
| v1.7 - 2026-03-04 | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-npm-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### v1.7 - 2026-03-04
- 10.0.0.0/24 (WireGuard road warrior subnet) lagt til alle 25 proxy host nginx-configs
- WG road warrior-klienter (HERMES 10.0.0.2) fikk 401/basic auth uten denne endringen
- Oppdatert NPM-K-09 og access list-tabell
### v1.6 - 2026-03-04
- Dokumentert gotcha NPM-K-08: zyxel1920.magitek.no krever `proxy_ssl_verify off` (stunnel selvsignert) og `proxy_set_header Cookie ""` (gammel ZyXEL-firmware)
- Dokumentert gotcha NPM-K-09: 192.168.86.0/24 lagt til alle 25 proxy host nginx-configs for WireGuard-tilgang fra hjemme. ADVARSEL: direkte nginx-endringer overskives hvis proxy host redigeres i NPM GUI. Permanent fix: oppdater Access List ID 5 i NPM GUI.
### v1.5 - 2026-03-04
- **Wildcard SSL `*.magitek.no` via DNS-01 challenge** (Cloudflare API) — cert ID 48
- Alle 16 *.magitek.no proxy hosts byttet fra individuelle HTTP-01 cert til wildcard
- 16 Cloudflare CNAME-records slettet — interne tjenester ikke lenger offentlig eksponert
- DNS for interne domener nå KUN via Pi-hole (172.20.0.6 kontoret / 192.168.86.2 hjemme)
- certbot-dns-cloudflare installert i NPM container, credentials i /data/cloudflare.ini
- Auto-renewal cron (mandager kl 03:00): `tools/ssl-renewal/renew-magitek-wildcard.sh`
- MERK: certbot-dns-cloudflare forsvinner ved container-restart — renewal-script reinstallerer
### v1.4 - 2026-03-04
- 11 nye SSL-sertifikater (cert 36-46) for alle proxy hosts som manglet SSL
- Ny proxy host: pihole-kolsk.magitek.no (ID 30, cert 47) for Pi-hole kontoret admin
- Alle 27 proxy hosts har nå gyldig Let's Encrypt SSL med ssl_forced=true
- SSL fikset via certificate_id="new" metoden (NPM proxy host PUT)
### v1.3 - 2026-03-04
- 9 nye proxy hosts for *.magitek.no migrering fra *.nativja.no (ID 21-29)
- Proxmox-servere: px1, pmox10, pmox15 (alle med websocket support)
- Infrastruktur: pfsense-kolsk, npm-kolsk, zyxel1920, freshtomato, mainwp, todo
- SSL-sertifikater: VENTER på Cloudflare NS-propagasjon
- Navnekonvensjon: -kolsk = kontoret, -skeis = hjemme
|
||||||
| Sjekk NPM-logg | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-npm-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### Sjekk NPM-logg
```bash
ssh heine@172.20.0.42 "docker logs heine-app-1 --tail 50"
```
### Restart NPM
```bash
ssh heine@172.20.0.42 "cd /home/heine && docker compose restart app"
```
## Access Lists (for NPM proxy host access control)
| ID | Navn | Klienter | Proxy hosts |
|----|------|----------|-------------|
| 1 | IP adresser | ? | 7 |
| 3 | password | ? | 0 |
| 5 | LAN_Kontor_hjemme_Scandic | 172.20.0.0/24, 192.168.86.0/24*, 10.0.0.0/24*, 62.97.227.206, 81.167.27.54, 193.212.224.198 | 4 (inkl. zyxel1920) |
> \* 192.168.86.0/24 og 10.0.0.0/24 er kun i nginx-configs (direkte endring), IKKE i NPM GUI ennå.
**ID 6 "Local LAN Only"** ble opprettet og umiddelbart slettet — ikke nødvendig.
## Changelog
### v2.2 - 2026-03-19
- Monitoring proxy hosts dokumentert: ID 36 (monitoring-k.magitek.no → 172.20.0.76:3000, cert=57) og ID 37 (monitoring.magitek.no → 192.168.86.162:3000, cert=56)
- Dedikerte LE-certs (56, 57) for monitoring — wildcard cert 48 utlopt, monitoring bruker individuelle HTTP-01 certs
- Sources: MP-0011, Session b6bb8896 (2026-03-18)
### v2.1 - 2026-03-18
- NPM proxy host ID 35 opprettet for syncrovanis.magitek.no → http://172.20.0.94:80, cert=48, ssl_forced=1, ACL=5
- Gammel soft-deleted proxy host 33/34 fjernet fra DB (blokkerte ny opprettelse)
- Pi-hole begge lokasjonene oppdatert: syncrovanis.magitek.no → 172.20.0.42 (NPM)
- Gotcha NPM-K-10 oppdatert: syncrovanis bruker nå NPM proxy med wildcard cert
### v2.0 - 2026-03-18
- Gotcha NPM-K-10: syncrovanis.magitek.no trenger IKKE NPM — kun Pi-hole DNS (utdatert, se v2.1)
### v1.9 - 2026-03-13
- Docker MCP-seksjon lagt til — `mcp-docker-server` med SSH socket-forwarding
- Ny systemd user service `docker-npm-tunnel.service` for persistent tunnel
- GOTCHA: mcp-docker-server støtter kun lokal socket, ikke ssh:// DOCKER_HOST
### v1.8 - 2026-03-05
- Packeton: ny pakke `magitek/kb-system` v1.0.0 registrert
- Ny deploy key `github-kb` (ed25519) for `heinesalbu/kb-system` (privat GitHub-repo)
- Pakken installert i ReportMaker (artisan kb:*) og magitek-ops (vendor/bin/kb)
- Oppdatert Packeton-seksjon med registrerte pakker-tabell og deploy keys-tabell
|
||||||
| NPM-K-13: HSTS tvinger HTTPS for ALLE *.magitek.no-domener | operations/magitek-server-ops/kontoret/services | knowledge | low | CURRENT-npm-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### NPM-K-13: HSTS tvinger HTTPS for ALLE *.magitek.no-domener
- **Symptom:** Intern tjeneste på kun HTTP fungerer i curl men ikke i nettleser
- **Rotårsak:** NPM sender `Strict-Transport-Security: max-age=63072000; preload` for alle proxy hosts. Nettlesere cacher dette og tvinger HTTPS for hele *.magitek.no-domenet.
- **Leksjon:** ALLE interne tjenester under *.magitek.no MÅ gå gjennom NPM med wildcard cert, selv om de kun er tilgjengelige internt. HTTP-only funker ikke i nettlesere etter besøk av andre *.magitek.no-sider.
## Vanlige Operasjoner
### SSH til NPM kontoret
```bash
ssh heine@172.20.0.42
```
### Hent NPM API-token
```bash
# Hent credentials fra CURRENT-credentials.md → NPM Kontoret, deretter:
cat > /tmp/login.json << 'EOF'
{"identity":"<email>","secret":"<passord>"}
EOF
ssh heine@172.20.0.42 "curl -s http://localhost:81/api/tokens -X POST -H 'Content-Type: application/json' -d @/tmp/login.json"
```
### List proxy hosts
```bash
TOKEN="..."
ssh heine@172.20.0.42 "curl -s http://localhost:81/api/nginx/proxy-hosts -H 'Authorization: Bearer $TOKEN' | python3 -m json.tool"
```
### List SSL-sertifikater
```bash
TOKEN="..."
ssh heine@172.20.0.42 "curl -s http://localhost:81/api/nginx/certificates -H 'Authorization: Bearer $TOKEN' | python3 -m json.tool"
```
### Opprett proxy host (HTTP)
```bash
cat > /tmp/create_proxy.json << 'EOF'
{
"domain_names": ["nytt-domene.magitek.no"],
"forward_scheme": "http",
"forward_host": "172.20.0.XX",
"forward_port": 80,
"block_exploits": false,
"allow_websocket_upgrade": false,
"access_list_id": 0,
"certificate_id": 0,
"ssl_forced": false,
"http2_support": false,
"meta": {"letsencrypt_agree": false},
"advanced_config": "",
"locations": []
}
EOF
TOKEN="..."
ssh heine@172.20.0.42 "curl -s http://localhost:81/api/nginx/proxy-hosts -X POST -H 'Content-Type: application/json' -H 'Authorization: Bearer $TOKEN' -d @/tmp/create_proxy.json"
```
### Aktiver SSL pa eksisterende proxy host
```bash
# Erstatt PROXY_ID med faktisk ID
cat > /tmp/update_ssl.json << 'EOF'
{
"domain_names": ["domene.magitek.no"],
"forward_scheme": "http",
"forward_host": "172.20.0.XX",
"forward_port": 80,
"block_exploits": false,
"allow_websocket_upgrade": false,
"access_list_id": 0,
"certificate_id": "new",
"ssl_forced": true,
"http2_support": true,
"meta": {
"letsencrypt_agree": true,
"dns_challenge": false,
"letsencrypt_email": "heine@magitek.no"
},
"advanced_config": "",
"locations": []
}
EOF
TOKEN="..."
ssh heine@172.20.0.42 "curl -s http://localhost:81/api/nginx/proxy-hosts/PROXY_ID -X PUT -H 'Content-Type: application/json' -H 'Authorization: Bearer $TOKEN' -d @/tmp/update_ssl.json"
```
|
||||||
| NPM-K-11: Soft-deleted proxy hosts blokkerer nye domener — API kan IKKE slette dem | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-npm-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### NPM-K-11: Soft-deleted proxy hosts blokkerer nye domener — API kan IKKE slette dem
- **Symptom:** NPM API returnerer `{"error":{"code":400,"message":"domain.no is already in use"}}` ved opprettelse av ny proxy host
- **Rotårsak:** Rader med `is_deleted=1` i `proxy_host`-tabellen blokkerer fortsatt domeneregistrering. API returnerer 404 ved forsøk på å slette dem (`DELETE /api/nginx/proxy-hosts/<id>`)
- **Løsning:** Slett radene direkte fra SQLite DB, deretter reload nginx:
```bash
docker cp heine-app-1:/data/database.sqlite /tmp/npm-db.sqlite
# Sjekk: python3 -c "import sqlite3; ..."
# Slett via python-script i containeren
docker exec heine-app-1 nginx -s reload
```
### NPM-K-12: Container restart laster IKKE ny nginx-konfig for nye proxy hosts
- **Symptom:** Ny proxy host opprettet via API, men `curl -sk https://...` gir TLS `unrecognized name` feil
- **Rotårsak:** `docker compose restart app` restarter prosessen, men NPM regenererer ikke alltid nginx-config ved restart
- **Løsning:** Kjør `docker exec heine-app-1 nginx -s reload` ETTER proxy host-opprettelse
- **Sjekk:** `docker exec heine-app-1 ls /data/nginx/proxy_host/` — configen skal eksistere med riktig ID
### NPM-K-14: monitoring-k.magitek.no proxy peker til CT 137 DHCP-adresse (.76)
- **Konfigurasjon:** Proxy host ID 36 `monitoring-k.magitek.no → http://172.20.0.76:3000` (Grafana kontoret, CT 137)
- **KRITISK:** CT 137 har DHCP-adresse — faktisk IP er `172.20.0.76`, IKKE `.137` som hostname antyder
- **Risiko:** Hvis CT 137 DHCP-lease endres (f.eks. etter reboot av DHCP-server) kan .76 bli en annen maskin
- **Konsekvens av IP-endring:** `monitoring-k.magitek.no` slutter å fungere umiddelbart
- **Løsning ved IP-endring:** Oppdater proxy host ID 36 i NPM til ny IP (`docker exec` → NPM API PUT eller WebGUI)
- **Anbefalt tiltak:** Sett statisk IP på CT 137 (kontroller via `pct set 137 --net0 ip=172.20.0.76/24,...` på pmox10) og oppdater NPM om nødvendig
- **Se u5:** CT 137 er dokumentert i kontoret/proxmox-ekspertfil (mon-kontoret)
|
||||||
| NPM-K-07: SQLite DB-versjon ved restart | operations/magitek-server-ops/kontoret/services | knowledge | low | CURRENT-npm-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### NPM-K-07: SQLite DB-versjon ved restart
- NPM logger "Current database version: none" ved oppstart — dette er forventet (migrerings-log, ikke en feil)
- Tjenesten fungerer normalt
### NPM-K-08: zyxel1920.magitek.no krever proxy_ssl_verify off OG Cookie-header clear
- **Årsak 1:** Stunnel-proxy (CT 133, 172.20.0.5:8443) bruker selvsignert sertifikat — NPM må ha `proxy_ssl_verify off` i advanced config
- **Årsak 2:** Gammel ZyXEL-firmware tåler ikke store cookies (fra *.magitek.no-sider). Cookie-header må nullstilles: `proxy_set_header Cookie "";`
- **Advanced config for zyxel1920.magitek.no (proxy host ID 26):**
```nginx
proxy_ssl_verify off;
proxy_set_header Cookie "";
```
### NPM-K-09: 192.168.86.0/24 og 10.0.0.0/24 lagt til alle 25 proxy host access rules (direkte nginx-endring)
- **Bakgrunn:** WireGuard-tilgang fra hjemme (192.168.86.x) og WG road warrior (10.0.0.x) til kontoret blokkeres av NPM access lists som kun tillot 172.20.0.0/24
- **Gjort:** `allow 192.168.86.0/24` og `allow 10.0.0.0/24` lagt til i alle 25 nginx proxy host config-filer via direkte redigering
- **KRITISK ADVARSEL:** Dette er direkte endringer i nginx-konfigurasjonsfiler generert av NPM. Hvis en proxy host redigeres og lagres i NPM GUI, vil NPM regenerere nginx-configen og OVERSKRIVE denne endringen!
- **Permanent fix:** Oppdater Access List i NPM GUI (legg til 192.168.86.0/24 og 10.0.0.0/24 i de relevante access listene) — spesielt Access List ID 5 "LAN_Kontor_hjemme_Scandic"
- **Status 2026-03-04:** Direkte nginx-endring er aktiv. NPM GUI-oppdatering ikke gjort ennå.
### NPM-K-10: syncrovanis.magitek.no — NPM proxy med wildcard cert (OPPDATERT 2026-03-18)
- **Gammel status:** Proxy host 33/34 feilet pga HTTP-01 challenge. Opprinnelig satt opp som DNS-only.
- **Nytt oppsett (2026-03-18):** NPM proxy host **ID 35** med wildcard cert 48 (*.magitek.no, DNS-01).
- **Pi-hole kontoret (CT 108):** `syncrovanis.magitek.no → 172.20.0.42` (NPM)
- **Pi-hole hjemme (CT 101):** `syncrovanis.magitek.no → 172.20.0.42` (NPM)
- **Forward:** `http://172.20.0.94:80`, ssl_forced=1, cert=48, access_list=5
- **Leksjon:** Interne tjenester bør også bruke NPM + wildcard cert for HTTPS — nettlesere tvinger HTTPS via HSTS fra andre *.magitek.no-tjenester.
|
||||||
| Kjente Gotchas | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-npm-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
## Kjente Gotchas
### NPM-K-01: JSON-escaping i NPM API-kall via SSH
- Kall til NPM API via SSH + curl feiler med "Bad escaped character" hvis JSON inneholder spesialtegn (!, $, {}) i shell
- **Løsning:** Skriv JSON til fil (`/tmp/payload.json`) og bruk `curl -d @/tmp/payload.json`
- Se `CURRENT-credentials.md` for NPM API-innlogging
### NPM-K-02: NPM passord ble endret av agent
- En agent endret passordet via bcrypt-hash oppdatering i SQLite tabell `auth`
- **Status og detaljer:** Se `CURRENT-credentials.md` → NPM Kontoret
- **Tilbakestilling:** Generer ny bcrypt-hash via `docker exec heine-app-1 node /tmp/script.js` med `/app/node_modules/bcrypt` og oppdater DB
### NPM-K-03: Packeton packages.json krever autentisering
- `https://packages.magitek.no/packages.json` returnerer **401 Authorization Required** uten HTTP Basic auth
- **Løsning:** Konfigurer Composer med HTTP Basic auth:
```bash
composer config --global http-basic.packages.magitek.no admin Ansjos123
```
- **Bakgrunn:** Packeton-containeren på port 8088 krever autentisering på offentlige endpoints
### NPM-K-04: NPM API token-format og levetid
- Token fra `/api/tokens` returneres som JSON med `token`-felt
- Bruk som: `curl -H 'Authorization: Bearer TOKEN' ...`
- Token er kortlevd — hent ny token for hver agentlei eller lange operasjoner
- **Eksempel:**
```bash
# Hent credentials fra CURRENT-credentials.md, deretter:
TOKEN=$(ssh heine@172.20.0.42 'curl -s http://localhost:81/api/tokens -X POST -H "Content-Type: application/json" -d @/tmp/payload.json | python3 -c "import sys, json; print(json.load(sys.stdin)[\"token\"])"')
ssh heine@172.20.0.42 "curl -s http://localhost:81/api/nginx/proxy-hosts -H 'Authorization: Bearer $TOKEN'"
```
### NPM-K-05: Docker-compose i /home/heine
- Compose-fil er i `/home/heine/docker-compose.yml` (ikke /opt/)
- Starte/stoppe: `cd /home/heine && docker compose restart app`
### NPM-K-06: KRITISK — Nye *.magitek.no subdomener trenger CNAME for SSL
- **Symptom:** Let's Encrypt HTTP-01 challenge feiler med 404 for nye subdomener som matcher *.magitek.no wildcard (A-record 81.167.27.54)
- **Årsak:** WAN-IP 81.167.27.54 NAT-forwarder port 80 korrekt til NPM, men LE-validering feiler (mulig NAT-reflection-problem)
- **Løsning:** Opprett CNAME `hostclone.magitek.no → px10.magitek.no` i Webhuset DNS FØR du ber om LE-sertifikat
- **Alle fungerende *.magitek.no-tjenester bruker CNAME til px10.magitek.no (62.97.227.206)**
- Se også `CURRENT-webhuset-dns.md` gotcha WH-DNS-04
|
||||||
| Deploy keys for GitHub (i Packeton-containeren) | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-npm-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### Deploy keys for GitHub (i Packeton-containeren)
| Key-navn | Type | GitHub-repo | Formaal |
|----------|------|-------------|---------|
| `packeton@magitek.no` | ed25519 | (original, ukjent repo) | Opprinnelig deploy key |
| `github-kb` | ed25519 | `heinesalbu/kb-system` (privat) | KB-pakke deploy key |
### Registrerte pakker
| Pakke | Versjon | GitHub-repo | Beskrivelse |
|-------|---------|-------------|-------------|
| `magitek/kb-system` | v1.0.0 | `heinesalbu/kb-system` | Universelt KB-system (14k linjer, 41 PHP-filer). Namespace: `Magitek\KbSystem\` |
Installert i:
- **ReportMaker** (`/var/www/reportmaker`) — via `composer require`, bruker `artisan kb:*` (auto-discovery ServiceProvider)
- **magitek-ops** (`/var/www/magitek-ops`) — via path repo + `composer require`, bruker `vendor/bin/kb` CLI
KB CLI-kommandoer: `kb:ingest`, `kb:query`, `kb:context`, `kb:freshness`, `kb:extract-lessons`, `kb:archive-safe`
**Composer-konfigurasjon:**
```bash
composer config --global repositories.magitek composer https://packages.magitek.no
composer config --global http-basic.packages.magitek.no admin Ansjos123
```
**OBS:** packages.json krever HTTP Basic auth (401 Authorization Required uten credentials).
## Docker MCP (lagt til 2026-03-13)
**Docker MCP er tilgjengelig i Claude Code** via `mcp-docker-server`.
Kobler til Docker på denne maskinen (172.20.0.42) via SSH socket-forwarding.
| Egenskap | Verdi |
|----------|-------|
| **MCP-server** | `mcp-docker-server` |
| **Tilgang** | `unix:///tmp/docker-npm.sock` (forwarded via SSH-tunnel) |
| **Tunnel-service** | `systemctl --user status docker-npm-tunnel.service` |
| **Tunnel-metode** | SSH `-L /tmp/docker-npm.sock:/var/run/docker.sock heine@172.20.0.42` |
**GOTCHA:** `mcp-docker-server` støtter KUN lokal socket — ikke `ssh://` DOCKER_HOST.
Derfor kjøres en persistent systemd user service (`docker-npm-tunnel.service`) som forwarder
Docker-socketen via SSH til `/tmp/docker-npm.sock` på laravelserver-v11.
---
|
||||||
| SSL-sertifikater | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-npm-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
## SSL-sertifikater
### Wildcard (DNS-01 challenge via Cloudflare API) — UTLOPT
| ID | Domene | Utloper | Metode | Status |
|----|--------|---------|--------|--------|
| **48** | **\*.magitek.no + magitek.no** | **2026-03-04** | **DNS-01 (Cloudflare)** | **UTLOPT** |
**OBS:** Wildcard cert 48 utlop 2026-03-04. `provider=other`, `domain_names=[]` — importert cert, ikke auto-renewable. Nye subdomener (monitoring) bruker dedikerte LE HTTP-01 certs (56, 57). Eksisterende *.magitek.no proxy hosts som fortsatt peker til cert 48 har ugyldig SSL. Auto-renewal script: `tools/ssl-renewal/renew-magitek-wildcard.sh` (trenger oppdatering/kjoring)
### Individuelle (HTTP-01 challenge — nativja.no domener)
| ID | Domene | Utloper |
|----|--------|---------|
| 1 | nativja.no, www.nativja.no | 2026-04-29 |
| 2 | nx.nativja.no | 2026-05-21 |
| 6 | frappe.nativja.no | 2026-05-21 |
| 7 | magitek.nativja.no | 2026-04-03 |
| 18 | zyxel1920.nativja.no | 2026-05-30 |
| 38 | nativja1.nativja.no | 2026-06-02 |
| 45 | webserver1.nativja.no | 2026-06-02 |
### Dedikerte LE-certs (HTTP-01, monitoring — wildcard cert 48 utlopt)
| ID | Domene | Utloper | Metode |
|----|--------|---------|--------|
| 56 | monitoring.magitek.no | 2026-06-16 | HTTP-01 (LE) |
| 57 | monitoring-k.magitek.no | 2026-06-16 | HTTP-01 (LE) |
### Ubrukte (gamle individuelle *.magitek.no — erstattet av wildcard)
Cert ID 9, 11, 14, 15, 17, 26, 36, 37, 39, 40, 41, 42, 43, 44, 46, 47 — kan slettes
## NPM API
| Egenskap | Verdi |
|----------|-------|
| **API endpoint** | http://172.20.0.42:81/api/ |
| **Credentials** | Se `CURRENT-credentials.md` → NPM Kontoret |
## Packeton (Privat Composer-registry)
| Egenskap | Verdi |
|----------|-------|
| **Container** | heine-packeton-1 |
| **Image** | okvpn/packeton:latest |
| **Port** | 8088 (intern 80) |
| **DB** | SQLite (/data/packeton.db) |
| **Credentials** | Se `CURRENT-credentials.md` → Packeton |
| **Public URL** | https://packages.magitek.no |
| **Proxy host ID** | 16 (ID for packages.magitek.no i NPM) |
| **SSL cert ID** | 17 (Let's Encrypt, utløper 2026-05-29) |
| **DNS** | CNAME packages.magitek.no → px10.magitek.no (Webhuset) |
|
||||||
| Proxy Hosts (kartlagt 2026-02-28) | operations/magitek-server-ops/kontoret/services | knowledge | low | CURRENT-npm-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
## Proxy Hosts (kartlagt 2026-02-28)
| ID | Domene | Forward | Port | SSL cert ID | SSL |
|----|--------|---------|------|-------------|-----|
| 13 | ? | 172.20.0.94 | 8200 | 14 | Ja |
| 8 | ? | 172.20.0.107 | 80 | 6 | Ja |
| 2 | ? | 172.20.0.63 | 80 | 1 | Ja |
| 14 | ? | 192.168.86.94 | 8080 | 0 | Nei |
| 4 | ? (NPM-admin) | 172.20.0.42 | 81 | 2 | Ja |
| 16 | packages.magitek.no | 172.20.0.42 | 8088 | 17 | Ja |
| 17 | zyxel1920.nativja.no | 172.20.0.5 | 8443 | 18 | Ja |
| 18 | freshtomato.nativja.no | 172.20.0.2 | 80 | 20 | Ja (LE, Force SSL, HTTP/2) |
**TODO:** Kartlegg domene-navn for alle proxy hosts (ID 2, 4, 8, 13, 14).
### Proxy Host ID 17 — zyxel1920.nativja.no (ZyXEL Switch via Stunnel)
| Egenskap | Verdi |
|----------|-------|
| **Domene** | zyxel1920.nativja.no |
| **Forward scheme** | https |
| **Forward host** | 172.20.0.5 |
| **Forward port** | 8443 |
| **SSL certificate ID** | 18 (Let's Encrypt) |
| **Backend** | Stunnel proxy (CT 133, Ubuntu 20.04) |
| **Final target** | ZyXEL XS1920 switch (172.20.0.3:443) via legacy TLS |
| **Advanced config** | `proxy_ssl_verify off;` (stunnel uses self-signed cert) |
| **Access list ID** | 5 (LAN_Kontor_hjemme_Scandic) |
| **Purpose** | ZyXEL switch management interface with modern browsers |
**Flow:** Chrome → NPM (172.20.0.42:443, LE cert) → stunnel (172.20.0.5:8443, self-signed) → ZyXEL (172.20.0.3:443, legacy TLS)
Kjente proxy hosts:
- `reportmaker.magitek.no` → `http://172.20.0.94:80` (Apache/Laravel, ID=12)
- `packages.magitek.no` → `http://172.20.0.42:8088` (Packeton, ID=16)
- `duplicati-kolsk.magitek.no` → `http://172.20.0.69:8200` (Duplicati, ID=13, migrert fra laravelserver-v11 2026-03-05)
- `suitecrm.magitek.no` → `http://172.20.0.102:80` (ID=11)
- `skymirror.magitek.no` → `http://172.20.0.94:80` (ID=15)
- `hostclone.magitek.no` → `http://172.20.0.94:80` (Hostclone Dashboard, ID=20, ACL=5)
- `mainwp.nativja.no` → `http://172.20.0.111:80` (MainWP Dashboard, ID=19, ACL=5)
- `px1.magitek.no` → `https://172.20.0.34:8006` (Proxmox px1, ID=21, ACL=5, WS=true)
- `pmox10.magitek.no` → `https://172.20.0.32:8006` (Proxmox pmox10, ID=22, ACL=5, WS=true)
- `pmox15.magitek.no` → `https://172.20.0.33:8006` (Proxmox pmox15, ID=23, ACL=5, WS=true)
- `pfsense-kolsk.magitek.no` → `http://172.20.0.1:81` (pfSense kontoret, ID=24, ACL=5)
- `npm-kolsk.magitek.no` → `http://172.20.0.42:81` (NPM admin, ID=25, ACL=5)
- `zyxel1920.magitek.no` → `https://172.20.0.5:8443` (ZyXEL switch, ID=26, ACL=5)
- `freshtomato.magitek.no` → `http://172.20.0.2:80` (FreshTomato AP, ID=27, ACL=5)
- `mainwp.magitek.no` → `http://172.20.0.111:80` (MainWP, ID=28, ACL=5)
- `todo.magitek.no` → `http://172.20.0.93:8006` (Todo, ID=29, ACL=5)
- `pihole-kolsk.magitek.no` → `http://172.20.0.6:80` (Pi-hole admin, ID=30, ACL=5, advanced: redirect / to /admin/)
- `dam.magitek.no` → `http://172.20.0.94:80` (DAM, ID=32, ACL=5)
- `syncrovanis.magitek.no` → `http://172.20.0.94:80` (Syncrovanis Dashboard, ID=35, ACL=5, cert=48)
- `monitoring-k.magitek.no` → `http://172.20.0.76:3000` (Grafana kontoret, CT 137, ID=36, cert=57, LE dedikert)
- `monitoring.magitek.no` → `http://192.168.86.162:3000` (Grafana hjemme via WireGuard, CT 221, ID=37, cert=56, LE dedikert)
|
||||||
| Identitet | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-npm-kontoret.md | 100 | 2026-03-20 02:00:44 |
|
Body:
# Infrastructure Sub-Expert: NPM Kontoret (Nginx Proxy Manager)
**Version:** 2.0
**Date:** 2026-03-18 (v2.0)
**Parent:** coordination/experts/operations/magitek-server-ops/CURRENT.md
**Load:** coordination/experts/operations/magitek-server-ops/CURRENT-npm-kontoret.md
---
## Identitet
| Egenskap | Verdi |
|----------|-------|
| **Hostname** | nginxpm-ub2404 |
| **VM/CT ID** | ? (TODO: finn fra px1 qm/pct list) |
| **Type** | KVM VM pa px1 |
| **Proxmox Host** | px1 (kontoret) |
| **LAN IP** | 172.20.0.42 |
| **Lokasjon** | Kontoret (Kolskogheiane 12) |
| **OS** | Ubuntu 24.04 (bekreftet via hostname: nginxpm-ub2404) |
| **Rolle** | Reverse proxy + SSL-terminering for kontor-tjenester |
| **Status** | Aktiv (32+ dagers uptime per 2026-02-28) |
## Tilgang
| Metode | Detaljer |
|--------|----------|
| SSH | `ssh heine@172.20.0.42` |
| WebGUI | http://172.20.0.42:81 (NPM admin dashboard) |
| Credentials | Se `CURRENT-credentials.md` → NPM Kontoret |
**OBS:** Bruk `heine`-bruker, ikke root.
**OBS:** `sudo` krever passord. Docker-kommandoer via `docker ...` fungerer direkte (heine er i docker-gruppen).
## Docker Stack
**Compose-fil:** `/home/heine/docker-compose.yml`
| Container | Image | Status | Porter |
|-----------|-------|--------|--------|
| heine-app-1 | jc21/nginx-proxy-manager:latest | Running | 80, 81, 443 |
| heine-packeton-1 | okvpn/packeton:latest | Running | 0.0.0.0:8088->80/tcp |
**Volumer (NPM):**
- `./data` → `/data` (nginx config, proxy hosts, SQLite DB)
- `./letsencrypt` → `/etc/letsencrypt` (SSL-sertifikater)
**DB:** SQLite på `/data/database.sqlite` (ikke MariaDB — ingen DB-container)
### SQLite DB-tilgang og skjema
```bash
# Tilgang (sqlite3 finnes IKKE i containeren — bruk python3 eller kopier DB)
docker cp heine-app-1:/data/database.sqlite /tmp/npm-db.sqlite
python3 -c "import sqlite3; ..."
# Eller docker cp tilbake etter endringer
```
**Viktige tabeller:**
- `proxy_host` — kolonner: `id`, `domain_names` (JSON), `forward_host`, `forward_port`, `forward_scheme`, `certificate_id`, `ssl_forced`, `access_list_id`, `enabled`, `is_deleted`, `advanced_config`
- `certificate` — kolonner: `id`, `provider`, `nice_name`, `domain_names` (JSON), `expires_on`, `is_deleted`
- `user` — kolonner: `id`, `email`, `name`, `is_deleted`
- `auth` — kolonner: `id`, `user_id`, `type`, `secret` (bcrypt hash)
**OBS:** Kolonnen heter `is_deleted` (IKKE `is_disabled`). Mange agenter antar feil navn.
|
||||||
| MCP-SERVERS-03: SSH-tunnel allerede i bruk — sjekk for lsof | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-mcp-servers.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### MCP-SERVERS-03: SSH-tunnel allerede i bruk — sjekk for lsof
- **Symptom:** Tunnel-opprettelse feiler med "Address already in use"
- **Arsak:** Forrige tunnel-prosess ble ikke ryddet opp
- **Losning:** `lsof -ti:PORT | xargs kill` for a frigjore porten, tunnel-wrap.sh sjekker automatisk
### MCP-SERVERS-04: from_openapi() krever tilgjengelig Swagger-URL
- **Symptom:** `FastMCP.from_openapi()` feiler med connection error
- **Arsak:** Swagger-endepunktet er bak autentisering eller ikke eksponert
- **Losning:** Last ned swagger.json lokalt forst, bruk `from_openapi("file:///path/to/swagger.json")`
### MCP-SERVERS-05: Proxmox MCP forblir i magitek-ops
- **Symptom:** Forventning om at mcp-proxmox flyttes hit
- **Arsak:** 6 instanser fungerer, kompleks .env-konfigurasjon per node
- **Losning:** Ikke flytt. Nye servere bygges her, eksisterende Proxmox MCP forblir i `magitek-ops/tools/mcp-proxmox/`
## Vanlige Operasjoner
### Teste en FastMCP-server
```
cd /var/www/mcp-servers/packages/mcp-{name}
uvx fastmcp dev server.py
```
### Aktivere venv
```
source /var/www/mcp-servers/.venv/bin/activate
```
### Sjekke installert FastMCP-versjon
```
/var/www/mcp-servers/.venv/bin/python -c "import fastmcp; print(fastmcp.__version__)"
```
### Legge til ferdig server i magitek-ops
Rediger `/var/www/magitek-ops/.mcp.json` — legg til nytt objekt under `mcpServers`.
## Changelog
### v1.0 - 2026-03-14
- Initial versjon
- Dokumentert monorepo-struktur, teknologivalg, planlagte servere
- SSH tunnel pattern, gotchas, integrasjon med magitek-ops
|
||||||
| Integrasjon med magitek-ops | operations/magitek-server-ops/kontoret/services | knowledge | low | CURRENT-mcp-servers.md | 100 | 2026-03-20 02:00:44 |
|
Body:
## Integrasjon med magitek-ops
- `magitek-ops/.mcp.json` peker til MCP-servere via filsystemstier
- Nye servere bygget her legges til `.mcp.json` nar de er klare
- Eksisterende Proxmox MCP forblir i `magitek-ops/tools/mcp-proxmox/` (fungerer, ingen grunn til a flytte)
- **Framtidig:** Split individuelle servere til egne repoer nar modne → npm/PyPI/Packeton-publisering
## Opprette Ny Server (Workflow)
1. `cp -r templates/fastmcp-python packages/mcp-{name}`
2. Rediger `server.py` — implementer `@mcp.tool`-funksjoner
3. Rediger `pyproject.toml` — sett riktig pakkenavn
4. For hjemme-tjenester: opprett `.tunnel.env` fra `example.tunnel.env`
5. Test: `cd packages/mcp-{name} && uvx fastmcp dev server.py`
6. Legg til i `.mcp.json`:
- Kontoret: `"command": "python", "args": ["server.py"]`
- Hjemme: `"command": "bash", "args": ["tunnel-wrap.sh", ".tunnel.env"]`
## Backup
- **Repo-backup:** Git → GitHub (`heinesalbu/mcp-servers`, privat)
- **Server-backup:** laravelserver-v11 har Proxmox datacenter-backup (sjekk px1 jobs.cfg for VMID)
- **Ingen separat backup** av dette repoet utover git push
## Sikkerhet
- GitHub-repo er PRIVAT (inneholder potensielt API-nokkler i `.tunnel.env`)
- `.tunnel.env` filer BOR ligge i `.gitignore` (inneholder tokens)
- `verify=False` i template server.py — sett `True` for tjenester med gyldig SSL
- API-nokkler sendes som miljovariable, IKKE hardkodet i kildekode
## Kjente Gotchas
### MCP-SERVERS-01: Python externally-managed — bruk venv eller uvx
- **Symptom:** `pip install fastmcp` gir "externally-managed-environment" feil
- **Arsak:** Ubuntu 24.04 blokkerer global pip-installasjon
- **Losning:** Bruk `.venv/bin/pip install` eller `uvx fastmcp dev server.py`
### MCP-SERVERS-02: console.log() korrumperer stdio i TypeScript MCP-servere
- **Symptom:** MCP-klient faar JSON-parse-feil, server crasher
- **Arsak:** `console.log()` skriver til stdout som er JSON-RPC-kanalen
- **Losning:** Bruk `console.error()` eller `process.stderr.write()` for debug-output
|
||||||
| Eksisterende MCP-servere (IKKE i dette repoet) | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-mcp-servers.md | 100 | 2026-03-20 02:00:44 |
|
Body:
## Eksisterende MCP-servere (IKKE i dette repoet)
| Server | Lokasjon | Instanser | Teknologi |
|--------|----------|-----------|-----------|
| **mcp-proxmox** | `/var/www/magitek-ops/tools/mcp-proxmox/` | 6 (px1, hjemme, pmox2, pmox10, pmox15, px3) | TS SDK v0.4, fork av gilby125/mcp-proxmox |
| **serena** | Global MCP | 1 | Tredjepart |
| **context7** | Global MCP | 1 | Tredjepart |
| **docker** | Global MCP | 1 | Tredjepart |
| **dam-sqlite** | Global MCP | 1 | Tredjepart |
Disse styres via `/var/www/magitek-ops/.mcp.json` og forblir pa sine eksisterende plasseringer.
## Planlagte Servere
| Server | Rammeverk | Metode | Status |
|--------|-----------|--------|--------|
| **mcp-suitecrm** | FastMCP | `from_openapi()` med SuiteCRM swagger.json | Planlagt (EX-0013) |
| **mcp-truenas** | FastMCP | Evaluere official truenas-mcp vs custom | Planlagt |
| **mcp-bookstack** | FastMCP | Evaluere community (47+ verktoy) vs custom | Planlagt |
| **mcp-duplicati** | FastMCP | Ma bygges fra scratch, ingen eksisterende | Planlagt |
Evaluert men ikke prioritert: pfSense, Pi-hole, Nextcloud, NPM, MainWP.
## SSH Tunnel Pattern
Tjenester pa hjemme-nettverket (192.168.86.x) krever SSH-tunneler.
**Dataflyt:** `Claude Code → tunnel-wrap.sh → SSH tunnel (TU-*) → tjeneste-API`
**Konfigurasjon per pakke:**
1. Kopier `shared/ssh-tunnel-wrapper/example.tunnel.env` til `packages/mcp-{name}/.tunnel.env`
2. Sett `TUNNEL_LOCAL_PORT`, `TUNNEL_REMOTE_HOST/PORT`, `TUNNEL_SSH_HOST`
3. `ENV_*`-variabler strippes av prefiks og eksporteres til MCP-serveren
4. `.mcp.json` bruker `bash` + `tunnel-wrap.sh` som command (se proxmox-hjemme-monsteret)
**Tunnel-wrapper:** `shared/ssh-tunnel-wrapper/tunnel-wrap.sh`
- Sjekker om tunnel allerede finnes (`lsof -ti:PORT`)
- Oppretter SSH-tunnel med keepalive og timeout
- Eksporterer `ENV_*` → strippet variabelnavn
- `exec`-er MCP-serverkommandoen
## Tilgang
| Metode | Detaljer |
|--------|----------|
| Filsystem | `/var/www/mcp-servers/` pa laravelserver-v11 |
| Git | `git -C /var/www/mcp-servers/ pull` |
| Venv | `/var/www/mcp-servers/.venv/bin/python` |
| Test | `cd /var/www/mcp-servers/packages/mcp-{name} && uvx fastmcp dev server.py` |
|
||||||
| Identitet | operations/magitek-server-ops/kontoret/services | knowledge | medium | CURRENT-mcp-servers.md | 100 | 2026-03-20 02:00:44 |
|
Body:
# Infrastructure Sub-Expert: MCP Servers Monorepo
**Version:** 1.0
**Date:** 2026-03-14
**Parent:** coordination/experts/operations/magitek-server-ops/CURRENT.md
**Load:** coordination/experts/operations/magitek-server-ops/kontoret/services/CURRENT-mcp-servers.md
**Naming:** EXPERT-infra-mcp-servers-v{X.Y}-{YYYYMMDD}.md
---
## Identitet
| Egenskap | Verdi |
|----------|-------|
| **Repo** | `/var/www/mcp-servers/` |
| **GitHub** | `heinesalbu/mcp-servers` (PRIVAT) |
| **Host** | laravelserver-v11 (172.20.0.94) |
| **Lokasjon** | Kontoret |
| **Type** | Monorepo (utviklingsarbeidsflate, ikke VM/CT) |
| **Formaal** | Bygge egne MCP-servere for infrastruktur og tjenester |
| **Status** | Aktiv, nyopprettet (init commit 2026-03-14) |
## Struktur
```
/var/www/mcp-servers/
├── packages/ # Individuelle MCP-servere (tom, planlagte)
├── shared/
│ ├── ssh-tunnel-wrapper/ # tunnel-wrap.sh + example.tunnel.env
│ └── auth-helpers/ # OAuth2, Bearer, API-key, Basic Auth patterns
├── templates/
│ ├── fastmcp-python/ # server.py + pyproject.toml (ANBEFALT)
│ └── typescript-sdk/ # index.js + package.json
├── docs/
│ └── ARCHITECTURE.md
├── .venv/ # FastMCP 3.1.0 installert
└── README.md
```
## Teknologi
| Stack | Versjon | Notat |
|-------|---------|-------|
| **FastMCP** | 3.1.0 | I `.venv/`, anbefalt for alle nye servere |
| **Python** | 3.12.3 | System Python, bruk `.venv/` eller `uvx` |
| **uvx** | 0.9.8 | `~/.local/bin/uvx` — kan kjore FastMCP uten venv |
| **Node.js** | v24.11.0 | For TypeScript SDK-baserte servere |
| **@modelcontextprotocol/sdk** | ^1.0.0 | TypeScript-mal, brukes av eksisterende mcp-proxmox |
### FastMCP Nokkelfunksjoner
- Dekorator-API: `@mcp.tool` — minimal boilerplate
- Auto-genererer verktoyskjema fra type hints
- `FastMCP.from_openapi()` — null-kode generering fra Swagger/OpenAPI spec
- `uvx fastmcp dev server.py` — interaktiv testing
- `mcp.run()` — stdio JSON-RPC for Claude Code-integrasjon
|
||||||
| Dynamisk pool | operations/magitek-server-ops/kontoret/network | knowledge | low | CURRENT-pfsense.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### Dynamisk pool
```
172.20.0.62 – 172.20.0.90 (29 adresser, DHCP)
```
---
## Changelog
### v1.2 - 2026-03-13
- pfSense MCP-server evaluert og **droppet** — pfSense-pkg-API ikke i standard repos (tredjepartsinstall), hjemme har ødelagt pkg-system (libssl.so.30), lav ROI vs SSH
### v1.1 - 2026-03-04
- DHCP DNS endret fra 8.8.8.8,1.1.1.1 til 172.20.0.6 (Pi-hole),8.8.8.8 (fallback)
- Gotcha PF-06 oppdatert med Pi-hole info
### v1.0 - 2026-03-01
- Initial versjon — komplett kartlegging via SSH
- 10 interfaces kartlagt (WAN + 7 LAN + bridge0 + loopback)
- 3 port forwards dokumentert (12322→SSH, 80→NPM, 443→NPM)
- 26 DHCP static mappings dokumentert
- Brannmurregler kartlagt (WAN deny-default, LAN allow-all)
- Ingen VPN konfigurasjon funnet
- SSH aktivert og nøkkel-auth satt opp
|
||||||
| PF-05: Alle bc:24:11:* MAC-adresser er Proxmox VMs | operations/magitek-server-ops/kontoret/network | knowledge | medium | CURRENT-pfsense.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### PF-05: Alle bc:24:11:* MAC-adresser er Proxmox VMs
- MAC-prefix bc:24:11 er Proxmox-generert (KVM virtio)
- Alle VM/CT-enheter i DHCP-listen med denne prefixen kjører på px1
### PF-06: ISP DNS lokalt, Pi-hole for DHCP-klienter
- pfSense selv bruker ISP DNS (62.97.193.3/53) via Unbound
- DHCP-klienter får 172.20.0.6 (Pi-hole) + 8.8.8.8 (fallback)
- Pi-hole gir split DNS (kontoret-domener → NPM LAN) + annonse-blokkering
- Unbound kjører som lokal resolver på 127.0.0.1:53
---
## Vanlige Operasjoner
### SSH fra laravelserver-v11
```bash
ssh root@172.20.0.1 "kommando"
```
### Sjekk brannmurregler
```bash
ssh root@172.20.0.1 "pfctl -sr | grep pass | grep -v inet6"
```
### Sjekk NAT-regler
```bash
ssh root@172.20.0.1 "pfctl -sn | grep 'rdr on em0'"
```
### Sjekk DHCP-leases
```bash
ssh root@172.20.0.1 "cat /var/dhcpd/var/db/dhcpd.leases | grep -E '(^lease|hardware|client-hostname|binding)'"
```
### Sjekk state table
```bash
ssh root@172.20.0.1 "pfctl -si | head -10"
```
### Backup config
```bash
ssh root@172.20.0.1 "cat /cf/conf/config.xml" > pfsense-backup-$(date +%Y%m%d).xml
```
### Restart tjenester
```bash
ssh root@172.20.0.1 "pfctl -f /tmp/rules.debug" # Reload FW rules
ssh root@172.20.0.1 "/etc/rc.restart_webgui" # Restart WebGUI
```
---
## IP-adresseoversikt (komplett, fra DHCP + ARP)
### Statiske (DHCP reservasjoner)
```
172.20.0.1 pfSense (gateway)
172.20.0.2 FreshTomato (WiFi AP)
172.20.0.4 TL-SG105E (managed switch)
172.20.0.12 Xerox skriver
172.20.0.22 ORION (Heines arbeidsstasjon)
172.20.0.23 DESKTOP-CEILUHL (KingaPC)
172.20.0.32 pmox10 (Proxmox, idle) — IKKE i DHCP, statisk på VM
172.20.0.33 pmox15 (Proxmox, hoster NPM) — IKKE i DHCP, statisk på VM
172.20.0.34 px1 (Proxmox, primær) — IKKE i DHCP, statisk på host
172.20.0.42 nginxpm-ub2404 (NPM)
172.20.0.91 wp01
172.20.0.92 ub24-websrv1
172.20.0.93 laravelserver1
172.20.0.94 laravel-v11 (ReportMaker)
172.20.0.95 ssh-server (jump host)
172.20.0.96 node-server
172.20.0.97 metabase
172.20.0.98 mysql-baser
172.20.0.99 proxmoxmailgateway
172.20.0.100 mailcow
172.20.0.101 suitecrm8
172.20.0.102 suitecrm
172.20.0.103 frappe
172.20.0.104 docker1
172.20.0.105 penpot
172.20.0.106 webstudio
172.20.0.107 frappe15
172.20.0.108 wp02
172.20.0.109 wp-kinga
172.20.0.110 wp01-recovery
```
|
||||||
| ARP-tabell (aktive enheter ved kartlegging) | operations/magitek-server-ops/kontoret/network | knowledge | low | CURRENT-pfsense.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### ARP-tabell (aktive enheter ved kartlegging)
| IP | MAC | Status |
|----|-----|--------|
| 172.20.0.2 | c0:ff:d4:a5:56:9f | FreshTomato AP |
| 172.20.0.4 | 68:ff:7b:45:56:01 | TP-Link switch |
| 172.20.0.12 | 9c:93:4e:48:6c:61 | Xerox skriver |
| 172.20.0.22 | a8:a1:59:87:56:fa | ORION (permanent) |
| 172.20.0.23 | 04:0e:3c:3a:60:15 | KingaPC (permanent) |
| 172.20.0.32 | f4:39:09:de:91:a7 | pmox10 |
| 172.20.0.33 | 10:62:e5:0d:70:10 | pmox15 |
| 172.20.0.34 | 40:3f:8c:cc:98:e9 | px1 |
| 172.20.0.42 | bc:24:11:b7:af:bb | NPM (permanent) |
| 172.20.0.94 | bc:24:11:44:8a:a6 | laravel-v11 |
| 172.20.0.95 | bc:24:11:87:30:3a | ssh-server |
---
## VPN
- **OpenVPN:** Ingen konfigurasjon funnet (`/var/etc/openvpn/` tom)
- **IPsec:** Ingen aktiv (`ipsec statusall` tom)
- **Konklusjon:** Ingen VPN mellom kontoret og hjemme — kommunikasjon via SSH-tunneler over internett
---
## Sikkerhet & Backup
- **Backup-rutine:** Ukjent (TODO: sjekk AutoConfigBackup)
- **Sikkerhetsoppdateringer:** 2.8.1 tilgjengelig — bør planlegges
- **Kritiske filer:** `/cf/conf/config.xml` (pfSense master config)
- **Passord:** admin/root bruker med passord (lagret i brukerens passordmanager)
---
## Kjente Gotchas
### PF-01: SSH var deaktivert inntil 2026-03-01
- **Symptom:** Port 22 filtered, ingen SSH-tilgang
- **Årsak:** SSH ikke aktivert i System → Advanced → Admin Access
- **Løsning:** Aktivert via WebGUI, nøkkel lagt til i `/root/.ssh/authorized_keys`
### PF-02: WebGUI på port 8080, IKKE 443
- **Symptom:** https://172.20.0.1 gir timeout
- **Årsak:** nginx frontend kjører på port 8080, ikke standard HTTPS
- **Løsning:** Bruk http://172.20.0.1:8080
### PF-03: Anti-lockout kun på em1 (LAN1)
- **Symptom:** WebGUI/SSH bare garantert tilgjengelig via em1
- **Årsak:** Anti-lockout-regelen er knyttet til em1 (LAN1 interface)
- **Løsning:** Bridge0 har "Allow all" USER_RULE som også tillater tilgang
### PF-04: Kun em3 har aktiv link
- **Symptom:** Bare 1 av 7 LAN-porter har link up
- **Årsak:** em3 (LAN2_OK) er fysisk koblet til switch — resten er ledige
- **Merknad:** Bridge funker likevel fordi all trafikk går via bridget interface
|
||||||
| Static Mappings (26 stk) | operations/magitek-server-ops/kontoret/network | knowledge | medium | CURRENT-pfsense.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### Static Mappings (26 stk)
| IP | Hostname | MAC | Identifikator | Rolle |
|----|----------|-----|---------------|-------|
| 172.20.0.2 | FreshTomato | c0:ff:d4:a5:56:9f | FreshTomatoAPwifi | WiFi AP |
| 172.20.0.4 | TL-SG105E | 68:ff:7b:45:56:01 | TPlinkminiswitch | Managed switch |
| 172.20.0.12 | XRX9C934E486C61 | 9c:93:4e:48:6c:61 | XeroxPrinter | Xerox skriver |
| 172.20.0.22 | ORION | a8:a1:59:87:56:fa | PCHeine | Heines arbeidsstasjon |
| 172.20.0.23 | DESKTOP-CEILUHL | 04:0e:3c:3a:60:15 | KingaPC | Kingas PC |
| 172.20.0.42 | nginxpm-ub2404 | bc:24:11:b7:af:bb | nginxPM | NPM (pmox15) |
| 172.20.0.91 | wp01 | bc:24:11:ab:f1:97 | — | WordPress (stopped) |
| 172.20.0.92 | ub24-websrv1 | bc:24:11:df:76:3b | — | Webserver 1 |
| 172.20.0.93 | laravelserver1 | bc:24:11:ae:8b:92 | — | Eldre Laravel-server |
| 172.20.0.94 | laravel-v11 | bc:24:11:44:8a:a6 | — | **ReportMaker** |
| 172.20.0.95 | ssh-server | bc:24:11:87:30:3a | — | SSH jump host (VM 113) |
| 172.20.0.96 | node-server | bc:24:11:74:2e:6c | — | Node.js server |
| 172.20.0.97 | metabase | bc:24:11:e1:40:91 | — | Metabase analytics |
| 172.20.0.98 | mysql-baser | bc:24:11:91:d1:79 | — | MySQL-database |
| 172.20.0.99 | proxmoxmailgateway | bc:24:11:63:62:b1 | — | Proxmox Mail Gateway |
| 172.20.0.100 | mailcow | bc:24:11:ef:67:a4 | — | Mailcow e-post |
| 172.20.0.101 | suitecrm8 | bc:24:11:d6:22:76 | — | SuiteCRM 8 |
| 172.20.0.102 | suitecrm | bc:24:11:ea:6c:8c | — | SuiteCRM (eldre) |
| 172.20.0.103 | frappe | bc:24:11:94:0f:9d | — | Frappe/ERPNext |
| 172.20.0.104 | docker1 | bc:24:11:7e:ff:de | — | Docker host |
| 172.20.0.105 | penpot | bc:24:11:81:b4:04 | — | Penpot design |
| 172.20.0.106 | webstudio | bc:24:11:d6:e9:ee | — | Webstudio |
| 172.20.0.107 | frappe15 | bc:24:11:90:ff:c0 | — | Frappe 15 |
| 172.20.0.108 | wp02 | bc:24:11:b8:5c:5a | — | WordPress 2 |
| 172.20.0.109 | wp-kinga | bc:24:11:56:50:cb | — | WordPress (Kinga) |
| 172.20.0.110 | wp01-recovery | bc:24:11:09:99:d8 | — | WordPress recovery |
|
||||||
| DNS | operations/magitek-server-ops/kontoret/network | knowledge | low | CURRENT-pfsense.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### DNS
- Lokal resolver: Unbound (127.0.0.1:53)
- Upstream: 62.97.193.3, 62.97.193.53 (ISP)
- DHCP-klienter får: 172.20.0.6 (Pi-hole), 8.8.8.8 (fallback)
---
## NAT / Port Forwarding
### Aktive port forwards (WAN → LAN)
| Ekstern port | Mål IP | Mål port | Protokoll | Beskrivelse |
|-------------|--------|----------|-----------|-------------|
| **12322** | 172.20.0.95 | 22 | TCP | SSH jump host (VM 113) |
| **80** | 172.20.0.42 | 80 | TCP | HTTP → NPM |
| **443** | 172.20.0.42 | 443 | TCP | HTTPS → NPM |
### Outbound NAT
- Standard: All LAN (172.20.0.0/24) NATes til WAN IP (62.97.227.206)
- ISAKMP static-port NAT for VPN-kompatibilitet
### NAT Reflection
Alle port forwards har PFREFLECT-regler på alle LAN interfaces (em1-em7 + bridge0).
Dette betyr at LAN-enheter kan nå tjenester via det offentlige domenet/IP-en.
---
## Brannmurregler
### WAN (em0)
| Retning | Regel | Beskrivelse |
|---------|-------|-------------|
| IN | Pass TCP → 172.20.0.42:80 | NAT HTTP |
| IN | Pass TCP → 172.20.0.42:443 | NAT HTTPS |
| IN | Pass TCP → 172.20.0.95:22 | NAT ssh-server (port 12322) |
| IN | DHCP replies | Standard |
| * | Default deny | Alt annet blokkeres |
### LAN_BRIDGE (bridge0)
| Retning | Regel | Beskrivelse |
|---------|-------|-------------|
| IN | **Pass ALL** | `USER_RULE: Allow all` — alt fra LAN tillates |
| IN | DHCP | Standard DHCP-regler |
### Individuelle LAN-interfaces med egne pass-regler
| Interface | Regel |
|-----------|-------|
| em3 (LAN2_OK) | Pass ALL IPv4 |
| em5 (LAN3_OK) | Pass ALL IPv4 |
| em7 (LAN4_OK) | Pass ALL IPv4 |
### Anti-lockout
- em1 (LAN1): Pass TCP til self:8080 (WebGUI) og self:22 (SSH)
### Firewall-out
- Alt utgående fra pfSense selv: tillatt (inkl. route-to via WAN)
### State Table
- ~1039 aktive states (per kartlegging)
---
## DHCP Server
### Pool
- **Subnet:** 172.20.0.0/24
- **Range:** 172.20.0.62 – 172.20.0.90 (29 dynamiske adresser)
- **Default lease:** 2 timer (7200s)
- **Max lease:** 24 timer (86400s)
- **DNS:** 172.20.0.6 (Pi-hole), 8.8.8.8 (fallback)
- **Gateway:** 172.20.0.1
|
||||||
| Identitet | operations/magitek-server-ops/kontoret/network | knowledge | medium | CURRENT-pfsense.md | 100 | 2026-03-20 02:00:44 |
|
Body:
# Infrastructure Sub-Expert: pfSense Kontoret
**Version:** 1.2
**Date:** 2026-03-13
**Parent:** coordination/experts/operations/magitek-server-ops/CURRENT.md
**Load:** coordination/experts/operations/magitek-server-ops/CURRENT-pfsense.md
---
## Identitet
| Egenskap | Verdi |
|----------|-------|
| **Hostname** | pfSense.home.arpa |
| **Type** | Fysisk maskin (gjenbrukt enterprise-brannmur, ukjent merke — kostbar da ny) |
| **LAN IP** | 172.20.0.1 (bridge0, LAN_BRIDGE) |
| **WAN IP** | 62.97.227.206/30 (em0, DHCP fra ISP) |
| **Gateway** | 62.97.227.205 |
| **Lokasjon** | Kontoret (Kolskogheiane 12) |
| **OS** | pfSense 2.7.2-RELEASE (FreeBSD 14.0-CURRENT) |
| **Oppgradering** | 2.8.1 tilgjengelig |
| **Serial** | 1431B01921 |
| **Netgate Device ID** | f85fc3b01b6ee3c772fd |
| **CPU** | Intel Core2 Quad Q9400 @ 2.66GHz (4 cores) |
| **RAM** | 4 GB |
| **Disk** | 27 GB (7% brukt, 23 GB ledig) |
| **Uptime** | 33+ dager (per 2026-03-01) |
| **Rolle** | Brannmur, gateway, NAT, DHCP for 172.20.0.0/24 |
| **Status** | Aktiv |
---
## Tilgang
| Metode | Detaljer |
|--------|----------|
| **SSH** | `ssh root@172.20.0.1` (nøkkel OK, port 22) |
| **WebGUI** | http://172.20.0.1:8080 (nginx frontend, admin-bruker) |
| **Console** | PuTTY fra ORION → 172.20.0.1 (root + passord) |
**SSH-status:** Aktivert 2026-03-01, nøkkel-autentisering OK fra laravelserver-v11.
---
## Nettverksarkitektur
### Interfaces (10 stk)
| Interface | Fysisk | Rolle | IP | Link Status |
|-----------|--------|-------|----|-------------|
| **WAN_NR5** | em0 | WAN (Internet) | 62.97.227.206/30 (DHCP) | UP, 1000baseT |
| **LAN1** | em1 | Bridge-medlem | — | DOWN |
| **LAN6_OK** | em2 | Bridge-medlem | — | DOWN |
| **LAN2_OK** | em3 | Bridge-medlem | — | UP, 1000baseT |
| **LAN7_OK** | em4 | Bridge-medlem | — | DOWN |
| **LAN3_OK** | em5 | Bridge-medlem | — | DOWN |
| **LAN8MGT** | em6 | Bridge-medlem | — | DOWN |
| **LAN4_OK** | em7 | Bridge-medlem | — | DOWN |
| **LAN_BRIDGE** | bridge0 | LAN Bridge (em1-em7) | 172.20.0.1/24 | UP |
**Arkitektur:** Alle 7 LAN-porter (em1-em7) er bridget til `bridge0` (LAN_BRIDGE).
Kun **em3 (LAN2_OK)** har aktiv link (1000baseT) — dette er trolig porten som kobler til switchen.
|
||||||
| v1.0 - 2026-03-05 | operations/magitek-server-ops/kontoret/proxmox | knowledge | medium | CURRENT-px1.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### v1.0 - 2026-03-05
- Initial kartlegging etter vedlikeholdssesjon
- Hardware: AMD Ryzen 9 3900X, 94 GiB RAM, 1.82 TB NVMe + 4x SSD (ZFS raid10)
- 4 kjorende (VM 112, 113, CT 133, 134), 23 stoppede VMs, 7 stoppede CTs
- RAM-optimering: VM 112 80G->48G, ZFS ARC cappet til 8 GiB
- Disk-opprydding: 22G->11G, snapshot-opprydding, kernel purge
- LVM thinpool: 42%->37.6%
- 7 gotchas dokumentert (PX1-01 til PX1-07)
|
||||||
| PX1-07: Kernel-oppgradering venter reboot | operations/magitek-server-ops/kontoret/proxmox | knowledge | medium | CURRENT-px1.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### PX1-07: Kernel-oppgradering venter reboot
- 6.8.12-19 installert men 6.8.12-16 kjorer
- Oppgradering fikser PX1-04 (dmaengine slab leak)
- Krever planlagt nedetid (VM 112 = laravelserver-v11)
## Ressursoversikt (etter optimering 2026-03-05)
| Ressurs | Total | Brukt | Ledig |
|---------|-------|-------|-------|
| CPU | 24 threads (Ryzen 9 3900X) | ~1% | ~99% |
| RAM | 94 GiB | 24 GiB (inkl ZFS ARC 8G) | 70 GiB |
| NVMe root | 79 GB | 11 GB (15%) | 64 GB |
| LVM thinpool | 1.69 TB | 37.6% | ~1.06 TB |
| ZFS raid10 | 1.73 TB | 63 GB (3%) | 1.67 TB |
## Monitoring & Ressursovervåking
px1 er fysisk server — viften reagerer på samlet CPU-last fra ALLE VM-er. Monitoring skjer på tre nivåer:
| Nivå | Verktøy | Lokasjon | Fanger |
|------|---------|----------|--------|
| **VM-intern** | atop (10s), PCP, sar | Inne i VM 112, 122 etc. | Hvilken prosess spiket |
| **Proxmox RRD** | Innebygd | px1 `/var/lib/rrdcached/db/pve2-vm/` | Hvilken VM spiket (WebGUI → Summary) |
| **Fysisk host** | Ingen (px1 har ikke iDRAC/IPMI) | — | Temp/vifte utilgjengelig |
### VM-er med atop/PCP installert
| VM | Hostname | atop intervall | PCP | sar |
|----|----------|---------------|-----|-----|
| 112 | laravelserver-v11 | 10s | Ja | Ja |
| 122 | suitecrm | 10s | Ja | Ja |
### Feilsøking: "Viften spinner opp"
1. **Proxmox WebGUI** → Node px1 → Summary → CPU-graf → finn tidspunkt
2. **Proxmox WebGUI** → Hver VM → Summary → finn hvilken VM spiket
3. **SSH inn i VM-en** → `atop -r /var/log/atop/atop_$(date +%Y%m%d) -b HH:MM` → finn prosessen
4. Alternativt: `ssh root@172.20.0.34 "head -1 /proc/stat"` for sanntid host-CPU
### Viktig kontekst
- px1 har **ingen iDRAC/IPMI** — kan ikke lese temperatur eller vifte-RPM remote
- Proxmox RRD er alltid aktivt, ingen konfigurasjon nødvendig
- Korte spikes (<10s) fanges av atop men IKKE av sar (10 min intervall)
---
## Changelog
### v1.1 - 2026-03-15
- Monitoring-seksjon lagt til: tre-nivaa arkitektur (VM-intern, Proxmox RRD, fysisk host)
- VM 112 + 122 har atop (10s), PCP, sar installert
- Dokumentert at px1 har ingen iDRAC/IPMI
- VM 122 disk oppdatert: 32G→80G (utvidet 2026-03-15)
- Backup vmid-liste oppdatert: VM 122, CT 133, 134, 135 lagt til
|
||||||
| Disk-opprydding | operations/magitek-server-ops/kontoret/proxmox | knowledge | medium | CURRENT-px1.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### Disk-opprydding
- Slettet vzdump backup VM 110 (7 GB, desember 2024)
- Slettet ISO: proxmox-mail-gateway (1.5 GB)
- Journal vacuum: 1.3 GB -> 200 MB
- apt cache renset (135 MB)
- Slettet CT template ubuntu-20.04 (205 MB)
- Slettet /root/.vscode-server (376 MB)
- Slettet /tmp scripts
- Purget gamle kjerner: 6.8.12-4 og 6.8.12-11 (beholder 6.8.12-16 running + 6.8.12-19)
- Root-disk: 22 GB -> 11 GB (15% av 79 GB)
### Snapshot-opprydding
- VM 111 (laravelserver1): 8 av 9 snapshots slettet, beholdt `pre_ressurser`
- VM 123 (frappe): 3 av 4 snapshots slettet, beholdt `oppgradert_frappe`
- Orphaned LVM snap volumes for VM 120 og 129 (na CTs): 6 volumes slettet (68 GiB)
- LVM thin pool: 42% -> 37.6%
## Kjente Gotchas
### PX1-01: VM 112 RAM overallokering (FIKSET 2026-03-05)
- **Var:** 80 GB RAM til VM 112 pa host med 94 GB total = 85% allokert til 1 VM
- **Fikset:** Redusert til 48 GB med balloon min 8 GB. Faktisk bruk ~5 GiB.
- **Backlog:** M-017 (kan lukkes)
### PX1-02: 23 stoppede VMs — oppryddingskandidat
- Mange er test/eksperiment-VMs som aldri startes
- 5 er base templates (100, 101, 106, 119, 127) brukt av linked clones — ma beholdes
- Resten (18 VMs) er kandidater for arkivering til PBS + sletting
- **Backlog:** M-090
### PX1-03: snap_vm-112-disk-0_pre_disk_expansion (150 GiB)
- Storste enkelt-snapshot pa aktiv VM
- Blokkerer ~150 GiB pa LVM thinpool
- Kan slettes hvis VM 112 disk-ekspansjonen er verifisert stabil
### PX1-04: dmaengine-unmap-2 slab leak (~1.1 GiB)
- 18.2M objekter i slab cache, vokser over tid
- Kjent kernel-bug i 6.8.x-serien
- Fikses med oppgradering til nyere kernel (6.8.12-19 installert, krever reboot)
- Ikke kritisk, men sloser RAM over tid
### PX1-05: 19 LVM snapshots for stoppede VMs
- Mange stoppede VMs har snapshots som tar plass i thinpool
- Ved arkivering av stoppede VMs: slett snapshots forst for a frigjore thinpool-plass
- Se vedlikeholdsseksjonen for allerede oppryddede snapshots
### PX1-06: ZFS ARC var ucappet
- **Var:** ARC c_max ~47 GiB (slukte nesten alt ledig RAM)
- **Fikset 2026-03-05:** Satt til 8 GiB via `/etc/modprobe.d/zfs.conf`
- **Verifisert:** `cat /proc/spl/kstat/zfs/arcstats | grep c_max` = 8589934592
|
||||||
| VM 112 (laravel-v11) — VIKTIGST | operations/magitek-server-ops/kontoret/proxmox | knowledge | medium | CURRENT-px1.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### VM 112 (laravel-v11) — VIKTIGST
Hoved-utviklingsserver. Kjorer Apache 2.4 + PHP-FPM 8.3. Hosting: magitek-ops, reportmaker.
RAM optimert 2026-03-05: 80 GB -> 48 GB (balloon min 8 GB). Faktisk bruk ~5 GiB.
Disker: 150G boot (LVM, 98% full thinpool allokering), 213G+510G (ZFS raid10).
## Stoppede VMs (23 stk)
| ID | Navn | RAM | Disk | Merknad |
|----|------|-----|------|---------|
| 100 | ub2404 | 8G | 32G | Base template (linked clones) |
| 101 | ub24-websrv1 | 8G | 32G | Base template |
| 106 | ub2204min | 8G | 16G | Base template |
| 107 | ub2204-minimal | 1G | 16G | Minimal test |
| 108 | node-dev-srv | 8G | 32G | Node.js dev |
| 109 | Copy-of-VM-ub2404 | 8G | 32G | Kopi/test |
| 110 | webserver1 | 16G | 52G | Gammel webserver |
| 111 | laravelserver1 | 4G | 32G | Forgjenger til VM 112 |
| 114 | node-server | 8G | 32G | Node.js |
| 115 | metabase | 8G | 32G | BI-verktoy |
| 116 | mysql-baser | 8G | 32G | DB-server |
| 117 | ProxmoxMailGateway | 4G | 12G | Mail gateway |
| 118 | mailcow | 8G | 32G | Mail server |
| 119 | ub2404-docker | 8G | 32G | Docker base template |
| 121 | emptyubuntu | 8G | 32G | Tom |
| 122 | suitecrm | 8G | 80G | CRM (ZFS, disk utvidet 32G→80G 2026-03-15) |
| 123 | frappe | 3G | 32G | ERPNext test |
| 124 | docker1 | 5G | 52G | Docker host |
| 125 | penpot | 4G | 32G | Design tool |
| 126 | webstudio | 8G | 32G | Web builder |
| 127 | ub2204 | 8G | 32G | Base template |
| 128 | frappe15 | 3G | 32G | Frappe v15 test |
| 132 | pbsm2-backup-server | 8G | 64G | PBS test (aldri brukt) |
## Stoppede CTs (7 stk)
| ID | Navn | Disk | Merknad |
|----|------|------|---------|
| 102 | openVPN | 16G | VPN test |
| 103 | debian12 | 16G | Test |
| 104 | openvpn2 | 16G | VPN test |
| 105 | openvpn3 | 20G | VPN test |
| 120 | wp01 | 18G | WordPress (stoppet) |
| 129 | wp02 | 8G | WordPress (stoppet) |
| 130 | wp-kinga | 12G | WordPress (stoppet) |
| 131 | wp01-recovery | 8G | Recovery |
## Vedlikehold 2026-03-05
### RAM-optimering
- VM 112: 80 GB -> 48 GB (balloon min 8 GB). Bruk for: ~80%. Bruk etter: ~22% -> ~5 GiB faktisk.
- ZFS ARC: Ucappet (~47 GiB) -> 8 GiB max. Persistent via `/etc/modprobe.d/zfs.conf`.
- Host etter optimering: 24 GiB brukt / 70 GiB tilgjengelig (av 94 GiB).
|
||||||
| PBS (Proxmox Backup Server) | operations/magitek-server-ops/kontoret/proxmox | knowledge | medium | CURRENT-px1.md | 100 | 2026-03-20 02:00:44 |
|
Body:
### PBS (Proxmox Backup Server)
| Storage | Datastore | Server | Innhold |
|---------|-----------|--------|---------|
| extbackup | extbackup | magitek.no | backup |
### Lokal
| Storage | Sti | Innhold |
|---------|-----|---------|
| local | /var/lib/vz | iso, vztmpl, backup |
| raid10dataset | /raid10/proxmox_data | rootdir, images, iso, vztmpl, backup, snippets |
## Backup
- **Proxmox backup-jobb:** backup-a837400f-3bb6
- **Schedule:** 02:00 daglig
- **Storage:** extbackup (PBS, magitek.no)
- **Mode:** Snapshot
- **VMs/CTs inkludert:** 110, 111, 112, 113, 114, 115, 116, 120, 122, 123, 124, 128, 129, 130, 133, 134, 135
- **Ikke inkludert:** Base templates (100, 101, 106, 119, 127), test VMs (107-109, 117-118, 121, 125-126, 132), CTs (102-105, 131)
## Aktive VMs/CTs (4 kjorende)
| ID | Navn | Type | Status | RAM | Disk | Rolle |
|----|------|------|--------|-----|------|-------|
| 112 | laravel-v11 | VM | Running | 48 GB (balloon min 8G) | 150G LVM + 213G+510G ZFS | Hoved dev-server (172.20.0.94) |
| 113 | ssh-server | VM | Running | 2 GB | 32G LVM | SSH jump host (172.20.0.95) |
| 133 | legacy-tls-proxy | CT | Running | - | 2G LVM | TLS proxy |
| 134 | infra-tools | CT | Running | - | 2G LVM | Infrastruktur-verktoy |
| 137 | mon-kontoret | CT | Running | - | - | Monitoring stack (Prometheus+Grafana+Alertmanager) |
### CT 137 (mon-kontoret) — Monitoring Stack
- **Rolle:** Prometheus + Grafana + Alertmanager for kontoret (del av MP-0011 HA monitoring)
- **IP:** `172.20.0.76` (**DHCP** — faktisk adresse, IKKE `.137` som hostname antyder)
- **DNS-override:** Pi-hole kontoret (CT 108) har dnsmasq override: `monitoring-k.magitek.no → 172.20.0.42` (via NPM)
- **NPM proxy:** `monitoring-k.magitek.no → http://172.20.0.76:3000` (Grafana, proxy host ID 36, cert 57)
- **KRITISK:** CT 137 bruker DHCP — hvis IP-adressen endres (f.eks. DHCP-server restart) slutter `monitoring-k.magitek.no` å fungere
- **Anbefalt:** Sett statisk IP (`pct set 137 --net0 ip=172.20.0.76/24,gw=172.20.0.1,...`) for å unngå IP-drift
- **Oppsatt:** 2026-03-18 via MP-0011 (session b6bb8896)
|
||||||
| Identitet | operations/magitek-server-ops/kontoret/proxmox | knowledge | medium | CURRENT-px1.md | 100 | 2026-03-20 02:00:44 |
|
Body:
# Infrastructure Sub-Expert: px1
**Version:** 1.1
**Date:** 2026-03-15
**Parent:** coordination/experts/operations/magitek-server-ops/CURRENT.md
**Load:** coordination/experts/operations/magitek-server-ops/kontoret/proxmox/CURRENT-px1.md
---
## Identitet
| Egenskap | Verdi |
|----------|-------|
| **Hostname** | px1 |
| **Type** | Fysisk server (Proxmox host) |
| **CPU** | AMD Ryzen 9 3900X 12-Core (1 socket, 24 threads) |
| **RAM** | 94.2 GiB (Proxmox) / ~96 GB physical |
| **LAN IP** | 172.20.0.34 (vmbr0, gateway 172.20.0.1) |
| **Lokasjon** | Kontoret |
| **PVE versjon** | 8.4.17 |
| **Kernel** | 6.8.12-16-pve (running), 6.8.12-19 (installed, neste boot) |
| **Boot** | EFI (NVMe) |
| **Rolle** | Hoved-Proxmox for kontoret, hoster laravelserver-v11 (dev) |
| **Status** | Online, uptime 37+ dager per 2026-03-05 |
## Tilgang
| Metode | Detaljer |
|--------|----------|
| SSH | `ssh px1` (root@172.20.0.34) fra laravelserver-v11 |
| WebGUI | `https://172.20.0.34:8006` |
## Nettverk
Enkelt oppsett: 1x bridge (vmbr0) pa enp8s0 (aktiv). enp9s0 og enp42s0 ned/ledig.
## Disker og Storage
### Fysiske disker
| Disk | Storrelse | Type | Innhold |
|------|-----------|------|---------|
| nvme0n1 | 1.82 TB | NVMe | PVE boot: root 80G + swap 8G + data thinpool 1.69T |
| sda | 931.5 GB | SSD (Samsung 870 QVO 1TB) | ZFS raid10 mirror-0 |
| sdb | 894.3 GB | SSD (Kingston SA400S37 960G) | ZFS raid10 mirror-0 |
| sdc | 894.3 GB | SSD (Kingston SA400S37 960G) | ZFS raid10 mirror-1 |
| sdd | 894.3 GB | SSD (Kingston SA400S37 960G) | ZFS raid10 mirror-1 |
NVMe SMART: PASSED. Root disk: 11 GB / 79 GB brukt (15%).
### LVM Thinpool (local-lvm)
1.69 TB total, 37.6% brukt. Pa NVMe. Inneholder disker+snapshots for 28 VMs + 7 CTs.
5 base/template volumes: base-100, base-101, base-106, base-119, base-127 (brukt av linked clones).
Snapshots pa LVM: 19 stk, mange for stoppede VMs. Storste: `snap_vm-112-disk-0_pre_disk_expansion` (150 GiB).
### ZFS Pool (raid10)
| Pool | Storrelse | Brukt | Ledig | Helse |
|------|-----------|-------|-------|-------|
| raid10 | 1.73 TB | 63.1 GB (3%) | 1.67 TB | ONLINE |
Konfig: 2x mirror (mirror-0: Samsung+Kingston, mirror-1: 2x Kingston). Redundant.
Siste scrub: 2026-02-08, 0 errors.
ZFS datasets: vm-112-disk-0 (213G), vm-112-disk-1 (510G), vm-122-disk-0 (44G), 3x vm-122-state snapshots (49G total), proxmox_data (10.3G).
**ZFS ARC:** Begrenset til 8 GiB via `/etc/modprobe.d/zfs.conf` (`options zfs zfs_arc_max=8589934592`). Persistent. Satt 2026-03-05 (var ucappet ~47 GiB for).
|
||||||
| **Quality Mode:** BALANCED | magitek-ops | lesson | medium | MASTERPLAN.md | 99 | 2026-03-20T02:00:45Z |
|
Body:
|
||||||
| **Why:** Bug-crusher agent spends 30-50% of tokens manually grepping 260+ log files. | magitek-ops | lesson | medium | MASTERPLAN.md | 99 | 2026-03-20T02:00:45Z |
|
Body:
Sentry aggregates, deduplicates, and provides structured error context. Combined with the Sentry MCP server, agents can query production errors directly instead of parsing raw logs.
|
||||||
| Deploy a self-hosted Sentry instance on Proxmox infrastructure to provide centralized error track… | magitek-ops | lesson | medium | MASTERPLAN.md | 99 | 2026-03-20T02:00:45Z |
|
Body:
for ReportMaker. The `sentry/sentry-laravel` package is already installed on ReportMaker (172.20.0.94) with an empty DSN — this masterplan covers the server-side deployment and integration.
|
||||||
| **Architecture choice:** Host-level routing with iptables on px1 rather than VLAN trunking throug… | magitek-ops | lesson | medium | MASTERPLAN.md | 99 | 2026-03-20T02:00:45Z |
|
Body:
he ZyXEL switch and pfSense. This avoids risk to existing network infrastructure while providing equivalent isolation (the bridge has no physical uplink — L2 isolation is absolute).
|
||||||
| Set up an isolated Kali Linux VM on px1 (kontoret) for AI-driven penetration testing. | magitek-ops | lesson | medium | MASTERPLAN.md | 99 | 2026-03-20T02:00:45Z |
|
Body:
Claude Code on laravelserver-v11 (172.20.0.94) will SSH into the Kali VM to run pentest tools against explicitly scoped targets. The VM is network-isolated via an internal-only Proxmox bridge (vmbr99, 10.99.0.0/24) with no physical uplink. Routing and firewall rules on the px1 host control all traffic: only SSH inbound from laravelserver and scope-controlled outbound to designated targets are permitted. No internet access, no LLM/Claude access, no management network access.
|
||||||
| **Grunnlag:** `coordination/explore/EX-0008-260305-kb-system-universalization/EXPLORE.md` | magitek-ops | lesson | medium | MASTERPLAN.md | 98 | 2026-03-20T02:00:45Z |
|
Body:
|
||||||
Ingestion History
Loading…