Skip to content

Commit 54dce8d

Browse files
committed
chore: refactor docker-compose to use improved .env configuration
1 parent 439a291 commit 54dce8d

File tree

11 files changed

+99
-43
lines changed

11 files changed

+99
-43
lines changed

.github/workflows/docker-image.yml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,6 @@ jobs:
3434
username: ${{ github.actor }}
3535
password: ${{ secrets.GITHUB_TOKEN }}
3636

37-
- name: Copy and patch .env
38-
run: |
39-
cp .env.example .env
40-
sed -i 's|DATABASE_HOST=localhost:5432|DATABASE_HOST=db:5432|' .env
41-
4237
- name: Build Docker images using local compose file
4338
run: cd ./docker && docker compose -f docker-compose.local.yml build
4439

CONTRIBUTING.md

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -186,18 +186,17 @@ npm run lint
186186
# Create Docker network if not exists
187187
npm run docker:create-network
188188
189-
# Start individual Docker services
190-
npm run docker:db # Start DB container
191-
npm run docker:api # Start API container
192-
npm run docker:app # Start app container
193-
npm run docker:studio # Start Prisma Studio container
194-
npm run docker:cdn # Start CDN container
189+
npm run docker-dev:db # Avvia solo il container DB
190+
npm run docker-dev:api # Avvia solo il container API
191+
npm run docker-dev:app # Avvia solo il container frontend app
192+
npm run docker-dev:studio # Avvia Prisma Studio
193+
npm run docker-dev:cdn # Avvia il container CDN
195194
196195
# Start all dev Docker services
197-
npm run docker
196+
npm run docker-dev
198197
199198
# Start all production Docker services
200-
npm run docker-prod
199+
npm run docker
201200
```
202201

203202
## Prisma Commands

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,12 +186,12 @@ This project uses:
186186
2. Then, run:
187187

188188
```bash
189-
npm run docker-prod
189+
npm run docker
190190
```
191191

192192
> This command will download Poveroh's packages from cloud and will run them.
193193
194-
> If you want to build and run from scratch, run `npm run docker`
194+
> If you want to build and run from scratch, run `npm run docker-dev`
195195
196196
## :handshake: Contribuite
197197

docker/docker-compose.local.yml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,11 @@ services:
3030
restart: always
3131
env_file: .env
3232
environment:
33-
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
33+
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DATABASE_HOST}/${POSTGRES_DB}
3434
ports:
3535
- 5555:5555
3636
networks:
3737
- poveroh_network
38-
depends_on:
39-
- db
4038

4139
api:
4240
container_name: api
@@ -52,16 +50,14 @@ services:
5250
environment:
5351
- API_PORT=${API_PORT}
5452
- JWT_KEY=${JWT_KEY}
55-
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
53+
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DATABASE_HOST}/${POSTGRES_DB}
5654
- CDN_LOCAL_DATA_PATH=${CDN_LOCAL_DATA_PATH}
5755
ports:
5856
- 3001:3001
5957
volumes:
6058
- ${CDN_LOCAL_DATA_PATH}:/usr/share/cdn-data
6159
networks:
6260
- poveroh_network
63-
depends_on:
64-
- db
6561

6662
app:
6763
container_name: app

docker/docker-compose.prod.yml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,11 @@ services:
2626
restart: always
2727
env_file: .env
2828
environment:
29-
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
29+
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DATABASE_HOST}/${POSTGRES_DB}
3030
ports:
3131
- 5555:5555
3232
networks:
3333
- poveroh_network
34-
depends_on:
35-
- db
3634

3735
api:
3836
image: ghcr.io/poveroh/poveroh-api:latest
@@ -42,16 +40,14 @@ services:
4240
environment:
4341
- API_PORT=${API_PORT}
4442
- JWT_KEY=${JWT_KEY}
45-
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
43+
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DATABASE_HOST}/${POSTGRES_DB}
4644
- CDN_LOCAL_DATA_PATH=${CDN_LOCAL_DATA_PATH}
4745
ports:
4846
- 3001:3001
4947
volumes:
5048
- ${CDN_LOCAL_DATA_PATH}:/usr/share/cdn-data
5149
networks:
5250
- poveroh_network
53-
depends_on:
54-
- db
5551

5652
app:
5753
image: ghcr.io/poveroh/poveroh-app:latest

package.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@
3333
"clean:data": "node ./scripts/data/clean-db.js",
3434
"format": "prettier --write \"**/*.{ts,tsx,md}\"",
3535
"docker:create-network": "docker network ls | grep -w poveroh_network || docker network create poveroh_network",
36-
"docker:db": "npm run docker:create-network && cd ./docker && docker compose -f docker-compose.local.yml up -d --build db",
37-
"docker:api": "npm run docker:create-network && cd ./docker && docker compose -f docker-compose.local.yml up -d --build api",
38-
"docker:app": "npm run docker:create-network && cd ./docker && docker compose -f docker-compose.local.yml up -d --build app",
39-
"docker:studio": "npm run docker:create-network && cd ./docker && docker compose -f docker-compose.local.yml up -d --build studio",
40-
"docker:cdn": "npm run docker:create-network && cd ./docker && docker compose -f docker-compose.local.yml up -d --build cdn",
41-
"docker": "npm run docker:create-network && cd ./docker && docker compose -f docker-compose.local.yml up -d --build",
42-
"docker-prod": "npm run docker:create-network && cd ./docker && docker compose -f docker-compose.prod.yml up -d",
36+
"docker-dev:db": "npm run docker:create-network && cd ./docker && docker compose -f docker-compose.local.yml up -d --build db",
37+
"docker-dev:api": "npm run docker:create-network && cd ./docker && docker compose -f docker-compose.local.yml up -d --build api",
38+
"docker-dev:app": "npm run docker:create-network && cd ./docker && docker compose -f docker-compose.local.yml up -d --build app",
39+
"docker-dev:studio": "npm run docker:create-network && cd ./docker && docker compose -f docker-compose.local.yml up -d --build studio",
40+
"docker-dev:cdn": "npm run docker:create-network && cd ./docker && docker compose -f docker-compose.local.yml up -d --build cdn",
41+
"docker-dev": "npm run docker:create-network && cd ./docker && docker compose -f docker-compose.local.yml up -d --build",
42+
"docker": "npm run docker:create-network && node ./scripts/docker/launch.js",
4343
"prepare": "husky",
4444
"chromatic": "cd apps/storybook && npm run chromatic"
4545
},

scripts/docker/launch.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
const { execSync } = require('child_process')
2+
const { getProjectRoot, ensureEnvFile, getEnvContent, path } = require('../utils')
3+
4+
require('dotenv').config({ path: path.resolve(getProjectRoot(), '.env') })
5+
6+
const projectRoot = getProjectRoot()
7+
const envPaths = {
8+
root: path.resolve(projectRoot, '.env'),
9+
example: path.resolve(projectRoot, '.env.example')
10+
}
11+
const composeFile = path.resolve(projectRoot, 'docker/docker-compose.prod.yml')
12+
13+
try {
14+
ensureEnvFile(envPaths)
15+
16+
let envContent = getEnvContent(envPaths.root)
17+
const getEnvValue = key => {
18+
const match = envContent.match(new RegExp(`^${key}=(.*)$`, 'm'))
19+
return match ? match[1] : null
20+
}
21+
22+
const DATABASE_HOST = getEnvValue('DATABASE_HOST')
23+
24+
if (!DATABASE_HOST) {
25+
throw new Error('DATABASE_HOST is not set in .env')
26+
}
27+
28+
const isLocalDb = DATABASE_HOST.includes('localhost') || DATABASE_HOST.includes('db')
29+
30+
const baseCommand = `docker compose -f ${composeFile}`
31+
32+
if (isLocalDb) {
33+
console.log("🟢 Avvio di tutti i servizi incluso 'db'...")
34+
execSync(`${baseCommand} up -d`, { stdio: 'inherit' })
35+
} else {
36+
console.log(`🟡 DATABASE_HOST è '${DATABASE_HOST}' -> il servizio 'db' non verrà avviato.`)
37+
console.log('🟢 Avvio degli altri servizi...')
38+
execSync(`${baseCommand} up -d studio api app cdn`, { stdio: 'inherit' })
39+
}
40+
} catch (error) {
41+
console.error("❌ Errore durante l'avvio dei servizi Docker:", error.message)
42+
process.exit(1)
43+
}

scripts/setup/cdn.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
const { execSync } = require('child_process')
2-
const { getProjectRoot } = require('./utils')
2+
const { getProjectRoot } = require('../utils')
33

44
const projectRoot = getProjectRoot()
55

66
try {
77
execSync('npm run setup:env')
88

99
console.log('Starting Docker containers...')
10-
execSync('npm run docker:cdn', { stdio: 'inherit', cwd: projectRoot })
10+
execSync('npm run docker-dev:cdn', { stdio: 'inherit', cwd: projectRoot })
1111
console.log('✅ CDN setup completed!')
1212
} catch (error) {
1313
console.error('❌ Error during setup:', error)

scripts/setup/db.js

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
1-
const { getProjectRoot, path } = require('./utils')
1+
const { getProjectRoot, path, getEnvContent } = require('../utils')
22
const { execSync } = require('child_process')
3+
const fs = require('fs')
34

45
const projectRoot = getProjectRoot()
56
const prismaPath = path.join(projectRoot, 'packages/prisma')
7+
const envPath = path.join(projectRoot, '.env')
8+
9+
const getEnvValue = (content, key) => {
10+
const match = content.match(new RegExp(`^${key}=(.*)$`, 'm'))
11+
return match ? match[1] : null
12+
}
613

714
try {
8-
execSync('npm run setup:env')
15+
execSync('npm run setup:env', { stdio: 'inherit' })
916

1017
// Check if Docker is running
1118
try {
@@ -15,9 +22,29 @@ try {
1522
throw new Error('Docker is not running. Please start Docker and try again.')
1623
}
1724

18-
console.log('Starting Docker containers...')
19-
execSync('npm run docker:db', { stdio: 'inherit', cwd: projectRoot })
20-
execSync('npm run docker:studio', { stdio: 'inherit', cwd: projectRoot })
25+
// Load .env and check DATABASE_HOST
26+
if (!fs.existsSync(envPath)) {
27+
throw new Error('.env file not found.')
28+
}
29+
30+
const envContent = getEnvContent(envPath)
31+
const databaseHost = getEnvValue(envContent, 'DATABASE_HOST')
32+
33+
if (!databaseHost) {
34+
throw new Error('DATABASE_HOST is not set in .env')
35+
}
36+
37+
const isLocalDb = databaseHost === 'localhost:5432' || databaseHost === 'db:5432'
38+
39+
if (isLocalDb) {
40+
console.log(`🟢 DATABASE_HOST is '${databaseHost}', starting local DB container...`)
41+
execSync('npm run docker-dev:db', { stdio: 'inherit', cwd: projectRoot })
42+
} else {
43+
console.log(`🟡 DATABASE_HOST is '${databaseHost}', skipping local DB container.`)
44+
}
45+
46+
console.log('Starting Prisma Studio container...')
47+
execSync('npm run docker-dev:studio', { stdio: 'inherit', cwd: projectRoot })
2148

2249
console.log('Generating Prisma client...')
2350
execSync('npx prisma generate', { stdio: 'inherit', cwd: prismaPath })

scripts/setup/env.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const crypto = require('crypto')
2-
const { getProjectRoot, ensureEnvFile, getEnvContent, saveEnvContent, path, fs } = require('./utils')
2+
const { getProjectRoot, ensureEnvFile, getEnvContent, saveEnvContent, path, fs } = require('../utils')
33

44
const projectRoot = getProjectRoot()
55
const envPaths = {

0 commit comments

Comments
 (0)