diff --git a/README.md b/README.md new file mode 100644 index 0000000..b545aa5 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# Briques + +On aime les briques + +## Dev + +To run postgresql server + adminer in dev environnement (assuming you're running the backend manually with node), run : + +``` +docker compose -f docker-compose.dev.yml up +``` + +## Production + +Use the file `docker-compose.prod.yml` to start the app in production mode, it can be done using the following command : + +``` +docker compose -f docker-compose.dev.yml up +``` diff --git a/back-end/.dockerignore b/back-end/.dockerignore new file mode 100644 index 0000000..19d5689 --- /dev/null +++ b/back-end/.dockerignore @@ -0,0 +1,5 @@ +node_modules +dist +.env +.env.example +nodemon.json diff --git a/back-end/.env.example b/back-end/.env.example index 8abc227..9731b96 100644 --- a/back-end/.env.example +++ b/back-end/.env.example @@ -1,7 +1,10 @@ -NODE_ENV="dev" +# This .env file is meant for developpement usage, use +# .env.production for production +NODE_PORT=3000 +NODE_ENV=dev -DB_HOST="postgres" -DB_NAME="briques" -DB_USER="briques_db" -DB_PASSWORD="briques_password" -DB_PORT=5432 \ No newline at end of file +# those values must be the same as in ../docker-compose.dev.yml +DB_HOST=localhost +DB_NAME=briques_db +DB_USER=briques_llm +DB_PASSWORD=briques_password_2025 diff --git a/back-end/.env.production b/back-end/.env.production new file mode 100644 index 0000000..f63a029 --- /dev/null +++ b/back-end/.env.production @@ -0,0 +1,6 @@ +NODE_PORT=3000 +NODE_ENV=production +DB_HOST=briques_postegres +DB_NAME=briques_db +DB_USER=briques_llm +DB_PASSWORD=briques_password_2025 diff --git a/back-end/Dockerfile.back b/back-end/Dockerfile.back index 9079939..269cce1 100644 --- a/back-end/Dockerfile.back +++ b/back-end/Dockerfile.back @@ -4,30 +4,14 @@ FROM node:22-alpine # Workdir definition WORKDIR /usr/src/back -# Environment declaration variables -ENV NODE_ENV="dev" -ENV DB_HOST="briques_postgres" -ENV DB_NAME="briques_db" -ENV DB_USER="briques_llm" -ENV DB_PASSWORD="briques_password_2025" -ENV DB_PORT=5432 - COPY package.json ./ RUN npm install - RUN npm install -g pm2 # Copy sources COPY . . - -# Setting up environment -RUN echo "NODE_ENV=${NODE_ENV}" > .env \ - && echo "DB_HOST=${DB_HOST}" >> .env \ - && echo "DB_NAME=${DB_NAME}" >> .env \ - && echo "DB_USER=${DB_USER}" >> .env \ - && echo "DB_PORT=${DB_PORT}" >> .env \ - && echo "DB_PASSWORD=${DB_PASSWORD}" >> .env +COPY .env.production .env # Compilation des fichiers TypeScript RUN npm run build @@ -40,5 +24,4 @@ RUN chmod -R u=rwx,g=,o= ./ EXPOSE 3000 # Start app -CMD ["npm", "run", "startonly"] -#CMD ["pm2", "start", "dist/app.js", "--no-daemon"] +CMD ["pm2", "start", "dist/app.js", "--no-daemon"] diff --git a/back-end/package.json b/back-end/package.json index 7c8cdf5..591ffb8 100644 --- a/back-end/package.json +++ b/back-end/package.json @@ -5,7 +5,7 @@ "scripts": { "startonly": "node dist/app.js", "start": "tsc && node dist/app.js", - "build": "tsc", + "build": "tsc && cp -r src/templates dist", "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], @@ -13,13 +13,18 @@ "license": "ISC", "description": "", "devDependencies": { + "@types/ejs": "^3.1.5", "@types/express": "^5.0.0", + "@types/morgan": "^1.9.9", "@types/pg": "^8.11.10", "globals": "^15.11.0", "typescript": "^5.6.3" }, "dependencies": { + "dotenv": "^16.4.5", + "ejs": "^3.1.10", "express": "^4.21.1", + "morgan": "^1.10.0", "pg": "^8.13.1" } } diff --git a/back-end/src/app.ts b/back-end/src/app.ts index dee7341..060cfd4 100644 --- a/back-end/src/app.ts +++ b/back-end/src/app.ts @@ -1,14 +1,31 @@ +// Load dotenv before any process.env is accessed +import dotenv from 'dotenv'; +dotenv.config() + import express from 'express'; -import db from './db'; +import morgan from 'morgan'; +import path from 'path'; +import routes from './routes'; const app = express(); + const port = process.env.PORT ?? 3000; -app.get('/', async (_req, res) => { - const message = await db.example_request(); - res.send(message); -}); +const log_format = (process.env.NODE_ENV === "dev") ? "dev": "combined"; +console.log("=== LOG CONFIG ==="); +console.log(`log format: ${log_format}`); +console.log("=== END LOG CONFIG ==="); + +// Need the path.join for node to resolve correctly the templates directory +app.set('views', path.join(__dirname, 'templates')); +app.set('view engine', 'ejs'); + +// Add logs +app.use(morgan(log_format)); + +// Defines endpoints +app.use(routes); app.listen(port, () => { - return console.log(`Express is listening at http://localhost:${port}`); + return console.log(`Briques is listening at http://localhost:${port}`); }); diff --git a/back-end/src/db/db_client.ts b/back-end/src/db/db_client.ts index 52d29ca..aafefb6 100644 --- a/back-end/src/db/db_client.ts +++ b/back-end/src/db/db_client.ts @@ -7,17 +7,19 @@ const db_host = process.env.DB_HOST ?? "localhost"; const db_port = parseInt(process.env.DB_PORT ?? "5432"); console.log("=== DB CONFIG ==="); -console.log(`DB_USER:\t\t${db_user}`); +console.log(`DB_USER:\t${db_user}`); console.log(`DB_PASSWORD:\t${db_user}`); -console.log(`DB_NAME:\t\t${db_name}`); -console.log(`DB_HOST:\t\t${db_host}`); -console.log(`DB_PORT:\t\t${db_port}`); +console.log(`DB_NAME:\t${db_name}`); +console.log(`DB_HOST:\t${db_host}`); +console.log(`DB_PORT:\t${db_port}`); +console.log("=== END DB CONFIG ==="); - -export const new_client = () => new pg.Client({ - user: db_user, - password: db_password, - database: db_name, - host: db_host, - port: db_port, -}); +export function new_client() { + return new pg.Client({ + user: db_user, + password: db_password, + database: db_name, + host: db_host, + port: db_port, + }); +} diff --git a/back-end/src/routes/index.ts b/back-end/src/routes/index.ts new file mode 100644 index 0000000..7a7c473 --- /dev/null +++ b/back-end/src/routes/index.ts @@ -0,0 +1,16 @@ +import { Router } from "express"; +import db from '../db'; + +const routes = Router(); + +routes.get('/', async (_req, res) => { + const message = await db.example_request(); + res.send(message); +}); + +routes.get("/message", async (_req, res) => { + const message = await db.example_request(); + res.render('index.ejs', { message }); +}); + +export default routes; diff --git a/back-end/src/templates/index.ejs b/back-end/src/templates/index.ejs new file mode 100644 index 0000000..f875856 --- /dev/null +++ b/back-end/src/templates/index.ejs @@ -0,0 +1,13 @@ + + +
+ + +Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sapiente quod dicta molestiae harum veniam iste, nostrum nemo earum commodi fugit modi, ratione obcaecati, beatae ullam. Debitis ducimus dignissimos rem at.
+ + diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..0dfabcb --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,20 @@ +services: + database: + hostname: database + container_name: briques_postgres + image: postgres + restart: always + environment: + - POSTGRES_DB=${DB_NAME} + - POSTGRES_USER=${DB_USER} + - POSTGRES_PASSWORD=${DB_PASSWORD} + ports: + - 5432:5432 + volumes: + - ./database:/var/lib/postgresql/data + + adminer: + image: adminer + restart: always + ports: + - 8080:8080 diff --git a/docker-compose.yml b/docker-compose.prod.yml similarity index 74% rename from docker-compose.yml rename to docker-compose.prod.yml index bf9b6ff..ed9bc76 100644 --- a/docker-compose.yml +++ b/docker-compose.prod.yml @@ -11,9 +11,6 @@ services: volumes: - ./database:/var/lib/postgresql/data - networks: - - briques-db - back: hostname: back @@ -32,21 +29,3 @@ services: - '${NODE_PORT}:3000' depends_on: - database - - networks: - - briques-db - - adminer: - image: adminer - restart: always - ports: - - 8080:8080 - - networks: - - briques-db - - -networks: - briques-db: - driver: bridge -