aktueller stand
This commit is contained in:
388
DEPLOYMENT.md
Normal file
388
DEPLOYMENT.md
Normal file
@@ -0,0 +1,388 @@
|
||||
# Deployment Guide - LinkedIn Post Creation System
|
||||
|
||||
Diese Anleitung erklärt, wie du die LinkedIn Post App auf deinem Server mit Docker deployen kannst.
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
- Ein Server (VPS/Cloud) mit:
|
||||
- Ubuntu 20.04+ oder Debian 11+
|
||||
- Mindestens 1GB RAM
|
||||
- Docker & Docker Compose installiert
|
||||
- Domain (optional, für HTTPS)
|
||||
- API Keys:
|
||||
- OpenAI API Key
|
||||
- Perplexity API Key
|
||||
- Apify API Key
|
||||
- Supabase URL & Key
|
||||
|
||||
---
|
||||
|
||||
## Schritt 1: Server vorbereiten
|
||||
|
||||
### Docker installieren (falls nicht vorhanden)
|
||||
|
||||
```bash
|
||||
# System aktualisieren
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
|
||||
# Docker installieren
|
||||
curl -fsSL https://get.docker.com -o get-docker.sh
|
||||
sudo sh get-docker.sh
|
||||
|
||||
# Docker Compose installieren
|
||||
sudo apt install docker-compose-plugin -y
|
||||
|
||||
# Aktuellen User zur Docker-Gruppe hinzufügen
|
||||
sudo usermod -aG docker $USER
|
||||
|
||||
# Neu einloggen oder:
|
||||
newgrp docker
|
||||
|
||||
# Testen
|
||||
docker --version
|
||||
docker compose version
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Schritt 2: Projekt auf den Server laden
|
||||
|
||||
### Option A: Mit Git (empfohlen)
|
||||
|
||||
```bash
|
||||
# Repository klonen
|
||||
git clone https://github.com/dein-username/LinkedInWorkflow.git
|
||||
cd LinkedInWorkflow
|
||||
```
|
||||
|
||||
### Option B: Mit SCP (von deinem lokalen Rechner)
|
||||
|
||||
```bash
|
||||
# Auf deinem lokalen Rechner:
|
||||
scp -r /pfad/zu/LinkedInWorkflow user@dein-server:/home/user/
|
||||
```
|
||||
|
||||
### Option C: Mit rsync
|
||||
|
||||
```bash
|
||||
# Auf deinem lokalen Rechner:
|
||||
rsync -avz --exclude '.env' --exclude '__pycache__' --exclude '.git' \
|
||||
/pfad/zu/LinkedInWorkflow/ user@dein-server:/home/user/LinkedInWorkflow/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Schritt 3: Umgebungsvariablen konfigurieren
|
||||
|
||||
```bash
|
||||
cd LinkedInWorkflow
|
||||
|
||||
# .env Datei aus Vorlage erstellen
|
||||
cp .env.example .env
|
||||
|
||||
# .env bearbeiten
|
||||
nano .env
|
||||
```
|
||||
|
||||
### Wichtige Einstellungen in der `.env`:
|
||||
|
||||
```env
|
||||
# Web-Passwort (UNBEDINGT ÄNDERN!)
|
||||
WEB_PASSWORD=dein-sicheres-passwort-hier
|
||||
|
||||
# API Keys (deine echten Keys eintragen)
|
||||
OPENAI_API_KEY=sk-...
|
||||
PERPLEXITY_API_KEY=pplx-...
|
||||
APIFY_API_KEY=apify_api_...
|
||||
|
||||
# Supabase
|
||||
SUPABASE_URL=https://dein-projekt.supabase.co
|
||||
SUPABASE_KEY=dein-supabase-key
|
||||
|
||||
# Production Settings
|
||||
DEBUG=false
|
||||
LOG_LEVEL=INFO
|
||||
```
|
||||
|
||||
**Wichtig:** Die `.env` Datei sollte NIEMALS committed werden!
|
||||
|
||||
---
|
||||
|
||||
## Schritt 4: Docker Container starten
|
||||
|
||||
```bash
|
||||
# Im Projektverzeichnis:
|
||||
cd LinkedInWorkflow
|
||||
|
||||
# Container bauen und starten
|
||||
docker compose up -d --build
|
||||
|
||||
# Logs ansehen
|
||||
docker compose logs -f
|
||||
|
||||
# Status prüfen
|
||||
docker compose ps
|
||||
```
|
||||
|
||||
Die App ist jetzt unter `http://dein-server:8000` erreichbar.
|
||||
|
||||
---
|
||||
|
||||
## Schritt 5: Firewall konfigurieren (optional aber empfohlen)
|
||||
|
||||
```bash
|
||||
# UFW installieren (falls nicht vorhanden)
|
||||
sudo apt install ufw -y
|
||||
|
||||
# SSH erlauben (WICHTIG - sonst sperrst du dich aus!)
|
||||
sudo ufw allow ssh
|
||||
|
||||
# Port 8000 erlauben
|
||||
sudo ufw allow 8000
|
||||
|
||||
# Firewall aktivieren
|
||||
sudo ufw enable
|
||||
|
||||
# Status prüfen
|
||||
sudo ufw status
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Schritt 6: Reverse Proxy mit Nginx & SSL (empfohlen für Production)
|
||||
|
||||
### Nginx installieren
|
||||
|
||||
```bash
|
||||
sudo apt install nginx -y
|
||||
```
|
||||
|
||||
### Nginx Konfiguration erstellen
|
||||
|
||||
```bash
|
||||
sudo nano /etc/nginx/sites-available/linkedin-posts
|
||||
```
|
||||
|
||||
Inhalt:
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name deine-domain.de;
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:8000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
proxy_set_header Host $host;
|
||||
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;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
proxy_read_timeout 86400;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Nginx aktivieren
|
||||
|
||||
```bash
|
||||
# Symlink erstellen
|
||||
sudo ln -s /etc/nginx/sites-available/linkedin-posts /etc/nginx/sites-enabled/
|
||||
|
||||
# Default-Site entfernen
|
||||
sudo rm /etc/nginx/sites-enabled/default
|
||||
|
||||
# Konfiguration testen
|
||||
sudo nginx -t
|
||||
|
||||
# Nginx neu starten
|
||||
sudo systemctl restart nginx
|
||||
```
|
||||
|
||||
### SSL mit Let's Encrypt (kostenlos)
|
||||
|
||||
```bash
|
||||
# Certbot installieren
|
||||
sudo apt install certbot python3-certbot-nginx -y
|
||||
|
||||
# SSL-Zertifikat beantragen
|
||||
sudo certbot --nginx -d deine-domain.de
|
||||
|
||||
# Auto-Renewal testen
|
||||
sudo certbot renew --dry-run
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Nützliche Befehle
|
||||
|
||||
### Container Management
|
||||
|
||||
```bash
|
||||
# Container stoppen
|
||||
docker compose down
|
||||
|
||||
# Container neu starten
|
||||
docker compose restart
|
||||
|
||||
# Container neu bauen (nach Code-Änderungen)
|
||||
docker compose up -d --build
|
||||
|
||||
# In Container einloggen
|
||||
docker compose exec linkedin-posts bash
|
||||
|
||||
# Logs ansehen (live)
|
||||
docker compose logs -f
|
||||
|
||||
# Logs der letzten 100 Zeilen
|
||||
docker compose logs --tail=100
|
||||
```
|
||||
|
||||
### Updates einspielen
|
||||
|
||||
```bash
|
||||
# Code aktualisieren (mit Git)
|
||||
git pull
|
||||
|
||||
# Container neu bauen
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
### Backup
|
||||
|
||||
```bash
|
||||
# .env sichern (enthält alle Secrets!)
|
||||
cp .env .env.backup
|
||||
|
||||
# Alle Daten sind in Supabase - kein lokales Backup nötig
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Container startet nicht
|
||||
|
||||
```bash
|
||||
# Logs ansehen
|
||||
docker compose logs linkedin-posts
|
||||
|
||||
# Container-Status prüfen
|
||||
docker compose ps -a
|
||||
|
||||
# Neustart erzwingen
|
||||
docker compose down && docker compose up -d --build
|
||||
```
|
||||
|
||||
### Port bereits belegt
|
||||
|
||||
```bash
|
||||
# Prüfen was auf Port 8000 läuft
|
||||
sudo lsof -i :8000
|
||||
|
||||
# Prozess beenden
|
||||
sudo kill -9 <PID>
|
||||
```
|
||||
|
||||
### Keine Verbindung zu Supabase
|
||||
|
||||
1. Prüfe ob SUPABASE_URL und SUPABASE_KEY korrekt sind
|
||||
2. Prüfe ob der Server ausgehende Verbindungen erlaubt
|
||||
3. Teste: `curl -I https://dein-projekt.supabase.co`
|
||||
|
||||
### Passwort vergessen
|
||||
|
||||
```bash
|
||||
# .env bearbeiten
|
||||
nano .env
|
||||
|
||||
# WEB_PASSWORD ändern
|
||||
|
||||
# Container neu starten
|
||||
docker compose restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Sicherheitsempfehlungen
|
||||
|
||||
1. **Starkes Passwort verwenden** - Mindestens 16 Zeichen, Sonderzeichen
|
||||
2. **HTTPS aktivieren** - Mit Nginx + Let's Encrypt (siehe Schritt 6)
|
||||
3. **Firewall konfigurieren** - Nur nötige Ports öffnen
|
||||
4. **Server aktuell halten** - `sudo apt update && sudo apt upgrade`
|
||||
5. **Docker aktuell halten** - `sudo apt upgrade docker-ce`
|
||||
6. **Keine API Keys committen** - .env in .gitignore
|
||||
|
||||
---
|
||||
|
||||
## Monitoring (optional)
|
||||
|
||||
### Einfaches Health-Check Script
|
||||
|
||||
```bash
|
||||
# health-check.sh erstellen
|
||||
cat > health-check.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
if curl -s -o /dev/null -w "%{http_code}" http://localhost:8000/login | grep -q "200"; then
|
||||
echo "$(date): OK"
|
||||
else
|
||||
echo "$(date): FEHLER - Neustart..."
|
||||
docker compose restart
|
||||
fi
|
||||
EOF
|
||||
|
||||
chmod +x health-check.sh
|
||||
|
||||
# Als Cron-Job (alle 5 Minuten)
|
||||
(crontab -l 2>/dev/null; echo "*/5 * * * * /home/user/LinkedInWorkflow/health-check.sh >> /var/log/linkedin-health.log 2>&1") | crontab -
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Architektur
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Internet │
|
||||
└─────────────────────────┬───────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Nginx (Port 80/443) │
|
||||
│ - SSL Termination │
|
||||
│ - Reverse Proxy │
|
||||
└─────────────────────────┬───────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Docker Container (Port 8000) │
|
||||
│ │
|
||||
│ ┌────────────────────────────────────────────────────┐ │
|
||||
│ │ FastAPI Application │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────┐ ┌─────────────┐ ┌────────────┐ │ │
|
||||
│ │ │ Web UI │ │ API │ │ Agents │ │ │
|
||||
│ │ │ (Jinja2) │ │ Endpoints │ │ (AI Logic) │ │ │
|
||||
│ │ └─────────────┘ └─────────────┘ └────────────┘ │ │
|
||||
│ └────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────┬───────────────────────────────┘
|
||||
│
|
||||
┌───────────────┼───────────────┐
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
┌──────────┐ ┌──────────┐ ┌──────────┐
|
||||
│ Supabase │ │ OpenAI │ │ Perplexity│
|
||||
│ DB │ │ API │ │ API │
|
||||
└──────────┘ └──────────┘ └──────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Support
|
||||
|
||||
Bei Problemen:
|
||||
1. Logs prüfen: `docker compose logs -f`
|
||||
2. GitHub Issues öffnen
|
||||
3. Container neu bauen: `docker compose up -d --build`
|
||||
Reference in New Issue
Block a user