habitica/Dockerfile

112 lines
3.8 KiB
Text
Raw Permalink Normal View History

# Container stage for building server and web component of Habitica
FROM node:20 AS build
ARG CI=true
ARG NODE_ENV=production
RUN git config --global url."https://".insteadOf git://
WORKDIR /usr/src/habitica
# Install main packages
COPY ["package.json", "package-lock.json", "./"]
RUN npm pkg set scripts.postinstall="echo \"Skipping postinstall\"" && npm install
# Install client packages
COPY ["website/client/package.json", "website/client/package-lock.json", "./website/client/"]
RUN cd website/client/ && npm pkg set scripts.postinstall="echo \"Skipping postinstall\"" && npm install
# Make the source code available in the container
COPY . /usr/src/habitica
# Create configuration file (some values are needed for the client build already)
RUN echo '{\n\
"BASE_URL": "http://localhost:3000",\n\
"CRON_SAFE_MODE": "false",\n\
"CRON_SEMI_SAFE_MODE": "false",\n\
"DISABLE_REQUEST_LOGGING": "true",\n\
"EMAIL_SERVER_AUTH_PASSWORD": "",\n\
"EMAIL_SERVER_AUTH_USER": "",\n\
"EMAIL_SERVER_URL": null,\n\
"ENABLE_CONSOLE_LOGS_IN_PROD": "true",\n\
"ENABLE_CONSOLE_LOGS_IN_TEST": "false",\n\
"FLAG_REPORT_EMAIL": "",\n\
"IGNORE_REDIRECT": "true",\n\
"INVITE_ONLY": "false",\n\
"MAINTENANCE_MODE": "false",\n\
"MONGODB_POOL_SIZE": "10",\n\
"NODE_ENV": "production",\n\
"PATH": "bin:node_modules/.bin:/usr/local/bin:/usr/bin:/bin",\n\
"PORT": 3000,\n\
"PUSH_CONFIGS_APN_ENABLED": "false",\n\
"SESSION_SECRET": "YOUR SECRET HERE",\n\
"SESSION_SECRET_IV": "12345678912345678912345678912345",\n\
"SESSION_SECRET_KEY": "1234567891234567891234567891234567891234567891234567891234567891",\n\
"TRUSTED_DOMAINS": "",\n\
"WEB_CONCURRENCY": 1,\n\
"ENABLE_STACKDRIVER_TRACING": "false",\n\
"BLOCKED_IPS": "",\n\
"LOG_AMPLITUDE_EVENTS": "false",\n\
"RATE_LIMITER_ENABLED": "false",\n\
"CONTENT_SWITCHOVER_TIME_OFFSET": 8\n\
}' > /usr/src/habitica/config.json
# Build the server and web components
RUN ./node_modules/.bin/gulp build:prod
RUN npm run client:build
# Container for providing the build server component of Habitica
FROM node:20 AS server
ENV NODE_ENV=production
COPY --from=build /usr/src/habitica/node_modules /var/lib/habitica/node_modules
COPY --from=build /usr/src/habitica/i18n_cache/ /var/lib/habitica/i18n_cache/
COPY --from=build /usr/src/habitica/content_cache/ /var/lib/habitica/content_cache/
COPY --from=build /usr/src/habitica/website/ /var/lib/habitica/website/
COPY --from=build /usr/src/habitica/package.json /var/lib/habitica/package.json
COPY --from=build /usr/src/habitica/config.json /var/lib/habitica/config.json
# Copy the scripts and cron job for resetting group dailies on a daily basis
RUN mkdir -p /var/lib/habitica/scripts/
COPY --from=build /usr/src/habitica/scripts/team-cron.js /var/lib/habitica/scripts/team-cron.js
COPY --from=build /usr/src/habitica/scripts/team-cron/run-team-cron.js /var/lib/habitica/
RUN apt-get update && apt-get -y install cron
RUN mkdir -p /etc/cron.d
COPY --from=build /usr/src/habitica/scripts/team-cron/habiticateamcron /etc/cron.d/habiticateamcron
RUN chmod 0644 /etc/cron.d/habiticateamcron
RUN crontab /etc/cron.d/habiticateamcron
CMD sh -c 'printenv | grep -v "no_proxy" >> /etc/environment && /etc/init.d/cron start && node /var/lib/habitica/website/transpiled-babel/index.js'
# Container for providing the build web component of Habitica
FROM caddy AS client
COPY --from=build /usr/src/habitica/website/client/dist /var/www
RUN echo -e ":80 {\n\
@backend not {\n\
path /static/audio/\n\
path /static/css/\n\
path /static/emails/\n\
path /static/icons/\n\
path /static/img/\n\
path /static/js/\n\
path /static/merch/\n\
path /static/npc/\n\
path /static/presskit/\n\
path /index.html\n\
}\n\
\n\
root * /var/www\n\
reverse_proxy @backend server:3000\n\
file_server\n\
}" > /etc/caddy/Caddyfile