Alles jetzt OHNE 'Klaus'

This commit is contained in:
2025-09-23 11:53:40 +00:00
parent 3a55b95598
commit 685b43fbb7
52 changed files with 189 additions and 206 deletions

65
.env
View File

@@ -1,46 +1,29 @@
# Docker Environment Configuration für Rezepte Klaus # Development Environment - Linux Server
# Generated on Mon Sep 22 05:45:27 PM UTC 2025
# Database Configuration # Server Configuration
DB_HOST=mysql HOST_IP=192.168.178.94
DB_PORT=3306 DEVELOPMENT_MODE=true
DB_USER=recipes_user
DB_PASSWORD=recipes_password_2024
DB_NAME=rezepte_klaus
DB_ROOT_PASSWORD=root_password_2024
# Database URL für Prisma # Database Configuration (local development DB)
DATABASE_URL=mysql://recipes_user:recipes_password_2024@mysql:3306/rezepte_klaus MYSQL_PASSWORD=dev_password_123
MYSQL_ROOT_PASSWORD=dev_root_password_123
# Backend Configuration # CORS Configuration for remote access
BACKEND_PORT=3001
NODE_ENV=production
# Upload Configuration
UPLOAD_DIR=/app/uploads
MAX_FILE_SIZE=10485760
ALLOWED_EXTENSIONS=jpg,jpeg,png,webp
# Frontend Configuration
FRONTEND_PORT=80
VITE_API_URL=http://localhost:3001
# phpMyAdmin Configuration (optional)
PMA_HOST=mysql
PMA_PORT=3306
PHPMYADMIN_PORT=8080
# Legacy PHP Configuration (optional)
LEGACY_PHP_PORT=8090
LEGACY_MYSQL_HOST=mysql
LEGACY_MYSQL_DATABASE=rezepte_klaus
LEGACY_MYSQL_USER=recipes_user
LEGACY_MYSQL_PASSWORD=recipes_password_2024
# Security
JWT_SECRET=your_jwt_secret_here_change_in_production
CORS_ORIGIN=* CORS_ORIGIN=*
# Volume Paths # Development URLs:
MYSQL_DATA_PATH=./docker-data/mysql # - Frontend: http://192.168.178.94:3000
UPLOADS_PATH=./docker-data/uploads # - Backend API: http://192.168.178.94:3001/api
LEGACY_UPLOADS_PATH=./upload # - phpMyAdmin: http://192.168.178.94:8080
# - MySQL: 192.168.178.94:3307
# Registry Configuration (for image pulls)
DOCKER_REGISTRY=docker.citysensor.de
# DOCKER_USERNAME=your_username
# DOCKER_PASSWORD=your_password
# Development Notes:
# - Use this for testing Linux-specific behavior
# - Access from Mac via: http://192.168.178.94:3000
# - SSH tunnel for secure access: ssh -L 3000:192.168.178.94:3000 user@server

View File

@@ -19,5 +19,5 @@ DOCKER_NAMESPACE=
IMAGE_TAG=latest IMAGE_TAG=latest
# Generated Image Names (automatically set by build script) # Generated Image Names (automatically set by build script)
# BACKEND_IMAGE=docker.citysensor.de/rezepte-klaus-backend:latest # BACKEND_IMAGE=docker.citysensor.de/rezepte-backend:latest
# FRONTEND_IMAGE=docker.citysensor.de/rezepte-klaus-frontend:latest # FRONTEND_IMAGE=docker.citysensor.de/rezepte-frontend:latest

View File

@@ -1,15 +1,15 @@
# Docker Environment Configuration für Rezepte Klaus # Docker Environment Configuration für Rezepte
# Database Configuration # Database Configuration
DB_HOST=mysql DB_HOST=mysql
DB_PORT=3306 DB_PORT=3306
DB_USER=recipes_user DB_USER=recipes_user
DB_PASSWORD=recipes_password_2024 DB_PASSWORD=recipes_password_2024
DB_NAME=rezepte_klaus DB_NAME=rezepte
DB_ROOT_PASSWORD=root_password_2024 DB_ROOT_PASSWORD=root_password_2024
# Database URL für Prisma # Database URL für Prisma
DATABASE_URL=mysql://recipes_user:recipes_password_2024@mysql:3306/rezepte_klaus DATABASE_URL=mysql://recipes_user:recipes_password_2024@mysql:3306/rezepte
# Backend Configuration # Backend Configuration
BACKEND_PORT=3001 BACKEND_PORT=3001
@@ -32,7 +32,7 @@ PHPMYADMIN_PORT=8080
# Legacy PHP Configuration (optional) # Legacy PHP Configuration (optional)
LEGACY_PHP_PORT=8090 LEGACY_PHP_PORT=8090
LEGACY_MYSQL_HOST=mysql LEGACY_MYSQL_HOST=mysql
LEGACY_MYSQL_DATABASE=rezepte_klaus LEGACY_MYSQL_DATABASE=rezepte
LEGACY_MYSQL_USER=recipes_user LEGACY_MYSQL_USER=recipes_user
LEGACY_MYSQL_PASSWORD=recipes_password_2024 LEGACY_MYSQL_PASSWORD=recipes_password_2024

View File

@@ -29,12 +29,12 @@ DOCKER_USERNAME=your_username_here
DOCKER_PASSWORD=your_password_here DOCKER_PASSWORD=your_password_here
# Docker Registry Images (CitySensor) # Docker Registry Images (CitySensor)
BACKEND_IMAGE=docker.citysensor.de/rezepte-klaus-backend:latest BACKEND_IMAGE=docker.citysensor.de/rezepte-backend:latest
FRONTEND_IMAGE=docker.citysensor.de/rezepte-klaus-frontend:latest FRONTEND_IMAGE=docker.citysensor.de/rezepte-frontend:latest
# Setup Instructions: # Setup Instructions:
# 1. Find your Gitea MySQL container name: docker ps | grep mysql # 1. Find your Gitea MySQL container name: docker ps | grep mysql
# 2. Find your Gitea network: docker network ls | grep gitea # 2. Find your Gitea network: docker network ls | grep gitea
# 3. Update MYSQL_HOST with the correct container name # 3. Update MYSQL_HOST with the correct container name
# 4. Update EXTERNAL_MYSQL_NETWORK with the correct network name # 4. Update EXTERNAL_MYSQL_NETWORK with the correct network name
# 5. Create rezepte_klaus database and user (see setup script) # 5. Create rezepte database and user (see setup script)

View File

@@ -15,4 +15,4 @@ API_BASE_URL=https://yourdomain.com/api
# JWT_SECRET=your_super_secure_jwt_secret_minimum_32_characters_long # JWT_SECRET=your_super_secure_jwt_secret_minimum_32_characters_long
# Optional: Database URL override # Optional: Database URL override
# DATABASE_URL=mysql://rezepte_user:password@mysql:3306/rezepte_klaus # DATABASE_URL=mysql://rezepte_user:password@mysql:3306/rezepte

View File

@@ -14,17 +14,17 @@ DOCKER_USERNAME=your_username_here
DOCKER_PASSWORD=your_password_here DOCKER_PASSWORD=your_password_here
# Docker Registry Images # Docker Registry Images
BACKEND_IMAGE=docker.citysensor.de/rezepte-klaus-backend:latest BACKEND_IMAGE=docker.citysensor.de/rezepte-backend:latest
FRONTEND_IMAGE=docker.citysensor.de/rezepte-klaus-frontend:latest FRONTEND_IMAGE=docker.citysensor.de/rezepte-frontend:latest
# Alternative: Docker Hub # Alternative: Docker Hub
# BACKEND_IMAGE=your-username/rezepte-klaus-backend:latest # BACKEND_IMAGE=your-username/rezepte-backend:latest
# FRONTEND_IMAGE=your-username/rezepte-klaus-frontend:latest # FRONTEND_IMAGE=your-username/rezepte-frontend:latest
# Alternative: AWS ECR # Alternative: AWS ECR
# BACKEND_IMAGE=123456789.dkr.ecr.eu-central-1.amazonaws.com/rezepte-klaus-backend:latest # BACKEND_IMAGE=123456789.dkr.ecr.eu-central-1.amazonaws.com/rezepte-backend:latest
# FRONTEND_IMAGE=123456789.dkr.ecr.eu-central-1.amazonaws.com/rezepte-klaus-frontend:latest # FRONTEND_IMAGE=123456789.dkr.ecr.eu-central-1.amazonaws.com/rezepte-frontend:latest
# Alternative: Azure Container Registry # Alternative: Azure Container Registry
# BACKEND_IMAGE=yourregistry.azurecr.io/rezepte-klaus-backend:latest # BACKEND_IMAGE=yourregistry.azurecr.io/rezepte-backend:latest
# FRONTEND_IMAGE=yourregistry.azurecr.io/rezepte-klaus-frontend:latest # FRONTEND_IMAGE=yourregistry.azurecr.io/rezepte-frontend:latest

