diff --git a/.env.example b/.env.example index 87e207d..cb46448 100644 --- a/.env.example +++ b/.env.example @@ -8,7 +8,7 @@ NEXT_PUBLIC_APP_NAME=ArchiTools NEXT_PUBLIC_APP_URL=http://localhost:3000 -# Storage adapter: 'localStorage' (default) | 'api' | 'minio' +# Storage adapter: 'localStorage' (default) | 'database' NEXT_PUBLIC_STORAGE_ADAPTER=localStorage # Feature flag overrides (set to 'true' or 'false') @@ -25,21 +25,31 @@ NEXT_PUBLIC_STORAGE_ADAPTER=localStorage # NEXT_PUBLIC_FLAG_MODULE_MINI_UTILITIES=false # NEXT_PUBLIC_FLAG_MODULE_AI_CHAT=false -# Future: API storage backend -# STORAGE_API_URL=http://api.internal/storage +# ============================================================================= +# PostgreSQL Database (required when STORAGE_ADAPTER=database) +# ============================================================================= +DATABASE_URL=postgresql://USER:PASSWORD@10.10.10.166:5432/architools_db?schema=public -# Future: MinIO object storage -# MINIO_ENDPOINT=10.10.10.166:9003 -# MINIO_ACCESS_KEY= -# MINIO_SECRET_KEY= -# MINIO_BUCKET=architools +# ============================================================================= +# MinIO Object Storage +# ============================================================================= +MINIO_ENDPOINT=10.10.10.166 +MINIO_PORT=9002 +MINIO_USE_SSL=false +MINIO_ACCESS_KEY=admin +MINIO_SECRET_KEY=your-minio-secret +MINIO_BUCKET_NAME=tools -# Future: Authentik SSO -# AUTHENTIK_URL=http://10.10.10.166:9100 -# AUTHENTIK_CLIENT_ID= -# AUTHENTIK_CLIENT_SECRET= +# ============================================================================= +# Authentication (Authentik OIDC) +# ============================================================================= +NEXTAUTH_URL=https://tools.beletage.ro +NEXTAUTH_SECRET=generate-with-openssl-rand-base64-32 +AUTHENTIK_CLIENT_ID=your-authentik-client-id +AUTHENTIK_CLIENT_SECRET=your-authentik-client-secret +AUTHENTIK_ISSUER=https://auth.beletage.ro/application/o/architools/ -# Future: N8N automation +# N8N automation (future) # N8N_WEBHOOK_URL=http://10.10.10.166:5678/webhook # External tool URLs (displayed in dashboard) diff --git a/Dockerfile b/Dockerfile index 5d1e9f5..884d5b0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,6 +9,18 @@ FROM node:20-alpine AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . + +# Build args for NEXT_PUBLIC_* vars (inlined at build time) +ARG NEXT_PUBLIC_STORAGE_ADAPTER=database +ARG NEXT_PUBLIC_APP_NAME=ArchiTools +ARG NEXT_PUBLIC_APP_URL=https://tools.beletage.ro +ENV NEXT_PUBLIC_STORAGE_ADAPTER=${NEXT_PUBLIC_STORAGE_ADAPTER} +ENV NEXT_PUBLIC_APP_NAME=${NEXT_PUBLIC_APP_NAME} +ENV NEXT_PUBLIC_APP_URL=${NEXT_PUBLIC_APP_URL} + +# Generate Prisma client before building +RUN npx prisma generate + RUN npm run build # Stage 3: Runner diff --git a/docker-compose.yml b/docker-compose.yml index e92c42e..bce22e2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,16 +1,33 @@ -version: '3.8' +version: "3.8" services: architools: - build: . + build: + context: . + args: + - NEXT_PUBLIC_STORAGE_ADAPTER=${NEXT_PUBLIC_STORAGE_ADAPTER:-database} + - NEXT_PUBLIC_APP_NAME=${NEXT_PUBLIC_APP_NAME:-ArchiTools} + - NEXT_PUBLIC_APP_URL=${NEXT_PUBLIC_APP_URL:-https://tools.beletage.ro} container_name: architools restart: unless-stopped ports: - "3000:3000" environment: - NODE_ENV=production - - NEXT_PUBLIC_APP_NAME=ArchiTools - - NEXT_PUBLIC_APP_URL=${APP_URL:-http://10.10.10.166:3000} - - NEXT_PUBLIC_STORAGE_ADAPTER=localStorage + # Database + - DATABASE_URL=${DATABASE_URL:-postgresql://architools_user:stictMyFon34!_gonY@10.10.10.166:5432/architools_db?schema=public} + # MinIO + - MINIO_ENDPOINT=${MINIO_ENDPOINT:-10.10.10.166} + - MINIO_PORT=${MINIO_PORT:-9002} + - MINIO_USE_SSL=${MINIO_USE_SSL:-false} + - MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY:-admin} + - MINIO_SECRET_KEY=${MINIO_SECRET_KEY:-MinioStrongPass123} + - MINIO_BUCKET_NAME=${MINIO_BUCKET_NAME:-tools} + # Authentication (Authentik OIDC) + - NEXTAUTH_URL=${NEXTAUTH_URL:-https://tools.beletage.ro} + - NEXTAUTH_SECRET=${NEXTAUTH_SECRET} + - AUTHENTIK_CLIENT_ID=${AUTHENTIK_CLIENT_ID} + - AUTHENTIK_CLIENT_SECRET=${AUTHENTIK_CLIENT_SECRET} + - AUTHENTIK_ISSUER=${AUTHENTIK_ISSUER:-https://auth.beletage.ro/application/o/architools/} labels: - "com.centurylinklabs.watchtower.enable=true" diff --git a/minio-out.txt b/minio-out.txt deleted file mode 100644 index 4c8e96e..0000000 Binary files a/minio-out.txt and /dev/null differ diff --git a/minio-result.txt b/minio-result.txt deleted file mode 100644 index f7b8b35..0000000 Binary files a/minio-result.txt and /dev/null differ diff --git a/package.json b/package.json index 7bea8fd..d4247ca 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "clsx": "^2.1.1", "jszip": "^3.10.1", "lucide-react": "^0.564.0", + "@prisma/client": "^6.19.2", "minio": "^8.0.6", "next": "16.1.6", "next-auth": "^4.24.13", @@ -25,7 +26,6 @@ "uuid": "^13.0.0" }, "devDependencies": { - "@prisma/client": "^6.19.2", "@tailwindcss/postcss": "^4", "@types/jszip": "^3.4.0", "@types/node": "^20", diff --git a/ports.txt b/ports.txt deleted file mode 100644 index 817450f..0000000 Binary files a/ports.txt and /dev/null differ diff --git a/test-minio.mjs b/test-minio.mjs deleted file mode 100644 index 2d1586f..0000000 --- a/test-minio.mjs +++ /dev/null @@ -1,23 +0,0 @@ -import { Client } from 'minio'; -import * as dotenv from 'dotenv'; -dotenv.config(); - -const minioClient = new Client({ - endPoint: process.env.MINIO_ENDPOINT, - port: parseInt(process.env.MINIO_PORT), - useSSL: process.env.MINIO_USE_SSL === 'true', - accessKey: process.env.MINIO_ACCESS_KEY, - secretKey: process.env.MINIO_SECRET_KEY, -}); - -async function testMinio() { - try { - console.log('Testing MinIO connection on port', process.env.MINIO_PORT, '...'); - const buckets = await minioClient.listBuckets(); - console.log('Success! Buckets:', buckets.map(b => b.name)); - } catch (err) { - console.error('MinIO Error:', err.message); - } -} - -testMinio(); \ No newline at end of file