Skip to content

Commit

Permalink
Merge pull request #43 from mrjvs/feat/docker
Browse files Browse the repository at this point in the history
  • Loading branch information
jonbarrow authored Aug 18, 2024
2 parents 752d2dd + 78308ca commit dc6d0b7
Show file tree
Hide file tree
Showing 9 changed files with 129 additions and 29 deletions.
3 changes: 2 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
.git
node_modules
config.json
database
node_modules
db.json
dist/
56 changes: 56 additions & 0 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: Build and Publish Docker Image

on:
push:
pull_request:
workflow_dispatch:

env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}

jobs:
build-publish:
env:
SHOULD_PUSH_IMAGE: ${{ (github.event_name == 'push' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/dev')) || github.event_name == 'workflow_dispatch' }}
runs-on: ubuntu-latest

permissions:
contents: read
packages: write

steps:
- name: Set up QEMU for Docker
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log into the container registry
if: ${{ env.SHOULD_PUSH_IMAGE == 'true' }}
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }}
type=raw,value=edge,enable=${{ github.ref == 'refs/heads/dev' }}
type=sha
- name: Build and push Docker image
id: build-and-push
uses: docker/build-push-action@v6
with:
platforms: linux/amd64,linux/arm64
push: ${{ env.SHOULD_PUSH_IMAGE }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
67 changes: 46 additions & 21 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,25 +1,50 @@
FROM node:18-buster

RUN apt-get update && apt-get install -y --fix-missing --no-install-recommends \
build-essential \
curl \
git-core \
iputils-ping \
pkg-config \
rsync \
software-properties-common \
unzip \
wget
WORKDIR /app

COPY "docker/entrypoint.sh" ./

COPY package*.json ./
RUN npm install
# syntax=docker/dockerfile:1

ARG app_dir="/home/node/app"


# * Base Node.js image
FROM node:20-alpine AS base
ARG app_dir
WORKDIR ${app_dir}
RUN apk add --no-cache python3 py3-pip make gcc g++

# * Installing production dependencies
FROM base AS dependencies

RUN --mount=type=bind,source=package.json,target=package.json \
--mount=type=bind,source=package-lock.json,target=package-lock.json \
--mount=type=cache,target=/root/.npm \
npm ci --omit=dev


# * Installing development dependencies and building the application
FROM base AS build

RUN --mount=type=bind,source=package.json,target=package.json \
--mount=type=bind,source=package-lock.json,target=package-lock.json \
--mount=type=cache,target=/root/.npm \
npm ci

COPY . .
RUN npm run build

COPY . ./

VOLUME [ "/app/config.json", "/app/database", "/app/db.json" ]
# * Running the final application
FROM base AS final
ARG app_dir

RUN mkdir database && chown node:node database

ENV NODE_ENV=production
USER node


COPY package.json .

COPY --from=dependencies ${app_dir}/node_modules ${app_dir}/node_modules
COPY --from=build ${app_dir}/dist ${app_dir}/dist

VOLUME ["./config.json", "./database"]

CMD ["sh", "entrypoint.sh"]
CMD ["node", "--max-old-space-size=4096", "."]
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
"scripts": {
"start": "node --max-old-space-size=4096 .",
"start:dev": "NODE_ENV=development node .",
"lint": "npx eslint .",
"build": "npm run lint && npm run clean && npx tsc && npx tsc-alias",
"lint": "eslint .",
"build": "npm run lint && npm run clean && tsc && tsc-alias",
"clean": "npx rimraf ./dist"
},
"keywords": [],
Expand Down
2 changes: 1 addition & 1 deletion src/bot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import messageDeleteHandler from '@/events/messageDelete';
import messageUpdateHandler from '@/events/messageUpdate';
import reactionRemoveHandler from '@/events/reactionRemove';
import readyHandler from '@/events/ready';
import config from '@/config.json';
import config from '@/config';
import type { ClientContextMenu, ClientCommand } from '@/types';

export const client = new Client({
Expand Down
18 changes: 18 additions & 0 deletions src/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { readFileSync } from 'fs';
import path from 'path';

interface Config {
bot_token: string;
json_db_path: string;
sequelize: {
force: boolean;
alter: boolean;
}
}

const rawConfigData = readFileSync(path.join(process.cwd(), './config.json'), {
encoding: 'utf-8'
});
const configData: Config = JSON.parse(rawConfigData);

export default configData;
2 changes: 1 addition & 1 deletion src/db.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import JSONdb from 'simple-json-db';
import path from 'path';
import config from '@/config.json';
import config from '@/config';

const db = new JSONdb<string>(path.resolve(config.json_db_path));

Expand Down
2 changes: 1 addition & 1 deletion src/events/ready.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { checkMatchmakingThreads } from '@/matchmaking-threads';
import { loadModel } from '@/check-nsfw';
import { SlowMode } from '@/models/slow-mode';
import handleSlowMode from '@/slow-mode';
import config from '@/config.json';
import config from '@/config';
import type { Database } from 'sqlite3';
import type { Client } from 'discord.js';

Expand Down
4 changes: 2 additions & 2 deletions src/setup-guild.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { PermissionFlagsBits } from 'discord.js';
import { REST } from '@discordjs/rest';
import { Routes } from 'discord-api-types/v10';
import { bot_token as botToken } from '@/config.json';
import config from '@/config';
import type { Guild } from 'discord.js';

const rest = new REST({ version: '10' }).setToken(botToken);
const rest = new REST({ version: '10' }).setToken(config.bot_token);

export async function setupGuild(guild: Guild): Promise<void> {
// * Do nothing if the bot does not have the correct permissions
Expand Down

0 comments on commit dc6d0b7

Please sign in to comment.