View File

@@ -21,8 +21,8 @@ DOCKER_USERNAME=your_username_here
DOCKER_PASSWORD=your_password_here DOCKER_PASSWORD=your_password_here
# Docker Registry Images (CitySensor) # Docker Registry Images (CitySensor)
BACKEND_IMAGE=docker.citysensor.de/rezepte-klaus-backend:latest BACKEND_IMAGE=docker.citysensor.de/rezepte-backend:latest
FRONTEND_IMAGE=docker.citysensor.de/rezepte-klaus-frontend:latest FRONTEND_IMAGE=docker.citysensor.de/rezepte-frontend:latest
# Optional: JWT Secret (currently not used, but prepared for future authentication) # Optional: JWT Secret (currently not used, but prepared for future authentication)
# JWT_SECRET=your_super_secure_jwt_secret_minimum_32_characters_long # JWT_SECRET=your_super_secure_jwt_secret_minimum_32_characters_long

View File

@@ -9,8 +9,8 @@ on:
env: env:
REGISTRY: ${{ vars.DOCKER_REGISTRY || 'docker.citysensor.de' }} REGISTRY: ${{ vars.DOCKER_REGISTRY || 'docker.citysensor.de' }}
IMAGE_NAME_BACKEND: rezepte-klaus-backend IMAGE_NAME_BACKEND: rezepte-backend
IMAGE_NAME_FRONTEND: rezepte-klaus-frontend IMAGE_NAME_FRONTEND: rezepte-frontend
jobs: jobs:
build-and-push: build-and-push:

View File

@@ -59,8 +59,8 @@ MYSQL_ROOT_PASSWORD=super_secure_root_password
DOCKER_REGISTRY=docker.citysensor.de DOCKER_REGISTRY=docker.citysensor.de
DOCKER_USERNAME=your_username DOCKER_USERNAME=your_username
DOCKER_PASSWORD=your_password DOCKER_PASSWORD=your_password
BACKEND_IMAGE=docker.citysensor.de/rezepte-klaus-backend:latest BACKEND_IMAGE=docker.citysensor.de/rezepte-backend:latest
FRONTEND_IMAGE=docker.citysensor.de/rezepte-klaus-frontend:latest FRONTEND_IMAGE=docker.citysensor.de/rezepte-frontend:latest
``` ```
## 🔧 Registry-Authentifizierung ## 🔧 Registry-Authentifizierung

View File

