From aa3e097e16461bf6cee275e9e1efd3a05f54e204 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 17 Apr 2026 10:54:39 -0700 Subject: [PATCH] initial commit --- docker/unified/build_images.sh | 25 ++++++++++++ docker/unified/certbot-compose.yaml | 19 +++++++++ docker/unified/client.Dockerfile | 20 ++++++++++ docker/unified/docker-compose.yaml | 49 +++++++++++++++++++++++ docker/unified/gateway/nginx.conf | 56 +++++++++++++++++++++++++++ docker/unified/mongoDB.Dockerfile | 3 ++ docker/unified/nginx/conf.d/prod.conf | 31 +++++++++++++++ docker/unified/server.Dockerfile | 22 +++++++++++ 8 files changed, 225 insertions(+) create mode 100755 docker/unified/build_images.sh create mode 100755 docker/unified/certbot-compose.yaml create mode 100755 docker/unified/client.Dockerfile create mode 100755 docker/unified/docker-compose.yaml create mode 100644 docker/unified/gateway/nginx.conf create mode 100755 docker/unified/mongoDB.Dockerfile create mode 100755 docker/unified/nginx/conf.d/prod.conf create mode 100755 docker/unified/server.Dockerfile diff --git a/docker/unified/build_images.sh b/docker/unified/build_images.sh new file mode 100755 index 000000000..49f8c7841 --- /dev/null +++ b/docker/unified/build_images.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Change directory to root directory for correct Docker Context +cd "$(dirname "$0")" +cd ../../ + +# Define an array of services and their Dockerfiles +declare -A services=( + ["uptime_client"]="./docker/prod/client.Dockerfile" + ["uptime_database_mongo"]="./docker/prod/mongoDB.Dockerfile" + ["uptime_server"]="./docker/prod/server.Dockerfile" +) + +# Loop through each service and build the corresponding image +for service in "${!services[@]}"; do + docker build -f "${services[$service]}" -t "$service" . + + # Check if the build succeeded + if [ $? -ne 0 ]; then + echo "Error building $service image. Exiting..." + exit 1 + fi +done + +echo "All images built successfully" \ No newline at end of file diff --git a/docker/unified/certbot-compose.yaml b/docker/unified/certbot-compose.yaml new file mode 100755 index 000000000..9220d07a1 --- /dev/null +++ b/docker/unified/certbot-compose.yaml @@ -0,0 +1,19 @@ +version: "3" + +services: + webserver: + image: nginx:latest + ports: + - 80:80 + - 443:443 + restart: always + volumes: + - ./nginx/conf.d/:/etc/nginx/conf.d/:ro + - ./certbot/www/:/var/www/certbot/:ro + certbot: + image: certbot/certbot:latest + volumes: + - ./certbot/www/:/var/www/certbot/:rw + - ./certbot/conf/:/etc/letsencrypt/:rw + depends_on: + - webserver diff --git a/docker/unified/client.Dockerfile b/docker/unified/client.Dockerfile new file mode 100755 index 000000000..b4c685e3e --- /dev/null +++ b/docker/unified/client.Dockerfile @@ -0,0 +1,20 @@ +FROM node:20-slim AS build + +ENV NODE_OPTIONS="--max-old-space-size=4096" + +WORKDIR /app + +COPY ./client/package*.json ./ + +RUN npm install + +COPY ./client . + +RUN npm run build + +FROM nginx:1.27.1-alpine + +COPY --from=build /app/dist /usr/share/nginx/html +COPY --from=build /app/env.sh /docker-entrypoint.d/env.sh +RUN chmod +x /docker-entrypoint.d/env.sh +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/docker/unified/docker-compose.yaml b/docker/unified/docker-compose.yaml new file mode 100755 index 000000000..01fab5529 --- /dev/null +++ b/docker/unified/docker-compose.yaml @@ -0,0 +1,49 @@ +services: + gateway: + image: nginx:1.27.1-alpine + container_name: checkmate-gateway + restart: always + ports: + - "80:80" + - "443:443" + volumes: + - /etc/letsencrypt:/etc/nginx/ssl:ro + - ./gateway/nginx.conf:/etc/nginx/conf.d/default.conf:ro + client-prod: + image: ghcr.io/bluewave-labs/checkmate:frontend-demo + restart: always + environment: + UPTIME_APP_API_BASE_URL: "https://demo.checkmate.so/api/v1" + UPTIME_APP_CLIENT_HOST: "https://demo.checkmate.so" + expose: + - "80" + depends_on: + - server-prod + volumes: + - ./nginx/conf.d/prod.conf:/etc/nginx/conf.d/default.conf:ro + server-prod: + image: ghcr.io/bluewave-labs/checkmate:backend-demo + restart: always + ports: + - "52345:52345" + env_file: + - server-prod.env + depends_on: + - mongodb-prod + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + mongodb-prod: + image: ghcr.io/bluewave-labs/checkmate:mongo-demo + restart: always + command: [ "mongod", "--quiet", "--bind_ip_all" ] + volumes: + - ./mongo/data-prod:/data/db + env_file: + - mongo-prod.env + healthcheck: + test: [ "CMD", "mongosh", "--eval", "db.adminCommand('ping')", "--quiet" ] + interval: 5s + timeout: 30s + start_period: 0s + start_interval: 1s + retries: 30 diff --git a/docker/unified/gateway/nginx.conf b/docker/unified/gateway/nginx.conf new file mode 100644 index 000000000..958402196 --- /dev/null +++ b/docker/unified/gateway/nginx.conf @@ -0,0 +1,56 @@ +proxy_set_header Host $host; +proxy_set_header X-Real-IP $remote_addr; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +proxy_set_header X-Forwarded-Proto $scheme; + +# --- PRODUCTION: demo.checkmate.so --- +server { + listen 80; + server_name demo.checkmate.so; + + location / { + return 301 https://$host$request_uri; + } +} + +server { + listen 443 ssl; + server_name demo.checkmate.so; + + ssl_certificate /etc/nginx/ssl/live/demo.checkmate.so/fullchain.pem; + ssl_certificate_key /etc/nginx/ssl/live/demo.checkmate.so/privkey.pem; + + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + + location / { + # Passes traffic to the prod client on port 80 + proxy_pass http://client-prod:80; + } +} + +# --- STAGING: staging.checkmate.so --- +server { + listen 80; + server_name staging.checkmate.so; + + location / { + return 301 https://$host$request_uri; + } +} + +server { + listen 443 ssl; + server_name staging.checkmate.so; + + ssl_certificate /etc/nginx/ssl/live/staging.checkmate.so/fullchain.pem; + ssl_certificate_key /etc/nginx/ssl/live/staging.checkmate.so/privkey.pem; + + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + + location / { + # Passes traffic to the staging client on port 80 + proxy_pass http://client-stage:80; + } +} \ No newline at end of file diff --git a/docker/unified/mongoDB.Dockerfile b/docker/unified/mongoDB.Dockerfile new file mode 100755 index 000000000..969a320c2 --- /dev/null +++ b/docker/unified/mongoDB.Dockerfile @@ -0,0 +1,3 @@ +FROM mongo +EXPOSE 27017 +CMD ["mongod"] diff --git a/docker/unified/nginx/conf.d/prod.conf b/docker/unified/nginx/conf.d/prod.conf new file mode 100755 index 000000000..63a42a401 --- /dev/null +++ b/docker/unified/nginx/conf.d/prod.conf @@ -0,0 +1,31 @@ +server { + listen 80; + listen [::]:80; + + server_name _; + server_tokens off; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri/ /index.html; + } + + location /api/ { + proxy_pass http://server-prod:52345/api/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /api-docs/ { + proxy_pass http://server-prod:52345/api-docs/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} \ No newline at end of file diff --git a/docker/unified/server.Dockerfile b/docker/unified/server.Dockerfile new file mode 100755 index 000000000..7341b1e9b --- /dev/null +++ b/docker/unified/server.Dockerfile @@ -0,0 +1,22 @@ +FROM node:20-slim + +# Install ping +RUN apt-get update \ + && apt-get install -y iputils-ping \ + && rm -rf /var/lib/apt/lists/* + +ENV NODE_OPTIONS="--max-old-space-size=2048" + +WORKDIR /app + +COPY ./server/package*.json ./ + +RUN npm install + +COPY ./server ./ + +RUN npm run build + +EXPOSE 52345 + +CMD ["node", "dist/index.js"] \ No newline at end of file