Skip to content
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
238 changes: 159 additions & 79 deletions deploy/docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,112 +1,192 @@
FROM maven:3.8.4-openjdk-17-slim AS build-server
##
## Create custom JRE for running Openblocks server application
##
FROM eclipse-temurin:17-jdk-jammy AS jre-build
RUN jlink --add-modules java.base,java.compiler,java.datatransfer,java.desktop,java.instrument,java.logging,java.management,java.management.rmi,java.naming,java.net.http,java.prefs,java.rmi,java.scripting,java.se,java.security.jgss,java.security.sasl,java.smartcardio,java.sql,java.sql.rowset,java.transaction.xa,java.xml,java.xml.crypto,jdk.accessibility,jdk.charsets,jdk.crypto.cryptoki,jdk.crypto.ec,jdk.dynalink,jdk.httpserver,jdk.incubator.foreign,jdk.incubator.vector,jdk.internal.vm.ci,jdk.jdwp.agent,jdk.jfr,jdk.jsobject,jdk.localedata,jdk.management,jdk.management.agent,jdk.management.jfr,jdk.naming.dns,jdk.naming.rmi,jdk.net,jdk.nio.mapmode,jdk.sctp,jdk.security.auth,jdk.security.jgss,jdk.unsupported,jdk.xml.dom,jdk.zipfs,jdk.attach \
--output /build/jre \
--no-man-pages \
--no-header-files \
--compress=2

##
## Build Openblocks api-service application
##
FROM maven:3.8-eclipse-temurin-17-alpine AS build-api-service
COPY ./server/api-service /openblocks-server
WORKDIR /openblocks-server
RUN --mount=type=cache,target=/root/.m2 mvn -f pom.xml clean package -DskipTests

FROM node:slim AS build-client
COPY ./client /openblocks-client
WORKDIR /openblocks-client
RUN yarn --immutable
# Create required folder structure
RUN mkdir -p /openblocks/api-service/plugins /openblocks/api-service/config /openblocks/api-service/logs