@@ -8,8 +8,8 @@
## 1. Repository auf Server klonen ## 1. Repository auf Server klonen
```bash ```bash
git clone <your-repository-url> /opt/rezepte-klaus git clone <your-repository-url> /opt/rezepte
cd /opt/rezepte-klaus cd /opt/rezepte
``` ```
## 2. Produktions-Umgebung konfigurieren ## 2. Produktions-Umgebung konfigurieren
@@ -22,7 +22,7 @@ cp .env.example .env.production
### .env.production anpassen: ### .env.production anpassen:
```env ```env
# Database # Database
DATABASE_URL="mysql://rezepte_user:secure_password_here@mysql:3306/rezepte_klaus" DATABASE_URL="mysql://rezepte_user:secure_password_here@mysql:3306/rezepte"
# Security # Security
JWT_SECRET="your-super-secure-jwt-secret-min-32-chars" JWT_SECRET="your-super-secure-jwt-secret-min-32-chars"
@@ -53,7 +53,7 @@ services:
container_name: rezepte-mysql-prod container_name: rezepte-mysql-prod
restart: unless-stopped restart: unless-stopped
environment: environment:
MYSQL_DATABASE: rezepte_klaus MYSQL_DATABASE: rezepte
MYSQL_USER: rezepte_user MYSQL_USER: rezepte_user
MYSQL_PASSWORD: secure_password_here MYSQL_PASSWORD: secure_password_here
MYSQL_ROOT_PASSWORD: super_secure_root_password MYSQL_ROOT_PASSWORD: super_secure_root_password
@@ -78,7 +78,7 @@ services:
restart: unless-stopped restart: unless-stopped
environment: environment:
- NODE_ENV=production - NODE_ENV=production
- DATABASE_URL=mysql://rezepte_user:secure_password_here@mysql:3306/rezepte_klaus - DATABASE_URL=mysql://rezepte_user:secure_password_here@mysql:3306/rezepte
- JWT_SECRET=your-super-secure-jwt-secret-min-32-chars - JWT_SECRET=your-super-secure-jwt-secret-min-32-chars
- CORS_ORIGIN=https://yourdomain.com - CORS_ORIGIN=https://yourdomain.com
- PORT=3001 - PORT=3001
@@ -148,7 +148,7 @@ sudo cp /etc/letsencrypt/live/yourdomain.com/privkey.pem ./ssl/
### Option B: Reverse Proxy (empfohlen) ### Option B: Reverse Proxy (empfohlen)
```nginx ```nginx
# /etc/nginx/sites-available/rezepte-klaus # /etc/nginx/sites-available/rezepte
server { server {
listen 80; listen 80;
server_name yourdomain.com; server_name yourdomain.com;
@@ -193,7 +193,7 @@ server {
#!/bin/bash #!/bin/bash
set -e set -e
echo "🚀 Deploying Rezepte Klaus..." echo "🚀 Deploying Rezepte..."
# Git pull latest changes # Git pull latest changes
git pull origin main git pull origin main
@@ -221,12 +221,12 @@ fi
```bash ```bash
#!/bin/bash #!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S) DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/opt/backups/rezepte-klaus" BACKUP_DIR="/opt/backups/rezepte"
mkdir -p $BACKUP_DIR mkdir -p $BACKUP_DIR
# Database backup # Database backup
docker exec rezepte-mysql-prod mysqldump -u root -psuper_secure_root_password rezepte_klaus > $BACKUP_DIR/database_$DATE.sql docker exec rezepte-mysql-prod mysqldump -u root -psuper_secure_root_password rezepte > $BACKUP_DIR/database_$DATE.sql
# Uploads backup # Uploads backup
docker cp rezepte-backend-prod:/app/uploads $BACKUP_DIR/uploads_$DATE docker cp rezepte-backend-prod:/app/uploads $BACKUP_DIR/uploads_$DATE
@@ -262,7 +262,7 @@ docker-compose -f docker-compose.production.yml ps
### Crontab für automatische Backups: ### Crontab für automatische Backups:
```bash ```bash
# Täglich um 2 Uhr # Täglich um 2 Uhr
0 2 * * * /opt/rezepte-klaus/backup.sh 0 2 * * * /opt/rezepte/backup.sh
# Wöchentlich SSL-Zertifikat erneuern # Wöchentlich SSL-Zertifikat erneuern
0 3 * * 0 certbot renew --quiet && systemctl reload nginx 0 3 * * 0 certbot renew --quiet && systemctl reload nginx
@@ -290,7 +290,7 @@ docker exec -it rezepte-mysql-prod mysql -u root -p
# Database-Status prüfen # Database-Status prüfen
SHOW DATABASES; SHOW DATABASES;
USE rezepte_klaus; USE rezepte;
SHOW TABLES; SHOW TABLES;
``` ```

View File

@@ -10,11 +10,11 @@
echo $GITHUB_TOKEN | docker login ghcr.io -u YOUR_USERNAME --password-stdin echo $GITHUB_TOKEN | docker login ghcr.io -u YOUR_USERNAME --password-stdin
# Images taggen und pushen # Images taggen und pushen
docker build -t ghcr.io/YOUR_USERNAME/rezepte-klaus-backend:latest ./nodejs-version/backend docker build -t ghcr.io/YOUR_USERNAME/rezepte-backend:latest ./nodejs-version/backend
docker build -t ghcr.io/YOUR_USERNAME/rezepte-klaus-frontend:latest ./nodejs-version/frontend docker build -t ghcr.io/YOUR_USERNAME/rezepte-frontend:latest ./nodejs-version/frontend
docker push ghcr.io/YOUR_USERNAME/rezepte-klaus-backend:latest docker push ghcr.io/YOUR_USERNAME/rezepte-backend:latest
docker push ghcr.io/YOUR_USERNAME/rezepte-klaus-frontend:latest docker push ghcr.io/YOUR_USERNAME/rezepte-frontend:latest
``` ```
#### Docker Hub #### Docker Hub
@@ -23,11 +23,11 @@ docker push ghcr.io/YOUR_USERNAME/rezepte-klaus-frontend:latest
docker login docker login
# Images taggen und pushen # Images taggen und pushen
docker build -t YOUR_USERNAME/rezepte-klaus-backend:latest ./nodejs-version/backend docker build -t YOUR_USERNAME/rezepte-backend:latest ./nodejs-version/backend
docker build -t YOUR_USERNAME/rezepte-klaus-frontend:latest ./nodejs-version/frontend docker build -t YOUR_USERNAME/rezepte-frontend:latest ./nodejs-version/frontend
docker push YOUR_USERNAME/rezepte-klaus-backend:latest docker push YOUR_USERNAME/rezepte-backend:latest
docker push YOUR_USERNAME/rezepte-klaus-frontend:latest docker push YOUR_USERNAME/rezepte-frontend:latest
``` ```
#### Private Registry (AWS ECR, Azure ACR, etc.) #### Private Registry (AWS ECR, Azure ACR, etc.)
@@ -36,11 +36,11 @@ docker push YOUR_USERNAME/rezepte-klaus-frontend:latest
aws ecr get-login-password --region eu-central-1 | docker login --username AWS --password-stdin YOUR_ACCOUNT.dkr.ecr.eu-central-1.amazonaws.com aws ecr get-login-password --region eu-central-1 | docker login --username AWS --password-stdin YOUR_ACCOUNT.dkr.ecr.eu-central-1.amazonaws.com
# Images taggen und pushen # Images taggen und pushen
docker build -t YOUR_ACCOUNT.dkr.ecr.eu-central-1.amazonaws.com/rezepte-klaus-backend:latest ./nodejs-version/backend docker build -t YOUR_ACCOUNT.dkr.ecr.eu-central-1.amazonaws.com/rezepte-backend:latest ./nodejs-version/backend
docker build -t YOUR_ACCOUNT.dkr.ecr.eu-central-1.amazonaws.com/rezepte-klaus-frontend:latest ./nodejs-version/frontend docker build -t YOUR_ACCOUNT.dkr.ecr.eu-central-1.amazonaws.com/rezepte-frontend:latest ./nodejs-version/frontend
docker push YOUR_ACCOUNT.dkr.ecr.eu-central-1.amazonaws.com/rezepte-klaus-backend:latest docker push YOUR_ACCOUNT.dkr.ecr.eu-central-1.amazonaws.com/rezepte-backend:latest
docker push YOUR_ACCOUNT.dkr.ecr.eu-central-1.amazonaws.com/rezepte-klaus-frontend:latest docker push YOUR_ACCOUNT.dkr.ecr.eu-central-1.amazonaws.com/rezepte-frontend:latest
``` ```
### 2. Server-Deployment (nur Docker Compose) ### 2. Server-Deployment (nur Docker Compose)
@@ -53,14 +53,14 @@ Auf dem Server benötigen Sie nur diese Dateien:
```bash ```bash
# Minimales Setup auf Server # Minimales Setup auf Server
mkdir -p /opt/rezepte-klaus mkdir -p /opt/rezepte
cd /opt/rezepte-klaus cd /opt/rezepte
# Nur diese Dateien kopieren: # Nur diese Dateien kopieren:
scp docker-compose.registry.yml user@server:/opt/rezepte-klaus/ scp docker-compose.registry.yml user@server:/opt/rezepte/
scp .env.production user@server:/opt/rezepte-klaus/ scp .env.production user@server:/opt/rezepte/
scp *.sql user@server:/opt/rezepte-klaus/ scp *.sql user@server:/opt/rezepte/
scp deploy-registry.sh user@server:/opt/rezepte-klaus/ scp deploy-registry.sh user@server:/opt/rezepte/
``` ```
## Option 2: CI/CD Pipeline (Automatisiert) ## Option 2: CI/CD Pipeline (Automatisiert)
@@ -108,7 +108,7 @@ jobs:
username: ${{ secrets.USERNAME }} username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_KEY }} key: ${{ secrets.SSH_KEY }}
script: | script: |
cd /opt/rezepte-klaus cd /opt/rezepte
docker-compose -f docker-compose.registry.yml pull docker-compose -f docker-compose.registry.yml pull
docker-compose -f docker-compose.registry.yml up -d docker-compose -f docker-compose.registry.yml up -d
``` ```

View File

@@ -1,4 +1,4 @@
# Rezepte Klaus - Docker Deployment # Rezepte - Docker Deployment
Dieses Projekt kann komplett über Docker containerisiert betrieben werden. Dieses Projekt kann komplett über Docker containerisiert betrieben werden.
@@ -178,7 +178,7 @@ docker-compose -f docker-compose.modern.yml down -v
### Database Backup ### Database Backup
```bash ```bash
docker-compose -f docker-compose.modern.yml exec mysql mysqldump -u recipes_user -p rezepte_klaus > backup.sql docker-compose -f docker-compose.modern.yml exec mysql mysqldump -u recipes_user -p rezepte > backup.sql
``` ```
### Upload Backup ### Upload Backup
@@ -189,7 +189,7 @@ tar -czf uploads-backup.tar.gz docker-data/uploads/
### Restore ### Restore
```bash ```bash
# Database # Database
docker-compose -f docker-compose.modern.yml exec -T mysql mysql -u recipes_user -p rezepte_klaus < backup.sql docker-compose -f docker-compose.modern.yml exec -T mysql mysql -u recipes_user -p rezepte < backup.sql
# Uploads # Uploads
tar -xzf uploads-backup.tar.gz tar -xzf uploads-backup.tar.gz

View File

@@ -1,4 +1,4 @@
# Externe MySQL-Datenbank Integration - Rezepte Klaus # Externe MySQL-Datenbank Integration - Rezepte
## 🗄️ Bestehende MySQL-Datenbank nutzen (Gitea) ## 🗄️ Bestehende MySQL-Datenbank nutzen (Gitea)
@@ -72,7 +72,7 @@ EXTERNAL_MYSQL_NETWORK=gitea_default
1.**Container-Erkennung**: Findet Gitea MySQL-Container 1.**Container-Erkennung**: Findet Gitea MySQL-Container
2.**Netzwerk-Validierung**: Prüft Docker-Netzwerk 2.**Netzwerk-Validierung**: Prüft Docker-Netzwerk
3.**Verbindungstest**: Testet MySQL-Zugriff 3.**Verbindungstest**: Testet MySQL-Zugriff
4.**Datenbank-Setup**: Erstellt `rezepte_klaus` DB 4.**Datenbank-Setup**: Erstellt `rezepte` DB
5.**User-Erstellung**: Legt `rezepte_user` an 5.**User-Erstellung**: Legt `rezepte_user` an
6.**Daten-Import**: Importiert SQL-Dateien 6.**Daten-Import**: Importiert SQL-Dateien
7.**Service-Start**: Startet alle Services 7.**Service-Start**: Startet alle Services
@@ -97,7 +97,7 @@ EXTERNAL_MYSQL_NETWORK=gitea_default
│ Shared MySQL │ │ Shared MySQL │
│ ┌─────────────────────────────┐│ │ ┌─────────────────────────────┐│
│ │ ┌──────────┐ ┌────────────┐││ │ │ ┌──────────┐ ┌────────────┐││
│ │ │ gitea │ │rezepte_klaus│││ │ │ │ gitea │ │rezepte│││
│ │ └──────────┘ └────────────┘││ │ │ └──────────┘ └────────────┘││
│ └─────────────────────────────┘│ │ └─────────────────────────────┘│
└─────────────────────────────────┘ └─────────────────────────────────┘
@@ -127,7 +127,7 @@ networks:
```yaml ```yaml
backend: backend:
environment: environment:
- DATABASE_URL=mysql://rezepte_user:${MYSQL_REZEPTE_PASSWORD}@${MYSQL_HOST}:3306/rezepte_klaus - DATABASE_URL=mysql://rezepte_user:${MYSQL_REZEPTE_PASSWORD}@${MYSQL_HOST}:3306/rezepte
networks: networks:
- traefik-network - traefik-network
- gitea_default # Zugriff auf Gitea MySQL - gitea_default # Zugriff auf Gitea MySQL
@@ -143,10 +143,10 @@ backend:
### **Getrennte Benutzer:** ### **Getrennte Benutzer:**
```sql ```sql
-- Gitea nutzt eigenen User (meist 'gitea') -- Gitea nutzt eigenen User (meist 'gitea')
-- Rezepte Klaus bekommt eigenen User ('rezepte_user') -- Rezepte bekommt eigenen User ('rezepte_user')
-- Keine gegenseitigen Zugriffe -- Keine gegenseitigen Zugriffe
GRANT ALL PRIVILEGES ON rezepte_klaus.* TO 'rezepte_user'@'%'; GRANT ALL PRIVILEGES ON rezepte.* TO 'rezepte_user'@'%';
-- Kein Zugriff auf 'gitea' Datenbank -- Kein Zugriff auf 'gitea' Datenbank
``` ```
@@ -229,10 +229,10 @@ docker-compose -f docker-compose.traefik-external-db.yml logs -f backend
docker exec -it gitea-mysql-1 mysql -uroot -p docker exec -it gitea-mysql-1 mysql -uroot -p
# Als Rezepte-User (nur Rezepte) # Als Rezepte-User (nur Rezepte)
docker exec -it gitea-mysql-1 mysql -urezepte_user -p rezepte_klaus docker exec -it gitea-mysql-1 mysql -urezepte_user -p rezepte
# Backup erstellen # Backup erstellen
docker exec gitea-mysql-1 mysqldump -uroot -p rezepte_klaus > backup.sql docker exec gitea-mysql-1 mysqldump -uroot -p rezepte > backup.sql
``` ```
## 🎯 Fazit ## 🎯 Fazit

View File

@@ -1,4 +1,4 @@
# phpMyAdmin Integration - Rezepte Klaus # phpMyAdmin Integration - Rezepte
## 🗄️ Datenbank-Verwaltung über Web-Interface ## 🗄️ Datenbank-Verwaltung über Web-Interface

View File

@@ -1,4 +1,4 @@
# Portainer Integration mit Traefik - Rezepte Klaus # Portainer Integration mit Traefik - Rezepte
## 🐳 Container-Management über Web-Interface ## 🐳 Container-Management über Web-Interface
@@ -80,7 +80,7 @@ volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro - /var/run/docker.sock:/var/run/docker.sock:ro
``` ```
## 🛠️ Portainer Features für Rezepte-Klaus ## 🛠️ Portainer Features für Rezepte
### Container-Management: ### Container-Management:
-**Stack-Verwaltung**: docker-compose.yml direkt bearbeiten -**Stack-Verwaltung**: docker-compose.yml direkt bearbeiten
@@ -121,7 +121,7 @@ watchtower:
## 🔄 Stack-Management ## 🔄 Stack-Management
### 1. **Rezepte-Klaus als Stack**: ### 1. **Rezepte als Stack**:
```yaml ```yaml
# In Portainer: "Stacks" → "Add Stack" # In Portainer: "Stacks" → "Add Stack"
# Repository: Git-Integration möglich # Repository: Git-Integration möglich

View File

@@ -1,4 +1,4 @@
# Rezepte Klaus - Docker Setup # Rezepte - Docker Setup
Eine dockerisierte Version der Rezepte-Verwaltungsanwendung mit PHP, MySQL und phpMyAdmin. Eine dockerisierte Version der Rezepte-Verwaltungsanwendung mit PHP, MySQL und phpMyAdmin.
@@ -28,7 +28,7 @@ Eine dockerisierte Version der Rezepte-Verwaltungsanwendung mit PHP, MySQL und p
### Für die Anwendung: ### Für die Anwendung:
- Host: mysql - Host: mysql
- Database: rezepte_klaus - Database: rezepte
- User: rezepte_user - User: rezepte_user
- Password: rezepte_pass - Password: rezepte_pass

View File

@@ -9,8 +9,8 @@ Optimaler Workflow für Entwicklung auf Mac mit Testing auf Linux-Server, der de
### **Auf dem Linux-Server (via SSH):** ### **Auf dem Linux-Server (via SSH):**
```bash ```bash
# 1. Repository klonen (falls nicht geschehen) # 1. Repository klonen (falls nicht geschehen)
git clone https://github.com/your-repo/rezepte-klaus.git git clone https://github.com/your-repo/rezepte.git
cd rezepte-klaus cd rezepte
# 2. Development-Umgebung einrichten # 2. Development-Umgebung einrichten
./setup-development.sh ./setup-development.sh
@@ -79,13 +79,13 @@ docker-compose -f docker-compose.development.yml restart frontend
```bash ```bash
# VS Code Extension installieren: "Remote - SSH" # VS Code Extension installieren: "Remote - SSH"
# Direkt auf Server entwickeln # Direkt auf Server entwickeln
code --remote ssh-remote+user@server /path/to/rezepte-klaus code --remote ssh-remote+user@server /path/to/rezepte
``` ```
#### **C) rsync-Sync:** #### **C) rsync-Sync:**
```bash ```bash
# Automatischer Sync von Mac zu Server # Automatischer Sync von Mac zu Server
rsync -avz --exclude 'node_modules' ./ user@server:/path/to/rezepte-klaus/ rsync -avz --exclude 'node_modules' ./ user@server:/path/to/rezepte/
``` ```
### **2. Container-Rebuild-Workflows:** ### **2. Container-Rebuild-Workflows:**

View File

@@ -24,14 +24,14 @@
```bash ```bash
# 1. Create deployment directory # 1. Create deployment directory
mkdir -p /opt/rezepte-klaus mkdir -p /opt/rezepte
cd /opt/rezepte-klaus cd /opt/rezepte
# 2. Copy required files to server # 2. Copy required files to server
scp docker-compose.registry.yml user@server:/opt/rezepte-klaus/ scp docker-compose.registry.yml user@server:/opt/rezepte/
scp .env.production user@server:/opt/rezepte-klaus/ scp .env.production user@server:/opt/rezepte/
scp *.sql user@server:/opt/rezepte-klaus/ scp *.sql user@server:/opt/rezepte/
scp deploy-registry.sh user@server:/opt/rezepte-klaus/ scp deploy-registry.sh user@server:/opt/rezepte/
# 3. Make deployment script executable # 3. Make deployment script executable
chmod +x deploy-registry.sh chmod +x deploy-registry.sh

View File

@@ -38,8 +38,8 @@ DOMAIN=my.domain.com
ACME_EMAIL=admin@my.domain.com ACME_EMAIL=admin@my.domain.com
MYSQL_PASSWORD=super_secure_password_123 MYSQL_PASSWORD=super_secure_password_123
MYSQL_ROOT_PASSWORD=even_more_secure_root_password_456 MYSQL_ROOT_PASSWORD=even_more_secure_root_password_456
BACKEND_IMAGE=ghcr.io/username/rezepte-klaus-backend:latest BACKEND_IMAGE=ghcr.io/username/rezepte-backend:latest
FRONTEND_IMAGE=ghcr.io/username/rezepte-klaus-frontend:latest FRONTEND_IMAGE=ghcr.io/username/rezepte-frontend:latest
``` ```
## 🔧 Server-Deployment ## 🔧 Server-Deployment
@@ -47,7 +47,7 @@ FRONTEND_IMAGE=ghcr.io/username/rezepte-klaus-frontend:latest
### Minimale Dateien auf Server: ### Minimale Dateien auf Server:
```bash ```bash
# Server-Struktur # Server-Struktur
/opt/rezepte-klaus/ /opt/rezepte/
├── docker-compose.traefik.yml ├── docker-compose.traefik.yml
├── .env.production ├── .env.production
├── deploy-traefik.sh ├── deploy-traefik.sh
@@ -60,14 +60,14 @@ FRONTEND_IMAGE=ghcr.io/username/rezepte-klaus-frontend:latest
### Deployment-Schritte: ### Deployment-Schritte:
```bash ```bash
# 1. Dateien auf Server kopieren # 1. Dateien auf Server kopieren
scp docker-compose.traefik.yml user@server:/opt/rezepte-klaus/ scp docker-compose.traefik.yml user@server:/opt/rezepte/
scp .env.production user@server:/opt/rezepte-klaus/ scp .env.production user@server:/opt/rezepte/
scp *.sql user@server:/opt/rezepte-klaus/ scp *.sql user@server:/opt/rezepte/
scp deploy-traefik.sh user@server:/opt/rezepte-klaus/ scp deploy-traefik.sh user@server:/opt/rezepte/
# 2. Auf Server einloggen und deployen # 2. Auf Server einloggen und deployen
ssh user@server ssh user@server
cd /opt/rezepte-klaus cd /opt/rezepte
chmod +x deploy-traefik.sh chmod +x deploy-traefik.sh
./deploy-traefik.sh ./deploy-traefik.sh
``` ```

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S) DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/opt/backups/rezepte-klaus" BACKUP_DIR="/opt/backups/rezepte"
# Create backup directory # Create backup directory
mkdir -p $BACKUP_DIR mkdir -p $BACKUP_DIR
@@ -19,7 +19,7 @@ if docker ps | grep -q rezepte-mysql-prod; then
docker exec rezepte-mysql-prod mysqldump \ docker exec rezepte-mysql-prod mysqldump \
-u rezepte_user \ -u rezepte_user \
-p${MYSQL_PASSWORD:-change_this_password} \ -p${MYSQL_PASSWORD:-change_this_password} \
rezepte_klaus > $BACKUP_DIR/database_$DATE.sql rezepte > $BACKUP_DIR/database_$DATE.sql
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
echo "✅ Database backup completed: database_$DATE.sql" echo "✅ Database backup completed: database_$DATE.sql"

