From 65c76f225bc536646c10153fee9fc0c2a8de8b77 Mon Sep 17 00:00:00 2001 From: Joao P Dubas Date: Fri, 16 May 2025 17:03:26 +0000 Subject: [PATCH] feat: add strapi cms --- compose.yml | 1 + services/strapi/Dockerfile | 59 +++++++++++++-------- services/strapi/compose.yml | 100 +++++++++++++++++------------------- 3 files changed, 87 insertions(+), 73 deletions(-) diff --git a/compose.yml b/compose.yml index 8f26981..6ff0481 100644 --- a/compose.yml +++ b/compose.yml @@ -4,3 +4,4 @@ name: ${CMS_PROJECT_NAME:-cms} include: - services/database/compose.yml - services/directus/compose.yml + - services/strapi/compose.yml diff --git a/services/strapi/Dockerfile b/services/strapi/Dockerfile index 033ab92..226f264 100644 --- a/services/strapi/Dockerfile +++ b/services/strapi/Dockerfile @@ -1,49 +1,66 @@ -FROM node:18-alpine3.18 AS development -# Installing libvips-dev for sharp Compatibility -RUN apk update && apk add --no-cache build-base gcc autoconf automake zlib-dev libpng-dev nasm bash vips-dev git +ARG BASE_IMAGE=node:18.20.7-alpine3.21 + +FROM ${BASE_IMAGE} AS development +RUN apk update \ + && apk add --no-cache \ + autoconf \ + automake \ + bash \ + build-base \ + gcc \ + git \ + libpng-dev \ + nasm \ + vips-dev \ + zlib-dev ARG NODE_ENV=development ENV NODE_ENV=${NODE_ENV} - WORKDIR /opt/ -COPY package.json yarn.lock ./ -RUN yarn global add node-gyp -RUN yarn config set network-timeout 600000 -g && yarn install +COPY ./cms/package.json ./cms/yarn.lock ./ +RUN yarn global add node-gyp \ + && yarn config set network-timeout 600000 -g \ + && yarn install ENV PATH /opt/node_modules/.bin:$PATH - WORKDIR /opt/app -COPY . . +COPY ./cms . RUN chown -R node:node /opt/app USER node RUN ["yarn", "build"] EXPOSE 1337 CMD ["yarn", "develop"] -# Creating multi-stage build for production -FROM node:18-alpine as build -RUN apk update && apk add --no-cache build-base gcc autoconf automake zlib-dev libpng-dev vips-dev git > /dev/null 2>&1 -ENV NODE_ENV=production +FROM ${BASE_IMAGE} AS build +RUN apk update \ + && apk add --no-cache \ + autoconf \ + automake \ + build-base \ + gcc \ + git \ + libpng-dev \ + vips-dev \ + zlib-dev > /dev/null 2>&1 +ARG NODE_ENV=production ENV NODE_ENV=${NODE_ENV} - WORKDIR /opt/ -COPY package.json yarn.lock ./ -RUN yarn global add node-gyp -RUN yarn config set network-timeout 600000 -g && yarn install --production +COPY ./cms/package.json ./cms/yarn.lock ./ +RUN yarn global add node-gyp \ + && yarn config set network-timeout 600000 -g \ + && yarn install --production ENV PATH /opt/node_modules/.bin:$PATH WORKDIR /opt/app COPY . . RUN yarn build -# Creating final production image -FROM node:18-alpine +FROM ${BASE_IMAGE} AS production RUN apk add --no-cache vips-dev -ENV NODE_ENV=production +ARG NODE_ENV=production ENV NODE_ENV=${NODE_ENV} WORKDIR /opt/ COPY --from=build /opt/node_modules ./node_modules WORKDIR /opt/app COPY --from=build /opt/app ./ ENV PATH /opt/node_modules/.bin:$PATH - RUN chown -R node:node /opt/app USER node EXPOSE 1337 diff --git a/services/strapi/compose.yml b/services/strapi/compose.yml index 019af81..3ebe9c1 100644 --- a/services/strapi/compose.yml +++ b/services/strapi/compose.yml @@ -1,59 +1,55 @@ --- services: - strapi: - container_name: strapi - build: . - image: strapi:latest + strapi_development: + build: + context: . + target: development + args: + NODE_ENV: development + pull_policy: never + image: 'strapi:${CMS_STRAPI_TAG:-dev}' restart: unless-stopped - env_file: .env - environment: - DATABASE_CLIENT: ${DATABASE_CLIENT} - DATABASE_HOST: strapiDB - DATABASE_PORT: ${DATABASE_PORT} - DATABASE_NAME: ${DATABASE_NAME} - DATABASE_USERNAME: ${DATABASE_USERNAME} - DATABASE_PASSWORD: ${DATABASE_PASSWORD} - JWT_SECRET: ${JWT_SECRET} - ADMIN_JWT_SECRET: ${ADMIN_JWT_SECRET} - APP_KEYS: ${APP_KEYS} - NODE_ENV: ${NODE_ENV} - volumes: - - ./config:/opt/app/config - - ./src:/opt/app/src - - ./package.json:/opt/package.json - - ./yarn.lock:/opt/yarn.lock - - ./.env:/opt/app/.env - - ./public/uploads:/opt/app/public/uploads - ports: - - "1337:1337" - networks: - - strapi + hostname: strapi_development + environment: &strapi_env + DATABASE_CLIENT: postgres + DATABASE_HOST: ${CMS_POSTGRES_HOST:-postgres} + DATABASE_PORT: ${CMS_POSTGRES_PORT:-5432} + DATABASE_NAME: strapi_development + DATABASE_USERNAME: ${CMS_POSTGRES_USER:-postgres} + DATABASE_PASSWORD: ${CMS_POSTGRES_PASSWORD:-postgres} + JWT_SECRET: ${CMS_STRAPI_JWT_SECRET:-replace-with-random-value} + ADMIN_JWT_SECRET: ${CMS_STRAPI_ADMIN_JWT_SECRET:-replace-with-random-value} + APP_KEYS: ${CMS_STRAPI_APP_KEYS:-replace-with-random-value} + NODE_ENV: development depends_on: - - strapiDB - - strapiDB: - container_name: strapiDB - platform: linux/amd64 #for platform error on Apple M1 chips - restart: unless-stopped - env_file: .env - image: postgres:12.0-alpine - environment: - POSTGRES_USER: ${DATABASE_USERNAME} - POSTGRES_PASSWORD: ${DATABASE_PASSWORD} - POSTGRES_DB: ${DATABASE_NAME} + postgres: + condition: service_healthy volumes: - - strapi-data:/var/lib/postgresql/data/ #using a volume - #- ./data:/var/lib/postgresql/data/ # if you want to use a bind folder - + - ./cms/package.json:/opt/package.json + - ./cms/yarn.lock:/opt/yarn.lock + - ./cms/src:/opt/app/src + - ./cms/config:/opt/app/config + - ./cms/public/uploads:/opt/app/public/uploads ports: - - "5432:5432" - networks: - - strapi + - ${CMS_STRAPI_PORTS:-1337:1337} -volumes: - strapi-data: - -networks: - strapi: - name: Strapi - driver: bridge + strapi_production: + build: + context: . + target: production + args: + NODE_ENV: production + pull_policy: never + image: 'strapi:${CMS_STRAPI_PRODUCTION_TAG:-prod}' + restart: unless-stopped + hostname: strapi_production + profiles: + - production + environment: + <<: *strapi_env + NODE_ENV: production + depends_on: + postgres: + condition: service_healthy + ports: + - ${CMS_STRAPI_PRODUCTION_PORTS:-1338:1337}