Skip to content

Commit 2942f67

Browse files
authored
Merge branch 'main' into lobby-chat-panel
2 parents 3fb86d7 + 581fec5 commit 2942f67

File tree

239 files changed

+9110
-5794
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

239 files changed

+9110
-5794
lines changed

.dockerignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ LICENSE
99
.vscode
1010
Makefile
1111
helm-charts
12-
.env
12+
.env*
1313
.editorconfig
1414
.idea
1515
coverage*
16+
tests/

.github/workflows/deploy.yml

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,12 @@ jobs:
8484
token: ${{ steps.generate-token.outputs.token }}
8585
environment-url: https://${{ env.FQDN }}
8686
environment: ${{ inputs.target_domain == 'openfront.io' && 'prod' || 'staging' }}
87-
- name: 🔗 Log in to Docker Hub
87+
- name: 🔗 Log in to GHCR
8888
uses: docker/login-action@v3
8989
with:
90-
username: ${{ vars.DOCKERHUB_USERNAME }}
91-
password: ${{ secrets.DOCKERHUB_TOKEN }}
90+
registry: ghcr.io
91+
username: ${{ vars.GHCR_USERNAME }}
92+
password: ${{ secrets.GHCR_TOKEN }}
9293
- name: 🔑 Create SSH private key
9394
env:
9495
SERVER_HOST_MASTERS: ${{ secrets.SERVER_HOST_MASTERS }}
@@ -105,21 +106,14 @@ jobs:
105106
chmod 600 ~/.ssh/id_rsa
106107
- name: 🚢 Deploy
107108
env:
108-
ADMIN_TOKEN: ${{ secrets.ADMIN_TOKEN }}
109109
CF_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }}
110110
CF_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
111-
DOCKER_REPO: ${{ vars.DOCKERHUB_REPO }}
112-
DOCKER_USERNAME: ${{ vars.DOCKERHUB_USERNAME }}
111+
GHCR_REPO: ${{ vars.GHCR_REPO }}
112+
GHCR_USERNAME: ${{ vars.GHCR_USERNAME }}
113113
ENV: ${{ inputs.target_domain == 'openfront.io' && 'prod' || 'staging' }}
114114
HOST: ${{ github.event_name == 'workflow_dispatch' && inputs.target_host || 'staging' }}
115-
OTEL_ENDPOINT: ${{ secrets.OTEL_ENDPOINT }}
116-
OTEL_PASSWORD: ${{ secrets.OTEL_PASSWORD }}
117-
OTEL_USERNAME: ${{ secrets.OTEL_USERNAME }}
118115
OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }}
119116
OTEL_AUTH_HEADER: ${{ secrets.OTEL_AUTH_HEADER }}
120-
R2_ACCESS_KEY: ${{ secrets.R2_ACCESS_KEY }}
121-
R2_BUCKET: ${{ secrets.R2_BUCKET }}
122-
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }}
123117
TURNSTILE_SECRET_KEY: ${{ secrets.TURNSTILE_SECRET_KEY }}
124118
API_KEY: ${{ secrets.API_KEY }}
125119
SERVER_HOST_MASTERS: ${{ secrets.SERVER_HOST_MASTERS }}

.github/workflows/release.yml

