Add .dockerignore and Docker cleanup script to fix build space issues

- Add .dockerignore to exclude large upload files from Docker builds
- Add docker-cleanup.sh script to free up Docker disk space
- Add DOCKER_BUILD_FIX.md documentation for troubleshooting build issues

This prevents large MP3 files from being copied into the Docker image,
saving significant disk space during builds.
This commit is contained in:
Hördle Bot
2025-12-01 17:24:14 +01:00
parent 2b8733dea0
commit 68c8f9a05a
3 changed files with 243 additions and 0 deletions

66
.dockerignore Normal file
View File

@@ -0,0 +1,66 @@
# Dependencies
node_modules
npm-debug.log
yarn-debug.log
yarn-error.log
# Next.js build outputs
.next
out
build
# Environment files
.env
.env.local
.env*.local
# Git
.git
.gitignore
# IDE
.vscode
.idea
*.swp
*.swo
*~
# OS files
.DS_Store
Thumbs.db
# Hördle specific - WICHTIG: Upload-Dateien NICHT ins Image kopieren!
# Diese werden als Volume gemountet und sollten nicht im Image sein
/public/uploads/*
!/public/uploads/.gitkeep
# Database files - werden als Volume gemountet
/data/*
*.db
*.db-journal
*.db-wal
*.db-shm
# Backups
/backups
# Docker files (nicht notwendig im Image)
docker-compose*.yml
Dockerfile*
.dockerignore
# Documentation
*.md
!README.md
# Scripts die nicht im Container gebraucht werden
scripts/fix-*.sh
scripts/check-*.sh
scripts/debug-*.sh
scripts/quick-*.sh
# Temporary files
*.tmp
*.temp
*.log

106
DOCKER_BUILD_FIX.md Normal file
View File

@@ -0,0 +1,106 @@
# Docker Build Fix: Upload-Dateien ausschließen
## Problem
Der Docker Build schlug fehl mit:
```
no space left on device
```
**Ursache**: Die großen MP3-Dateien in `public/uploads/` wurden in den Build-Context kopiert und verbrauchten zu viel Speicherplatz.
## Lösung
Eine `.dockerignore` Datei wurde erstellt, die folgende Dateien/Ordner vom Build ausschließt:
- `public/uploads/*` - Upload-Dateien (werden als Volume gemountet)
- `data/*` - Datenbank-Dateien (werden als Volume gemountet)
- `node_modules` - werden während des Builds installiert
- `.next`, `out`, `build` - Build-Artefakte
- Backup-Dateien, Logs, temporäre Dateien
## Zusätzliche Maßnahmen
Falls der Build weiterhin Probleme macht:
### 1. Docker aufräumen
```bash
# Entferne nicht verwendete Images
docker image prune -a
# Entferne nicht verwendete Container
docker container prune
# Entferne nicht verwendete Volumes (VORSICHT: kann Daten löschen!)
docker volume prune
# Kompletter Cleanup (alles außer laufenden Containern)
docker system prune -a
```
### 2. Speicherplatz prüfen
```bash
# Zeige Speicherplatz
df -h
# Zeige Docker-Speicherverbrauch
docker system df
# Zeige größte Images
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | sort -k3 -h
```
### 3. Build-Kontext prüfen
```bash
# Prüfe was in den Build-Context kopiert wird
docker build --no-cache --progress=plain -t test-build . 2>&1 | grep "transferring context"
```
### 4. Upload-Dateien manuell ausschließen
Falls die `.dockerignore` nicht greift, können Upload-Dateien vorübergehend verschoben werden:
```bash
# Vor dem Build
mv public/uploads public/uploads.backup
mkdir -p public/uploads
touch public/uploads/.gitkeep
# Build durchführen
docker compose build
# Uploads wiederherstellen
rm -rf public/uploads
mv public/uploads.backup public/uploads
```
## Wichtig
Die Upload-Dateien werden **nicht** ins Docker-Image kopiert, sondern als Volume gemountet:
```yaml
volumes:
- ./public/uploads:/app/public/uploads
```
Das bedeutet:
- Upload-Dateien bleiben auf dem Host-System
- Sie werden zur Laufzeit gemountet
- Sie sollten **nicht** ins Image kopiert werden (spart viel Speicher)
## Verifikation
Nach dem Build sollte das Image deutlich kleiner sein:
```bash
# Zeige Image-Größe
docker images hoerdle-hoerdle
# Prüfe ob Uploads im Image sind
docker run --rm hoerdle-hoerdle ls -lh /app/public/uploads
# Sollte nur .gitkeep oder Covers zeigen, keine MP3-Dateien
```

71
scripts/docker-cleanup.sh Executable file
View File

@@ -0,0 +1,71 @@
#!/bin/bash
# Docker Cleanup-Skript
# Räumt nicht verwendete Docker-Images, Container, Volumes und Build-Cache auf
set -e
echo "🧹 Docker Cleanup..."
echo ""
# Zeige aktuellen Speicherverbrauch
echo "📊 Aktueller Docker-Speicherverbrauch:"
docker system df
echo ""
# Frage nach Bestätigung (falls interaktiv)
if [ -t 0 ]; then
echo "⚠️ Dies wird folgende Ressourcen entfernen:"
echo " - Alle nicht verwendeten Images"
echo " - Alle gestoppten Container"
echo " - Alle nicht verwendeten Netzwerke"
echo " - Build-Cache"
echo ""
echo "Möchtest du fortfahren? (j/n)"
read -r response
if [ "$response" != "j" ] && [ "$response" != "J" ]; then
echo "❌ Abgebrochen."
exit 0
fi
fi
# 1. Entferne gestoppte Container
echo "🗑️ Entferne gestoppte Container..."
STOPPED_CONTAINERS=$(docker ps -a -q -f status=exited | wc -l)
if [ "$STOPPED_CONTAINERS" -gt 0 ]; then
docker container prune -f
echo "✅ Gestoppte Container entfernt"
else
echo " Keine gestoppten Container gefunden"
fi
echo ""
# 2. Entferne nicht verwendete Images
echo "🗑️ Entferne nicht verwendete Images..."
docker image prune -a -f
echo "✅ Nicht verwendete Images entfernt"
echo ""
# 3. Entferne nicht verwendete Netzwerke
echo "🗑️ Entferne nicht verwendete Netzwerke..."
docker network prune -f
echo "✅ Nicht verwendete Netzwerke entfernt"
echo ""
# 4. Entferne Build-Cache (optional, kann lange dauern)
echo "🗑️ Entferne Build-Cache..."
docker builder prune -f
echo "✅ Build-Cache entfernt"
echo ""
# Zeige neuen Speicherverbrauch
echo "📊 Neuer Docker-Speicherverbrauch:"
docker system df
echo ""
# Zeige verfügbaren Speicherplatz
echo "💾 Verfügbarer Speicherplatz:"
df -h / | tail -1 | awk '{print " Gesamt: " $2 ", Verfügbar: " $4 ", Belegt: " $5}'
echo ""
echo "✅ Cleanup abgeschlossen!"