Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor/docker base config #388

Merged
merged 14 commits into from
Jan 28, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ build
# configs
# you should be explicit in docker-compose about what env-vars should be loaded into a container
.env
default.env
.env.default
next-env.default.d.ts
nginx.conf

Expand Down
3 changes: 0 additions & 3 deletions default.env → .env.default
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,6 @@ PASSWORD_ENCRYPTION_KEY="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" # Must be
API_KEY_SALT_ROUNDS="12"
API_KEY_ENCRYPTION_KEY="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" # Must be 256 bits (43 characters) long

# Next js
NEXT_TELEMETRY_DISABLED=1

# Mailer
MAIL_SERVER=smtp.ethereal.email

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
- name: checkout
uses: actions/checkout@v3
- name: build
run: docker compose --env-file default.env build
run: docker compose --env-file .env.default -f docker-compose.prod.yml build
- name: up
run: docker compose --env-file default.env up -d
run: docker compose --env-file .env.default -f docker-compose.prod.yml up -d

27 changes: 20 additions & 7 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
FROM node:22-alpine AS base
FROM node:22-alpine3.20 AS base
WORKDIR /usr/src/app

# Expose Next.js port
EXPOSE 3000

# Disable Next.js telemetry
ENV NEXT_TELEMETRY_DISABLED=1

# Install node packages
COPY package*.json ./
RUN npm ci
Expand All @@ -16,18 +22,25 @@ COPY public public
COPY next-env.d.t[s] next.config.js tsconfig.json ./

############################################################
FROM node:22-alpine AS prod
WORKDIR /usr/src/app
FROM base AS prod

ENV NODE_ENV=production

COPY src src
COPY --from=base /usr/src/app/ .

RUN npm run build
CMD ["npm", "run", "start"]
############################################################
FROM node:22-alpine AS dev
WORKDIR /usr/src/app
FROM base AS test

ENV NODE_ENV=test

# Tests are currently not implemented so this is just a placeholder

CMD ["npm", "run", "test"]
############################################################
FROM base AS dev

COPY --from=base /usr/src/app/ .
ENV NODE_ENV=development

CMD ["npm", "run", "dev"]
75 changes: 75 additions & 0 deletions docker-compose.base.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# This file is used to define the base services that are shared between dev, test and prod.
# The services are then extended in the environment-specific files.
# This way, we can avoid duplicating the configuration for the shared services.

services:
projectnext:
build:
context: ${PROJECT_ROOT:-.}/
dockerfile: ${PROJECT_ROOT:-.}/Dockerfile
environment:
DB_URI: ${DB_URI}
LOG_LEVEL: ${LOG_LEVEL}
LOG_TO_CONSOLE: ${LOG_TO_CONSOLE}
LOG_TO_FOLDER: ${LOG_TO_FOLDER}
LOG_MAX_FILES: ${LOG_MAX_FILES}
NEXTAUTH_URL: ${NEXTAUTH_URL}
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
PASSWORD_SALT_ROUNDS: ${PASSWORD_SALT_ROUNDS}
PASSWORD_ENCRYPTION_KEY: ${PASSWORD_ENCRYPTION_KEY}
API_KEY_SALT_ROUNDS: ${API_KEY_SALT_ROUNDS}
API_KEY_ENCRYPTION_KEY: ${API_KEY_ENCRYPTION_KEY}
FEIDE_CLIENT_ID: ${FEIDE_CLIENT_ID}
FEIDE_CLIENT_SECRET: ${FEIDE_CLIENT_SECRET}
MAIL_SERVER: ${MAIL_SERVER}
MAIL_DOMAIN: ${MAIL_DOMAIN}
DOMAIN: ${DOMAIN}
JWT_PRIVATE_KEY: ${JWT_PRIVATE_KEY}
JWT_PUBLIC_KEY: ${JWT_PUBLIC_KEY}
JWT_SECRET: ${JWT_SECRET}
depends_on:
db:
condition: service_healthy
prisma:
condition: service_completed_successfully

db:
image: postgres:16.0-alpine
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
healthcheck:
test:
[
"CMD-SHELL",
"sh -c 'pg_isready -U ${DB_USERNAME} -d ${DB_NAME}'"
]
interval: 0.5s
timeout: 0.5s
retries: 60

