# **Bereitstellungsdetails und Best Practices**

In diesem Abschnitt erläutere ich, wie das MYP-Projekt auf einem Server bereitgestellt wird, sowie empfohlene Praktiken zur Verwaltung und Optimierung des Systems.

---

## **1. Bereitstellungsschritte**

### **1.1. Voraussetzungen**
- **Server:** Raspberry Pi mit installiertem Raspbian Lite.
- **Docker:** Docker und Docker Compose müssen vorab installiert sein.
- **Netzwerk:** Der Server muss über eine statische IP-Adresse oder einen DNS-Namen erreichbar sein.

### **1.2. Vorbereitung**
#### **1.2.1. Docker-Images erstellen und speichern**
Führen Sie die folgenden Schritte auf dem Entwicklungssystem aus:
1. **Images erstellen:**
   ```bash
   bash docker/build.sh
   ```
2. **Images exportieren und komprimieren:**
   ```bash
   bash docker/save.sh <image-name>
   ```
   Dies speichert die Docker-Images im Verzeichnis `docker/images/`.

#### **1.2.2. Übertragung auf den Server**
Kopieren Sie die erzeugten `.tar.xz`-Dateien auf den Raspberry Pi:
```bash
scp docker/images/*.tar.xz <username>@<server-ip>:/path/to/destination/
```

---

### **1.3. Images auf dem Server laden**
Loggen Sie sich auf dem Server ein und laden Sie die Docker-Images:
```bash
docker load -i /path/to/destination/<image-name>.tar.xz
```

---

### **1.4. Starten der Anwendung**
Führen Sie das Bereitstellungsskript aus:
```bash
bash docker/deploy.sh
```
Dieses Skript:
- Startet die Docker-Container mithilfe von `docker compose`.
- Verbindet den Reverse Proxy (Caddy) mit der Anwendung.

Die Anwendung sollte unter `http://<server-ip>` oder der konfigurierten Domain erreichbar sein.

---

## **2. Best Practices**

### **2.1. Sicherheit**
1. **Umgebungsvariablen schützen:**
   - Stellen Sie sicher, dass die Datei `.env` nicht versehentlich in ein öffentliches Repository hochgeladen wird.
   - Verwenden Sie geeignete Zugriffsrechte:
     ```bash
     chmod 600 .env
     ```
2. **HTTPS aktivieren:**
   - Der Caddy-Webserver unterstützt automatisch HTTPS. Stellen Sie sicher, dass eine gültige Domain konfiguriert ist.

3. **Zugriffsrechte beschränken:**
   - Verwenden Sie Benutzerrollen („admin“, „guest“), um den Zugriff auf kritische Funktionen zu steuern.

---

### **2.2. Performance**
1. **Docker-Container optimieren:**
   - Reduzieren Sie die Größe der Docker-Images, indem Sie unnötige Dateien in `.dockerignore` ausschließen.

2. **Datenbankwartung:**
   - Führen Sie regelmäßige Backups der SQLite-Datenbank durch:
     ```bash
     cp db/sqlite.db /path/to/backup/location/
     ```
   - Optimieren Sie die Datenbank regelmäßig:
     ```sql
     VACUUM;
     ```

3. **Skalierung:**
   - Bei hoher Last kann die Anwendung mit Kubernetes oder einer Cloud-Lösung (z. B. AWS oder Azure) skaliert werden.

---

### **2.3. Fehlerbehebung**
1. **Logs überprüfen:**
   - Docker-Logs können wichtige Debug-Informationen liefern:
     ```bash
     docker logs <container-name>
     ```

2. **Health Checks:**
   - Integrieren Sie Health Checks in die Docker Compose-Datei, um sicherzustellen, dass die Dienste korrekt laufen.

3. **Fehlerhafte Drucker deaktivieren:**
   - Deaktivieren Sie Drucker mit einer hohen Fehlerrate über das Admin-Dashboard, um die Benutzererfahrung zu verbessern.

---

### **2.4. Updates**
1. **Neue Funktionen hinzufügen:**
   - Aktualisieren Sie die Anwendung und erstellen Sie neue Docker-Images:
     ```bash
     git pull origin main
     bash docker/build.sh
     ```
   - Stellen Sie die aktualisierten Images bereit:
     ```bash
     bash docker/deploy.sh
     ```

2. **Datenbankmigrationen:**
   - Führen Sie neue Migrationsskripte mit folgendem Befehl aus:
     ```bash
     pnpm run db:migrate
     ```

---

## **3. Backup und Wiederherstellung**

### **3.1. Backups erstellen**
Sichern Sie wichtige Dateien und Datenbanken regelmäßig:
- **SQLite-Datenbank:**
  ```bash
  cp db/sqlite.db /backup/location/sqlite-$(date +%F).db
  ```
- **Docker-Images:**
  ```bash
  docker save myp-rp:latest | gzip > /backup/location/myp-rp-$(date +%F).tar.gz
  ```

### **3.2. Wiederherstellung**
- **Datenbank wiederherstellen:**
  ```bash
  cp /backup/location/sqlite-<date>.db db/sqlite.db
  ```
- **Docker-Images importieren:**
  ```bash
  docker load < /backup/location/myp-rp-<date>.tar.gz
  ```

Nächster Schritt: [=> Admin-Dashboard](./Admin-Dashboard.md)