From 3fc1b91041406dea4a82ad933db6bd584c2f07c2 Mon Sep 17 00:00:00 2001 From: rxf Date: Thu, 2 Oct 2025 09:19:32 +0200 Subject: [PATCH] Dockerized --- .dockerignore | 77 +++++++++++++++++++++++++++ .env.example | 13 +++++ .gitignore | 3 ++ Dockerfile | 24 +++++++++ README.md | 126 +++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 20 +++++++ main.py | 10 ++-- requirements.txt | 7 +++ 8 files changed, 275 insertions(+), 5 deletions(-) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 docker-compose.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..3ae0b23 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,77 @@ +# Docker Ignore Datei für CameraSave +__pycache__/ +*.py[cod] +*$py.class + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# IDEs +.vscode/ +.idea/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db + +# Git +.git/ +.gitignore + +# Logs +*.log + +# Bereits vorhandene Videos sollen nicht ins Image +videospeicher/ \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..da67010 --- /dev/null +++ b/.env.example @@ -0,0 +1,13 @@ +# Umgebungsvariablen für CameraSave Docker Container +# Kopiere diese Datei zu .env und passe die Werte an + +# IMAP Server Konfiguration +IMAP_SERVER=secureimap.t-online.de +IMAP_PORT=993 + +# E-Mail Anmeldedaten (SICHERHEITSHINWEIS: Verwende App-spezifische Passwörter!) +EMAIL_USER=dk2ge@t-online.de +EMAIL_PASS=ETBjw65tf2 + +# Speicherverzeichnis (Container-intern) +SAVE_DIR=/app/videospeicher \ No newline at end of file diff --git a/.gitignore b/.gitignore index 7e802c1..689093c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ # Projekt-Sachen videospeicher/ +# === Docker === +.env + # === Python Bytecode === __pycache__/ *.py[cod] diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ff10dfe --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +# Verwende Python 3.11 als Basis-Image +FROM python:3.11-slim + +# Setze Arbeitsverzeichnis +WORKDIR /app + +# Kopiere requirements.txt und installiere Dependencies +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +# Kopiere den Anwendungscode +COPY main.py . + +# Erstelle Verzeichnis für Videospeicher +RUN mkdir -p /app/videospeicher + +# Setze Umgebungsvariablen +ENV PYTHONUNBUFFERED=1 + +# Definiere Volume für persistente Datenspeicherung +VOLUME ["/app/videospeicher"] + +# Führe das Skript aus +CMD ["python", "main.py"] \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..9123e2a --- /dev/null +++ b/README.md @@ -0,0 +1,126 @@ +# CameraSave Docker Container + +Ein Python-Skript, das automatisch Video-Anhänge aus E-Mails herunterlädt und in einer strukturierten Ordnerhierarchie speichert. + +## 🚀 Schnellstart mit Docker + +### 1. Repository klonen/vorbereiten +```bash +cd /Users/rxf/Projekte/CameraSave +``` + +### 2. Umgebungsvariablen konfigurieren (optional) +```bash +cp .env.example .env +# Bearbeite .env mit deinen E-Mail-Zugangsdaten +``` + +### 3. Container mit Docker Compose starten +```bash +docker-compose up -d +``` + +### 4. Logs überprüfen +```bash +docker-compose logs -f camerasave +``` + +## 🐋 Manuelle Docker-Befehle + +### Image erstellen +```bash +docker build -t camerasave . +``` + +### Container ausführen +```bash +docker run -d \ + --name camerasave \ + -v $(pwd)/videospeicher:/app/videospeicher \ + -e EMAIL_USER="deine-email@domain.de" \ + -e EMAIL_PASS="dein-passwort" \ + camerasave +``` + +### Einmalige Ausführung +```bash +docker run --rm \ + -v $(pwd)/videospeicher:/app/videospeicher \ + -e EMAIL_USER="deine-email@domain.de" \ + -e EMAIL_PASS="dein-passwort" \ + camerasave +``` + +## 📁 Ordnerstruktur + +Das Skript erstellt automatisch folgende Struktur: +``` +videospeicher/ +├── 2025/ +│ ├── 01/ +│ │ ├── 15/ +│ │ │ ├── 01_20250115123456000.mp4 +│ │ │ └── ... +│ │ └── ... +│ └── ... +└── ... +``` + +## ⚙️ Konfiguration + +### Umgebungsvariablen +- `IMAP_SERVER`: IMAP-Server (Standard: secureimap.t-online.de) +- `IMAP_PORT`: IMAP-Port (Standard: 993) +- `EMAIL_USER`: E-Mail-Adresse +- `EMAIL_PASS`: E-Mail-Passwort (empfohlen: App-spezifisches Passwort) +- `SAVE_DIR`: Speicherverzeichnis (Standard: /app/videospeicher) + +### Automatische Bereinigung +- Dateien älter als 365 Tage werden automatisch gelöscht +- Leere Ordner werden entfernt + +## 🔒 Sicherheitshinweise + +1. **App-spezifische Passwörter verwenden**: Erstelle ein App-spezifisches Passwort für dein E-Mail-Konto +2. **Umgebungsvariablen nutzen**: Speichere Zugangsdaten nicht im Code +3. **Volume-Backups**: Sichere regelmäßig das `videospeicher` Volume + +## 🛠 Wartung + +### Container neustarten +```bash +docker-compose restart +``` + +### Container stoppen +```bash +docker-compose down +``` + +### Logs anzeigen +```bash +docker-compose logs camerasave +``` + +### Container-Status prüfen +```bash +docker-compose ps +``` + +## 🐛 Troubleshooting + +### E-Mail-Verbindungsfehler +- Überprüfe IMAP-Server und Port +- Stelle sicher, dass IMAP aktiviert ist +- Verwende App-spezifische Passwörter + +### Berechtigung-Fehler +```bash +# Berechtigungen für videospeicher-Ordner setzen +sudo chown -R $(id -u):$(id -g) videospeicher/ +``` + +### Container-Logs überprüfen +```bash +docker logs camerasave +``` \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..820ba50 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,20 @@ +version: '3.8' + +services: + camerasave: + build: . + container_name: camerasave + restart: unless-stopped + volumes: + - ./videospeicher:/app/videospeicher + environment: + # Überschreibe hier die E-Mail-Konfiguration wenn nötig + - IMAP_SERVER=secureimap.t-online.de + - IMAP_PORT=993 + - EMAIL_USER=dk2ge@t-online.de + - EMAIL_PASS=ETBjw65tf2 + # Führe das Skript alle 5 Minuten aus + command: > + sh -c "while true; do + python main.py && echo 'CameraSave ausgeführt um $$(date)' && sleep 300; + done" \ No newline at end of file diff --git a/main.py b/main.py index 45daa3b..c4a29f3 100644 --- a/main.py +++ b/main.py @@ -5,11 +5,11 @@ import shutil from datetime import datetime, timedelta # === KONFIGURATION === -IMAP_SERVER = "secureimap.t-online.de" -IMAP_PORT = 993 -EMAIL_USER = "dk2ge@t-online.de" -EMAIL_PASS = "ETBjw65tf2" -SAVE_DIR = "./videospeicher" +IMAP_SERVER = os.getenv("IMAP_SERVER", "secureimap.t-online.de") +IMAP_PORT = int(os.getenv("IMAP_PORT", "993")) +EMAIL_USER = os.getenv("EMAIL_USER", "dk2ge@t-online.de") +EMAIL_PASS = os.getenv("EMAIL_PASS", "ETBjw65tf2") +SAVE_DIR = os.getenv("SAVE_DIR", "./videospeicher") # === ALTE DATEIEN LÖSCHEN (älter als 1 Jahr) === def cleanup_old_files(base_dir, days=365): diff --git a/requirements.txt b/requirements.txt index e69de29..4f47d30 100644 --- a/requirements.txt +++ b/requirements.txt @@ -0,0 +1,7 @@ +# Keine externen Dependencies erforderlich +# Das Skript verwendet nur Python Standard-Bibliotheken: +# - imaplib (E-Mail IMAP-Zugriff) +# - email (E-Mail-Parsing) +# - os (Dateisystem-Operationen) +# - shutil (Datei-/Ordner-Operationen) +# - datetime (Datum/Zeit-Operationen) \ No newline at end of file