From 3a55b95598e60050f09743d897270d5bcd710b90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reinhard=20X=2E=20F=C3=BCrst?= Date: Mon, 22 Sep 2025 18:12:22 +0000 Subject: [PATCH] CORS und uploads-Problem behoben --- .env | 2 +- .env.development | 44 +++++---- docker-compose.development.yml | 104 ++++++++++++++++++++ nodejs-version/backend/.env | 3 + nodejs-version/backend/src/routes/images.ts | 10 +- start-development.sh | 58 +++++++++++ upload | 1 + uploads/upload | 1 + 8 files changed, 198 insertions(+), 25 deletions(-) create mode 100644 docker-compose.development.yml create mode 100755 start-development.sh create mode 120000 upload create mode 120000 uploads/upload diff --git a/.env b/.env index fab8a02..8239c71 100644 --- a/.env +++ b/.env @@ -38,7 +38,7 @@ LEGACY_MYSQL_PASSWORD=recipes_password_2024 # Security JWT_SECRET=your_jwt_secret_here_change_in_production -CORS_ORIGIN=http://localhost:3000 +CORS_ORIGIN=* # Volume Paths MYSQL_DATA_PATH=./docker-data/mysql diff --git a/.env.development b/.env.development index a01c654..c8fcdc9 100644 --- a/.env.development +++ b/.env.development @@ -1,27 +1,29 @@ -# Development Environment Configuration -NODE_ENV=development +# Development Environment - Linux Server +# Generated on Mon Sep 22 05:45:27 PM UTC 2025 -# Database Configuration -DB_HOST=localhost -DB_PORT=3306 -DB_USER=root -DB_PASSWORD= -DB_NAME=rezepte_klaus +# Server Configuration +HOST_IP=192.168.178.94 +DEVELOPMENT_MODE=true -# Database URL fΓΌr Prisma -DATABASE_URL=mysql://root:@localhost:3306/rezepte_klaus +# Database Configuration (local development DB) +MYSQL_PASSWORD=dev_password_123 +MYSQL_ROOT_PASSWORD=dev_root_password_123 -# Backend Configuration -BACKEND_PORT=3001 +# CORS Configuration for remote access +CORS_ORIGIN=* -# Upload Configuration -UPLOAD_DIR=./uploads -MAX_FILE_SIZE=10485760 -ALLOWED_EXTENSIONS=jpg,jpeg,png,webp +# Development URLs: +# - Frontend: http://192.168.178.94:3000 +# - Backend API: http://192.168.178.94:3001/api +# - phpMyAdmin: http://192.168.178.94:8080 +# - MySQL: 192.168.178.94:3307 -# Frontend Configuration (Vite Dev Server) -VITE_API_URL=http://localhost:3001 +# Registry Configuration (for image pulls) +DOCKER_REGISTRY=docker.citysensor.de +# DOCKER_USERNAME=your_username +# DOCKER_PASSWORD=your_password -# Security -JWT_SECRET=dev_jwt_secret_change_in_production -CORS_ORIGIN=http://localhost:5173 \ No newline at end of file +# 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 diff --git a/docker-compose.development.yml b/docker-compose.development.yml new file mode 100644 index 0000000..ae3e130 --- /dev/null +++ b/docker-compose.development.yml @@ -0,0 +1,104 @@ +services: + mysql: + image: mysql:8.0 + container_name: rezepte-mysql-dev + restart: unless-stopped + environment: + - MYSQL_DATABASE=rezepte_klaus + - MYSQL_USER=rezepte + - MYSQL_PASSWORD=${MYSQL_PASSWORD} + - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} + ports: + - "0.0.0.0:3307:3306" + volumes: + - mysql_dev_data:/var/lib/mysql + # Initialize with data + - ./Rezepte.sql:/docker-entrypoint-initdb.d/01-Rezepte.sql + - ./ingredients.sql:/docker-entrypoint-initdb.d/02-ingredients.sql + - ./Zubereitung.sql:/docker-entrypoint-initdb.d/03-Zubereitung.sql + - ./rezepte_bilder.sql:/docker-entrypoint-initdb.d/04-rezepte_bilder.sql + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"] + interval: 30s + timeout: 10s + retries: 5 + networks: + - rezepte-network + + backend: + build: + context: ./nodejs-version/backend + dockerfile: Dockerfile + container_name: rezepte-backend-dev + restart: unless-stopped + environment: + - NODE_ENV=development + - DATABASE_URL=mysql://rezepte:${MYSQL_PASSWORD}@mysql:3306/rezepte_klaus + - CORS_ORIGIN=${CORS_ORIGIN:-*} + - PORT=3001 + ports: + - "0.0.0.0:3001:3001" + volumes: + - uploads_dev_data:/app/uploads + # Mount existing uploads from host for development + - ./upload:/app/uploads:ro + # Development: Mount source code for hot reload + - ./nodejs-version/backend/src:/app/src:ro + - ./nodejs-version/backend/prisma:/app/prisma:ro + depends_on: + mysql: + condition: service_healthy + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:3001/api/health"] + interval: 30s + timeout: 10s + retries: 3 + networks: + - rezepte-network + + frontend: + build: + context: ./nodejs-version/frontend + dockerfile: Dockerfile + container_name: rezepte-frontend-dev + restart: unless-stopped + ports: + - "0.0.0.0:3000:80" + depends_on: + - backend + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost/"] + interval: 30s + timeout: 10s + retries: 3 + networks: + - rezepte-network + + phpmyadmin: + image: phpmyadmin/phpmyadmin:latest + container_name: rezepte-phpmyadmin-dev + restart: unless-stopped + environment: + - PMA_HOST=mysql + - PMA_PORT=3306 + - PMA_USER=root + - PMA_PASSWORD=${MYSQL_ROOT_PASSWORD} + - UPLOAD_LIMIT=2G + - MEMORY_LIMIT=2G + ports: + - "0.0.0.0:8080:80" + depends_on: + mysql: + condition: service_healthy + networks: + - rezepte-network + +volumes: + mysql_dev_data: + driver: local + uploads_dev_data: + driver: local + +networks: + rezepte-network: + driver: bridge diff --git a/nodejs-version/backend/.env b/nodejs-version/backend/.env index b5dc730..7fc39fb 100644 --- a/nodejs-version/backend/.env +++ b/nodejs-version/backend/.env @@ -5,5 +5,8 @@ DATABASE_URL="mysql://rezepte_user:rezepte_pass@localhost:3307/rezepte_klaus" PORT=3001 NODE_ENV=development +# CORS Configuration +CORS_ORIGIN=* + # Prisma # DATABASE_URL="file:./dev.db" \ No newline at end of file diff --git a/nodejs-version/backend/src/routes/images.ts b/nodejs-version/backend/src/routes/images.ts index 9fa9378..39fa077 100644 --- a/nodejs-version/backend/src/routes/images.ts +++ b/nodejs-version/backend/src/routes/images.ts @@ -10,9 +10,13 @@ const prisma = new PrismaClient(); // Utility function to get correct uploads directory path const getUploadsDir = (subPath?: string): string => { - const baseDir = process.env.NODE_ENV === 'production' - ? path.join(process.cwd(), 'uploads') - : path.join(process.cwd(), '../../uploads'); + // In Docker or when uploads directory exists in current directory, use local uploads + const localUploadsDir = path.join(process.cwd(), 'uploads'); + const legacyUploadsDir = path.join(process.cwd(), '../../uploads'); + + const baseDir = fs.existsSync(localUploadsDir) + ? localUploadsDir + : legacyUploadsDir; return subPath ? path.join(baseDir, subPath) : baseDir; }; diff --git a/start-development.sh b/start-development.sh new file mode 100755 index 0000000..8a15154 --- /dev/null +++ b/start-development.sh @@ -0,0 +1,58 @@ +#!/bin/bash +set -e + +echo "πŸš€ Starting Rezepte Klaus Development Environment on Linux" +echo "=========================================================" + +# Load environment variables +if [ -f .env.development ]; then + export $(cat .env.development | grep -v '^#' | xargs) +else + echo "❌ Error: .env.development file not found!" + echo "Please run setup-development.sh first." + exit 1 +fi + +echo "πŸ” Server IP: $HOST_IP" + +# Stop any existing containers +echo "πŸ›‘ Stopping existing containers..." +docker compose -f docker-compose.development.yml down + +# Build and start services +echo "πŸ—οΈ Building and starting services..." +docker compose -f docker-compose.development.yml up -d --build + +# Wait for services +echo "⏳ Waiting for services to start..." +sleep 30 + +# Check service health +echo "πŸ” Checking service health..." +HEALTHY_SERVICES=$(docker compose -f docker-compose.development.yml ps --filter "status=running" | grep -c "Up" || true) + +if [ "$HEALTHY_SERVICES" -ge 4 ]; then + echo "βœ… Development environment started successfully!" + echo "" + echo "🌐 Access URLs:" + echo " Frontend: http://$HOST_IP:3000" + echo " Backend API: http://$HOST_IP:3001/api" + echo " phpMyAdmin: http://$HOST_IP:8080" + echo "" + echo "πŸ”’ SSH Tunnel (for secure access from Mac):" + echo " ssh -L 3000:localhost:3000 -L 3001:localhost:3001 -L 8080:localhost:8080 user@$HOST_IP" + echo " Then access: http://localhost:3000" + echo "" + echo "πŸ“Š Service Status:" + docker compose -f docker-compose.development.yml ps +else + echo "❌ Some services failed to start. Check logs:" + docker compose -f docker-compose.development.yml logs --tail=20 +fi + +echo "" +echo "πŸ“‹ Development Commands:" +echo " View logs: docker compose -f docker-compose.development.yml logs -f" +echo " Rebuild frontend: docker compose -f docker-compose.development.yml build frontend && docker compose -f docker-compose.development.yml restart frontend" +echo " Rebuild backend: docker compose -f docker-compose.development.yml build backend && docker compose -f docker-compose.development.yml restart backend" +echo " Stop: docker compose -f docker-compose.development.yml down" diff --git a/upload b/upload new file mode 120000 index 0000000..95a48fb --- /dev/null +++ b/upload @@ -0,0 +1 @@ +uploads \ No newline at end of file diff --git a/uploads/upload b/uploads/upload new file mode 120000 index 0000000..53c3962 --- /dev/null +++ b/uploads/upload @@ -0,0 +1 @@ +upload \ No newline at end of file