View File

@@ -15,11 +15,11 @@ TAG=${IMAGE_TAG:-"latest"}
# Image names (with optional namespace) # Image names (with optional namespace)
if [ -n "$NAMESPACE" ]; then if [ -n "$NAMESPACE" ]; then
BACKEND_IMAGE="$REGISTRY/$NAMESPACE/rezepte-klaus-backend:$TAG" BACKEND_IMAGE="$REGISTRY/$NAMESPACE/rezepte-backend:$TAG"
FRONTEND_IMAGE="$REGISTRY/$NAMESPACE/rezepte-klaus-frontend:$TAG" FRONTEND_IMAGE="$REGISTRY/$NAMESPACE/rezepte-frontend:$TAG"
else else
BACKEND_IMAGE="$REGISTRY/rezepte-klaus-backend:$TAG" BACKEND_IMAGE="$REGISTRY/rezepte-backend:$TAG"
FRONTEND_IMAGE="$REGISTRY/rezepte-klaus-frontend:$TAG" FRONTEND_IMAGE="$REGISTRY/rezepte-frontend:$TAG"
fi fi
echo "📦 Building images..." echo "📦 Building images..."

View File

@@ -8,7 +8,7 @@ if (session_status() === PHP_SESSION_NONE) {
// Docker environment variables with fallbacks for local development // Docker environment variables with fallbacks for local development
$host_name = $_ENV['DB_HOST'] ?? 'localhost'; $host_name = $_ENV['DB_HOST'] ?? 'localhost';
$database = $_ENV['DB_NAME'] ?? 'rezepte_klaus'; $database = $_ENV['DB_NAME'] ?? 'rezepte';
$user_name = $_ENV['DB_USER'] ?? 'root'; $user_name = $_ENV['DB_USER'] ?? 'root';
$password = $_ENV['DB_PASS'] ?? ''; $password = $_ENV['DB_PASS'] ?? '';

View File

@@ -8,7 +8,7 @@ if (session_status() === PHP_SESSION_NONE) {
// Docker environment variables with fallbacks for local development // Docker environment variables with fallbacks for local development
$host_name = $_ENV['DB_HOST'] ?? 'localhost'; $host_name = $_ENV['DB_HOST'] ?? 'localhost';
$database = $_ENV['DB_NAME'] ?? 'rezepte_klaus'; $database = $_ENV['DB_NAME'] ?? 'rezepte';
$user_name = $_ENV['DB_USER'] ?? 'root'; $user_name = $_ENV['DB_USER'] ?? 'root';
$password = $_ENV['DB_PASS'] ?? ''; $password = $_ENV['DB_PASS'] ?? '';

View File

@@ -6,7 +6,7 @@ if (session_status() === PHP_SESSION_NONE) {
session_start(); session_start();
} }
$host_name = 'localhost'; $host_name = 'localhost';
$database = 'rezepte_klaus'; $database = 'rezepte';
$user_name = 'root'; $user_name = 'root';
$password = ''; $password = '';

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
set -e set -e
echo "🗄️ Setting up Rezepte Klaus with external MySQL (Gitea)" echo "🗄️ Setting up Rezepte with external MySQL (Gitea)"
echo "======================================================" echo "======================================================"
# Check if .env.external-db exists # Check if .env.external-db exists
@@ -63,33 +63,33 @@ else
fi fi
# Create database and user # Create database and user
echo "🏗️ Setting up Rezepte Klaus database..." echo "🏗️ Setting up Rezepte database..."
# SQL commands for database setup # SQL commands for database setup
DATABASE_SETUP_SQL=" DATABASE_SETUP_SQL="
-- Create Rezepte Klaus database -- Create Rezepte database
CREATE DATABASE IF NOT EXISTS rezepte_klaus CREATE DATABASE IF NOT EXISTS rezepte
CHARACTER SET utf8mb4 CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci; COLLATE utf8mb4_unicode_ci;
-- Create dedicated user for Rezepte Klaus -- Create dedicated user for Rezepte
CREATE USER IF NOT EXISTS 'rezepte_user'@'%' IDENTIFIED BY '${MYSQL_REZEPTE_PASSWORD}'; CREATE USER IF NOT EXISTS 'rezepte_user'@'%' IDENTIFIED BY '${MYSQL_REZEPTE_PASSWORD}';
-- Grant permissions -- Grant permissions
GRANT ALL PRIVILEGES ON rezepte_klaus.* TO 'rezepte_user'@'%'; GRANT ALL PRIVILEGES ON rezepte.* TO 'rezepte_user'@'%';
-- Refresh privileges -- Refresh privileges
FLUSH PRIVILEGES; FLUSH PRIVILEGES;
-- Show created database -- Show created database
SHOW DATABASES LIKE 'rezepte_klaus'; SHOW DATABASES LIKE 'rezepte';
" "
# Execute database setup # Execute database setup
echo "$DATABASE_SETUP_SQL" | docker exec -i "$MYSQL_HOST" mysql -u"${MYSQL_ADMIN_USER:-root}" -p"${MYSQL_ADMIN_PASSWORD}" echo "$DATABASE_SETUP_SQL" | docker exec -i "$MYSQL_HOST" mysql -u"${MYSQL_ADMIN_USER:-root}" -p"${MYSQL_ADMIN_PASSWORD}"
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
echo "✅ Database 'rezepte_klaus' and user 'rezepte_user' created successfully" echo "✅ Database 'rezepte' and user 'rezepte_user' created successfully"
else else
echo "❌ Error creating database or user" echo "❌ Error creating database or user"
exit 1 exit 1
@@ -102,7 +102,7 @@ REQUIRED_FILES=("Rezepte.sql" "ingredients.sql" "Zubereitung.sql" "rezepte_bilde
for file in "${REQUIRED_FILES[@]}"; do for file in "${REQUIRED_FILES[@]}"; do
if [ -f "$file" ]; then if [ -f "$file" ]; then
echo " Importing $file..." echo " Importing $file..."
docker exec -i "$MYSQL_HOST" mysql -u"${MYSQL_ADMIN_USER:-root}" -p"${MYSQL_ADMIN_PASSWORD}" rezepte_klaus < "$file" docker exec -i "$MYSQL_HOST" mysql -u"${MYSQL_ADMIN_USER:-root}" -p"${MYSQL_ADMIN_PASSWORD}" rezepte < "$file"
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
echo "$file imported successfully" echo "$file imported successfully"
else else
@@ -124,7 +124,7 @@ echo "📥 Pulling latest images..."
docker compose -f docker compose.traefik-external-db.yml pull docker compose -f docker compose.traefik-external-db.yml pull
# Start services # Start services
echo "🚀 Starting Rezepte Klaus services with external MySQL..." echo "🚀 Starting Rezepte services with external MySQL..."
docker compose -f docker compose.traefik-external-db.yml up -d docker compose -f docker compose.traefik-external-db.yml up -d
# Wait for services to be healthy # Wait for services to be healthy
@@ -145,13 +145,13 @@ if [ "$HEALTHY_SERVICES" -ge 4 ]; then
echo "" echo ""
echo "🗄️ Database Information:" echo "🗄️ Database Information:"
echo " MySQL Host: $MYSQL_HOST (shared with Gitea)" echo " MySQL Host: $MYSQL_HOST (shared with Gitea)"
echo " Rezepte Database: rezepte_klaus" echo " Rezepte Database: rezepte"
echo " Rezepte User: rezepte_user" echo " Rezepte User: rezepte_user"
echo "" echo ""
echo "📊 Service Status:" echo "📊 Service Status:"
docker compose -f docker compose.traefik-external-db.yml ps docker compose -f docker compose.traefik-external-db.yml ps
echo "" echo ""
echo "💡 phpMyAdmin now shows both Gitea and Rezepte Klaus databases!" echo "💡 phpMyAdmin now shows both Gitea and Rezepte databases!"
else else
echo "❌ Deployment failed! Check logs:" echo "❌ Deployment failed! Check logs:"
docker compose -f docker compose.traefik-external-db.yml logs --tail=50 docker compose -f docker compose.traefik-external-db.yml logs --tail=50
@@ -163,4 +163,4 @@ echo "📋 Useful commands:"
echo " View logs: docker compose -f docker compose.traefik-external-db.yml logs -f" echo " View logs: docker compose -f docker compose.traefik-external-db.yml logs -f"
echo " Update: docker compose -f docker compose.traefik-external-db.yml pull && docker compose -f docker compose.traefik-external-db.yml up -d" echo " Update: docker compose -f docker compose.traefik-external-db.yml pull && docker compose -f docker compose.traefik-external-db.yml up -d"
echo " Stop: docker compose -f docker compose.traefik-external-db.yml down" echo " Stop: docker compose -f docker compose.traefik-external-db.yml down"
echo " Database access: docker exec -it $MYSQL_HOST mysql -urezepte_user -p rezepte_klaus" echo " Database access: docker exec -it $MYSQL_HOST mysql -urezepte_user -p rezepte"

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
set -e set -e
echo "🚀 Deploying Rezepte Klaus to production..." echo "🚀 Deploying Rezepte to production..."
# Check if .env.production exists # Check if .env.production exists
if [ ! -f .env.production ]; then if [ ! -f .env.production ]; then

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
set -e set -e
echo "🚀 Deploying Rezepte Klaus from Docker Registry..." echo "🚀 Deploying Rezepte from Docker Registry..."
# Check if .env.production exists # Check if .env.production exists
if [ ! -f .env.production ]; then if [ ! -f .env.production ]; then
@@ -59,8 +59,8 @@ if [ "$HEALTHY_SERVICES" -ge 3 ]; then
docker-compose -f docker-compose.registry.yml ps docker-compose -f docker-compose.registry.yml ps
echo "" echo ""
echo "🏷️ Image Information:" echo "🏷️ Image Information:"
echo "Backend: ${BACKEND_IMAGE:-ghcr.io/your-username/rezepte-klaus-backend:latest}" echo "Backend: ${BACKEND_IMAGE:-ghcr.io/your-username/rezepte-backend:latest}"
echo "Frontend: ${FRONTEND_IMAGE:-ghcr.io/your-username/rezepte-klaus-frontend:latest}" echo "Frontend: ${FRONTEND_IMAGE:-ghcr.io/your-username/rezepte-frontend:latest}"
else else
echo "❌ Deployment failed! Check logs:" echo "❌ Deployment failed! Check logs:"
docker-compose -f docker-compose.registry.yml logs --tail=50 docker-compose -f docker-compose.registry.yml logs --tail=50

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
set -e set -e
echo "🚀 Deploying Rezepte Klaus with Traefik Proxy..." echo "🚀 Deploying Rezepte with Traefik Proxy..."
# Check if .env.production exists # Check if .env.production exists
if [ ! -f .env.production ]; then if [ ! -f .env.production ]; then
@@ -71,8 +71,8 @@ if [ "$HEALTHY_SERVICES" -ge 6 ]; then
docker compose -f docker compose.traefik.yml ps docker compose -f docker compose.traefik.yml ps
echo "" echo ""
echo "🏷️ Image Information:" echo "🏷️ Image Information:"
echo "Backend: ${BACKEND_IMAGE:-ghcr.io/your-username/rezepte-klaus-backend:latest}" echo "Backend: ${BACKEND_IMAGE:-ghcr.io/your-username/rezepte-backend:latest}"
echo "Frontend: ${FRONTEND_IMAGE:-ghcr.io/your-username/rezepte-klaus-frontend:latest}" echo "Frontend: ${FRONTEND_IMAGE:-ghcr.io/your-username/rezepte-frontend:latest}"
echo "" echo ""
echo "🔒 SSL Certificates:" echo "🔒 SSL Certificates:"
echo "Traefik will automatically request Let's Encrypt certificates." echo "Traefik will automatically request Let's Encrypt certificates."

View File

@@ -4,7 +4,7 @@ services:
container_name: rezepte-mysql-dev container_name: rezepte-mysql-dev
restart: unless-stopped restart: unless-stopped
environment: environment:
- MYSQL_DATABASE=rezepte_klaus - MYSQL_DATABASE=rezepte
- MYSQL_USER=rezepte - MYSQL_USER=rezepte
- MYSQL_PASSWORD=${MYSQL_PASSWORD} - MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
@@ -33,7 +33,7 @@ services:
restart: unless-stopped restart: unless-stopped
environment: environment:
- NODE_ENV=development - NODE_ENV=development
- DATABASE_URL=mysql://rezepte:${MYSQL_PASSWORD}@mysql:3306/rezepte_klaus - DATABASE_URL=mysql://rezepte:${MYSQL_PASSWORD}@mysql:3306/rezepte
- CORS_ORIGIN=${CORS_ORIGIN:-*} - CORS_ORIGIN=${CORS_ORIGIN:-*}
- PORT=3001 - PORT=3001
ports: ports:

View File

@@ -5,7 +5,7 @@ services:
container_name: rezepte-mysql container_name: rezepte-mysql
environment: environment:
MYSQL_ROOT_PASSWORD: rootpassword MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: rezepte_klaus MYSQL_DATABASE: rezepte
MYSQL_USER: rezepte_user MYSQL_USER: rezepte_user
MYSQL_PASSWORD: rezepte_pass MYSQL_PASSWORD: rezepte_pass
ports: ports:
@@ -30,7 +30,7 @@ services:
environment: environment:
NODE_ENV: production NODE_ENV: production
PORT: 3001 PORT: 3001
DATABASE_URL: mysql://rezepte_user:rezepte_pass@mysql:3306/rezepte_klaus DATABASE_URL: mysql://rezepte_user:rezepte_pass@mysql:3306/rezepte
JWT_SECRET: your-super-secret-jwt-key-change-in-production JWT_SECRET: your-super-secret-jwt-key-change-in-production
UPLOAD_PATH: /app/uploads UPLOAD_PATH: /app/uploads
MAX_FILE_SIZE: 5242880 MAX_FILE_SIZE: 5242880

View File

@@ -5,7 +5,7 @@ services:
container_name: rezepte-mysql container_name: rezepte-mysql
environment: environment:
MYSQL_ROOT_PASSWORD: rootpassword MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: rezepte_klaus MYSQL_DATABASE: rezepte
MYSQL_USER: rezepte_user MYSQL_USER: rezepte_user
MYSQL_PASSWORD: rezepte_pass MYSQL_PASSWORD: rezepte_pass
ports: ports:
@@ -30,7 +30,7 @@ services:
environment: environment:
NODE_ENV: production NODE_ENV: production
PORT: 3001 PORT: 3001
DATABASE_URL: mysql://rezepte_user:rezepte_pass@mysql:3306/rezepte_klaus DATABASE_URL: mysql://rezepte_user:rezepte_pass@mysql:3306/rezepte
JWT_SECRET: your-super-secret-jwt-key-change-in-production JWT_SECRET: your-super-secret-jwt-key-change-in-production
UPLOAD_PATH: /app/uploads UPLOAD_PATH: /app/uploads
MAX_FILE_SIZE: 5242880 MAX_FILE_SIZE: 5242880
@@ -87,7 +87,7 @@ services:
- rezepte-network - rezepte-network
environment: environment:
DB_HOST: mysql DB_HOST: mysql
DB_NAME: rezepte_klaus DB_NAME: rezepte
DB_USER: rezepte_user DB_USER: rezepte_user
DB_PASS: rezepte_pass DB_PASS: rezepte_pass
profiles: profiles:

View File

@@ -4,7 +4,7 @@ services:
container_name: rezepte-mysql-prod container_name: rezepte-mysql-prod
restart: unless-stopped restart: unless-stopped
environment: environment:
MYSQL_DATABASE: rezepte_klaus MYSQL_DATABASE: rezepte
MYSQL_USER: rezepte_user MYSQL_USER: rezepte_user
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-change_this_password} MYSQL_PASSWORD: ${MYSQL_PASSWORD:-change_this_password}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-change_this_root_password} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-change_this_root_password}
@@ -32,7 +32,7 @@ services:
restart: unless-stopped restart: unless-stopped
environment: environment:
- NODE_ENV=production - NODE_ENV=production
- DATABASE_URL=mysql://rezepte_user:${MYSQL_PASSWORD:-change_this_password}@mysql:3306/rezepte_klaus - DATABASE_URL=mysql://rezepte_user:${MYSQL_PASSWORD:-change_this_password}@mysql:3306/rezepte
- JWT_SECRET=${JWT_SECRET:-change_this_jwt_secret_min_32_characters} - JWT_SECRET=${JWT_SECRET:-change_this_jwt_secret_min_32_characters}
- CORS_ORIGIN=${CORS_ORIGIN:-http://localhost} - CORS_ORIGIN=${CORS_ORIGIN:-http://localhost}
- PORT=3001 - PORT=3001

View File

@@ -4,7 +4,7 @@ services:
container_name: rezepte-mysql-prod container_name: rezepte-mysql-prod
restart: unless-stopped restart: unless-stopped
environment: environment:
MYSQL_DATABASE: rezepte_klaus MYSQL_DATABASE: rezepte
MYSQL_USER: rezepte_user MYSQL_USER: rezepte_user
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-change_this_password} MYSQL_PASSWORD: ${MYSQL_PASSWORD:-change_this_password}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-change_this_root_password} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-change_this_root_password}
@@ -24,12 +24,12 @@ services:
backend: backend:
# Use pre-built image from registry instead of building # Use pre-built image from registry instead of building
image: ${BACKEND_IMAGE:-ghcr.io/your-username/rezepte-klaus-backend:latest} image: ${BACKEND_IMAGE:-ghcr.io/your-username/rezepte-backend:latest}
container_name: rezepte-backend-prod container_name: rezepte-backend-prod
restart: unless-stopped restart: unless-stopped
environment: environment:
- NODE_ENV=production - NODE_ENV=production
- DATABASE_URL=mysql://rezepte_user:${MYSQL_PASSWORD:-change_this_password}@mysql:3306/rezepte_klaus - DATABASE_URL=mysql://rezepte_user:${MYSQL_PASSWORD:-change_this_password}@mysql:3306/rezepte
- JWT_SECRET=${JWT_SECRET:-change_this_jwt_secret_min_32_characters} - JWT_SECRET=${JWT_SECRET:-change_this_jwt_secret_min_32_characters}
- CORS_ORIGIN=${CORS_ORIGIN:-http://localhost} - CORS_ORIGIN=${CORS_ORIGIN:-http://localhost}
- PORT=3001 - PORT=3001
@@ -52,7 +52,7 @@ services:
frontend: frontend:
# Use pre-built image from registry instead of building # Use pre-built image from registry instead of building
image: ${FRONTEND_IMAGE:-ghcr.io/your-username/rezepte-klaus-frontend:latest} image: ${FRONTEND_IMAGE:-ghcr.io/your-username/rezepte-frontend:latest}
container_name: rezepte-frontend-prod container_name: rezepte-frontend-prod
restart: unless-stopped restart: unless-stopped
ports: ports:

View File

@@ -47,12 +47,12 @@ services:
backend: backend:
# Use pre-built image from registry instead of building # Use pre-built image from registry instead of building
image: ${BACKEND_IMAGE:-ghcr.io/your-username/rezepte-klaus-backend:latest} image: ${BACKEND_IMAGE:-ghcr.io/your-username/rezepte-backend:latest}
container_name: rezepte-backend-prod container_name: rezepte-backend-prod
restart: unless-stopped restart: unless-stopped
environment: environment:
- NODE_ENV=production - NODE_ENV=production
- DATABASE_URL=mysql://rezepte_user:${MYSQL_REZEPTE_PASSWORD}@${MYSQL_HOST:-mysql}:${MYSQL_PORT:-3306}/rezepte_klaus - DATABASE_URL=mysql://rezepte_user:${MYSQL_REZEPTE_PASSWORD}@${MYSQL_HOST:-mysql}:${MYSQL_PORT:-3306}/rezepte
- CORS_ORIGIN=https://rezepte.${DOMAIN} - CORS_ORIGIN=https://rezepte.${DOMAIN}
- PORT=3001 - PORT=3001
volumes: volumes:
@@ -83,7 +83,7 @@ services:
frontend: frontend:
# Use pre-built image from registry instead of building # Use pre-built image from registry instead of building
image: ${FRONTEND_IMAGE:-ghcr.io/your-username/rezepte-klaus-frontend:latest} image: ${FRONTEND_IMAGE:-ghcr.io/your-username/rezepte-frontend:latest}
container_name: rezepte-frontend-prod container_name: rezepte-frontend-prod
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:

View File

@@ -49,7 +49,7 @@ services:
container_name: rezepte-mysql-prod container_name: rezepte-mysql-prod
restart: unless-stopped restart: unless-stopped
environment: environment:
MYSQL_DATABASE: rezepte_klaus MYSQL_DATABASE: rezepte
MYSQL_USER: rezepte_user MYSQL_USER: rezepte_user
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-change_this_password} MYSQL_PASSWORD: ${MYSQL_PASSWORD:-change_this_password}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-change_this_root_password} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-change_this_root_password}
@@ -69,12 +69,12 @@ services:
backend: backend:
# Use pre-built image from registry instead of building # Use pre-built image from registry instead of building
image: ${BACKEND_IMAGE:-ghcr.io/your-username/rezepte-klaus-backend:latest} image: ${BACKEND_IMAGE:-ghcr.io/your-username/rezepte-backend:latest}
container_name: rezepte-backend-prod container_name: rezepte-backend-prod
restart: unless-stopped restart: unless-stopped
environment: environment:
- NODE_ENV=production - NODE_ENV=production
- DATABASE_URL=mysql://rezepte_user:${MYSQL_PASSWORD:-change_this_password}@mysql:3306/rezepte_klaus - DATABASE_URL=mysql://rezepte_user:${MYSQL_PASSWORD:-change_this_password}@mysql:3306/rezepte
- CORS_ORIGIN=https://rezepte.${DOMAIN} - CORS_ORIGIN=https://rezepte.${DOMAIN}
- PORT=3001 - PORT=3001
volumes: volumes:
@@ -107,7 +107,7 @@ services:
frontend: frontend:
# Use pre-built image from registry instead of building # Use pre-built image from registry instead of building
image: ${FRONTEND_IMAGE:-ghcr.io/your-username/rezepte-klaus-frontend:latest} image: ${FRONTEND_IMAGE:-ghcr.io/your-username/rezepte-frontend:latest}
container_name: rezepte-frontend-prod container_name: rezepte-frontend-prod
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:

View File

@@ -6,7 +6,7 @@ services:
restart: always restart: always
environment: environment:
MYSQL_ROOT_PASSWORD: rezepte123 MYSQL_ROOT_PASSWORD: rezepte123
MYSQL_DATABASE: rezepte_klaus MYSQL_DATABASE: rezepte
MYSQL_USER: rezepte_user MYSQL_USER: rezepte_user
MYSQL_PASSWORD: rezepte_pass MYSQL_PASSWORD: rezepte_pass
ports: ports:
@@ -32,7 +32,7 @@ services:
- rezepte_network - rezepte_network
environment: environment:
DB_HOST: mysql DB_HOST: mysql
DB_NAME: rezepte_klaus DB_NAME: rezepte
DB_USER: rezepte_user DB_USER: rezepte_user
DB_PASS: rezepte_pass DB_PASS: rezepte_pass

View File

@@ -6,7 +6,7 @@ YELLOW='\033[1;33m'
RED='\033[0;31m' RED='\033[0;31m'
NC='\033[0m' # No Color NC='\033[0m' # No Color
echo -e "${GREEN}Rezepte Klaus - Docker Build & Deploy Script${NC}" echo -e "${GREEN}Rezepte - Docker Build & Deploy Script${NC}"
echo "==================================================" echo "=================================================="
# Überprüfe ob Docker läuft # Überprüfe ob Docker läuft

