From 91bb329370912934ce3093366273ab9b6b559ae6 Mon Sep 17 00:00:00 2001 From: jamesread Date: Sat, 7 Sep 2024 01:52:02 +0100 Subject: [PATCH 01/14] feat: Dockerfile! --- Dockerfile | 38 ++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 39 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..2418810d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,38 @@ +# Foundation image +FROM registry.fedoraproject.org/fedora-minimal:40 AS foundation + +RUN microdnf install --nodocs --noplugins --setopt=keepcache=0 --setopt=install_weak_deps=0 -y \ + npm \ + node \ + && microdnf clean all + +# Builder image +FROM foundation AS builder + +run mkdir /src + +COPY . /src + +WORKDIR /src + +RUN npx nx reset +RUN npm run build + +# Output image +FROM foundation AS dist + +LABEL org.opencontainers.image.source=https://github.com/gitroomhq/postiz-app +LABEL org.opencontainers.image.title="Postiz App" + +RUN mkdir -p /config /app + +COPY --from=builder /src/dist /app/dist/ +COPY --from=builder /src/package.json /app/ +COPY --from=builder /src/nx.json /app/ + +EXPOSE 4200 +EXPOSE 3000 + +WORKDIR /app + +ENTRYPOINT ["npm", "run", "dev"] diff --git a/package.json b/package.json index 9a5c2dc6..bfadd59e 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "prisma-generate": "cd ./libraries/nestjs-libraries/src/database/prisma && npx prisma generate", "prisma-db-push": "cd ./libraries/nestjs-libraries/src/database/prisma && npx prisma db push", "prisma-reset": "cd ./libraries/nestjs-libraries/src/database/prisma && npx prisma db push --force-reset && npx prisma db push", + "build-docker-image": "docker rmi localhost/postiz || true && docker build -t localhost/postiz . && docker create --name postiz -p 3000:3000 -p 4200:4200 localhost/postiz", "postinstall": "npm run prisma-generate" }, "private": true, From b233abaa11b852201bf93b507d35ba088d88718c Mon Sep 17 00:00:00 2001 From: jamesread Date: Sat, 7 Sep 2024 10:00:33 +0100 Subject: [PATCH 02/14] feat: Add production start, config vol, fox typos --- Dockerfile | 9 +++++++-- package.json | 3 ++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2418810d..5e87f34a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ RUN microdnf install --nodocs --noplugins --setopt=keepcache=0 --setopt=install_ # Builder image FROM foundation AS builder -run mkdir /src +RUN mkdir /src COPY . /src @@ -26,13 +26,18 @@ LABEL org.opencontainers.image.title="Postiz App" RUN mkdir -p /config /app +VOLUME /config + COPY --from=builder /src/dist /app/dist/ COPY --from=builder /src/package.json /app/ COPY --from=builder /src/nx.json /app/ +COPY .env.example /config/.env +COPY var/docker-entrypoint.sh /app/entrypoint.sh + EXPOSE 4200 EXPOSE 3000 WORKDIR /app -ENTRYPOINT ["npm", "run", "dev"] +ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/package.json b/package.json index bfadd59e..2ea2cf88 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "prisma-generate": "cd ./libraries/nestjs-libraries/src/database/prisma && npx prisma generate", "prisma-db-push": "cd ./libraries/nestjs-libraries/src/database/prisma && npx prisma db push", "prisma-reset": "cd ./libraries/nestjs-libraries/src/database/prisma && npx prisma db push --force-reset && npx prisma db push", - "build-docker-image": "docker rmi localhost/postiz || true && docker build -t localhost/postiz . && docker create --name postiz -p 3000:3000 -p 4200:4200 localhost/postiz", + "docker-build": "docker rmi localhost/postiz || true && docker build -t localhost/postiz . ", + "docker-create": "docker kill postiz || true && docker rm postiz || true && docker create --name postiz -p 3000:3000 -p 4200:4200 localhost/postiz", "postinstall": "npm run prisma-generate" }, "private": true, From a70ef27cb2a35869e677f18baa021e96c81388dd Mon Sep 17 00:00:00 2001 From: jamesread Date: Mon, 9 Sep 2024 02:45:41 +0100 Subject: [PATCH 03/14] wip: Arch, devcontainer + dist, supervisord --- .devcontainer/devcontainer.json | 14 ++++++ .dockerignore | 6 +++ Dockerfile | 77 ++++++++++++++++------------- package.json | 4 +- var/docker/entrypoint.sh | 36 ++++++++++++++ var/docker/supervisord/backend.ini | 5 ++ var/docker/supervisord/base.ini | 6 +++ var/docker/supervisord/cron.ini | 5 ++ var/docker/supervisord/frontend.ini | 5 ++ var/docker/supervisord/workers.ini | 5 ++ 10 files changed, 127 insertions(+), 36 deletions(-) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .dockerignore create mode 100755 var/docker/entrypoint.sh create mode 100644 var/docker/supervisord/backend.ini create mode 100644 var/docker/supervisord/base.ini create mode 100644 var/docker/supervisord/cron.ini create mode 100644 var/docker/supervisord/frontend.ini create mode 100644 var/docker/supervisord/workers.ini diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..6854df0b --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,14 @@ +{ + "name": "Postiz Dev Container", + "image": "localhost/postiz-devcontainer", + "features": {}, + "customizations": { + "vscode": { + "settings": {}, + "extensions": [] + } + }, + "forwardPorts": ["4200:4200", "3000:3000"], + "mounts": ["source=/apps,destination=/apps/dist/,type=bind,consistency=cached"] +} + diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..6b6f71ee --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +# We want the docker builds to be clean, and as fast as possible. Don't send +# any half-built stuff in the build context as a pre-caution (also saves copying +# 180k files in node_modules that isn't used!). +node_modules +dist +.nx diff --git a/Dockerfile b/Dockerfile index 5e87f34a..46619784 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,43 +1,52 @@ -# Foundation image -FROM registry.fedoraproject.org/fedora-minimal:40 AS foundation +# Base image +FROM docker.io/node:20.17-alpine3.19 AS base -RUN microdnf install --nodocs --noplugins --setopt=keepcache=0 --setopt=install_weak_deps=0 -y \ - npm \ - node \ - && microdnf clean all +ENV NPM_CONFIG_UPDATE_NOTIFIER=false +ENV NEXT_TELEMETRY_DISABLED=1 -# Builder image -FROM foundation AS builder +RUN apk add --no-cache \ + bash=5.2.21-r0 \ + supervisor=4.2.5-r4 -RUN mkdir /src - -COPY . /src - -WORKDIR /src - -RUN npx nx reset -RUN npm run build - -# Output image -FROM foundation AS dist - -LABEL org.opencontainers.image.source=https://github.com/gitroomhq/postiz-app -LABEL org.opencontainers.image.title="Postiz App" - -RUN mkdir -p /config /app - -VOLUME /config - -COPY --from=builder /src/dist /app/dist/ -COPY --from=builder /src/package.json /app/ -COPY --from=builder /src/nx.json /app/ - -COPY .env.example /config/.env -COPY var/docker-entrypoint.sh /app/entrypoint.sh +WORKDIR /app EXPOSE 4200 EXPOSE 3000 -WORKDIR /app +RUN mkdir -p /config + +COPY .env.example /config/.env + +VOLUME /config + +LABEL org.opencontainers.image.source=https://github.com/gitroomhq/postiz-app + +# Builder image +FROM base AS devcontainer + +COPY nx.json tsconfig.base.json package.json package-lock.json /app/ +COPY apps /app/apps/ +COPY libraries /app/libraries/ + +RUN npm ci --no-fund && npm run build + +COPY var/docker/entrypoint.sh /app/entrypoint.sh +COPY var/docker/supervisord/* /app/supervisord_configs/ + +LABEL org.opencontainers.image.title="Postiz App (DevContainer)" + +ENTRYPOINT ["/app/entrypoint.sh"] + +# Output image +FROM base AS dist + +COPY --from=devcontainer /app/node_modules/ /app/node_modules/ +COPY --from=devcontainer /app/dist/ /app/dist/ + +COPY package.json nx.json /app/ +COPY var/docker/entrypoint.sh /app/entrypoint.sh + +## Labels at the bottom, because CI will eventially add dates, commit hashes, etc. +LABEL org.opencontainers.image.title="Postiz App (Production)" ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/package.json b/package.json index 2ea2cf88..efd4a817 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,8 @@ "prisma-generate": "cd ./libraries/nestjs-libraries/src/database/prisma && npx prisma generate", "prisma-db-push": "cd ./libraries/nestjs-libraries/src/database/prisma && npx prisma db push", "prisma-reset": "cd ./libraries/nestjs-libraries/src/database/prisma && npx prisma db push --force-reset && npx prisma db push", - "docker-build": "docker rmi localhost/postiz || true && docker build -t localhost/postiz . ", - "docker-create": "docker kill postiz || true && docker rm postiz || true && docker create --name postiz -p 3000:3000 -p 4200:4200 localhost/postiz", + "docker-build": "docker rmi localhost/postiz || true && docker build --target dist -t localhost/postiz -f Dockerfile . && docker build --target devcontainer -t localhost/postiz-devcontainer -f Dockerfile .", + "docker-create": "docker kill postiz || true && docker rm postiz || true && docker create --name postiz -p 3000:3000 -p 4200:4200 localhost/postiz", "postinstall": "npm run prisma-generate" }, "private": true, diff --git a/var/docker/entrypoint.sh b/var/docker/entrypoint.sh new file mode 100755 index 00000000..609fa7d0 --- /dev/null +++ b/var/docker/entrypoint.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +if [[ "$SKIP_CONFIG_CHECK" -ne "true" ]]; then + if [ ! -f /config/.env ]; then + echo "ERROR: No .env file found in /config/.env" + fi + + ln -s /config/env /app/.env +fi + +if [[ "$POSTIZ_APPS" -eq "" ]]; then + echo "POSTIZ_APPS is not set, starting everything!" + POSTIZ_APPS="frontend workers cron" +fi + +mkdir -p /etc/supervisor.d/ + +cp /app/supervisord_configs/base.conf /etc/supervisor.d/ + +if [[ "$POSTIZ_APPS" == *"frontend"* ]]; then + cp /app/supervisord_configs/frontend.conf /etc/supervisor.d/ +fi + +if [[ $POSTIZ_APPS == *"workers"* ]]; then + cp /app/supervisord_configs/workers.conf /etc/supervisor.d/ +fi + +if [[ $POSTIZ_APPS == *"cron"* ]]; then + cp /app/supervisord_configs/cron.conf /etc/supervisor.d/ +fi + +if [[ $POSTIZ_APPS == *"backend"* ]]; then + cp /app/supervisord_configs/backend.conf /etc/supervisor.d/ +fi + +/usr/bin/supervisord diff --git a/var/docker/supervisord/backend.ini b/var/docker/supervisord/backend.ini new file mode 100644 index 00000000..8e56645c --- /dev/null +++ b/var/docker/supervisord/backend.ini @@ -0,0 +1,5 @@ +[program:backend] +directory=/app +command=npm run start:prod +autostart=true +autorestart=false diff --git a/var/docker/supervisord/base.ini b/var/docker/supervisord/base.ini new file mode 100644 index 00000000..b220a983 --- /dev/null +++ b/var/docker/supervisord/base.ini @@ -0,0 +1,6 @@ +[supervisord] +nodaemon=true +logfile=/dev/null +logfile_maxbytes=0 + + diff --git a/var/docker/supervisord/cron.ini b/var/docker/supervisord/cron.ini new file mode 100644 index 00000000..ef22047a --- /dev/null +++ b/var/docker/supervisord/cron.ini @@ -0,0 +1,5 @@ +[program:cron] +directory=/app +command=npm run start:prod:cron +autostart=true +autorestart=false diff --git a/var/docker/supervisord/frontend.ini b/var/docker/supervisord/frontend.ini new file mode 100644 index 00000000..737aedd9 --- /dev/null +++ b/var/docker/supervisord/frontend.ini @@ -0,0 +1,5 @@ +[program:frontend] +directory=/app +command=npm run start:prod:frontend +autostart=true +autorestart=false diff --git a/var/docker/supervisord/workers.ini b/var/docker/supervisord/workers.ini new file mode 100644 index 00000000..fd84a708 --- /dev/null +++ b/var/docker/supervisord/workers.ini @@ -0,0 +1,5 @@ +[program:workers] +directory=/app +command=npm run start:prod:workers +autostart=true +autorestart=false From 260b281cb448c9a9c4f77a311c2202caaa02a556 Mon Sep 17 00:00:00 2001 From: jamesread Date: Mon, 9 Sep 2024 02:45:41 +0100 Subject: [PATCH 04/14] wip: Arch, devcontainer + dist, supervisord Co-Authored-By: jonathan-irvin --- .devcontainer/devcontainer.json | 14 ++++++ .dockerignore | 6 +++ Dockerfile | 77 ++++++++++++++++------------- package.json | 4 +- var/docker/entrypoint.sh | 36 ++++++++++++++ var/docker/supervisord/backend.ini | 5 ++ var/docker/supervisord/base.ini | 6 +++ var/docker/supervisord/cron.ini | 5 ++ var/docker/supervisord/frontend.ini | 5 ++ var/docker/supervisord/workers.ini | 5 ++ 10 files changed, 127 insertions(+), 36 deletions(-) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .dockerignore create mode 100755 var/docker/entrypoint.sh create mode 100644 var/docker/supervisord/backend.ini create mode 100644 var/docker/supervisord/base.ini create mode 100644 var/docker/supervisord/cron.ini create mode 100644 var/docker/supervisord/frontend.ini create mode 100644 var/docker/supervisord/workers.ini diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..6854df0b --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,14 @@ +{ + "name": "Postiz Dev Container", + "image": "localhost/postiz-devcontainer", + "features": {}, + "customizations": { + "vscode": { + "settings": {}, + "extensions": [] + } + }, + "forwardPorts": ["4200:4200", "3000:3000"], + "mounts": ["source=/apps,destination=/apps/dist/,type=bind,consistency=cached"] +} + diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..6b6f71ee --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +# We want the docker builds to be clean, and as fast as possible. Don't send +# any half-built stuff in the build context as a pre-caution (also saves copying +# 180k files in node_modules that isn't used!). +node_modules +dist +.nx diff --git a/Dockerfile b/Dockerfile index 5e87f34a..46619784 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,43 +1,52 @@ -# Foundation image -FROM registry.fedoraproject.org/fedora-minimal:40 AS foundation +# Base image +FROM docker.io/node:20.17-alpine3.19 AS base -RUN microdnf install --nodocs --noplugins --setopt=keepcache=0 --setopt=install_weak_deps=0 -y \ - npm \ - node \ - && microdnf clean all +ENV NPM_CONFIG_UPDATE_NOTIFIER=false +ENV NEXT_TELEMETRY_DISABLED=1 -# Builder image -FROM foundation AS builder +RUN apk add --no-cache \ + bash=5.2.21-r0 \ + supervisor=4.2.5-r4 -RUN mkdir /src - -COPY . /src - -WORKDIR /src - -RUN npx nx reset -RUN npm run build - -# Output image -FROM foundation AS dist - -LABEL org.opencontainers.image.source=https://github.com/gitroomhq/postiz-app -LABEL org.opencontainers.image.title="Postiz App" - -RUN mkdir -p /config /app - -VOLUME /config - -COPY --from=builder /src/dist /app/dist/ -COPY --from=builder /src/package.json /app/ -COPY --from=builder /src/nx.json /app/ - -COPY .env.example /config/.env -COPY var/docker-entrypoint.sh /app/entrypoint.sh +WORKDIR /app EXPOSE 4200 EXPOSE 3000 -WORKDIR /app +RUN mkdir -p /config + +COPY .env.example /config/.env + +VOLUME /config + +LABEL org.opencontainers.image.source=https://github.com/gitroomhq/postiz-app + +# Builder image +FROM base AS devcontainer + +COPY nx.json tsconfig.base.json package.json package-lock.json /app/ +COPY apps /app/apps/ +COPY libraries /app/libraries/ + +RUN npm ci --no-fund && npm run build + +COPY var/docker/entrypoint.sh /app/entrypoint.sh +COPY var/docker/supervisord/* /app/supervisord_configs/ + +LABEL org.opencontainers.image.title="Postiz App (DevContainer)" + +ENTRYPOINT ["/app/entrypoint.sh"] + +# Output image +FROM base AS dist + +COPY --from=devcontainer /app/node_modules/ /app/node_modules/ +COPY --from=devcontainer /app/dist/ /app/dist/ + +COPY package.json nx.json /app/ +COPY var/docker/entrypoint.sh /app/entrypoint.sh + +## Labels at the bottom, because CI will eventially add dates, commit hashes, etc. +LABEL org.opencontainers.image.title="Postiz App (Production)" ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/package.json b/package.json index 2ea2cf88..efd4a817 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,8 @@ "prisma-generate": "cd ./libraries/nestjs-libraries/src/database/prisma && npx prisma generate", "prisma-db-push": "cd ./libraries/nestjs-libraries/src/database/prisma && npx prisma db push", "prisma-reset": "cd ./libraries/nestjs-libraries/src/database/prisma && npx prisma db push --force-reset && npx prisma db push", - "docker-build": "docker rmi localhost/postiz || true && docker build -t localhost/postiz . ", - "docker-create": "docker kill postiz || true && docker rm postiz || true && docker create --name postiz -p 3000:3000 -p 4200:4200 localhost/postiz", + "docker-build": "docker rmi localhost/postiz || true && docker build --target dist -t localhost/postiz -f Dockerfile . && docker build --target devcontainer -t localhost/postiz-devcontainer -f Dockerfile .", + "docker-create": "docker kill postiz || true && docker rm postiz || true && docker create --name postiz -p 3000:3000 -p 4200:4200 localhost/postiz", "postinstall": "npm run prisma-generate" }, "private": true, diff --git a/var/docker/entrypoint.sh b/var/docker/entrypoint.sh new file mode 100755 index 00000000..609fa7d0 --- /dev/null +++ b/var/docker/entrypoint.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +if [[ "$SKIP_CONFIG_CHECK" -ne "true" ]]; then + if [ ! -f /config/.env ]; then + echo "ERROR: No .env file found in /config/.env" + fi + + ln -s /config/env /app/.env +fi + +if [[ "$POSTIZ_APPS" -eq "" ]]; then + echo "POSTIZ_APPS is not set, starting everything!" + POSTIZ_APPS="frontend workers cron" +fi + +mkdir -p /etc/supervisor.d/ + +cp /app/supervisord_configs/base.conf /etc/supervisor.d/ + +if [[ "$POSTIZ_APPS" == *"frontend"* ]]; then + cp /app/supervisord_configs/frontend.conf /etc/supervisor.d/ +fi + +if [[ $POSTIZ_APPS == *"workers"* ]]; then + cp /app/supervisord_configs/workers.conf /etc/supervisor.d/ +fi + +if [[ $POSTIZ_APPS == *"cron"* ]]; then + cp /app/supervisord_configs/cron.conf /etc/supervisor.d/ +fi + +if [[ $POSTIZ_APPS == *"backend"* ]]; then + cp /app/supervisord_configs/backend.conf /etc/supervisor.d/ +fi + +/usr/bin/supervisord diff --git a/var/docker/supervisord/backend.ini b/var/docker/supervisord/backend.ini new file mode 100644 index 00000000..8e56645c --- /dev/null +++ b/var/docker/supervisord/backend.ini @@ -0,0 +1,5 @@ +[program:backend] +directory=/app +command=npm run start:prod +autostart=true +autorestart=false diff --git a/var/docker/supervisord/base.ini b/var/docker/supervisord/base.ini new file mode 100644 index 00000000..b220a983 --- /dev/null +++ b/var/docker/supervisord/base.ini @@ -0,0 +1,6 @@ +[supervisord] +nodaemon=true +logfile=/dev/null +logfile_maxbytes=0 + + diff --git a/var/docker/supervisord/cron.ini b/var/docker/supervisord/cron.ini new file mode 100644 index 00000000..ef22047a --- /dev/null +++ b/var/docker/supervisord/cron.ini @@ -0,0 +1,5 @@ +[program:cron] +directory=/app +command=npm run start:prod:cron +autostart=true +autorestart=false diff --git a/var/docker/supervisord/frontend.ini b/var/docker/supervisord/frontend.ini new file mode 100644 index 00000000..737aedd9 --- /dev/null +++ b/var/docker/supervisord/frontend.ini @@ -0,0 +1,5 @@ +[program:frontend] +directory=/app +command=npm run start:prod:frontend +autostart=true +autorestart=false diff --git a/var/docker/supervisord/workers.ini b/var/docker/supervisord/workers.ini new file mode 100644 index 00000000..fd84a708 --- /dev/null +++ b/var/docker/supervisord/workers.ini @@ -0,0 +1,5 @@ +[program:workers] +directory=/app +command=npm run start:prod:workers +autostart=true +autorestart=false From f38e79d198aaaf65cc52518f3592bc256a6fdce0 Mon Sep 17 00:00:00 2001 From: jamesread Date: Mon, 9 Sep 2024 16:46:19 +0100 Subject: [PATCH 05/14] feat: Dockerfile - fix supervisord, cron build --- Dockerfile | 8 ++++---- var/docker/entrypoint.sh | 18 +++++++++--------- var/docker/supervisord.conf | 10 ++++++++++ .../supervisord/{backend.ini => backend.conf} | 3 +++ var/docker/supervisord/base.ini | 6 ------ var/docker/supervisord/{cron.ini => cron.conf} | 3 +++ .../{frontend.ini => frontend.conf} | 3 +++ .../supervisord/{workers.ini => workers.conf} | 3 +++ 8 files changed, 35 insertions(+), 19 deletions(-) create mode 100644 var/docker/supervisord.conf rename var/docker/supervisord/{backend.ini => backend.conf} (56%) delete mode 100644 var/docker/supervisord/base.ini rename var/docker/supervisord/{cron.ini => cron.conf} (56%) rename var/docker/supervisord/{frontend.ini => frontend.conf} (58%) rename var/docker/supervisord/{workers.ini => workers.conf} (58%) diff --git a/Dockerfile b/Dockerfile index 46619784..08d6d846 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,6 +15,9 @@ EXPOSE 3000 RUN mkdir -p /config +COPY var/docker/entrypoint.sh /app/entrypoint.sh +COPY var/docker/supervisord.conf /etc/supervisord.conf +COPY var/docker/supervisord /app/supervisord_available_configs/ COPY .env.example /config/.env VOLUME /config @@ -28,10 +31,7 @@ COPY nx.json tsconfig.base.json package.json package-lock.json /app/ COPY apps /app/apps/ COPY libraries /app/libraries/ -RUN npm ci --no-fund && npm run build - -COPY var/docker/entrypoint.sh /app/entrypoint.sh -COPY var/docker/supervisord/* /app/supervisord_configs/ +RUN npm ci --no-fund && npx nx run-many --target=build --projects=frontend,backend,workers,cron LABEL org.opencontainers.image.title="Postiz App (DevContainer)" diff --git a/var/docker/entrypoint.sh b/var/docker/entrypoint.sh index 609fa7d0..2e98950e 100755 --- a/var/docker/entrypoint.sh +++ b/var/docker/entrypoint.sh @@ -1,36 +1,36 @@ #!/bin/bash -if [[ "$SKIP_CONFIG_CHECK" -ne "true" ]]; then +if [[ "$SKIP_CONFIG_CHECK" != "true" ]]; then + echo "symlinking /config/.env into /app/.env" + if [ ! -f /config/.env ]; then echo "ERROR: No .env file found in /config/.env" fi - ln -s /config/env /app/.env + ln -sf /config/.env /app/.env fi if [[ "$POSTIZ_APPS" -eq "" ]]; then echo "POSTIZ_APPS is not set, starting everything!" - POSTIZ_APPS="frontend workers cron" + POSTIZ_APPS="frontend workers cron backend" fi mkdir -p /etc/supervisor.d/ -cp /app/supervisord_configs/base.conf /etc/supervisor.d/ - if [[ "$POSTIZ_APPS" == *"frontend"* ]]; then - cp /app/supervisord_configs/frontend.conf /etc/supervisor.d/ + ln -sf /app/supervisord_available_configs/frontend.conf /etc/supervisor.d/ fi if [[ $POSTIZ_APPS == *"workers"* ]]; then - cp /app/supervisord_configs/workers.conf /etc/supervisor.d/ + ln -sf /app/supervisord_available_configs/workers.conf /etc/supervisor.d/ fi if [[ $POSTIZ_APPS == *"cron"* ]]; then - cp /app/supervisord_configs/cron.conf /etc/supervisor.d/ + ln -sf /app/supervisord_available_configs/cron.conf /etc/supervisor.d/ fi if [[ $POSTIZ_APPS == *"backend"* ]]; then - cp /app/supervisord_configs/backend.conf /etc/supervisor.d/ + ln -sf /app/supervisord_available_configs/backend.conf /etc/supervisor.d/ fi /usr/bin/supervisord diff --git a/var/docker/supervisord.conf b/var/docker/supervisord.conf new file mode 100644 index 00000000..c74f511b --- /dev/null +++ b/var/docker/supervisord.conf @@ -0,0 +1,10 @@ +[supervisord] +nodaemon=true +logfile=/dev/null +logfile_maxbytes=0 + +[unix_http_server] +file=/run/supervisord.sock + +[include] +files = /etc/supervisor.d/*.conf diff --git a/var/docker/supervisord/backend.ini b/var/docker/supervisord/backend.conf similarity index 56% rename from var/docker/supervisord/backend.ini rename to var/docker/supervisord/backend.conf index 8e56645c..be803a93 100644 --- a/var/docker/supervisord/backend.ini +++ b/var/docker/supervisord/backend.conf @@ -3,3 +3,6 @@ directory=/app command=npm run start:prod autostart=true autorestart=false +redirect_stderr=true +stdout_logfile=/dev/fd/1 +stdout_logfile_maxbytes=0 diff --git a/var/docker/supervisord/base.ini b/var/docker/supervisord/base.ini deleted file mode 100644 index b220a983..00000000 --- a/var/docker/supervisord/base.ini +++ /dev/null @@ -1,6 +0,0 @@ -[supervisord] -nodaemon=true -logfile=/dev/null -logfile_maxbytes=0 - - diff --git a/var/docker/supervisord/cron.ini b/var/docker/supervisord/cron.conf similarity index 56% rename from var/docker/supervisord/cron.ini rename to var/docker/supervisord/cron.conf index ef22047a..ab653f5a 100644 --- a/var/docker/supervisord/cron.ini +++ b/var/docker/supervisord/cron.conf @@ -3,3 +3,6 @@ directory=/app command=npm run start:prod:cron autostart=true autorestart=false +redirect_stderr=true +stdout_logfile=/dev/fd/1 +stdout_logfile_maxbytes=0 diff --git a/var/docker/supervisord/frontend.ini b/var/docker/supervisord/frontend.conf similarity index 58% rename from var/docker/supervisord/frontend.ini rename to var/docker/supervisord/frontend.conf index 737aedd9..c157a205 100644 --- a/var/docker/supervisord/frontend.ini +++ b/var/docker/supervisord/frontend.conf @@ -3,3 +3,6 @@ directory=/app command=npm run start:prod:frontend autostart=true autorestart=false +redirect_stderr=true +stdout_logfile=/dev/fd/1 +stdout_logfile_maxbytes=0 diff --git a/var/docker/supervisord/workers.ini b/var/docker/supervisord/workers.conf similarity index 58% rename from var/docker/supervisord/workers.ini rename to var/docker/supervisord/workers.conf index fd84a708..5653ec8b 100644 --- a/var/docker/supervisord/workers.ini +++ b/var/docker/supervisord/workers.conf @@ -3,3 +3,6 @@ directory=/app command=npm run start:prod:workers autostart=true autorestart=false +redirect_stderr=true +stdout_logfile=/dev/fd/1 +stdout_logfile_maxbytes=0 From 5a854aa45147c47bb3ff33c36ed40b253fafdbca Mon Sep 17 00:00:00 2001 From: jamesread Date: Mon, 9 Sep 2024 17:20:25 +0100 Subject: [PATCH 06/14] Add container workflow --- .github/workflows/build-containers.yml | 42 ++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .github/workflows/build-containers.yml diff --git a/.github/workflows/build-containers.yml b/.github/workflows/build-containers.yml new file mode 100644 index 00000000..e8240303 --- /dev/null +++ b/.github/workflows/build-containers.yml @@ -0,0 +1,42 @@ +--- +name: "Build Tag" + +on: + push: + tags: + - '*' + +jobs: + build-tag: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + cache-dependency-path: | + **/package-lock.json + + - name: Login to ghcr + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.CONTAINER_TOKEN }} + + - name: docker build + run: npm run docker-build + + - name: docker tag + run: | + docker tag localhost/postiz ghcr.io/githubhq/postiz-app:${{ GITHUB_REF_NAME }} + docker push ghcr.io/githubhq/postiz-app:${{ GITHUB_REF_NAME }} + + docker tag localhost/postiz-devcontainer ghcr.io/githubhq/postiz-app:${{ GITHUB_REF_NAME }} + docker push ghcr.io/githubhq/postiz-devcontainer:${{ GITHUB_REF_NAME }} From 81fd96f6d7f660024ad6f9a0ac14f2c7422f51ef Mon Sep 17 00:00:00 2001 From: jamesread Date: Mon, 9 Sep 2024 17:26:20 +0100 Subject: [PATCH 07/14] doc: Remove more junk from build context Co-Authored-By: jonathan-irvin --- .dockerignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.dockerignore b/.dockerignore index 6b6f71ee..a04f7947 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,3 +4,6 @@ node_modules dist .nx +.devcontainer +.git +*.md From c466f08c80e24d18df5a58ebd0b5409871dd7567 Mon Sep 17 00:00:00 2001 From: jamesread Date: Mon, 9 Sep 2024 17:35:39 +0100 Subject: [PATCH 08/14] ci: Remove /config as it's created anyway Co-Authored-By: jonathan-irvin --- Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 08d6d846..b5775218 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,8 +13,6 @@ WORKDIR /app EXPOSE 4200 EXPOSE 3000 -RUN mkdir -p /config - COPY var/docker/entrypoint.sh /app/entrypoint.sh COPY var/docker/supervisord.conf /etc/supervisord.conf COPY var/docker/supervisord /app/supervisord_available_configs/ From 9c9698c59869edeb3df8ebfe949dff810ec4df7f Mon Sep 17 00:00:00 2001 From: jamesread Date: Mon, 9 Sep 2024 17:40:19 +0100 Subject: [PATCH 09/14] ci: Consolidate entrypoint into the base image Co-Authored-By: jonathan-irvin --- Dockerfile | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index b5775218..34b19b4e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,7 @@ # Base image FROM docker.io/node:20.17-alpine3.19 AS base +## Just reduce unccessary noise in the logs. ENV NPM_CONFIG_UPDATE_NOTIFIER=false ENV NEXT_TELEMETRY_DISABLED=1 @@ -22,6 +23,8 @@ VOLUME /config LABEL org.opencontainers.image.source=https://github.com/gitroomhq/postiz-app +ENTRYPOINT ["/app/entrypoint.sh"] + # Builder image FROM base AS devcontainer @@ -33,8 +36,6 @@ RUN npm ci --no-fund && npx nx run-many --target=build --projects=frontend,backe LABEL org.opencontainers.image.title="Postiz App (DevContainer)" -ENTRYPOINT ["/app/entrypoint.sh"] - # Output image FROM base AS dist @@ -42,9 +43,6 @@ COPY --from=devcontainer /app/node_modules/ /app/node_modules/ COPY --from=devcontainer /app/dist/ /app/dist/ COPY package.json nx.json /app/ -COPY var/docker/entrypoint.sh /app/entrypoint.sh -## Labels at the bottom, because CI will eventially add dates, commit hashes, etc. +## Labels at the bottom, because CI will eventually add dates, commit hashes, etc. LABEL org.opencontainers.image.title="Postiz App (Production)" - -ENTRYPOINT ["/app/entrypoint.sh"] From afbeda159b9338d1e5412a03dc5d0779d49403c4 Mon Sep 17 00:00:00 2001 From: jamesread Date: Mon, 9 Sep 2024 18:08:30 +0100 Subject: [PATCH 10/14] ci: Switch to GITHUB_TOKEN --- .github/workflows/build-containers.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-containers.yml b/.github/workflows/build-containers.yml index e8240303..39439e5e 100644 --- a/.github/workflows/build-containers.yml +++ b/.github/workflows/build-containers.yml @@ -28,7 +28,7 @@ jobs: with: registry: ghcr.io username: ${{ github.actor }} - password: ${{ secrets.CONTAINER_TOKEN }} + password: ${{ github.token }} - name: docker build run: npm run docker-build From 08adb43d63a2278cc66700339d9d39d74b07590b Mon Sep 17 00:00:00 2001 From: jamesread Date: Mon, 9 Sep 2024 20:12:08 +0100 Subject: [PATCH 11/14] ci: Use 20.17 for builds --- .github/workflows/build-containers.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-containers.yml b/.github/workflows/build-containers.yml index 39439e5e..b6ec927b 100644 --- a/.github/workflows/build-containers.yml +++ b/.github/workflows/build-containers.yml @@ -18,7 +18,7 @@ jobs: - name: Setup node uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '20.17' cache: 'npm' cache-dependency-path: | **/package-lock.json From 9e58dd06243dd0c3c92ab2f40111d62a9944bbbd Mon Sep 17 00:00:00 2001 From: Jonathan Irvin Date: Mon, 9 Sep 2024 14:34:56 -0500 Subject: [PATCH 12/14] fix: update dockerfile with additional build to support different arch --- Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 34b19b4e..45498003 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,9 @@ ENV NEXT_TELEMETRY_DISABLED=1 RUN apk add --no-cache \ bash=5.2.21-r0 \ - supervisor=4.2.5-r4 + supervisor=4.2.5-r4 \ + make \ + build-base WORKDIR /app From 79ed89060eb7cd819ca527be03799627fc15d71c Mon Sep 17 00:00:00 2001 From: jamesread Date: Mon, 9 Sep 2024 20:46:17 +0100 Subject: [PATCH 13/14] ci: Move docker build instructions into separate scripts --- .github/workflows/build-containers.yml | 10 +--------- package.json | 4 ++-- var/docker/docker-build.sh | 5 +++++ var/docker/docker-create.sh | 5 +++++ 4 files changed, 13 insertions(+), 11 deletions(-) create mode 100755 var/docker/docker-build.sh create mode 100644 var/docker/docker-create.sh diff --git a/.github/workflows/build-containers.yml b/.github/workflows/build-containers.yml index b6ec927b..4d089a88 100644 --- a/.github/workflows/build-containers.yml +++ b/.github/workflows/build-containers.yml @@ -15,14 +15,6 @@ jobs: with: fetch-depth: 0 - - name: Setup node - uses: actions/setup-node@v4 - with: - node-version: '20.17' - cache: 'npm' - cache-dependency-path: | - **/package-lock.json - - name: Login to ghcr uses: docker/login-action@v3 with: @@ -31,7 +23,7 @@ jobs: password: ${{ github.token }} - name: docker build - run: npm run docker-build + run: /var/run/docker-build.sh - name: docker tag run: | diff --git a/package.json b/package.json index efd4a817..bda70c5e 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,8 @@ "prisma-generate": "cd ./libraries/nestjs-libraries/src/database/prisma && npx prisma generate", "prisma-db-push": "cd ./libraries/nestjs-libraries/src/database/prisma && npx prisma db push", "prisma-reset": "cd ./libraries/nestjs-libraries/src/database/prisma && npx prisma db push --force-reset && npx prisma db push", - "docker-build": "docker rmi localhost/postiz || true && docker build --target dist -t localhost/postiz -f Dockerfile . && docker build --target devcontainer -t localhost/postiz-devcontainer -f Dockerfile .", - "docker-create": "docker kill postiz || true && docker rm postiz || true && docker create --name postiz -p 3000:3000 -p 4200:4200 localhost/postiz", + "docker-build": "./var/docker/docker-build.sh", + "docker-create": "./var/docker/docker-create.sh", "postinstall": "npm run prisma-generate" }, "private": true, diff --git a/var/docker/docker-build.sh b/var/docker/docker-build.sh new file mode 100755 index 00000000..bdbc83d8 --- /dev/null +++ b/var/docker/docker-build.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +docker rmi localhost/postiz || true +docker build --target dist -t localhost/postiz -f Dockerfile . +docker build --target devcontainer -t localhost/postiz-devcontainer -f Dockerfile . diff --git a/var/docker/docker-create.sh b/var/docker/docker-create.sh new file mode 100644 index 00000000..9b8fda99 --- /dev/null +++ b/var/docker/docker-create.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +docker kill postiz || true +docker rm postiz || true +docker create --name postiz -p 3000:3000 -p 4200:4200 localhost/postiz From 7216f2135d757046d7cec5373e25294b00389bc0 Mon Sep 17 00:00:00 2001 From: jamesread Date: Mon, 9 Sep 2024 20:57:49 +0100 Subject: [PATCH 14/14] ci: Dockerfile, add NODE_VERSION param --- Dockerfile | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 45498003..d5c0016d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,13 @@ +# This Dockerfile is used for producing 3 container images. +# +# base - which is thrown away, that contains node and the basic infrastructure. +# devcontainer - which is used for development, and contains the source code and the node_modules. +# dist - which is used for production, and contains the built source code and the node_modules. + +ARG NODE_VERSION="20.17" + # Base image -FROM docker.io/node:20.17-alpine3.19 AS base +FROM docker.io/node:${NODE_VERSION}-alpine3.19 AS base ## Just reduce unccessary noise in the logs. ENV NPM_CONFIG_UPDATE_NOTIFIER=false