Skip to content

Commit 73c9735

Browse files
committed
feature(alpha-deployment): Docker setup and alpha deployment
1 parent a681cc9 commit 73c9735

File tree

10 files changed

+2214
-1640
lines changed

10 files changed

+2214
-1640
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: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
name: Publish web app serve
2+
3+
on:
4+
workflow_dispatch:
5+
push:
6+
branches:
7+
- develop
8+
9+
permissions:
10+
packages: write
11+
12+
jobs:
13+
publish_image:
14+
name: Publish Docker Image
15+
runs-on: ubuntu-latest
16+
steps:
17+
- uses: actions/checkout@v4
18+
with:
19+
submodules: true
20+
21+
- name: Publish web-app-serve
22+
uses: toggle-corp/[email protected]
23+
with:
24+
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: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
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 used during build
27+
28+
ENV VITE_FIREBASE_API_KEY=AIzaSyBuvneRh621iQkac31JNKWOYElhpRA_XYM
29+
ENV VITE_FIREBASE_AUTH_DOMAIN=tc-mapswipe-alpha-2.firebaseapp.com
30+
ENV VITE_FIREBASE_DATABASE_URL=https://tc-mapswipe-alpha-2-default-rtdb.asia-southeast1.firebasedatabase.app
31+
ENV VITE_FIREBASE_PROJECT_ID=tc-mapswipe-alpha-2
32+
ENV VITE_FIREBASE_STORAGE_BUCKET=tc-mapswipe-alpha-2.firebasestorage.app
33+
ENV VITE_FIREBASE_MESSAGING_SENDER_ID=1054350869566
34+
ENV VITE_FIREBASE_APP_ID=1:1054350869566:web:0390a3e635ec6f00d4bd6f
35+
ENV VITE_FIREBASE_MEASUREMENT_ID=123
36+
37+
ENV VITE_COMMUNITY_DASHBOARD_URL=https://community.mapswipe.org
38+
ENV VITE_BASE_URL=https://mapswipe.org/privacy/
39+
ENV VITE_PRIVACY_POLICY_URL=https://mapswipe.org/privacy/
40+
ENV VITE_IMPRINT_URL=https://mapswipe.org/privacy/
41+
ENV VITE_APP_LOGO=./img/mapswipe-white.svg
42+
ENV VITE_PROJECTS_FALLBACK_IMAGE=./img/map-pin-600x400.jpg
43+
ENV VITE_ALLOW_UNVERIFIED_USERS=true
44+
45+
# Locales
46+
ENV VITE_DEFAULT_LOCALE=en
47+
ENV VITE_FALLBACK_LOCALE=en
48+
ENV VITE_SUPPORTED_LOCALES=en,de,fr
49+
50+
# Theme
51+
ENV VITE_THEME_LIGHT_PRIMARY=#060E2F
52+
ENV VITE_THEME_LIGHT_SECONDARY=#0D1949
53+
ENV VITE_THEME_LIGHT_TERTIARY=#EEF2FB
54+
ENV VITE_THEME_LIGHT_ACCENT=#589AE3
55+
ENV VITE_THEME_LIGHT_ERROR=#C62828
56+
ENV VITE_THEME_LIGHT_WARNING=#8E0000
57+
ENV VITE_THEME_LIGHT_INFO=#2196f3
58+
ENV VITE_THEME_LIGHT_SUCCESS=#4caf50
59+
ENV VITE_THEME_LIGHT_NEUTRAL=#272727
60+
61+
# App Attribution
62+
ENV VITE_APP_NAME=MapSwipe
63+
ENV VITE_APP_WEBSITE_URL=https://mapswipe.org
64+
ENV VITE_APP_ATTRIBUTION_TITLE=MapSwipe
65+
ENV VITE_APP_ATTRIBUTION_URL=https://mapswipe.org/privacy/
66+
67+
RUN WEB_APP_SERVE_ENABLED=true yarn build-only --outDir=/code/build
68+
69+
LABEL maintainer="Togglecorp"
70+
LABEL org.opencontainers.image.source="github.com/mapswipe/mapswipe-web"
71+
72+
FROM ghcr.io/toggle-corp/web-app-serve:v0.1.2 AS web-app-serve
73+
74+
# Env for apply-config script
75+
ENV APPLY_CONFIG__SOURCE_DIRECTORY=/code/build/
76+
77+
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.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.optional(),
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: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
},
1818
"dependencies": {
1919
"@intlify/unplugin-vue-i18n": "^6.0.8",
20+
"@julr/vite-plugin-validate-env": "github:toggle-corp/vite-plugin-validate-env#v2.2.0-tc.1",
2021
"base-64": "^1.0.0",
2122
"firebase": "^11.8.1",
2223
"mapillary-js": "^4.1.2",
@@ -59,5 +60,6 @@
5960
"vite": "^6.3.5",
6061
"vitest": "^3.1.4",
6162
"vue-tsc": "^2.2.10"
62-
}
63+
},
64+
"packageManager": "[email protected]+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
6365
}

web-app-serve/.gitignore

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
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

web-app-serve/docker-compose.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# NOTE: The name should is mandatory and should be unique
2+
name: mapswipe-web
3+
4+
services:
5+
web-app-serve:
6+
build:
7+
context: ../
8+
target: web-app-serve
9+
environment:
10+
# web-app-serve config
11+
APPLY_CONFIG__ENABLE_DEBUG: true
12+
# NOTE: See "Dockerfile" to get dynamic env variables for .env file
13+
env_file: .env
14+
ports:
15+
- '8050:80'

0 commit comments

Comments
 (0)