prisma:
build:
context: ${PROJECT_ROOT:-.}/src/prisma
dockerfile: ${PROJECT_ROOT:-.}/prismaservice/Dockerfile
args:
SHOULD_MIGRATE: ${VEVEN_DB_URI}
environment:
DB_URI: ${DB_URI}
MIGRATE_FROM_VEVEN: ${MIGRATE_FROM_VEVEN}
VEVEN_STORE_URL: ${VEVEN_STORE_URL}
VEVEN_DB_URI: ${VEVEN_DB_URI}
MIGRATION_WITH_LIMITS: ${MIGRATION_WITH_LIMITS}
PASSWORD_SALT_ROUNDS: ${PASSWORD_SALT_ROUNDS}
PASSWORD_ENCRYPTION_KEY: ${PASSWORD_ENCRYPTION_KEY}
API_KEY_SALT_ROUNDS: ${API_KEY_SALT_ROUNDS}
API_KEY_ENCRYPTION_KEY: ${API_KEY_ENCRYPTION_KEY}
depends_on:
db:
condition: service_healthy

nginx:
image: nginx:1.21.3-alpine
depends_on:
- projectnext
92 changes: 16 additions & 76 deletions docker-compose.dev.yml
Original file line number Diff line number Diff line change
@@ -1,110 +1,50 @@


services:
projectnext:
build:
context: ${PROJECT_ROOT:-.}/
dockerfile: ${PROJECT_ROOT:-.}/Dockerfile
target: dev
extends:
file: docker-compose.base.yml
service: projectnext
ports:
- 3000:3000
build:
target: dev
volumes:
- devstore:/usr/src/app/store
- dotnext:/usr/src/app/.next
- ${PROJECT_ROOT:-.}/src:/usr/src/app/src
- ${PROJECT_ROOT:-.}/src/prisma/schema:/usr/src/app/src/prisma/schema
- ${PROJECT_ROOT:-.}/package.json:/usr/src/app/package.json
- ${PROJECT_ROOT:-.}/package-lock.json:/usr/src/app/package-lock.json
- ${PROJECT_ROOT:-.}/logs:/usr/src/app/logs
environment:
NODE_ENV: development
DB_URI: ${DB_URI}
LOG_LEVEL: ${LOG_LEVEL}
LOG_TO_CONSOLE: ${LOG_TO_CONSOLE}
LOG_TO_FOLDER: ${LOG_TO_FOLDER}
LOG_MAX_FILES: ${LOG_MAX_FILES}
NEXTAUTH_URL: ${NEXTAUTH_URL}
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
PASSWORD_SALT_ROUNDS: ${PASSWORD_SALT_ROUNDS}
PASSWORD_ENCRYPTION_KEY: ${PASSWORD_ENCRYPTION_KEY}
API_KEY_SALT_ROUNDS: ${API_KEY_SALT_ROUNDS}
API_KEY_ENCRYPTION_KEY: ${API_KEY_ENCRYPTION_KEY}
NEXT_TELEMETRY_DISABLED: ${NEXT_TELEMETRY_DISABLED}
FEIDE_CLIENT_ID: ${FEIDE_CLIENT_ID}
FEIDE_CLIENT_SECRET: ${FEIDE_CLIENT_SECRET}
MAIL_SERVER: ${MAIL_SERVER}
MAIL_DOMAIN: ${MAIL_DOMAIN}
DOMAIN: ${DOMAIN}
JWT_PRIVATE_KEY: ${JWT_PRIVATE_KEY}
JWT_PUBLIC_KEY: ${JWT_PUBLIC_KEY}
JWT_SECRET: ${JWT_SECRET}
depends_on:
db:
condition: service_healthy
prisma:
condition: service_completed_successfully
links:
- db
- devstore:/usr/src/app/store
- dotnext:/usr/src/app/.next

db:
image: postgres:16.0-alpine
extends:
file: docker-compose.base.yml
service: db
ports:
- 5432:5432
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- devdb:/var/lib/postgresql/data
healthcheck:
test:
[
"CMD-SHELL",
"sh -c 'pg_isready -U ${DB_USERNAME} -d ${DB_NAME}'"
]
interval: 0.5s
timeout: 0.5s
retries: 60

prisma:
extends:
file: docker-compose.base.yml
service: prisma
build:
context: ${PROJECT_ROOT:-.}/src/prisma
dockerfile: ${PROJECT_ROOT:-.}/prismaservice/Dockerfile
target: dev
args:
SHOULD_MIGRATE: ${VEVEN_DB_URI}
environment:
NODE_ENV: development
DB_URI: ${DB_URI}
MIGRATE_FROM_VEVEN: ${MIGRATE_FROM_VEVEN}
VEVEN_STORE_URL: ${VEVEN_STORE_URL}
VEVEN_DB_URI: ${VEVEN_DB_URI}
MIGRATION_WITH_LIMITS: ${MIGRATION_WITH_LIMITS}
PASSWORD_SALT_ROUNDS: ${PASSWORD_SALT_ROUNDS}
PASSWORD_ENCRYPTION_KEY: ${PASSWORD_ENCRYPTION_KEY}
API_KEY_SALT_ROUNDS: ${API_KEY_SALT_ROUNDS}
API_KEY_ENCRYPTION_KEY: ${API_KEY_ENCRYPTION_KEY}
volumes:
- ${PROJECT_ROOT:-.}/src/prisma/schema:/usr/src/app/schema
- devstore:/usr/src/app/prismaservice/store
- dobbelOmegaManifest:/usr/src/app/prismaservice/dobbelOmegaManifest
depends_on:
db:
condition: service_healthy
links:
- db

nginx:
image: nginx:1.21.3-alpine
extends:
file: docker-compose.base.yml
service: nginx
ports:
- 80:80
volumes:
- ${PROJECT_ROOT:-.}/containers/nginx/nginx.dev.conf:/etc/nginx/nginx.conf
- devstore:/usr/store
depends_on:
- projectnext
links:
- projectnext

volumes:
devdb:
Expand Down
87 changes: 87 additions & 0 deletions docker-compose.prod.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
services:
projectnext:
extends:
file: docker-compose.base.yml
service: projectnext
build:
target: prod
volumes:
- store:/usr/src/app/store
- logs:/usr/src/app/logs
deploy:
replicas: 8

db:
extends:
file: docker-compose.base.yml
service: db
restart: always
volumes:
- proddb:/var/lib/postgresql/data

prisma:
extends:
file: docker-compose.base.yml
service: prisma
build:
target: prod
volumes:
- store:/usr/src/app/prismaservice/store
- dobbelOmegaManifest:/usr/src/app/prismaservice/dobbelOmegaManifest

nginx:
extends:
file: docker-compose.base.yml
service: nginx
restart: always
ports:
- 80:80
- 443:443
environment:
DOMAIN: ${DOMAIN}
PROXY_PASS: 'projectnext:3000'
volumes:
- ./containers/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./containers/nginx/default.conf:/etc/nginx/templates/default.conf.template:ro
- store:/usr/store:ro
- ./certs/conf:/etc/letsencrypt:ro
- ./certs/www/:/var/www/certbot:ro

certbot:
image: certbot/certbot:latest
volumes:
- ./certs/www:/var/www:rw
- ./certs/conf:/etc/letsencrypt:rw
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 14d & wait $${!}; done;'"
restart: always

postfix:
build: ${PROJECT_ROOT:-.}/containers/postfix/
ports:
- '587:587'
- '25:25'
environment:
POSTGRES_HOST: 'db'
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
MY_HOSTNAME: ${MAIL_DOMAIN}
MY_DOMAIN: ${DOMAIN}
RELAY_HOST: ${MAIL_RELAY_HOST}
volumes:
- ./certs/conf:/etc/letsencrypt:ro
depends_on:
- db
links:
- db
restart: always

volumes:
proddb:
driver: local
store:
driver: local
logs:
driver: local
dobbelOmegaManifest:
driver: local
7 changes: 7 additions & 0 deletions docker-compose.test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
services:
projectnext:
extends:
file: docker-compose.base.yml
service: projectnext
build:
target: test
Loading
Loading