diff --git a/.forgejo/workflows/build-release-container.yaml b/.forgejo/workflows/build-release-container.yaml new file mode 100644 index 0000000..cf2c4f7 --- /dev/null +++ b/.forgejo/workflows/build-release-container.yaml @@ -0,0 +1,35 @@ +name: build-container + +on: + push: + tags: + - release-* + workflow_dispatch: + +jobs: + build: + runs-on: node-20 + steps: + - name: Checkout the repo + uses: actions/checkout@v4 + + - name: Install dependencies + run: npm ci + - name: Run build + run: npm run build + + - name: Install Docker + run: curl https://get.docker.com | sh + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to Container Registry + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USER }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Build and Push + uses: docker/build-push-action@v6 + with: + push: true + tags: neintonine/pnp-scheduler:release + context: . diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c415253 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM node:20 + +COPY ./dist /app/dist +COPY ./node_modules /app/node_modules +COPY ./public /app/public + +WORKDIR /app + +CMD sh -c "node /app/dist/deploy.js && node /app/dist/main.js" \ No newline at end of file diff --git a/examples/.env.example b/examples/.env.example new file mode 100644 index 0000000..c314b2e --- /dev/null +++ b/examples/.env.example @@ -0,0 +1,4 @@ +DISCORD_API_KEY= +DISCORD_CLIENT_ID= + +DB_PATH=data/data.db \ No newline at end of file diff --git a/examples/docker-compose.yml b/examples/docker-compose.yml new file mode 100644 index 0000000..c901482 --- /dev/null +++ b/examples/docker-compose.yml @@ -0,0 +1,9 @@ +services: + bot: + container_name: "pnp_scheduler_bot" + image: neintonine/pnp-scheduler:release + restart: unless-stopped + volumes: + - ./data:/app/data + env_file: + - .env \ No newline at end of file diff --git a/package.json b/package.json index d3b34fc..2d514a6 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "main": "main.ts", "scripts": { "build": "node ./build/build-cli.mjs", + "build:docker": "sudo docker build .", "watch": "node ./build/watch.mjs", "deploy": "node ./dist/deploy.js", "start": "node ./dist/main.js", diff --git a/source/Container/Services.ts b/source/Container/Services.ts index 81ee210..129e857 100644 --- a/source/Container/Services.ts +++ b/source/Container/Services.ts @@ -30,6 +30,7 @@ export class Services { container.set(logger, 'logger'); const database = new DatabaseConnection(env.database); + database.connect() container.set(database); const eventHandler = new EventHandler(); diff --git a/source/Database/DatabaseConnection.ts b/source/Database/DatabaseConnection.ts index cfef193..e860936 100644 --- a/source/Database/DatabaseConnection.ts +++ b/source/Database/DatabaseConnection.ts @@ -3,12 +3,22 @@ import Sqlite3 from "better-sqlite3"; import Database from "better-sqlite3"; import {Container} from "../Container/Container"; import {Logger} from "log4js"; +import path from "node:path"; +import * as fs from "node:fs"; export class DatabaseConnection { private database: Sqlite3.Database; - constructor(env: DatabaseEnvironment) { - this.database = new Database(env.path, { + constructor(private readonly env: DatabaseEnvironment) { + } + + public connect() { + const directory = path.dirname(this.env.path); + fs.mkdirSync(directory, { + recursive: true + }) + + this.database = new Database(this.env.path, { nativeBinding: "node_modules/better-sqlite3/build/Release/better_sqlite3.node", }) this.database.pragma('journal_mode = WAL'); diff --git a/source/Environment.ts b/source/Environment.ts index d16b971..eba0f76 100644 --- a/source/Environment.ts +++ b/source/Environment.ts @@ -1,9 +1,9 @@ import dotenv from "dotenv"; import path from "node:path"; +import * as fs from "node:fs"; type DiscordEnvironment = { token: string; - guildId: string; clientId: string; } @@ -15,7 +15,6 @@ export class Environment { get discord(): DiscordEnvironment { return { token: process.env.DISCORD_API_KEY ?? '', - guildId: process.env.DISCORD_GUILD_ID ?? '', clientId: process.env.DISCORD_CLIENT_ID ?? '', } } @@ -27,8 +26,14 @@ export class Environment { } public setup() { + const dotenvPath = path.resolve(__dirname, "../environment/.env"); + + if (!fs.existsSync(dotenvPath)) { + return; + } + dotenv.config({ - path: path.resolve(__dirname, "../environment/.env"), + path: dotenvPath, }); } } \ No newline at end of file