View File

@@ -6,7 +6,7 @@ YELLOW='\033[1;33m'
RED='\033[0;31m' RED='\033[0;31m'
NC='\033[0m' # No Color NC='\033[0m' # No Color
echo -e "${GREEN}Rezepte Klaus - Docker Stop Script${NC}" echo -e "${GREEN}Rezepte - Docker Stop Script${NC}"
echo "===========================================" echo "==========================================="
# Stoppe alle Services # Stoppe alle Services

View File

@@ -1,6 +1,6 @@
# Nginx Configuration for Rezepte Klaus # Nginx Configuration for Rezepte
# Place this in /etc/nginx/sites-available/rezepte-klaus # Place this in /etc/nginx/sites-available/rezepte
# Then: sudo ln -s /etc/nginx/sites-available/rezepte-klaus /etc/nginx/sites-enabled/ # Then: sudo ln -s /etc/nginx/sites-available/rezepte /etc/nginx/sites-enabled/
# Redirect HTTP to HTTPS # Redirect HTTP to HTTPS
server { server {
@@ -132,6 +132,6 @@ server {
} }
# Logging # Logging
access_log /var/log/nginx/rezepte-klaus.access.log; access_log /var/log/nginx/rezepte.access.log;
error_log /var/log/nginx/rezepte-klaus.error.log; error_log /var/log/nginx/rezepte.error.log;
} }

