diff --git a/Docker/test/build_images.sh b/Docker/test/build_images.sh new file mode 100755 index 000000000..c879190bc --- /dev/null +++ b/Docker/test/build_images.sh @@ -0,0 +1,26 @@ +#!/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_redis"]="./Docker/prod/redis.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/test/client.Dockerfile b/Docker/test/client.Dockerfile new file mode 100644 index 000000000..1619b5e41 --- /dev/null +++ b/Docker/test/client.Dockerfile @@ -0,0 +1,18 @@ +FROM node:20-alpine AS build + +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/test/docker-compose.yaml b/Docker/test/docker-compose.yaml new file mode 100644 index 000000000..24e6d1165 --- /dev/null +++ b/Docker/test/docker-compose.yaml @@ -0,0 +1,45 @@ +services: + client: + image: uptime_client:latest + environment: + UPTIME_APP_API_BASE_URL: "https://uptime-demo.bluewavelabs.ca/api/v1" + ports: + - "80:80" + - "443:443" + depends_on: + - server + volumes: + - ./nginx/conf.d:/etc/nginx/conf.d/:ro + - ./certbot/www:/var/www/certbot/:ro + - ./certbot/conf/:/etc/nginx/ssl/:ro + + certbot: + image: certbot/certbot:latest + volumes: + - ./certbot/www/:/var/www/certbot/:rw + - ./certbot/conf/:/etc/letsencrypt/:rw + server: + image: uptime_server:latest + ports: + - "5000:5000" + env_file: + - server.env + depends_on: + - redis + - mongodb + redis: + image: uptime_redis:latest + ports: + - "6379:6379" + volumes: + - ./redis/data:/data + mongodb: + image: uptime_database_mongo:latest + command: ["mongod", "--quiet", "--auth"] + ports: + - "27017:27017" + volumes: + - ./mongo/data:/data/db + - ./mongo/init/create_users.js:/docker-entrypoint-initdb.d/create_users.js + env_file: + - mongo.env diff --git a/Docker/test/mongo/init/create_users.js b/Docker/test/mongo/init/create_users.js new file mode 100644 index 000000000..67a21f910 --- /dev/null +++ b/Docker/test/mongo/init/create_users.js @@ -0,0 +1,16 @@ +var username = process.env.USERNAME_ENV_VAR; +var password = process.env.PASSWORD_ENV_VAR; + +db = db.getSiblingDB("uptime_db"); + +db.createUser({ + user: username, + pwd: password, + roles: [ + { + role: "readWrite", + db: "uptime_db", + }, + ], +}); +print("User uptime_user created successfully"); diff --git a/Docker/test/mongoDB.Dockerfile b/Docker/test/mongoDB.Dockerfile new file mode 100644 index 000000000..80c8b9c8f --- /dev/null +++ b/Docker/test/mongoDB.Dockerfile @@ -0,0 +1,4 @@ +FROM mongo +COPY ./Docker/prod/mongo/init/create_users.js /docker-entrypoint-initdb.d/ +EXPOSE 27017 +CMD ["mongod"] diff --git a/Docker/test/nginx/conf.d/default.conf b/Docker/test/nginx/conf.d/default.conf new file mode 100644 index 000000000..5f37d48b7 --- /dev/null +++ b/Docker/test/nginx/conf.d/default.conf @@ -0,0 +1,69 @@ +server { + listen 80; + listen [::]:80; + + server_name uptime-demo.bluewavelabs.ca; + server_tokens off; + + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri/ /index.html; + } + + location /api/ { + proxy_pass http://server:5000/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:5000/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; + } +} + +server { + listen 443 default_server ssl http2; + listen [::]:443 ssl http2; + + server_name uptime-demo.bluewavelabs.ca; + + ssl_certificate /etc/nginx/ssl/live/uptime-demo.bluewavelabs.ca/fullchain.pem; + ssl_certificate_key /etc/nginx/ssl/live/uptime-demo.bluewavelabs.ca/privkey.pem; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri/ /index.html; + } + + location /api/ { + proxy_pass http://server:5000/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:5000/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; + } +} diff --git a/Docker/test/prod/build_images.sh b/Docker/test/prod/build_images.sh new file mode 100755 index 000000000..c879190bc --- /dev/null +++ b/Docker/test/prod/build_images.sh @@ -0,0 +1,26 @@ +#!/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_redis"]="./Docker/prod/redis.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/test/prod/client.Dockerfile b/Docker/test/prod/client.Dockerfile new file mode 100644 index 000000000..1619b5e41 --- /dev/null +++ b/Docker/test/prod/client.Dockerfile @@ -0,0 +1,18 @@ +FROM node:20-alpine AS build + +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/test/prod/docker-compose.yaml b/Docker/test/prod/docker-compose.yaml new file mode 100644 index 000000000..24e6d1165 --- /dev/null +++ b/Docker/test/prod/docker-compose.yaml @@ -0,0 +1,45 @@ +services: + client: + image: uptime_client:latest + environment: + UPTIME_APP_API_BASE_URL: "https://uptime-demo.bluewavelabs.ca/api/v1" + ports: + - "80:80" + - "443:443" + depends_on: + - server + volumes: + - ./nginx/conf.d:/etc/nginx/conf.d/:ro + - ./certbot/www:/var/www/certbot/:ro + - ./certbot/conf/:/etc/nginx/ssl/:ro + + certbot: + image: certbot/certbot:latest + volumes: + - ./certbot/www/:/var/www/certbot/:rw + - ./certbot/conf/:/etc/letsencrypt/:rw + server: + image: uptime_server:latest + ports: + - "5000:5000" + env_file: + - server.env + depends_on: + - redis + - mongodb + redis: + image: uptime_redis:latest + ports: + - "6379:6379" + volumes: + - ./redis/data:/data + mongodb: + image: uptime_database_mongo:latest + command: ["mongod", "--quiet", "--auth"] + ports: + - "27017:27017" + volumes: + - ./mongo/data:/data/db + - ./mongo/init/create_users.js:/docker-entrypoint-initdb.d/create_users.js + env_file: + - mongo.env diff --git a/Docker/test/prod/mongo/init/create_users.js b/Docker/test/prod/mongo/init/create_users.js new file mode 100644 index 000000000..67a21f910 --- /dev/null +++ b/Docker/test/prod/mongo/init/create_users.js @@ -0,0 +1,16 @@ +var username = process.env.USERNAME_ENV_VAR; +var password = process.env.PASSWORD_ENV_VAR; + +db = db.getSiblingDB("uptime_db"); + +db.createUser({ + user: username, + pwd: password, + roles: [ + { + role: "readWrite", + db: "uptime_db", + }, + ], +}); +print("User uptime_user created successfully"); diff --git a/Docker/test/prod/mongoDB.Dockerfile b/Docker/test/prod/mongoDB.Dockerfile new file mode 100644 index 000000000..80c8b9c8f --- /dev/null +++ b/Docker/test/prod/mongoDB.Dockerfile @@ -0,0 +1,4 @@ +FROM mongo +COPY ./Docker/prod/mongo/init/create_users.js /docker-entrypoint-initdb.d/ +EXPOSE 27017 +CMD ["mongod"] diff --git a/Docker/test/prod/nginx/conf.d/default.conf b/Docker/test/prod/nginx/conf.d/default.conf new file mode 100644 index 000000000..5f37d48b7 --- /dev/null +++ b/Docker/test/prod/nginx/conf.d/default.conf @@ -0,0 +1,69 @@ +server { + listen 80; + listen [::]:80; + + server_name uptime-demo.bluewavelabs.ca; + server_tokens off; + + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri/ /index.html; + } + + location /api/ { + proxy_pass http://server:5000/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:5000/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; + } +} + +server { + listen 443 default_server ssl http2; + listen [::]:443 ssl http2; + + server_name uptime-demo.bluewavelabs.ca; + + ssl_certificate /etc/nginx/ssl/live/uptime-demo.bluewavelabs.ca/fullchain.pem; + ssl_certificate_key /etc/nginx/ssl/live/uptime-demo.bluewavelabs.ca/privkey.pem; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri/ /index.html; + } + + location /api/ { + proxy_pass http://server:5000/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:5000/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; + } +} diff --git a/Docker/test/prod/redis.Dockerfile b/Docker/test/prod/redis.Dockerfile new file mode 100644 index 000000000..af68ec61e --- /dev/null +++ b/Docker/test/prod/redis.Dockerfile @@ -0,0 +1,2 @@ +FROM redis +EXPOSE 6379 \ No newline at end of file diff --git a/Docker/test/prod/server.Dockerfile b/Docker/test/prod/server.Dockerfile new file mode 100644 index 000000000..5d4ea7364 --- /dev/null +++ b/Docker/test/prod/server.Dockerfile @@ -0,0 +1,13 @@ +FROM node:20-alpine + +WORKDIR /app + +COPY ./Server/package*.json ./ + +RUN npm install + +COPY ./Server/ ./ + +EXPOSE 5000 + +CMD ["node", "index.js"] \ No newline at end of file diff --git a/Docker/test/redis.Dockerfile b/Docker/test/redis.Dockerfile new file mode 100644 index 000000000..af68ec61e --- /dev/null +++ b/Docker/test/redis.Dockerfile @@ -0,0 +1,2 @@ +FROM redis +EXPOSE 6379 \ No newline at end of file diff --git a/Docker/test/server.Dockerfile b/Docker/test/server.Dockerfile new file mode 100644 index 000000000..5d4ea7364 --- /dev/null +++ b/Docker/test/server.Dockerfile @@ -0,0 +1,13 @@ +FROM node:20-alpine + +WORKDIR /app + +COPY ./Server/package*.json ./ + +RUN npm install + +COPY ./Server/ ./ + +EXPOSE 5000 + +CMD ["node", "index.js"] \ No newline at end of file