feat(deploy): add staging environment with dedicated docker compose
- Add docker-compose.staging.yml (app on 127.0.0.1:8081, separate MongoDB on 127.0.0.1:27019, dedicated volume/network) - deploy.sh: select compose file and port per environment (staging 8081, production 8080) - Dockerfile: accept NEXT_PUBLIC_SITE_URL as build arg (inlined at build time for NEXT_PUBLIC_ vars); pass it in both compose files - Add .env.staging.example and .env.production.example
This commit is contained in:
@@ -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
|
||||||
@@ -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
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
# mozdIT Deploy Script — natív docker compose, Dokploy nélkül
|
# mozdIT Deploy Script — natív docker compose, Dokploy nélkül
|
||||||
# Használat: ./deploy.sh [staging|production]
|
# Használat: ./deploy.sh [staging|production]
|
||||||
# A szerveren fut (git pull + rebuild + indítás).
|
# A szerveren fut (git pull + rebuild + indítás).
|
||||||
|
# Compose fájl és port env-enként különbözik.
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
@@ -13,7 +14,15 @@ if [ "$ENV" != "staging" ] && [ "$ENV" != "production" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
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
|
# 1. Kód frissítése
|
||||||
echo "📦 Kód frissítése a main ágról..."
|
echo "📦 Kód frissítése a main ágról..."
|
||||||
@@ -23,18 +32,18 @@ git pull origin main
|
|||||||
ENV_FILE=".env.${ENV}"
|
ENV_FILE=".env.${ENV}"
|
||||||
if [ ! -f "$ENV_FILE" ]; then
|
if [ ! -f "$ENV_FILE" ]; then
|
||||||
echo "❌ Hiba: $ENV_FILE fájl nem található."
|
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
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "🔑 Környezeti változók betöltése ($ENV_FILE)..."
|
echo "🔑 Környezeti változók betöltése ($ENV_FILE)..."
|
||||||
|
|
||||||
# 3. Docker konténerek újraépítése és indítása
|
# 3. Docker konténerek újraépítése és indítása
|
||||||
echo "🐳 Build és indítás..."
|
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
|
# 4. Healthcheck
|
||||||
echo "⏳ Healthcheck (max 60s)..."
|
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
|
for i in $(seq 1 30); do
|
||||||
if curl -sf "$HEALTH_URL" > /dev/null 2>&1; then
|
if curl -sf "$HEALTH_URL" > /dev/null 2>&1; then
|
||||||
echo "✅ Healthcheck OK: $HEALTH_URL"
|
echo "✅ Healthcheck OK: $HEALTH_URL"
|
||||||
@@ -45,5 +54,5 @@ for i in $(seq 1 30); do
|
|||||||
done
|
done
|
||||||
|
|
||||||
echo "❌ Healthcheck sikertelen: $HEALTH_URL"
|
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
|
exit 1
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
version: '3.8'
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
# Next.js Application (Production Mode)
|
# Next.js Application (Production Mode)
|
||||||
app:
|
app:
|
||||||
@@ -7,6 +5,8 @@ services:
|
|||||||
context: ./proto
|
context: ./proto
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
target: runner # Use runner stage for production (smaller size, no dev dependencies)
|
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
|
container_name: mozdit-app-prod
|
||||||
ports:
|
ports:
|
||||||
- "8080:3000" # Host port 8080 elkerüli a lokális npm dev (3000) összeakadást
|
- "8080:3000" # Host port 8080 elkerüli a lokális npm dev (3000) összeakadást
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -4,6 +4,10 @@ FROM node:20-alpine AS builder
|
|||||||
|
|
||||||
WORKDIR /app
|
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 files
|
||||||
COPY package.json package-lock.json* ./
|
COPY package.json package-lock.json* ./
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user