@aifabrix/builder 2.1.7 → 2.2.0
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/lib/app-deploy.js +73 -29
- package/lib/app-list.js +132 -0
- package/lib/app-readme.js +11 -4
- package/lib/app-register.js +435 -0
- package/lib/app-rotate-secret.js +164 -0
- package/lib/app-run.js +98 -84
- package/lib/app.js +13 -0
- package/lib/audit-logger.js +195 -15
- package/lib/build.js +57 -37
- package/lib/cli.js +90 -8
- package/lib/commands/app.js +8 -391
- package/lib/commands/login.js +130 -36
- package/lib/config.js +257 -4
- package/lib/deployer.js +221 -183
- package/lib/infra.js +177 -112
- package/lib/secrets.js +17 -0
- package/lib/utils/api-error-handler.js +465 -0
- package/lib/utils/api.js +165 -16
- package/lib/utils/auth-headers.js +84 -0
- package/lib/utils/build-copy.js +144 -0
- package/lib/utils/cli-utils.js +21 -0
- package/lib/utils/compose-generator.js +43 -14
- package/lib/utils/deployment-errors.js +90 -0
- package/lib/utils/deployment-validation.js +60 -0
- package/lib/utils/dev-config.js +83 -0
- package/lib/utils/env-template.js +30 -10
- package/lib/utils/health-check.js +18 -1
- package/lib/utils/infra-containers.js +101 -0
- package/lib/utils/local-secrets.js +0 -2
- package/lib/utils/token-manager.js +381 -0
- package/package.json +1 -1
- package/templates/applications/README.md.hbs +155 -23
- package/templates/applications/miso-controller/Dockerfile +7 -119
- package/templates/infra/compose.yaml.hbs +93 -0
- package/templates/python/docker-compose.hbs +25 -17
- package/templates/typescript/docker-compose.hbs +25 -17
|
@@ -1,115 +1,5 @@
|
|
|
1
|
-
# AI Fabrix Miso Controller -
|
|
2
|
-
FROM
|
|
3
|
-
|
|
4
|
-
# Install only essential runtime dependencies
|
|
5
|
-
RUN apk add --no-cache \
|
|
6
|
-
curl \
|
|
7
|
-
wget \
|
|
8
|
-
openssl \
|
|
9
|
-
openssl-dev
|
|
10
|
-
|
|
11
|
-
# Install PNPM globally
|
|
12
|
-
RUN npm install -g pnpm
|
|
13
|
-
|
|
14
|
-
# Install tsconfig-paths globally for path resolution
|
|
15
|
-
RUN npm install -g tsconfig-paths
|
|
16
|
-
|
|
17
|
-
# Set working directory
|
|
18
|
-
WORKDIR /app
|
|
19
|
-
|
|
20
|
-
# Copy package files for dependency resolution
|
|
21
|
-
COPY package*.json ./
|
|
22
|
-
COPY pnpm-workspace.yaml ./
|
|
23
|
-
COPY packages/miso-azure/package*.json ./packages/miso-azure/
|
|
24
|
-
COPY packages/miso-controller/package*.json ./packages/miso-controller/
|
|
25
|
-
COPY packages/miso-controller/bin ./packages/miso-controller/bin
|
|
26
|
-
COPY packages/miso-ui/package*.json ./packages/miso-ui/
|
|
27
|
-
|
|
28
|
-
# Create .npmrc for hoisting to fix module resolution in Docker
|
|
29
|
-
RUN echo "shamefully-hoist=true" > .npmrc
|
|
30
|
-
|
|
31
|
-
# Install all dependencies (including dev for building)
|
|
32
|
-
RUN pnpm install
|
|
33
|
-
|
|
34
|
-
# Copy only the source code we need
|
|
35
|
-
COPY packages/miso-azure/src ./packages/miso-azure/src
|
|
36
|
-
COPY packages/miso-azure/tsconfig.json ./packages/miso-azure/
|
|
37
|
-
COPY packages/miso-controller/src ./packages/miso-controller/src
|
|
38
|
-
COPY packages/miso-controller/tsconfig.json ./packages/miso-controller/
|
|
39
|
-
COPY packages/miso-controller/tsconfig.docker.json ./packages/miso-controller/
|
|
40
|
-
COPY packages/miso-controller/openapi/openapi-complete.yaml ./packages/miso-controller/dist/openapi/
|
|
41
|
-
COPY packages/miso-controller/openapi/openapi-complete.json ./packages/miso-controller/dist/openapi/
|
|
42
|
-
COPY packages/miso-ui/src ./packages/miso-ui/src
|
|
43
|
-
COPY packages/miso-ui/tsconfig.json ./packages/miso-ui/
|
|
44
|
-
COPY packages/miso-ui/tsconfig.app.json ./packages/miso-ui/
|
|
45
|
-
COPY packages/miso-ui/tsconfig.node.json ./packages/miso-ui/
|
|
46
|
-
COPY packages/miso-ui/vite.config.ts ./packages/miso-ui/
|
|
47
|
-
COPY packages/miso-ui/index.html ./packages/miso-ui/
|
|
48
|
-
|
|
49
|
-
# Fix Rollup native module issue for Alpine Linux
|
|
50
|
-
RUN pnpm add @rollup/rollup-linux-x64-musl @types/express-serve-static-core --workspace-root
|
|
51
|
-
|
|
52
|
-
# Build packages
|
|
53
|
-
WORKDIR /app/packages/miso-azure
|
|
54
|
-
RUN pnpm run build
|
|
55
|
-
|
|
56
|
-
WORKDIR /app/packages/miso-ui
|
|
57
|
-
RUN pnpm run build
|
|
58
|
-
|
|
59
|
-
WORKDIR /app/packages/miso-controller
|
|
60
|
-
RUN pnpm run db:generate
|
|
61
|
-
RUN pnpm exec tsc -p tsconfig.docker.json || true
|
|
62
|
-
# Copy sensitive-fields.config.json to dist folder
|
|
63
|
-
RUN mkdir -p dist/src/services/logging && \
|
|
64
|
-
cp src/services/logging/sensitive-fields.config.json dist/src/services/logging/ || true
|
|
65
|
-
# Copy generated Prisma logs client to dist folder (needed at runtime)
|
|
66
|
-
RUN mkdir -p dist/database/generated && \
|
|
67
|
-
cp -r src/database/generated/logs-client dist/database/generated/ || true
|
|
68
|
-
|
|
69
|
-
# Return to root to prune correctly (needed to keep workspace dependencies)
|
|
70
|
-
WORKDIR /app
|
|
71
|
-
|
|
72
|
-
# Remove source files and build artifacts, but preserve Prisma schema files and OpenAPI files
|
|
73
|
-
RUN mkdir -p packages/miso-controller/dist/database/prisma && \
|
|
74
|
-
cp packages/miso-controller/src/database/prisma/*.prisma packages/miso-controller/dist/database/prisma/ || true
|
|
75
|
-
RUN rm -rf packages/miso-azure/src packages/miso-controller/src packages/miso-ui/src
|
|
76
|
-
RUN rm -rf packages/miso-azure/tsconfig.json packages/miso-ui/tsconfig.json
|
|
77
|
-
RUN rm -rf packages/*/node_modules packages/*/.git packages/*/.github
|
|
78
|
-
|
|
79
|
-
# Reinstall to recreate symlinks after removing source files
|
|
80
|
-
# This ensures workspace dependencies are properly linked
|
|
81
|
-
RUN pnpm install --frozen-lockfile --filter "@aifabrix/miso-controller..." || pnpm install --frozen-lockfile
|
|
82
|
-
|
|
83
|
-
# Manually remove known dev dependencies
|
|
84
|
-
RUN rm -rf node_modules/markdownlint node_modules/markdownlint-cli node_modules/prettier
|
|
85
|
-
RUN rm -rf .pnpm/markdownlint* .pnpm/prettier*
|
|
86
|
-
|
|
87
|
-
# Create non-root user
|
|
88
|
-
RUN addgroup -g 1001 -S nodejs && \
|
|
89
|
-
adduser -S miso -u 1001
|
|
90
|
-
|
|
91
|
-
# Create necessary directories for mount points (with fallback to local storage)
|
|
92
|
-
RUN mkdir -p /mnt/data/logs /mnt/data/data /mnt/data/backup /mnt/data/config
|
|
93
|
-
RUN mkdir -p /app/data/logs /app/data/data /app/data/backup /app/data/config
|
|
94
|
-
|
|
95
|
-
# Change ownership of app directory and mount points
|
|
96
|
-
RUN chown -R miso:nodejs /app /mnt/data
|
|
97
|
-
|
|
98
|
-
# Switch to non-root user
|
|
99
|
-
USER miso
|
|
100
|
-
|
|
101
|
-
# Set working directory to controller
|
|
102
|
-
WORKDIR /app/packages/miso-controller
|
|
103
|
-
|
|
104
|
-
# Expose port
|
|
105
|
-
EXPOSE 3000
|
|
106
|
-
|
|
107
|
-
# Health check
|
|
108
|
-
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
|
|
109
|
-
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
|
|
110
|
-
|
|
111
|
-
# Set environment variable for tsconfig-paths
|
|
112
|
-
ENV TS_NODE_PROJECT=tsconfig.docker.json
|
|
1
|
+
# AI Fabrix Miso Controller - Build from base image
|
|
2
|
+
FROM aifabrix/miso-controller:latest
|
|
113
3
|
|
|
114
4
|
# Set default data paths (can be overridden by environment variables)
|
|
115
5
|
ENV LOG_PATH=/mnt/data/logs
|
|
@@ -117,12 +7,10 @@ ENV DATA_PATH=/mnt/data/data
|
|
|
117
7
|
ENV BACKUP_PATH=/mnt/data/backup
|
|
118
8
|
ENV CONFIG_PATH=/mnt/data/config
|
|
119
9
|
|
|
120
|
-
#
|
|
121
|
-
|
|
122
|
-
RUN ln -sf /app/data/data /mnt/data/data || true
|
|
123
|
-
RUN ln -sf /app/data/backup /mnt/data/backup || true
|
|
124
|
-
RUN ln -sf /app/data/config /mnt/data/config || true
|
|
10
|
+
# Expose port
|
|
11
|
+
EXPOSE 3000
|
|
125
12
|
|
|
126
|
-
#
|
|
127
|
-
|
|
13
|
+
# Health check
|
|
14
|
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
|
|
15
|
+
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
|
|
128
16
|
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# AI Fabrix Infrastructure Stack
|
|
2
|
+
# Shared infrastructure services only
|
|
3
|
+
# Generated by AI Fabrix Builder SDK
|
|
4
|
+
# Developer ID: {{devId}}
|
|
5
|
+
|
|
6
|
+
services:
|
|
7
|
+
# PostgreSQL Database with pgvector extension
|
|
8
|
+
postgres:
|
|
9
|
+
image: pgvector/pgvector:pg15
|
|
10
|
+
container_name: {{#if (eq devId 0)}}aifabrix-postgres{{else}}aifabrix-dev{{devId}}-postgres{{/if}}
|
|
11
|
+
environment:
|
|
12
|
+
POSTGRES_DB: postgres
|
|
13
|
+
POSTGRES_USER: pgadmin
|
|
14
|
+
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
|
15
|
+
POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --lc-collate=C --lc-ctype=C"
|
|
16
|
+
ports:
|
|
17
|
+
- "{{postgresPort}}:5432"
|
|
18
|
+
volumes:
|
|
19
|
+
- dev{{devId}}_postgres_data:/var/lib/postgresql/data
|
|
20
|
+
- ./init-scripts:/docker-entrypoint-initdb.d
|
|
21
|
+
networks:
|
|
22
|
+
- {{networkName}}
|
|
23
|
+
healthcheck:
|
|
24
|
+
test: ["CMD-SHELL", "pg_isready -U pgadmin -d postgres"]
|
|
25
|
+
interval: 10s
|
|
26
|
+
timeout: 5s
|
|
27
|
+
retries: 5
|
|
28
|
+
restart: unless-stopped
|
|
29
|
+
|
|
30
|
+
# Redis Cache
|
|
31
|
+
redis:
|
|
32
|
+
image: redis:7-alpine
|
|
33
|
+
container_name: {{#if (eq devId 0)}}aifabrix-redis{{else}}aifabrix-dev{{devId}}-redis{{/if}}
|
|
34
|
+
command: ["redis-server", "--appendonly", "yes"]
|
|
35
|
+
ports:
|
|
36
|
+
- "{{redisPort}}:6379"
|
|
37
|
+
volumes:
|
|
38
|
+
- dev{{devId}}_redis_data:/data
|
|
39
|
+
networks:
|
|
40
|
+
- {{networkName}}
|
|
41
|
+
healthcheck:
|
|
42
|
+
test: ["CMD", "redis-cli", "ping"]
|
|
43
|
+
interval: 10s
|
|
44
|
+
timeout: 5s
|
|
45
|
+
retries: 5
|
|
46
|
+
restart: unless-stopped
|
|
47
|
+
|
|
48
|
+
# Optional: pgAdmin for database management
|
|
49
|
+
pgadmin:
|
|
50
|
+
image: dpage/pgadmin4:latest
|
|
51
|
+
container_name: {{#if (eq devId 0)}}aifabrix-pgadmin{{else}}aifabrix-dev{{devId}}-pgadmin{{/if}}
|
|
52
|
+
environment:
|
|
53
|
+
PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
|
|
54
|
+
PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD}
|
|
55
|
+
PGADMIN_CONFIG_SERVER_MODE: 'False'
|
|
56
|
+
ports:
|
|
57
|
+
- "{{pgadminPort}}:80"
|
|
58
|
+
restart: unless-stopped
|
|
59
|
+
depends_on:
|
|
60
|
+
postgres:
|
|
61
|
+
condition: service_healthy
|
|
62
|
+
networks:
|
|
63
|
+
- {{networkName}}
|
|
64
|
+
|
|
65
|
+
# Optional: Redis Commander for Redis management
|
|
66
|
+
redis-commander:
|
|
67
|
+
image: rediscommander/redis-commander:latest
|
|
68
|
+
container_name: {{#if (eq devId 0)}}aifabrix-redis-commander{{else}}aifabrix-dev{{devId}}-redis-commander{{/if}}
|
|
69
|
+
environment:
|
|
70
|
+
REDIS_HOSTS: ${REDIS_HOST}
|
|
71
|
+
HTTP_USER: ${REDIS_COMMANDER_USER}
|
|
72
|
+
HTTP_PASSWORD: ${REDIS_COMMANDER_PASSWORD}
|
|
73
|
+
REDIS_PASSWORD: ""
|
|
74
|
+
ports:
|
|
75
|
+
- "{{redisCommanderPort}}:8081"
|
|
76
|
+
restart: unless-stopped
|
|
77
|
+
depends_on:
|
|
78
|
+
redis:
|
|
79
|
+
condition: service_healthy
|
|
80
|
+
networks:
|
|
81
|
+
- {{networkName}}
|
|
82
|
+
|
|
83
|
+
volumes:
|
|
84
|
+
dev{{devId}}_postgres_data:
|
|
85
|
+
driver: local
|
|
86
|
+
dev{{devId}}_redis_data:
|
|
87
|
+
driver: local
|
|
88
|
+
|
|
89
|
+
networks:
|
|
90
|
+
{{networkName}}:
|
|
91
|
+
driver: bridge
|
|
92
|
+
name: {{networkName}}
|
|
93
|
+
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
services:
|
|
6
6
|
{{app.key}}:
|
|
7
7
|
image: {{image.name}}:{{image.tag}}
|
|
8
|
-
container_name:
|
|
8
|
+
container_name: {{containerName}}
|
|
9
9
|
env_file:
|
|
10
10
|
- {{envFile}}
|
|
11
11
|
ports:
|
|
12
12
|
- "{{hostPort}}:{{containerPort}}"
|
|
13
13
|
networks:
|
|
14
|
-
-
|
|
14
|
+
- {{networkName}}
|
|
15
15
|
{{#if requiresStorage}}
|
|
16
16
|
volumes:
|
|
17
17
|
- "{{mountVolume}}:/mnt/data"
|
|
@@ -33,7 +33,7 @@ services:
|
|
|
33
33
|
# Database Initialization
|
|
34
34
|
db-init:
|
|
35
35
|
image: pgvector/pgvector:pg15
|
|
36
|
-
container_name:
|
|
36
|
+
container_name: {{containerName}}-db-init
|
|
37
37
|
env_file:
|
|
38
38
|
- ${ADMIN_SECRETS_PATH}
|
|
39
39
|
- {{envFile}}
|
|
@@ -50,7 +50,7 @@ services:
|
|
|
50
50
|
DB_PASSWORD: {{lookup databasePasswords.array 0}}
|
|
51
51
|
{{/if}}
|
|
52
52
|
networks:
|
|
53
|
-
-
|
|
53
|
+
- {{networkName}}
|
|
54
54
|
command: >
|
|
55
55
|
sh -c "
|
|
56
56
|
export PGHOST=postgres PGPORT=5432 PGUSER=pgadmin &&
|
|
@@ -69,21 +69,29 @@ services:
|
|
|
69
69
|
{{#if databases}}
|
|
70
70
|
{{#each databases}}
|
|
71
71
|
echo 'Creating {{name}} database and user...' &&
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
72
|
+
if psql -d postgres -tAc \"SELECT 1 FROM pg_database WHERE datname = '{{name}}'\" 2>/dev/null | grep -q '^1$'; then
|
|
73
|
+
echo 'Database \\\"{{name}}\\\" already exists, all ok.'
|
|
74
|
+
else
|
|
75
|
+
(psql -d postgres -c \"CREATE DATABASE \\\"{{name}}\\\";\" || true) &&
|
|
76
|
+
(psql -d postgres -c \"DROP USER IF EXISTS \\\"{{pgUserOld name}}\\\";\" || true) &&
|
|
77
|
+
(psql -d postgres -c \"CREATE USER {{pgUser name}} WITH PASSWORD '${DB_{{@index}}_PASSWORD}';\" || true) &&
|
|
78
|
+
psql -d postgres -c \"GRANT ALL PRIVILEGES ON DATABASE \\\"{{name}}\\\" TO {{pgUser name}};\" || true &&
|
|
79
|
+
psql -d {{name}} -c \"ALTER SCHEMA public OWNER TO {{pgUser name}};\" || true &&
|
|
80
|
+
psql -d {{name}} -c \"GRANT ALL ON SCHEMA public TO {{pgUser name}};\" || true
|
|
81
|
+
fi &&
|
|
78
82
|
{{/each}}
|
|
79
83
|
{{else}}
|
|
80
84
|
echo 'Creating {{app.key}} database and user...' &&
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
if psql -d postgres -tAc \"SELECT 1 FROM pg_database WHERE datname = '{{app.key}}'\" 2>/dev/null | grep -q '^1$'; then
|
|
86
|
+
echo 'Database \\\"{{app.key}}\\\" already exists, all ok.'
|
|
87
|
+
else
|
|
88
|
+
(psql -d postgres -c \"CREATE DATABASE \\\"{{app.key}}\\\";\" || true) &&
|
|
89
|
+
(psql -d postgres -c \"DROP USER IF EXISTS \\\"{{pgUserOld app.key}}\\\";\" || true) &&
|
|
90
|
+
(psql -d postgres -c \"CREATE USER {{pgUser app.key}} WITH PASSWORD '${DB_0_PASSWORD:-${DB_PASSWORD}}';\" || true) &&
|
|
91
|
+
psql -d postgres -c \"GRANT ALL PRIVILEGES ON DATABASE \\\"{{app.key}}\\\" TO {{pgUser app.key}};\" || true &&
|
|
92
|
+
psql -d {{app.key}} -c \"ALTER SCHEMA public OWNER TO {{pgUser app.key}};\" || true &&
|
|
93
|
+
psql -d {{app.key}} -c \"GRANT ALL ON SCHEMA public TO {{pgUser app.key}};\" || true
|
|
94
|
+
fi &&
|
|
87
95
|
{{/if}}
|
|
88
96
|
echo 'Database initialization complete!'
|
|
89
97
|
"
|
|
@@ -91,5 +99,5 @@ services:
|
|
|
91
99
|
{{/if}}
|
|
92
100
|
|
|
93
101
|
networks:
|
|
94
|
-
|
|
102
|
+
{{networkName}}:
|
|
95
103
|
external: true
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
services:
|
|
6
6
|
{{app.key}}:
|
|
7
7
|
image: {{image.name}}:{{image.tag}}
|
|
8
|
-
container_name:
|
|
8
|
+
container_name: {{containerName}}
|
|
9
9
|
env_file:
|
|
10
10
|
- {{envFile}}
|
|
11
11
|
ports:
|
|
12
12
|
- "{{hostPort}}:{{containerPort}}"
|
|
13
13
|
networks:
|
|
14
|
-
-
|
|
14
|
+
- {{networkName}}
|
|
15
15
|
{{#if requiresStorage}}
|
|
16
16
|
volumes:
|
|
17
17
|
- "{{mountVolume}}:/mnt/data"
|
|
@@ -33,7 +33,7 @@ services:
|
|
|
33
33
|
# Database Initialization
|
|
34
34
|
db-init:
|
|
35
35
|
image: pgvector/pgvector:pg15
|
|
36
|
-
container_name:
|
|
36
|
+
container_name: {{containerName}}-db-init
|
|
37
37
|
env_file:
|
|
38
38
|
- ${ADMIN_SECRETS_PATH}
|
|
39
39
|
- {{envFile}}
|
|
@@ -50,7 +50,7 @@ services:
|
|
|
50
50
|
DB_PASSWORD: {{lookup databasePasswords.array 0}}
|
|
51
51
|
{{/if}}
|
|
52
52
|
networks:
|
|
53
|
-
-
|
|
53
|
+
- {{networkName}}
|
|
54
54
|
command: >
|
|
55
55
|
sh -c "
|
|
56
56
|
export PGHOST=postgres PGPORT=5432 PGUSER=pgadmin &&
|
|
@@ -69,21 +69,29 @@ services:
|
|
|
69
69
|
{{#if databases}}
|
|
70
70
|
{{#each databases}}
|
|
71
71
|
echo 'Creating {{name}} database and user...' &&
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
72
|
+
if psql -d postgres -tAc \"SELECT 1 FROM pg_database WHERE datname = '{{name}}'\" 2>/dev/null | grep -q '^1$'; then
|
|
73
|
+
echo 'Database \\\"{{name}}\\\" already exists, all ok.'
|
|
74
|
+
else
|
|
75
|
+
(psql -d postgres -c \"CREATE DATABASE \\\"{{name}}\\\";\" || true) &&
|
|
76
|
+
(psql -d postgres -c \"DROP USER IF EXISTS \\\"{{pgUserOld name}}\\\";\" || true) &&
|
|
77
|
+
(psql -d postgres -c \"CREATE USER {{pgUser name}} WITH PASSWORD '${DB_{{@index}}_PASSWORD}';\" || true) &&
|
|
78
|
+
psql -d postgres -c \"GRANT ALL PRIVILEGES ON DATABASE \\\"{{name}}\\\" TO {{pgUser name}};\" || true &&
|
|
79
|
+
psql -d {{name}} -c \"ALTER SCHEMA public OWNER TO {{pgUser name}};\" || true &&
|
|
80
|
+
psql -d {{name}} -c \"GRANT ALL ON SCHEMA public TO {{pgUser name}};\" || true
|
|
81
|
+
fi &&
|
|
78
82
|
{{/each}}
|
|
79
83
|
{{else}}
|
|
80
84
|
echo 'Creating {{app.key}} database and user...' &&
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
if psql -d postgres -tAc \"SELECT 1 FROM pg_database WHERE datname = '{{app.key}}'\" 2>/dev/null | grep -q '^1$'; then
|
|
86
|
+
echo 'Database \\\"{{app.key}}\\\" already exists, all ok.'
|
|
87
|
+
else
|
|
88
|
+
(psql -d postgres -c \"CREATE DATABASE \\\"{{app.key}}\\\";\" || true) &&
|
|
89
|
+
(psql -d postgres -c \"DROP USER IF EXISTS \\\"{{pgUserOld app.key}}\\\";\" || true) &&
|
|
90
|
+
(psql -d postgres -c \"CREATE USER {{pgUser app.key}} WITH PASSWORD '${DB_0_PASSWORD:-${DB_PASSWORD}}';\" || true) &&
|
|
91
|
+
psql -d postgres -c \"GRANT ALL PRIVILEGES ON DATABASE \\\"{{app.key}}\\\" TO {{pgUser app.key}};\" || true &&
|
|
92
|
+
psql -d {{app.key}} -c \"ALTER SCHEMA public OWNER TO {{pgUser app.key}};\" || true &&
|
|
93
|
+
psql -d {{app.key}} -c \"GRANT ALL ON SCHEMA public TO {{pgUser app.key}};\" || true
|
|
94
|
+
fi &&
|
|
87
95
|
{{/if}}
|
|
88
96
|
echo 'Database initialization complete!'
|
|
89
97
|
"
|
|
@@ -91,5 +99,5 @@ services:
|
|
|
91
99
|
{{/if}}
|
|
92
100
|
|
|
93
101
|
networks:
|
|
94
|
-
|
|
102
|
+
{{networkName}}:
|
|
95
103
|
external: true
|