@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.
@@ -1,115 +1,5 @@
1
- # AI Fabrix Miso Controller - Optimized Dockerfile
2
- FROM node:18-alpine
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
- # Create symlinks for fallback to local storage if mounts are not provided
121
- RUN ln -sf /app/data/logs /mnt/data/logs || true
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
- # Start the application
127
- CMD ["node", "-r", "tsconfig-paths/register", "dist/src/server.js"]
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: aifabrix-{{app.key}}
8
+ container_name: {{containerName}}
9
9
  env_file:
10
10
  - {{envFile}}
11
11
  ports:
12
12
  - "{{hostPort}}:{{containerPort}}"
13
13
  networks:
14
- - infra_aifabrix-network
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: aifabrix-{{app.key}}-db-init
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
- - infra_aifabrix-network
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
- (psql -d postgres -c \"CREATE DATABASE \\\"{{name}}\\\";\" || true) &&
73
- (psql -d postgres -c \"DROP USER IF EXISTS {{pgUserOld name}};\" || true) &&
74
- (psql -d postgres -c \"CREATE USER {{pgUser name}} WITH PASSWORD '${DB_{{@index}}_PASSWORD}';\" || true) &&
75
- psql -d postgres -c \"GRANT ALL PRIVILEGES ON DATABASE \\\"{{name}}\\\" TO {{pgUser name}};\" || true &&
76
- psql -d {{name}} -c \"ALTER SCHEMA public OWNER TO {{pgUser name}};\" || true &&
77
- psql -d {{name}} -c \"GRANT ALL ON SCHEMA public TO {{pgUser name}};\" || true &&
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
- (psql -d postgres -c \"CREATE DATABASE \\\"{{app.key}}\\\";\" || true) &&
82
- (psql -d postgres -c \"DROP USER IF EXISTS {{pgUserOld app.key}};\" || true) &&
83
- (psql -d postgres -c \"CREATE USER {{pgUser app.key}} WITH PASSWORD '${DB_0_PASSWORD:-${DB_PASSWORD}}';\" || true) &&
84
- psql -d postgres -c \"GRANT ALL PRIVILEGES ON DATABASE \\\"{{app.key}}\\\" TO {{pgUser app.key}};\" || true &&
85
- psql -d {{app.key}} -c \"ALTER SCHEMA public OWNER TO {{pgUser app.key}};\" || true &&
86
- psql -d {{app.key}} -c \"GRANT ALL ON SCHEMA public TO {{pgUser app.key}};\" || true &&
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
- infra_aifabrix-network:
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: aifabrix-{{app.key}}
8
+ container_name: {{containerName}}
9
9
  env_file:
10
10
  - {{envFile}}
11
11
  ports:
12
12
  - "{{hostPort}}:{{containerPort}}"
13
13
  networks:
14
- - infra_aifabrix-network
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: aifabrix-{{app.key}}-db-init
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
- - infra_aifabrix-network
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
- (psql -d postgres -c \"CREATE DATABASE \\\"{{name}}\\\";\" || true) &&
73
- (psql -d postgres -c \"DROP USER IF EXISTS {{pgUserOld name}};\" || true) &&
74
- (psql -d postgres -c \"CREATE USER {{pgUser name}} WITH PASSWORD '${DB_{{@index}}_PASSWORD}';\" || true) &&
75
- psql -d postgres -c \"GRANT ALL PRIVILEGES ON DATABASE \\\"{{name}}\\\" TO {{pgUser name}};\" || true &&
76
- psql -d {{name}} -c \"ALTER SCHEMA public OWNER TO {{pgUser name}};\" || true &&
77
- psql -d {{name}} -c \"GRANT ALL ON SCHEMA public TO {{pgUser name}};\" || true &&
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
- (psql -d postgres -c \"CREATE DATABASE \\\"{{app.key}}\\\";\" || true) &&
82
- (psql -d postgres -c \"DROP USER IF EXISTS {{pgUserOld app.key}};\" || true) &&
83
- (psql -d postgres -c \"CREATE USER {{pgUser app.key}} WITH PASSWORD '${DB_0_PASSWORD:-${DB_PASSWORD}}';\" || true) &&
84
- psql -d postgres -c \"GRANT ALL PRIVILEGES ON DATABASE \\\"{{app.key}}\\\" TO {{pgUser app.key}};\" || true &&
85
- psql -d {{app.key}} -c \"ALTER SCHEMA public OWNER TO {{pgUser app.key}};\" || true &&
86
- psql -d {{app.key}} -c \"GRANT ALL ON SCHEMA public TO {{pgUser app.key}};\" || true &&
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
- infra_aifabrix-network:
102
+ {{networkName}}:
95
103
  external: true