ARG REACT_APP_COMMIT_ID=test
ARG REACT_APP_ENV=production
ARG REACT_APP_EDITION=community
RUN yarn build
# Define openblocks main jar and plugin jars
ARG JAR_FILE=/openblocks-server/openblocks-server/target/openblocks-server-1.0-SNAPSHOT.jar
ARG PLUGIN_JARS=/openblocks-server/openblocks-plugins/*/target/*.jar

FROM node:slim AS build-node
COPY ./server/node-service /openblocks-node
WORKDIR /openblocks-node
RUN yarn --immutable
RUN yarn build
# Copy Java runtime for running server
COPY --from=jre-build /build/jre /openblocks/api-service/jre

FROM openjdk:17-slim AS jre-build
RUN jlink --add-modules java.base,java.compiler,java.datatransfer,java.desktop,java.instrument,java.logging,java.management,java.management.rmi,java.naming,java.net.http,java.prefs,java.rmi,java.scripting,java.se,java.security.jgss,java.security.sasl,java.smartcardio,java.sql,java.sql.rowset,java.transaction.xa,java.xml,java.xml.crypto,jdk.accessibility,jdk.charsets,jdk.crypto.cryptoki,jdk.crypto.ec,jdk.dynalink,jdk.httpserver,jdk.incubator.foreign,jdk.incubator.vector,jdk.internal.vm.ci,jdk.jdwp.agent,jdk.jfr,jdk.jsobject,jdk.localedata,jdk.management,jdk.management.agent,jdk.management.jfr,jdk.naming.dns,jdk.naming.rmi,jdk.net,jdk.nio.mapmode,jdk.sctp,jdk.security.auth,jdk.security.jgss,jdk.unsupported,jdk.xml.dom,jdk.zipfs,jdk.attach \
--output /build/jre \
--no-man-pages \
--no-header-files \
--compress=2
# Copy openblocks server application and plugins
RUN cp ${JAR_FILE} /openblocks/api-service/server.jar \
&& cp ${PLUGIN_JARS} /openblocks/api-service/plugins/

# Copy openblocks server configuration
COPY server/api-service/openblocks-server/src/main/resources/selfhost/ce/application.yml /openblocks/api-service/config/
COPY server/api-service/openblocks-server/src/main/resources/selfhost/ce/application-selfhost.yml /openblocks/api-service/config/

FROM ubuntu:20.04
# Add bootstrapfile
COPY deploy/docker/api-service/entrypoint.sh /openblocks/api-service/entrypoint.sh
COPY deploy/docker/api-service/init.sh /openblocks/api-service/init.sh
RUN chmod +x /openblocks/api-service/*.sh

##
## Intermediary Openblocks api-service image
##
## To create a separate image out of it, build it with:
## DOCKER_BUILDKIT=1 docker build -f deploy/docker/Dockerfile -t openblocksdev/openblocks-ce-api-service --target openblocks-ce-api-service .
##
FROM ubuntu:jammy as openblocks-ce-api-service
LABEL maintainer="openblocks"

# Update APT packages - Base Layer python-setuptools
RUN apt-get update && DEBIAN_FRONTEND=noninteractive \
apt-get install --no-install-recommends -y \
supervisor curl nginx wget netcat software-properties-common gettext python3-pip git gnupg vim iputils-ping gosu\
&& add-apt-repository ppa:redislabs/redis \
&& apt-get remove -y git python3-pip \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y --no-install-recommends gosu \
&& rm -rf /var/cache/apt/lists \
&& addgroup --system --gid 9001 openblocks \
&& adduser --system --disabled-password --no-create-home --uid 9001 --gid 9001 openblocks

# Copy openblocks server configuration
COPY --chown=openblocks:openblocks --from=build-api-service /openblocks/api-service /openblocks/api-service

EXPOSE 8080
CMD [ "sh" , "/openblocks/api-service/entrypoint.sh" ]

# Install MongoDB v4.0.5, Redis - Service Layer
RUN wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | apt-key add -
#############################################################################

RUN echo "deb [ arch=amd64,arm64 ]http://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-4.4.list \
&& apt-get remove wget -y
##
## Build openblocks node service
##
FROM ubuntu:jammy as build-node-service

RUN curl -sL https://deb.nodesource.com/setup_18.x | bash - \
&& apt-get -y install --no-install-recommends -y mongodb-org=4.4.6 redis nodejs \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN apt update && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y curl xz-utils ca-certificates \
&& mkdir -p /openblocks/node-service/nodejs

# Download and extract nodejs
RUN curl -fsSL 'https://nodejs.org/dist/v19.4.0/node-v19.4.0-linux-x64.tar.xz' | tar --directory /openblocks/node-service/nodejs --strip-components=1 -Jxf -

# Install yarn
ENV PATH="/openblocks/node-service/nodejs/bin:${PATH}"
#RUN export PATH=${PATH}:/openblocks/node-service/nodejs/bin \
RUN npm install -g yarn

# Clean up cache file - Service layer
RUN rm -rf \
/root/.cache \
/root/.npm \
/root/.pip \
/usr/local/share/doc \
/usr/share/doc \
/usr/share/man \
/var/lib/apt/lists/* \
/tmp/*
# Copy and build the node-service app
COPY server/node-service/ /openblocks/node-service/app/
WORKDIR /openblocks/node-service/app/
RUN yarn --immutable
RUN yarn build

# Define volumes - Service Layer
VOLUME [ "/openblocks-stacks" ]
# Copy startup script
COPY deploy/docker/node-service/entrypoint.sh /openblocks/node-service/entrypoint.sh
COPY deploy/docker/node-service/init.sh /openblocks/node-service/init.sh
RUN chmod +x /openblocks/node-service/*.sh

##
## Intermediary Openblocks node service image
##
## To create a separate image out of it, build it with:
## DOCKER_BUILDKIT=1 docker build -f deploy/docker/Dockerfile -t openblocksdev/openblocks-ce-node-service --target openblocks-ce-node-service .
##
FROM ubuntu:jammy as openblocks-ce-node-service
LABEL maintainer="openblocks"

ENV OPENBLOCKS_SERVER_PROXY_PASS http://localhost:8080
ENV OPENBLOCKS_NODE_PROXY_PASS http://localhost:6060
RUN apt-get update && apt-get install -y --no-install-recommends gosu \
&& rm -rf /var/cache/apt/lists \
&& addgroup --system --gid 9001 openblocks \
&& adduser --system --disabled-password --no-create-home --uid 9001 --gid 9001 openblocks

# copy jre
COPY --from=jre-build /build/jre /app
COPY --from=build-node-service /openblocks/node-service /openblocks/node-service

ARG JAR_FILE=/openblocks-server/openblocks-server/target/openblocks-server-1.0-SNAPSHOT.jar
ARG PLUGIN_JARS=/openblocks-server/openblocks-plugins/*/target/*.jar
EXPOSE 6060
CMD [ "/bin/sh", "/openblocks/node-service/entrypoint.sh" ]

#############################################################################

##
## Build openblocks client application
##
FROM node:19.4-slim AS build-client
COPY ./client /openblocks-client
WORKDIR /openblocks-client
RUN yarn --immutable

# curl is required for yarn build to succeed, because it calls it while building client
RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates

ARG REACT_APP_COMMIT_ID=test
ARG REACT_APP_ENV=production
ARG REACT_APP_EDITION=community
RUN yarn build

RUN mkdir -p /openblocks /openblocks/plugins /var/www/openblocks /env2

COPY --from=build-server ${JAR_FILE} /openblocks/server/api-service/server.jar
COPY --from=build-server ${PLUGIN_JARS} /openblocks/server/api-service/plugins/
##
## Intermediary Openblocks client image
##
## To create a separate image out of it, build it with:
## DOCKER_BUILDKIT=1 docker build -f deploy/docker/Dockerfile -t openblocksdev/openblocks-ce-frontend --target openblocks-ce-frontend .
##
FROM nginx:1.23.3 as openblocks-ce-frontend
LABEL maintainer="openblocks"

# copy tace-fe build
COPY --from=build-client /openblocks-client/packages/openblocks/build/ /openblocks/client/
# Change default nginx user into openblocks user
RUN usermod --login openblocks --uid 9001 nginx \
&& groupmod --new-name openblocks --gid 9001 nginx

# copy node-service
COPY --from=build-node /openblocks-node /openblocks/server/node-service
COPY ./deploy/docker/scripts/start-node-service.sh /openblocks/server/node-service/start-node-service.sh
# Copy openblocks client data
COPY --chown=openblocks:openblocks --from=build-client /openblocks-client/packages/openblocks/build/ /openblocks/client

# copy nginx conf
COPY ./deploy/docker/templates/nginx/* /openblocks/nginx/
COPY ./deploy/docker/scripts/start-nginx.sh /openblocks/nginx/start-nginx.sh
# Copy additional nginx init scripts
COPY deploy/docker/frontend/00-change-nginx-user.sh /docker-entrypoint.d/00-change-nginx-user.sh
COPY deploy/docker/frontend/01-update-nginx-conf.sh /docker-entrypoint.d/01-update-nginx-conf.sh

# copy redis conf
COPY ./deploy/docker/templates/redis.conf /etc/redis/redis.conf
RUN chmod +x /docker-entrypoint.d/00-change-nginx-user.sh && \
chmod +x /docker-entrypoint.d/01-update-nginx-conf.sh

# Add process config to be run by supervisord
COPY ./deploy/docker/templates/supervisord.conf /etc/supervisor/supervisord.conf
COPY ./deploy/docker/templates/supervisord/* /etc/supervisor/conf.d/
COPY deploy/docker/frontend/nginx.conf /etc/nginx/nginx.conf
EXPOSE 3000

# copy application.yml
COPY ./server/api-service/openblocks-server/src/main/resources/selfhost/ce/application.yml /openblocks/env/
COPY ./server/api-service/openblocks-server/src/main/resources/selfhost/ce/application-selfhost.yml /openblocks/env2/
#############################################################################

# Add bootstrapfile
COPY ./deploy/docker/entrypoint.sh /openblocks/
RUN chmod +x /openblocks/entrypoint.sh
##
## Build Openblocks all-in-one image
##
FROM openblocks-ce-frontend
LABEL maintainer="openblocks"

# Install required packages
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y bash gnupg curl lsb-release \
&& curl -fsSL https://packages.redis.io/gpg | gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg \
&& echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb bullseye main" | tee /etc/apt/sources.list.d/redis.list \
&& curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | gpg --dearmor -o /usr/share/keyrings/mongodb-archive-keyring.gpg \
&& echo "deb [signed-by=/usr/share/keyrings/mongodb-archive-keyring.gpg] http://repo.mongodb.org/apt/debian buster/mongodb-org/4.4 main" | tee /etc/apt/sources.list.d/mongodb-org-4.4.list \
&& apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends -y \
mongodb-org=4.4.6 \
redis \
supervisor \
gosu \
&& rm -rf /var/cache/apt/lists

# Add openblocks api-service
COPY --chown=openblocks:openblocks --from=openblocks-ce-api-service /openblocks/api-service /openblocks/api-service

# Add openblocks node-service
COPY --chown=openblocks:openblocks --from=openblocks-ce-node-service /openblocks/node-service /openblocks/node-service

# Add services configuration
COPY --chown=openblocks:openblocks deploy/docker/all-in-one/etc /openblocks/etc

# Add startup script
COPY --chown=openblocks:openblocks deploy/docker/all-in-one/entrypoint.sh /openblocks/entrypoint.sh

EXPOSE 3000

ENTRYPOINT [ "sh" , "/openblocks/entrypoint.sh" ]
CMD ["/usr/bin/supervisord", "-n" , "-c" , "/etc/supervisor/supervisord.conf"]
ENTRYPOINT [ "/bin/sh" , "/openblocks/entrypoint.sh" ]
CMD ["/usr/bin/supervisord", "-n" , "-c" , "/openblocks/etc/supervisord.conf"]

Loading