mirror of
https://github.com/ets-cfuhrman-pfe/EvalueTonSavoir.git
synced 2025-08-11 21:23:54 -04:00
Adds healthcheck to quiz + adds image to build
This commit is contained in:
parent
2c7fd9c828
commit
3c2bcb4ed4
11 changed files with 833 additions and 332 deletions
31
.github/workflows/create-branch-images.yml
vendored
31
.github/workflows/create-branch-images.yml
vendored
|
|
@ -104,3 +104,34 @@ jobs:
|
|||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
build-quizroom:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Log in to the Container registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Extract metadata for Quizroom Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ghcr.io/${{ github.repository }}-quizroom
|
||||
tags: |
|
||||
type=ref,event=branch
|
||||
type=semver,pattern={{version}}
|
||||
- name: Build and push Quizroom Docker image
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: ./quizRoom
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
platforms: linux/amd64
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
|
|
@ -37,7 +37,7 @@ services:
|
|||
- quiz_network
|
||||
restart: always
|
||||
|
||||
quizroom:
|
||||
quizroom: # Forces image to update
|
||||
build:
|
||||
context: ./quizRoom
|
||||
dockerfile: Dockerfile
|
||||
|
|
|
|||
|
|
@ -1,60 +0,0 @@
|
|||
js_import njs/main.js;
|
||||
js_set $quiz_room_host main.getQuizRoomHost;
|
||||
|
||||
map $http_upgrade $connection_upgrade {
|
||||
default upgrade;
|
||||
'' close;
|
||||
}
|
||||
|
||||
# Cache for room information
|
||||
# keyval_zone zone=rooms:10m;
|
||||
# keyval_zone zone=room_hosts:10m;
|
||||
# keyval $room_id $room_info zone=rooms;
|
||||
|
||||
upstream frontend {
|
||||
server localhost:5173;
|
||||
}
|
||||
|
||||
upstream backend {
|
||||
server localhost:3000;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
|
||||
location /api {
|
||||
rewrite /backend/(.*) /$1 break;
|
||||
proxy_pass http://backend;
|
||||
}
|
||||
|
||||
location /socket.io {
|
||||
rewrite /backend/(.*) /$1 break;
|
||||
proxy_pass http://backend;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host $host;
|
||||
proxy_hide_header 'Access-Control-Allow-Origin';
|
||||
}
|
||||
|
||||
location /quiz/([^/]+)/socket {
|
||||
# Routing logic
|
||||
set $room_id $1;
|
||||
js_content main.routeWebSocket;
|
||||
|
||||
#Proxy headers
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection $connection_upgrade;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_read_timeout 3600s;
|
||||
proxy_send_timeout 3600s;
|
||||
proxy_buffering off;
|
||||
}
|
||||
|
||||
location / {
|
||||
proxy_pass http://frontend;
|
||||
}
|
||||
|
||||
}
|
||||
2
quizRoom/.dockerignore
Normal file
2
quizRoom/.dockerignore
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
Dockerfile
|
||||
docker-compose.yml
|
||||
|
|
@ -1,6 +1,10 @@
|
|||
# Use the Node base image
|
||||
FROM node:18 AS quizroom
|
||||
|
||||
ARG PORT=4500
|
||||
ENV PORT=${PORT}
|
||||
ENV ROOM_ID=${ROOM_ID}
|
||||
|
||||
# Create a working directory
|
||||
WORKDIR /usr/src/app
|
||||
|
||||
|
|
@ -15,7 +19,11 @@ COPY . .
|
|||
RUN npm run build
|
||||
|
||||
# Expose WebSocket server port
|
||||
EXPOSE 4500
|
||||
EXPOSE ${PORT}
|
||||
|
||||
# Add healthcheck
|
||||
HEALTHCHECK --interval=30s --timeout=30s --start-period=30s --retries=3 \
|
||||
CMD /usr/src/app/healthcheck.sh
|
||||
|
||||
# Start the server using the compiled JavaScript file
|
||||
CMD ["node", "dist/app.js"]
|
||||
|
|
|
|||
|
|
@ -2,18 +2,42 @@ import http from "http";
|
|||
import { Server, ServerOptions } from "socket.io";
|
||||
import { setupWebsocket } from "./socket/setupWebSocket";
|
||||
import dotenv from "dotenv";
|
||||
import express from 'express';
|
||||
|
||||
// Load environment variables
|
||||
dotenv.config();
|
||||
|
||||
const port = 4500;
|
||||
const roomId = process.env.ROOM_ID; // Load roomId from environment variable
|
||||
const port = process.env.PORT || 4500;
|
||||
const roomId = process.env.ROOM_ID;
|
||||
console.log(`I am: /api/room/${roomId}/socket`);
|
||||
|
||||
// Create HTTP and WebSocket server
|
||||
const server = http.createServer();
|
||||
// Create Express app for health check
|
||||
const app = express();
|
||||
const server = http.createServer(app);
|
||||
|
||||
// Health check endpoint
|
||||
app.get('/health', (_, res) => {
|
||||
try {
|
||||
if (io.engine?.clientsCount !== undefined) {
|
||||
res.status(200).json({
|
||||
status: 'healthy',
|
||||
path: `/api/room/${roomId}/socket`,
|
||||
connections: io.engine.clientsCount,
|
||||
uptime: process.uptime()
|
||||
});
|
||||
} else {
|
||||
throw new Error('Socket.io server not initialized');
|
||||
}
|
||||
} catch (error: Error | any) {
|
||||
res.status(500).json({
|
||||
status: 'unhealthy',
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
const ioOptions: Partial<ServerOptions> = {
|
||||
path: `/api/room/${roomId}/socket`, // Use roomId from env variable
|
||||
path: `/api/room/${roomId}/socket`,
|
||||
cors: {
|
||||
origin: "*",
|
||||
methods: ["GET", "POST"],
|
||||
|
|
|
|||
19
quizRoom/docker-compose.yml
Normal file
19
quizRoom/docker-compose.yml
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
version: '3.8'
|
||||
|
||||
services:
|
||||
quizroom:
|
||||
build:
|
||||
context: .
|
||||
args:
|
||||
- PORT=${PORT:-4500}
|
||||
ports:
|
||||
- "${PORT:-4500}:${PORT:-4500}"
|
||||
environment:
|
||||
- PORT=${PORT:-4500}
|
||||
- ROOM_ID=${ROOM_ID}
|
||||
healthcheck:
|
||||
test: curl -f http://localhost:${PORT:-4500}/health || exit 1
|
||||
interval: 30s
|
||||
timeout: 30s
|
||||
retries: 3
|
||||
start_period: 30s
|
||||
2
quizRoom/healthcheck.sh
Normal file
2
quizRoom/healthcheck.sh
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
#!/bin/sh
|
||||
curl -f "http://0.0.0.0:${PORT}/health" || exit 1
|
||||
999
quizRoom/package-lock.json
generated
999
quizRoom/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -17,8 +17,8 @@
|
|||
"typescript": "^5.6.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@valkey/valkey-glide": "^1.1.0",
|
||||
"dotenv": "^16.4.5",
|
||||
"express": "^4.21.1",
|
||||
"http": "^0.0.1-security",
|
||||
"socket.io": "^4.8.1"
|
||||
}
|
||||
|
|
|
|||
2
quizRoom/socket/.env.example
Normal file
2
quizRoom/socket/.env.example
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
ROOM_ID=123456
|
||||
PORT=4500
|
||||
Loading…
Reference in a new issue