diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..69f07f2 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +node_modules/ +.env +src/miscellaneous/migratenicknames.js +test.js diff --git a/.env.example b/.env.example index 4219000..9e889f2 100644 --- a/.env.example +++ b/.env.example @@ -4,10 +4,10 @@ GLOBAL_BOT_PREFIX=v3 CREATOR_IDS=212445217763229699 MESSAGE_BATCH_SIZE=10 PASTE_CREATE_ENDPOINT=host your own haste-server instance to get this -PGUSER=postgresusername -PGPASSWORD=postgrespassword -PGHOST=localhost -PGDATABASE=logger +POSTGRES_USER=postgresusername # will be ignored on Docker +POSTGRES_PASSWORD=postgrespassword +POSTGRES_HOST=localhost # will be ignored on Docker +POSTGRES_DB=logger REDIS_LOCK_TTL=2000 AES_KEY=youraeskey MESSAGE_HISTORY_DAYS=how many days as an int you want to be wiped from db diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f645f90 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +# get node +FROM node:18.5.0-buster-slim + +# Create app directory +WORKDIR /usr/src/app + +# Get app dependencies +COPY package*.json ./ + +# building app +RUN npm i --omit=dev --verbose + +# Bundle app source +COPY . . + +# start up command for bot +CMD [ "npm", "start" ] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0aa367c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,50 @@ +# Use .env. Only edit this, if you know your stuff. +services: + app: + build: + context: ./ + restart: always + env_file: + - .env + depends_on: + - cache + - db + - setup + environment: + REDIS_HOST: cache + POSTGRES_HOST: db + POSTGRES_USER: ${POSTGRES_DB} + + setup: + build: + context: . + command: "npm run setupdb" + restart: on-failure + depends_on: + - db + environment: + DOCKER: true + POSTGRES_USER: ${POSTGRES_DB} + POSTGRES_PASSWORD: + POSTGRES_HOST: db + POSTGRES_DB: + + cache: + image: redis:6.2-alpine + restart: always + command: redis-server --save 20 1 --loglevel warning + volumes: + - cache:/data + + db: + image: postgres:16-alpine + restart: always + volumes: + - db:/var/lib/postgresql/data + environment: + POSTGRES_PASSWORD: + POSTGRES_USER: + +volumes: + db: + cache: diff --git a/package.json b/package.json index 2a90477..e2155c7 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,9 @@ "main": "index.js", "scripts": { "test": "standard", - "lint": "node_modules/.bin/eslint . --ext .js" + "lint": "node_modules/.bin/eslint . --ext .js", + "start": "node index.js", + "setupdb": "node src/miscellaneous/generateDB.js" }, "keywords": [ "logging", diff --git a/src/db/clients/postgres.js b/src/db/clients/postgres.js index 0167694..685279f 100644 --- a/src/db/clients/postgres.js +++ b/src/db/clients/postgres.js @@ -2,11 +2,11 @@ const { Client, Pool } = require('pg') // PREREQUISITE: Have postgres installed require('dotenv').config() const pool = new Pool({ - user: process.env.PGUSER, - host: process.env.PGHOST, - database: process.env.PGDATABASE, - password: process.env.PGPASSWORD, - port: process.env.PGPORT || 5432, + user: process.env.POSTGRES_USER, + host: process.env.POSTGRES_HOST, + database: process.env.POSTGRES_DB, + password: process.env.POSTGRES_PASSWORD, + port: process.env.POSTGRES_PORT || 5432, max: 5 // 5 clients each, god help us all if this isn't sufficient }) diff --git a/src/miscellaneous/generateDB.js b/src/miscellaneous/generateDB.js index da00a94..486276d 100644 --- a/src/miscellaneous/generateDB.js +++ b/src/miscellaneous/generateDB.js @@ -3,10 +3,10 @@ const { Pool } = require('pg') require('dotenv').config() const pool = new Pool({ - user: process.env.PGUSER, // Make sure PGUSER is a superuser - host: process.env.PGHOST, + user: process.env.POSTGRES_USER, // Make sure POSTGRES_USER is a superuser + host: process.env.POSTGRES_HOST, database: 'template1', // Should exist in all postgres databases by default - password: process.env.PGPASSWORD, + password: process.env.POSTGRES_PASSWORD, port: 5432 }) @@ -14,17 +14,17 @@ pool.on('error', e => { console.error('There was an error while generating the database structure!', e) }) -async function generate () { - await pool.query('CREATE DATABASE logger') // create db +async function generate() { + if (!process.env.DOCKER) await pool.query(`CREATE DATABASE ${process.env.POSTGRES_DB}`) // create db const loggerDB = new Pool({ - user: process.env.PGUSER, - host: process.env.PGHOST, - database: 'logger', - password: process.env.PGPASSWORD, + user: process.env.POSTGRES_USER, + host: process.env.POSTGRES_HOST, + database: process.env.POSTGRES_DB, + password: process.env.POSTGRES_PASSWORD, port: 5432 }) - await loggerDB.query('CREATE TABLE messages ( id TEXT PRIMARY KEY, author_id TEXT NOT NULL, content TEXT, attachment_b64 TEXT, ts TIMESTAMPTZ )') // establish messages table - await loggerDB.query('CREATE TABLE guilds ( id TEXT PRIMARY KEY, owner_id TEXT NOT NULL, ignored_channels TEXT[], disabled_events TEXT[], event_logs JSON, log_bots BOOL, custom_settings JSON )') // establish guilds table + await loggerDB.query('CREATE TABLE IF NOT EXISTS messages ( id TEXT PRIMARY KEY, author_id TEXT NOT NULL, content TEXT, attachment_b64 TEXT, ts TIMESTAMPTZ )') // establish messages table + await loggerDB.query('CREATE TABLE IF NOT EXISTS guilds ( id TEXT PRIMARY KEY, owner_id TEXT NOT NULL, ignored_channels TEXT[], disabled_events TEXT[], event_logs JSON, log_bots BOOL, custom_settings JSON )') // establish guilds table console.log('DB Generated!') }