für Docker angepasst
This commit is contained in:
317
DEPLOYMENT.md
Normal file
317
DEPLOYMENT.md
Normal file
@@ -0,0 +1,317 @@
|
||||
# Deployment Anleitung - Werte Next.js App
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
Auf dem Server benötigt:
|
||||
- Docker (Version 20.10+)
|
||||
- Docker Compose (Version 2.0+)
|
||||
- MySQL Server (bereits installiert und laufend)
|
||||
- RXF Datenbank mit Tabelle Werte_BZG muss bereits existieren
|
||||
|
||||
## Deployment Schritte
|
||||
|
||||
### 1. Projekt auf den Server übertragen
|
||||
|
||||
```bash
|
||||
# Auf dem Server ein Verzeichnis erstellen
|
||||
mkdir -p /opt/werte-next
|
||||
cd /opt/werte-next
|
||||
|
||||
# Projekt per Git oder rsync übertragen
|
||||
# Option A: Git
|
||||
git clone <repository-url> .
|
||||
|
||||
# Option B: rsync (von lokalem Rechner aus)
|
||||
rsync -av --exclude 'node_modules' --exclude '.next' \
|
||||
/Users/rxf/REXFUE_APPS/werte_next/ user@server:/opt/werte-next/
|
||||
```
|
||||
|
||||
### 2. Umgebungsvariablen konfigurieren
|
||||
|
||||
```bash
|
||||
# .env-Datei aus Beispiel erstellen
|
||||
cp .env.example .env
|
||||
|
||||
# .env-Datei mit Ihren Zugangsdaten bearbeiten
|
||||
nano .env
|
||||
```
|
||||
|
||||
Passen Sie die Werte in der `.env`-Datei an:
|
||||
```bash
|
||||
DB_USER=root
|
||||
DB_PASS=IhrMySQLPasswort
|
||||
DB_NAME=RXF
|
||||
```
|
||||
|
||||
**Wichtig**: Die `.env`-Datei enthält sensible Daten und wird NICHT ins Git-Repository committed!
|
||||
|
||||
### 3. Docker Images bauen und Container starten
|
||||
|
||||
```bash
|
||||
cd /opt/werte-next
|
||||
|
||||
# Images bauen und Container im Hintergrund starten
|
||||
docker-compose up -d --build
|
||||
```
|
||||
|
||||
### 4. Container-Status prüfen
|
||||
|
||||
```bash
|
||||
# Container-Status anzeigen
|
||||
docker-compose ps
|
||||
|
||||
# Logs anschauen
|
||||
docker-compose logs -f werte-app
|
||||
```
|
||||
|
||||
### 5. Datenbank prüfen
|
||||
|
||||
```bash
|
||||
# Direkt auf Host-MySQL verbinden
|
||||
mysql -uroot -p<IhrPasswort> RXF
|
||||
|
||||
# Tabelle prüfen
|
||||
SHOW TABLES;
|
||||
DESCRIBE Werte_BZG;
|
||||
SELECT COUNT(*) FROM Werte_BZG;
|
||||
|
||||
# Oder von außen (falls MySQL externen Zugriff erlaubt)
|
||||
mysql -h <server-ip> -uroot -p<IhrPasswort> RXF
|
||||
```
|
||||
|
||||
### 6. Anwendung im Browser öffnen
|
||||
|
||||
```
|
||||
http://<server-ip>:3000
|
||||
```
|
||||
|
||||
## Konfiguration anpassen
|
||||
|
||||
### Port ändern
|
||||
|
||||
In `docker-compose.yml` den Port für die App ändern:
|
||||
```yaml
|
||||
ports:
|
||||
- "8080:3000" # Zugriff über Port 8080
|
||||
```
|
||||
|
||||
### Datenbankverbindung anpassen
|
||||
|
||||
In `docker-compose.yml` die Umgebungsvariablen ändern:
|
||||
```yaml
|
||||
environment:
|
||||
- DB_HOST=host.docker.internal # Für Host-MySQL
|
||||
- DB_USER=root # MySQL-Benutzer
|
||||
- DB_PASS=IhrPasswort # MySQL-Passwort
|
||||
- DB_NAME=RXF # Datenbankname
|
||||
```
|
||||
|
||||
**Hinweis**: `host.docker.internal` zeigt auf den Docker-Host. Dies wird durch die `extra_hosts` Konfiguration ermöglicht.
|
||||
|
||||
## Verwaltung
|
||||
|
||||
### Container stoppen
|
||||
|
||||
```bash
|
||||
docker-compose stop
|
||||
```
|
||||
|
||||
### Container starten
|
||||
|
||||
```bash
|
||||
docker-compose start
|
||||
```
|
||||
|
||||
### Container neustarten
|
||||
|
||||
```bash
|
||||
docker-compose restart
|
||||
```
|
||||
|
||||
### Container entfernen (Daten bleiben erhalten)
|
||||
|
||||
```bash
|
||||
docker-compose down
|
||||
```
|
||||
|
||||
### Alles löschen inkl. Daten
|
||||
|
||||
```bash
|
||||
docker-compose down -v
|
||||
```
|
||||
|
||||
### Updates einspielen
|
||||
|
||||
```bash
|
||||
# Neue Version holen
|
||||
git pull # oder rsync
|
||||
|
||||
# Neu bauen und starten
|
||||
docker-compose up -d --build
|
||||
```
|
||||
|
||||
### Logs anschauen
|
||||
|
||||
```bash
|
||||
# App-Logs
|
||||
docker-compose logs -f werte-app
|
||||
|
||||
# Letzte 100 Zeilen
|
||||
docker-compose logs --tail=100 werte-app
|
||||
```
|
||||
|
||||
## Backup
|
||||
|
||||
### Datenbank-Backup erstellen
|
||||
|
||||
```bash
|
||||
# Direkt auf dem Host (empfohlen)
|
||||
# Passwort wird interaktiv abgefragt
|
||||
mysqldump -uroot -p RXF > backup_$(date +%Y%m%d).sql
|
||||
|
||||
# Oder mit gzip komprimieren
|
||||
mysqldump -uroot -p RXF | gzip > backup_$(date +%Y%m%d).sql.gz
|
||||
|
||||
# Nur die Werte_BZG Tabelle
|
||||
mysqldump -uroot -p RXF Werte_BZG > werte_backup_$(date +%Y%m%d).sql
|
||||
```
|
||||
|
||||
### Datenbank wiederherstellen
|
||||
|
||||
```bash
|
||||
# Aus Backup wiederherstellen
|
||||
mysql -uroot -p RXF < backup_20260222.sql
|
||||
|
||||
# Aus komprimiertem Backup
|
||||
gunzip < backup_20260222.sql.gz | mysql -uroot -p RXF
|
||||
```
|
||||
|
||||
## Reverse Proxy (Optional)
|
||||
|
||||
Für Produktionsumgebungen empfiehlt sich ein Reverse Proxy wie Nginx:
|
||||
|
||||
### Nginx-Konfiguration Beispiel
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name werte.example.com;
|
||||
|
||||
location / {
|
||||
proxy_pass http://localhost:3000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
proxy_set_header Host $host;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Mit SSL (Let's Encrypt)
|
||||
|
||||
```bash
|
||||
# Certbot installieren
|
||||
apt install certbot python3-certbot-nginx
|
||||
|
||||
# Zertifikat erstellen
|
||||
certbot --nginx -d werte.example.com
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Container startet nicht
|
||||
|
||||
```bash
|
||||
# Detaillierte Logs anschauen
|
||||
docker-compose logs werte-app
|
||||
|
||||
# Container neu bauen
|
||||
docker-compose build --no-cache werte-app
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### Datenbankverbindung schlägt fehl
|
||||
|
||||
```bash
|
||||
# Prüfen ob MySQL auf dem Host läuft
|
||||
sudo systemctl status mysql
|
||||
# oder
|
||||
sudo service mysql status
|
||||
|
||||
# MySQL Error Log prüfen
|
||||
sudo tail -f /var/log/mysql/error.log
|
||||
|
||||
# Verbindung vom Docker-Container testen
|
||||
docker exec -it werte-next-app sh
|
||||
# Im Container:
|
||||
ping host.docker.internal
|
||||
```
|
||||
|
||||
**Hinweis**: Wenn `host.docker.internal` nicht funktioniert, können Sie stattdessen die Server-IP verwenden:
|
||||
```yaml
|
||||
environment:
|
||||
- DB_HOST=192.168.1.100 # Ersetzen mit tatsächlicher Server-IP
|
||||
```
|
||||
|
||||
### App ist langsam
|
||||
|
||||
```bash
|
||||
# Ressourcen-Nutzung prüfen
|
||||
docker stats
|
||||
|
||||
# Container neu starten
|
||||
docker-compose restart werte-app
|
||||
```
|
||||
|
||||
## Systemd Service (Optional)
|
||||
|
||||
Für automatischen Start beim Server-Reboot:
|
||||
|
||||
```bash
|
||||
# Service-Datei erstellen
|
||||
sudo nano /etc/systemd/system/werte-next.service
|
||||
```
|
||||
|
||||
Inhalt:
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Werte Next.js Application
|
||||
After=docker.service
|
||||
Requires=docker.service
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
WorkingDirectory=/opt/werte-next
|
||||
ExecStart=/usr/bin/docker-compose up -d
|
||||
ExecStop=/usr/bin/docker-compose down
|
||||
TimeoutStartSec=0
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
Service aktivieren:
|
||||
```bash
|
||||
sudo systemctl enable werte-next
|
||||
sudo systemctl start werte-next
|
||||
sudo systemctl status werte-next
|
||||
```
|
||||
|
||||
## Monitoring
|
||||
|
||||
CPU und Memory-Nutzung überwachen:
|
||||
```bash
|
||||
docker stats werte-next-app
|
||||
```
|
||||
|
||||
## Support
|
||||
|
||||
Bei Problemen:
|
||||
- Logs prüfen: `docker-compose logs -f`
|
||||
- Container neu starten: `docker-compose restart`
|
||||
- Issues auf GitHub melden
|
||||
Reference in New Issue
Block a user