Lines changed: 13 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@ jobs:
1919
- name: 🔗 Log in to Docker Hub
2020
uses: docker/login-action@v3
2121
with:
22-
username: ${{ vars.DOCKERHUB_USERNAME }}
23-
password: ${{ secrets.DOCKERHUB_TOKEN }}
22+
registry: ghcr.io
23+
username: ${{ vars.GHCR_USERNAME }}
24+
password: ${{ secrets.GHCR_TOKEN }}
2425
- id: build
2526
env:
26-
DOCKER_REPO: openfront-prod
27-
DOCKER_USERNAME: ${{ vars.DOCKERHUB_USERNAME }}
27+
GHCR_REPO: openfront-prod
28+
GHCR_USERNAME: ${{ vars.GHCR_USERNAME }}
2829
RELEASE_BODY: ${{ github.event.release.body }}
2930
RELEASE_NAME: ${{ github.event.release.name }}
3031
RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}
@@ -63,21 +64,14 @@ jobs:
6364
chmod 600 ~/.ssh/id_rsa
6465
- name: 🚀 Deploy image
6566
env:
66-
ADMIN_TOKEN: ${{ secrets.ADMIN_TOKEN }}
6767
CF_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }}
6868
CF_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
69-
DOCKER_REPO: openfront-prod
70-
DOCKER_USERNAME: ${{ vars.DOCKERHUB_USERNAME }}
69+
GHCR_REPO: openfront-prod
70+
GHCR_USERNAME: ${{ vars.GHCR_USERNAME }}
7171
DOMAIN: ${{ vars.DOMAIN }}
7272
IMAGE_ID: ${{ needs.build.outputs.IMAGE_ID }}
73-
OTEL_ENDPOINT: ${{ secrets.OTEL_ENDPOINT }}
74-
OTEL_PASSWORD: ${{ secrets.OTEL_PASSWORD }}
75-
OTEL_USERNAME: ${{ secrets.OTEL_USERNAME }}
7673
OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }}
7774
OTEL_AUTH_HEADER: ${{ secrets.OTEL_AUTH_HEADER }}
78-
R2_ACCESS_KEY: ${{ secrets.R2_ACCESS_KEY }}
79-
R2_BUCKET: ${{ secrets.R2_BUCKET }}
80-
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }}
8175
TURNSTILE_SECRET_KEY: ${{ secrets.TURNSTILE_SECRET_KEY }}
8276
API_KEY: ${{ secrets.API_KEY }}
8377
SERVER_HOST_STAGING: ${{ secrets.SERVER_HOST_STAGING }}
@@ -121,21 +115,14 @@ jobs:
121115
chmod 600 ~/.ssh/id_rsa
122116
- name: 🚀 Deploy image
123117
env:
124-
ADMIN_TOKEN: ${{ secrets.ADMIN_TOKEN }}
125118
CF_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }}
126119
CF_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
127-
DOCKER_REPO: ${{ vars.DOCKERHUB_REPO }}
128-
DOCKER_USERNAME: ${{ vars.DOCKERHUB_USERNAME }}
120+
GHCR_REPO: ${{ vars.GHCR_REPO }}
121+
GHCR_USERNAME: ${{ vars.GHCR_USERNAME }}
129122
DOMAIN: ${{ vars.DOMAIN }}
130123
IMAGE_ID: ${{ needs.build.outputs.IMAGE_ID }}
131-
OTEL_ENDPOINT: ${{ secrets.OTEL_ENDPOINT }}
132-
OTEL_PASSWORD: ${{ secrets.OTEL_PASSWORD }}
133-
OTEL_USERNAME: ${{ secrets.OTEL_USERNAME }}
134124
OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }}
135125
OTEL_AUTH_HEADER: ${{ secrets.OTEL_AUTH_HEADER }}
136-
R2_ACCESS_KEY: ${{ secrets.R2_ACCESS_KEY }}
137-
R2_BUCKET: ${{ secrets.R2_BUCKET }}
138-
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }}
139126
TURNSTILE_SECRET_KEY: ${{ secrets.TURNSTILE_SECRET_KEY }}
140127
API_KEY: ${{ secrets.API_KEY }}
141128
SERVER_HOST_FALK1: ${{ secrets.SERVER_HOST_FALK1 }}
@@ -179,21 +166,14 @@ jobs:
179166
chmod 600 ~/.ssh/id_rsa
180167
- name: 🚀 Deploy image
181168
env:
182-
ADMIN_TOKEN: ${{ secrets.ADMIN_TOKEN }}
183169
CF_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }}
184170
CF_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
185-
DOCKER_REPO: ${{ vars.DOCKERHUB_REPO }}
186-
DOCKER_USERNAME: ${{ vars.DOCKERHUB_USERNAME }}
171+
GHCR_REPO: ${{ vars.GHCR_REPO }}
172+
GHCR_USERNAME: ${{ vars.GHCR_USERNAME }}
187173
DOMAIN: ${{ vars.DOMAIN }}
188174
IMAGE_ID: ${{ needs.build.outputs.IMAGE_ID }}
189-
OTEL_ENDPOINT: ${{ secrets.OTEL_ENDPOINT }}
190-
OTEL_PASSWORD: ${{ secrets.OTEL_PASSWORD }}
191-
OTEL_USERNAME: ${{ secrets.OTEL_USERNAME }}
192175
OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }}
193176
OTEL_AUTH_HEADER: ${{ secrets.OTEL_AUTH_HEADER }}
194-
R2_ACCESS_KEY: ${{ secrets.R2_ACCESS_KEY }}
195-
R2_BUCKET: ${{ secrets.R2_BUCKET }}
196-
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }}
197177
TURNSTILE_SECRET_KEY: ${{ secrets.TURNSTILE_SECRET_KEY }}
198178
API_KEY: ${{ secrets.API_KEY }}
199179
SERVER_HOST_FALK1: ${{ secrets.SERVER_HOST_FALK1 }}
@@ -237,21 +217,14 @@ jobs:
237217
chmod 600 ~/.ssh/id_rsa
238218
- name: 🚀 Deploy image
239219
env:
240-
ADMIN_TOKEN: ${{ secrets.ADMIN_TOKEN }}
241220
CF_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }}
242221
CF_API_TOKEN: ${{ secrets.CF_API_TOKEN }}
243-
DOCKER_REPO: ${{ vars.DOCKERHUB_REPO }}
244-
DOCKER_USERNAME: ${{ vars.DOCKERHUB_USERNAME }}
222+
GHCR_REPO: ${{ vars.GHCR_REPO }}
223+
GHCR_USERNAME: ${{ vars.GHCR_USERNAME }}
245224
DOMAIN: ${{ vars.DOMAIN }}
246225
IMAGE_ID: ${{ needs.build.outputs.IMAGE_ID }}
247-
OTEL_ENDPOINT: ${{ secrets.OTEL_ENDPOINT }}
248-
OTEL_PASSWORD: ${{ secrets.OTEL_PASSWORD }}
249-
OTEL_USERNAME: ${{ secrets.OTEL_USERNAME }}
250226
OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }}
251227
OTEL_AUTH_HEADER: ${{ secrets.OTEL_AUTH_HEADER }}
252-
R2_ACCESS_KEY: ${{ secrets.R2_ACCESS_KEY }}
253-
R2_BUCKET: ${{ secrets.R2_BUCKET }}
254-
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }}
255228
TURNSTILE_SECRET_KEY: ${{ secrets.TURNSTILE_SECRET_KEY }}
256229
API_KEY: ${{ secrets.API_KEY }}
257230
SERVER_HOST_FALK1: ${{ secrets.SERVER_HOST_FALK1 }}

