diff --git a/.env.production.example b/.env.production.example new file mode 100644 index 0000000..d055bd8 --- /dev/null +++ b/.env.production.example @@ -0,0 +1,22 @@ +# Production környezeti változók — másold .env.production néven a prod szerveren! +# Másold le és töltsd ki a valódi értékekkel. SOHA ne commitold. + +# MongoDB (production saját konténere a docker-compose.prod.yml-ben) +MONGODB_URI=mongodb://admin:password123@mongodb:27017/mozdit?authSource=admin +MONGODB_DB=mozdit +MONGO_ROOT_USER=admin +MONGO_ROOT_PASSWORD=changeme + +# Publikus site URL (beég build időben a Dockerfile-ba) +NEXT_PUBLIC_SITE_URL=https://mozdit.hu + +# Céges adatok +NEXT_PUBLIC_COMPANY_NAME=mozdIT Bt. +NEXT_PUBLIC_CONTACT_EMAIL=info@mozdit.hu +NEXT_PUBLIC_WEBMAIL_URL=https://webmail.mozdit.hu + +# Logging — Loki (ha van) +LOKI_HOST=http://loki:3100 + +# Production app port a hoston (belső, nginx-en át) +APP_PORT=8080 diff --git a/.env.staging.example b/.env.staging.example new file mode 100644 index 0000000..a9bb23c --- /dev/null +++ b/.env.staging.example @@ -0,0 +1,22 @@ +# Staging környezeti változók — másold .env.staging néven a szerveren! +# Másold le és töltsd ki a valódi értékekkel. SOHA ne commitold. + +# MongoDB (staging saját konténere a docker-compose.staging.yml-ben) +MONGODB_URI=mongodb://admin:password123@mongodb:27017/mozdit?authSource=admin +MONGODB_DB=mozdit +MONGO_ROOT_USER=admin +MONGO_ROOT_PASSWORD=changeme + +# Publikus site URL (beég build időben a Dockerfile-ba) +NEXT_PUBLIC_SITE_URL=https://stage.mozdit.hu + +# Céges adatok +NEXT_PUBLIC_COMPANY_NAME=mozdIT Bt. +NEXT_PUBLIC_CONTACT_EMAIL=info@mozdit.hu +NEXT_PUBLIC_WEBMAIL_URL=https://webmail.mozdit.hu + +# Logging — Loki (ha van) +LOKI_HOST=http://loki:3100 + +# Staging app port a hoston (belső, nginx-en át) +APP_PORT=8081 diff --git a/deploy.sh b/deploy.sh index 73a2859..f954445 100755 --- a/deploy.sh +++ b/deploy.sh @@ -2,6 +2,7 @@ # mozdIT Deploy Script — natív docker compose, Dokploy nélkül # Használat: ./deploy.sh [staging|production] # A szerveren fut (git pull + rebuild + indítás). +# Compose fájl és port env-enként különbözik. set -euo pipefail @@ -13,7 +14,15 @@ if [ "$ENV" != "staging" ] && [ "$ENV" != "production" ]; then exit 1 fi -echo "🚀 Deploy indítása: [$ENV] környezet" +# WHY: staging és production külön compose fájlt és portot használ, hogy +# ugyanazon a szerveren ne ütközzenek (prod 8080, staging 8081). +COMPOSE_FILE="docker-compose.${ENV}.yml" +DEFAULT_PORT=8080 +if [ "$ENV" = "staging" ]; then + DEFAULT_PORT=8081 +fi + +echo "🚀 Deploy indítása: [$ENV] környezet (${COMPOSE_FILE})" # 1. Kód frissítése echo "📦 Kód frissítése a main ágról..." @@ -23,18 +32,18 @@ git pull origin main ENV_FILE=".env.${ENV}" if [ ! -f "$ENV_FILE" ]; then echo "❌ Hiba: $ENV_FILE fájl nem található." - echo " Másold le a .env.example fájlt $ENV_FILE néven, és töltsd ki." + echo " Másold le a .env.staging.example / .env.production.example fájlt $ENV_FILE néven, és töltsd ki." exit 1 fi echo "🔑 Környezeti változók betöltése ($ENV_FILE)..." # 3. Docker konténerek újraépítése és indítása echo "🐳 Build és indítás..." -docker compose --env-file "$ENV_FILE" -f docker-compose.prod.yml up --build -d +docker compose --env-file "$ENV_FILE" -f "$COMPOSE_FILE" up --build -d # 4. Healthcheck echo "⏳ Healthcheck (max 60s)..." -HEALTH_URL="http://localhost:${APP_PORT:-8080}/api/health" +HEALTH_URL="http://localhost:${APP_PORT:-$DEFAULT_PORT}/api/health" for i in $(seq 1 30); do if curl -sf "$HEALTH_URL" > /dev/null 2>&1; then echo "✅ Healthcheck OK: $HEALTH_URL" @@ -45,5 +54,5 @@ for i in $(seq 1 30); do done echo "❌ Healthcheck sikertelen: $HEALTH_URL" -docker compose -f docker-compose.prod.yml logs app --tail 50 +docker compose -f "$COMPOSE_FILE" logs app --tail 50 exit 1 diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index c83e25f..4c846de 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: # Next.js Application (Production Mode) app: @@ -7,6 +5,8 @@ services: context: ./proto dockerfile: Dockerfile target: runner # Use runner stage for production (smaller size, no dev dependencies) + args: + - NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL:-https://mozdit.hu} container_name: mozdit-app-prod ports: - "8080:3000" # Host port 8080 elkerüli a lokális npm dev (3000) összeakadást diff --git a/docker-compose.staging.yml b/docker-compose.staging.yml new file mode 100644 index 0000000..c73396e --- /dev/null +++ b/docker-compose.staging.yml @@ -0,0 +1,54 @@ +services: + # Next.js Application (Staging Mode) + app: + build: + context: ./proto + dockerfile: Dockerfile + target: runner + args: + - NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL:-https://stage.mozdit.hu} + container_name: mozdit-app-staging + ports: + - "127.0.0.1:8081:3000" # Belső port — csak nginx-en keresztül elérhető + environment: + - NODE_ENV=production + - MONGODB_URI=${MONGODB_URI:-mongodb://mongodb:27017/mozdit} + - MONGODB_DB=${MONGODB_DB:-mozdit} + - NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL:-https://stage.mozdit.hu} + - NEXT_PUBLIC_COMPANY_NAME=${NEXT_PUBLIC_COMPANY_NAME:-mozdIT Bt.} + - NEXT_PUBLIC_CONTACT_EMAIL=${NEXT_PUBLIC_CONTACT_EMAIL:-info@mozdit.hu} + - LOKI_HOST=${LOKI_HOST:-http://loki:3100} + depends_on: + - mongodb + networks: + - mozdit-network-staging + restart: always + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # MongoDB Database (külön a prod-tól) + mongodb: + image: mongo:7.0 + container_name: mozdit-mongodb-staging + ports: + - "127.0.0.1:27019:27017" # Belső port, nem ütközik a prod 27018-cal + environment: + - MONGO_INITDB_ROOT_USERNAME=${MONGO_ROOT_USER:-admin} + - MONGO_INITDB_ROOT_PASSWORD=${MONGO_ROOT_PASSWORD:-password123} + - MONGO_INITDB_DATABASE=mozdit + volumes: + - mongodb_data_staging:/data/db + networks: + - mozdit-network-staging + restart: always + +volumes: + mongodb_data_staging: + driver: local + +networks: + mozdit-network-staging: + driver: bridge diff --git a/proto/Dockerfile b/proto/Dockerfile index cc0e72d..23b8d84 100755 --- a/proto/Dockerfile +++ b/proto/Dockerfile @@ -4,6 +4,10 @@ FROM node:20-alpine AS builder WORKDIR /app +# NEXT_PUBLIC_* vars are inlined at build time — must be passed as build args +ARG NEXT_PUBLIC_SITE_URL +ENV NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL + # Copy package files COPY package.json package-lock.json* ./