feat(docker): add non-root user, labels, and healthcheck (closes #433)

Now works with Pterodactyl.
This commit is contained in:
Isaac 2023-06-15 00:21:52 +01:00
parent faddacc6df
commit bd42781878
No known key found for this signature in database
GPG Key ID: 0DE40AE37BBA5C33
5 changed files with 27 additions and 6 deletions

View File

@ -1,6 +1,8 @@
root = true
[*]
indent_style = tab
indent_size = 4
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

View File

@ -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"

View File

@ -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"
},

View File

@ -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();

6
src/routes/status.js Normal file
View File

@ -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);
},
});