CREDITS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,4 @@ Copyright © opentopography.org. All Rights Reserved. [Terms of Use](https://ope
4949
### [The Noun Project](https://thenounproject.com/)
5050

5151
Stats icon by [Meko](https://thenounproject.com/mekoda/)https://thenounproject.com/icon/stats-4942475/
52+
Pay Per Click icon by [Fauzan Adiima](https://thenounproject.com/creator/fauzan94/)https://thenounproject.com/icon/pay-per-click-2586454/

Dockerfile

Lines changed: 58 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,98 +1,96 @@
11
# Use an official Node runtime as the base image
22
FROM node:24-slim AS base
3-
# Set the working directory in the container
43
WORKDIR /usr/src/app
54

6-
# Create dependency layer
7-
FROM base AS dependencies
8-
RUN apt-get update && apt-get install -y \
9-
nginx \
10-
git \
11-
curl \
12-
jq \
13-
wget \
14-
apache2-utils \
15-
&& rm -rf /var/lib/apt/lists/*
16-
17-
# Update worker_connections in the existing nginx.conf
18-
RUN sed -i 's/worker_connections [0-9]*/worker_connections 8192/' /etc/nginx/nginx.conf
5+
# Build stage - install ALL dependencies and build
6+
FROM base AS build
7+
ENV HUSKY=0
8+
# Copy package files first for better caching
9+
COPY package*.json ./
10+
RUN --mount=type=cache,target=/root/.npm \
11+
npm ci
12+
13+
# Copy only what's needed for build
14+
COPY tsconfig.json ./
15+
COPY tsconfig.jest.json ./
16+
COPY webpack.config.js ./
17+
COPY tailwind.config.js ./
18+
COPY postcss.config.js ./
19+
COPY eslint.config.js ./
20+
COPY resources ./resources
21+
COPY proprietary ./proprietary
22+
COPY src ./src
1923

20-
FROM dependencies AS build
2124
ARG GIT_COMMIT=unknown
2225
ENV GIT_COMMIT="$GIT_COMMIT"
23-
# Disable Husky hooks
24-
ENV HUSKY=0
25-
# Copy package.json and package-lock.json
26-
COPY package*.json ./
27-
# Install dependencies
28-
RUN npm ci
29-
# Copy the rest of the application code
30-
COPY . .
31-
# Build the client-side application
3226
RUN npm run build-prod
33-
# So we can see which commit was used to build the container
34-
# https://openfront.io/commit.txt
35-
RUN echo "$GIT_COMMIT" > static/commit.txt
36-
37-
# Remove maps data from final image
38-
FROM base AS prod-files
39-
COPY . .
40-
RUN rm -rf resources/maps
4127

42-
FROM dependencies AS npm-dependencies
43-
# Disable Husky hooks
28+
# Production dependencies stage - separate from build
29+
FROM base AS prod-deps
4430
ENV HUSKY=0
4531
ENV NPM_CONFIG_IGNORE_SCRIPTS=1
46-
# Copy package.json and package-lock.json
4732
COPY package*.json ./
48-
# Install dependencies
49-
RUN npm ci --omit=dev
33+
RUN --mount=type=cache,target=/root/.npm \
34+
npm ci --omit=dev
5035

51-
# Final image
36+
# Final production image
5237
FROM base
53-
ARG GIT_COMMIT=unknown
54-
ENV GIT_COMMIT="$GIT_COMMIT"
38+
39+
# Install system dependencies
5540
RUN apt-get update && apt-get install -y \
5641
nginx \
57-
supervisor \
5842
curl \
43+
jq \
44+
wget \
45+
supervisor \
46+
apache2-utils \
5947
&& rm -rf /var/lib/apt/lists/*
6048

61-
# Copy installed packages from dependencies stage
6249
RUN curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb > cloudflared.deb \
6350
&& dpkg -i cloudflared.deb \
6451
&& rm cloudflared.deb
6552

66-
# Copy Nginx configuration and ensure it's used instead of the default
67-
COPY nginx.conf /etc/nginx/conf.d/default.conf
68-
RUN rm -f /etc/nginx/sites-enabled/default
69-
COPY --from=dependencies /etc/nginx/nginx.conf /etc/nginx/nginx.conf
70-
71-
# Copy npm dependencies
72-
COPY --from=npm-dependencies /usr/src/app/node_modules node_modules
73-
COPY package.json .
74-
75-
# Copy the rest of the application code
76-
COPY --from=prod-files /usr/src/app/ /usr/src/app/
53+
# Update worker_connections in nginx.conf
54+
RUN sed -i 's/worker_connections [0-9]*/worker_connections 8192/' /etc/nginx/nginx.conf
7755

78-
# Copy frontend
79-
COPY --from=build /usr/src/app/static static
56+
# Create cloudflared directory with proper permissions
57+
RUN mkdir -p /etc/cloudflared && \
58+
chown -R node:node /etc/cloudflared && \
59+
chmod -R 755 /etc/cloudflared
8060

8161
# Setup supervisor configuration
8262
RUN mkdir -p /var/log/supervisor
8363
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
8464

65+
# Copy Nginx configuration
66+
COPY nginx.conf /etc/nginx/conf.d/default.conf
67+
RUN rm -f /etc/nginx/sites-enabled/default
68+
8569
# Copy and make executable the startup script
8670
COPY startup.sh /usr/local/bin/
8771
RUN chmod +x /usr/local/bin/startup.sh
8872

89-
RUN mkdir -p /etc/cloudflared && \
90-
chown -R node:node /etc/cloudflared && \
91-
chmod -R 755 /etc/cloudflared
73+
# Copy production node_modules from prod-deps stage (cached separately from build)
74+
COPY --from=prod-deps /usr/src/app/node_modules ./node_modules
75+
COPY package*.json ./
76+
77+
# Copy built artifacts from build stage
78+
COPY --from=build /usr/src/app/static ./static
79+
80+
COPY resources ./resources
81+
82+
# Remove maps because they are not used by the server.
83+
RUN rm -rf ./resources/maps
84+
COPY tsconfig.json ./
85+
COPY src ./src
9286

93-
# Set Cloudflared config directory to a volume mount location
87+
88+
ARG GIT_COMMIT=unknown
89+
RUN echo "$GIT_COMMIT" > static/commit.txt
90+
91+
ENV GIT_COMMIT="$GIT_COMMIT"
9492
ENV CF_CONFIG_PATH=/etc/cloudflared/config.yml
9593
ENV CF_CREDS_PATH=/etc/cloudflared/creds.json
9694

9795
# Use the startup script as the entrypoint
98-
ENTRYPOINT ["/usr/local/bin/startup.sh"]
96+
ENTRYPOINT ["/usr/local/bin/startup.sh"]

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,11 @@ For license history, see [LICENSING.md](LICENSING.md).
5757
2. **Install dependencies**
5858

5959
```bash
60-
npm i
60+
npm run inst
6161
```
6262

63+
Do NOT use `npm install` nor `npm i` but instead use our `npm run inst`. It runs the safer `npm ci --ignore-scripts` to install dependencies exactly according to the versions in `package-lock.json` and doesn't run scripts. This can prevent being hit by a supply chain attack.
64+
6365
## 🎮 Running the Game
6466

6567
### Development Mode

0 commit comments

Comments
 (0)