From 9f431ff97b7019bb3a482d3eaf913529e8e40e74 Mon Sep 17 00:00:00 2001 From: mo Date: Sun, 17 May 2026 14:52:28 +0200 Subject: [PATCH] Pull Proxmox LXC app configs via SSH and document all CTs. Add pull-lxc-from-proxmox.py using Proxmox API + pct exec for running containers (vaultwarden, linkwarden, paymenter, NPM, etc). Stub apps for stopped LXCs with proxmox.meta.yaml and updated lxc-inventory with live IPs. Co-authored-by: Cursor --- .env.example | 5 + INVENTORY.md | 10 ++ README.md | 5 +- apps/autocaliweb/README.md | 10 ++ apps/autocaliweb/proxmox.meta.yaml | 6 + apps/changedetection/README.md | 10 ++ apps/changedetection/proxmox.meta.yaml | 6 + apps/clawbot/README.md | 10 ++ apps/clawbot/proxmox.meta.yaml | 6 + apps/crowdsec/README.md | 10 ++ apps/crowdsec/proxmox.meta.yaml | 6 + apps/endurain/README.md | 10 ++ apps/endurain/proxmox.meta.yaml | 6 + apps/immich/README.md | 10 ++ apps/immich/proxmox.meta.yaml | 6 + apps/iventoy/README.md | 10 ++ apps/iventoy/proxmox.meta.yaml | 6 + apps/kasm/README.md | 10 ++ apps/kasm/proxmox.meta.yaml | 6 + apps/kimai/README.md | 10 ++ apps/kimai/proxmox.meta.yaml | 6 + apps/linkwarden/README.md | 14 ++ apps/linkwarden/config/.env | 0 ...pt_linkwarden_node_modules_dotenv-cli_.env | 6 + .../03-_opt_linkwarden_docker-compose.yml | 28 ++++ ...mpose-1-_opt_linkwarden_docker-compose.yml | 28 ++++ .../linkwarden/config/docker-compose.full.yml | 0 .../env-1-_opt_linkwarden_docker-compose.yml | 0 apps/linkwarden/proxmox.meta.yaml | 7 + apps/metube/README.md | 10 ++ apps/metube/proxmox.meta.yaml | 6 + apps/n8n/README.md | 10 ++ apps/n8n/proxmox.meta.yaml | 6 + apps/nextcloudpi/README.md | 10 ++ apps/nextcloudpi/proxmox.meta.yaml | 6 + apps/nginxproxymanager/README.md | 16 ++ .../config/npm-data-listing.txt | 19 +++ apps/nginxproxymanager/proxmox.meta.yaml | 7 + apps/nodecast-tv/README.md | 14 ++ apps/nodecast-tv/config/.env | 0 .../01-_opt_nodecast-tv_docker-compose.yml | 13 ++ ...pose-1-_opt_nodecast-tv_docker-compose.yml | 13 ++ apps/nodecast-tv/config/docker-compose.yml | 13 ++ .../env-1-_opt_nodecast-tv_docker-compose.yml | 0 apps/nodecast-tv/proxmox.meta.yaml | 7 + apps/opencloud/README.md | 10 ++ apps/opencloud/proxmox.meta.yaml | 6 + apps/passbolt/README.md | 10 ++ apps/passbolt/proxmox.meta.yaml | 6 + apps/paymenter/README.md | 14 ++ apps/paymenter/config/.env | 38 +++++ apps/paymenter/config/01-_opt_paymenter_.env | 38 +++++ apps/paymenter/config/docker-compose.yml | 54 ++++++ apps/paymenter/proxmox.meta.yaml | 7 + apps/pegaprox/README.md | 14 ++ apps/pegaprox/proxmox.meta.yaml | 7 + apps/proxmox/lxc-inventory.md | 75 +++++---- apps/proxy/README.md | 14 ++ apps/proxy/proxmox.meta.yaml | 7 + apps/pve-scripts-local/README.md | 14 ++ .../config/01-_opt_ProxmoxVE-Local_.env | 41 +++++ .../config/proxmoxve-local-files.txt | 30 ++++ apps/pve-scripts-local/proxmox.meta.yaml | 7 + apps/runtipi/README.md | 10 ++ apps/runtipi/proxmox.meta.yaml | 6 + apps/traccar/README.md | 10 ++ apps/traccar/proxmox.meta.yaml | 6 + apps/tunarr/README.md | 10 ++ apps/tunarr/proxmox.meta.yaml | 6 + apps/vaultwarden/README.md | 14 ++ apps/vaultwarden/config/.env | 7 + .../config/01-_opt_vaultwarden_.env | 7 + ..._vaultwarden_playwright_docker-compose.yml | 124 ++++++++++++++ ..._vaultwarden_playwright_docker-compose.yml | 124 ++++++++++++++ apps/vaultwarden/config/docker-compose.yml | 13 ++ ..._vaultwarden_playwright_docker-compose.yml | 0 apps/vaultwarden/config/vaultwarden.service | 29 ++++ apps/vaultwarden/docker-compose.yml | 6 + apps/vaultwarden/proxmox.meta.yaml | 7 + apps/vdi-el-kadi-nl/README.md | 10 ++ apps/vdi-el-kadi-nl/proxmox.meta.yaml | 6 + apps/virtualmin/README.md | 14 ++ apps/virtualmin/proxmox.meta.yaml | 7 + scripts/pull-lxc-from-proxmox.py | 157 ++++++++++++++++++ scripts/pull-lxc-from-proxmox.sh | 67 ++++++++ 85 files changed, 1392 insertions(+), 37 deletions(-) create mode 100644 apps/autocaliweb/README.md create mode 100644 apps/autocaliweb/proxmox.meta.yaml create mode 100644 apps/changedetection/README.md create mode 100644 apps/changedetection/proxmox.meta.yaml create mode 100644 apps/clawbot/README.md create mode 100644 apps/clawbot/proxmox.meta.yaml create mode 100644 apps/crowdsec/README.md create mode 100644 apps/crowdsec/proxmox.meta.yaml create mode 100644 apps/endurain/README.md create mode 100644 apps/endurain/proxmox.meta.yaml create mode 100644 apps/immich/README.md create mode 100644 apps/immich/proxmox.meta.yaml create mode 100644 apps/iventoy/README.md create mode 100644 apps/iventoy/proxmox.meta.yaml create mode 100644 apps/kasm/README.md create mode 100644 apps/kasm/proxmox.meta.yaml create mode 100644 apps/kimai/README.md create mode 100644 apps/kimai/proxmox.meta.yaml create mode 100644 apps/linkwarden/README.md create mode 100644 apps/linkwarden/config/.env create mode 100644 apps/linkwarden/config/02-_opt_linkwarden_node_modules_dotenv-cli_.env create mode 100644 apps/linkwarden/config/03-_opt_linkwarden_docker-compose.yml create mode 100644 apps/linkwarden/config/compose-1-_opt_linkwarden_docker-compose.yml create mode 100644 apps/linkwarden/config/docker-compose.full.yml create mode 100644 apps/linkwarden/config/env-1-_opt_linkwarden_docker-compose.yml create mode 100644 apps/linkwarden/proxmox.meta.yaml create mode 100644 apps/metube/README.md create mode 100644 apps/metube/proxmox.meta.yaml create mode 100644 apps/n8n/README.md create mode 100644 apps/n8n/proxmox.meta.yaml create mode 100644 apps/nextcloudpi/README.md create mode 100644 apps/nextcloudpi/proxmox.meta.yaml create mode 100644 apps/nginxproxymanager/README.md create mode 100644 apps/nginxproxymanager/config/npm-data-listing.txt create mode 100644 apps/nginxproxymanager/proxmox.meta.yaml create mode 100644 apps/nodecast-tv/README.md create mode 100644 apps/nodecast-tv/config/.env create mode 100644 apps/nodecast-tv/config/01-_opt_nodecast-tv_docker-compose.yml create mode 100644 apps/nodecast-tv/config/compose-1-_opt_nodecast-tv_docker-compose.yml create mode 100644 apps/nodecast-tv/config/docker-compose.yml create mode 100644 apps/nodecast-tv/config/env-1-_opt_nodecast-tv_docker-compose.yml create mode 100644 apps/nodecast-tv/proxmox.meta.yaml create mode 100644 apps/opencloud/README.md create mode 100644 apps/opencloud/proxmox.meta.yaml create mode 100644 apps/passbolt/README.md create mode 100644 apps/passbolt/proxmox.meta.yaml create mode 100644 apps/paymenter/README.md create mode 100644 apps/paymenter/config/.env create mode 100644 apps/paymenter/config/01-_opt_paymenter_.env create mode 100644 apps/paymenter/config/docker-compose.yml create mode 100644 apps/paymenter/proxmox.meta.yaml create mode 100644 apps/pegaprox/README.md create mode 100644 apps/pegaprox/proxmox.meta.yaml create mode 100644 apps/proxy/README.md create mode 100644 apps/proxy/proxmox.meta.yaml create mode 100644 apps/pve-scripts-local/README.md create mode 100644 apps/pve-scripts-local/config/01-_opt_ProxmoxVE-Local_.env create mode 100644 apps/pve-scripts-local/config/proxmoxve-local-files.txt create mode 100644 apps/pve-scripts-local/proxmox.meta.yaml create mode 100644 apps/runtipi/README.md create mode 100644 apps/runtipi/proxmox.meta.yaml create mode 100644 apps/traccar/README.md create mode 100644 apps/traccar/proxmox.meta.yaml create mode 100644 apps/tunarr/README.md create mode 100644 apps/tunarr/proxmox.meta.yaml create mode 100644 apps/vaultwarden/README.md create mode 100644 apps/vaultwarden/config/.env create mode 100644 apps/vaultwarden/config/01-_opt_vaultwarden_.env create mode 100644 apps/vaultwarden/config/02-_vaultwarden_playwright_docker-compose.yml create mode 100644 apps/vaultwarden/config/compose-1-_vaultwarden_playwright_docker-compose.yml create mode 100644 apps/vaultwarden/config/docker-compose.yml create mode 100644 apps/vaultwarden/config/env-1-_vaultwarden_playwright_docker-compose.yml create mode 100644 apps/vaultwarden/config/vaultwarden.service create mode 100644 apps/vaultwarden/docker-compose.yml create mode 100644 apps/vaultwarden/proxmox.meta.yaml create mode 100644 apps/vdi-el-kadi-nl/README.md create mode 100644 apps/vdi-el-kadi-nl/proxmox.meta.yaml create mode 100644 apps/virtualmin/README.md create mode 100644 apps/virtualmin/proxmox.meta.yaml create mode 100644 scripts/pull-lxc-from-proxmox.py create mode 100644 scripts/pull-lxc-from-proxmox.sh diff --git a/.env.example b/.env.example index c1db120..d2a453c 100644 --- a/.env.example +++ b/.env.example @@ -24,3 +24,8 @@ UNIFI_CONTROLLER_URL=https://192.168.1.24 UNIFI_USERNAME=mo UNIFI_PASSWORD=WaQTUw2t123! UNIFI_SITE=default + +# Proxmox API / SSH (voor scripts/pull-lxc-from-proxmox.py) +PROXMOX_PASSWORD=WaQTUw2t +PROXMOX_HOST_PVE=192.168.1.216 +PROXMOX_HOST_DELL=192.168.1.56 diff --git a/INVENTORY.md b/INVENTORY.md index e6d6822..4c58d60 100644 --- a/INVENTORY.md +++ b/INVENTORY.md @@ -65,6 +65,16 @@ Private repo. Laatst bijgewerkt vanaf NAS `192.168.1.211`. LXC/VM-overzicht: [apps/proxmox/lxc-inventory.md](apps/proxmox/lxc-inventory.md) +## Proxmox LXC apps (configs uit containers) + +Draaiend en gepull'd: vaultwarden, linkwarden, paymenter, nodecast-tv, pve-scripts-local, proxy, nginxproxymanager, virtualmin, pegaprox. + +Gestopt (alleen Proxmox `.conf` + stub): immich, n8n, runtipi, metube, tunarr, traccar, kasm, … — zie `apps//`. + +```bash +python3 scripts/pull-lxc-from-proxmox.py # op NAS, via Proxmox SSH +``` + ## Netwerk (vast IP) | IP | Rol | diff --git a/README.md b/README.md index 2d3f9c9..af057b6 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,10 @@ cd apps/postgres && docker compose up -d ## Proxmox backup ```bash +# /etc/pve van beide nodes scp -r root@192.168.1.216:/etc/pve/* apps/proxmox/hosts/pve/ scp -r root@192.168.1.56:/etc/pve/* apps/proxmox/hosts/dell-proxmox/ -git add apps/proxmox && git commit -m "proxmox backup" + +# App-configs uit draaiende LXC's (Docker, .env, systemd) +python3 scripts/pull-lxc-from-proxmox.py ``` diff --git a/apps/autocaliweb/README.md b/apps/autocaliweb/README.md new file mode 100644 index 0000000..2d452e9 --- /dev/null +++ b/apps/autocaliweb/README.md @@ -0,0 +1,10 @@ +# autocaliweb + +| | | +|---|---| +| **Proxmox** | pve (CT 100) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/pve/lxc/100.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/autocaliweb/proxmox.meta.yaml b/apps/autocaliweb/proxmox.meta.yaml new file mode 100644 index 0000000..7ce29e7 --- /dev/null +++ b/apps/autocaliweb/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: pve +proxmox_ip: 192.168.1.216 +vmid: 100 +hostname: autocaliweb +status: stopped diff --git a/apps/changedetection/README.md b/apps/changedetection/README.md new file mode 100644 index 0000000..036048a --- /dev/null +++ b/apps/changedetection/README.md @@ -0,0 +1,10 @@ +# changedetection + +| | | +|---|---| +| **Proxmox** | proxmox (CT 118) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/proxmox/lxc/118.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/changedetection/proxmox.meta.yaml b/apps/changedetection/proxmox.meta.yaml new file mode 100644 index 0000000..3d5c3b3 --- /dev/null +++ b/apps/changedetection/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: proxmox +proxmox_ip: 192.168.1.56 +vmid: 118 +hostname: changedetection +status: stopped diff --git a/apps/clawbot/README.md b/apps/clawbot/README.md new file mode 100644 index 0000000..f1b1094 --- /dev/null +++ b/apps/clawbot/README.md @@ -0,0 +1,10 @@ +# clawbot + +| | | +|---|---| +| **Proxmox** | pve (CT 102) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/pve/lxc/102.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/clawbot/proxmox.meta.yaml b/apps/clawbot/proxmox.meta.yaml new file mode 100644 index 0000000..84661d6 --- /dev/null +++ b/apps/clawbot/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: pve +proxmox_ip: 192.168.1.216 +vmid: 102 +hostname: clawbot +status: stopped diff --git a/apps/crowdsec/README.md b/apps/crowdsec/README.md new file mode 100644 index 0000000..ea5082b --- /dev/null +++ b/apps/crowdsec/README.md @@ -0,0 +1,10 @@ +# CrowdSec + +| | | +|---|---| +| **Proxmox** | pve (CT 103) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/pve/lxc/103.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/crowdsec/proxmox.meta.yaml b/apps/crowdsec/proxmox.meta.yaml new file mode 100644 index 0000000..d687446 --- /dev/null +++ b/apps/crowdsec/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: pve +proxmox_ip: 192.168.1.216 +vmid: 103 +hostname: CrowdSec +status: stopped diff --git a/apps/endurain/README.md b/apps/endurain/README.md new file mode 100644 index 0000000..39df48d --- /dev/null +++ b/apps/endurain/README.md @@ -0,0 +1,10 @@ +# endurain + +| | | +|---|---| +| **Proxmox** | pve (CT 114) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/pve/lxc/114.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/endurain/proxmox.meta.yaml b/apps/endurain/proxmox.meta.yaml new file mode 100644 index 0000000..6e9a9ff --- /dev/null +++ b/apps/endurain/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: pve +proxmox_ip: 192.168.1.216 +vmid: 114 +hostname: endurain +status: stopped diff --git a/apps/immich/README.md b/apps/immich/README.md new file mode 100644 index 0000000..4947141 --- /dev/null +++ b/apps/immich/README.md @@ -0,0 +1,10 @@ +# immich + +| | | +|---|---| +| **Proxmox** | pve (CT 112) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/pve/lxc/112.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/immich/proxmox.meta.yaml b/apps/immich/proxmox.meta.yaml new file mode 100644 index 0000000..c9142f0 --- /dev/null +++ b/apps/immich/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: pve +proxmox_ip: 192.168.1.216 +vmid: 112 +hostname: immich +status: stopped diff --git a/apps/iventoy/README.md b/apps/iventoy/README.md new file mode 100644 index 0000000..14e9309 --- /dev/null +++ b/apps/iventoy/README.md @@ -0,0 +1,10 @@ +# iventoy + +| | | +|---|---| +| **Proxmox** | proxmox (CT 112) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/proxmox/lxc/112.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/iventoy/proxmox.meta.yaml b/apps/iventoy/proxmox.meta.yaml new file mode 100644 index 0000000..cb53359 --- /dev/null +++ b/apps/iventoy/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: proxmox +proxmox_ip: 192.168.1.56 +vmid: 112 +hostname: iventoy +status: stopped diff --git a/apps/kasm/README.md b/apps/kasm/README.md new file mode 100644 index 0000000..610a34a --- /dev/null +++ b/apps/kasm/README.md @@ -0,0 +1,10 @@ +# kasm + +| | | +|---|---| +| **Proxmox** | proxmox (CT 115) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/proxmox/lxc/115.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/kasm/proxmox.meta.yaml b/apps/kasm/proxmox.meta.yaml new file mode 100644 index 0000000..a3b9db8 --- /dev/null +++ b/apps/kasm/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: proxmox +proxmox_ip: 192.168.1.56 +vmid: 115 +hostname: kasm +status: stopped diff --git a/apps/kimai/README.md b/apps/kimai/README.md new file mode 100644 index 0000000..892f6a8 --- /dev/null +++ b/apps/kimai/README.md @@ -0,0 +1,10 @@ +# kimai + +| | | +|---|---| +| **Proxmox** | pve (CT 106) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/pve/lxc/106.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/kimai/proxmox.meta.yaml b/apps/kimai/proxmox.meta.yaml new file mode 100644 index 0000000..63110fe --- /dev/null +++ b/apps/kimai/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: pve +proxmox_ip: 192.168.1.216 +vmid: 106 +hostname: kimai +status: stopped diff --git a/apps/linkwarden/README.md b/apps/linkwarden/README.md new file mode 100644 index 0000000..f5efc7c --- /dev/null +++ b/apps/linkwarden/README.md @@ -0,0 +1,14 @@ +# linkwarden + +| | | +|---|---| +| **Proxmox** | pve (CT 105) | +| **IP** | 192.168.1.142 | +| **Host** | 192.168.1.216 | + +Config in `config/` (gepull'd van LXC). + +```bash +# Op Proxmox host: +pct enter 105 +``` diff --git a/apps/linkwarden/config/.env b/apps/linkwarden/config/.env new file mode 100644 index 0000000..e69de29 diff --git a/apps/linkwarden/config/02-_opt_linkwarden_node_modules_dotenv-cli_.env b/apps/linkwarden/config/02-_opt_linkwarden_node_modules_dotenv-cli_.env new file mode 100644 index 0000000..3aa8c6d --- /dev/null +++ b/apps/linkwarden/config/02-_opt_linkwarden_node_modules_dotenv-cli_.env @@ -0,0 +1,6 @@ +TEST_PASS= +TEST_URL=http://localhost:${TEST_PORT}/api/v1 + +TEST_PORT_REVERSE=4000 +# Default value for port if no other specifies it +TEST_PORT=5000 \ No newline at end of file diff --git a/apps/linkwarden/config/03-_opt_linkwarden_docker-compose.yml b/apps/linkwarden/config/03-_opt_linkwarden_docker-compose.yml new file mode 100644 index 0000000..6523d84 --- /dev/null +++ b/apps/linkwarden/config/03-_opt_linkwarden_docker-compose.yml @@ -0,0 +1,28 @@ +services: + postgres: + image: postgres:16-alpine + env_file: .env + restart: always + volumes: + - ./pgdata:/var/lib/postgresql/data + linkwarden: + env_file: .env + environment: + - DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/postgres + restart: always + # build: . # uncomment to build from source + image: ghcr.io/linkwarden/linkwarden:latest # comment to build from source + ports: + - 3000:3000 + volumes: + - ./data:/data/data + depends_on: + - postgres + - meilisearch + meilisearch: + image: getmeili/meilisearch:v1.12.8 + restart: always + env_file: + - .env + volumes: + - ./meili_data:/meili_data diff --git a/apps/linkwarden/config/compose-1-_opt_linkwarden_docker-compose.yml b/apps/linkwarden/config/compose-1-_opt_linkwarden_docker-compose.yml new file mode 100644 index 0000000..6523d84 --- /dev/null +++ b/apps/linkwarden/config/compose-1-_opt_linkwarden_docker-compose.yml @@ -0,0 +1,28 @@ +services: + postgres: + image: postgres:16-alpine + env_file: .env + restart: always + volumes: + - ./pgdata:/var/lib/postgresql/data + linkwarden: + env_file: .env + environment: + - DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/postgres + restart: always + # build: . # uncomment to build from source + image: ghcr.io/linkwarden/linkwarden:latest # comment to build from source + ports: + - 3000:3000 + volumes: + - ./data:/data/data + depends_on: + - postgres + - meilisearch + meilisearch: + image: getmeili/meilisearch:v1.12.8 + restart: always + env_file: + - .env + volumes: + - ./meili_data:/meili_data diff --git a/apps/linkwarden/config/docker-compose.full.yml b/apps/linkwarden/config/docker-compose.full.yml new file mode 100644 index 0000000..e69de29 diff --git a/apps/linkwarden/config/env-1-_opt_linkwarden_docker-compose.yml b/apps/linkwarden/config/env-1-_opt_linkwarden_docker-compose.yml new file mode 100644 index 0000000..e69de29 diff --git a/apps/linkwarden/proxmox.meta.yaml b/apps/linkwarden/proxmox.meta.yaml new file mode 100644 index 0000000..eadd48d --- /dev/null +++ b/apps/linkwarden/proxmox.meta.yaml @@ -0,0 +1,7 @@ +# Auto-generated +host: pve +proxmox_ip: 192.168.1.216 +vmid: 105 +hostname: linkwarden +ip: 192.168.1.142 +status: running diff --git a/apps/metube/README.md b/apps/metube/README.md new file mode 100644 index 0000000..c5bcc9a --- /dev/null +++ b/apps/metube/README.md @@ -0,0 +1,10 @@ +# metube + +| | | +|---|---| +| **Proxmox** | pve (CT 113) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/pve/lxc/113.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/metube/proxmox.meta.yaml b/apps/metube/proxmox.meta.yaml new file mode 100644 index 0000000..5e6d082 --- /dev/null +++ b/apps/metube/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: pve +proxmox_ip: 192.168.1.216 +vmid: 113 +hostname: metube +status: stopped diff --git a/apps/n8n/README.md b/apps/n8n/README.md new file mode 100644 index 0000000..0916f93 --- /dev/null +++ b/apps/n8n/README.md @@ -0,0 +1,10 @@ +# n8n + +| | | +|---|---| +| **Proxmox** | proxmox (CT 100) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/proxmox/lxc/100.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/n8n/proxmox.meta.yaml b/apps/n8n/proxmox.meta.yaml new file mode 100644 index 0000000..1153d75 --- /dev/null +++ b/apps/n8n/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: proxmox +proxmox_ip: 192.168.1.56 +vmid: 100 +hostname: n8n +status: stopped diff --git a/apps/nextcloudpi/README.md b/apps/nextcloudpi/README.md new file mode 100644 index 0000000..4c28ec3 --- /dev/null +++ b/apps/nextcloudpi/README.md @@ -0,0 +1,10 @@ +# nextcloudpi + +| | | +|---|---| +| **Proxmox** | proxmox (CT 110) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/proxmox/lxc/110.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/nextcloudpi/proxmox.meta.yaml b/apps/nextcloudpi/proxmox.meta.yaml new file mode 100644 index 0000000..28c0459 --- /dev/null +++ b/apps/nextcloudpi/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: proxmox +proxmox_ip: 192.168.1.56 +vmid: 110 +hostname: nextcloudpi +status: stopped diff --git a/apps/nginxproxymanager/README.md b/apps/nginxproxymanager/README.md new file mode 100644 index 0000000..8899e22 --- /dev/null +++ b/apps/nginxproxymanager/README.md @@ -0,0 +1,16 @@ +# Nginx Proxy Manager + +| | | +|---|---| +| **Proxmox** | dell-proxmox CT 109 | +| **IP** | 192.168.1.173 | +| **UI** | http://192.168.1.173:81 | + +Native install (geen docker-compose). Data in `/data` op de LXC. + +| Bestand in git | Inhoud | +|---------------|--------| +| `config/npm-data-listing.txt` | Directory listing `/data` | +| `proxmox.meta.yaml` | CT metadata | + +Backup handmatig: `pct pull 109 /data/nginx ./config/nginx/` op Proxmox host. diff --git a/apps/nginxproxymanager/config/npm-data-listing.txt b/apps/nginxproxymanager/config/npm-data-listing.txt new file mode 100644 index 0000000..7f09c6f --- /dev/null +++ b/apps/nginxproxymanager/config/npm-data-listing.txt @@ -0,0 +1,19 @@ +total 408 +drwxr-xr-x 7 root root 4096 May 17 12:11 . +drwxr-xr-x 20 root root 4096 Mar 11 21:56 .. +drwxr-xr-x 2 root root 4096 May 23 2025 access +drwxr-xr-x 2 root root 4096 May 23 2025 custom_ssl +-rw-r--r-- 1 root root 344064 May 17 12:11 database.sqlite +-rw-r--r-- 1 root root 2190 May 23 2025 keys.json +drwxr-xr-x 3 root root 4096 May 23 2025 letsencrypt-acme-challenge +drwxr-xr-x 2 root root 36864 May 17 00:00 logs +drwxr-xr-x 9 root root 4096 May 23 2025 nginx +dead_host +default_host +default_www +dummycert.pem +dummykey.pem +proxy_host +redirection_host +stream +temp diff --git a/apps/nginxproxymanager/proxmox.meta.yaml b/apps/nginxproxymanager/proxmox.meta.yaml new file mode 100644 index 0000000..a51c206 --- /dev/null +++ b/apps/nginxproxymanager/proxmox.meta.yaml @@ -0,0 +1,7 @@ +# Auto-generated +host: proxmox +proxmox_ip: 192.168.1.56 +vmid: 109 +hostname: nginxproxymanager +ip: 192.168.1.173 +status: running diff --git a/apps/nodecast-tv/README.md b/apps/nodecast-tv/README.md new file mode 100644 index 0000000..6c9ec14 --- /dev/null +++ b/apps/nodecast-tv/README.md @@ -0,0 +1,14 @@ +# nodecast-tv + +| | | +|---|---| +| **Proxmox** | pve (CT 119) | +| **IP** | 192.168.1.99 | +| **Host** | 192.168.1.216 | + +Config in `config/` (gepull'd van LXC). + +```bash +# Op Proxmox host: +pct enter 119 +``` diff --git a/apps/nodecast-tv/config/.env b/apps/nodecast-tv/config/.env new file mode 100644 index 0000000..e69de29 diff --git a/apps/nodecast-tv/config/01-_opt_nodecast-tv_docker-compose.yml b/apps/nodecast-tv/config/01-_opt_nodecast-tv_docker-compose.yml new file mode 100644 index 0000000..6de58db --- /dev/null +++ b/apps/nodecast-tv/config/01-_opt_nodecast-tv_docker-compose.yml @@ -0,0 +1,13 @@ +services: + nodecast-tv: + image: ghcr.io/technomancer702/nodecast-tv:latest + build: https://github.com/technomancer702/nodecast-tv.git#main + container_name: nodecast-tv + ports: + - "3000:3000" + volumes: + - ./data:/app/data + restart: unless-stopped + environment: + - NODE_ENV=production + - PORT=3000 # Internal container port diff --git a/apps/nodecast-tv/config/compose-1-_opt_nodecast-tv_docker-compose.yml b/apps/nodecast-tv/config/compose-1-_opt_nodecast-tv_docker-compose.yml new file mode 100644 index 0000000..6de58db --- /dev/null +++ b/apps/nodecast-tv/config/compose-1-_opt_nodecast-tv_docker-compose.yml @@ -0,0 +1,13 @@ +services: + nodecast-tv: + image: ghcr.io/technomancer702/nodecast-tv:latest + build: https://github.com/technomancer702/nodecast-tv.git#main + container_name: nodecast-tv + ports: + - "3000:3000" + volumes: + - ./data:/app/data + restart: unless-stopped + environment: + - NODE_ENV=production + - PORT=3000 # Internal container port diff --git a/apps/nodecast-tv/config/docker-compose.yml b/apps/nodecast-tv/config/docker-compose.yml new file mode 100644 index 0000000..6de58db --- /dev/null +++ b/apps/nodecast-tv/config/docker-compose.yml @@ -0,0 +1,13 @@ +services: + nodecast-tv: + image: ghcr.io/technomancer702/nodecast-tv:latest + build: https://github.com/technomancer702/nodecast-tv.git#main + container_name: nodecast-tv + ports: + - "3000:3000" + volumes: + - ./data:/app/data + restart: unless-stopped + environment: + - NODE_ENV=production + - PORT=3000 # Internal container port diff --git a/apps/nodecast-tv/config/env-1-_opt_nodecast-tv_docker-compose.yml b/apps/nodecast-tv/config/env-1-_opt_nodecast-tv_docker-compose.yml new file mode 100644 index 0000000..e69de29 diff --git a/apps/nodecast-tv/proxmox.meta.yaml b/apps/nodecast-tv/proxmox.meta.yaml new file mode 100644 index 0000000..3aee95d --- /dev/null +++ b/apps/nodecast-tv/proxmox.meta.yaml @@ -0,0 +1,7 @@ +# Auto-generated +host: pve +proxmox_ip: 192.168.1.216 +vmid: 119 +hostname: nodecast-tv +ip: 192.168.1.99 +status: running diff --git a/apps/opencloud/README.md b/apps/opencloud/README.md new file mode 100644 index 0000000..c3f498d --- /dev/null +++ b/apps/opencloud/README.md @@ -0,0 +1,10 @@ +# opencloud + +| | | +|---|---| +| **Proxmox** | pve (CT 116) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/pve/lxc/116.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/opencloud/proxmox.meta.yaml b/apps/opencloud/proxmox.meta.yaml new file mode 100644 index 0000000..79351a9 --- /dev/null +++ b/apps/opencloud/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: pve +proxmox_ip: 192.168.1.216 +vmid: 116 +hostname: opencloud +status: stopped diff --git a/apps/passbolt/README.md b/apps/passbolt/README.md new file mode 100644 index 0000000..be78055 --- /dev/null +++ b/apps/passbolt/README.md @@ -0,0 +1,10 @@ +# passbolt + +| | | +|---|---| +| **Proxmox** | pve (CT 110) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/pve/lxc/110.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/passbolt/proxmox.meta.yaml b/apps/passbolt/proxmox.meta.yaml new file mode 100644 index 0000000..f36d775 --- /dev/null +++ b/apps/passbolt/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: pve +proxmox_ip: 192.168.1.216 +vmid: 110 +hostname: passbolt +status: stopped diff --git a/apps/paymenter/README.md b/apps/paymenter/README.md new file mode 100644 index 0000000..aa4fba7 --- /dev/null +++ b/apps/paymenter/README.md @@ -0,0 +1,14 @@ +# paymenter + +| | | +|---|---| +| **Proxmox** | pve (CT 118) | +| **IP** | 192.168.1.45 | +| **Host** | 192.168.1.216 | + +Config in `config/` (gepull'd van LXC). + +```bash +# Op Proxmox host: +pct enter 118 +``` diff --git a/apps/paymenter/config/.env b/apps/paymenter/config/.env new file mode 100644 index 0000000..233258a --- /dev/null +++ b/apps/paymenter/config/.env @@ -0,0 +1,38 @@ +APP_NAME=Paymenter +APP_ENV=production +APP_KEY=base64:kbbDXGtU1mzp181rLQan1jt+SjbO4gVxOexjwSMz5Hk= +APP_DEBUG=false +APP_TIMEZONE=UTC + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +APP_MAINTENANCE_STORE=database + +BCRYPT_ROUNDS=12 + +LOG_CHANNEL=stack +LOG_STACK=daily +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=mariadb +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=paymenter +DB_USERNAME=paymenter +DB_PASSWORD=XU9rOictz7O3p + +BROADCAST_CONNECTION=log +CACHE_STORE=redis +FILESYSTEM_DISK=local +SESSION_LIFETIME=120 + +MEMCACHED_HOST=127.0.0.1 + +REDIS_CLIENT=phpredis +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 \ No newline at end of file diff --git a/apps/paymenter/config/01-_opt_paymenter_.env b/apps/paymenter/config/01-_opt_paymenter_.env new file mode 100644 index 0000000..233258a --- /dev/null +++ b/apps/paymenter/config/01-_opt_paymenter_.env @@ -0,0 +1,38 @@ +APP_NAME=Paymenter +APP_ENV=production +APP_KEY=base64:kbbDXGtU1mzp181rLQan1jt+SjbO4gVxOexjwSMz5Hk= +APP_DEBUG=false +APP_TIMEZONE=UTC + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +APP_MAINTENANCE_STORE=database + +BCRYPT_ROUNDS=12 + +LOG_CHANNEL=stack +LOG_STACK=daily +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=mariadb +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=paymenter +DB_USERNAME=paymenter +DB_PASSWORD=XU9rOictz7O3p + +BROADCAST_CONNECTION=log +CACHE_STORE=redis +FILESYSTEM_DISK=local +SESSION_LIFETIME=120 + +MEMCACHED_HOST=127.0.0.1 + +REDIS_CLIENT=phpredis +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 \ No newline at end of file diff --git a/apps/paymenter/config/docker-compose.yml b/apps/paymenter/config/docker-compose.yml new file mode 100644 index 0000000..e2f0ce7 --- /dev/null +++ b/apps/paymenter/config/docker-compose.yml @@ -0,0 +1,54 @@ +x-common: + database: + &db-environment + # Do not remove the "&db-password" from the end of the line below, it is important + # for Paymenter functionality. + MYSQL_PASSWORD: &db-password "CHANGE_ME" + MYSQL_ROOT_PASSWORD: "CHANGE_ME_TOO" + +# +# ------------------------------------------------------------------------------------------ +# DANGER ZONE BELOW +# +# The remainder of this file likely does not need to be changed. Please only make modifications +# below if you understand what you are doing. +# +services: + database: + image: mariadb:lts + restart: always + command: --default-authentication-plugin=mysql_native_password + volumes: + - "./database:/var/lib/mysql" + environment: + <<: *db-environment + MYSQL_DATABASE: "paymenter" + MYSQL_USER: "paymenter" + cache: + image: redis:alpine + restart: always + paymenter: + image: ghcr.io/paymenter/paymenter:master + restart: always + ports: + - "80:80" + links: + - database + - cache + volumes: + - "./:/app/var/" + - "./storage/logs:/app/storage/logs" + - "./storage/public:/app/storage/app/public" + environment: + DB_PASSWORD: *db-password + APP_ENV: "production" + CACHE_STORE: "redis" + REDIS_HOST: "cache" + DB_CONNECTION: "mariadb" + DB_HOST: "database" + DB_PORT: "3306" +networks: + default: + ipam: + config: + - subnet: 172.23.0.0/16 diff --git a/apps/paymenter/proxmox.meta.yaml b/apps/paymenter/proxmox.meta.yaml new file mode 100644 index 0000000..f674295 --- /dev/null +++ b/apps/paymenter/proxmox.meta.yaml @@ -0,0 +1,7 @@ +# Auto-generated +host: pve +proxmox_ip: 192.168.1.216 +vmid: 118 +hostname: paymenter +ip: 192.168.1.45 +status: running diff --git a/apps/pegaprox/README.md b/apps/pegaprox/README.md new file mode 100644 index 0000000..7bf3d52 --- /dev/null +++ b/apps/pegaprox/README.md @@ -0,0 +1,14 @@ +# pegaprox + +| | | +|---|---| +| **Proxmox** | proxmox (CT 111) | +| **IP** | 192.168.1.249 | +| **Host** | 192.168.1.56 | + +Config in `config/` (gepull'd van LXC). + +```bash +# Op Proxmox host: +pct enter 111 +``` diff --git a/apps/pegaprox/proxmox.meta.yaml b/apps/pegaprox/proxmox.meta.yaml new file mode 100644 index 0000000..b37b758 --- /dev/null +++ b/apps/pegaprox/proxmox.meta.yaml @@ -0,0 +1,7 @@ +# Auto-generated +host: proxmox +proxmox_ip: 192.168.1.56 +vmid: 111 +hostname: pegaprox +ip: 192.168.1.249 +status: running diff --git a/apps/proxmox/lxc-inventory.md b/apps/proxmox/lxc-inventory.md index 13cdbb4..c82d32d 100644 --- a/apps/proxmox/lxc-inventory.md +++ b/apps/proxmox/lxc-inventory.md @@ -1,6 +1,8 @@ # Proxmox — LXC & VM overzicht -Configs: `hosts//lxc/*.conf` en `qemu-server/*.conf` +Configs: `hosts//lxc/*.conf` · App-configs: `apps//` + +**Pull configs van draaiende CTs:** `python3 scripts/pull-lxc-from-proxmox.py` ## Host: pve (192.168.1.216) @@ -11,26 +13,26 @@ Configs: `hosts//lxc/*.conf` en `qemu-server/*.conf` | 111 | Syno-latest | ### LXCs -| VMID | Hostname | -|------|----------| -| 100 | autocaliweb | -| 102 | clawbot | -| 103 | CrowdSec | -| 104 | vaultwarden | -| 105 | linkwarden | -| 106 | kimai | -| 107 | pve-scripts-local | -| 108 | tunarr | -| 109 | nextcloudpi | -| 110 | passbolt | -| 112 | immich | -| 113 | metube | -| 114 | endurain | -| 115 | passbolt | -| 116 | opencloud | -| 117 | Proxy | -| 118 | paymenter | -| 119 | nodecast-tv | +| VMID | Hostname | IP (live) | App map | Status | +|------|----------|-----------|---------|--------| +| 100 | autocaliweb | — | [autocaliweb](../autocaliweb/) | stopped | +| 102 | clawbot | — | [clawbot](../clawbot/) | stopped | +| 103 | CrowdSec | — | [crowdsec](../crowdsec/) | stopped | +| 104 | vaultwarden | 192.168.1.5 | [vaultwarden](../vaultwarden/) | **running** | +| 105 | linkwarden | 192.168.1.142 | [linkwarden](../linkwarden/) | **running** | +| 106 | kimai | — | [kimai](../kimai/) | stopped | +| 107 | pve-scripts-local | 192.168.1.23 | [pve-scripts-local](../pve-scripts-local/) | **running** | +| 108 | tunarr | — | [tunarr](../tunarr/) | stopped | +| 109 | nextcloudpi | — | [nextcloudpi](../nextcloudpi/) | stopped | +| 110 | passbolt | — | [passbolt](../passbolt/) | stopped | +| 112 | immich | — | [immich](../immich/) | stopped | +| 113 | metube | — | [metube](../metube/) | stopped | +| 114 | endurain | — | [endurain](../endurain/) | stopped | +| 115 | passbolt | — | [passbolt](../passbolt/) | stopped | +| 116 | opencloud | — | [opencloud](../opencloud/) | stopped | +| 117 | Proxy | 192.168.1.165 | [proxy](../proxy/) | **running** | +| 118 | paymenter | 192.168.1.45 | [paymenter](../paymenter/) | **running** | +| 119 | nodecast-tv | 192.168.1.99 | [nodecast-tv](../nodecast-tv/) | **running** | ## Host: dell-proxmox (192.168.1.56) @@ -44,19 +46,20 @@ Configs: `hosts//lxc/*.conf` en `qemu-server/*.conf` | 105 | docker | ### LXCs -| VMID | Hostname | -|------|----------| -| 100 | n8n | -| 106 | vdi.el-kadi.nl | -| 107 | Virtualmin | -| 108 | n8n | -| 109 | nginxproxymanager | -| 110 | nextcloudpi | -| 112 | iventoy | -| 113 | traccar | -| 115 | kasm | -| 116 | runtipi | -| 118 | changedetection | -| 119 | n8n | +| VMID | Hostname | IP (live) | App map | Status | +|------|----------|-----------|---------|--------| +| 100 | n8n | — | [n8n](../n8n/) | stopped | +| 106 | vdi.el-kadi.nl | — | [vdi-el-kadi-nl](../vdi-el-kadi-nl/) | stopped | +| 107 | Virtualmin | 192.168.5.24 | [virtualmin](../virtualmin/) | **running** | +| 108 | n8n | — | [n8n](../n8n/) | stopped | +| 109 | nginxproxymanager | 192.168.1.173 | [nginxproxymanager](../nginxproxymanager/) | **running** | +| 110 | nextcloudpi | — | [nextcloudpi](../nextcloudpi/) | stopped | +| 111 | pegaprox | 192.168.1.249 | [pegaprox](../pegaprox/) | **running** | +| 112 | iventoy | — | [iventoy](../iventoy/) | stopped | +| 113 | traccar | — | [traccar](../traccar/) | stopped | +| 115 | kasm | — | [kasm](../kasm/) | stopped | +| 116 | runtipi | — | [runtipi](../runtipi/) | stopped | +| 118 | changedetection | — | [changedetection](../changedetection/) | stopped | +| 119 | n8n | — | [n8n](../n8n/) | stopped | -> App-configs binnen LXCs: backup via `pct enter ` of volume mount. Proxmox container-definitie staat al in git. +> Meerdere CTs met dezelfde hostname (n8n, passbolt) — aparte VMIDs, zie `hosts/.../lxc/*.conf`. diff --git a/apps/proxy/README.md b/apps/proxy/README.md new file mode 100644 index 0000000..56ef8bd --- /dev/null +++ b/apps/proxy/README.md @@ -0,0 +1,14 @@ +# Proxy + +| | | +|---|---| +| **Proxmox** | pve (CT 117) | +| **IP** | 192.168.1.165 | +| **Host** | 192.168.1.216 | + +Config in `config/` (gepull'd van LXC). + +```bash +# Op Proxmox host: +pct enter 117 +``` diff --git a/apps/proxy/proxmox.meta.yaml b/apps/proxy/proxmox.meta.yaml new file mode 100644 index 0000000..c3cd2d8 --- /dev/null +++ b/apps/proxy/proxmox.meta.yaml @@ -0,0 +1,7 @@ +# Auto-generated +host: pve +proxmox_ip: 192.168.1.216 +vmid: 117 +hostname: Proxy +ip: 192.168.1.165 +status: running diff --git a/apps/pve-scripts-local/README.md b/apps/pve-scripts-local/README.md new file mode 100644 index 0000000..8fecc82 --- /dev/null +++ b/apps/pve-scripts-local/README.md @@ -0,0 +1,14 @@ +# pve-scripts-local + +| | | +|---|---| +| **Proxmox** | pve (CT 107) | +| **IP** | 192.168.1.23 | +| **Host** | 192.168.1.216 | + +Config in `config/` (gepull'd van LXC). + +```bash +# Op Proxmox host: +pct enter 107 +``` diff --git a/apps/pve-scripts-local/config/01-_opt_ProxmoxVE-Local_.env b/apps/pve-scripts-local/config/01-_opt_ProxmoxVE-Local_.env new file mode 100644 index 0000000..02d4807 --- /dev/null +++ b/apps/pve-scripts-local/config/01-_opt_ProxmoxVE-Local_.env @@ -0,0 +1,41 @@ +# When adding additional environment variables, the schema in "/src/env.js" +# should be updated accordingly. + +REPO_URL="https://github.com/community-scripts/ProxmoxVE" +REPO_BRANCH="main" +SCRIPTS_DIRECTORY="scripts" +ALLOWED_SCRIPT_EXTENSIONS=".sh" + +CT_SCRIPT_FOLDER="ct" +INSTALL_SCRIPT_FOLDER="install" +JSON_FOLDER="frontend/public/json" + +# Security +MAX_SCRIPT_EXECUTION_TIME="900000" +ALLOWED_SCRIPT_PATHS="scripts/" + +# WebSocket Configuration +WEBSOCKET_PORT="3001" + +# User settings +GITHUB_TOKEN=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 +SAVE_FILTER=false +FILTERS= +AUTH_USERNAME=mo-admin +AUTH_PASSWORD_HASH=$2b$10$3QeM5p2KAn1vAE1A43B4suE5f4qEHYfB4ksAbf0DgtNhhpJJInzF. +AUTH_ENABLED=true +AUTH_SETUP_COMPLETED=true +JWT_SECRET= +DATABASE_URL="file:/opt/ProxmoxVE-Local/data/settings.db" +AUTO_SYNC_ENABLED=false +SYNC_INTERVAL_TYPE= +SYNC_INTERVAL_PREDEFINED= +AUTO_DOWNLOAD_NEW= +AUTO_UPDATE_EXISTING= +NOTIFICATION_ENABLED= +APPRISE_URLS= +LAST_AUTO_SYNC= +SYNC_INTERVAL_CRON= +JWT_SECRET=953fe5a2b3df5a28b5f922128f2b60c9f4672d3c4509858369babe93b2c32c8d92bfafe3ca5f6a71ede018bceec7b2a3507ce62f865efd0294a2d5ac55ffc08f +VIEW_MODE=list +JWT_SECRET=809b2d1ed7388e6fd443316d36e4c6b0bb60b82f8e017e01d9243d8cce0f0a6febca812cb2c7090b6c218b0a9b3852bf3bf9bb56c1a20f3778316382c8abff52 diff --git a/apps/pve-scripts-local/config/proxmoxve-local-files.txt b/apps/pve-scripts-local/config/proxmoxve-local-files.txt new file mode 100644 index 0000000..aafbecc --- /dev/null +++ b/apps/pve-scripts-local/config/proxmoxve-local-files.txt @@ -0,0 +1,30 @@ +/opt/ProxmoxVE-Local/server.js +/opt/ProxmoxVE-Local/.gitattributes +/opt/ProxmoxVE-Local/README.md +/opt/ProxmoxVE-Local/.env +/opt/ProxmoxVE-Local/data/settings.db +/opt/ProxmoxVE-Local/VERSION +/opt/ProxmoxVE-Local/postcss.config.js +/opt/ProxmoxVE-Local/.next/app-path-routes-manifest.json +/opt/ProxmoxVE-Local/.next/build-manifest.json +/opt/ProxmoxVE-Local/.next/next-server.js.nft.json +/opt/ProxmoxVE-Local/.next/package.json +/opt/ProxmoxVE-Local/.next/app-build-manifest.json +/opt/ProxmoxVE-Local/.next/react-loadable-manifest.json +/opt/ProxmoxVE-Local/.next/prerender-manifest.json +/opt/ProxmoxVE-Local/.next/routes-manifest.json +/opt/ProxmoxVE-Local/.next/trace +/opt/ProxmoxVE-Local/.next/required-server-files.json +/opt/ProxmoxVE-Local/.next/BUILD_ID +/opt/ProxmoxVE-Local/.next/export-marker.json +/opt/ProxmoxVE-Local/.next/next-minimal-server.js.nft.json +/opt/ProxmoxVE-Local/.next/images-manifest.json +/opt/ProxmoxVE-Local/prisma/schema.prisma +/opt/ProxmoxVE-Local/.github/release-drafter.yml +/opt/ProxmoxVE-Local/.github/CODEOWNERS +/opt/ProxmoxVE-Local/.github/dependabot.yml +/opt/ProxmoxVE-Local/.github/pull_request_template.md +/opt/ProxmoxVE-Local/.github/logo.png +/opt/ProxmoxVE-Local/package.json +/opt/ProxmoxVE-Local/src/env.js +/opt/ProxmoxVE-Local/prettier.config.js diff --git a/apps/pve-scripts-local/proxmox.meta.yaml b/apps/pve-scripts-local/proxmox.meta.yaml new file mode 100644 index 0000000..2d83ffb --- /dev/null +++ b/apps/pve-scripts-local/proxmox.meta.yaml @@ -0,0 +1,7 @@ +# Auto-generated +host: pve +proxmox_ip: 192.168.1.216 +vmid: 107 +hostname: pve-scripts-local +ip: 192.168.1.23 +status: running diff --git a/apps/runtipi/README.md b/apps/runtipi/README.md new file mode 100644 index 0000000..a7585f5 --- /dev/null +++ b/apps/runtipi/README.md @@ -0,0 +1,10 @@ +# runtipi + +| | | +|---|---| +| **Proxmox** | proxmox (CT 116) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/proxmox/lxc/116.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/runtipi/proxmox.meta.yaml b/apps/runtipi/proxmox.meta.yaml new file mode 100644 index 0000000..433ae07 --- /dev/null +++ b/apps/runtipi/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: proxmox +proxmox_ip: 192.168.1.56 +vmid: 116 +hostname: runtipi +status: stopped diff --git a/apps/traccar/README.md b/apps/traccar/README.md new file mode 100644 index 0000000..e3f8679 --- /dev/null +++ b/apps/traccar/README.md @@ -0,0 +1,10 @@ +# traccar + +| | | +|---|---| +| **Proxmox** | proxmox (CT 113) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/proxmox/lxc/113.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/traccar/proxmox.meta.yaml b/apps/traccar/proxmox.meta.yaml new file mode 100644 index 0000000..1aae079 --- /dev/null +++ b/apps/traccar/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: proxmox +proxmox_ip: 192.168.1.56 +vmid: 113 +hostname: traccar +status: stopped diff --git a/apps/tunarr/README.md b/apps/tunarr/README.md new file mode 100644 index 0000000..d582afe --- /dev/null +++ b/apps/tunarr/README.md @@ -0,0 +1,10 @@ +# tunarr + +| | | +|---|---| +| **Proxmox** | pve (CT 108) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/pve/lxc/108.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/tunarr/proxmox.meta.yaml b/apps/tunarr/proxmox.meta.yaml new file mode 100644 index 0000000..6be84df --- /dev/null +++ b/apps/tunarr/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: pve +proxmox_ip: 192.168.1.216 +vmid: 108 +hostname: tunarr +status: stopped diff --git a/apps/vaultwarden/README.md b/apps/vaultwarden/README.md new file mode 100644 index 0000000..eec0b6f --- /dev/null +++ b/apps/vaultwarden/README.md @@ -0,0 +1,14 @@ +# vaultwarden + +| | | +|---|---| +| **Proxmox** | pve (CT 104) | +| **IP** | 192.168.1.5 | +| **Host** | 192.168.1.216 | + +Config in `config/` (gepull'd van LXC). + +```bash +# Op Proxmox host: +pct enter 104 +``` diff --git a/apps/vaultwarden/config/.env b/apps/vaultwarden/config/.env new file mode 100644 index 0000000..0ce9420 --- /dev/null +++ b/apps/vaultwarden/config/.env @@ -0,0 +1,7 @@ +ADMIN_TOKEN='' +ROCKET_ADDRESS=0.0.0.0 +ROCKET_TLS='{certs="/opt/vaultwarden/ssl-cert-snakeoil.pem",key="/opt/vaultwarden/ssl-cert-snakeoil.key"}' +DATA_FOLDER=/opt/vaultwarden/data +DATABASE_MAX_CONNS=10 +WEB_VAULT_FOLDER=/opt/vaultwarden/web-vault +WEB_VAULT_ENABLED=true diff --git a/apps/vaultwarden/config/01-_opt_vaultwarden_.env b/apps/vaultwarden/config/01-_opt_vaultwarden_.env new file mode 100644 index 0000000..0ce9420 --- /dev/null +++ b/apps/vaultwarden/config/01-_opt_vaultwarden_.env @@ -0,0 +1,7 @@ +ADMIN_TOKEN='' +ROCKET_ADDRESS=0.0.0.0 +ROCKET_TLS='{certs="/opt/vaultwarden/ssl-cert-snakeoil.pem",key="/opt/vaultwarden/ssl-cert-snakeoil.key"}' +DATA_FOLDER=/opt/vaultwarden/data +DATABASE_MAX_CONNS=10 +WEB_VAULT_FOLDER=/opt/vaultwarden/web-vault +WEB_VAULT_ENABLED=true diff --git a/apps/vaultwarden/config/02-_vaultwarden_playwright_docker-compose.yml b/apps/vaultwarden/config/02-_vaultwarden_playwright_docker-compose.yml new file mode 100644 index 0000000..3e56477 --- /dev/null +++ b/apps/vaultwarden/config/02-_vaultwarden_playwright_docker-compose.yml @@ -0,0 +1,124 @@ +services: + VaultwardenPrebuild: + profiles: ["playwright", "vaultwarden"] + container_name: playwright_oidc_vaultwarden_prebuilt + image: playwright_oidc_vaultwarden_prebuilt + build: + context: .. + dockerfile: Dockerfile + entrypoint: /bin/bash + restart: "no" + + Vaultwarden: + profiles: ["playwright", "vaultwarden"] + container_name: playwright_oidc_vaultwarden-${ENV:-dev} + image: playwright_oidc_vaultwarden-${ENV:-dev} + network_mode: "host" + build: + context: compose/warden + dockerfile: Dockerfile + args: + REPO_URL: ${PW_WV_REPO_URL:-} + COMMIT_HASH: ${PW_WV_COMMIT_HASH:-} + env_file: ${DC_ENV_FILE:-.env} + environment: + - DATABASE_URL + - I_REALLY_WANT_VOLATILE_STORAGE + - LOG_LEVEL + - LOGIN_RATELIMIT_MAX_BURST + - SMTP_HOST + - SMTP_FROM + - SMTP_DEBUG + - SSO_DEBUG_TOKENS + - SSO_FRONTEND + - SSO_ENABLED + - SSO_ONLY + restart: "no" + depends_on: + - VaultwardenPrebuild + + Playwright: + profiles: ["playwright"] + container_name: playwright_oidc_playwright + image: playwright_oidc_playwright + network_mode: "host" + build: + context: . + dockerfile: compose/playwright/Dockerfile + environment: + - PW_WV_REPO_URL + - PW_WV_COMMIT_HASH + restart: "no" + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ..:/project + + Mariadb: + profiles: ["playwright"] + container_name: playwright_mariadb + image: mariadb:11.2.4 + env_file: test.env + healthcheck: + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + start_period: 10s + interval: 10s + ports: + - ${MARIADB_PORT}:3306 + + Mysql: + profiles: ["playwright"] + container_name: playwright_mysql + image: mysql:8.4.1 + env_file: test.env + healthcheck: + test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"] + start_period: 10s + interval: 10s + ports: + - ${MYSQL_PORT}:3306 + + Postgres: + profiles: ["playwright"] + container_name: playwright_postgres + image: postgres:16.3 + env_file: test.env + healthcheck: + test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"] + start_period: 20s + interval: 30s + ports: + - ${POSTGRES_PORT}:5432 + + Maildev: + profiles: ["vaultwarden", "maildev"] + container_name: maildev + image: timshel/maildev:3.0.4 + ports: + - ${SMTP_PORT}:1025 + - 1080:1080 + + Keycloak: + profiles: ["keycloak", "vaultwarden"] + container_name: keycloak-${ENV:-dev} + image: quay.io/keycloak/keycloak:25.0.4 + network_mode: "host" + command: + - start-dev + env_file: ${DC_ENV_FILE:-.env} + + KeycloakSetup: + profiles: ["keycloak", "vaultwarden"] + container_name: keycloakSetup-${ENV:-dev} + image: keycloak_setup-${ENV:-dev} + build: + context: compose/keycloak + dockerfile: Dockerfile + args: + KEYCLOAK_VERSION: 25.0.4 + JAVA_URL: https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_linux-x64_bin.tar.gz + JAVA_VERSION: 21.0.2 + network_mode: "host" + depends_on: + - Keycloak + restart: "no" + env_file: ${DC_ENV_FILE:-.env} diff --git a/apps/vaultwarden/config/compose-1-_vaultwarden_playwright_docker-compose.yml b/apps/vaultwarden/config/compose-1-_vaultwarden_playwright_docker-compose.yml new file mode 100644 index 0000000..3e56477 --- /dev/null +++ b/apps/vaultwarden/config/compose-1-_vaultwarden_playwright_docker-compose.yml @@ -0,0 +1,124 @@ +services: + VaultwardenPrebuild: + profiles: ["playwright", "vaultwarden"] + container_name: playwright_oidc_vaultwarden_prebuilt + image: playwright_oidc_vaultwarden_prebuilt + build: + context: .. + dockerfile: Dockerfile + entrypoint: /bin/bash + restart: "no" + + Vaultwarden: + profiles: ["playwright", "vaultwarden"] + container_name: playwright_oidc_vaultwarden-${ENV:-dev} + image: playwright_oidc_vaultwarden-${ENV:-dev} + network_mode: "host" + build: + context: compose/warden + dockerfile: Dockerfile + args: + REPO_URL: ${PW_WV_REPO_URL:-} + COMMIT_HASH: ${PW_WV_COMMIT_HASH:-} + env_file: ${DC_ENV_FILE:-.env} + environment: + - DATABASE_URL + - I_REALLY_WANT_VOLATILE_STORAGE + - LOG_LEVEL + - LOGIN_RATELIMIT_MAX_BURST + - SMTP_HOST + - SMTP_FROM + - SMTP_DEBUG + - SSO_DEBUG_TOKENS + - SSO_FRONTEND + - SSO_ENABLED + - SSO_ONLY + restart: "no" + depends_on: + - VaultwardenPrebuild + + Playwright: + profiles: ["playwright"] + container_name: playwright_oidc_playwright + image: playwright_oidc_playwright + network_mode: "host" + build: + context: . + dockerfile: compose/playwright/Dockerfile + environment: + - PW_WV_REPO_URL + - PW_WV_COMMIT_HASH + restart: "no" + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ..:/project + + Mariadb: + profiles: ["playwright"] + container_name: playwright_mariadb + image: mariadb:11.2.4 + env_file: test.env + healthcheck: + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + start_period: 10s + interval: 10s + ports: + - ${MARIADB_PORT}:3306 + + Mysql: + profiles: ["playwright"] + container_name: playwright_mysql + image: mysql:8.4.1 + env_file: test.env + healthcheck: + test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"] + start_period: 10s + interval: 10s + ports: + - ${MYSQL_PORT}:3306 + + Postgres: + profiles: ["playwright"] + container_name: playwright_postgres + image: postgres:16.3 + env_file: test.env + healthcheck: + test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"] + start_period: 20s + interval: 30s + ports: + - ${POSTGRES_PORT}:5432 + + Maildev: + profiles: ["vaultwarden", "maildev"] + container_name: maildev + image: timshel/maildev:3.0.4 + ports: + - ${SMTP_PORT}:1025 + - 1080:1080 + + Keycloak: + profiles: ["keycloak", "vaultwarden"] + container_name: keycloak-${ENV:-dev} + image: quay.io/keycloak/keycloak:25.0.4 + network_mode: "host" + command: + - start-dev + env_file: ${DC_ENV_FILE:-.env} + + KeycloakSetup: + profiles: ["keycloak", "vaultwarden"] + container_name: keycloakSetup-${ENV:-dev} + image: keycloak_setup-${ENV:-dev} + build: + context: compose/keycloak + dockerfile: Dockerfile + args: + KEYCLOAK_VERSION: 25.0.4 + JAVA_URL: https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_linux-x64_bin.tar.gz + JAVA_VERSION: 21.0.2 + network_mode: "host" + depends_on: + - Keycloak + restart: "no" + env_file: ${DC_ENV_FILE:-.env} diff --git a/apps/vaultwarden/config/docker-compose.yml b/apps/vaultwarden/config/docker-compose.yml new file mode 100644 index 0000000..d3421a9 --- /dev/null +++ b/apps/vaultwarden/config/docker-compose.yml @@ -0,0 +1,13 @@ +bake_env.sh +bake.sh +docker-bake.hcl +Dockerfile.alpine +Dockerfile.debian +Dockerfile.j2 +DockerSettings.yaml +healthcheck.sh +Makefile +podman-bake.sh +README.md +render_template +start.sh diff --git a/apps/vaultwarden/config/env-1-_vaultwarden_playwright_docker-compose.yml b/apps/vaultwarden/config/env-1-_vaultwarden_playwright_docker-compose.yml new file mode 100644 index 0000000..e69de29 diff --git a/apps/vaultwarden/config/vaultwarden.service b/apps/vaultwarden/config/vaultwarden.service new file mode 100644 index 0000000..57e753f --- /dev/null +++ b/apps/vaultwarden/config/vaultwarden.service @@ -0,0 +1,29 @@ +Warning: Permanently added '192.168.1.216' (ED25519) to the list of known hosts. +[Unit] +Description=Bitwarden Server (Powered by Vaultwarden) +Documentation=https://github.com/dani-garcia/vaultwarden +After=network.target +[Service] +User=vaultwarden +Group=vaultwarden +EnvironmentFile=-/opt/vaultwarden/.env +ExecStart=/opt/vaultwarden/bin/vaultwarden +LimitNOFILE=65535 +LimitNPROC=4096 +PrivateTmp=true +PrivateDevices=true +ProtectHome=true +ProtectSystem=strict +DevicePolicy=closed +ProtectControlGroups=yes +ProtectKernelModules=yes +ProtectKernelTunables=yes +RestrictNamespaces=yes +RestrictRealtime=yes +MemoryDenyWriteExecute=yes +LockPersonality=yes +WorkingDirectory=/opt/vaultwarden +ReadWriteDirectories=/opt/vaultwarden/data +AmbientCapabilities=CAP_NET_BIND_SERVICE +[Install] +WantedBy=multi-user.target diff --git a/apps/vaultwarden/docker-compose.yml b/apps/vaultwarden/docker-compose.yml new file mode 100644 index 0000000..b2dc2e2 --- /dev/null +++ b/apps/vaultwarden/docker-compose.yml @@ -0,0 +1,6 @@ +# Vaultwarden draait als systemd-service in LXC 104 (niet Docker). +# Config: config/.env + Proxmox CT-definitie in apps/proxmox/hosts/pve/lxc/104.conf +# URL: https://192.168.1.6:8000 (Homarr) — huidig IP: zie proxmox.meta.yaml + +# Optioneel: playwright sub-stack +# config/compose-*-vaultwarden_playwright_docker-compose.yml diff --git a/apps/vaultwarden/proxmox.meta.yaml b/apps/vaultwarden/proxmox.meta.yaml new file mode 100644 index 0000000..113331f --- /dev/null +++ b/apps/vaultwarden/proxmox.meta.yaml @@ -0,0 +1,7 @@ +# Auto-generated +host: pve +proxmox_ip: 192.168.1.216 +vmid: 104 +hostname: vaultwarden +ip: 192.168.1.5 +status: running diff --git a/apps/vdi-el-kadi-nl/README.md b/apps/vdi-el-kadi-nl/README.md new file mode 100644 index 0000000..ec7720c --- /dev/null +++ b/apps/vdi-el-kadi-nl/README.md @@ -0,0 +1,10 @@ +# vdi.el-kadi.nl + +| | | +|---|---| +| **Proxmox** | proxmox (CT 106) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/proxmox/lxc/106.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. diff --git a/apps/vdi-el-kadi-nl/proxmox.meta.yaml b/apps/vdi-el-kadi-nl/proxmox.meta.yaml new file mode 100644 index 0000000..a8c02b3 --- /dev/null +++ b/apps/vdi-el-kadi-nl/proxmox.meta.yaml @@ -0,0 +1,6 @@ +# Auto-generated +host: proxmox +proxmox_ip: 192.168.1.56 +vmid: 106 +hostname: vdi.el-kadi.nl +status: stopped diff --git a/apps/virtualmin/README.md b/apps/virtualmin/README.md new file mode 100644 index 0000000..cb5ba22 --- /dev/null +++ b/apps/virtualmin/README.md @@ -0,0 +1,14 @@ +# Virtualmin + +| | | +|---|---| +| **Proxmox** | proxmox (CT 107) | +| **IP** | 192.168.5.24 | +| **Host** | 192.168.1.56 | + +Config in `config/` (gepull'd van LXC). + +```bash +# Op Proxmox host: +pct enter 107 +``` diff --git a/apps/virtualmin/proxmox.meta.yaml b/apps/virtualmin/proxmox.meta.yaml new file mode 100644 index 0000000..0e1c3ac --- /dev/null +++ b/apps/virtualmin/proxmox.meta.yaml @@ -0,0 +1,7 @@ +# Auto-generated +host: proxmox +proxmox_ip: 192.168.1.56 +vmid: 107 +hostname: Virtualmin +ip: 192.168.5.24 +status: running diff --git a/scripts/pull-lxc-from-proxmox.py b/scripts/pull-lxc-from-proxmox.py new file mode 100644 index 0000000..b70ffb7 --- /dev/null +++ b/scripts/pull-lxc-from-proxmox.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python3 +"""Pull LXC configs from Proxmox via SSH+pct (runs on NAS).""" +import json, os, re, ssl, subprocess, urllib.parse, urllib.request +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +APPS = ROOT / "apps" +PASSWORD = os.environ.get("PROXMOX_PASSWORD", "WaQTUw2t") +HOSTS = [("192.168.1.216", "pve"), ("192.168.1.56", "proxmox")] +ssl._create_default_https_context = ssl._create_unverified_context + + +def ssh(host: str, cmd: str) -> str: + inner = f"apk add --no-cache openssh-client sshpass >/dev/null 2>&1 && sshpass -p '{PASSWORD}' ssh -o StrictHostKeyChecking=no root@{host} {json.dumps(cmd)}" + r = subprocess.run(["docker", "run", "--rm", "alpine", "sh", "-c", inner], capture_output=True, text=True, timeout=120) + return r.stdout if r.returncode == 0 else "" + + +def pve_login(host: str): + data = urllib.parse.urlencode({"username": "root@pam", "password": PASSWORD}).encode() + req = urllib.request.Request(f"https://{host}:8006/api2/json/access/ticket", data=data, method="POST") + with urllib.request.urlopen(req, timeout=15) as r: + a = json.loads(r.read())["data"] + return a["ticket"], a["CSRFPreventionToken"] + + +def pve_get(host, path, ticket, csrf): + headers = {"Cookie": f"PVEAuthCookie={ticket}", "CSRFPreventionToken": csrf} + req = urllib.request.Request(f"https://{host}:8006/api2/json{path}", headers=headers) + with urllib.request.urlopen(req, timeout=15) as r: + return json.loads(r.read())["data"] + + +def slug(name: str) -> str: + return re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-") + + +def lxc_ip(host, node, vmid, ticket, csrf): + try: + ifaces = pve_get(host, f"/nodes/{node}/lxc/{vmid}/interfaces", ticket, csrf) + for iface in ifaces: + for addr in iface.get("ip-addresses", []): + if addr.get("ip-address-type") == "inet" and not addr["ip-address"].startswith("127."): + return addr["ip-address"] + except Exception: + pass + return "" + + +def pull_running(host, node, vmid, name, ip): + sname = slug(name) or f"ct-{vmid}" + appdir = APPS / sname + cfg = appdir / "config" + cfg.mkdir(parents=True, exist_ok=True) + + find_cmd = f"pct exec {vmid} -- sh -c 'find /opt /root /data /vaultwarden /home -maxdepth 5 \\( -name docker-compose.yml -o -name docker-compose.yaml -o -name compose.yml -o -name .env \\) 2>/dev/null | head -40'" + files = [f.strip() for f in ssh(host, find_cmd).splitlines() if f.strip()] + + for i, fpath in enumerate(files, 1): + safe = re.sub(r"[^a-zA-Z0-9._-]", "_", fpath)[:80] + content = ssh(host, f"pct exec {vmid} -- cat {json.dumps(fpath)}") + if content.strip(): + (cfg / f"{i:02d}-{safe}").write_text(content) + + # NPM data snapshot + if "nginx" in sname or vmid == 109: + snap = ssh(host, f"pct exec {vmid} -- sh -c 'ls -la /data 2>/dev/null; ls /data/nginx 2>/dev/null'") + if snap.strip(): + (cfg / "npm-data-listing.txt").write_text(snap) + + # pve-scripts + if "script" in sname: + listing = ssh(host, f"pct exec {vmid} -- sh -c 'find /opt/ProxmoxVE-Local -maxdepth 2 -type f 2>/dev/null | head -30'") + if listing.strip(): + (cfg / "proxmoxve-local-files.txt").write_text(listing) + + meta = f"""# Auto-generated +host: {node} +proxmox_ip: {host} +vmid: {vmid} +hostname: {name} +ip: {ip} +status: running +""" + (appdir / "proxmox.meta.yaml").write_text(meta) + + readme = f"""# {name} + +| | | +|---|---| +| **Proxmox** | {node} (CT {vmid}) | +| **IP** | {ip or 'dhcp'} | +| **Host** | {host} | + +Config in `config/` (gepull'd van LXC). + +```bash +# Op Proxmox host: +pct enter {vmid} +``` +""" + (appdir / "README.md").write_text(readme) + print(f" pulled {sname} ({ip})") + + +def stub_stopped(host, node, vmid, name): + sname = slug(name) or f"ct-{vmid}" + appdir = APPS / sname + if (appdir / "config").exists() and any((appdir / "config").iterdir()): + return # already pulled when was running + appdir.mkdir(parents=True, exist_ok=True) + (appdir / "config").mkdir(exist_ok=True) + meta = f"""# Auto-generated +host: {node} +proxmox_ip: {host} +vmid: {vmid} +hostname: {name} +status: stopped +""" + (appdir / "proxmox.meta.yaml").write_text(meta) + readme = f"""# {name} + +| | | +|---|---| +| **Proxmox** | {node} (CT {vmid}) | +| **Status** | gestopt | + +Container-definitie: `apps/proxmox/hosts/{node}/lxc/{vmid}.conf` + +Start CT en draai `scripts/pull-lxc-from-proxmox.py` opnieuw om app-config te pullen. +""" + (appdir / "README.md").write_text(readme) + + +def main(): + print(f"Pull → {APPS}") + seen = set() + for host, node in HOSTS: + ticket, csrf = pve_login(host) + lxcs = pve_get(host, f"/nodes/{node}/lxc", ticket, csrf) + for ct in lxcs: + vmid = ct["vmid"] + name = ct.get("name") or f"ct-{vmid}" + sname = slug(name) + if sname in seen: + sname = f"{sname}-{node}" + seen.add(sname) + ip = lxc_ip(host, node, vmid, ticket, csrf) if ct["status"] == "running" else "" + if ct["status"] == "running": + pull_running(host, node, vmid, name, ip) + else: + stub_stopped(host, node, vmid, name) + print("Klaar.") + + +if __name__ == "__main__": + main() diff --git a/scripts/pull-lxc-from-proxmox.sh b/scripts/pull-lxc-from-proxmox.sh new file mode 100644 index 0000000..001d777 --- /dev/null +++ b/scripts/pull-lxc-from-proxmox.sh @@ -0,0 +1,67 @@ +#!/bin/sh +# Pull docker-compose + .env uit Proxmox LXC's via SSH (draait op NAS). +# Vereist: Docker, Proxmox root-wachtwoord in PROXMOX_PASSWORD +set -e +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +PW="${PROXMOX_PASSWORD:-WaQTUw2t}" +SSH_RUN() { + docker run --rm alpine sh -c " + apk add --no-cache openssh-client sshpass >/dev/null 2>&1 + sshpass -p '$PW' ssh -o StrictHostKeyChecking=no root@\$1 \"\$2\" + " -- "$1" "$2" +} + +pull_ct() { + host="$1" + node="$2" + vmid="$3" + name="$4" + ip="$5" + appdir="$ROOT/apps/$name" + mkdir -p "$appdir/config" + + echo " → $name (CT $vmid @ $node, $ip)" + + # docker-compose bestanden vinden en kopiëren + SSH_RUN "$host" "pct exec $vmid -- sh -c ' + find / -maxdepth 6 \( -name docker-compose.yml -o -name docker-compose.yaml -o -name compose.yml \) 2>/dev/null | grep -v proc | head -30 + '" > /tmp/lxc-compose-list.$$ 2>/dev/null || true + + idx=0 + while IFS= read -r fpath; do + [ -z "$fpath" ] && continue + idx=$((idx + 1)) + safe=$(echo "$fpath" | tr '/ ' '__') + SSH_RUN "$host" "pct exec $vmid -- cat '$fpath'" > "$appdir/config/compose-${idx}-${safe}" 2>/dev/null || true + dir=$(dirname "$fpath") + SSH_RUN "$host" "pct exec $vmid -- sh -c 'for e in $dir/.env $dir/.env.local; do [ -f \"\$e\" ] && echo === \$e === && cat \"\$e\"; done'" \ + > "$appdir/config/env-${idx}-${safe}" 2>/dev/null || true + done < /tmp/lxc-compose-list.$$ + rm -f /tmp/lxc-compose-list.$$ + + # meta + cat > "$appdir/proxmox.meta.yaml" <