From 575bf91ecd9bb3768ec27889345262ec0016226d Mon Sep 17 00:00:00 2001 From: francy51 Date: Fri, 20 Feb 2026 22:41:21 -0500 Subject: [PATCH] Make Docker Compose Coolify-ready --- .env.example | 8 ++++++++ COOLIFY.md | 12 ++++++++++++ backend/src/auth.ts | 4 +++- backend/src/db/index.ts | 4 +++- docker-compose.yml | 31 ++++++++++++++++++------------- frontend/Dockerfile | 4 ++++ 6 files changed, 48 insertions(+), 15 deletions(-) diff --git a/.env.example b/.env.example index 13c2cca..666c4f3 100644 --- a/.env.example +++ b/.env.example @@ -3,10 +3,18 @@ DATABASE_URL=postgres://postgres:postgres@localhost:5432/fiscal POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres POSTGRES_DB=fiscal +POSTGRES_HOST=localhost # Backend PORT=3001 NODE_ENV=development +JWT_SECRET=change-this-to-a-random-secret-key +BETTER_AUTH_SECRET=change-this-to-a-random-secret-key +BETTER_AUTH_BASE_URL=http://localhost:3001 +GITHUB_ID= +GITHUB_SECRET= +GOOGLE_ID= +GOOGLE_SECRET= # Frontend NEXT_PUBLIC_API_URL=http://localhost:3001 diff --git a/COOLIFY.md b/COOLIFY.md index 2c2678c..c962833 100644 --- a/COOLIFY.md +++ b/COOLIFY.md @@ -23,6 +23,13 @@ POSTGRES_USER=postgres POSTGRES_PASSWORD=your_password POSTGRES_DB=fiscal PORT=3001 +BETTER_AUTH_SECRET=your-random-long-secret +BETTER_AUTH_BASE_URL=https://api.your-fiscal-domain.com +JWT_SECRET=your-jwt-secret-key-min-32-characters +GITHUB_ID=your-github-oauth-client-id +GITHUB_SECRET=your-github-oauth-client-secret +GOOGLE_ID=your-google-oauth-client-id +GOOGLE_SECRET=your-google-oauth-client-secret NEXT_PUBLIC_API_URL=https://your-fiscal-domain.com ``` @@ -63,10 +70,15 @@ NEXT_PUBLIC_API_URL=https://your-fiscal-domain.com - `DATABASE_URL` - PostgreSQL connection string - `PORT` - Server port (default: 3001) - `NODE_ENV` - Environment (development/production) +- `BETTER_AUTH_SECRET` - Required in production; use a long random secret +- `BETTER_AUTH_BASE_URL` - Public backend URL used for auth callbacks ### Frontend - `NEXT_PUBLIC_API_URL` - Backend API URL +`NEXT_PUBLIC_API_URL` is used at image build time in the frontend Docker build. +Set it in Coolify before deploying so the generated client bundle points to the correct backend URL. + ## Database Setup The application will automatically create the database schema on startup. To manually run migrations: diff --git a/backend/src/auth.ts b/backend/src/auth.ts index e9ed658..669182b 100644 --- a/backend/src/auth.ts +++ b/backend/src/auth.ts @@ -1,9 +1,11 @@ import { betterAuth } from "better-auth"; import { Pool } from "pg"; +const defaultDatabaseUrl = `postgres://${process.env.POSTGRES_USER || 'postgres'}:${process.env.POSTGRES_PASSWORD || 'postgres'}@${process.env.POSTGRES_HOST || 'localhost'}:5432/${process.env.POSTGRES_DB || 'fiscal'}`; + export const auth = betterAuth({ database: new Pool({ - connectionString: process.env.DATABASE_URL || 'postgres://postgres:postgres@localhost:5432/fiscal', + connectionString: process.env.DATABASE_URL || defaultDatabaseUrl, }), emailAndPassword: { enabled: true, diff --git a/backend/src/db/index.ts b/backend/src/db/index.ts index d3b438f..27a1f47 100644 --- a/backend/src/db/index.ts +++ b/backend/src/db/index.ts @@ -1,6 +1,8 @@ import postgres from 'postgres'; -const sql = postgres(process.env.DATABASE_URL || 'postgres://postgres:postgres@localhost:5432/fiscal', { +const defaultDatabaseUrl = `postgres://${process.env.POSTGRES_USER || 'postgres'}:${process.env.POSTGRES_PASSWORD || 'postgres'}@${process.env.POSTGRES_HOST || 'localhost'}:5432/${process.env.POSTGRES_DB || 'fiscal'}`; + +const sql = postgres(process.env.DATABASE_URL || defaultDatabaseUrl, { max: 10, idle_timeout: 20, connect_timeout: 10 diff --git a/docker-compose.yml b/docker-compose.yml index 381c727..fcef5c1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,13 +3,13 @@ services: image: postgres:16-alpine restart: unless-stopped environment: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_DB: fiscal + POSTGRES_USER: ${POSTGRES_USER:-postgres} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + POSTGRES_DB: ${POSTGRES_DB:-fiscal} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: - test: ["CMD-SHELL", "pg_isready -U postgres -d fiscal"] + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-fiscal}"] interval: 5s timeout: 5s retries: 10 @@ -21,19 +21,22 @@ services: context: ./backend dockerfile: Dockerfile restart: unless-stopped + env_file: + - path: ./.env + required: false + - path: ../.env + required: false environment: - DATABASE_URL: postgres://postgres:postgres@postgres:5432/fiscal - PORT: 3001 - JWT_SECRET: change-this-to-a-random-secret-key - GITHUB_ID: ${GITHUB_ID} - GITHUB_SECRET: ${GITHUB_SECRET} - GOOGLE_ID: ${GOOGLE_ID} - GOOGLE_SECRET: ${GOOGLE_SECRET} + DATABASE_URL: ${DATABASE_URL:-postgres://postgres:postgres@postgres:5432/fiscal} + PORT: ${PORT:-3001} + POSTGRES_HOST: postgres + BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET:-local-dev-better-auth-secret-change-me} + BETTER_AUTH_BASE_URL: ${BETTER_AUTH_BASE_URL:-http://localhost:3001} depends_on: postgres: condition: service_healthy healthcheck: - test: ["CMD", "bun", "-e", "require('http').createServer(() => {}).listen(3001)"] + test: ["CMD-SHELL", "wget -q --spider http://localhost:3001/api/health || exit 1"] interval: 30s timeout: 10s retries: 3 @@ -44,9 +47,11 @@ services: build: context: ./frontend dockerfile: Dockerfile + args: + NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-http://backend:3001} restart: unless-stopped environment: - NEXT_PUBLIC_API_URL: http://backend:3001 + NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-http://backend:3001} depends_on: - backend networks: diff --git a/frontend/Dockerfile b/frontend/Dockerfile index aba4604..1c882ee 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -9,6 +9,8 @@ RUN npm install # Build FROM base AS builder +ARG NEXT_PUBLIC_API_URL=http://backend:3001 +ENV NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL} COPY --from=deps /app/node_modules ./node_modules COPY . . RUN mkdir -p public && npm run build @@ -18,6 +20,8 @@ FROM base AS runner WORKDIR /app ENV NODE_ENV=production +ARG NEXT_PUBLIC_API_URL=http://backend:3001 +ENV NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL} RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs