From 0c32dbfd4fadbe69e06ce790c38fd9beff276780 Mon Sep 17 00:00:00 2001 From: iyanumajekodunmi756 Date: Thu, 30 Jul 2026 05:06:16 +0100 Subject: [PATCH] chore: containerize backend with Docker and Compose --- .dockerignore | 14 +++++++++++ Dockerfile | 28 +++++++++++++++++++++ README.md | 27 +++++++++++++++++--- docker-compose.override.yml | 11 +++++++++ docker-compose.yml | 49 +++++++++++++++++++++++++++++++++++++ scripts/docker-build.sh | 4 +++ scripts/docker-run.sh | 8 ++++++ 7 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker-compose.override.yml create mode 100644 docker-compose.yml create mode 100644 scripts/docker-build.sh create mode 100644 scripts/docker-run.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..30d34bf8 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,14 @@ +node_modules +npm-debug.log +yarn.lock +pnpm-lock.yaml +.git +.github +.vscode +.idea +.env +.env.* +coverage +*.log +dist +k6/results diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..6e1c9b39 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +FROM node:20-alpine AS builder + +WORKDIR /app + +COPY package.json package-lock.json ./ +RUN npm ci + +COPY . . +RUN npm test + +FROM node:20-alpine AS production + +WORKDIR /app + +ENV NODE_ENV=production + +COPY package.json package-lock.json ./ +RUN npm ci --omit=dev && npm cache clean --force + +COPY --from=builder /app/index.js ./index.js +COPY --from=builder /app/src ./src +COPY --from=builder /app/scripts ./scripts + +USER node + +EXPOSE 3000 + +CMD ["node", "index.js"] diff --git a/README.md b/README.md index c5cf4d95..8aa4b458 100644 --- a/README.md +++ b/README.md @@ -499,8 +499,21 @@ npm ci --production ### Docker ```bash -docker build -t equipchain-backend . -docker run -p 3000:3000 --env-file .env equipchain-backend +docker build -t equipchain-backend:local . +docker run --rm -p 3000:3000 --env-file .env equipchain-backend:local +``` + +Run the full local stack (API + Redis) with Docker Compose: + +```bash +docker compose up --build +``` + +Helper scripts: + +```bash +sh scripts/docker-build.sh +sh scripts/docker-run.sh ``` --- @@ -603,12 +616,18 @@ Test results (HTML reports, JSON summaries) are stored in `k6/results/`. This di ### Docker (Recommended) ```bash -docker build -t equipchain-backend . +docker build -t equipchain-backend:local . docker run -d \ --name equipchain-api \ -p 3000:3000 \ --env-file .env \ - equipchain-backend + equipchain-backend:local +``` + +Docker Compose (API + Redis): + +```bash +docker compose up -d --build ``` ### Cloud Platforms diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100644 index 00000000..c8e55cf6 --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,11 @@ +services: + api: + build: + target: builder + environment: + NODE_ENV: ${NODE_ENV:-development} + SKIP_SEED: ${SKIP_SEED:-1} + command: ["node", "--watch", "index.js"] + volumes: + - ./:/app + - /app/node_modules diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..3890fe0f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,49 @@ +services: + api: + build: + context: . + dockerfile: Dockerfile + target: production + image: equipchain-backend:local + environment: + NODE_ENV: ${NODE_ENV:-production} + PORT: ${PORT:-3000} + CONTRACT_ID: ${CONTRACT_ID:-CB7PSJZALNWNX7NLOAM6LOEL4OJZMFPQZJMIYO522ZSACYWXTZIDEDSS} + REDIS_URL: ${REDIS_URL:-redis://redis:6379} + SKIP_SEED: ${SKIP_SEED:-1} + ports: + - "${PORT:-3000}:3000" + depends_on: + redis: + condition: service_healthy + healthcheck: + test: ["CMD-SHELL", "wget -qO- http://localhost:3000/api/health > /dev/null || exit 1"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + networks: + - equipchain + + redis: + image: redis:7-alpine + command: ["redis-server", "--appendonly", "yes"] + ports: + - "${REDIS_PORT:-6379}:6379" + volumes: + - redis-data:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 5s + networks: + - equipchain + +volumes: + redis-data: + +networks: + equipchain: + driver: bridge diff --git a/scripts/docker-build.sh b/scripts/docker-build.sh new file mode 100644 index 00000000..2c7306d3 --- /dev/null +++ b/scripts/docker-build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +set -eu + +docker build -t equipchain-backend:local . diff --git a/scripts/docker-run.sh b/scripts/docker-run.sh new file mode 100644 index 00000000..a996b4de --- /dev/null +++ b/scripts/docker-run.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env sh +set -eu + +if [ -f .env ]; then + docker run --rm -p 3000:3000 --env-file .env equipchain-backend:local +else + docker run --rm -p 3000:3000 equipchain-backend:local +fi