Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 32e4186240 | |||
| 72471ca747 | |||
| 4bcc2435b2 | |||
| 82002351c4 | |||
| 9edfb82ad9 | |||
| 18080f24df | |||
| 4eaf79422b | |||
| 9a6313083a |
-12
@@ -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)
|
# Email Configuration (SMTP)
|
||||||
# CHANGE THESE: Configure your email provider
|
# CHANGE THESE: Configure your email provider
|
||||||
EMAIL_HOST=mail.serpentrace.hu
|
EMAIL_HOST=smtp.yourmailprovider.com
|
||||||
EMAIL_PORT=465
|
EMAIL_PORT=587
|
||||||
EMAIL_SECURE=true
|
EMAIL_SECURE=false
|
||||||
EMAIL_USER=noreply@serpentrace.hu
|
EMAIL_USER=your_email@yourdomain.com
|
||||||
EMAIL_PASS=ZUx720ece&Cin&F{
|
EMAIL_PASS=your_email_password
|
||||||
EMAIL_FROM="SerpentRace <noreply@serpentrace.hu>"
|
EMAIL_FROM="SerpentRace <noreply@yourdomain.com>"
|
||||||
|
|
||||||
# MinIO Object Storage
|
# MinIO Object Storage
|
||||||
MINIO_ENDPOINT=minio
|
MINIO_ENDPOINT=minio
|
||||||
@@ -45,8 +45,7 @@ MINIO_SECRET_KEY=CHANGE_THIS_MINIO_SECRET_KEY_123!
|
|||||||
MINIO_BUCKET_NAME=serpentrace-logs
|
MINIO_BUCKET_NAME=serpentrace-logs
|
||||||
|
|
||||||
# Application Settings
|
# Application Settings
|
||||||
APP_BASE_URL=https://szesnake.ddc.sze.hu
|
APP_BASE_URL=http://your-domain.com
|
||||||
FRONTEND_URL=https://szesnake.ddc.sze.hu
|
|
||||||
PORT=3000
|
PORT=3000
|
||||||
|
|
||||||
# Chat System Limits
|
# 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
|
- PostgreSQL: 15-alpine
|
||||||
- Redis: 7-alpine
|
- Redis: 7-alpine
|
||||||
- MinIO: Latest
|
- MinIO: Latest
|
||||||
- Nginx: Alpine
|
- Nginx: Alpine
|
||||||
|
|
||||||
|
|
||||||
## DataBase information
|
|
||||||
- System: PostgreSQL
|
|
||||||
- Server: postgres
|
|
||||||
- Username: postgres
|
|
||||||
- Password: postgres
|
|
||||||
- Database: serpentrace
|
|
||||||
+38
-36
@@ -3,13 +3,36 @@ version: '3.8'
|
|||||||
services:
|
services:
|
||||||
# Backend service using pre-built image
|
# Backend service using pre-built image
|
||||||
backend:
|
backend:
|
||||||
image: serpentrace-backend:latest
|
image: serpentrace_docker-backend:latest
|
||||||
container_name: serpentrace-backend
|
container_name: serpentrace-backend
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- "3000:3000"
|
- "3000:3000"
|
||||||
env_file:
|
environment:
|
||||||
- .env.server
|
- 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:
|
volumes:
|
||||||
- backend_logs:/app/logs
|
- backend_logs:/app/logs
|
||||||
depends_on:
|
depends_on:
|
||||||
@@ -21,15 +44,20 @@ services:
|
|||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
networks:
|
networks:
|
||||||
- serpentrace-network
|
- 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 service using pre-built image
|
||||||
frontend:
|
frontend:
|
||||||
image: serpentrace-frontend:latest
|
image: serpentrace_docker-frontend:latest
|
||||||
container_name: serpentrace-frontend
|
container_name: serpentrace-frontend
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- "8080:80"
|
- "80:80"
|
||||||
- "443:443"
|
- "443:443"
|
||||||
volumes:
|
volumes:
|
||||||
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
|
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
|
||||||
@@ -53,7 +81,7 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
POSTGRES_DB: serpentrace
|
POSTGRES_DB: serpentrace
|
||||||
POSTGRES_USER: postgres
|
POSTGRES_USER: postgres
|
||||||
POSTGRES_PASSWORD: postgres
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||||
POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
|
POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
|
||||||
volumes:
|
volumes:
|
||||||
- postgres_data:/var/lib/postgresql/data
|
- postgres_data:/var/lib/postgresql/data
|
||||||
@@ -75,7 +103,7 @@ services:
|
|||||||
- "6379:6379"
|
- "6379:6379"
|
||||||
volumes:
|
volumes:
|
||||||
- redis_data:/data
|
- redis_data:/data
|
||||||
command: redis-server --appendonly yes
|
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
|
||||||
networks:
|
networks:
|
||||||
- serpentrace-network
|
- serpentrace-network
|
||||||
healthcheck:
|
healthcheck:
|
||||||
@@ -93,8 +121,8 @@ services:
|
|||||||
- "9000:9000"
|
- "9000:9000"
|
||||||
- "9001:9001"
|
- "9001:9001"
|
||||||
environment:
|
environment:
|
||||||
MINIO_ROOT_USER: serpentrace
|
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY}
|
||||||
MINIO_ROOT_PASSWORD: serpentrace123!
|
MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY}
|
||||||
volumes:
|
volumes:
|
||||||
- minio_data:/data
|
- minio_data:/data
|
||||||
command: server /data --console-address ":9001"
|
command: server /data --console-address ":9001"
|
||||||
@@ -106,32 +134,6 @@ services:
|
|||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 5
|
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:
|
volumes:
|
||||||
postgres_data:
|
postgres_data:
|
||||||
driver: local
|
driver: local
|
||||||
@@ -24,9 +24,9 @@ if %errorlevel% neq 0 (
|
|||||||
exit /b 1
|
exit /b 1
|
||||||
)
|
)
|
||||||
|
|
||||||
REM Check if serpentrace-images.tar exists
|
REM Check if serpentRaceDocker.tar exists
|
||||||
if not exist "serpentrace-images.tar" (
|
if not exist "serpentRaceDocker.tar" (
|
||||||
echo [ERROR] serpentrace-images.tar not found!
|
echo [ERROR] serpentRaceDocker.tar not found!
|
||||||
echo Please ensure the tar file is in the same directory as this script.
|
echo Please ensure the tar file is in the same directory as this script.
|
||||||
pause
|
pause
|
||||||
exit /b 1
|
exit /b 1
|
||||||
@@ -40,8 +40,8 @@ if not exist ".env.server" (
|
|||||||
exit /b 1
|
exit /b 1
|
||||||
)
|
)
|
||||||
|
|
||||||
echo [INFO] Loading Docker images from serpentrace-images.tar...
|
echo [INFO] Loading Docker images from serpentRaceDocker.tar...
|
||||||
docker load -i serpentrace-images.tar
|
docker load -i serpentRaceDocker.tar
|
||||||
if %errorlevel% neq 0 (
|
if %errorlevel% neq 0 (
|
||||||
echo [ERROR] Failed to load Docker images!
|
echo [ERROR] Failed to load Docker images!
|
||||||
pause
|
pause
|
||||||
@@ -20,9 +20,9 @@ if ! command -v docker-compose &> /dev/null; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check if serpentrace-images.tar exists
|
# Check if serpentRaceDocker.tar exists
|
||||||
if [ ! -f "serpentrace-images.tar" ]; then
|
if [ ! -f "serpentRaceDocker.tar" ]; then
|
||||||
echo "[ERROR] serpentrace-images.tar not found!"
|
echo "[ERROR] serpentRaceDocker.tar not found!"
|
||||||
echo "Please ensure the tar file is in the same directory as this script."
|
echo "Please ensure the tar file is in the same directory as this script."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -34,8 +34,8 @@ if [ ! -f ".env.server" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "[INFO] Loading Docker images from serpentrace-images.tar..."
|
echo "[INFO] Loading Docker images from serpentRaceDocker.tar..."
|
||||||
docker load -i serpentrace-images.tar
|
docker load -i serpentRaceDocker.tar
|
||||||
|
|
||||||
echo "[INFO] Images loaded successfully!"
|
echo "[INFO] Images loaded successfully!"
|
||||||
echo
|
echo
|
||||||
@@ -22,7 +22,7 @@ server {
|
|||||||
|
|
||||||
# API proxy to backend
|
# API proxy to backend
|
||||||
location /api/ {
|
location /api/ {
|
||||||
proxy_pass http://backend:3000;
|
proxy_pass http://backend:3000/;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
proxy_set_header Connection 'upgrade';
|
proxy_set_header Connection 'upgrade';
|
||||||
@@ -45,43 +45,10 @@ server {
|
|||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Adminer Database Viewer proxy
|
# Static assets caching
|
||||||
location /adminer/ {
|
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
|
||||||
proxy_pass http://adminer:8080/;
|
expires 1y;
|
||||||
proxy_set_header Host $host;
|
add_header Cache-Control "public, immutable";
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Health check endpoint
|
# Health check endpoint
|
||||||
-1
@@ -7,7 +7,6 @@
|
|||||||
"Port": 5432,
|
"Port": 5432,
|
||||||
"MaintenanceDB": "serpentrace",
|
"MaintenanceDB": "serpentrace",
|
||||||
"Username": "postgres",
|
"Username": "postgres",
|
||||||
"Password": "postgres",
|
|
||||||
"SSLMode": "prefer",
|
"SSLMode": "prefer",
|
||||||
"Comment": "SerpentRace Production Database"
|
"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;
|
||||||
@@ -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.
@@ -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;
|
|
||||||
Reference in New Issue
Block a user