View File

@@ -1,5 +1,5 @@
# Database # Database
DATABASE_URL="mysql://rezepte_user:rezepte_pass@localhost:3307/rezepte_klaus" DATABASE_URL="mysql://rezepte_user:rezepte_pass@localhost:3307/rezepte"
# Server # Server
PORT=3001 PORT=3001

View File

@@ -3,7 +3,7 @@ NODE_ENV=development
PORT=3001 PORT=3001
# Database # Database
DATABASE_URL="mysql://rezepte_user:rezepte_pass@localhost:3307/rezepte_klaus" DATABASE_URL="mysql://rezepte_user:rezepte_pass@localhost:3307/rezepte"
# JWT Secret (change in production!) # JWT Secret (change in production!)
JWT_SECRET=your-super-secret-jwt-key-change-in-production JWT_SECRET=your-super-secret-jwt-key-change-in-production

View File

@@ -10,7 +10,7 @@ exports.config = {
port: process.env.PORT || 3001, port: process.env.PORT || 3001,
nodeEnv: process.env.NODE_ENV || 'development', nodeEnv: process.env.NODE_ENV || 'development',
database: { database: {
url: process.env.DATABASE_URL || 'mysql://rezepte_user:rezepte_pass@localhost:3307/rezepte_klaus', url: process.env.DATABASE_URL || 'mysql://rezepte_user:rezepte_pass@localhost:3307/rezepte',
}, },
jwt: { jwt: {
secret: process.env.JWT_SECRET || 'your-super-secret-jwt-key', secret: process.env.JWT_SECRET || 'your-super-secret-jwt-key',

View File

@@ -5,7 +5,7 @@ const router = (0, express_1.Router)();
router.get('/', (req, res) => { router.get('/', (req, res) => {
res.json({ res.json({
success: true, success: true,
message: 'Rezepte Klaus API is running!', message: 'Rezepte API is running!',
timestamp: new Date().toISOString(), timestamp: new Date().toISOString(),
environment: process.env.NODE_ENV, environment: process.env.NODE_ENV,
}); });

View File

@@ -1,7 +1,7 @@
{ {
"name": "rezepte-backend", "name": "rezepte-backend",
"version": "1.0.0", "version": "1.0.0",
"description": "Rezepte Klaus - Node.js Backend", "description": "Rezepte - Node.js Backend",
"main": "dist/app.js", "main": "dist/app.js",
"scripts": { "scripts": {
"dev": "tsx watch src/app.ts", "dev": "tsx watch src/app.ts",
@@ -53,6 +53,6 @@
"typescript", "typescript",
"express" "express"
], ],
"author": "Klaus", "author": "Recipe Admin",
"license": "MIT" "license": "MIT"
} }

View File

@@ -7,7 +7,7 @@ export const config = {
nodeEnv: process.env.NODE_ENV || 'development', nodeEnv: process.env.NODE_ENV || 'development',
database: { database: {
url: process.env.DATABASE_URL || 'mysql://rezepte_user:rezepte_pass@localhost:3307/rezepte_klaus', url: process.env.DATABASE_URL || 'mysql://rezepte_user:rezepte_pass@localhost:3307/rezepte',
}, },
jwt: { jwt: {

View File

@@ -6,7 +6,7 @@ const router = Router();
router.get('/', (req: Request, res: Response) => { router.get('/', (req: Request, res: Response) => {
res.json({ res.json({
success: true, success: true,
message: 'Rezepte Klaus API is running!', message: 'Rezepte API is running!',
timestamp: new Date().toISOString(), timestamp: new Date().toISOString(),
environment: process.env.NODE_ENV, environment: process.env.NODE_ENV,
}); });

View File

@@ -8,7 +8,7 @@ const Header: React.FC = () => {
<div className="container"> <div className="container">
<div className="nav-brand"> <div className="nav-brand">
<Link to="/" className="brand-link"> <Link to="/" className="brand-link">
<h1>🍳 Rezepte Klaus</h1> <h1>🍳 Rezepte</h1>
</Link> </Link>
</div> </div>
<nav className="nav-menu"> <nav className="nav-menu">

View File

@@ -56,8 +56,8 @@ echo "MYSQL_ROOT_PASSWORD=super_secure_root_password"
echo "DOCKER_REGISTRY=docker.citysensor.de" echo "DOCKER_REGISTRY=docker.citysensor.de"
echo "DOCKER_USERNAME=your_username" echo "DOCKER_USERNAME=your_username"
echo "DOCKER_PASSWORD=your_password" echo "DOCKER_PASSWORD=your_password"
echo "BACKEND_IMAGE=docker.citysensor.de/rezepte-klaus-backend:latest" echo "BACKEND_IMAGE=docker.citysensor.de/rezepte-backend:latest"
echo "FRONTEND_IMAGE=docker.citysensor.de/rezepte-klaus-frontend:latest" echo "FRONTEND_IMAGE=docker.citysensor.de/rezepte-frontend:latest"
echo "" echo ""
echo "✅ After setup, your app will be available at:" echo "✅ After setup, your app will be available at:"

View File

@@ -7,7 +7,7 @@ RED='\033[0;31m'
BLUE='\033[0;34m' BLUE='\033[0;34m'
NC='\033[0m' # No Color NC='\033[0m' # No Color
echo -e "${GREEN}Rezepte Klaus - Development Setup${NC}" echo -e "${GREEN}Rezepte - Development Setup${NC}"
echo "================================================" echo "================================================"
# Node.js Version prüfen # Node.js Version prüfen

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
set -e set -e
echo "🐧 Setting up Rezepte Klaus for Remote Development on Linux" echo "🐧 Setting up Rezepte for Remote Development on Linux"
echo "==========================================================" echo "=========================================================="
# Check if we're on a Linux system # Check if we're on a Linux system
@@ -90,7 +90,7 @@ services:
container_name: rezepte-mysql-dev container_name: rezepte-mysql-dev
restart: unless-stopped restart: unless-stopped
environment: environment:
- MYSQL_DATABASE=rezepte_klaus - MYSQL_DATABASE=rezepte
- MYSQL_USER=rezepte - MYSQL_USER=rezepte
- MYSQL_PASSWORD=${MYSQL_PASSWORD} - MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
@@ -119,7 +119,7 @@ services:
restart: unless-stopped restart: unless-stopped
environment: environment:
- NODE_ENV=development - NODE_ENV=development
- DATABASE_URL=mysql://rezepte:${MYSQL_PASSWORD}@mysql:3306/rezepte_klaus - DATABASE_URL=mysql://rezepte:${MYSQL_PASSWORD}@mysql:3306/rezepte
- CORS_ORIGIN=${CORS_ORIGIN:-*} - CORS_ORIGIN=${CORS_ORIGIN:-*}
- PORT=3001 - PORT=3001
ports: ports:
@@ -198,7 +198,7 @@ cat > start-development.sh << 'EOF'
#!/bin/bash #!/bin/bash
set -e set -e
echo "🚀 Starting Rezepte Klaus Development Environment on Linux" echo "🚀 Starting Rezepte Development Environment on Linux"
echo "=========================================================" echo "========================================================="
# Load environment variables # Load environment variables

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
set -e set -e
echo "🚀 Starting Rezepte Klaus Development Environment on Linux" echo "🚀 Starting Rezepte Development Environment on Linux"
echo "=========================================================" echo "========================================================="
# Load environment variables # Load environment variables

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
set -e set -e
echo "🌐 Starting Rezepte Klaus for Local Network Access" echo "🌐 Starting Rezepte for Local Network Access"
echo "==================================================" echo "=================================================="
# Function to detect host IP # Function to detect host IP