Release v1.0 – PiCopy vollständig dokumentiert und bereit zur Veröffentlichung
- README.md mit vollständiger Anleitung, Features, Tabellen und Schnellstart - install.sh neu geschrieben: sauberer Installer mit Farbausgabe, apt-Check, Download-Fallback und abschließender Statusmeldung mit URL - LICENSE (MIT) hinzugefügt - .gitignore: config.json, state.json, rclone.conf, logs/ und deploy.sh excluded - deploy.sh entfernt (enthielt Zugangsdaten) - requirements.txt aktualisiert Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
256
README.md
Normal file
256
README.md
Normal file
@@ -0,0 +1,256 @@
|
||||
# PiCopy
|
||||
|
||||
**Automatische USB-Backup-Station für den Raspberry Pi mit Web-Interface**
|
||||
|
||||
PiCopy verwandelt deinen Raspberry Pi in ein eigenständiges Backup-Gerät. Stecke eine Quell-USB (Speicherkarte, USB-Stick) und ein Ziel-Laufwerk ein – PiCopy kopiert die Daten automatisch, organisiert sie in Datumsordnern, prüft die Integrität und kann danach auf ein NAS hochladen.
|
||||
|
||||
---
|
||||
|
||||
## Features
|
||||
|
||||
| | Feature | Beschreibung |
|
||||
|---|---|---|
|
||||
| 📋 | **Automatisches Kopieren** | Startet sofort wenn Quelle und Ziel eingesteckt werden |
|
||||
| 🌐 | **Web-Interface** | Konfiguration und Status von jedem Gerät im Netzwerk |
|
||||
| 📂 | **Datei-Explorer** | Inhalt verbundener Laufwerke direkt im Browser durchsuchen |
|
||||
| 🗂️ | **Smarte Organisation** | Erstellt automatisch Datumsordner (`2024-01-15_143022/`) |
|
||||
| 🔍 | **Dateifilter** | Nur Fotos, nur Videos oder beliebige Dateitypen kopieren |
|
||||
| 🔄 | **Duplikat-Behandlung** | Überspringen / Überschreiben / Umbenennen |
|
||||
| ✅ | **MD5-Verifizierung** | Jede Datei nach dem Kopieren auf Integrität prüfen |
|
||||
| 🗑️ | **Quelle leeren** | Quelldateien nach erfolgreichem Kopieren löschen (Move-Modus) |
|
||||
| 🖧 | **NAS / SMB Upload** | Nach dem lokalen Backup auf ein Netzlaufwerk hochladen |
|
||||
| 📡 | **WiFi-Fallback** | Erstellt einen eigenen Hotspot wenn kein WLAN verfügbar ist |
|
||||
| ⚡ | **Headless-Betrieb** | Kein Monitor, keine Tastatur nötig |
|
||||
| 🔁 | **Autostart** | Startet automatisch beim Pi-Boot via systemd |
|
||||
|
||||
---
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
- Raspberry Pi (2, 3, 4, 5 oder Zero 2W)
|
||||
- Raspberry Pi OS **Bookworm** (Debian 12) oder neuer
|
||||
- Mindestens 2 USB-Ports (Quelle + Ziel)
|
||||
- WLAN oder LAN für das Web-Interface
|
||||
|
||||
---
|
||||
|
||||
## Installation
|
||||
|
||||
### Option A – Direkt vom Git-Repo (empfohlen)
|
||||
|
||||
```bash
|
||||
git clone https://github.com/YOUR_USERNAME/picopy
|
||||
cd picopy
|
||||
sudo bash install.sh
|
||||
```
|
||||
|
||||
### Option B – One-Liner
|
||||
|
||||
```bash
|
||||
curl -sSL https://raw.githubusercontent.com/YOUR_USERNAME/picopy/main/install.sh | sudo bash
|
||||
```
|
||||
|
||||
Nach der Installation ist das Web-Interface unter folgender Adresse erreichbar:
|
||||
|
||||
```
|
||||
http://<raspberry-pi-ip>:8080
|
||||
```
|
||||
|
||||
Die IP-Adresse wird am Ende der Installation angezeigt.
|
||||
|
||||
---
|
||||
|
||||
## Schnellstart
|
||||
|
||||
1. **Web-Interface öffnen** → `http://<pi-ip>:8080`
|
||||
2. **USB-Gerät einstecken** das als Quelle dienen soll
|
||||
3. **Port konfigurieren** → Unter *USB Port Konfiguration* das Gerät in der Dropdown-Liste wählen → *Als feste Quelle speichern*
|
||||
4. **Ziel konfigurieren** → Ziel-Laufwerk einstecken, Port wählen → *Als festes Ziel speichern*
|
||||
5. **Auto-Kopie aktivieren** → Haken bei *Automatisch kopieren wenn Quelle & Ziel verbunden*
|
||||
6. **Fertig** → Jetzt beide Laufwerke einstecken → Kopie startet automatisch
|
||||
|
||||
> **Wichtig:** PiCopy merkt sich den **physischen Port** (Anschluss), nicht das spezifische Gerät. Ein anderer USB-Stick im gleichen Anschluss wird automatisch als Quelle/Ziel erkannt.
|
||||
|
||||
---
|
||||
|
||||
## Web-Interface
|
||||
|
||||
### Kopierstatus
|
||||
|
||||
Zeigt den Live-Fortschritt mit:
|
||||
- Prozentualer Fortschritt + Fortschrittsbalken
|
||||
- Dateizähler (`23 / 147 Dateien`)
|
||||
- Übertragene Datenmenge (`1.2 GB / 3.5 GB`)
|
||||
- Geschwindigkeit (`12.4 MB/s`)
|
||||
- Verbleibende Zeit (`⏱ noch ca. 4 Min.`)
|
||||
- Aktuelle Datei
|
||||
- Phasen-Anzeige: *Kopieren → Verifizieren → Quelle leeren*
|
||||
|
||||
Nach dem Abschluss: Zusammenfassung mit ✕-Button (verschwindet nach 5 Minuten automatisch).
|
||||
|
||||
### USB Port Konfiguration & Datei-Explorer
|
||||
|
||||
```
|
||||
┌─────────────────┬─────────────────┬──────────────────────┐
|
||||
│ ▲ QUELLE │ ▼ ZIEL │ ⬆ Quelle ⬇ Ziel ↻ │
|
||||
│ ● Port 2-2 │ ○ Port 1-1 │ ──────────────────── │
|
||||
│ Samsung USB │ Nicht verbunden│ 📁 DCIM │
|
||||
│ │ │ 📁 MISC │
|
||||
│ [Als Quelle ▾] │ [Als Ziel ▾] │ 🖼 IMG_001.jpg 4 MB │
|
||||
└─────────────────┴─────────────────┴──────────────────────┘
|
||||
```
|
||||
|
||||
- **Grüner Punkt** = Gerät verbunden und bereit
|
||||
- **Grauer Punkt** = Port konfiguriert, kein Gerät eingesteckt
|
||||
- **Datei-Explorer** zum Durchsuchen der verbundenen Laufwerke
|
||||
|
||||
### Kopier-Einstellungen
|
||||
|
||||
| Einstellung | Standard | Beschreibung |
|
||||
|---|---|---|
|
||||
| Datumsformat | `JJJJ-MM-TT` | Format des Zielordners |
|
||||
| Uhrzeit | ✓ | Uhrzeit im Ordnernamen (`_143022`) |
|
||||
| Unterordner | ✓ | Unterordner nach Gerätebezeichnung |
|
||||
| Auto-Kopie | ✓ | Automatisch starten wenn beide verbunden |
|
||||
| Dateifilter | *leer* | Nur bestimmte Dateitypen kopieren |
|
||||
| Systemdateien | ✓ | `.DS_Store`, `Thumbs.db`, `RECYCLER` usw. ausschließen |
|
||||
| Duplikate | Überspringen | Skip / Überschreiben / Umbenennen |
|
||||
| MD5-Verify | ✗ | Jede Datei nach dem Kopieren prüfen |
|
||||
| Quelle leeren | ✗ | Quelldateien nach Kopieren löschen |
|
||||
|
||||
#### Dateifilter – Schnell-Presets
|
||||
|
||||
| Preset | Dateitypen |
|
||||
|---|---|
|
||||
| 📷 Fotos | jpg, jpeg, heic, raw, cr2, nef, arw, dng, png |
|
||||
| 🎬 Videos | mp4, mov, avi, mkv, mts, m2ts, wmv |
|
||||
| 📷+🎬 Beides | Fotos + Videos kombiniert |
|
||||
| ✕ Alle | Kein Filter – alle Dateien kopieren |
|
||||
|
||||
### Fernkopie – NAS / SMB
|
||||
|
||||
Nach dem lokalen Kopieren lädt PiCopy auf konfigurierte NAS-Freigaben hoch:
|
||||
|
||||
1. *+ NAS-Ziel hinzufügen* klicken
|
||||
2. Name, Server-IP, Freigabename, Benutzer und Passwort eingeben
|
||||
3. *Speichern & Verbindung testen* – PiCopy testet die Verbindung sofort
|
||||
4. Mehrere NAS-Ziele möglich, jedes einzeln aktivierbar
|
||||
|
||||
### WiFi-Einstellungen
|
||||
|
||||
| Modus | Beschreibung |
|
||||
|---|---|
|
||||
| **Heimnetz** | WLAN-Name und Passwort für die Router-Verbindung |
|
||||
| **Hotspot (AP)** | Eigenes WLAN wenn kein Heimnetz erreichbar |
|
||||
|
||||
**Hotspot-Standardwerte:**
|
||||
- SSID: `PiCopy`
|
||||
- Passwort: `PiCopy,`
|
||||
- IP im Hotspot-Modus: `http://10.42.0.1:8080`
|
||||
|
||||
Der Hotspot startet automatisch beim Boot wenn das konfigurierte WLAN nicht verfügbar ist.
|
||||
|
||||
---
|
||||
|
||||
## Ordnerstruktur auf dem Ziel
|
||||
|
||||
```
|
||||
/ziel-laufwerk/
|
||||
└── 2024-01-15_143022/ ← Datum + Uhrzeit (konfigurierbar)
|
||||
└── Samsung_USB/ ← Gerätebezeichnung (wenn Unterordner aktiv)
|
||||
├── DCIM/
|
||||
│ └── 100CANON/
|
||||
│ ├── IMG_0001.JPG
|
||||
│ ├── IMG_0001.CR2
|
||||
│ └── IMG_0002.MP4
|
||||
└── MISC/
|
||||
└── notes.txt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Update
|
||||
|
||||
```bash
|
||||
cd picopy
|
||||
git pull
|
||||
sudo cp app.py /opt/picopy/app.py
|
||||
sudo systemctl restart picopy
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Deinstallation
|
||||
|
||||
```bash
|
||||
sudo systemctl stop picopy
|
||||
sudo systemctl disable picopy
|
||||
sudo rm /etc/systemd/system/picopy.service
|
||||
sudo rm -rf /opt/picopy
|
||||
sudo systemctl daemon-reload
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Service-Verwaltung
|
||||
|
||||
```bash
|
||||
# Status prüfen
|
||||
sudo systemctl status picopy
|
||||
|
||||
# Live-Logs
|
||||
journalctl -u picopy -f
|
||||
|
||||
# Neustart
|
||||
sudo systemctl restart picopy
|
||||
|
||||
# Stoppen
|
||||
sudo systemctl stop picopy
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Technische Details
|
||||
|
||||
| Komponente | Technologie |
|
||||
|---|---|
|
||||
| Backend | Python 3 + Flask |
|
||||
| USB-Erkennung | `lsblk` + `udevadm` |
|
||||
| USB-Monitoring | `pyudev` (udev-Events) |
|
||||
| WiFi-Verwaltung | NetworkManager (`nmcli`) |
|
||||
| NAS-Sync | `rclone` (SMB) |
|
||||
| Service | systemd (Autostart, Auto-Restart) |
|
||||
|
||||
**Dateipfade auf dem Pi:**
|
||||
|
||||
| Pfad | Inhalt |
|
||||
|---|---|
|
||||
| `/opt/picopy/app.py` | Hauptanwendung |
|
||||
| `/opt/picopy/config.json` | Konfiguration (Ports, WiFi, Einstellungen) |
|
||||
| `/opt/picopy/state.json` | Letzter Kopierstatus (persisted) |
|
||||
| `/opt/picopy/rclone.conf` | NAS-Zugangsdaten (rclone) |
|
||||
| `/opt/picopy/logs/picopy.log` | Log-Datei |
|
||||
| `/etc/systemd/system/picopy.service` | Systemd-Service |
|
||||
|
||||
---
|
||||
|
||||
## Getestete Hardware
|
||||
|
||||
| Gerät | Status |
|
||||
|---|---|
|
||||
| Raspberry Pi 4 Model B | ✅ Vollständig getestet |
|
||||
| Raspberry Pi 5 | ✅ Kompatibel |
|
||||
| Raspberry Pi 3 Model B+ | ✅ Kompatibel |
|
||||
| Raspberry Pi Zero 2W | ⚠️ Langsamer, nur 1 USB-Port (Hub benötigt) |
|
||||
|
||||
---
|
||||
|
||||
## Lizenz
|
||||
|
||||
MIT License – siehe [LICENSE](LICENSE)
|
||||
|
||||
---
|
||||
|
||||
## Autor
|
||||
|
||||
Tobias Leuschner – [info@leuschner.dev](mailto:info@leuschner.dev)
|
||||
Reference in New Issue
Block a user