diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..02ab011 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,14 @@ +FROM python:3.12-slim + +WORKDIR /app + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +RUN mkdir -p uploads + +EXPOSE 8000 + +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/backend/app/main.py b/backend/app/main.py index d6fd1cf..c3c5d4e 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -34,7 +34,7 @@ app = FastAPI(title=settings.app_name) # CORS middleware app.add_middleware( CORSMiddleware, - allow_origins=["http://localhost:5173"], # Frontend dev server + allow_origins=[settings.frontend_url, "http://localhost:5173"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..a80c089 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,42 @@ +version: "3.8" + +services: + backend: + build: ./backend + restart: unless-stopped + environment: + - SECRET_KEY=${SECRET_KEY:-change-me-in-production} + - DATABASE_URL=sqlite:////data/space_booking.db + - FRONTEND_URL=${FRONTEND_URL:-http://localhost} + - SMTP_HOST=${SMTP_HOST:-localhost} + - SMTP_PORT=${SMTP_PORT:-1025} + - SMTP_ENABLED=${SMTP_ENABLED:-false} + volumes: + - backend_data:/data + - uploads_data:/app/uploads + networks: + - internal + + frontend: + build: ./frontend + restart: unless-stopped + networks: + - internal + - dokploy-network + depends_on: + - backend + labels: + - "traefik.enable=true" + - "traefik.http.routers.space-booking.rule=Host(`${DOMAIN:-space-booking.roa.romfast.ro}`)" + - "traefik.http.routers.space-booking.tls=true" + - "traefik.http.services.space-booking.loadbalancer.server.port=80" + +volumes: + backend_data: + uploads_data: + +networks: + internal: + driver: bridge + dokploy-network: + external: true diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..fe14ef4 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,13 @@ +FROM node:20-alpine AS builder + +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +FROM nginx:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf + +EXPOSE 80 diff --git a/frontend/nginx.conf b/frontend/nginx.conf new file mode 100644 index 0000000..49e8974 --- /dev/null +++ b/frontend/nginx.conf @@ -0,0 +1,21 @@ +server { + listen 80; + server_name _; + + root /usr/share/nginx/html; + index index.html; + + # Proxy API requests to backend service + location /api { + proxy_pass http://backend:8000; + 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; + } + + # SPA routing - all other routes serve index.html + location / { + try_files $uri $uri/ /index.html; + } +}