From d25fc58b767c5e144c8fa294949cebd2d7cbf4f4 Mon Sep 17 00:00:00 2001 From: "matthias.lotz" Date: Sat, 8 Nov 2025 16:05:35 +0100 Subject: [PATCH] fix(docker): Add sqlite3 to production backend image - Install sqlite3 in prod Dockerfile using apk (Alpine package manager) - Required for test-cleanup-prod.sh script to function - Matches dev environment which already had sqlite3 installed Changes: - docker/prod/backend/Dockerfile: Add 'apk add --no-cache sqlite' - tests/test-cleanup.sh -> split into test-cleanup-dev.sh and test-cleanup-prod.sh - Separate scripts for dev/prod with correct docker-compose paths Testing: - sqlite3 now available at /usr/bin/sqlite3 in prod container - test-cleanup-prod.sh can now execute database queries --- docker/prod/backend/Dockerfile | 3 + .../{test-cleanup.sh => test-cleanup-dev.sh} | 8 +- tests/test-cleanup-prod.sh | 99 +++++++++++++++++++ 3 files changed, 106 insertions(+), 4 deletions(-) rename tests/{test-cleanup.sh => test-cleanup-dev.sh} (85%) create mode 100755 tests/test-cleanup-prod.sh diff --git a/docker/prod/backend/Dockerfile b/docker/prod/backend/Dockerfile index 3facaad..bda5a98 100644 --- a/docker/prod/backend/Dockerfile +++ b/docker/prod/backend/Dockerfile @@ -2,6 +2,9 @@ FROM node:24-alpine WORKDIR /usr/src/app +# Install SQLite for database operations (needed for testing/debugging) +RUN apk add --no-cache sqlite + # Copy package.json and package-lock.json (if available) COPY backend/package*.json ./ diff --git a/tests/test-cleanup.sh b/tests/test-cleanup-dev.sh similarity index 85% rename from tests/test-cleanup.sh rename to tests/test-cleanup-dev.sh index 2fde9aa..25e9390 100755 --- a/tests/test-cleanup.sh +++ b/tests/test-cleanup-dev.sh @@ -9,7 +9,7 @@ echo "========================================" echo "" # Prüfe ob Container läuft -if ! docker compose -f docker/dev/docker-compose.yml ps | grep -q "backend-dev.*Up"; then +if ! docker compose -f ../docker/dev/docker-compose.yml ps | grep -q "backend-dev.*Up"; then echo "❌ Backend-Container läuft nicht. Bitte starte ./dev.sh" exit 1 fi @@ -17,7 +17,7 @@ fi function show_unapproved_groups() { echo "📋 Nicht-freigegebene Gruppen:" echo "" - docker compose -f docker/dev/docker-compose.yml exec -T backend-dev sqlite3 /usr/src/app/src/data/db/image_uploader.db \ + docker compose -f ../docker/dev/docker-compose.yml exec -T backend-dev sqlite3 /usr/src/app/src/data/db/image_uploader.db \ "SELECT group_id || ' | Jahr: ' || year || ' | Name: ' || name || ' | Upload: ' || datetime(upload_date) || ' | Tage: ' || CAST((julianday('now') - julianday(upload_date)) AS INTEGER) FROM groups WHERE approved = 0 ORDER BY upload_date DESC;" echo "" @@ -30,14 +30,14 @@ function backdate_group() { read -p "Gruppe ID zum Zurückdatieren: " group_id read -p "Um wie viele Tage? (z.B. 8): " days - docker compose -f docker/dev/docker-compose.yml exec -T backend-dev sqlite3 /usr/src/app/src/data/db/image_uploader.db \ + docker compose -f ../docker/dev/docker-compose.yml exec -T backend-dev sqlite3 /usr/src/app/src/data/db/image_uploader.db \ "UPDATE groups SET upload_date = datetime('now', '-$days days') WHERE group_id = '$group_id';" echo "✅ Gruppe $group_id wurde um $days Tage zurückdatiert" echo "" # Zeige aktualisierte Info - docker compose -f docker/dev/docker-compose.yml exec -T backend-dev sqlite3 /usr/src/app/src/data/db/image_uploader.db \ + docker compose -f ../docker/dev/docker-compose.yml exec -T backend-dev sqlite3 /usr/src/app/src/data/db/image_uploader.db \ "SELECT 'Gruppe: ' || group_id || ', Upload: ' || datetime(upload_date) || ', Tage alt: ' || CAST((julianday('now') - julianday(upload_date)) AS INTEGER) FROM groups WHERE group_id = '$group_id';" echo "" diff --git a/tests/test-cleanup-prod.sh b/tests/test-cleanup-prod.sh new file mode 100755 index 0000000..c7cec26 --- /dev/null +++ b/tests/test-cleanup-prod.sh @@ -0,0 +1,99 @@ +#!/bin/bash + +# Cleanup Test Helper Script +# Hilft beim Testen des automatischen Löschens + +echo "========================================" +echo " CLEANUP TEST HELPER" +echo "========================================" +echo "" + +# Prüfe ob Container läuft +if ! docker compose -f ../docker/prod/docker-compose.yml ps | grep -q "backend.*Up"; then + echo "❌ Backend-Container läuft nicht. Bitte starte ./dev.sh" + exit 1 +fi + +function show_unapproved_groups() { + echo "📋 Nicht-freigegebene Gruppen:" + echo "" + docker compose -f ../docker/prod/docker-compose.yml exec -T backend sqlite3 /usr/src/app/src/data/db/image_uploader.db \ + "SELECT group_id || ' | Jahr: ' || year || ' | Name: ' || name || ' | Upload: ' || datetime(upload_date) || ' | Tage: ' || CAST((julianday('now') - julianday(upload_date)) AS INTEGER) + FROM groups WHERE approved = 0 ORDER BY upload_date DESC;" + echo "" +} + +function backdate_group() { + show_unapproved_groups + + echo "" + read -p "Gruppe ID zum Zurückdatieren: " group_id + read -p "Um wie viele Tage? (z.B. 8): " days + + docker compose -f ../docker/prod/docker-compose.yml exec -T backend sqlite3 /usr/src/app/src/data/db/image_uploader.db \ + "UPDATE groups SET upload_date = datetime('now', '-$days days') WHERE group_id = '$group_id';" + + echo "✅ Gruppe $group_id wurde um $days Tage zurückdatiert" + echo "" + + # Zeige aktualisierte Info + docker compose -f ../docker/prod/docker-compose.yml exec -T backend sqlite3 /usr/src/app/src/data/db/image_uploader.db \ + "SELECT 'Gruppe: ' || group_id || ', Upload: ' || datetime(upload_date) || ', Tage alt: ' || CAST((julianday('now') - julianday(upload_date)) AS INTEGER) + FROM groups WHERE group_id = '$group_id';" + echo "" +} + +function preview_cleanup() { + echo "🔍 Cleanup Preview (über API):" + echo "" + curl -s http://localhost:5000/api/admin/cleanup/preview | jq '.' + echo "" +} + +function trigger_cleanup() { + echo "⚠️ ACHTUNG: Dies wird Gruppen permanent löschen!" + echo "" + read -p "Cleanup wirklich ausführen? (ja/nein): " confirm + + if [ "$confirm" != "ja" ]; then + echo "❌ Abgebrochen" + return + fi + + echo "" + echo "🔄 Führe Cleanup aus..." + echo "" + curl -s -X POST http://localhost:5000/api/admin/cleanup/trigger | jq '.' + echo "" +} + +function show_deletion_log() { + echo "📜 Lösch-Historie (letzte 10):" + echo "" + curl -s http://localhost:5000/api/admin/deletion-log?limit=10 | jq '.deletions[] | "Gruppe: \(.group_id), Jahr: \(.year), Bilder: \(.image_count), Gelöscht: \(.deleted_at)"' + echo "" +} + +# Menü +while true; do + echo "Optionen:" + echo " 1) Zeige nicht-freigegebene Gruppen" + echo " 2) Gruppe zurückdatieren (für Tests)" + echo " 3) Preview: Was würde gelöscht?" + echo " 4) Cleanup JETZT ausführen" + echo " 5) Lösch-Historie anzeigen" + echo " 0) Beenden" + echo "" + read -p "Wähle Option: " option + echo "" + + case $option in + 1) show_unapproved_groups ;; + 2) backdate_group ;; + 3) preview_cleanup ;; + 4) trigger_cleanup ;; + 5) show_deletion_log ;; + 0) echo "👋 Auf Wiedersehen!"; exit 0 ;; + *) echo "❌ Ungültige Option" ;; + esac +done