@idealyst/cli 1.0.32 โ 1.0.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generators/api.js +28 -25
- package/dist/generators/api.js.map +1 -1
- package/dist/generators/index.js +33 -16
- package/dist/generators/index.js.map +1 -1
- package/dist/generators/native.js +51 -48
- package/dist/generators/native.js.map +1 -1
- package/dist/generators/shared.js +25 -22
- package/dist/generators/shared.js.map +1 -1
- package/dist/generators/utils.js +146 -118
- package/dist/generators/utils.js.map +1 -1
- package/dist/generators/web.js +33 -30
- package/dist/generators/web.js.map +1 -1
- package/dist/generators/workspace.js +24 -21
- package/dist/generators/workspace.js.map +1 -1
- package/dist/index.js +82 -44
- package/dist/index.js.map +1 -1
- package/dist/templates/api/README.md +207 -0
- package/dist/templates/api/__tests__/api.test.ts +26 -0
- package/dist/templates/api/env.example +12 -0
- package/dist/templates/api/jest.config.js +23 -0
- package/dist/templates/api/jest.setup.js +9 -0
- package/dist/templates/api/package.json +62 -0
- package/dist/templates/api/prisma/schema.prisma +21 -0
- package/dist/templates/api/src/context.ts +23 -0
- package/dist/templates/api/src/controllers/UserController.ts +102 -0
- package/dist/templates/api/src/index.ts +14 -0
- package/dist/templates/api/src/lib/controller.ts +90 -0
- package/dist/templates/api/src/lib/middleware.ts +170 -0
- package/dist/templates/api/src/middleware/auth.ts +75 -0
- package/dist/templates/api/src/middleware/common.ts +103 -0
- package/dist/templates/api/src/router/index.ts +130 -0
- package/dist/templates/api/src/server.ts +50 -0
- package/dist/templates/api/src/trpc.ts +28 -0
- package/dist/templates/api/tsconfig.json +44 -0
- package/dist/templates/native/.yarnrc.yml +19 -0
- package/dist/templates/native/App.tsx +23 -0
- package/dist/templates/native/README.md +86 -0
- package/dist/templates/native/__tests__/App.test.tsx +156 -0
- package/dist/templates/native/__tests__/components.test.tsx +300 -0
- package/dist/templates/native/app.json +5 -0
- package/dist/templates/native/babel.config.js +10 -0
- package/dist/templates/native/index.js +6 -0
- package/dist/templates/native/jest.config.js +21 -0
- package/dist/templates/native/jest.setup.js +12 -0
- package/dist/templates/native/metro.config.js +27 -0
- package/dist/templates/native/package.json +44 -0
- package/dist/templates/native/src/App-with-trpc.tsx +59 -0
- package/dist/templates/native/src/utils/trpc.ts +127 -0
- package/dist/templates/native/tsconfig.json +30 -0
- package/dist/templates/shared/README.md +109 -0
- package/dist/templates/shared/__tests__/shared.test.ts +39 -0
- package/dist/templates/shared/jest.config.js +22 -0
- package/dist/templates/shared/package.json +50 -0
- package/dist/templates/shared/rollup.config.js +43 -0
- package/dist/templates/shared/src/index.ts +1 -0
- package/dist/templates/shared/tsconfig.json +25 -0
- package/dist/templates/web/README.md +90 -0
- package/dist/templates/web/__tests__/App.test.tsx +342 -0
- package/dist/templates/web/__tests__/components.test.tsx +564 -0
- package/dist/templates/web/index.html +13 -0
- package/dist/templates/web/jest.config.js +27 -0
- package/dist/templates/web/jest.setup.js +24 -0
- package/dist/templates/web/package.json +66 -0
- package/dist/templates/web/src/App-with-trpc.tsx +67 -0
- package/dist/templates/web/src/App.tsx +15 -0
- package/dist/templates/web/src/main.tsx +25 -0
- package/dist/templates/web/src/utils/trpc.ts +93 -0
- package/dist/templates/web/tsconfig.json +27 -0
- package/dist/templates/web/vite.config.ts +69 -0
- package/dist/templates/workspace/.devcontainer/devcontainer.json +140 -0
- package/dist/templates/workspace/.devcontainer/docker-compose.yml +74 -0
- package/dist/templates/workspace/.devcontainer/post-create.sh +89 -0
- package/dist/templates/workspace/.dockerignore +151 -0
- package/dist/templates/workspace/.env.example +36 -0
- package/dist/templates/workspace/.env.production +56 -0
- package/dist/templates/workspace/.yarnrc.yml +26 -0
- package/dist/templates/workspace/DOCKER.md +0 -0
- package/dist/templates/workspace/Dockerfile +93 -0
- package/dist/templates/workspace/README.md +179 -0
- package/dist/templates/workspace/docker/nginx/prod.conf +238 -0
- package/dist/templates/workspace/docker/nginx.conf +131 -0
- package/dist/templates/workspace/docker/postgres/init.sql +41 -0
- package/dist/templates/workspace/docker/prometheus/prometheus.yml +52 -0
- package/dist/templates/workspace/docker-compose.prod.yml +146 -0
- package/dist/templates/workspace/docker-compose.yml +144 -0
- package/dist/templates/workspace/jest.config.js +20 -0
- package/dist/templates/workspace/package.json +35 -0
- package/dist/templates/workspace/scripts/docker/db-backup.sh +230 -0
- package/dist/templates/workspace/scripts/docker/deploy.sh +212 -0
- package/dist/templates/workspace/scripts/docker-build.sh +151 -0
- package/dist/templates/workspace/scripts/test-runner.js +120 -0
- package/dist/templates/workspace/setup.sh +205 -0
- package/dist/types.js +2 -1
- package/package.json +3 -3
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
# PostgreSQL Database
|
|
5
|
+
postgres:
|
|
6
|
+
image: postgres:15-alpine
|
|
7
|
+
container_name: ${PROJECT_NAME:-idealyst}-postgres
|
|
8
|
+
environment:
|
|
9
|
+
POSTGRES_DB: ${POSTGRES_DB:-idealyst_db}
|
|
10
|
+
POSTGRES_USER: ${POSTGRES_USER:-postgres}
|
|
11
|
+
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
|
|
12
|
+
ports:
|
|
13
|
+
- "${POSTGRES_PORT:-5432}:5432"
|
|
14
|
+
volumes:
|
|
15
|
+
- postgres_data:/var/lib/postgresql/data
|
|
16
|
+
- ./docker/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql
|
|
17
|
+
healthcheck:
|
|
18
|
+
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres}"]
|
|
19
|
+
interval: 30s
|
|
20
|
+
timeout: 10s
|
|
21
|
+
retries: 5
|
|
22
|
+
networks:
|
|
23
|
+
- idealyst-network
|
|
24
|
+
|
|
25
|
+
# Redis Cache
|
|
26
|
+
redis:
|
|
27
|
+
image: redis:7-alpine
|
|
28
|
+
container_name: ${PROJECT_NAME:-idealyst}-redis
|
|
29
|
+
ports:
|
|
30
|
+
- "${REDIS_PORT:-6379}:6379"
|
|
31
|
+
volumes:
|
|
32
|
+
- redis_data:/data
|
|
33
|
+
healthcheck:
|
|
34
|
+
test: ["CMD", "redis-cli", "ping"]
|
|
35
|
+
interval: 30s
|
|
36
|
+
timeout: 10s
|
|
37
|
+
retries: 5
|
|
38
|
+
networks:
|
|
39
|
+
- idealyst-network
|
|
40
|
+
|
|
41
|
+
# API Service
|
|
42
|
+
api:
|
|
43
|
+
build:
|
|
44
|
+
context: .
|
|
45
|
+
dockerfile: Dockerfile
|
|
46
|
+
target: api-runner
|
|
47
|
+
container_name: ${PROJECT_NAME:-idealyst}-api
|
|
48
|
+
environment:
|
|
49
|
+
NODE_ENV: ${NODE_ENV:-production}
|
|
50
|
+
PORT: 3001
|
|
51
|
+
DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-idealyst_db}
|
|
52
|
+
REDIS_URL: redis://redis:6379
|
|
53
|
+
ports:
|
|
54
|
+
- "${API_PORT:-3001}:3001"
|
|
55
|
+
depends_on:
|
|
56
|
+
postgres:
|
|
57
|
+
condition: service_healthy
|
|
58
|
+
redis:
|
|
59
|
+
condition: service_healthy
|
|
60
|
+
volumes:
|
|
61
|
+
- ./uploads:/app/uploads
|
|
62
|
+
restart: unless-stopped
|
|
63
|
+
healthcheck:
|
|
64
|
+
test: ["CMD", "curl", "-f", "http://localhost:3001/health"]
|
|
65
|
+
interval: 30s
|
|
66
|
+
timeout: 10s
|
|
67
|
+
retries: 5
|
|
68
|
+
networks:
|
|
69
|
+
- idealyst-network
|
|
70
|
+
|
|
71
|
+
# Web Application
|
|
72
|
+
web:
|
|
73
|
+
build:
|
|
74
|
+
context: .
|
|
75
|
+
dockerfile: Dockerfile
|
|
76
|
+
target: web-runner
|
|
77
|
+
container_name: ${PROJECT_NAME:-idealyst}-web
|
|
78
|
+
ports:
|
|
79
|
+
- "${WEB_PORT:-80}:80"
|
|
80
|
+
depends_on:
|
|
81
|
+
- api
|
|
82
|
+
restart: unless-stopped
|
|
83
|
+
healthcheck:
|
|
84
|
+
test: ["CMD", "curl", "-f", "http://localhost"]
|
|
85
|
+
interval: 30s
|
|
86
|
+
timeout: 10s
|
|
87
|
+
retries: 5
|
|
88
|
+
networks:
|
|
89
|
+
- idealyst-network
|
|
90
|
+
|
|
91
|
+
# Development Service (for local development)
|
|
92
|
+
dev:
|
|
93
|
+
build:
|
|
94
|
+
context: .
|
|
95
|
+
dockerfile: Dockerfile
|
|
96
|
+
target: dev
|
|
97
|
+
container_name: ${PROJECT_NAME:-idealyst}-dev
|
|
98
|
+
environment:
|
|
99
|
+
NODE_ENV: development
|
|
100
|
+
ports:
|
|
101
|
+
- "3000:3000" # Web dev server
|
|
102
|
+
- "3001:3001" # API dev server
|
|
103
|
+
- "5173:5173" # Vite dev server
|
|
104
|
+
- "8080:8080" # Additional dev server
|
|
105
|
+
- "19006:19006" # Expo dev tools
|
|
106
|
+
volumes:
|
|
107
|
+
- .:/app
|
|
108
|
+
- /app/node_modules
|
|
109
|
+
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
110
|
+
depends_on:
|
|
111
|
+
postgres:
|
|
112
|
+
condition: service_healthy
|
|
113
|
+
redis:
|
|
114
|
+
condition: service_healthy
|
|
115
|
+
networks:
|
|
116
|
+
- idealyst-network
|
|
117
|
+
tty: true
|
|
118
|
+
stdin_open: true
|
|
119
|
+
|
|
120
|
+
# Test Runner
|
|
121
|
+
test:
|
|
122
|
+
build:
|
|
123
|
+
context: .
|
|
124
|
+
dockerfile: Dockerfile
|
|
125
|
+
target: test-runner
|
|
126
|
+
container_name: ${PROJECT_NAME:-idealyst}-test
|
|
127
|
+
environment:
|
|
128
|
+
NODE_ENV: test
|
|
129
|
+
CI: true
|
|
130
|
+
volumes:
|
|
131
|
+
- .:/app
|
|
132
|
+
- /app/node_modules
|
|
133
|
+
networks:
|
|
134
|
+
- idealyst-network
|
|
135
|
+
profiles:
|
|
136
|
+
- testing
|
|
137
|
+
|
|
138
|
+
volumes:
|
|
139
|
+
postgres_data:
|
|
140
|
+
redis_data:
|
|
141
|
+
|
|
142
|
+
networks:
|
|
143
|
+
idealyst-network:
|
|
144
|
+
driver: bridge
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** @type {import('jest').Config} */
|
|
2
|
+
module.exports = {
|
|
3
|
+
projects: [
|
|
4
|
+
'<rootDir>/packages/*/jest.config.js',
|
|
5
|
+
],
|
|
6
|
+
collectCoverage: true,
|
|
7
|
+
collectCoverageFrom: [
|
|
8
|
+
'packages/*/src/**/*.{ts,tsx}',
|
|
9
|
+
'!packages/*/src/**/*.d.ts',
|
|
10
|
+
'!packages/*/src/**/index.ts',
|
|
11
|
+
],
|
|
12
|
+
coverageDirectory: '<rootDir>/coverage',
|
|
13
|
+
coverageReporters: ['text', 'lcov', 'html'],
|
|
14
|
+
testTimeout: 30000,
|
|
15
|
+
// Ignore template files in node_modules
|
|
16
|
+
testPathIgnorePatterns: [
|
|
17
|
+
'/node_modules/',
|
|
18
|
+
'/templates/',
|
|
19
|
+
],
|
|
20
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{packageName}}",
|
|
3
|
+
"version": "{{version}}",
|
|
4
|
+
"description": "{{description}}",
|
|
5
|
+
"private": true,
|
|
6
|
+
"workspaces": [
|
|
7
|
+
"packages/*"
|
|
8
|
+
],
|
|
9
|
+
"packageManager": "yarn@4.1.0",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"test": "yarn workspaces foreach --include '@/*' run test",
|
|
12
|
+
"test:watch": "yarn workspaces foreach --include '@/*' run test:watch",
|
|
13
|
+
"test:coverage": "yarn workspaces foreach --include '@/*' run test:coverage",
|
|
14
|
+
"test:ci": "yarn workspaces foreach --include '@/*' --parallel run test --passWithNoTests",
|
|
15
|
+
"test:runner": "node scripts/test-runner.js",
|
|
16
|
+
"test:help": "node scripts/test-runner.js help",
|
|
17
|
+
"publish:all": "yarn workspaces foreach --include '@/*' npm publish",
|
|
18
|
+
"version:patch": "yarn workspaces foreach --include '@/*' version patch",
|
|
19
|
+
"version:minor": "yarn workspaces foreach --include '@/*' version minor",
|
|
20
|
+
"version:major": "yarn workspaces foreach --include '@/*' version major",
|
|
21
|
+
"build:all": "yarn workspaces foreach --include '@/*' run build",
|
|
22
|
+
"lint:all": "yarn workspaces foreach --include '@/*' run lint",
|
|
23
|
+
"type-check:all": "yarn workspaces foreach --include '@/*' run type-check"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@babel/core": "^7.28.0",
|
|
27
|
+
"@babel/preset-env": "^7.28.0",
|
|
28
|
+
"@babel/preset-react": "^7.27.1",
|
|
29
|
+
"@babel/preset-typescript": "^7.27.1",
|
|
30
|
+
"@types/jest": "^29.5.12",
|
|
31
|
+
"jest": "^29.7.0",
|
|
32
|
+
"ts-jest": "^29.1.2",
|
|
33
|
+
"typescript": "^5.0.0"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Database backup and restore script for Idealyst workspace
|
|
4
|
+
# Usage: ./scripts/docker/db-backup.sh [backup|restore] [filename]
|
|
5
|
+
|
|
6
|
+
set -e
|
|
7
|
+
|
|
8
|
+
COMMAND=${1:-backup}
|
|
9
|
+
FILENAME=${2:-"backup-$(date +%Y%m%d-%H%M%S).sql"}
|
|
10
|
+
PROJECT_NAME=${PROJECT_NAME:-idealyst}
|
|
11
|
+
|
|
12
|
+
# Source environment variables
|
|
13
|
+
if [ -f ".env" ]; then
|
|
14
|
+
source .env
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
POSTGRES_CONTAINER="${PROJECT_NAME}-postgres"
|
|
18
|
+
DATABASE=${POSTGRES_DB:-idealyst_db}
|
|
19
|
+
USERNAME=${POSTGRES_USER:-postgres}
|
|
20
|
+
|
|
21
|
+
echo "๐๏ธ Database Operations for Idealyst"
|
|
22
|
+
echo "===================================="
|
|
23
|
+
|
|
24
|
+
# Function to check if database container is running
|
|
25
|
+
check_database() {
|
|
26
|
+
if ! docker ps | grep -q "$POSTGRES_CONTAINER"; then
|
|
27
|
+
echo "โ Database container '$POSTGRES_CONTAINER' is not running"
|
|
28
|
+
echo "๐ก Start it with: docker-compose up -d postgres"
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
# Function to create backup
|
|
34
|
+
create_backup() {
|
|
35
|
+
local backup_file=$1
|
|
36
|
+
|
|
37
|
+
echo "๐ฆ Creating backup of database '$DATABASE'..."
|
|
38
|
+
echo "๐ Backup file: $backup_file"
|
|
39
|
+
|
|
40
|
+
# Create backups directory if it doesn't exist
|
|
41
|
+
mkdir -p backups
|
|
42
|
+
|
|
43
|
+
# Create the backup
|
|
44
|
+
docker exec "$POSTGRES_CONTAINER" pg_dump \
|
|
45
|
+
-U "$USERNAME" \
|
|
46
|
+
-d "$DATABASE" \
|
|
47
|
+
--clean \
|
|
48
|
+
--if-exists \
|
|
49
|
+
--create \
|
|
50
|
+
--verbose > "backups/$backup_file"
|
|
51
|
+
|
|
52
|
+
if [ $? -eq 0 ]; then
|
|
53
|
+
echo "โ
Backup created successfully: backups/$backup_file"
|
|
54
|
+
|
|
55
|
+
# Show backup info
|
|
56
|
+
local size=$(du -h "backups/$backup_file" | cut -f1)
|
|
57
|
+
echo "๐ Backup size: $size"
|
|
58
|
+
|
|
59
|
+
# Compress the backup
|
|
60
|
+
gzip "backups/$backup_file"
|
|
61
|
+
echo "๐๏ธ Backup compressed: backups/$backup_file.gz"
|
|
62
|
+
|
|
63
|
+
else
|
|
64
|
+
echo "โ Backup failed"
|
|
65
|
+
exit 1
|
|
66
|
+
fi
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
# Function to restore backup
|
|
70
|
+
restore_backup() {
|
|
71
|
+
local backup_file=$1
|
|
72
|
+
|
|
73
|
+
# Check if backup file exists
|
|
74
|
+
if [ ! -f "$backup_file" ]; then
|
|
75
|
+
# Try with .gz extension
|
|
76
|
+
if [ -f "$backup_file.gz" ]; then
|
|
77
|
+
echo "๐ฆ Found compressed backup, extracting..."
|
|
78
|
+
gunzip "$backup_file.gz"
|
|
79
|
+
else
|
|
80
|
+
echo "โ Backup file not found: $backup_file"
|
|
81
|
+
echo "๐ Available backups:"
|
|
82
|
+
ls -la backups/ 2>/dev/null || echo "No backups directory found"
|
|
83
|
+
exit 1
|
|
84
|
+
fi
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
echo "โ ๏ธ WARNING: This will replace the current database '$DATABASE'"
|
|
88
|
+
echo "๐ Restoring from: $backup_file"
|
|
89
|
+
|
|
90
|
+
read -p "Are you sure you want to continue? (y/N): " -n 1 -r
|
|
91
|
+
echo
|
|
92
|
+
|
|
93
|
+
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
94
|
+
echo "โ Restore cancelled"
|
|
95
|
+
exit 1
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
echo "๐ Restoring database..."
|
|
99
|
+
|
|
100
|
+
# Stop API container to prevent connections
|
|
101
|
+
echo "๐ Stopping API container..."
|
|
102
|
+
docker-compose stop api 2>/dev/null || true
|
|
103
|
+
|
|
104
|
+
# Wait a moment for connections to close
|
|
105
|
+
sleep 2
|
|
106
|
+
|
|
107
|
+
# Restore the backup
|
|
108
|
+
docker exec -i "$POSTGRES_CONTAINER" psql \
|
|
109
|
+
-U "$USERNAME" \
|
|
110
|
+
-d postgres < "$backup_file"
|
|
111
|
+
|
|
112
|
+
if [ $? -eq 0 ]; then
|
|
113
|
+
echo "โ
Database restored successfully"
|
|
114
|
+
|
|
115
|
+
# Restart API container
|
|
116
|
+
echo "๐ Restarting API container..."
|
|
117
|
+
docker-compose start api
|
|
118
|
+
|
|
119
|
+
else
|
|
120
|
+
echo "โ Restore failed"
|
|
121
|
+
echo "๐ Restarting API container..."
|
|
122
|
+
docker-compose start api
|
|
123
|
+
exit 1
|
|
124
|
+
fi
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
# Function to list backups
|
|
128
|
+
list_backups() {
|
|
129
|
+
echo "๐ Available backups:"
|
|
130
|
+
echo "===================="
|
|
131
|
+
|
|
132
|
+
if [ -d "backups" ]; then
|
|
133
|
+
ls -lah backups/ | grep -E '\.(sql|gz)$' || echo "No backup files found"
|
|
134
|
+
else
|
|
135
|
+
echo "No backups directory found"
|
|
136
|
+
fi
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
# Function to clean old backups
|
|
140
|
+
clean_backups() {
|
|
141
|
+
local days=${1:-7}
|
|
142
|
+
|
|
143
|
+
echo "๐งน Cleaning backups older than $days days..."
|
|
144
|
+
|
|
145
|
+
if [ -d "backups" ]; then
|
|
146
|
+
find backups/ -name "*.sql.gz" -mtime +$days -delete
|
|
147
|
+
find backups/ -name "*.sql" -mtime +$days -delete
|
|
148
|
+
echo "โ
Old backups cleaned"
|
|
149
|
+
else
|
|
150
|
+
echo "No backups directory found"
|
|
151
|
+
fi
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
# Function to show database info
|
|
155
|
+
show_db_info() {
|
|
156
|
+
echo "๐ Database Information:"
|
|
157
|
+
echo "======================="
|
|
158
|
+
echo "Container: $POSTGRES_CONTAINER"
|
|
159
|
+
echo "Database: $DATABASE"
|
|
160
|
+
echo "Username: $USERNAME"
|
|
161
|
+
echo ""
|
|
162
|
+
|
|
163
|
+
# Show database size
|
|
164
|
+
echo "๐๏ธ Database size:"
|
|
165
|
+
docker exec "$POSTGRES_CONTAINER" psql \
|
|
166
|
+
-U "$USERNAME" \
|
|
167
|
+
-d "$DATABASE" \
|
|
168
|
+
-c "SELECT pg_size_pretty(pg_database_size('$DATABASE')) as database_size;"
|
|
169
|
+
|
|
170
|
+
echo ""
|
|
171
|
+
echo "๐ Tables:"
|
|
172
|
+
docker exec "$POSTGRES_CONTAINER" psql \
|
|
173
|
+
-U "$USERNAME" \
|
|
174
|
+
-d "$DATABASE" \
|
|
175
|
+
-c "\dt"
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
# Main script logic
|
|
179
|
+
main() {
|
|
180
|
+
case $COMMAND in
|
|
181
|
+
"backup")
|
|
182
|
+
check_database
|
|
183
|
+
create_backup "$FILENAME"
|
|
184
|
+
;;
|
|
185
|
+
|
|
186
|
+
"restore")
|
|
187
|
+
check_database
|
|
188
|
+
if [ -z "$FILENAME" ]; then
|
|
189
|
+
echo "โ Please specify a backup file to restore"
|
|
190
|
+
echo "Usage: $0 restore <backup-file>"
|
|
191
|
+
exit 1
|
|
192
|
+
fi
|
|
193
|
+
restore_backup "$FILENAME"
|
|
194
|
+
;;
|
|
195
|
+
|
|
196
|
+
"list")
|
|
197
|
+
list_backups
|
|
198
|
+
;;
|
|
199
|
+
|
|
200
|
+
"clean")
|
|
201
|
+
local days=${FILENAME:-7}
|
|
202
|
+
clean_backups "$days"
|
|
203
|
+
;;
|
|
204
|
+
|
|
205
|
+
"info")
|
|
206
|
+
check_database
|
|
207
|
+
show_db_info
|
|
208
|
+
;;
|
|
209
|
+
|
|
210
|
+
*)
|
|
211
|
+
echo "Usage: $0 [backup|restore|list|clean|info] [filename|days]"
|
|
212
|
+
echo ""
|
|
213
|
+
echo "Commands:"
|
|
214
|
+
echo " backup [filename] - Create a database backup"
|
|
215
|
+
echo " restore <filename> - Restore from a backup file"
|
|
216
|
+
echo " list - List available backups"
|
|
217
|
+
echo " clean [days] - Clean backups older than N days (default: 7)"
|
|
218
|
+
echo " info - Show database information"
|
|
219
|
+
echo ""
|
|
220
|
+
echo "Examples:"
|
|
221
|
+
echo " $0 backup"
|
|
222
|
+
echo " $0 backup my-backup.sql"
|
|
223
|
+
echo " $0 restore backups/backup-20240101-120000.sql"
|
|
224
|
+
echo " $0 clean 30"
|
|
225
|
+
exit 1
|
|
226
|
+
;;
|
|
227
|
+
esac
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
main
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Docker deployment script for Idealyst workspace
|
|
4
|
+
# Usage: ./scripts/docker/deploy.sh [environment]
|
|
5
|
+
|
|
6
|
+
set -e
|
|
7
|
+
|
|
8
|
+
ENVIRONMENT=${1:-production}
|
|
9
|
+
PROJECT_NAME=${PROJECT_NAME:-idealyst}
|
|
10
|
+
|
|
11
|
+
echo "๐ Deploying Idealyst to $ENVIRONMENT environment..."
|
|
12
|
+
|
|
13
|
+
# Validate environment
|
|
14
|
+
if [[ ! "$ENVIRONMENT" =~ ^(development|staging|production)$ ]]; then
|
|
15
|
+
echo "โ Invalid environment. Use: development, staging, or production"
|
|
16
|
+
exit 1
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
# Check if required files exist
|
|
20
|
+
if [ ! -f "docker-compose.yml" ]; then
|
|
21
|
+
echo "โ docker-compose.yml not found. Run this script from the project root."
|
|
22
|
+
exit 1
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
if [ ! -f ".env" ]; then
|
|
26
|
+
echo "โ ๏ธ .env file not found. Creating from .env.example..."
|
|
27
|
+
cp .env.example .env
|
|
28
|
+
echo "๐ Please edit .env with your configuration before proceeding."
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
# Source environment variables
|
|
33
|
+
source .env
|
|
34
|
+
|
|
35
|
+
# Function to wait for service health
|
|
36
|
+
wait_for_service() {
|
|
37
|
+
local service=$1
|
|
38
|
+
local max_attempts=30
|
|
39
|
+
local attempt=1
|
|
40
|
+
|
|
41
|
+
echo "โณ Waiting for $service to be healthy..."
|
|
42
|
+
|
|
43
|
+
while [ $attempt -le $max_attempts ]; do
|
|
44
|
+
if docker-compose ps $service | grep -q "healthy\|Up"; then
|
|
45
|
+
echo "โ
$service is ready"
|
|
46
|
+
return 0
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
echo "๐ Attempt $attempt/$max_attempts - waiting for $service..."
|
|
50
|
+
sleep 10
|
|
51
|
+
attempt=$((attempt + 1))
|
|
52
|
+
done
|
|
53
|
+
|
|
54
|
+
echo "โ $service failed to become healthy"
|
|
55
|
+
return 1
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
# Function to run database migrations
|
|
59
|
+
run_migrations() {
|
|
60
|
+
echo "๐๏ธ Running database migrations..."
|
|
61
|
+
|
|
62
|
+
# Check if any package has Prisma schema
|
|
63
|
+
for package_dir in packages/*/; do
|
|
64
|
+
if [ -f "${package_dir}prisma/schema.prisma" ]; then
|
|
65
|
+
echo "๐ฆ Running migrations for $(basename "$package_dir")..."
|
|
66
|
+
docker-compose exec api yarn workspace $(basename "$package_dir") prisma migrate deploy
|
|
67
|
+
fi
|
|
68
|
+
done
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
# Function to build and deploy
|
|
72
|
+
deploy() {
|
|
73
|
+
case $ENVIRONMENT in
|
|
74
|
+
"development")
|
|
75
|
+
echo "๐ง Starting development environment..."
|
|
76
|
+
docker-compose up --build -d postgres redis
|
|
77
|
+
wait_for_service postgres
|
|
78
|
+
wait_for_service redis
|
|
79
|
+
docker-compose up --build -d dev
|
|
80
|
+
;;
|
|
81
|
+
|
|
82
|
+
"staging"|"production")
|
|
83
|
+
echo "๐๏ธ Building application..."
|
|
84
|
+
docker-compose build --no-cache
|
|
85
|
+
|
|
86
|
+
if [ "$ENVIRONMENT" = "production" ]; then
|
|
87
|
+
echo "๐ Deploying to production..."
|
|
88
|
+
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d postgres redis
|
|
89
|
+
else
|
|
90
|
+
echo "๐งช Deploying to staging..."
|
|
91
|
+
docker-compose up -d postgres redis
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
wait_for_service postgres
|
|
95
|
+
wait_for_service redis
|
|
96
|
+
|
|
97
|
+
# Run migrations
|
|
98
|
+
run_migrations
|
|
99
|
+
|
|
100
|
+
if [ "$ENVIRONMENT" = "production" ]; then
|
|
101
|
+
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d api web nginx
|
|
102
|
+
else
|
|
103
|
+
docker-compose up -d api web
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
wait_for_service api
|
|
107
|
+
wait_for_service web
|
|
108
|
+
;;
|
|
109
|
+
esac
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
# Function to show deployment status
|
|
113
|
+
show_status() {
|
|
114
|
+
echo ""
|
|
115
|
+
echo "๐ Deployment Status:"
|
|
116
|
+
echo "===================="
|
|
117
|
+
docker-compose ps
|
|
118
|
+
|
|
119
|
+
echo ""
|
|
120
|
+
echo "๐ Service URLs:"
|
|
121
|
+
echo "==============="
|
|
122
|
+
|
|
123
|
+
if [ "$ENVIRONMENT" = "development" ]; then
|
|
124
|
+
echo "Web App (Dev): http://localhost:3000"
|
|
125
|
+
echo "API (Dev): http://localhost:3001"
|
|
126
|
+
echo "Database: postgresql://postgres:postgres@localhost:5432/${POSTGRES_DB}"
|
|
127
|
+
echo "Redis: redis://localhost:6379"
|
|
128
|
+
else
|
|
129
|
+
echo "Web App: http://localhost:${WEB_PORT:-80}"
|
|
130
|
+
echo "API: http://localhost:${API_PORT:-3001}"
|
|
131
|
+
|
|
132
|
+
if [ "$ENVIRONMENT" = "production" ]; then
|
|
133
|
+
echo "Nginx: http://localhost"
|
|
134
|
+
echo "Monitoring: http://localhost:3002 (Grafana)"
|
|
135
|
+
echo "Metrics: http://localhost:9090 (Prometheus)"
|
|
136
|
+
fi
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
echo ""
|
|
140
|
+
echo "๐ Logs:"
|
|
141
|
+
echo "========"
|
|
142
|
+
echo "View logs: docker-compose logs -f [service]"
|
|
143
|
+
echo "Available services: $(docker-compose config --services | tr '\n' ' ')"
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
# Function to run tests
|
|
147
|
+
run_tests() {
|
|
148
|
+
echo "๐งช Running tests..."
|
|
149
|
+
docker-compose --profile testing run --rm test
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
# Main deployment process
|
|
153
|
+
main() {
|
|
154
|
+
echo "๐๏ธ Environment: $ENVIRONMENT"
|
|
155
|
+
echo "๐ฆ Project: $PROJECT_NAME"
|
|
156
|
+
echo ""
|
|
157
|
+
|
|
158
|
+
# Stop existing containers
|
|
159
|
+
echo "๐ Stopping existing containers..."
|
|
160
|
+
docker-compose down
|
|
161
|
+
|
|
162
|
+
# Clean up orphaned containers
|
|
163
|
+
docker-compose down --remove-orphans
|
|
164
|
+
|
|
165
|
+
# Deploy
|
|
166
|
+
deploy
|
|
167
|
+
|
|
168
|
+
# Show status
|
|
169
|
+
show_status
|
|
170
|
+
|
|
171
|
+
echo ""
|
|
172
|
+
echo "โ
Deployment complete!"
|
|
173
|
+
echo ""
|
|
174
|
+
echo "๐ก Useful commands:"
|
|
175
|
+
echo " View logs: docker-compose logs -f"
|
|
176
|
+
echo " Stop services: docker-compose down"
|
|
177
|
+
echo " Restart service: docker-compose restart [service]"
|
|
178
|
+
echo " Run tests: ./scripts/docker/deploy.sh test"
|
|
179
|
+
echo ""
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
# Handle special commands
|
|
183
|
+
case $ENVIRONMENT in
|
|
184
|
+
"test")
|
|
185
|
+
run_tests
|
|
186
|
+
exit 0
|
|
187
|
+
;;
|
|
188
|
+
"status")
|
|
189
|
+
show_status
|
|
190
|
+
exit 0
|
|
191
|
+
;;
|
|
192
|
+
"logs")
|
|
193
|
+
docker-compose logs -f
|
|
194
|
+
exit 0
|
|
195
|
+
;;
|
|
196
|
+
"stop")
|
|
197
|
+
echo "๐ Stopping all services..."
|
|
198
|
+
docker-compose down
|
|
199
|
+
echo "โ
All services stopped"
|
|
200
|
+
exit 0
|
|
201
|
+
;;
|
|
202
|
+
"clean")
|
|
203
|
+
echo "๐งน Cleaning up Docker resources..."
|
|
204
|
+
docker-compose down -v --remove-orphans
|
|
205
|
+
docker system prune -f
|
|
206
|
+
echo "โ
Cleanup complete"
|
|
207
|
+
exit 0
|
|
208
|
+
;;
|
|
209
|
+
esac
|
|
210
|
+
|
|
211
|
+
# Run main deployment
|
|
212
|
+
main
|