[#40] BACKEND USER, Company

https://project.mdnd-it.cc/work_packages/40
This commit is contained in:
2025-06-15 01:12:46 +02:00
parent f68540f511
commit fa868e7c1d
32 changed files with 6337 additions and 860 deletions
+14 -6
View File
@@ -1,10 +1,18 @@
POSTGRES_USER=Admin
POSTGRES_PASSWORD=QwEr12345.
POSTGRES_DB_1=Default
POSTGRES_DB_2=USERS
POSTGRES_DB_3=QUESTIONS
POSTGRES_DB_4=STATISTICS
DB_PASSWORD=QwEr12345.
Default_User=Admin
Default_Password=Admin.Admin
# Database configuration
DB_1=Default
DB_2=QUESTIONS
DB_3=STATISTICS
DB_4=USERS
DB_PSWD_1=42vM2ftPy1YetSz9AdAHkayxKvQHuV9Wh0nT8c5DKYt
DB_PSWD_2=3cYzPBoLtPindO53Eh3cA80DqqjYvq7CJOzA2Eik00k
DB_PSWD_3=HyJcDLDW3ZYXbMLzlkL4zWqWwyhExQ4XvVCuT8ihld0
DB_PSWD_4=965o6d3Mz7YlgI8GkJkiZD6PIpTZfaBzIheZX3nIpY3
# Ports configuration
BACKEND_PORT=3000
FRONTEND_PORT=5173
DATABASE_PORT=80
-55
View File
@@ -1,55 +0,0 @@
-- Adminer 5.3.0 PostgreSQL 17.5 dump
DROP TABLE IF EXISTS "Code";
DROP SEQUENCE IF EXISTS "Code_CODE_ID_seq";
CREATE SEQUENCE "Code_CODE_ID_seq" INCREMENT 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1;
CREATE TABLE "public"."Code" (
"CODE_ID" integer DEFAULT nextval('"Code_CODE_ID_seq"') NOT NULL,
"CODE" character varying(60) NOT NULL,
"Time" timestamp NOT NULL,
CONSTRAINT "Code_pkey" PRIMARY KEY ("CODE_ID")
)
WITH (oids = false);
DROP TABLE IF EXISTS "Company";
DROP SEQUENCE IF EXISTS "Company_C_ID_seq";
CREATE SEQUENCE "Company_C_ID_seq" INCREMENT 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1;
CREATE TABLE "public"."Company" (
"C_ID" integer DEFAULT nextval('"Company_C_ID_seq"') NOT NULL,
"Name" character varying(30) NOT NULL,
"ContactName" character varying(30) NOT NULL,
"ContactEmail" character varying(30) NOT NULL,
"FirstAPI" text NOT NULL,
"TokenAPI" text NOT NULL,
CONSTRAINT "Company_pkey" PRIMARY KEY ("C_ID")
)
WITH (oids = false);
DROP TABLE IF EXISTS "User";
DROP SEQUENCE IF EXISTS "User_id_seq";
CREATE SEQUENCE "User_id_seq" INCREMENT 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1;
CREATE TABLE "public"."User" (
"id" integer DEFAULT nextval('"User_id_seq"') NOT NULL,
"UName" character varying(30) NOT NULL,
"PSWD" character varying(30) NOT NULL,
"RegDate" timestamp NOT NULL,
"Email" character varying(40) NOT NULL,
"Name" character varying(30) NOT NULL,
"AUTH" boolean DEFAULT false NOT NULL,
"REG_CODE" integer NOT NULL,
"C_Id" integer NOT NULL,
"C_Token" character varying(60) NOT NULL,
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
)
WITH (oids = false);
ALTER TABLE ONLY "public"."User" ADD CONSTRAINT "User_C_Id_fkey" FOREIGN KEY ("C_Id") REFERENCES "Company"("C_ID") ON UPDATE CASCADE ON DELETE CASCADE NOT DEFERRABLE;
ALTER TABLE ONLY "public"."User" ADD CONSTRAINT "User_REG_CODE_fkey" FOREIGN KEY ("REG_CODE") REFERENCES "Code"("CODE_ID") ON UPDATE CASCADE ON DELETE CASCADE NOT DEFERRABLE;
-- 2025-05-20 22:16:50 UTC
+13 -10
View File
@@ -10,18 +10,21 @@ COPY SerpentRace_Frontend/ ./
RUN npm run build
################ BACKEND BUILD #################
FROM base AS backend-build
WORKDIR /usr/local/app/backend
COPY SerpentRace_Backend/package.json SerpentRace_Backend/package-lock.json ./
RUN npm ci
COPY SerpentRace_Backend/ ./
# Copy frontend build output to backend static directory
COPY --from=client-build /usr/local/app/frontend/dist ./src/static
# FROM base AS backend-build
# WORKDIR /usr/local/app/backend
# COPY SerpentRace_Backend/package.json SerpentRace_Backend/package-lock.json ./
# RUN npm ci
# COPY SerpentRace_Backend/ ./
# # Copy frontend build output to backend static directory
# COPY --from=client-build /usr/local/app/frontend/dist ./src/static
# generate js files from ts files
RUN npm run build
################ PRODUCTION IMAGE #################
FROM backend-build AS prod
WORKDIR /usr/local/app/backend
ENV NODE_ENV=production
RUN npm ci --only=production
ENV NODE_ENV=development
RUN npm ci
EXPOSE 3000
CMD ["node", "src/index.mjs"]
CMD ["node", "dist/index.js"]
+48 -38
View File
@@ -7,32 +7,34 @@ services:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
backend:
build:
context: ..
dockerfile: SerpentRace_Docker/Dockerfile
target: prod
environment:
POSTGRES_HOST: db
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB_1}
DB_1: ${POSTGRES_DB_2}
DB_2: ${POSTGRES_DB_3}
DB_3: ${POSTGRES_DB_4}
command: ["npx", "nodemon", "src/index.mjs"]
develop:
watch:
- path: ../SerpentRace_Backend/src
action: sync
target: /usr/local/app/backend/src
- path: ../SerpentRace_Backend/package.json
action: rebuild
labels:
traefik.http.routers.backend.rule: Host(`localhost`) && PathPrefix(`/api`)
traefik.http.services.backend.loadbalancer.server.port: 3000
depends_on:
- db
# backend:
# build:
# context: ..
# dockerfile: SerpentRace_Docker/Dockerfile
# target: prod
# environment:
# DATABASE_URL_1: "mysql://${DB_1}:${DB_PSWD_1}@db:3306/${DB_1}"
# DATABASE_URL_2: "mysql://${DB_2}:${DB_PSWD_2}@db:3306/${DB_2}"
# DATABASE_URL_3: "mysql://${DB_3}:${DB_PSWD_3}@db:3306/${DB_3}"
# DATABASE_URL_4: "mysql://${DB_4}:${DB_PSWD_4}@db:3306/${DB_4}"
# command: ["npx", "nodemon", "src/index.ts", "--watch", "src", "--ext", "ts"]
# develop:
# watch:
# - path: ../SerpentRace_Backend/src
# action: sync
# target: /usr/local/app/backend/src
# - path: ../SerpentRace_Backend/prisma
# action: sync
# target: /usr/local/app/backend/prisma
# actions:
# - migrate:all
# - path: ../SerpentRace_Backend/package.json
# action: rebuild
# labels:
# traefik.http.routers.backend.rule: Host(`api.localhost`)
# traefik.http.services.backend.loadbalancer.server.port: 3000
# depends_on:
# - db
frontend:
build:
@@ -53,25 +55,33 @@ services:
traefik.http.services.frontend.loadbalancer.server.port: 5173
db:
image: postgres
image: mariadb:latest
restart: always
shm_size: 128mb
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB_1}
DB_1: ${POSTGRES_DB_2}
DB_2: ${POSTGRES_DB_3}
DB_3: ${POSTGRES_DB_4}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_DATABASE: ${DB_1}
MYSQL_USER: ${Default_User}
MYSQL_PASSWORD: ${Default_Password}
DB_1: ${DB_1}
DB_2: ${DB_2}
DB_3: ${DB_3}
DB_4: ${DB_4}
PSWD_1: ${DB_PSWD_1}
PSWD_2: ${DB_PSWD_2}
PSWD_3: ${DB_PSWD_3}
PSWD_4: ${DB_PSWD_4}
volumes:
- ./init-multi-db.sh:/docker-entrypoint-initdb.d/init-multi-db.sh:ro
- ./Default.sql:/docker-entrypoint-initdb.d/Default.sql:ro
- ./init-db-users.sh:/docker-entrypoint-initdb.d/init-db-users.sh:ro
- db_data:/var/lib/mysql
adminer:
image: adminer
restart: always
ports:
- "8080:8080"
labels:
traefik.http.routers.adminer.rule: Host(`db.localhost`)
traefik.http.services.adminer.loadbalancer.server.port: 8080
traefik.http.services.adminer.loadbalancer.server.port: 8080
volumes:
db_data:
+17
View File
@@ -0,0 +1,17 @@
#!/bin/bash
set -e
mariadb -uroot -p"$MYSQL_ROOT_PASSWORD" <<EOSQL
CREATE USER IF NOT EXISTS '$DB_1'@'%' IDENTIFIED BY '$PSWD_1';
GRANT ALL PRIVILEGES ON \`$DB_1\`.* TO '$DB_1'@'%';
CREATE USER IF NOT EXISTS '$DB_2'@'%' IDENTIFIED BY '$PSWD_2';
GRANT ALL PRIVILEGES ON \`$DB_2\`.* TO '$DB_2'@'%';
CREATE USER IF NOT EXISTS '$DB_3'@'%' IDENTIFIED BY '$PSWD_3';
GRANT ALL PRIVILEGES ON \`$DB_3\`.* TO '$DB_3'@'%';
CREATE USER IF NOT EXISTS '$DB_4'@'%' IDENTIFIED BY '$PSWD_4';
GRANT ALL PRIVILEGES ON \`$DB_4\`.* TO '$DB_4'@'%';
FLUSH PRIVILEGES;
EOSQL
+5 -4
View File
@@ -1,6 +1,7 @@
#!/bin/bash
set -e
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
CREATE DATABASE "${DB_1}";
CREATE DATABASE "${DB_2}";
CREATE DATABASE "${DB_3}";
mariadb -uroot -p"$MYSQL_ROOT_PASSWORD" <<EOSQL
CREATE DATABASE IF NOT EXISTS \`${DB_2}\`;
CREATE DATABASE IF NOT EXISTS \`${DB_3}\`;
CREATE DATABASE IF NOT EXISTS \`${DB_4}\`;
EOSQL