Skip to content

Commit 17c4ebb

Browse files
committed
feature(alpha-deployment): Docker setup and alpha deployment
1 parent 2f58bf5 commit 17c4ebb

File tree

13 files changed

+2367
-1767
lines changed

13 files changed

+2367
-1767
lines changed

.dockerignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
node_modules
2+
dist
3+
.git
4+
.vscode
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
name: Publish web app serve
2+
3+
on:
4+
workflow_dispatch:
5+
push:
6+
branches:
7+
- develop
8+
- feature/alpha-deployment
9+
10+
permissions:
11+
packages: write
12+
13+
jobs:
14+
publish_image:
15+
name: Publish Docker Image
16+
runs-on: ubuntu-latest
17+
steps:
18+
- uses: actions/checkout@v4
19+
20+
- name: Publish web-app-serve
21+
uses: toggle-corp/[email protected]
22+
with:
23+
github_token: ${{ secrets.GITHUB_TOKEN }}

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ logs
44
npm-debug.log*
55
yarn-debug.log*
66
yarn-error.log*
7-
pnpm-debug.log*
7+
yarn-debug.log*
88
lerna-debug.log*
99

1010
node_modules

Dockerfile

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# -------------------------- Dev ---------------------------------------
2+
3+
FROM node:22-bullseye AS dev
4+
5+
RUN apt-get update -y \
6+
&& apt-get install -y --no-install-recommends git \
7+
&& rm -rf /var/lib/apt/lists/* \
8+
# NOTE: yarn > 1.22.19 breaks yarn-install invoked by yarn
9+
&& npm install -g [email protected] [email protected] --force \
10+
&& git config --global --add safe.directory /code
11+
12+
WORKDIR /code
13+
14+
# Build stage for web app
15+
FROM dev AS web-app-serve-build
16+
17+
COPY ./package.json /code/
18+
19+
RUN yarn install
20+
21+
COPY . /code/
22+
23+
# NOTE: These are set directly in `vite.config.ts`
24+
# We're using raw web-app-serve placeholder values here to treat them as dynamic values
25+
# NOTE: Static env variables:
26+
# These env variables are use during build
27+
ENV VITE_FIREBASE_API_KEY=WEB_APP_SERVE_PLACEHOLDER_VITE_FIREBASE_API_KEY
28+
ENV VITE_FIREBASE_AUTH_DOMAIN=WEB_APP_SERVE_PLACEHOLDER_VITE_FIREBASE_AUTH_DOMAIN
29+
ENV VITE_FIREBASE_DATABASE_URL=WEB_APP_SERVE_PLACEHOLDER_VITE_FIREBASE_DATABASE_URL
30+
ENV VITE_FIREBASE_PROJECT_ID=WEB_APP_SERVE_PLACEHOLDER_VITE_FIREBASE_PROJECT_ID
31+
ENV VITE_FIREBASE_STORAGE_BUCKET=WEB_APP_SERVE_PLACEHOLDER_VITE_FIREBASE_STORAGE_BUCKET
32+
ENV VITE_FIREBASE_MESSAGING_SENDER_ID=WEB_APP_SERVE_PLACEHOLDER_VITE_FIREBASE_MESSAGING_SENDER_ID
33+
ENV VITE_FIREBASE_APP_ID=WEB_APP_SERVE_PLACEHOLDER_VITE_FIREBASE_APP_ID
34+
ENV VITE_FIREBASE_MEASUREMENT_ID=WEB_APP_SERVE_PLACEHOLDER_VITE_FIREBASE_MEASUREMENT_ID
35+
36+
ENV VITE_COMMUNITY_DASHBOARD_URL=WEB_APP_SERVE_PLACEHOLDER_VITE_COMMUNITY_DASHBOARD_URL
37+
ENV VITE_BASE_URL=WEB_APP_SERVE_PLACEHOLDER_VITE_BASE_URL
38+
ENV VITE_PRIVACY_POLICY_URL=WEB_APP_SERVE_PLACEHOLDER_VITE_PRIVACY_POLICY_URL
39+
ENV VITE_IMPRINT_URL=WEB_APP_SERVE_PLACEHOLDER_VITE_IMPRINT_URL
40+
ENV VITE_APP_LOGO=WEB_APP_SERVE_PLACEHOLDER_VITE_APP_LOGO
41+
ENV VITE_PROJECTS_FALLBACK_IMAGE=WEB_APP_SERVE_PLACEHOLDER_VITE_PROJECTS_FALLBACK_IMAGE
42+
ENV VITE_ALLOW_UNVERIFIED_USERS=WEB_APP_SERVE_PLACEHOLDER_VITE_ALLOW_UNVERIFIED_USERS
43+
44+
# Locales
45+
ENV VITE_DEFAULT_LOCALE=WEB_APP_SERVE_PLACEHOLDER_VITE_DEFAULT_LOCALE
46+
ENV VITE_FALLBACK_LOCALE=WEB_APP_SERVE_PLACEHOLDER_VITE_FALLBACK_LOCALE
47+
ENV VITE_SUPPORTED_LOCALES=WEB_APP_SERVE_PLACEHOLDER_VITE_SUPPORTED_LOCALES
48+
49+
# Theme
50+
ENV VITE_THEME_LIGHT_PRIMARY=WEB_APP_SERVE_PLACEHOLDER_VITE_THEME_LIGHT_PRIMARY
51+
ENV VITE_THEME_LIGHT_SECONDARY=WEB_APP_SERVE_PLACEHOLDER_VITE_THEME_LIGHT_SECONDARY
52+
ENV VITE_THEME_LIGHT_TERTIARY=WEB_APP_SERVE_PLACEHOLDER_VITE_THEME_LIGHT_TERTIARY
53+
ENV VITE_THEME_LIGHT_ACCENT=WEB_APP_SERVE_PLACEHOLDER_VITE_THEME_LIGHT_ACCENT
54+
ENV VITE_THEME_LIGHT_ERROR=WEB_APP_SERVE_PLACEHOLDER_VITE_THEME_LIGHT_ERROR
55+
ENV VITE_THEME_LIGHT_WARNING=WEB_APP_SERVE_PLACEHOLDER_VITE_THEME_LIGHT_WARNING
56+
ENV VITE_THEME_LIGHT_INFO=WEB_APP_SERVE_PLACEHOLDER_VITE_THEME_LIGHT_INFO
57+
ENV VITE_THEME_LIGHT_SUCCESS=WEB_APP_SERVE_PLACEHOLDER_VITE_THEME_LIGHT_SUCCESS
58+
ENV VITE_THEME_LIGHT_NEUTRAL=WEB_APP_SERVE_PLACEHOLDER_VITE_THEME_LIGHT_NEUTRAL
59+
60+
# App Attribution
61+
ENV VITE_APP_NAME=WEB_APP_SERVE_PLACEHOLDER_VITE_APP_NAME
62+
ENV VITE_APP_WEBSITE_URL=WEB_APP_SERVE_PLACEHOLDER_VITE_APP_WEBSITE_URL
63+
ENV VITE_APP_ATTRIBUTION_TITLE=WEB_APP_SERVE_PLACEHOLDER_VITE_APP_ATTRIBUTION_TITLE
64+
ENV VITE_APP_ATTRIBUTION_URL=WEB_APP_SERVE_PLACEHOLDER_VITE_APP_ATTRIBUTION_URL
65+
66+
ENV APPLY_CONFIG__ENABLE_DEBUG=false
67+
ENV APPLY_CONFIG__DEBUG_USE_BIOME=true
68+
69+
ENV APPLY_CONFIG__DESTINATION_DIRECTORY=/usr/share/nginx/html/
70+
ENV APPLY_CONFIG__APPLY_CONFIG_PATH=/web-app-serve/default-app-apply-config.sh
71+
72+
RUN WEB_APP_SERVE_ENABLED=true yarn build-only --outDir=/code/build
73+
74+
COPY ./src/ /web-app-serve/
75+
76+
FROM web-app-serve AS web-app-serve-example
77+
78+
LABEL maintainer="Togglecorp"
79+
LABEL org.opencontainers.image.source="github.com/mapswipe/mapswipe-web"
80+
81+
FROM ghcr.io/toggle-corp/web-app-serve:v0.1.2 AS web-app-serve
82+
83+
# Env for apply-config script
84+
ENV APPLY_CONFIG__SOURCE_DIRECTORY=/code/build/
85+
86+
COPY --from=web-app-serve-build /code/build "$APPLY_CONFIG__SOURCE_DIRECTORY"

docker.compose.yml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# NOTE: Please read ./README.md before using this
2+
3+
services:
4+
react:
5+
depends_on:
6+
- web
7+
build:
8+
context: ../
9+
target: dev
10+
command: sh -c 'yarn install && yarn dev'
11+
environment:
12+
VITE_FIREBASE_API_KEY: '${VITE_FIREBASE_API_KEY:-AIzaSyBuvneRh621iQkac31JNKWOYElhpRA_XYM}'
13+
VITE_FIREBASE_AUTH_DOMAIN: '${VITE_FIREBASE_AUTH_DOMAIN:-tc-mapswipe-alpha-2.firebaseapp.com}'
14+
VITE_FIREBASE_DATABASE_URL: '${VITE_FIREBASE_DATABASE_URL:-https://tc-mapswipe-alpha-2-default-rtdb.asia-southeast1.firebasedatabase.app}'
15+
VITE_FIREBASE_PROJECT_ID: '${VITE_FIREBASE_PROJECT_ID:-tc-mapswipe-alpha-2}'
16+
VITE_FIREBASE_STORAGE_BUCKET: '${VITE_FIREBASE_STORAGE_BUCKET:-tc-mapswipe-alpha-2.firebasestorage.app}'
17+
VITE_FIREBASE_MESSAGING_SENDER_ID: '${VITE_FIREBASE_MESSAGING_SENDER_ID:-1054350869566}'
18+
VITE_FIREBASE_MEASUREMENT_ID: '${VITE_FIREBASE_MEASUREMENT_ID:-123}'
19+
VITE_COMMUNITY_DASHBOARD_URL: '${VITE_COMMUNITY_DASHBOARD_URL:-https://community.mapswipe.org}'
20+
VITE_BASE_URL: '${VITE_BASE_URL:-https://mapswipe.org/privacy/}'
21+
VITE_PRIVACY_POLICY_URL: '${VITE_PRIVACY_POLICY_URL:-https://mapswipe.org/privacy/}'
22+
VITE_IMPRINT_URL: '${VITE_IMPRINT_URL:-https://mapswipe.org/privacy/}'
23+
VITE_APP_LOGO: '${VITE_APP_LOGO:-./img/mapswipe-white.svg}'
24+
VITE_PROJECTS_FALLBACK_IMAGE: '${VITE_PROJECTS_FALLBACK_IMAGE:-./img/map-pin-600x400.jpg}'
25+
VITE_ALLOW_UNVERIFIED_USERS: '${VITE_ALLOW_UNVERIFIED_USERS:-true}'
26+
VITE_DEFAULT_LOCALE: '${VITE_DEFAULT_LOCALE:-en}'
27+
VITE_FALLBACK_LOCALE: '${VITE_FALLBACK_LOCALE:-en}'
28+
VITE_SUPPORTED_LOCALES: '${VITE_SUPPORTED_LOCALES:-en,de,fr}'
29+
VITE_THEME_LIGHT_PRIMARY: '${VITE_THEME_LIGHT_PRIMARY:-#060E2F}'
30+
VITE_THEME_LIGHT_SECONDARY: '${VITE_THEME_LIGHT_SECONDARY:-#0D1949}'
31+
32+
VITE_THEME_LIGHT_TERTIARY=: '${VITE_THEME_LIGHT_TERTIARY:-#EEF2FB}'
33+
VITE_THEME_LIGHT_ACCENT: '${VITE_THEME_LIGHT_ACCENT:-#589AE3}'
34+
VITE_THEME_LIGHT_ERROR: '${VITE_THEME_LIGHT_ERROR:-#C62828}'
35+
VITE_THEME_LIGHT_WARNING: '${VITE_THEME_LIGHT_WARNING:-8E0000}'
36+
VITE_THEME_LIGHT_INFO: '${VITE_THEME_LIGHT_INFO:-#2196f3}'
37+
VITE_THEME_LIGHT_SUCCESS: '${VITE_THEME_LIGHT_SUCCESS:-#4caf50}'
38+
VITE_THEME_LIGHT_NEUTRAL: '${VITE_THEME_LIGHT_NEUTRAL:-#272727}'
39+
40+
VITE_APP_NAME: '${VITE_APP_NAME:-MapSwipe}'
41+
VITE_APP_WEBSITE_URL: '${VITE_APP_WEBSITE_URL:-https://mapswipe.org}'
42+
VITE_APP_ATTRIBUTION_TITLE: '${VITE_APP_ATTRIBUTION_TITLE:-MapSwipe}'
43+
VITE_APP_ATTRIBUTION_URL: '${VITE_APP_ATTRIBUTION_URL:-https://mapswipe.org/privacy/}'
44+
45+
volumes:
46+
- ../:/code
47+
ports:
48+
- 127.0.0.1:3000:3000

env.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
11
/// <reference types="vite/client" />
2+
type ImportMetaEnvAugmented = import('@julr/vite-plugin-validate-env').ImportMetaEnvAugmented<
3+
typeof import('../../env').default
4+
>

env.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import {
2+
defineConfig,
3+
overrideDefineForWebAppServe,
4+
Schema,
5+
} from '@julr/vite-plugin-validate-env';
6+
7+
const webAppServeEnabled = process.env.WEB_APP_SERVE_ENABLED?.toLowerCase() === 'true';
8+
if (webAppServeEnabled) {
9+
// eslint-disable-next-line no-console
10+
console.warn('Building application for web-app-serve');
11+
}
12+
const overrideDefine = webAppServeEnabled
13+
? overrideDefineForWebAppServe
14+
: undefined;
15+
16+
export default defineConfig({
17+
overrideDefine,
18+
validator: 'builtin',
19+
schema: {
20+
// NOTE: These are the dynamic env variables
21+
VITE_FIREBASE_API_KEY: Schema.string.optional(),
22+
VITE_FIREBASE_AUTH_DOMAIN: Schema.string.optional(),
23+
VITE_FIREBASE_DATABASE_URL: Schema.string.optional(),
24+
VITE_FIREBASE_PROJECT_ID: Schema.string.optional(),
25+
VITE_FIREBASE_STORAGE_BUCKET: Schema.string.optional(),
26+
VITE_FIREBASE_MESSAGING_SENDER_ID: Schema.string.optional(),
27+
VITE_FIREBASE_APP_ID: Schema.string.optional(),
28+
VITE_FIREBASE_MEASUREMENT_ID: Schema.string.optional(),
29+
30+
VITE_BASE_URL: Schema.string.optional(),
31+
VITE_PRIVACY_POLICY_URL: Schema.string.optional(),
32+
VITE_IMPRINT_URL: Schema.string.optional(),
33+
VITE_APP_LOGO: Schema.string.optional(),
34+
VITE_PROJECTS_FALLBACK_IMAGE: Schema.string.optional(),
35+
VITE_ALLOW_UNVERIFIED_USERS: Schema.string.optional(),
36+
37+
VITE_DEFAULT_LOCALE: Schema.string.optional(),
38+
VITE_FALLBACK_LOCALE: Schema.string.optional(),
39+
VITE_SUPPORTED_LOCALES: Schema.string.optional(),
40+
41+
VITE_THEME_LIGHT_PRIMARY: Schema.string.optional(),
42+
VITE_THEME_LIGHT_SECONDARY: Schema.string.optional(),
43+
VITE_THEME_LIGHT_TERTIARY: Schema.string.optional(),
44+
VITE_THEME_LIGHT_ACCENT: Schema.string.optional(),
45+
VITE_THEME_LIGHT_ERROR: Schema.string.optional(),
46+
VITE_THEME_LIGHT_WARNING: Schema.string.optional(),
47+
VITE_THEME_LIGHT_INFO: Schema.string.optional(),
48+
VITE_THEME_LIGHT_SUCCESS: Schema.string.optional(),
49+
VITE_THEME_LIGHT_NEUTRAL: Schema.string.optional(),
50+
51+
VITE_APP_NAME: Schema.string(),
52+
VITE_APP_WEBSITE_URL: Schema.string.optional(),
53+
VITE_APP_ATTRIBUTION_TITLE: Schema.string.optional(),
54+
VITE_APP_ATTRIBUTION_URL: Schema.string.optional(),
55+
56+
VITE_COMMUNITY_DASHBOARD_URL: Schema.string.optional(),
57+
58+
VITE_MAPILLARY_API_KEY: Schema.string.optional(),
59+
60+
VITE_OSM_OAUTH_REDIRECT_URI: Schema.string.optional(),
61+
},
62+
});

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"@intlify/unplugin-vue-i18n": "^6.0.8",
2020
"@togglecorp/fujs": "^2.2.0",
2121
"@turf/bbox": "^7.2.0",
22+
"@julr/vite-plugin-validate-env": "github:toggle-corp/vite-plugin-validate-env#v2.2.0-tc.1",
2223
"base-64": "^1.0.0",
2324
"firebase": "^11.8.1",
2425
"mapillary-js": "^4.1.2",

web-app-serve/.gitignore

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
.env
2+
.vite/
3+
4+
# Tooling
5+
node_modules/
6+
.eslintcache
7+
tsconfig.tsbuildinfo
8+
9+
# Custom
10+
build/
11+
generated/
12+
coverage/
13+
stats.html
14+
.env
15+
.env

web-app-serve/Dockerfile

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
FROM nginx:1 AS web-app-serve
2+
3+
LABEL org.opencontainers.image.authors="[email protected]" \
4+
org.opencontainers.image.source="https://github.com/toggle-corp/web-app-serve" \
5+
org.opencontainers.image.title="web-app-serve"
6+
7+
ARG BIOME_VERSION=2.0.6
8+
ARG RIPGREP_VERSION=14.1.1
9+
ARG JQ_VERSION=1.8.1
10+
11+
RUN mkdir /build && \
12+
# Installing ripgrep
13+
curl -L \
14+
-o /build/ripgrep.tar.gz \
15+
"https://github.com/BurntSushi/ripgrep/releases/download/${RIPGREP_VERSION}/ripgrep-${RIPGREP_VERSION}-x86_64-unknown-linux-musl.tar.gz" && \
16+
mkdir "/build/ripgrep" && \
17+
tar xf "/build/ripgrep.tar.gz" --directory="/build/ripgrep" && \
18+
mv "$(find /build/ripgrep -type f -name rg)" "/usr/local/bin/rg" && \
19+
chmod +x "/usr/local/bin/rg" && \
20+
rg --version && \
21+
# Installing jq
22+
curl -L \
23+
-o /usr/local/bin/jq \
24+
"https://github.com/jqlang/jq/releases/download/jq-${JQ_VERSION}/jq-linux-amd64" && \
25+
chmod +x "/usr/local/bin/jq" && \
26+
jq --version && \
27+
# Installing biome
28+
curl -L \
29+
-o "/usr/local/bin/biome" \
30+
"https://github.com/biomejs/biome/releases/download/@biomejs/biome@${BIOME_VERSION}/biome-linux-x64" && \
31+
chmod +x "/usr/local/bin/biome" && \
32+
biome --version && \
33+
# Cleanup
34+
rm -rf /build
35+
36+
# NOTE: Used by apply-config.sh
37+
ENV APPLY_CONFIG__ENABLE_DEBUG=false
38+
ENV APPLY_CONFIG__DEBUG_USE_BIOME=true
39+
40+
ENV APPLY_CONFIG__DESTINATION_DIRECTORY=/usr/share/nginx/html/
41+
ENV APPLY_CONFIG__APPLY_CONFIG_PATH=/web-app-serve/default-app-apply-config.sh
42+
43+
COPY ./src/ /web-app-serve/
44+
RUN ln -sf /web-app-serve/apply-config.sh /docker-entrypoint.d/apply-config.sh && \
45+
mkdir /etc/nginx/templates && \
46+
ln -sf /web-app-serve/nginx.conf.template /etc/nginx/templates/default.conf.template
47+
48+
FROM web-app-serve AS web-app-serve-example
49+
50+
LABEL org.opencontainers.image.source="https://github.com/toggle-corp/web-app-serve"
51+
LABEL org.opencontainers.image.authors="[email protected]"
52+
53+
# Env for apply-config script
54+
ENV APPLY_CONFIG__SOURCE_DIRECTORY=/code/build/
55+
56+
COPY ./example/source "$APPLY_CONFIG__SOURCE_DIRECTORY"

0 commit comments

Comments
 (0)