Dockerfile 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. ### STAGE 1 BUILDING.
  2. FROM node:22-alpine3.22 AS builder
  3. # Any value inside one of the disable ARGs will be accepted.
  4. ARG DISABLE_EXTRACT="yes"
  5. ARG DISABLE_MINIFY="yes"
  6. ARG DISABLE_TRANSLATE="yes"
  7. # NODE_OPTIONS="--max_old_space_size=4096"
  8. # If your process gets OOM killed, perhaps the above will help.
  9. RUN mkdir -p /opt/meshcentral/meshcentral
  10. WORKDIR /opt/meshcentral
  11. COPY ./ /opt/meshcentral/meshcentral/
  12. # Check the Docker build arguments and if they are empty do the task.
  13. RUN if [ -n "$DISABLE_EXTRACT" ] || [ -n "$DISABLE_MINIFY" ] || [ -n "$DISABLE_TRANSLATE" ]; then \
  14. echo -e "----------\nPREPARING ENVIRONMENT...\n----------"; \
  15. cd meshcentral && \
  16. npm install [email protected] [email protected] [email protected] && \
  17. cd translate && \
  18. case "$DISABLE_EXTRACT" in \
  19. false|no|FALSE|NO) \
  20. echo -e "----------\nSTARTING THE EXTRACTING PROCESS...\n----------"; \
  21. node translate.js extractall;; \
  22. *) \
  23. echo "Setting EXTRACT as disabled.";; \
  24. esac && \
  25. case "$DISABLE_MINIFY" in \
  26. false|no|FALSE|NO) \
  27. echo -e "----------\nSTARTING THE MINIFYING PROCESS...\n----------"; \
  28. node translate.js minifyall;; \
  29. *) \
  30. echo "Setting MINIFY as disabled.";; \
  31. esac && \
  32. case "$DISABLE_TRANSLATE" in \
  33. false|no|FALSE|NO) \
  34. echo -e "----------\nSTARTING THE TRANSLATING PROCESS...\n----------"; \
  35. node translate.js translateall;; \
  36. *) \
  37. echo "Setting TRANSLATE as disabled.";; \
  38. esac; \
  39. npm uninstall html-minifier-terser jsdom esprima; \
  40. fi
  41. # Possible more updated alternative? @minify-html/[email protected] -> https://www.npmjs.com/package/@minify-html/node
  42. RUN rm -rf /opt/meshcentral/meshcentral/docker /opt/meshcentral/meshcentral/node_modules /opt/meshcentral/meshcentral/docs
  43. ### STAGE 2 PRECOMPILE DEPS MODULE
  44. FROM node:22-alpine3.22 AS dep-compiler
  45. RUN echo -e "----------\nINSTALLING ALPINE PACKAGES...\n----------"; \
  46. apk add --no-cache --update \
  47. bash gcc g++ jq make python3 tzdata
  48. COPY --from=builder /opt/meshcentral/meshcentral /opt/meshcentral/meshcentral
  49. WORKDIR /opt/meshcentral/meshcentral
  50. RUN jq '.dependencies += {"modern-syslog": "1.2.0", "telegram": "2.26.22"}' package.json > temp.json && mv temp.json package.json \
  51. && npm i --package-lock-only \
  52. && npm ci --omit=dev \
  53. && npm cache clean --force
  54. ### STAGE 3 BUILDING.
  55. FROM node:22-alpine3.22 AS finalizer
  56. #FROM alpine:3.22 AS finalizer
  57. # copy files from previous layer
  58. COPY --from=dep-compiler /opt/meshcentral/meshcentral /opt/meshcentral/meshcentral
  59. # environment variables
  60. ENV NODE_ENV="production" \
  61. CONFIG_FILE="/opt/meshcentral/meshcentral-data/config.json" \
  62. DYNAMIC_CONFIG="false"
  63. # environment variables for the above defined MeshCentral Config.json. Can be done like that following: https://docs.docker.com/reference/dockerfile/#env
  64. ENV ALLOW_PLUGINS="false" \
  65. ALLOW_NEW_ACCOUNTS="false" \
  66. ALLOWED_ORIGIN="false" \
  67. HOSTNAME="localhost" \
  68. PORT="443" \
  69. REDIR_PORT="80" \
  70. INSTALL_STYLISHUI="false" \
  71. IFRAME="false" \
  72. LOCAL_SESSION_RECORDING="true" \
  73. MINIFY="true" \
  74. REVERSE_PROXY="" \
  75. REVERSE_PROXY_TLS_PORT="443" \
  76. REGEN_SESSIONKEY="false" \
  77. STYLISHUI_FORCE_LATEST="false" \
  78. WEBRTC="false" \
  79. TRUSTED_PROXY="" \
  80. ARGS=""
  81. # Database
  82. # Multi-variable declaration to reduce layers.
  83. ENV USE_MONGODB="false" \
  84. USE_POSTGRESQL="false" \
  85. USE_MARIADB="false"
  86. # Preinstallation args one per line due to: https://docs.docker.com/reference/dockerfile/#arg
  87. ARG PREINSTALL_LIBS="false"
  88. ARG INCLUDE_MONGODB_TOOLS="false"
  89. ARG INCLUDE_POSTGRESQL_TOOLS="false"
  90. ARG INCLUDE_MARIADB_TOOLS="false"
  91. # MongoDB Variables
  92. # The following MONGO_URL variable overwrites most other mongoDb related varialbes.
  93. ENV MONGO_HOST="" \
  94. MONGO_PORT="27017" \
  95. MONGO_USERNAME="" \
  96. MONGO_PASS="" \
  97. MONGO_URL=""
  98. # PostgreSQL Variables
  99. ENV PSQL_HOST="" \
  100. PSQL_PORT="5432" \
  101. PSQL_USER="" \
  102. PSQL_PASS="" \
  103. PSQL_DATABASE=""
  104. # MariaDB/MySQL Variables, Alpine Linux only provides the actual MariaDB binaries.
  105. ENV MARIADB_HOST="" \
  106. MARIADB_PORT="3306" \
  107. MARIADB_USER="" \
  108. MARIADB_PASS="" \
  109. MARIADB_DATABASE=""
  110. RUN mkdir -p /opt/meshcentral/meshcentral
  111. WORKDIR /opt/meshcentral
  112. RUN echo -e "----------\nINSTALLING ALPINE PACKAGES...\n----------"; \
  113. apk add --no-cache --update \
  114. bash curl jq tzdata && \
  115. rm -rf /var/cache/* \
  116. /tmp/* \
  117. /usr/share/man/ \
  118. /usr/share/doc/ \
  119. /var/log/* \
  120. /var/spool/* \
  121. /usr/lib/debug/ && \
  122. npm install -g npm@latest
  123. RUN case "$PREINSTALL_LIBS" in \
  124. true|yes|TRUE|YES) \
  125. cd meshcentral && \
  126. echo -e "----------\nPREINSTALLING LIBRARIES...\n----------"; \
  127. npm install [email protected] [email protected] [email protected] [email protected] [email protected] [email protected];; \
  128. false|no|FALSE|NO) \
  129. echo "Not pre-installing libraries.";; \
  130. *) \
  131. echo -e "Invalid value for build argument INCLUDE_POSTGRESQL_TOOLS, possible values: 'yes', 'true', 'no' or 'false'"; \
  132. exit 1;; \
  133. esac
  134. # NOTE: ALL MODULES MUST HAVE A VERSION NUMBER AND THE VERSION MUST MATCH THAT USED IN meshcentraljs mainStart()
  135. RUN case "$INCLUDE_MONGODB_TOOLS" in \
  136. true|yes|TRUE|YES) \
  137. apk add --no-cache mongodb-tools && \
  138. cd meshcentral && \
  139. echo -e "----------\nPREINSTALLING MONGODB LIBRARIES...\n----------"; \
  140. npm install [email protected] @mongodb-js/[email protected];; \
  141. false|no|FALSE|NO) \
  142. echo "Not including MongoDB Tools.";; \
  143. *) \
  144. echo "Invalid value for build argument INCLUDE_MONGODB_TOOLS, possible values: 'yes', 'true', 'no' or 'false'"; \
  145. exit 1;; \
  146. esac
  147. RUN case "$INCLUDE_POSTGRESQL_TOOLS" in \
  148. true|yes|TRUE|YES) \
  149. apk add --no-cache postgresql-client && \
  150. cd meshcentral && \
  151. echo -e "----------\nPREINSTALLING POSTGRESQL LIBRARIES...\n----------"; \
  152. npm install [email protected];; \
  153. false|no|FALSE|NO) \
  154. echo "Not including PostgreSQL Tools.";; \
  155. *) \
  156. echo -e "Invalid value for build argument INCLUDE_POSTGRESQL_TOOLS, possible values: 'yes', 'true', 'no' or 'false'"; \
  157. exit 1;; \
  158. esac
  159. RUN case "$INCLUDE_MARIADB_TOOLS" in \
  160. true|yes|TRUE|YES) \
  161. apk add --no-cache mariadb-client && \
  162. cd meshcentral && \
  163. echo -e "----------\nPREINSTALLING MARIADB/MYSQL LIBRARIES...\n----------"; \
  164. npm install [email protected] [email protected];; \
  165. false|no|FALSE|NO) \
  166. echo "Not including MariaDB/MySQL Tools.";; \
  167. *) \
  168. echo -e "Invalid value for build argument INCLUDE_MARIADB_TOOLS, possible values: 'yes', 'true', 'no' or 'false'"; \
  169. exit 1;; \
  170. esac
  171. # Remove left over files and cache
  172. RUN cd meshcentral \
  173. && rm -rf /root /tmp/* /var/tmp/* /usr/lib/node_modules/npm/man /usr/lib/node_modules/npm/doc /usr/lib/node_modules/npm/html \
  174. && npm cache clean --force
  175. # Expose needed ports
  176. EXPOSE ${PORT}
  177. EXPOSE ${REDIR_PORT}
  178. # These volumes will be created by default even without any declaration, this allows default persistence in Docker/Podman. Dummy-proofing.
  179. VOLUME /opt/meshcentral/meshcentral-data
  180. VOLUME /opt/meshcentral/meshcentral-files
  181. VOLUME /opt/meshcentral/meshcentral-web
  182. VOLUME /opt/meshcentral/meshcentral-backups
  183. # Copy images from Git repo, place it before ending so recompilation can make good use of cache.
  184. COPY ./docker/entrypoint.sh /opt/meshcentral/entrypoint.sh
  185. COPY ./docker/config.json.template /opt/meshcentral/config.json.template
  186. ENTRYPOINT ["/bin/bash", "/opt/meshcentral/entrypoint.sh"]