From 831a2b227665a6d1effc02196cd060d886d4b9d0 Mon Sep 17 00:00:00 2001 From: GeiserX <9169332+GeiserX@users.noreply.github.com> Date: Thu, 1 Oct 2026 13:01:22 +0200 Subject: [PATCH 1/2] docs(claude): deploy through GitOps, not the retired Portainer stack The stack is pinned by tag and digest in the GitOps repo; Renovate automerges the bump after each release and the webhook redeploys. --- CLAUDE.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index f740996..cd016fc 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -47,7 +47,7 @@ The closest analog is **A Better Route Planner (ABRP)** for EVs — Pumperly doe - Self-hosted solutions over SaaS - Privacy-focused (cookieless analytics, minimal data collection) - Semver versioning for Docker images (never `:latest`) -- GitOps with Portainer for infrastructure +- GitOps for infrastructure (a Gitea repo per server, redeployed by a webhook on push) - Docker Hub for images (`drumsergio/pumperly`) - Tailwind CSS for styling - TypeScript strict mode @@ -86,7 +86,7 @@ The closest analog is **A Better Route Planner (ABRP)** for EVs — Pumperly doe | Photon 1.0.1 | Geocoding / address autocomplete. Runs on `eclipse-temurin:21-jre` with official JAR. Uses OpenSearch backend (NOT old Elasticsearch). Data imported from **per-country JSONL dumps** (31 regions covering 32+ countries, ~132.7M documents). Single-pass concatenated import: all dumps downloaded in parallel, decompressed and concatenated into one file, then imported in a single `java -jar photon.jar import` invocation. | | Caddy | Reverse proxy (existing on watchtower) | | Docker | Multi-stage builds, images on Docker Hub | -| Portainer | Container management with GitOps | +| Gitea + deploy webhook | GitOps: a push to a server's repo redeploys the stacks it changed | ### External Data Sources (All Free, No Auth Unless Noted) @@ -416,12 +416,12 @@ pumperly/ - Local `docker buildx --platform linux/amd64` is only for emergency hotfixes - GitHub Actions handles: lint, typecheck, Docker build+push, releases, CodeQL - Docker Hub secrets (`DOCKERHUB_USERNAME`, `DOCKERHUB_TOKEN`) are configured in GitHub repo settings -- **Deployment flow**: commit → push → **wait for GitHub Actions Docker Publish workflow to finish** → then `docker pull` and redeploy on watchtower. Never pull before the workflow completes +- **Deployment flow**: commit → push → **wait for GitHub Actions Docker Publish workflow to finish** → Renovate moves the image pin in the GitOps repo (usually within 30 minutes of the publish) and the webhook redeploys. Never `docker pull` or run compose by hand on watchtower - **Never restart Caddy** — always use `caddy reload` (Unraid FUSE causes stale file handles on restart) ### Infrastructure & Backups -- **Portainer stack**: ID 225 ("pumperly"), endpoint 2 on watchtower. Auto-update every 5 minutes from Gitea. Config path: `pumperly/docker-compose.yml`. The Gitea repo (`giteaer/watchtower`) is private — manual redeploy via API may fail with auth errors; auto-update handles it. +- **Stack**: `pumperly/docker-compose.yml` in the private `giteaer/watchtower` Gitea repo, image pinned by tag and digest. A push that changes it makes the deploy webhook on watchtower redeploy the stack. Renovate opens and automerges the pin bump after each release. To ship sooner, set the pin yourself to `drumsergio/pumperly:vX.Y.Z@sha256:` (digest from `docker buildx imagetools inspect drumsergio/pumperly:vX.Y.Z --format '{{.Manifest.Digest}}'`), commit and push. Changing only the tag deploys nothing new, because Docker resolves the image by digest. - **Data volumes** (all under `/mnt/user/appdata/pumperly/`): - `pgdata/` (~600 MB) — PostGIS database. Quick to rebuild via scrapers. - `valhalla/` (~60+ GB) — Pre-built routing tiles + source PBF (~25GB, 31 European countries). Self-healing: Valhalla rebuilds tiles from PBF on start if missing. Rebuild takes 3-6 hours. From 552ac221a454cd84a391fb096fddd9a37416bd60 Mon Sep 17 00:00:00 2001 From: GeiserX <9169332+GeiserX@users.noreply.github.com> Date: Thu, 1 Oct 2026 13:15:05 +0200 Subject: [PATCH 2/2] docs: drop the last Portainer mentions from ROADMAP and SECURITY --- ROADMAP.md | 2 +- SECURITY.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index c591f0e..44abe42 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -17,7 +17,7 @@ The world's first open-source energy route planner that works for ALL vehicle ty - [x] MapLibre GL JS + react-map-gl integration - [x] OpenFreeMap as tile provider (Liberty style) - [x] Basic responsive layout (map fills viewport) -- [x] Docker Compose for production (PostGIS + app via Portainer GitOps) +- [x] Docker Compose for production (PostGIS + app via GitOps) ### 0.2 — Database + Spain Scraper - [x] PostGIS schema via Prisma (stations, fuel_prices tables) diff --git a/SECURITY.md b/SECURITY.md index 33ab8df..654ecf5 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -33,7 +33,7 @@ You can expect an initial response within 72 hours. Critical vulnerabilities aff | Geocoding | Photon (OpenSearch) | Internal network only | | Routing | Valhalla | Internal network only | | Reverse Proxy | Caddy + Cloudflare | TLS termination, DDoS protection | -| Container Runtime | Docker (Portainer) | Non-root containers, read-only where possible | +| Container Runtime | Docker Compose (GitOps) | Non-root containers, read-only where possible | ### Network Boundaries