- Source-Copy von /root/entwicklung/pfandsystem - docker-compose.yml umgeschrieben: pfandsystem-demo-* Container, Ports 3308/8083/3003 (alle localhost) - Traefik-Label fuer pfandsystem.dockly.de - Erweitertes Multi-Tenant-Schema (tenants, tenant_id auf allen Tabellen) - Neue Tabellen: kunden_bilder, geraete - Neue Spalten: kunden.anlieferungshinweis, kunden.lieferzeit_bis - Rollen: superadmin, admin, user, fahrer - .env.example + README Code-Refactor (Tailwind, Multi-Tenant-Middleware, Erweiterungen) folgt.
11 KiB
11 KiB
🔄 Migration & Setup: Neue Verzeichnisstruktur
📁 Neue Struktur
/root/
├── entwicklung/
│ └── pfandsystem/ # Dev-Version (verschoben von /root)
├── livesysteme/
│ └── borbaecker/ # Live-Version (neu)
└── backups/
├── entwicklung/
│ └── pfandsystem/ # Backups der Dev-Version
└── livesysteme/
└── borbaecker/ # Backups der Live-Version
🚀 Schritt 1: Verzeichnisse erstellen
# Hauptverzeichnisse
mkdir -p /root/entwicklung
mkdir -p /root/livesysteme
mkdir -p /root/backups/entwicklung
mkdir -p /root/backups/livesysteme
echo "✅ Verzeichnisstruktur erstellt"
🔄 Schritt 2: Dev-Version verschieben
# Backend stoppen
pkill -f "node.*server.js"
# Docker Container stoppen
cd /root
docker compose down
# Verschieben (außer bestimmte Dateien)
rsync -av --progress \
--exclude 'node_modules' \
--exclude '.git' \
--exclude 'dist' \
/root/ /root/entwicklung/pfandsystem/
# Git-Verzeichnis verschieben
mv /root/.git /root/entwicklung/pfandsystem/.git
# Alte Dateien aufräumen (nach Bestätigung)
# rm -rf /root/backend /root/src /root/public ...
echo "✅ Dev-Version nach /root/entwicklung/pfandsystem verschoben"
🆕 Schritt 3: Live-Version erstellen
cd /root/livesysteme/borbaecker
# Git klonen
git clone ssh://git@49.13.154.75:2244/christian/pfandsystem.git .
# Auf main branch
git checkout main
echo "✅ Live-Version in /root/livesysteme/borbaecker erstellt"
⚙️ Schritt 4: Konfigurationen anpassen
Dev-Version (/root/entwicklung/pfandsystem)
Frontend .env:
cat > /root/entwicklung/pfandsystem/.env << 'EOF'
VITE_API_URL=https://pfandsystem.backdigital.de/api
EOF
Backend .env:
cat > /root/entwicklung/pfandsystem/backend/.env << 'EOF'
DB_HOST=localhost
DB_PORT=3306
DB_USER=pfandsystem
DB_PASSWORD=pfandsystem_secure_password
DB_NAME=pfandsystem
JWT_SECRET=your_very_secure_jwt_secret_key_change_this_in_production
PORT=3001
NODE_ENV=development
RESEND_API_KEY=re_6BE6Hv6U_H7ggkAT4ApbiSZ5SCo2Cf1qA
UPLOAD_DIR=/root/entwicklung/pfandsystem/backend/uploads
MAX_FILE_SIZE=10485760
EOF
Docker-Compose anpassen:
# Container-Namen mit -dev suffix
sed -i 's/pfandsystem-/pfandsystem-dev-/g' /root/entwicklung/pfandsystem/docker-compose.yml
Live-Version (/root/livesysteme/borbaecker)
Frontend .env:
cat > /root/livesysteme/borbaecker/.env << 'EOF'
VITE_API_URL=https://borbaecker.de/api
EOF
Backend .env:
cat > /root/livesysteme/borbaecker/backend/.env << 'EOF'
DB_HOST=localhost
DB_PORT=3307
DB_USER=borbaecker
DB_PASSWORD=NEUES_SICHERES_PASSWORT_HIER
DB_NAME=borbaecker
JWT_SECRET=NEUER_JWT_SECRET_HIER
PORT=3002
NODE_ENV=production
RESEND_API_KEY=re_6BE6Hv6U_H7ggkAT4ApbiSZ5SCo2Cf1qA
UPLOAD_DIR=/root/livesysteme/borbaecker/backend/uploads
MAX_FILE_SIZE=10485760
EOF
Docker-Compose:
cat > /root/livesysteme/borbaecker/docker-compose.yml << 'EOF'
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: borbaecker-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: NEUES_ROOT_PASSWORT
MYSQL_DATABASE: borbaecker
MYSQL_USER: borbaecker
MYSQL_PASSWORD: NEUES_SICHERES_PASSWORT
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3307:3306"
networks:
- borbaecker-network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
phpmyadmin:
image: phpmyadmin:latest
container_name: borbaecker-phpmyadmin
restart: unless-stopped
environment:
PMA_HOST: mysql
PMA_PORT: 3306
ports:
- "8082:80"
networks:
- borbaecker-network
depends_on:
- mysql
frontend:
image: nginx:1.25-alpine
container_name: borbaecker-frontend
restart: unless-stopped
volumes:
- ./dist:/usr/share/nginx/html:ro
networks:
- borbaecker-network
labels:
- "traefik.enable=true"
- "traefik.http.routers.borbaecker.rule=Host(`borbaecker.de`)"
- "traefik.http.routers.borbaecker.entrypoints=web,websecure"
- "traefik.http.routers.borbaecker.tls=true"
- "traefik.http.routers.borbaecker.tls.certresolver=letsencrypt"
- "traefik.http.services.borbaecker.loadbalancer.server.port=80"
volumes:
mysql_data:
driver: local
networks:
borbaecker-network:
driver: bridge
EOF
🔧 Schritt 5: Traefik-Configs anpassen
Dev-Version:
cat > /root/traefik/dynamic/pfandsystem-dev.yml << 'EOF'
http:
routers:
pfandsystem-dev-api:
rule: "Host(`pfandsystem.backdigital.de`) && PathPrefix(`/api`)"
service: pfandsystem-dev-api
entryPoints:
- web
- websecure
tls:
certResolver: letsencrypt
priority: 100
pfandsystem-dev-uploads:
rule: "Host(`pfandsystem.backdigital.de`) && PathPrefix(`/uploads`)"
service: pfandsystem-dev-api
entryPoints:
- web
- websecure
tls:
certResolver: letsencrypt
priority: 100
services:
pfandsystem-dev-api:
loadBalancer:
servers:
- url: "http://172.17.0.1:3001"
EOF
Live-Version:
cat > /root/traefik/dynamic/borbaecker.yml << 'EOF'
http:
routers:
borbaecker-api:
rule: "Host(`borbaecker.de`) && PathPrefix(`/api`)"
service: borbaecker-api
entryPoints:
- web
- websecure
tls:
certResolver: letsencrypt
priority: 100
borbaecker-uploads:
rule: "Host(`borbaecker.de`) && PathPrefix(`/uploads`)"
service: borbaecker-api
entryPoints:
- web
- websecure
tls:
certResolver: letsencrypt
priority: 100
services:
borbaecker-api:
loadBalancer:
servers:
- url: "http://172.17.0.1:3002"
EOF
💾 Schritt 6: Backup-Scripte erstellen
Dev-Backup-Script:
cat > /root/entwicklung/pfandsystem/backup-dev.sh << 'EOF'
#!/bin/bash
# Backup-Verzeichnis
BACKUP_DIR="/root/backups/entwicklung/pfandsystem"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="backup_${TIMESTAMP}"
# Backup erstellen
mkdir -p "${BACKUP_DIR}/${BACKUP_NAME}"
# Datenbank-Backup
docker exec pfandsystem-dev-mysql mysqldump -upfandsystem -ppfandsystem_secure_password pfandsystem > "${BACKUP_DIR}/${BACKUP_NAME}/database.sql"
# Uploads-Backup
cp -r /root/entwicklung/pfandsystem/backend/uploads "${BACKUP_DIR}/${BACKUP_NAME}/"
# .env Dateien
cp /root/entwicklung/pfandsystem/.env "${BACKUP_DIR}/${BACKUP_NAME}/frontend.env"
cp /root/entwicklung/pfandsystem/backend/.env "${BACKUP_DIR}/${BACKUP_NAME}/backend.env"
# Komprimieren
cd "${BACKUP_DIR}"
tar -czf "${BACKUP_NAME}.tar.gz" "${BACKUP_NAME}"
rm -rf "${BACKUP_NAME}"
# Alte Backups löschen (älter als 7 Tage)
find "${BACKUP_DIR}" -name "backup_*.tar.gz" -mtime +7 -delete
echo "✅ Dev-Backup erstellt: ${BACKUP_NAME}.tar.gz"
EOF
chmod +x /root/entwicklung/pfandsystem/backup-dev.sh
Live-Backup-Script:
cat > /root/livesysteme/borbaecker/backup-live.sh << 'EOF'
#!/bin/bash
# Backup-Verzeichnis
BACKUP_DIR="/root/backups/livesysteme/borbaecker"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="backup_${TIMESTAMP}"
# Backup erstellen
mkdir -p "${BACKUP_DIR}/${BACKUP_NAME}"
# Datenbank-Backup
docker exec borbaecker-mysql mysqldump -uborbaecker -pNEUES_SICHERES_PASSWORT borbaecker > "${BACKUP_DIR}/${BACKUP_NAME}/database.sql"
# Uploads-Backup
cp -r /root/livesysteme/borbaecker/backend/uploads "${BACKUP_DIR}/${BACKUP_NAME}/"
# .env Dateien
cp /root/livesysteme/borbaecker/.env "${BACKUP_DIR}/${BACKUP_NAME}/frontend.env"
cp /root/livesysteme/borbaecker/backend/.env "${BACKUP_DIR}/${BACKUP_NAME}/backend.env"
# Komprimieren
cd "${BACKUP_DIR}"
tar -czf "${BACKUP_NAME}.tar.gz" "${BACKUP_NAME}"
rm -rf "${BACKUP_NAME}"
# Alte Backups löschen (älter als 30 Tage für Live)
find "${BACKUP_DIR}" -name "backup_*.tar.gz" -mtime +30 -delete
echo "✅ Live-Backup erstellt: ${BACKUP_NAME}.tar.gz"
EOF
chmod +x /root/livesysteme/borbaecker/backup-live.sh
⏰ Schritt 7: Cron-Jobs einrichten
# Crontab bearbeiten
crontab -e
# Folgendes hinzufügen:
# Dev-Backups: Stündlich von 6-23 Uhr
0 6-23 * * * /root/entwicklung/pfandsystem/backup-dev.sh >> /var/log/backup-dev.log 2>&1
# Live-Backups: Stündlich von 6-23 Uhr
0 6-23 * * * /root/livesysteme/borbaecker/backup-live.sh >> /var/log/backup-live.log 2>&1
🚀 Schritt 8: Systeme starten
Dev-Version:
cd /root/entwicklung/pfandsystem
# Docker starten
docker compose up -d
# Backend starten
cd backend
npm install
pm2 start server.js --name pfandsystem-dev
pm2 save
# Frontend bauen
cd ..
npm install
npm run build
node fix-manifest-link.cjs
docker restart pfandsystem-dev-frontend
Live-Version:
cd /root/livesysteme/borbaecker
# Docker starten
docker compose up -d
# Datenbank initialisieren
sleep 30
docker exec -i borbaecker-mysql mysql -uborbaecker -pNEUES_SICHERES_PASSWORT borbaecker < backend/schema.sql
# Admin-User erstellen
cd backend
npm install
node scripts/create-admin.js
# Backend starten
pm2 start server.js --name borbaecker
pm2 save
# Frontend bauen
cd ..
npm install
npm run build
node fix-manifest-link.cjs
docker restart borbaecker-frontend
📊 Übersicht
| System | Verzeichnis | Domain | MySQL | Backend | phpMyAdmin |
|---|---|---|---|---|---|
| Dev | /root/entwicklung/pfandsystem |
pfandsystem.backdigital.de | 3306 | 3001 | 8081 |
| Live | /root/livesysteme/borbaecker |
borbaecker.de | 3307 | 3002 | 8082 |
🔄 Updates deployen
Dev:
cd /root/entwicklung/pfandsystem
git pull
npm run build
node fix-manifest-link.cjs
docker restart pfandsystem-dev-frontend
pm2 restart pfandsystem-dev
Live:
cd /root/livesysteme/borbaecker
git pull
npm run build
node fix-manifest-link.cjs
docker restart borbaecker-frontend
pm2 restart borbaecker
💾 Backup wiederherstellen
# Backup entpacken
cd /root/backups/livesysteme/borbaecker
tar -xzf backup_TIMESTAMP.tar.gz
# Datenbank wiederherstellen
docker exec -i borbaecker-mysql mysql -uborbaecker -pPASSWORT borbaecker < backup_TIMESTAMP/database.sql
# Uploads wiederherstellen
cp -r backup_TIMESTAMP/uploads/* /root/livesysteme/borbaecker/backend/uploads/
✅ Checkliste
- Verzeichnisstruktur erstellt
- Dev-Version verschoben
- Live-Version geklont
- Konfigurationen angepasst
- Traefik-Configs erstellt
- Backup-Scripte erstellt
- Cron-Jobs eingerichtet
- Dev-System gestartet
- Live-System gestartet
- DNS konfiguriert (borbaecker.de)
- Beide Systeme getestet
- Erstes Backup getestet