Files
pfandsystem-demo/dokumentationen/MIGRATION_UND_SETUP.md
christian d86c898455 chore: initial scaffold (Whitelabel-Fork von Pfandsystem)
- 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.
2026-05-26 12:39:17 +00:00

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