From da406d95388577a4f2cc811a25140ea99e8ec8b2 Mon Sep 17 00:00:00 2001 From: Eric Gullickson <16152721+ericgullickson@users.noreply.github.com> Date: Tue, 3 Feb 2026 19:25:36 -0600 Subject: [PATCH] feat: add logging config generator script (refs #81) Create generate-log-config.sh that maps a single LOG_LEVEL env var to per-container settings for Backend, Frontend, PostgreSQL, Redis, and Traefik. Script validates input and generates .env.logging file. Integrate script into staging and production CI/CD pipelines. Remove obsolete SPRINTS.md calendar file. Co-Authored-By: Claude Opus 4.5 --- .gitea/SPRINTS.md | 36 ---------------- .gitea/workflows/production.yaml | 7 ++++ .gitea/workflows/staging.yaml | 7 ++++ .gitignore | 1 + scripts/ci/generate-log-config.sh | 69 +++++++++++++++++++++++++++++++ 5 files changed, 84 insertions(+), 36 deletions(-) delete mode 100644 .gitea/SPRINTS.md create mode 100755 scripts/ci/generate-log-config.sh diff --git a/.gitea/SPRINTS.md b/.gitea/SPRINTS.md deleted file mode 100644 index 1f15f5a..0000000 --- a/.gitea/SPRINTS.md +++ /dev/null @@ -1,36 +0,0 @@ -# SPRINTS.md — MotoVaultPro Sprint Calendar (2026) - -**Cadence:** 2 weeks (14 days) -**Sprint weeks:** Monday → Sunday -**Naming convention:** `Sprint YYYY-MM-DD` (the Monday start date) - -> Note: Sprint 26 ends on **2027-01-03** (it crosses into the next year). - -| # | Sprint | Start (Mon) | End (Sun) | -|---:|---|---|---| -| 1 | Sprint 2026-01-05 | 2026-01-05 | 2026-01-18 | -| 2 | Sprint 2026-01-19 | 2026-01-19 | 2026-02-01 | -| 3 | Sprint 2026-02-02 | 2026-02-02 | 2026-02-15 | -| 4 | Sprint 2026-02-16 | 2026-02-16 | 2026-03-01 | -| 5 | Sprint 2026-03-02 | 2026-03-02 | 2026-03-15 | -| 6 | Sprint 2026-03-16 | 2026-03-16 | 2026-03-29 | -| 7 | Sprint 2026-03-30 | 2026-03-30 | 2026-04-12 | -| 8 | Sprint 2026-04-13 | 2026-04-13 | 2026-04-26 | -| 9 | Sprint 2026-04-27 | 2026-04-27 | 2026-05-10 | -| 10 | Sprint 2026-05-11 | 2026-05-11 | 2026-05-24 | -| 11 | Sprint 2026-05-25 | 2026-05-25 | 2026-06-07 | -| 12 | Sprint 2026-06-08 | 2026-06-08 | 2026-06-21 | -| 13 | Sprint 2026-06-22 | 2026-06-22 | 2026-07-05 | -| 14 | Sprint 2026-07-06 | 2026-07-06 | 2026-07-19 | -| 15 | Sprint 2026-07-20 | 2026-07-20 | 2026-08-02 | -| 16 | Sprint 2026-08-03 | 2026-08-03 | 2026-08-16 | -| 17 | Sprint 2026-08-17 | 2026-08-17 | 2026-08-30 | -| 18 | Sprint 2026-08-31 | 2026-08-31 | 2026-09-13 | -| 19 | Sprint 2026-09-14 | 2026-09-14 | 2026-09-27 | -| 20 | Sprint 2026-09-28 | 2026-09-28 | 2026-10-11 | -| 21 | Sprint 2026-10-12 | 2026-10-12 | 2026-10-25 | -| 22 | Sprint 2026-10-26 | 2026-10-26 | 2026-11-08 | -| 23 | Sprint 2026-11-09 | 2026-11-09 | 2026-11-22 | -| 24 | Sprint 2026-11-23 | 2026-11-23 | 2026-12-06 | -| 25 | Sprint 2026-12-07 | 2026-12-07 | 2026-12-20 | -| 26 | Sprint 2026-12-21 | 2026-12-21 | 2027-01-03 | diff --git a/.gitea/workflows/production.yaml b/.gitea/workflows/production.yaml index c87866e..be31175 100644 --- a/.gitea/workflows/production.yaml +++ b/.gitea/workflows/production.yaml @@ -22,6 +22,7 @@ env: COMPOSE_FILE: docker-compose.yml COMPOSE_BLUE_GREEN: docker-compose.blue-green.yml HEALTH_CHECK_TIMEOUT: "60" + LOG_LEVEL: INFO jobs: # ============================================ @@ -105,6 +106,12 @@ jobs: cp "$GITHUB_WORKSPACE/docker-compose.yml" "$DEPLOY_PATH/" cp "$GITHUB_WORKSPACE/docker-compose.blue-green.yml" "$DEPLOY_PATH/" + - name: Generate logging configuration + run: | + cd "$DEPLOY_PATH" + chmod +x scripts/ci/generate-log-config.sh + ./scripts/ci/generate-log-config.sh "$LOG_LEVEL" + - name: Login to registry run: | echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login -u "${{ secrets.REGISTRY_USER }}" --password-stdin "$REGISTRY" diff --git a/.gitea/workflows/staging.yaml b/.gitea/workflows/staging.yaml index 60b687e..185f339 100644 --- a/.gitea/workflows/staging.yaml +++ b/.gitea/workflows/staging.yaml @@ -18,6 +18,7 @@ env: COMPOSE_FILE: docker-compose.yml COMPOSE_STAGING: docker-compose.staging.yml HEALTH_CHECK_TIMEOUT: "60" + LOG_LEVEL: INFO jobs: # ============================================ @@ -117,6 +118,12 @@ jobs: cp "$GITHUB_WORKSPACE/docker-compose.yml" "$DEPLOY_PATH/" cp "$GITHUB_WORKSPACE/docker-compose.staging.yml" "$DEPLOY_PATH/" + - name: Generate logging configuration + run: | + cd "$DEPLOY_PATH" + chmod +x scripts/ci/generate-log-config.sh + ./scripts/ci/generate-log-config.sh "$LOG_LEVEL" + - name: Login to registry run: | echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login -u "${{ secrets.REGISTRY_USER }}" --password-stdin "$REGISTRY" diff --git a/.gitignore b/.gitignore index d6d3432..c4a8450 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ node_modules/ .env .env.local .env.backup +.env.logging dist/ *.log .DS_Store diff --git a/scripts/ci/generate-log-config.sh b/scripts/ci/generate-log-config.sh new file mode 100755 index 0000000..4424094 --- /dev/null +++ b/scripts/ci/generate-log-config.sh @@ -0,0 +1,69 @@ +#!/bin/bash +# generate-log-config.sh - Generate .env.logging from LOG_LEVEL +# Maps a single LOG_LEVEL environment variable to per-container settings +# +# Usage: ./generate-log-config.sh [LOG_LEVEL] +# LOG_LEVEL: DEBUG, INFO, WARN, or ERROR (default: INFO) +# +# Output: Creates .env.logging file with container-specific log settings +# +# Exit codes: +# 0 - Configuration generated successfully +# 1 - Invalid LOG_LEVEL provided + +set -euo pipefail + +LOG_LEVEL="${1:-INFO}" + +# Validate input +case "$LOG_LEVEL" in + DEBUG|INFO|WARN|ERROR) ;; + *) + echo "Error: Invalid LOG_LEVEL '$LOG_LEVEL'. Must be DEBUG, INFO, WARN, or ERROR." >&2 + exit 1 + ;; +esac + +# Convert to lowercase for services that need it +LOG_LEVEL_LOWER=$(echo "$LOG_LEVEL" | tr '[:upper:]' '[:lower:]') + +# Map PostgreSQL log settings based on level +case "$LOG_LEVEL" in + DEBUG) POSTGRES_LOG_STATEMENT="all"; POSTGRES_LOG_MIN_DURATION="0" ;; + INFO) POSTGRES_LOG_STATEMENT="ddl"; POSTGRES_LOG_MIN_DURATION="500" ;; + WARN) POSTGRES_LOG_STATEMENT="none"; POSTGRES_LOG_MIN_DURATION="1000" ;; + ERROR) POSTGRES_LOG_STATEMENT="none"; POSTGRES_LOG_MIN_DURATION="-1" ;; +esac + +# Map Redis log level +case "$LOG_LEVEL" in + DEBUG) REDIS_LOGLEVEL="debug" ;; + INFO) REDIS_LOGLEVEL="verbose" ;; + WARN) REDIS_LOGLEVEL="notice" ;; + ERROR) REDIS_LOGLEVEL="warning" ;; +esac + +# Generate .env.logging file +cat > .env.logging << EOF +# Generated by generate-log-config.sh - DO NOT EDIT MANUALLY +# Regenerate with: ./scripts/ci/generate-log-config.sh $LOG_LEVEL +LOG_LEVEL=$LOG_LEVEL + +# Backend/OCR (Pino) +BACKEND_LOG_LEVEL=$LOG_LEVEL_LOWER + +# Frontend (Vite) +VITE_LOG_LEVEL=$LOG_LEVEL_LOWER + +# PostgreSQL +POSTGRES_LOG_STATEMENT=$POSTGRES_LOG_STATEMENT +POSTGRES_LOG_MIN_DURATION=$POSTGRES_LOG_MIN_DURATION + +# Redis +REDIS_LOGLEVEL=$REDIS_LOGLEVEL + +# Traefik +TRAEFIK_LOG_LEVEL=$LOG_LEVEL +EOF + +echo "Generated .env.logging with LOG_LEVEL=$LOG_LEVEL"