8 Commits

Author SHA1 Message Date
magdo 32e4186240 Add updated deployment package (Backend: 1.01GB, Frontend: 85.6MB) 2025-11-25 18:40:26 +01:00
magdo 72471ca747 Remove old tar file 2025-11-25 18:39:50 +01:00
magdo 4bcc2435b2 Add deployment script 2025-11-25 18:25:10 +01:00
magdo 82002351c4 Fix image names and mount nginx.conf volume 2025-11-25 18:23:12 +01:00
magdo 9edfb82ad9 Add nginx.conf for production deployment with API proxying 2025-11-25 18:20:45 +01:00
magdo 18080f24df Clean deployment branch - keep only deployment files 2025-11-25 00:47:44 +01:00
magdo 4eaf79422b Add deployment info file 2025-11-25 00:44:17 +01:00
magdo 9a6313083a Add deployment package with Docker images - 25/11/2025 0:39:37.39 2025-11-25 00:39:37 +01:00
14 changed files with 607 additions and 294 deletions
-12
View File
@@ -1,12 +0,0 @@
#ignore each file in folder that starts with Archive_
Archive_*
#ignore each folder that starts with Archive_
Archive_*/**
#ignore node_modules folder
**/node_modules/**
#ignore dist folder
**/dist/**
#ignore log files
**/*.log
@@ -28,12 +28,12 @@ JWT_REFRESH_EXPIRATION=7d
# Email Configuration (SMTP)
# CHANGE THESE: Configure your email provider
EMAIL_HOST=mail.serpentrace.hu
EMAIL_PORT=465
EMAIL_SECURE=true
EMAIL_USER=noreply@serpentrace.hu
EMAIL_PASS=ZUx720ece&Cin&F{
EMAIL_FROM="SerpentRace <noreply@serpentrace.hu>"
EMAIL_HOST=smtp.yourmailprovider.com
EMAIL_PORT=587
EMAIL_SECURE=false
EMAIL_USER=your_email@yourdomain.com
EMAIL_PASS=your_email_password
EMAIL_FROM="SerpentRace <noreply@yourdomain.com>"
# MinIO Object Storage
MINIO_ENDPOINT=minio
@@ -45,8 +45,7 @@ MINIO_SECRET_KEY=CHANGE_THIS_MINIO_SECRET_KEY_123!
MINIO_BUCKET_NAME=serpentrace-logs
# Application Settings
APP_BASE_URL=https://szesnake.ddc.sze.hu
FRONTEND_URL=https://szesnake.ddc.sze.hu
APP_BASE_URL=http://your-domain.com
PORT=3000
# Chat System Limits
@@ -0,0 +1,22 @@
SerpentRace Deployment Package
==============================
Created: 2025-11-25 00:44:09
Source Branch: main
Docker Images: serpentrace_docker-backend:latest, serpentrace_docker-frontend:latest, serpentrace-frontend:maintest, serpentrace-frontend:test
Package Size: 238 MB
Files included:
- serpentRaceDocker.tar
- docker-compose.deploy.yml
- .env.server
- load-images.bat
- load-images.sh
- README.md
- sql_schema_only.sql
- pgadmin_servers_deployment.json
To deploy:
1. Copy the entire SerpentRace_Docker/deployment folder to your server
2. Edit .env.server with your configuration
3. Run load-images.bat (Windows) or load-images.sh (Linux)
@@ -200,12 +200,4 @@ docker-compose -f docker-compose.deploy.yml up -d
- PostgreSQL: 15-alpine
- Redis: 7-alpine
- MinIO: Latest
- Nginx: Alpine
## DataBase information
- System: PostgreSQL
- Server: postgres
- Username: postgres
- Password: postgres
- Database: serpentrace
- Nginx: Alpine
@@ -3,13 +3,36 @@ version: '3.8'
services:
# Backend service using pre-built image
backend:
image: serpentrace-backend:latest
image: serpentrace_docker-backend:latest
container_name: serpentrace-backend
restart: unless-stopped
ports:
- "3000:3000"
env_file:
- .env.server
environment:
- NODE_ENV=production
- PORT=3000
- DB_HOST=postgres
- DB_PORT=5432
- DB_NAME=serpentrace
- DB_USERNAME=postgres
- DB_PASSWORD=${POSTGRES_PASSWORD}
- REDIS_URL=redis://redis:6379
- REDIS_HOST=redis
- REDIS_PORT=6379
- JWT_SECRET=${JWT_SECRET}
- JWT_EXPIRATION=${JWT_EXPIRATION:-24h}
- JWT_REFRESH_EXPIRATION=${JWT_REFRESH_EXPIRATION:-7d}
- MINIO_ENDPOINT=minio
- MINIO_PORT=9000
- MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY}
- MINIO_SECRET_KEY=${MINIO_SECRET_KEY}
- MINIO_USE_SSL=false
- EMAIL_HOST=${EMAIL_HOST}
- EMAIL_PORT=${EMAIL_PORT}
- EMAIL_SECURE=${EMAIL_SECURE}
- EMAIL_USER=${EMAIL_USER}
- EMAIL_PASS=${EMAIL_PASS}
- EMAIL_FROM=${EMAIL_FROM}
volumes:
- backend_logs:/app/logs
depends_on:
@@ -21,15 +44,20 @@ services:
condition: service_healthy
networks:
- serpentrace-network
tty: true
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# Frontend service using pre-built image
frontend:
image: serpentrace-frontend:latest
image: serpentrace_docker-frontend:latest
container_name: serpentrace-frontend
restart: unless-stopped
ports:
- "8080:80"
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
@@ -53,7 +81,7 @@ services:
environment:
POSTGRES_DB: serpentrace
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
volumes:
- postgres_data:/var/lib/postgresql/data
@@ -75,7 +103,7 @@ services:
- "6379:6379"
volumes:
- redis_data:/data
command: redis-server --appendonly yes
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
networks:
- serpentrace-network
healthcheck:
@@ -93,8 +121,8 @@ services:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: serpentrace
MINIO_ROOT_PASSWORD: serpentrace123!
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY}
MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY}
volumes:
- minio_data:/data
command: server /data --console-address ":9001"
@@ -106,32 +134,6 @@ services:
timeout: 5s
retries: 5
# Adminer Database Viewer
adminer:
image: adminer:latest
container_name: serpentrace-adminer
restart: unless-stopped
ports:
- "8083:8080" # Access via http://<server-ip>:8083
depends_on:
- postgres
networks:
- serpentrace-network
# Redis Commander
redis-commander:
image: rediscommander/redis-commander:latest
container_name: serpentrace-redis-commander
restart: unless-stopped
ports:
- "8082:8081" # Access via http://<server-ip>:8082
environment:
REDIS_HOSTS: local:serpentrace-redis:6379
depends_on:
- redis
networks:
- serpentrace-network
volumes:
postgres_data:
driver: local
@@ -24,9 +24,9 @@ if %errorlevel% neq 0 (
exit /b 1
)
REM Check if serpentrace-images.tar exists
if not exist "serpentrace-images.tar" (
echo [ERROR] serpentrace-images.tar not found!
REM Check if serpentRaceDocker.tar exists
if not exist "serpentRaceDocker.tar" (
echo [ERROR] serpentRaceDocker.tar not found!
echo Please ensure the tar file is in the same directory as this script.
pause
exit /b 1
@@ -40,8 +40,8 @@ if not exist ".env.server" (
exit /b 1
)
echo [INFO] Loading Docker images from serpentrace-images.tar...
docker load -i serpentrace-images.tar
echo [INFO] Loading Docker images from serpentRaceDocker.tar...
docker load -i serpentRaceDocker.tar
if %errorlevel% neq 0 (
echo [ERROR] Failed to load Docker images!
pause
@@ -20,9 +20,9 @@ if ! command -v docker-compose &> /dev/null; then
exit 1
fi
# Check if serpentrace-images.tar exists
if [ ! -f "serpentrace-images.tar" ]; then
echo "[ERROR] serpentrace-images.tar not found!"
# Check if serpentRaceDocker.tar exists
if [ ! -f "serpentRaceDocker.tar" ]; then
echo "[ERROR] serpentRaceDocker.tar not found!"
echo "Please ensure the tar file is in the same directory as this script."
exit 1
fi
@@ -34,8 +34,8 @@ if [ ! -f ".env.server" ]; then
exit 1
fi
echo "[INFO] Loading Docker images from serpentrace-images.tar..."
docker load -i serpentrace-images.tar
echo "[INFO] Loading Docker images from serpentRaceDocker.tar..."
docker load -i serpentRaceDocker.tar
echo "[INFO] Images loaded successfully!"
echo
@@ -22,7 +22,7 @@ server {
# API proxy to backend
location /api/ {
proxy_pass http://backend:3000;
proxy_pass http://backend:3000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
@@ -45,43 +45,10 @@ server {
proxy_set_header X-Forwarded-Proto $scheme;
}
# Adminer Database Viewer proxy
location /adminer/ {
proxy_pass http://adminer:8080/;
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;
}
# Redis Commander proxy
location /redis/ {
proxy_pass http://redis-commander:8081/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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;
proxy_redirect http://redis-commander:8081/ /redis/;
proxy_cache_bypass $http_upgrade;
}
# MinIO Console proxy
location /minio/ {
proxy_pass http://minio:9001/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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;
proxy_redirect http://minio:9001/ /minio/;
sub_filter '<base href="/"' '<base href="/minio/"';
sub_filter_types text/html;
proxy_cache_bypass $http_upgrade;
# Static assets caching
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# Health check endpoint
@@ -7,7 +7,6 @@
"Port": 5432,
"MaintenanceDB": "serpentrace",
"Username": "postgres",
"Password": "postgres",
"SSLMode": "prefer",
"Comment": "SerpentRace Production Database"
}
Binary file not shown.
@@ -0,0 +1,236 @@
-- SerpentRace Database Schema
-- Generated from TypeORM Entity Aggregates
-- This file creates the complete database schema without initial data
-- Enable UUID extension
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- Create Users table
CREATE TABLE "Users" (
"id" UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
"orgid" UUID NULL,
"username" VARCHAR(100) UNIQUE NOT NULL,
"password" VARCHAR(255) NOT NULL,
"email" VARCHAR(255) UNIQUE NOT NULL,
"fname" VARCHAR(100) NOT NULL,
"lname" VARCHAR(100) NOT NULL,
"token" VARCHAR(255) NULL,
"TokenExpires" TIMESTAMP NULL,
"phone" VARCHAR(20) NULL,
"state" INTEGER NOT NULL DEFAULT 0,
"regdate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"Orglogindate" TIMESTAMP NULL
);
-- Create Organizations table
CREATE TABLE "Organizations" (
"id" UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
"name" VARCHAR(255) NOT NULL,
"contactfname" VARCHAR(100) NOT NULL,
"contactlname" VARCHAR(100) NOT NULL,
"contactphone" VARCHAR(20) NOT NULL,
"contactemail" VARCHAR(255) NOT NULL,
"state" INTEGER NOT NULL DEFAULT 0,
"regdate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"url" VARCHAR(500) NULL,
"userinorg" INTEGER NOT NULL DEFAULT 0,
"maxOrganizationalDecks" INTEGER NULL
);
-- Create Decks table
CREATE TABLE "Decks" (
"id" UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
"name" VARCHAR(255) NOT NULL,
"type" INTEGER NOT NULL,
"user_id" UUID NOT NULL,
"creation_date" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"cards" JSONB NOT NULL DEFAULT '[]',
"played_number" INTEGER NOT NULL DEFAULT 0,
"ctype" INTEGER NOT NULL DEFAULT 0,
"update_date" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"state" INTEGER NOT NULL DEFAULT 0,
"organization_id" UUID NULL
);
-- Create Chats table
CREATE TABLE "Chats" (
"id" UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
"type" VARCHAR(50) NOT NULL DEFAULT 'direct',
"name" VARCHAR(255) NULL,
"gameId" UUID NULL,
"createdBy" UUID NULL,
"users" UUID[] NOT NULL,
"messages" JSONB NOT NULL DEFAULT '[]',
"lastActivity" TIMESTAMP NULL,
"createDate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updateDate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"state" INTEGER NOT NULL DEFAULT 0,
"archiveDate" TIMESTAMP NULL
);
-- Create Contacts table
CREATE TABLE "Contacts" (
"id" UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
"name" VARCHAR(255) NOT NULL,
"email" VARCHAR(255) NOT NULL,
"userid" UUID NULL,
"type" INTEGER NOT NULL,
"txt" TEXT NOT NULL,
"state" INTEGER NOT NULL DEFAULT 0,
"createDate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updateDate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"adminResponse" TEXT NULL,
"responseDate" TIMESTAMP NULL,
"respondedBy" UUID NULL
);
-- Create Games table
CREATE TABLE "Games" (
"id" UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
"gamecode" VARCHAR(10) UNIQUE NOT NULL,
"maxplayers" INTEGER NOT NULL,
"logintype" INTEGER NOT NULL DEFAULT 0,
"state" INTEGER NOT NULL DEFAULT 0,
"playerids" UUID[] NOT NULL DEFAULT '{}',
"decks" JSONB NOT NULL DEFAULT '[]',
"boardsize" INTEGER NOT NULL DEFAULT 50,
"createDate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updateDate" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
"finishDate" TIMESTAMP NULL,
"winnerid" UUID NULL,
"createdBy" UUID NOT NULL,
"organizationid" UUID NULL
);
-- Add Foreign Key Constraints
ALTER TABLE "Users"
ADD CONSTRAINT "FK_Users_Organizations"
FOREIGN KEY ("orgid") REFERENCES "Organizations"("id") ON DELETE SET NULL;
ALTER TABLE "Decks"
ADD CONSTRAINT "FK_Decks_Users"
FOREIGN KEY ("user_id") REFERENCES "Users"("id") ON DELETE CASCADE;
ALTER TABLE "Decks"
ADD CONSTRAINT "FK_Decks_Organizations"
FOREIGN KEY ("organization_id") REFERENCES "Organizations"("id") ON DELETE SET NULL;
ALTER TABLE "Contacts"
ADD CONSTRAINT "FK_Contacts_Users"
FOREIGN KEY ("userid") REFERENCES "Users"("id") ON DELETE SET NULL;
ALTER TABLE "Contacts"
ADD CONSTRAINT "FK_Contacts_RespondedBy"
FOREIGN KEY ("respondedBy") REFERENCES "Users"("id") ON DELETE SET NULL;
ALTER TABLE "Chats"
ADD CONSTRAINT "FK_Chats_CreatedBy"
FOREIGN KEY ("createdBy") REFERENCES "Users"("id") ON DELETE SET NULL;
ALTER TABLE "Chats"
ADD CONSTRAINT "FK_Chats_Games"
FOREIGN KEY ("gameId") REFERENCES "Games"("id") ON DELETE SET NULL;
ALTER TABLE "Games"
ADD CONSTRAINT "FK_Games_CreatedBy"
FOREIGN KEY ("createdBy") REFERENCES "Users"("id") ON DELETE CASCADE;
ALTER TABLE "Games"
ADD CONSTRAINT "FK_Games_Organizations"
FOREIGN KEY ("organizationid") REFERENCES "Organizations"("id") ON DELETE SET NULL;
ALTER TABLE "Games"
ADD CONSTRAINT "FK_Games_Winner"
FOREIGN KEY ("winnerid") REFERENCES "Users"("id") ON DELETE SET NULL;
-- Create Indexes for Performance
CREATE INDEX "IDX_Users_Username" ON "Users" ("username");
CREATE INDEX "IDX_Users_Email" ON "Users" ("email");
CREATE INDEX "IDX_Users_OrgId" ON "Users" ("orgid");
CREATE INDEX "IDX_Users_State" ON "Users" ("state");
CREATE INDEX "IDX_Organizations_Name" ON "Organizations" ("name");
CREATE INDEX "IDX_Organizations_State" ON "Organizations" ("state");
CREATE INDEX "IDX_Decks_UserId" ON "Decks" ("user_id");
CREATE INDEX "IDX_Decks_Type" ON "Decks" ("type");
CREATE INDEX "IDX_Decks_CType" ON "Decks" ("ctype");
CREATE INDEX "IDX_Decks_State" ON "Decks" ("state");
CREATE INDEX "IDX_Decks_OrganizationId" ON "Decks" ("organization_id");
CREATE INDEX "IDX_Chats_Type" ON "Chats" ("type");
CREATE INDEX "IDX_Chats_State" ON "Chats" ("state");
CREATE INDEX "IDX_Chats_GameId" ON "Chats" ("gameId");
CREATE INDEX "IDX_Chats_CreatedBy" ON "Chats" ("createdBy");
CREATE INDEX "IDX_Contacts_Type" ON "Contacts" ("type");
CREATE INDEX "IDX_Contacts_State" ON "Contacts" ("state");
CREATE INDEX "IDX_Contacts_UserId" ON "Contacts" ("userid");
CREATE INDEX "IDX_Games_GameCode" ON "Games" ("gamecode");
CREATE INDEX "IDX_Games_State" ON "Games" ("state");
CREATE INDEX "IDX_Games_CreatedBy" ON "Games" ("createdBy");
CREATE INDEX "IDX_Games_OrganizationId" ON "Games" ("organizationid");
-- Create update trigger for updatedate columns
CREATE OR REPLACE FUNCTION update_updatedate_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updatedate = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ language 'plpgsql';
-- Apply update triggers
CREATE TRIGGER update_users_updatedate
BEFORE UPDATE ON "Users"
FOR EACH ROW EXECUTE FUNCTION update_updatedate_column();
CREATE TRIGGER update_organizations_updatedate
BEFORE UPDATE ON "Organizations"
FOR EACH ROW EXECUTE FUNCTION update_updatedate_column();
CREATE TRIGGER update_decks_updatedate
BEFORE UPDATE ON "Decks"
FOR EACH ROW EXECUTE FUNCTION update_updatedate_column();
CREATE TRIGGER update_chats_updatedate
BEFORE UPDATE ON "Chats"
FOR EACH ROW EXECUTE FUNCTION update_updatedate_column();
CREATE TRIGGER update_contacts_updatedate
BEFORE UPDATE ON "Contacts"
FOR EACH ROW EXECUTE FUNCTION update_updatedate_column();
CREATE TRIGGER update_games_updatedate
BEFORE UPDATE ON "Games"
FOR EACH ROW EXECUTE FUNCTION update_updatedate_column();
-- Comments for documentation
COMMENT ON TABLE "Users" IS 'User accounts with authentication and profile information';
COMMENT ON TABLE "Organizations" IS 'Organizations that can have multiple users and premium features';
COMMENT ON TABLE "Decks" IS 'Card decks for the game, can be public, private, or organizational';
COMMENT ON TABLE "Chats" IS 'Chat system supporting direct messages, groups, and game chats';
COMMENT ON TABLE "Contacts" IS 'Contact form submissions and support tickets';
COMMENT ON TABLE "Games" IS 'Game sessions with players, decks, and game state';
-- Enum value comments
COMMENT ON COLUMN "Users"."state" IS '0=REGISTERED_NOT_VERIFIED, 1=VERIFIED_REGULAR, 2=VERIFIED_PREMIUM, 3=SOFT_DELETE, 4=DEACTIVATED, 5=ADMIN';
COMMENT ON COLUMN "Organizations"."state" IS '0=REGISTERED, 1=ACTIVE, 2=SOFT_DELETE';
COMMENT ON COLUMN "Decks"."type" IS '0=LUCK, 1=JOKER, 2=QUESTION';
COMMENT ON COLUMN "Decks"."ctype" IS '0=PUBLIC, 1=PRIVATE, 2=ORGANIZATION';
COMMENT ON COLUMN "Decks"."state" IS '0=ACTIVE, 1=SOFT_DELETE';
COMMENT ON COLUMN "Chats"."type" IS 'direct, group, game';
COMMENT ON COLUMN "Chats"."state" IS '0=ACTIVE, 1=ARCHIVE, 2=SOFT_DELETE';
COMMENT ON COLUMN "Contacts"."type" IS '0=BUG, 1=PROBLEM, 2=QUESTION, 3=SALES, 4=OTHER';
COMMENT ON COLUMN "Contacts"."state" IS '0=ACTIVE, 1=RESOLVED, 2=SOFT_DELETE';
COMMENT ON COLUMN "Games"."state" IS '0=WAITING, 1=ACTIVE, 2=FINISHED, 3=CANCELLED';
COMMENT ON COLUMN "Games"."logintype" IS '0=PUBLIC, 1=PRIVATE, 2=ORGANIZATION';
-- Grant permissions for application user
-- Note: Replace 'serpentrace_app' with your actual application database user
-- GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO serpentrace_app;
-- GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO serpentrace_app;
-- GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO serpentrace_app;
+288
View File
@@ -0,0 +1,288 @@
@echo off
REM SerpentRace Deployment Package Creator for Windows
REM This script creates a complete deployment package with Docker images
setlocal EnableDelayedExpansion
echo ========================================
echo SerpentRace Deployment Package Creator
echo ========================================
echo.
REM Check if Docker is installed
where docker >nul 2>nul
if %errorlevel% neq 0 (
echo [ERROR] Docker is not installed. Please install Docker first.
exit /b 1
)
REM Check if git is installed
where git >nul 2>nul
if %errorlevel% neq 0 (
echo [ERROR] Git is not installed. Please install Git first.
exit /b 1
)
REM Get current branch
for /f "tokens=*" %%i in ('git branch --show-current') do set CURRENT_BRANCH=%%i
echo [INFO] Current branch: %CURRENT_BRANCH%
REM Check for uncommitted changes
git diff-index --quiet HEAD --
if %errorlevel% neq 0 (
echo [WARN] You have uncommitted changes in %CURRENT_BRANCH%
echo [WARN] Please commit or stash your changes before creating deployment
choice /C YN /M "Continue anyway?"
if errorlevel 2 exit /b 1
)
echo.
echo [INFO] Step 1/7: Switching to deployment branch...
git checkout deployment 2>nul
if %errorlevel% neq 0 (
echo [INFO] Deployment branch doesn't exist, creating it...
git checkout -b deployment
if %errorlevel% neq 0 (
echo [ERROR] Failed to create deployment branch
exit /b 1
)
)
echo.
echo [INFO] Step 2/7: Copying necessary files from main branch...
REM Create deployment directory if it doesn't exist
if not exist "SerpentRace_Docker\deployment" mkdir SerpentRace_Docker\deployment
REM Copy deployment configuration files from main
echo [INFO] Copying docker-compose.deploy.yml...
git show main:SerpentRace_Docker/deployment/docker-compose.deploy.yml > SerpentRace_Docker\deployment\docker-compose.deploy.yml 2>nul
if %errorlevel% neq 0 (
echo [WARN] docker-compose.deploy.yml not found in main, using current version
)
echo [INFO] Copying .env.server template...
git show main:SerpentRace_Docker/deployment/.env.server > SerpentRace_Docker\deployment\.env.server 2>nul
if %errorlevel% neq 0 (
echo [WARN] .env.server not found in main, creating template...
(
echo # SerpentRace Production Environment Configuration
echo # IMPORTANT: Change all placeholder values before deployment!
echo.
echo # Database Configuration
echo POSTGRES_USER=postgres
echo POSTGRES_PASSWORD=CHANGE_THIS_PASSWORD
echo POSTGRES_DB=serpentrace
echo.
echo # JWT Configuration
echo JWT_SECRET=CHANGE_THIS_TO_A_RANDOM_32_CHAR_STRING
echo JWT_EXPIRATION=30m
echo JWT_REFRESH_EXPIRATION=7d
echo.
echo # Redis Configuration
echo REDIS_PASSWORD=CHANGE_THIS_REDIS_PASSWORD
echo.
echo # MinIO Configuration
echo MINIO_ROOT_USER=admin
echo MINIO_ROOT_PASSWORD=CHANGE_THIS_MINIO_PASSWORD
echo MINIO_ACCESS_KEY=serpentrace-access
echo MINIO_SECRET_KEY=CHANGE_THIS_MINIO_SECRET
echo.
echo # Email Configuration
echo EMAIL_HOST=smtp.gmail.com
echo EMAIL_PORT=587
echo EMAIL_SECURE=false
echo EMAIL_USER=your_email@gmail.com
echo EMAIL_PASS=your_email_password
echo EMAIL_FROM=SerpentRace ^<noreply@serpentrace.com^>
echo.
echo # Application Configuration
echo NODE_ENV=production
echo APP_BASE_URL=http://localhost
echo PORT=3000
) > SerpentRace_Docker\deployment\.env.server
)
echo [INFO] Copying README.md...
git show main:SerpentRace_Docker/deployment/README.md > SerpentRace_Docker\deployment\README.md 2>nul
if %errorlevel% neq 0 (
echo [WARN] README.md not found in main, using current version
)
echo [INFO] Copying load-images scripts...
git show main:SerpentRace_Docker/deployment/load-images.bat > SerpentRace_Docker\deployment\load-images.bat 2>nul
git show main:SerpentRace_Docker/deployment/load-images.sh > SerpentRace_Docker\deployment\load-images.sh 2>nul
echo [INFO] Copying SQL schema...
git show main:SerpentRace_Docker/deployment/sql_schema_only.sql > SerpentRace_Docker\deployment\sql_schema_only.sql 2>nul
echo [INFO] Copying pgAdmin configuration...
git show main:SerpentRace_Docker/deployment/pgadmin_servers_deployment.json > SerpentRace_Docker\deployment\pgadmin_servers_deployment.json 2>nul
if %errorlevel% neq 0 (
echo [WARN] pgadmin_servers_deployment.json not found in main, creating default...
(
echo {
echo "Servers": {
echo "1": {
echo "Name": "SerpentRace Production",
echo "Group": "Servers",
echo "Host": "postgres",
echo "Port": 5432,
echo "MaintenanceDB": "serpentrace",
echo "Username": "postgres",
echo "SSLMode": "prefer",
echo "Comment": "SerpentRace Production Database"
echo }
echo }
echo }
) > SerpentRace_Docker\deployment\pgadmin_servers_deployment.json
)
echo.
echo [INFO] Step 3/7: Building Docker images from %CURRENT_BRANCH% branch...
REM Switch back to current branch to build with latest code
echo [INFO] Switching back to %CURRENT_BRANCH% to build images...
git checkout %CURRENT_BRANCH%
if %errorlevel% neq 0 (
echo [ERROR] Failed to switch back to %CURRENT_BRANCH%
exit /b 1
)
REM Copy docker-compose file for building
echo [INFO] Checking out docker-compose files...
git show %CURRENT_BRANCH%:SerpentRace_Docker/docker-compose.prod.yml > SerpentRace_Docker\docker-compose.prod.yml.temp
if %errorlevel% neq 0 (
echo [ERROR] docker-compose.prod.yml not found in %CURRENT_BRANCH% branch
exit /b 1
)
REM Build images using production compose file
cd SerpentRace_Docker
echo [INFO] Building production Docker images (this may take several minutes)...
docker-compose -f docker-compose.prod.yml.temp build --no-cache
if %errorlevel% neq 0 (
echo [ERROR] Failed to build Docker images
cd ..
del SerpentRace_Docker\docker-compose.prod.yml.temp
git checkout deployment
exit /b 1
)
cd ..
REM Clean up temp file
del SerpentRace_Docker\docker-compose.prod.yml.temp
REM Switch to deployment branch for packaging
echo [INFO] Switching to deployment branch for packaging...
git checkout deployment
if %errorlevel% neq 0 (
echo [ERROR] Failed to switch to deployment branch
exit /b 1
)
echo.
echo [INFO] Step 4/7: Identifying built images...
REM Get list of images built for SerpentRace
set IMAGE_LIST=
for /f "tokens=*" %%i in ('docker images --filter "reference=serpentrace*" --format "{{.Repository}}:{{.Tag}}"') do (
set IMAGE_LIST=!IMAGE_LIST! %%i
)
if "!IMAGE_LIST!"==" " (
echo [ERROR] No SerpentRace images found. Build may have failed.
git checkout %CURRENT_BRANCH%
exit /b 1
)
echo [INFO] Found images: !IMAGE_LIST!
echo.
echo [INFO] Step 5/7: Saving Docker images to tar file...
echo [INFO] This may take several minutes depending on image sizes...
docker save -o SerpentRace_Docker\deployment\serpentRaceDocker.tar !IMAGE_LIST!
if %errorlevel% neq 0 (
echo [ERROR] Failed to save Docker images to tar file
git checkout %CURRENT_BRANCH%
exit /b 1
)
REM Get file size
for %%A in ("SerpentRace_Docker\deployment\serpentRaceDocker.tar") do set TAR_SIZE=%%~zA
set /a TAR_SIZE_MB=!TAR_SIZE! / 1024 / 1024
echo [INFO] Created serpentRaceDocker.tar (Size: !TAR_SIZE_MB! MB)
echo.
echo [INFO] Step 6/7: Adding files to deployment branch...
REM Add only deployment files to git
git add SerpentRace_Docker\deployment\*
REM Check if there are changes to commit
git diff --cached --quiet
if %errorlevel% neq 0 (
echo [INFO] Committing deployment package...
git commit -m "Add deployment package with Docker images - %date% %time%"
if %errorlevel% neq 0 (
echo [ERROR] Failed to commit deployment files
git checkout %CURRENT_BRANCH%
exit /b 1
)
) else (
echo [INFO] No changes to commit (deployment files are up to date)
)
echo.
echo [INFO] Step 7/7: Finalizing...
REM Create deployment info file
(
echo SerpentRace Deployment Package
echo ==============================
echo.
echo Created: %date% %time%
echo Source Branch: %CURRENT_BRANCH%
echo Docker Images: !IMAGE_LIST!
echo Package Size: !TAR_SIZE_MB! MB
echo.
echo Files included:
echo - serpentRaceDocker.tar
echo - docker-compose.deploy.yml
echo - .env.server
echo - load-images.bat
echo - load-images.sh
echo - README.md
echo - sql_schema_only.sql
echo - pgadmin_servers_deployment.json
echo.
echo To deploy:
echo 1. Copy the entire SerpentRace_Docker/deployment folder to your server
echo 2. Edit .env.server with your configuration
echo 3. Run load-images.bat (Windows^) or load-images.sh (Linux^)
) > SerpentRace_Docker\deployment\DEPLOYMENT_INFO.txt
git add SerpentRace_Docker\deployment\DEPLOYMENT_INFO.txt
git commit -m "Add deployment info file" 2>nul
echo.
echo ========================================
echo [SUCCESS] Deployment package created!
echo ========================================
echo.
echo Deployment branch: deployment
echo Package location: SerpentRace_Docker\deployment\
echo Package size: !TAR_SIZE_MB! MB
echo.
echo Next steps:
echo 1. Review the files in SerpentRace_Docker\deployment\
echo 2. Optionally push to remote: git push origin deployment
echo 3. Copy deployment folder to your production server
echo.
echo Switching back to %CURRENT_BRANCH% branch...
git checkout %CURRENT_BRANCH%
echo.
echo [INFO] Deployment package creation complete!
pause
Binary file not shown.
-180
View File
@@ -1,180 +0,0 @@
-- This script was generated by the ERD tool in pgAdmin 4.
-- Please log an issue at https://github.com/pgadmin-org/pgadmin4/issues/new/choose if you find any bugs, including reproduction steps.
BEGIN;
-- ===================================================================
-- STEP 1: Enable Required Extensions
-- ===================================================================
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- ===================================================================
-- STEP 2: Create Tables
-- ===================================================================
CREATE TABLE IF NOT EXISTS public."ChatArchives"
(
id uuid NOT NULL DEFAULT uuid_generate_v4(),
"chatId" uuid NOT NULL,
"archivedMessages" json NOT NULL,
"archivedAt" timestamp without time zone NOT NULL,
"createDate" timestamp without time zone NOT NULL DEFAULT now(),
"chatType" character varying(50) COLLATE pg_catalog."default" NOT NULL,
"chatName" character varying(255) COLLATE pg_catalog."default",
"gameId" uuid,
participants uuid[] NOT NULL,
CONSTRAINT "PK_fe62979fc2061d7afe278d3f14e" PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS public."Chats"
(
id uuid NOT NULL DEFAULT uuid_generate_v4(),
type character varying(50) COLLATE pg_catalog."default" NOT NULL DEFAULT 'direct'::character varying,
name character varying(255) COLLATE pg_catalog."default",
"gameId" uuid,
"createdBy" uuid,
users uuid[] NOT NULL,
messages json NOT NULL DEFAULT '[]'::json,
"lastActivity" timestamp without time zone,
"createDate" timestamp without time zone NOT NULL DEFAULT now(),
"updateDate" timestamp without time zone NOT NULL DEFAULT now(),
state integer NOT NULL DEFAULT 0,
"archiveDate" timestamp without time zone,
CONSTRAINT "PK_64c36c2b8d86a0d5de4cf64de8d" PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS public."Contacts"
(
id uuid NOT NULL DEFAULT uuid_generate_v4(),
name character varying(255) COLLATE pg_catalog."default" NOT NULL,
email character varying(255) COLLATE pg_catalog."default" NOT NULL,
userid uuid,
type integer NOT NULL,
txt text COLLATE pg_catalog."default" NOT NULL,
state integer NOT NULL DEFAULT 0,
"createDate" timestamp without time zone NOT NULL DEFAULT now(),
"updateDate" timestamp without time zone NOT NULL DEFAULT now(),
"adminResponse" text COLLATE pg_catalog."default",
"responseDate" timestamp without time zone,
"respondedBy" uuid,
CONSTRAINT "PK_68782cec65c8eef577c62958273" PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS public."Decks"
(
id uuid NOT NULL DEFAULT uuid_generate_v4(),
name character varying(255) COLLATE pg_catalog."default" NOT NULL,
type integer NOT NULL,
user_id uuid NOT NULL,
creation_date timestamp without time zone NOT NULL DEFAULT now(),
cards json NOT NULL,
played_number integer NOT NULL DEFAULT 0,
ctype integer NOT NULL DEFAULT 0,
"updateDate" timestamp without time zone NOT NULL DEFAULT now(),
state integer NOT NULL DEFAULT 0,
organization_id uuid,
CONSTRAINT "PK_001f26cb3ec39c1f25269943473" PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS public."Games"
(
id uuid NOT NULL DEFAULT uuid_generate_v4(),
gamecode character varying(10) COLLATE pg_catalog."default" NOT NULL,
maxplayers integer NOT NULL,
logintype integer NOT NULL DEFAULT 0,
boardsize integer NOT NULL DEFAULT 50,
"createdBy" uuid NOT NULL,
organizationid uuid,
decks jsonb NOT NULL DEFAULT '[]'::jsonb,
playerids uuid[] NOT NULL DEFAULT '{}'::uuid[],
"winnerId" uuid,
state integer NOT NULL DEFAULT 0,
"createDate" timestamp without time zone NOT NULL DEFAULT now(),
start_date timestamp without time zone,
"finishDate" timestamp without time zone,
"updateDate" timestamp without time zone NOT NULL DEFAULT now(),
"organizationId" uuid,
CONSTRAINT "PK_1950492f583d31609c5e9fbbe12" PRIMARY KEY (id),
CONSTRAINT "UQ_9d52c646079cbe6f242a85c5c41" UNIQUE (gamecode)
);
CREATE TABLE IF NOT EXISTS public."Organizations"
(
id uuid NOT NULL DEFAULT uuid_generate_v4(),
name character varying(255) COLLATE pg_catalog."default" NOT NULL,
contactfname character varying(100) COLLATE pg_catalog."default" NOT NULL,
contactlname character varying(100) COLLATE pg_catalog."default" NOT NULL,
contactphone character varying(20) COLLATE pg_catalog."default" NOT NULL,
contactemail character varying(255) COLLATE pg_catalog."default" NOT NULL,
state integer NOT NULL DEFAULT 0,
regdate timestamp without time zone NOT NULL DEFAULT now(),
"updateDate" timestamp without time zone NOT NULL DEFAULT now(),
url character varying(500) COLLATE pg_catalog."default",
userinorg integer NOT NULL DEFAULT 0,
"maxOrganizationalDecks" integer,
CONSTRAINT "PK_e0690a31419f6666194423526f2" PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS public."Users"
(
id uuid NOT NULL DEFAULT uuid_generate_v4(),
orgid uuid,
username character varying(100) COLLATE pg_catalog."default" NOT NULL,
password character varying(255) COLLATE pg_catalog."default" NOT NULL,
email character varying(255) COLLATE pg_catalog."default" NOT NULL,
fname character varying(100) COLLATE pg_catalog."default" NOT NULL,
lname character varying(100) COLLATE pg_catalog."default" NOT NULL,
token character varying(255) COLLATE pg_catalog."default",
"TokenExpires" timestamp without time zone,
phone character varying(20) COLLATE pg_catalog."default",
state integer NOT NULL DEFAULT 0,
regdate timestamp without time zone NOT NULL DEFAULT now(),
"updateDate" timestamp without time zone NOT NULL DEFAULT now(),
"Orglogindate" timestamp without time zone,
CONSTRAINT "PK_16d4f7d636df336db11d87413e3" PRIMARY KEY (id),
CONSTRAINT "UQ_3c3ab3f49a87e6ddb607f3c4945" UNIQUE (email),
CONSTRAINT "UQ_ffc81a3b97dcbf8e320d5106c0d" UNIQUE (username)
);
CREATE TABLE IF NOT EXISTS public.migrations
(
id serial NOT NULL,
"timestamp" bigint NOT NULL,
name character varying COLLATE pg_catalog."default" NOT NULL,
CONSTRAINT "PK_8c82d7f526340ab734260ea46be" PRIMARY KEY (id)
);
ALTER TABLE IF EXISTS public."Decks"
ADD CONSTRAINT "FK_06ee28f90d68543a03b14aebe13" FOREIGN KEY (organization_id)
REFERENCES public."Organizations" (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION;
ALTER TABLE IF EXISTS public."Decks"
ADD CONSTRAINT "FK_a39059433e29882e1309d3a5e70" FOREIGN KEY (user_id)
REFERENCES public."Users" (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION;
ALTER TABLE IF EXISTS public."Games"
ADD CONSTRAINT "FK_330362bff8b25bb573f31fb4023" FOREIGN KEY ("winnerId")
REFERENCES public."Users" (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION;
ALTER TABLE IF EXISTS public."Games"
ADD CONSTRAINT "FK_e3c4e8898fa026a5551aefc4f62" FOREIGN KEY ("organizationId")
REFERENCES public."Organizations" (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION;
ALTER TABLE IF EXISTS public."Games"
ADD CONSTRAINT "FK_f32db60863a8a393b30aa222cd5" FOREIGN KEY ("createdBy")
REFERENCES public."Users" (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION;
END;