Skip to content

Commit b2dcf1e

Browse files
Merge pull request #173 from PeerPrep/deploy-local
Deploy Locally
2 parents fe07524 + a56352a commit b2dcf1e

File tree

13 files changed

+342
-6
lines changed

13 files changed

+342
-6
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
firebase-auth/*.json
2+
mongodb-data
3+
postgres-data
4+
.env

README.md

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,75 @@
1-
[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-24ddc0f5d75046c5622901739e7c5dd533143b0c8e959d652212380cedb1ea36.svg)](https://classroom.github.com/a/6BOvYMwN)
2-
# AssignmentTemplate
1+
# Testing
2+
3+
We recommend using our production environment for testing. You can find the production environment at [https://peerprep.sivarn.com](https://peerprep.sivarn.com).
4+
5+
# Testing Locally
6+
7+
## DISCLAIMER: Our executor service can only run on x86_64 architecture. If you are using a different architecture, you will not be able to run the executor locally. However, you can still test the rest of the application.
8+
9+
1. Install Docker for your operating system. You can find the installation instructions [here](https://docs.docker.com/get-docker/).
10+
2. Clone the repository.
11+
3. In the frontend folder, add .env file with the following content:
12+
13+
```
14+
NEXT_PUBLIC_FIREBASE_API_KEY=AIzaSyAMiTV5yv2D-gvCy2TNEFREZIMUJ3SnYD8
15+
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=peerprep-test.firebaseapp.com
16+
NEXT_PUBLIC_FIREBASE_PROJECT_ID=peerprep-test
17+
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=peerprep-test.appspot.com
18+
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=655590321803
19+
NEXT_PUBLIC_FIREBASE_APP_ID=1:655590321803:web:293756d86132bdafddae8e
20+
NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID=G-XXSP3K70CN
21+
NEXT_PUBLIC_PEERPREP_INNKEEPER_SOCKET_URL=localhost
22+
```
23+
24+
Note that usually these values are kept secret, but since this is a test environment, we are not concerned about security.
25+
26+
4. In the root folder, add .env file with the following content:
27+
28+
```
29+
POSTGRES_USER=peerprep
30+
POSTGRES_PASSWORD=somepassword
31+
GOOGLE_APPLICATION_CREDENTIALS=/firebase-auth/service-account.json
32+
MONGODB_URL=mongodb://peerprep-mongo:27017/questions
33+
BUCKET_NAME=peerprep-test.appspot.com
34+
USERS_SERVICE_URL=http://peerprep-users-service:6969
35+
POSTGRES_URL=postgres://peerprep:somepassword@peerprep-postgres/peerprep
36+
INITIALIZATION_VECTOR=vector
37+
ENCRYPTION_KEY=key
38+
```
39+
40+
5. In the firebase-auth folder, add service-account.json (file name has to be exact match) file with the following content:
41+
42+
```
43+
{
44+
"type": "service_account",
45+
"project_id": "peerprep-test",
46+
"private_key_id": "3a7f69677fabe63fb16358b58a9bab77a79b6e22",
47+
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEuwIBADANBgkqhkiG9w0BAQEFAASCBKUwggShAgEAAoIBAQDI/7aXOEK+k/iZ\nGfo4K2WKeV2u8QSuE9RfN9oVff5fgTUHdYNK9KXF+JRAfxqf2ZJkh3hdS4ipvSxp\n1HGZQ+l9Qu4XTpQRABv+9zhhI0NQr/xk/zZzR92lVlDP/UeXqkthnhd4dKo+MId1\nl2JAeOWQaCEyDtGi0pIFnwW9k4K8Myo/hjWwE+wV4SdgY2kjBUprYsv9iAllUELn\nsr8hxXmko6YMtnF0H4GI1cD/z8GLwRsD6Y/ZUBRK8oDQFVdKHe2U5DvPqCfZ1bxb\nDfX+Jx/7+pKeWbAqFJB9s6YSJ1imQzQYuYLip2fLE2BSpUXMvlI8CxTuoxAuXHSM\nEMbMbVMnAgMBAAECggEAPuR4oy+Y/t35IxrURyAZGS+ppzRGNRwCTzsAM8plPkgF\nKkzUZK9RcbU62kWLNKpVGryi5npcjFQjoge19fGgjS/UpRlSzlD88ZY0n3xzszsl\n3ApZZM//ZB0ykyoa7TN9e9GGYYwLuwLfV+Wi+i56EmnqvSmS4gJGa5jbKHsQJMfF\nGArs6w/M0AJKDBvT0+KWHUypPYGQao1/1tBWZmXGGfOIeWJ4V+FsWHzISV6bDQ5d\njcPDJwwWD8HVLd8Y8UuJvU2WP4ydpQ6iAVW+3Cy/kEHcaaMUN3IrhisSzd/DURR0\nppVgOJUmrfXTFHHI6OlRlDJ0D7h2GNGD2SSN96JHdQKBgQD57A9o1o5XZRIkEufa\nsY1+dihZpA8L1I3eqhkEH/FDhViO6iQEOIMK8MvSvzIsmKCLc7Wyy5Ai5WAHAAIj\nkKI2/ErKjv7GA5k+B+AhFL+O6acpFwiDIvGIhq4CKFZ/70AMWMXt37nqMSCsiRw4\nNXCXXeSiujNBQvL5a/jc+LbY1QKBgQDN4xJePjOIRYifPVrmQ7Ju75ttTDYCZsiQ\n8P29/nzDF+BRJGuXxGZMnKGZiP3zrm379xP5e1etL940IbQT1GR2MAsIQwEKlC/i\nTV1a8g+NdrQA/Sb4Ru5DI/AMwNr/8OvmtvgSjK0SGgBFkGLRH4F7WyNXNNLOtclJ\nQbUXAor6CwJ/Q1xcyuUJeITFXvO5ijhQ6sTuGzsc0xN3KYyvMW1qmchXFi4Fhx20\nND6ysRrXay24F94YGxjCwKUSPNDDwtI45pkZj377LGPL6ew1fLUa7GoNpAWRRccl\nUqb6P5qftdvGZ42Fy5eBhJ25MMfD02KT9jhYZ4PITM6+rntrmCNxJQKBgEsnr4XN\naNw+nZ+bMvpJDfJm7rKYFkMMJ/yYq9dV9U72AUE9bTUKUVl395lnI2R3cNiAGb+B\nIcErbw5Smzx91Go8IVrTsqac71nJaeGP6NN32D9gKYCJy+GgVbkiEQ9Kb6JZefaz\neV3ZNe4uxZOWz5oq65yiwK0KOL7QCH2sxPR/AoGBAN+QhUp2XEZjLwlx8pSjwRGn\nUJfhU3eeqhGMF+DOf7BaYUYTEvQVA45gGQQJdiN+ncnrtO35/vLZ43jvOKeu+ens\nc+Tq3i1Sga73ifMazmJShml/NQGch8J0SFA88VnmYXsj8y27gmOJuLT9h+DIlK9L\nTk7APwYR9tLFOY1wVT71\n-----END PRIVATE KEY-----\n",
48+
"client_email": "[email protected]",
49+
"client_id": "113117889579042558853",
50+
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
51+
"token_uri": "https://oauth2.googleapis.com/token",
52+
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
53+
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-737ke%40peerprep-test.iam.gserviceaccount.com",
54+
"universe_domain": "googleapis.com"
55+
}
56+
```
57+
58+
Note that usually these values are kept secret, but since this is a test environment, we are not concerned about security.
59+
60+
6. In the root folder, run `docker compose -f docker-compose.yml up -d`.
61+
62+
7. Application should be running at [http://localhost](http://localhost).
63+
64+
# Giving yourself admin privileges
65+
66+
1. Login to the application in your browser using Google/Github.
67+
2. Run the following commands in your terminal:
68+
69+
```
70+
docker exec -it peerprep-postgres bash
71+
psql -U peerprep
72+
UPDATE profiles SET role='admin';
73+
```
74+
75+
This will give every user admin privileges. Note that this is only for testing purposes.

deployment/Dockerfile-executor

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
# To build a Docker image from this file, run from the root directory:
2+
23
# docker build -f deployment/Dockerfile-executor -t peerprep-executor .
34

45
FROM nixos/nix:2.3.12
56

67
# Environment variables
8+
79
ENV APP_ROOT /executor
810

911
WORKDIR $APP_ROOT
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# To build a Docker image from this file, run from the root directory:
2+
3+
# docker build -f deployment/Dockerfile-executor -t peerprep-executor .
4+
5+
FROM nixos/nix:2.3.12
6+
7+
# Environment variables
8+
9+
ENV APP_ROOT /executor
10+
11+
WORKDIR $APP_ROOT
12+
COPY executor .
13+
14+
RUN echo "filter-syscalls = false" >> /etc/nix/nix.conf
15+
RUN nix-channel --update
16+
RUN nix-env -iA nixpkgs.shadow nixpkgs.gcc12 nixpkgs.python3Minimal nixpkgs.jdk19_headless
17+
RUN nix-env -if default.nix
18+
19+
RUN groupadd -g 1300 -r peerprep
20+
RUN useradd -g 1300 -u 1500 -r executor
21+
22+
EXPOSE 9000
23+
24+
CMD ["executor"]

deployment/Dockerfile-frontend

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,33 @@
11
# To build a Docker image from this file, run from the root directory:
2+
23
# docker build -f deployment/Dockerfile-frontend -t peerprep-frontend .
34

45
# Intermediate image for building the Next app
6+
57
FROM node:18.17.1
68

79
# Environment variables
10+
811
ENV APP_ROOT /frontend
912

1013
# Copy source code into container
14+
1115
RUN mkdir --parents $APP_ROOT
1216
WORKDIR $APP_ROOT
1317
COPY frontend .
1418

1519
# Install dependencies
20+
1621
RUN yarn install --frozen-lockfile
1722

1823
# Build app
24+
1925
RUN yarn build
2026

2127
# Expose port
28+
2229
EXPOSE 3000
2330

2431
# Final image for running the Next app
32+
2533
CMD ["yarn", "start"]

deployment/Dockerfile-innkeeper

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,33 @@
11
# To build a Docker image from this file, run from the root directory:
2+
23
# docker build -f deployment/Dockerfile-innkeeper -t peerprep-innkeeper-service .
34

45
# Intermediate image for building the Next app
6+
57
FROM node:18.17.1
68

79
# Environment variables
10+
811
ENV APP_ROOT /innkeeper
912

1013
# Copy source code into container
14+
1115
RUN mkdir --parents $APP_ROOT
1216
WORKDIR $APP_ROOT
1317
COPY innkeeper .
1418

1519
# Install dependencies
20+
1621
RUN yarn install --frozen-lockfile
1722

1823
# Build app
24+
1925
RUN yarn build
2026

2127
# Expose port
28+
2229
EXPOSE 4100
2330

2431
# Final image for running the Socket.IO app
32+
2533
CMD ["yarn", "start"]

deployment/Dockerfile-nginx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ RUN rm -f /etc/nginx/conf.d/* /etc/nginx/sites-enabled/*
66

77
# Copy NGINX config
88
COPY deployment/nginx/nginx.conf /etc/nginx
9-
COPY deployment/nginx/sites-enabled/* /etc/nginx/sites-enabled/
9+
COPY deployment/nginx/sites-enabled/peerprep.sivarn.com /etc/nginx/sites-enabled/peerprep.sivarn.com
1010

1111
# Expose ports
1212
EXPOSE 80

deployment/Dockerfile-nginx-local

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Use nginx to serve the app
2+
FROM nginx:stable
3+
4+
# Delete NGINX defaults
5+
RUN rm -f /etc/nginx/conf.d/* /etc/nginx/sites-enabled/*
6+
7+
# Copy NGINX config
8+
COPY deployment/nginx/nginx.conf /etc/nginx
9+
COPY deployment/nginx/sites-enabled/localhost /etc/nginx/sites-enabled/locahost
10+
11+
# Expose ports
12+
EXPOSE 80
13+
EXPOSE 443
14+
15+
# Add a script containing the main command to be executed
16+
COPY deployment/scripts/cmd-nginx.sh /usr/bin/
17+
CMD ["cmd-nginx.sh"]

deployment/Dockerfile-questions

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,33 @@
11
# To build a Docker image from this file, run from the root directory:
2+
23
# docker build -f deployment/Dockerfile-questions -t peerprep-questions-service .
34

45
# Intermediate image for building the Next app
6+
57
FROM node:18.17.1
68

79
# Environment variables
10+
811
ENV APP_ROOT /questions
912

1013
# Copy source code into container
14+
1115
RUN mkdir --parents $APP_ROOT
1216
WORKDIR $APP_ROOT
1317
COPY questions .
1418

1519
# Install dependencies
20+
1621
RUN yarn install --frozen-lockfile
1722

1823
# Build app
24+
1925
RUN yarn build
2026

2127
# Expose port
28+
2229
EXPOSE 4000
2330

2431
# Final image for running the Express app
32+
2533
CMD ["yarn", "start"]
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# When searching for a virtual server by name, if name matches more than one of the specified variants, e.g.
2+
# both wildcard name and regular expression match, the first matching variant will be chosen, in the following
3+
# order of precedence:
4+
#
5+
# 1. exact name
6+
# 2. longest wildcard name starting with an asterisk, e.g. “*.example.org”
7+
# 3. longest wildcard name ending with an asterisk, e.g. “mail.*”
8+
# 4. first matching regular expression (in order of appearance in a configuration file)
9+
10+
server {
11+
listen 80;
12+
server_name localhost;
13+
14+
location / {
15+
proxy_pass http://peerprep-frontend:3000/;
16+
proxy_set_header Host $host;
17+
proxy_set_header X-Real-IP $remote_addr;
18+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
19+
proxy_set_header X-Forwarded-Proto $scheme;
20+
}
21+
22+
location /api/v1/questions/ {
23+
proxy_pass http://peerprep-questions-service:4000/api/v1/questions/;
24+
proxy_set_header Host $host;
25+
proxy_set_header X-Real-IP $remote_addr;
26+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
27+
proxy_set_header X-Forwarded-Proto $scheme;
28+
}
29+
30+
location /api/v1/users/ {
31+
proxy_pass http://peerprep-users-service:6969/api/v1/users/;
32+
proxy_set_header Host $host;
33+
proxy_set_header X-Real-IP $remote_addr;
34+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
35+
proxy_set_header X-Forwarded-Proto $scheme;
36+
}
37+
38+
location /api/v1/innkeeper/ {
39+
proxy_pass http://peerprep-innkeeper-service:4100/api/v1/innkeeper/;
40+
proxy_set_header Host $host;
41+
proxy_http_version 1.1;
42+
proxy_set_header Upgrade $http_upgrade;
43+
proxy_set_header Connection "upgrade";
44+
proxy_set_header X-Real-IP $remote_addr;
45+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
46+
proxy_set_header X-Forwarded-Proto $scheme;
47+
}
48+
49+
location /api/v1/execute/ {
50+
include /etc/nginx/fastcgi_params;
51+
fastcgi_pass peerprep-executor-service:9000;
52+
}
53+
}
54+
55+
# Catch-all for unrecognised requests
56+
server {
57+
listen 80 default_server;
58+
server_name _;
59+
return 444;
60+
}

0 commit comments

Comments
 (0)