#!/bin/bash # # Container-Entrypoint: startet clamd (Virenscanner) + Node-Server. # clamd läuft als clamav-User, node läuft als nodejs-User. Beide sind # Kinder von tini (PID 1), das Signal-Forwarding und Reaping übernimmt. # set -eu CLAMAV_DB_DIR=/app/data/clamav-db # Persistente Verzeichnisse auf der Coolify-Volume sicherstellen. mkdir -p "$CLAMAV_DB_DIR" \ /app/data/leads \ /app/data/gamejam \ /app/data/gamejam-games chown -R clamav:clamav "$CLAMAV_DB_DIR" 2>/dev/null || true chown -R nodejs:nodejs /app/data/leads \ /app/data/gamejam \ /app/data/gamejam-games 2>/dev/null || true # Erster Start auf einer leeren Volume: Virendefinitionen ziehen # (~300 MB; danach persistent auf der Volume). if ! ls "$CLAMAV_DB_DIR"/daily.{cvd,cld} >/dev/null 2>&1; then echo "[entrypoint] keine ClamAV-DB im Volume — initialer freshclam-Lauf …" freshclam --quiet \ || echo "[entrypoint] initialer freshclam fehlgeschlagen; Container läuft weiter" fi # Hintergrund-Updates der Virendefinitionen (alle paar Stunden). freshclam --daemon --quiet || true # clamd starten (forkt in den Hintergrund). echo "[entrypoint] clamd starten …" clamd # Bis zu ~120 s auf clamd-Bereitschaft warten. Wenn es länger dauert, # startet node trotzdem — Uploads werden dann fail-closed abgelehnt, # bis clamd kommt. for i in $(seq 1 60); do if printf 'zPING\0' | nc -w 2 127.0.0.1 3310 2>/dev/null | grep -q PONG; then echo "[entrypoint] clamd bereit" break fi sleep 2 done echo "[entrypoint] node-Server starten …" exec gosu nodejs node /app/server.js