From bd427818789a1a26109d9bb8c03b5ef107feecec Mon Sep 17 00:00:00 2001 From: Isaac Date: Thu, 15 Jun 2023 00:21:52 +0100 Subject: [PATCH] feat(docker): add non-root user, labels, and healthcheck (closes #433) Now works with Pterodactyl. --- .editorconfig | 2 ++ Dockerfile | 17 +++++++++++++---- package.json | 2 +- src/http.js | 6 +++++- src/routes/status.js | 6 ++++++ 5 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 src/routes/status.js diff --git a/.editorconfig b/.editorconfig index a8a125a..1862a88 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,6 +1,8 @@ root = true [*] +indent_style = tab +indent_size = 4 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true diff --git a/Dockerfile b/Dockerfile index ae5d9a3..5038586 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,10 +14,19 @@ RUN CI=true pnpm install --prod --frozen-lockfile COPY --link . . FROM node:18-alpine AS runner -ENV NODE_ENV=production \ +RUN adduser --disabled-password --home /home/container container +USER container +ENV USER=container \ + HOME=/home/container \ + NODE_ENV=production \ HTTP_HOST=0.0.0.0 \ HTTP_PORT=80 -WORKDIR /usr/bot +WORKDIR /home/container COPY --from=builder /build ./ -EXPOSE ${HTTP_PORT} -ENTRYPOINT [ "/usr/bot/scripts/start.sh" ] +EXPOSE ${HTTP_PORT}/tcp +ENTRYPOINT [ "/home/container/scripts/start.sh" ] +HEALTHCHECK --interval=15s --timeout=5s --start-period=60s \ + CMD curl -f http://localhost:${HTTP_PORT}/status || exit 1 +LABEL org.opencontainers.image.source=https://github.com/discord-tickets/bot \ + org.opencontainers.image.description="The most popular open-source ticket bot for Discord." \ + org.opencontainers.image.licenses="GPL-3.0-or-later" diff --git a/package.json b/package.json index b7348cd..1bef9a8 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "bot" ], "author": "eartharoid", - "license": "GPL-3.0", + "license": "GPL-3.0-or-later", "bugs": { "url": "https://github.com/discord-tickets/bot/issues" }, diff --git a/src/http.js b/src/http.js index 2d1ff78..af0911a 100644 --- a/src/http.js +++ b/src/http.js @@ -122,7 +122,11 @@ module.exports = async client => { : responseTime >= 10 ? '&e' : '&a') + responseTime + 'ms'; - const level = req.routerPath === '/*' ? 'verbose' : 'info'; + const level = req.routerPath === '/status' + ? 'debug' + : req.routerPath === '/*' + ? 'verbose' + : 'info'; client.log[level].http(short(`${req.id} ${req.ip} ${req.method} ${req.routerPath ?? '*'} &m-+>&r ${status}&b in ${responseTime}`)); if (!req.routerPath) client.log.verbose.http(`${req.id} ${req.method} ${req.url}`); done(); diff --git a/src/routes/status.js b/src/routes/status.js new file mode 100644 index 0000000..6b63557 --- /dev/null +++ b/src/routes/status.js @@ -0,0 +1,6 @@ +module.exports.get = () => ({ + handler: async (req, res) => { + const { status } = res.context.config.client.ws; + res.code(status === 0 ? 200 : 425).send(status); + }, +});