From a19e1415f16f483843a76c4aeea6083dba3acc90 Mon Sep 17 00:00:00 2001 From: Jo Date: Sun, 26 Nov 2023 00:25:28 +0100 Subject: [PATCH] refactor: improve env loading chore: add Dockerfile --- Dockerfile | 19 ++++++++++++++++++- app.js | 11 ++++++++--- config/example.env | 9 +++++++++ config/placeholder | 0 docker-compose.yml | 37 +++++++++++++++++++++++++++++++++++++ entrypoint.sh | 17 +++++++++++++++++ example-compose.yml | 37 +++++++++++++++++++++++++++++++++++++ package-lock.json | 21 +++++++++++++++++++++ package.json | 1 + 9 files changed, 148 insertions(+), 4 deletions(-) create mode 100644 config/example.env delete mode 100644 config/placeholder create mode 100644 docker-compose.yml create mode 100755 entrypoint.sh create mode 100644 example-compose.yml diff --git a/Dockerfile b/Dockerfile index 003e4ea..9073dab 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1 +1,18 @@ -# todo: Write Dockerfile \ No newline at end of file +FROM node:21 + +# Install netcat +RUN apt-get update && apt-get install -y netcat + +WORKDIR /usr/src/app + +# Copy package.json and package-lock.json to the working directory +COPY package*.json ./ + +RUN npm install pnpm +RUN pnpm install + +COPY . . + +EXPOSE 4300 + +ENTRYPOINT ["./entrypoint.sh"] diff --git a/app.js b/app.js index b2de95b..f76d2f7 100644 --- a/app.js +++ b/app.js @@ -14,10 +14,14 @@ const express = require("express"); const bodyParser = require("body-parser"); +const cookieParser = require("cookie-parser"); const mysql = require("mysql2"); const path = require("path"); -const dotenv = require("dotenv"); -dotenv.config(); + +if (!process.env.DOCKER) { + const dotenv = require("dotenv"); + dotenv.config(); +} //------------------------------------------------> // Express initialization & configuration @@ -34,8 +38,9 @@ app.set("view engine", "ejs"); // Middlewares //------------------------------------------------> -// Use body-parser to get req.body +// Use body-parser and cookie-parser app.use(bodyParser.urlencoded({ extended: false })); +app.use(cookieParser()); //------------------------------------------------> // MySQL connection diff --git a/config/example.env b/config/example.env new file mode 100644 index 0000000..210de1f --- /dev/null +++ b/config/example.env @@ -0,0 +1,9 @@ +# Database +DB_HOST="exampleHost" +DB_PORT=3306 +DB_NAME="exampleName" +DB_USER="exampleUser" +DB_PASSWORD="examplePassword" + +# Express +PORT=4300 \ No newline at end of file diff --git a/config/placeholder b/config/placeholder deleted file mode 100644 index e69de29..0000000 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..aa66a2c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,37 @@ +version: '3' + +services: + # MySQL service + db: + image: mysql:8 + restart: always + environment: + MYSQL_DATABASE: jet + MYSQL_USER: jet + MYSQL_PASSWORD: ghiuwe§825429h§$%ff + MYSQL_ROOT_PASSWORD: hgruwhgvuiwrghiuwe§825429h§$%ff + ports: + - "3306:3306" + volumes: + - mysql:/var/lib/mysql + + # Express app service + app: + build: + context: . + dockerfile: Dockerfile + depends_on: + - db + ports: + - "4300:4300" + environment: + DB_HOST: db + DB_PORT: 3306 + DB_USER: jet + DB_PASSWORD: ghiuwe§825429h§$%ff + DB_NAME: jet + DOCKER: true + PORT: 4300 + +volumes: + mysql: \ No newline at end of file diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..2f46014 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,17 @@ +#!/bin/bash +set -e + +# Function to check if the database is healthy +check_database() { + until nc -z -w 1 "$DB_HOST" "$DB_PORT"; do + >&2 echo "[JET] Waiting for MySQL to be ready..." + sleep 1 + done + >&2 echo "[JET] MySQL is ready" +} + +# Check if the database is healthy +check_database + +# Start the Express app +exec npm run start diff --git a/example-compose.yml b/example-compose.yml new file mode 100644 index 0000000..f631f5e --- /dev/null +++ b/example-compose.yml @@ -0,0 +1,37 @@ +version: '3' + +services: + # MySQL service + db: + image: mysql:8 + restart: always + environment: + MYSQL_DATABASE: exampleDatabaseName + MYSQL_USER: exampleUser + MYSQL_PASSWORD: examplePassword + MYSQL_ROOT_PASSWORD: exampleRootPassword + ports: + - "3306:3306" + volumes: + - mysql:/var/lib/mysql + + # Express app service + app: + build: + context: . + dockerfile: Dockerfile + depends_on: + - db + ports: + - "4300:4300" + environment: + DB_HOST: db + DB_PORT: 3306 + DB_USER: exampleUser + DB_PASSWORD: examplePassword + DB_NAME: exampleDatabaseName + DOCKER: true + PORT: 4300 + +volumes: + mysql: \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index dff1a79..2ce63b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "body-parser": "^1.20.2", + "cookie-parser": "^1.4.6", "dotenv": "^16.3.1", "ejs": "^3.1.9", "express": "^4.18.2", @@ -510,6 +511,26 @@ "node": ">= 0.6" } }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", diff --git a/package.json b/package.json index 311d9ab..b4813cd 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "license": "MIT", "dependencies": { "body-parser": "^1.20.2", + "cookie-parser": "^1.4.6", "dotenv": "^16.3.1", "ejs": "^3.1.9", "express": "^4.18.2",