ci: deploy mag niet stranden op een .env van een andere gebruiker
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m30s

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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
This commit is contained in:
Ramon 2026-07-27 00:46:30 +02:00
parent cb04c4a7ad
commit 34a48fb74a
3 changed files with 49 additions and 26 deletions

View file

@ -85,24 +85,37 @@ jobs:
# SU_TAG vastleggen zodat compose en de "Nu bijwerken"-knop in de app # SU_TAG vastleggen zodat compose en de "Nu bijwerken"-knop in de app
# naar hetzelfde image wijzen (zie docs/updates.md). # naar hetzelfde image wijzen (zie docs/updates.md).
# #
# Bestaat er nog geen .env, dan zetten we hem op vanuit .env.example, # SU_TAG bepaalt welk image compose start. We schrijven dat bij
# zodat BIND, PORT en SU_IMAGE zichtbaar en instelbaar zijn. Een # voorkeur in .env zodat het een handmatige `docker compose up`
# bestaande .env blijft ongemoeid; rsync slaat hem over. # 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 if [ ! -f .env ] && [ -f .env.example ]; then
cp .env.example .env cp .env.example .env 2>/dev/null \
echo "Nieuwe .env aangemaakt vanuit .env.example" && 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 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 # 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 # we hier én pushen we het resultaat, zodat de in-app updateknop het
# image kan ophalen. Bouwen en pushen zitten bewust in dezelfde job: # image kan ophalen. Bouwen en pushen zitten bewust in dezelfde job:
# een aparte build-workflow zou met deze deploy om de runner strijden. # 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 docker compose build --pull
if [ -n "$SU_IMAGE" ]; then if [ -n "$SU_IMAGE" ]; then
@ -128,6 +141,7 @@ jobs:
run: | run: |
set -euo pipefail set -euo pipefail
cd "$DEPLOY_DIR" cd "$DEPLOY_DIR"
export SU_TAG="${VERSION}"
docker compose up -d --remove-orphans docker compose up -d --remove-orphans
docker compose ps docker compose ps
echo "Compose-projectmap volgens de container:" echo "Compose-projectmap volgens de container:"

View file

@ -81,28 +81,36 @@ jobs:
echo "${VERSION}" > VERSION echo "${VERSION}" > VERSION
# De dev-server bouwt altijd zelf vanaf de dev-branch. SU_TAG vastleggen # SU_TAG bepaalt welk image compose start. We schrijven dat bij
# zodat compose exact het zojuist gebouwde image start. # voorkeur in .env zodat het een handmatige `docker compose up`
# # overleeft, maar dat bestand kan van een andere gebruiker zijn (bv.
# Bestaat er nog geen .env, dan zetten we hem op vanuit .env.example. # met sudo aangemaakt). Lukt schrijven niet, dan geven we SU_TAG mee
# Zo staat er een leesbaar bestand met alle instellingen erin (BIND, # via de omgeving: compose gebruikt die en de deploy loopt gewoon door.
# PORT, SU_IMAGE) in plaats van alleen een kale SU_TAG-regel. Een
# bestaande .env blijft ongemoeid; rsync slaat hem over.
if [ ! -f .env ] && [ -f .env.example ]; then if [ ! -f .env ] && [ -f .env.example ]; then
cp .env.example .env cp .env.example .env 2>/dev/null \
echo "Nieuwe .env aangemaakt vanuit .env.example" && echo "Nieuwe .env aangemaakt vanuit .env.example" \
|| echo "LET OP: kon geen .env aanmaken in $(pwd)"
fi fi
touch .env
sed -i '/^SU_TAG=/d' .env
echo "SU_TAG=${VERSION}" >> .env
echo "Inhoud van $(pwd)/.env:" if [ -w .env ] || { [ ! -e .env ] && [ -w . ]; }; then
grep -vE '^\s*(#|$)' .env | sed 's/^/ /' 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 - name: Build image
run: | run: |
set -euo pipefail set -euo pipefail
cd "$DEPLOY_DIR" cd "$DEPLOY_DIR"
export SU_TAG="${VERSION}"
docker compose build --pull docker compose build --pull
docker tag "server-up:${VERSION}" "server-up:${CHANNEL}" || true docker tag "server-up:${VERSION}" "server-up:${CHANNEL}" || true
@ -110,6 +118,7 @@ jobs:
run: | run: |
set -euo pipefail set -euo pipefail
cd "$DEPLOY_DIR" cd "$DEPLOY_DIR"
export SU_TAG="${VERSION}"
docker compose up -d --remove-orphans docker compose up -d --remove-orphans
docker compose ps docker compose ps
# Waar draait de container vandaan, en op welk adres luistert hij? # Waar draait de container vandaan, en op welk adres luistert hij?

View file

@ -1 +1 @@
0.5.45-beta 0.5.46-beta