@idealyst/cli 1.0.40 โ 1.0.43
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 +1 -2
- package/dist/generators/api.js.map +1 -1
- package/dist/generators/database.js +1 -2
- package/dist/generators/database.js.map +1 -1
- package/dist/generators/fullstack.js +371 -0
- package/dist/generators/fullstack.js.map +1 -0
- package/dist/generators/index.js +5 -0
- package/dist/generators/index.js.map +1 -1
- package/dist/generators/native.js +2 -1
- package/dist/generators/native.js.map +1 -1
- package/dist/generators/shared.js +1 -2
- package/dist/generators/shared.js.map +1 -1
- package/dist/generators/utils.js +71 -7
- package/dist/generators/utils.js.map +1 -1
- package/dist/generators/web.js +1 -2
- package/dist/generators/web.js.map +1 -1
- package/dist/generators/workspace.js +56 -2
- package/dist/generators/workspace.js.map +1 -1
- package/dist/index.js +50 -2
- package/dist/index.js.map +1 -1
- package/dist/templates/database/.env.example +1 -8
- package/dist/templates/database/README.md +29 -74
- package/dist/templates/database/package.json +20 -34
- package/dist/templates/database/prisma/seed.ts +11 -11
- package/dist/templates/database/schema.prisma +97 -0
- package/dist/templates/database/src/index.ts +12 -8
- package/dist/templates/database/src/validators.ts +10 -0
- package/dist/templates/database/tsconfig.json +9 -23
- package/dist/templates/native/src/App-with-trpc-and-shared.tsx +266 -0
- package/dist/templates/shared/package.json +28 -3
- package/dist/templates/shared/src/components/index.ts +392 -0
- package/dist/templates/shared/src/index.ts +59 -1
- package/dist/templates/shared/src/types/index.ts +148 -0
- package/dist/templates/shared/src/utils/index.ts +278 -0
- package/dist/templates/web/package.json +2 -2
- package/dist/templates/web/src/App-with-trpc-and-shared.tsx +304 -0
- package/dist/templates/workspace/.devcontainer/Dockerfile +1 -1
- package/dist/templates/workspace/.devcontainer/devcontainer.json +7 -2
- package/dist/templates/workspace/.devcontainer/docker-compose.yml +14 -0
- package/dist/templates/workspace/.devcontainer/figma-mcp.sh +32 -0
- package/dist/templates/workspace/.devcontainer/setup.sh +3 -0
- package/dist/templates/workspace/setup.sh +22 -197
- package/dist/templates/workspace/tsconfig.json +32 -0
- package/dist/types/generators/fullstack.d.ts +2 -0
- package/dist/types/generators/index.d.ts +1 -0
- package/dist/types/generators/utils.d.ts +4 -1
- package/dist/types/types.d.ts +3 -1
- package/package.json +1 -1
- package/templates/database/.env.example +1 -8
- package/templates/database/README.md +29 -74
- package/templates/database/package.json +20 -34
- package/templates/database/prisma/seed.ts +11 -11
- package/templates/database/schema.prisma +97 -0
- package/templates/database/src/index.ts +12 -8
- package/templates/database/src/validators.ts +10 -0
- package/templates/database/tsconfig.json +9 -23
- package/templates/native/src/App-with-trpc-and-shared.tsx +266 -0
- package/templates/shared/package.json +28 -3
- package/templates/shared/src/components/index.ts +392 -0
- package/templates/shared/src/index.ts +59 -1
- package/templates/shared/src/types/index.ts +148 -0
- package/templates/shared/src/utils/index.ts +278 -0
- package/templates/web/package.json +1 -1
- package/templates/web/src/App-with-trpc-and-shared.tsx +304 -0
- package/templates/workspace/.devcontainer/devcontainer.json +7 -2
- package/templates/workspace/.devcontainer/docker-compose.yml +14 -0
- package/templates/workspace/.devcontainer/figma-mcp.sh +32 -0
- package/templates/workspace/.devcontainer/setup.sh +3 -0
- package/templates/workspace/setup.sh +22 -197
- package/templates/workspace/tsconfig.json +32 -0
- package/dist/templates/database/__tests__/database.test.ts +0 -14
- package/dist/templates/database/jest.config.js +0 -19
- package/dist/templates/database/jest.setup.js +0 -11
- package/dist/templates/database/prisma/schema.prisma +0 -21
- package/dist/templates/database/src/client.ts +0 -18
- package/dist/templates/database/src/schemas.ts +0 -26
- package/dist/templates/workspace/scripts/docker/db-backup.sh +0 -230
- package/dist/templates/workspace/scripts/docker/deploy.sh +0 -212
- package/dist/templates/workspace/scripts/test-runner.js +0 -120
- package/templates/database/__tests__/database.test.ts +0 -14
- package/templates/database/jest.config.js +0 -19
- package/templates/database/jest.setup.js +0 -11
- package/templates/database/prisma/schema.prisma +0 -21
- package/templates/database/src/client.ts +0 -18
- package/templates/database/src/schemas.ts +0 -26
- package/templates/workspace/scripts/docker/db-backup.sh +0 -230
- package/templates/workspace/scripts/docker/deploy.sh +0 -212
- package/templates/workspace/scripts/docker-build.sh +0 -151
- package/templates/workspace/scripts/test-runner.js +0 -120
|
@@ -1,205 +1,30 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
|
|
3
|
-
#
|
|
4
|
-
#
|
|
3
|
+
# Idealyst Framework Workspace Setup Script
|
|
4
|
+
# This script sets up the development environment for your workspace
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
echo "๐๏ธ Setting up Idealyst Framework workspace..."
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
# Install dependencies
|
|
9
|
+
echo "๐ฆ Installing dependencies..."
|
|
10
|
+
yarn install
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
echo "
|
|
13
|
-
|
|
14
|
-
echo ""
|
|
15
|
-
|
|
16
|
-
# Function to generate random password
|
|
17
|
-
generate_password() {
|
|
18
|
-
openssl rand -base64 32 | tr -d "=+/" | cut -c1-25
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
# Function to generate JWT secret
|
|
22
|
-
generate_jwt_secret() {
|
|
23
|
-
openssl rand -base64 64 | tr -d "=+/" | cut -c1-50
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
# Function to setup development environment
|
|
27
|
-
setup_development() {
|
|
28
|
-
echo "๐ง Setting up development environment..."
|
|
29
|
-
|
|
30
|
-
if [ ! -f ".env" ]; then
|
|
31
|
-
echo "๐ Creating .env from template..."
|
|
32
|
-
cp .env.example .env
|
|
33
|
-
echo "โ
Created .env file"
|
|
34
|
-
else
|
|
35
|
-
echo "โ ๏ธ .env file already exists, skipping..."
|
|
36
|
-
fi
|
|
37
|
-
|
|
38
|
-
echo ""
|
|
39
|
-
echo "๐ณ Starting development containers..."
|
|
40
|
-
if command -v docker-compose &> /dev/null; then
|
|
41
|
-
docker-compose up -d postgres redis
|
|
42
|
-
echo "โ
Database and Redis started"
|
|
43
|
-
|
|
44
|
-
echo "โณ Waiting for services to be ready..."
|
|
45
|
-
sleep 10
|
|
46
|
-
|
|
47
|
-
echo "๐ Starting development environment..."
|
|
48
|
-
echo "๐ก You can now:"
|
|
49
|
-
echo " - Run 'docker-compose up -d dev' for full dev container"
|
|
50
|
-
echo " - Run 'yarn dev' for local development"
|
|
51
|
-
echo " - Open in VS Code and select 'Reopen in Container'"
|
|
52
|
-
else
|
|
53
|
-
echo "โ Docker Compose not found. Please install Docker and Docker Compose."
|
|
54
|
-
exit 1
|
|
55
|
-
fi
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
# Function to setup production environment
|
|
59
|
-
setup_production() {
|
|
60
|
-
echo "๐ญ Setting up production environment..."
|
|
61
|
-
|
|
62
|
-
if [ ! -f ".env" ]; then
|
|
63
|
-
echo "๐ Creating .env from production template..."
|
|
64
|
-
cp .env.production .env
|
|
65
|
-
|
|
66
|
-
# Generate secure passwords and secrets
|
|
67
|
-
echo "๐ Generating secure credentials..."
|
|
68
|
-
|
|
69
|
-
DB_PASSWORD=$(generate_password)
|
|
70
|
-
JWT_SECRET=$(generate_jwt_secret)
|
|
71
|
-
SESSION_SECRET=$(generate_jwt_secret)
|
|
72
|
-
ENCRYPTION_KEY=$(openssl rand -base64 32 | cut -c1-32)
|
|
73
|
-
GRAFANA_PASSWORD=$(generate_password)
|
|
74
|
-
|
|
75
|
-
# Replace placeholders in .env file
|
|
76
|
-
sed -i "s/CHANGE_THIS_STRONG_PASSWORD/$DB_PASSWORD/g" .env
|
|
77
|
-
sed -i "s/CHANGE_THIS_VERY_STRONG_JWT_SECRET_MINIMUM_32_CHARACTERS/$JWT_SECRET/g" .env
|
|
78
|
-
sed -i "s/CHANGE_THIS_VERY_STRONG_SESSION_SECRET/$SESSION_SECRET/g" .env
|
|
79
|
-
sed -i "s/CHANGE_THIS_32_CHARACTER_ENCRYPTION_KEY/$ENCRYPTION_KEY/g" .env
|
|
80
|
-
sed -i "s/CHANGE_THIS_STRONG_PASSWORD/$GRAFANA_PASSWORD/g" .env
|
|
81
|
-
|
|
82
|
-
echo "โ
Created .env with secure credentials"
|
|
83
|
-
echo ""
|
|
84
|
-
echo "๐ Generated Credentials (save these securely!):"
|
|
85
|
-
echo " Database Password: $DB_PASSWORD"
|
|
86
|
-
echo " JWT Secret: $JWT_SECRET"
|
|
87
|
-
echo " Grafana Password: $GRAFANA_PASSWORD"
|
|
88
|
-
echo ""
|
|
89
|
-
echo "โ ๏ธ IMPORTANT: Edit .env to configure your domain and other settings!"
|
|
90
|
-
|
|
91
|
-
else
|
|
92
|
-
echo "โ ๏ธ .env file already exists. Please verify production settings."
|
|
93
|
-
fi
|
|
94
|
-
|
|
95
|
-
echo ""
|
|
96
|
-
echo "๐ Production Checklist:"
|
|
97
|
-
echo " [ ] Edit .env with your domain name"
|
|
98
|
-
echo " [ ] Configure SSL certificates"
|
|
99
|
-
echo " [ ] Set up DNS records"
|
|
100
|
-
echo " [ ] Configure firewall rules"
|
|
101
|
-
echo " [ ] Set up monitoring (optional)"
|
|
102
|
-
echo ""
|
|
103
|
-
echo "๐ Deploy with: ./scripts/docker/deploy.sh production"
|
|
104
|
-
}
|
|
12
|
+
# Build all packages
|
|
13
|
+
echo "๐จ Building packages..."
|
|
14
|
+
yarn build:packages
|
|
105
15
|
|
|
106
|
-
#
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
# Check Docker
|
|
111
|
-
if ! command -v docker &> /dev/null; then
|
|
112
|
-
echo "โ Docker not found. Please install Docker."
|
|
113
|
-
exit 1
|
|
114
|
-
fi
|
|
115
|
-
|
|
116
|
-
# Check Docker Compose
|
|
117
|
-
if ! command -v docker-compose &> /dev/null; then
|
|
118
|
-
echo "โ Docker Compose not found. Please install Docker Compose."
|
|
119
|
-
exit 1
|
|
120
|
-
fi
|
|
121
|
-
|
|
122
|
-
# Check if Docker is running
|
|
123
|
-
if ! docker info &> /dev/null; then
|
|
124
|
-
echo "โ Docker is not running. Please start Docker."
|
|
125
|
-
exit 1
|
|
126
|
-
fi
|
|
127
|
-
|
|
128
|
-
echo "โ
Prerequisites check passed"
|
|
129
|
-
echo ""
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
# Function to show post-setup instructions
|
|
133
|
-
show_instructions() {
|
|
134
|
-
echo ""
|
|
135
|
-
echo "๐ Setup complete!"
|
|
136
|
-
echo ""
|
|
137
|
-
echo "Next steps:"
|
|
138
|
-
|
|
139
|
-
if [ "$ENVIRONMENT" = "development" ]; then
|
|
140
|
-
echo " 1. Install dependencies: yarn install"
|
|
141
|
-
echo " 2. Start development:"
|
|
142
|
-
echo " - Full container: docker-compose up -d dev"
|
|
143
|
-
echo " - VS Code: Open in Container"
|
|
144
|
-
echo " - Local: yarn dev"
|
|
145
|
-
echo " 3. Access your app:"
|
|
146
|
-
echo " - Web: http://localhost:3000"
|
|
147
|
-
echo " - API: http://localhost:3001"
|
|
148
|
-
echo " - Database: postgresql://postgres:postgres@localhost:5432/idealyst_db"
|
|
149
|
-
else
|
|
150
|
-
echo " 1. Edit .env with your production settings"
|
|
151
|
-
echo " 2. Configure SSL certificates"
|
|
152
|
-
echo " 3. Deploy: ./scripts/docker/deploy.sh production"
|
|
153
|
-
echo " 4. Set up monitoring (optional)"
|
|
154
|
-
fi
|
|
155
|
-
|
|
156
|
-
echo ""
|
|
157
|
-
echo "๐ Documentation:"
|
|
158
|
-
echo " - DOCKER.md - Complete Docker guide"
|
|
159
|
-
echo " - TESTING.md - Testing documentation"
|
|
160
|
-
echo " - README.md - General workspace info"
|
|
161
|
-
echo ""
|
|
162
|
-
echo "๐ Need help? Check the documentation or run:"
|
|
163
|
-
echo " ./scripts/docker/deploy.sh --help"
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
# Main setup process
|
|
167
|
-
main() {
|
|
168
|
-
check_prerequisites
|
|
169
|
-
|
|
170
|
-
case $ENVIRONMENT in
|
|
171
|
-
"development"|"dev")
|
|
172
|
-
setup_development
|
|
173
|
-
;;
|
|
174
|
-
"production"|"prod")
|
|
175
|
-
setup_production
|
|
176
|
-
;;
|
|
177
|
-
*)
|
|
178
|
-
echo "โ Invalid environment. Use 'development' or 'production'"
|
|
179
|
-
echo "Usage: $0 [development|production]"
|
|
180
|
-
exit 1
|
|
181
|
-
;;
|
|
182
|
-
esac
|
|
183
|
-
|
|
184
|
-
show_instructions
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
# Handle help
|
|
188
|
-
if [[ "$1" == "--help" ]] || [[ "$1" == "-h" ]] || [[ "$1" == "help" ]]; then
|
|
189
|
-
echo "Idealyst Workspace Setup Script"
|
|
190
|
-
echo ""
|
|
191
|
-
echo "Usage: $0 [environment]"
|
|
192
|
-
echo ""
|
|
193
|
-
echo "Environments:"
|
|
194
|
-
echo " development (default) - Set up for local development"
|
|
195
|
-
echo " production - Set up for production deployment"
|
|
196
|
-
echo ""
|
|
197
|
-
echo "Examples:"
|
|
198
|
-
echo " $0 # Development setup"
|
|
199
|
-
echo " $0 development # Development setup"
|
|
200
|
-
echo " $0 production # Production setup"
|
|
201
|
-
echo ""
|
|
202
|
-
exit 0
|
|
16
|
+
# Set up git hooks (if using husky)
|
|
17
|
+
if [ -f "package.json" ] && grep -q "husky" package.json; then
|
|
18
|
+
echo "๐ช Setting up git hooks..."
|
|
19
|
+
yarn prepare
|
|
203
20
|
fi
|
|
204
21
|
|
|
205
|
-
|
|
22
|
+
echo "โ
Workspace setup complete!"
|
|
23
|
+
echo ""
|
|
24
|
+
echo "๐ Quick start:"
|
|
25
|
+
echo " โข Run 'yarn dev' to start development mode"
|
|
26
|
+
echo " โข Run 'yarn build' to build all packages"
|
|
27
|
+
echo " โข Run 'yarn test' to run tests"
|
|
28
|
+
echo " โข Use 'idealyst create <type> <name>' to add new projects"
|
|
29
|
+
echo ""
|
|
30
|
+
echo "๐ Check README.md and DOCKER.md for more information."
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"lib": ["ES2020"],
|
|
5
|
+
"module": "commonjs",
|
|
6
|
+
"moduleResolution": "node",
|
|
7
|
+
"esModuleInterop": true,
|
|
8
|
+
"allowSyntheticDefaultImports": true,
|
|
9
|
+
"strict": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"forceConsistentCasingInFileNames": true,
|
|
12
|
+
"declaration": true,
|
|
13
|
+
"declarationMap": true,
|
|
14
|
+
"sourceMap": true,
|
|
15
|
+
"outDir": "./dist",
|
|
16
|
+
"rootDir": "./src"
|
|
17
|
+
},
|
|
18
|
+
"include": [
|
|
19
|
+
"packages/*/src/**/*"
|
|
20
|
+
],
|
|
21
|
+
"exclude": [
|
|
22
|
+
"node_modules",
|
|
23
|
+
"dist",
|
|
24
|
+
"**/*.test.ts",
|
|
25
|
+
"**/*.spec.ts"
|
|
26
|
+
],
|
|
27
|
+
"references": [
|
|
28
|
+
{
|
|
29
|
+
"path": "./packages/*"
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from '@jest/globals';
|
|
2
|
-
import { db } from '../src';
|
|
3
|
-
|
|
4
|
-
describe('Database', () => {
|
|
5
|
-
it('should export database client', () => {
|
|
6
|
-
expect(db).toBeDefined();
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
it('should connect to database', async () => {
|
|
10
|
-
// This is a basic connection test
|
|
11
|
-
// Add your own model-specific tests here
|
|
12
|
-
expect(db.$connect).toBeDefined();
|
|
13
|
-
});
|
|
14
|
-
});
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
preset: 'ts-jest',
|
|
3
|
-
testEnvironment: 'node',
|
|
4
|
-
collectCoverageFrom: [
|
|
5
|
-
'src/**/*.{ts,tsx}',
|
|
6
|
-
'!src/**/*.d.ts',
|
|
7
|
-
],
|
|
8
|
-
testMatch: [
|
|
9
|
-
'**/__tests__/**/*.test.{ts,tsx}',
|
|
10
|
-
],
|
|
11
|
-
setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
|
|
12
|
-
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
|
|
13
|
-
transform: {
|
|
14
|
-
'^.+\\.(ts|tsx)$': 'ts-jest',
|
|
15
|
-
},
|
|
16
|
-
moduleNameMapping: {
|
|
17
|
-
'^@/(.*)$': '<rootDir>/src/$1',
|
|
18
|
-
},
|
|
19
|
-
};
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// Global test setup
|
|
2
|
-
import { beforeEach, afterEach } from '@jest/globals';
|
|
3
|
-
|
|
4
|
-
// Mock environment variables for testing
|
|
5
|
-
process.env.NODE_ENV = 'test';
|
|
6
|
-
process.env.DATABASE_URL = 'file:./test.db';
|
|
7
|
-
|
|
8
|
-
// Clean up after each test
|
|
9
|
-
afterEach(async () => {
|
|
10
|
-
// Add any cleanup logic here
|
|
11
|
-
});
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// This is your Prisma schema file,
|
|
2
|
-
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
|
3
|
-
|
|
4
|
-
generator client {
|
|
5
|
-
provider = "prisma-client-js"
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
datasource db {
|
|
9
|
-
provider = "sqlite"
|
|
10
|
-
url = env("DATABASE_URL")
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
// Add your models here
|
|
14
|
-
// Example:
|
|
15
|
-
// model User {
|
|
16
|
-
// id String @id @default(cuid())
|
|
17
|
-
// email String @unique
|
|
18
|
-
// name String?
|
|
19
|
-
// createdAt DateTime @default(now())
|
|
20
|
-
// updatedAt DateTime @updatedAt
|
|
21
|
-
// }
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { PrismaClient } from '@prisma/client';
|
|
2
|
-
|
|
3
|
-
declare global {
|
|
4
|
-
// Prevent multiple instances of Prisma Client in development
|
|
5
|
-
var __globalPrisma: PrismaClient | undefined;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
const prisma =
|
|
9
|
-
globalThis.__globalPrisma ??
|
|
10
|
-
new PrismaClient({
|
|
11
|
-
log: ['query', 'error', 'warn'],
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
15
|
-
globalThis.__globalPrisma = prisma;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export default prisma;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
|
|
3
|
-
// Add your Zod schemas here to match your Prisma models
|
|
4
|
-
// Example:
|
|
5
|
-
// export const UserSchema = z.object({
|
|
6
|
-
// id: z.string().cuid(),
|
|
7
|
-
// email: z.string().email(),
|
|
8
|
-
// name: z.string().optional(),
|
|
9
|
-
// createdAt: z.date(),
|
|
10
|
-
// updatedAt: z.date(),
|
|
11
|
-
// });
|
|
12
|
-
|
|
13
|
-
// export const CreateUserSchema = UserSchema.omit({
|
|
14
|
-
// id: true,
|
|
15
|
-
// createdAt: true,
|
|
16
|
-
// updatedAt: true,
|
|
17
|
-
// });
|
|
18
|
-
|
|
19
|
-
// export const UpdateUserSchema = CreateUserSchema.partial();
|
|
20
|
-
|
|
21
|
-
// Export all your schemas
|
|
22
|
-
export const schemas = {
|
|
23
|
-
// user: UserSchema,
|
|
24
|
-
// createUser: CreateUserSchema,
|
|
25
|
-
// updateUser: UpdateUserSchema,
|
|
26
|
-
} as const;
|
|
@@ -1,230 +0,0 @@
|
|
|
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
|