From 34a48fb74a6e366c0c0bfe5c366c8bddf03ae3c9 Mon Sep 17 00:00:00 2001 From: Ramon Date: Mon, 27 Jul 2026 00:46:30 +0200 Subject: [PATCH] ci: deploy mag niet stranden op een .env van een andere gebruiker De stap "Instellingen en versie klaarzetten" faalde op `touch: cannot touch '.env': Permission denied`. Het bestand was met sudo aangemaakt en dus van root, terwijl de runner als een gewone gebruiker draait. Daarmee brak de hele deploy af op iets dat geen blokkade hoort te zijn. - SU_TAG wordt nu altijd via de omgeving aan `docker compose` meegegeven (export SU_TAG). Het wegschrijven in .env blijft de voorkeur, omdat het een handmatige `docker compose up` overleeft, maar het is niet meer nodig om te kunnen deployen. - Is .env niet schrijfbaar, dan meldt de log wie de eigenaar is en welk chown-commando dat rechtzet, en loopt de deploy gewoon door. - Het aanmaken vanuit .env.example faalt niet meer hard. Positief neveneffect van de vorige fix: de log toont nu "Werkmap: /opt/docker/server-up", dus de cd landt op de juiste plek. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb --- .forgejo/workflows/deploy-prod.yml | 36 ++++++++++++++++++++--------- .forgejo/workflows/deploy.yml | 37 +++++++++++++++++++----------- VERSION | 2 +- 3 files changed, 49 insertions(+), 26 deletions(-) diff --git a/.forgejo/workflows/deploy-prod.yml b/.forgejo/workflows/deploy-prod.yml index 8feb37a..cbdb591 100644 --- a/.forgejo/workflows/deploy-prod.yml +++ b/.forgejo/workflows/deploy-prod.yml @@ -85,24 +85,37 @@ jobs: # SU_TAG vastleggen zodat compose en de "Nu bijwerken"-knop in de app # naar hetzelfde image wijzen (zie docs/updates.md). # - # Bestaat er nog geen .env, dan zetten we hem op vanuit .env.example, - # zodat BIND, PORT en SU_IMAGE zichtbaar en instelbaar zijn. Een - # bestaande .env blijft ongemoeid; rsync slaat hem over. + # SU_TAG bepaalt welk image compose start. We schrijven dat bij + # voorkeur in .env zodat het een handmatige `docker compose up` + # overleeft, maar dat bestand kan van een andere gebruiker zijn (bv. + # met sudo aangemaakt). Lukt schrijven niet, dan geven we SU_TAG mee + # via de omgeving: compose gebruikt die en de deploy loopt gewoon door. if [ ! -f .env ] && [ -f .env.example ]; then - cp .env.example .env - echo "Nieuwe .env aangemaakt vanuit .env.example" + cp .env.example .env 2>/dev/null \ + && echo "Nieuwe .env aangemaakt vanuit .env.example" \ + || echo "LET OP: kon geen .env aanmaken in $(pwd)" + fi + + if [ -w .env ] || { [ ! -e .env ] && [ -w . ]; }; then + touch .env + sed -i '/^SU_TAG=/d' .env + echo "SU_TAG=${VERSION}" >> .env + echo "Inhoud van $(pwd)/.env:" + grep -vE '^\s*(#|$)' .env | sed 's/^/ /' + else + echo "LET OP: $(pwd)/.env is niet schrijfbaar voor $(id -un)." + echo " Eigenaar: $(stat -c '%U:%G %a' .env 2>/dev/null || echo onbekend)" + echo " Herstel eenmalig met:" + echo " sudo chown $(stat -c '%U:%G' . ) $(pwd)/.env" + echo " SU_TAG wordt nu via de omgeving meegegeven." fi - touch .env - sed -i '/^SU_TAG=/d' .env - echo "SU_TAG=${VERSION}" >> .env - echo "Inhoud van $(pwd)/.env:" - grep -vE '^\s*(#|$)' .env | sed 's/^/ /' # Draait deze server vanaf de registry (SU_IMAGE in .env), dan bouwen # we hier én pushen we het resultaat, zodat de in-app updateknop het # image kan ophalen. Bouwen en pushen zitten bewust in dezelfde job: # een aparte build-workflow zou met deze deploy om de runner strijden. - SU_IMAGE="$(grep -E '^SU_IMAGE=' .env | cut -d= -f2- || true)" + export SU_TAG="${VERSION}" + SU_IMAGE="$(grep -E '^SU_IMAGE=' .env 2>/dev/null | cut -d= -f2- || true)" docker compose build --pull if [ -n "$SU_IMAGE" ]; then @@ -128,6 +141,7 @@ jobs: run: | set -euo pipefail cd "$DEPLOY_DIR" + export SU_TAG="${VERSION}" docker compose up -d --remove-orphans docker compose ps echo "Compose-projectmap volgens de container:" diff --git a/.forgejo/workflows/deploy.yml b/.forgejo/workflows/deploy.yml index 2a60c36..68bf184 100644 --- a/.forgejo/workflows/deploy.yml +++ b/.forgejo/workflows/deploy.yml @@ -81,28 +81,36 @@ jobs: echo "${VERSION}" > VERSION - # De dev-server bouwt altijd zelf vanaf de dev-branch. SU_TAG vastleggen - # zodat compose exact het zojuist gebouwde image start. - # - # Bestaat er nog geen .env, dan zetten we hem op vanuit .env.example. - # Zo staat er een leesbaar bestand met alle instellingen erin (BIND, - # PORT, SU_IMAGE) in plaats van alleen een kale SU_TAG-regel. Een - # bestaande .env blijft ongemoeid; rsync slaat hem over. + # SU_TAG bepaalt welk image compose start. We schrijven dat bij + # voorkeur in .env zodat het een handmatige `docker compose up` + # overleeft, maar dat bestand kan van een andere gebruiker zijn (bv. + # met sudo aangemaakt). Lukt schrijven niet, dan geven we SU_TAG mee + # via de omgeving: compose gebruikt die en de deploy loopt gewoon door. if [ ! -f .env ] && [ -f .env.example ]; then - cp .env.example .env - echo "Nieuwe .env aangemaakt vanuit .env.example" + cp .env.example .env 2>/dev/null \ + && echo "Nieuwe .env aangemaakt vanuit .env.example" \ + || echo "LET OP: kon geen .env aanmaken in $(pwd)" fi - touch .env - sed -i '/^SU_TAG=/d' .env - echo "SU_TAG=${VERSION}" >> .env - echo "Inhoud van $(pwd)/.env:" - grep -vE '^\s*(#|$)' .env | sed 's/^/ /' + if [ -w .env ] || { [ ! -e .env ] && [ -w . ]; }; then + touch .env + sed -i '/^SU_TAG=/d' .env + echo "SU_TAG=${VERSION}" >> .env + echo "Inhoud van $(pwd)/.env:" + grep -vE '^\s*(#|$)' .env | sed 's/^/ /' + else + echo "LET OP: $(pwd)/.env is niet schrijfbaar voor $(id -un)." + echo " Eigenaar: $(stat -c '%U:%G %a' .env 2>/dev/null || echo onbekend)" + echo " Herstel eenmalig met:" + echo " sudo chown $(stat -c '%U:%G' . ) $(pwd)/.env" + echo " SU_TAG wordt nu via de omgeving meegegeven." + fi - name: Build image run: | set -euo pipefail cd "$DEPLOY_DIR" + export SU_TAG="${VERSION}" docker compose build --pull docker tag "server-up:${VERSION}" "server-up:${CHANNEL}" || true @@ -110,6 +118,7 @@ jobs: run: | set -euo pipefail cd "$DEPLOY_DIR" + export SU_TAG="${VERSION}" docker compose up -d --remove-orphans docker compose ps # Waar draait de container vandaan, en op welk adres luistert hij? diff --git a/VERSION b/VERSION index 978c14e..6bbadc1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.5.45-beta +0.5.46-beta