Skip to content

Commit 2299dce

Browse files
Merge branch 'self-hosted-auth' of github.com:novuhq/novu into self-hosted-auth
2 parents eef014d + 623f319 commit 2299dce

File tree

7 files changed

+81
-39
lines changed

7 files changed

+81
-39
lines changed

.cspell.json

+2
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,8 @@
733733
"oklch",
734734
"Duplicable",
735735
"Radek",
736+
"automators",
737+
"VITE",
736738
"snooze",
737739
"unsnooze",
738740
"snoozed",

.github/workflows/prepare-self-hosted-release.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
strategy:
2323
fail-fast: false
2424
matrix:
25-
name: ['novu/api', 'novu/worker', 'novu/web', 'novu/webhook', 'novu/ws']
25+
name: ['novu/api', 'novu/worker', 'novu/dashboard', 'novu/webhook', 'novu/ws']
2626
steps:
2727
- name: Git Checkout
2828
uses: actions/checkout@v4
@@ -97,8 +97,8 @@ jobs:
9797
9898
if [ "${{ env.SERVICE_NAME }}" == "worker" ]; then
9999
cd src/ && echo -e "\nIS_SELF_HOSTED=true\nOS_TELEMETRY_URL=\"${{ secrets.OS_TELEMETRY_URL }}\"" >> .example.env && cd ..
100-
elif [ "${{ env.SERVICE_NAME }}" == "web" ]; then
101-
echo -e "\nIS_V2_ENABLED=true" >> .env.sample
100+
elif [ "${{ env.SERVICE_NAME }}" == "dashboard" ]; then
101+
echo -e "\nVITE_SELF_HOSTED=true" >> .env
102102
fi
103103
104104
pnpm run docker:build

apps/dashboard/docker-entrypoint.sh

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/bin/sh
2+
3+
# Safely build a <script> block assigning to window._env_
4+
ENV_SCRIPT="<script>
5+
window._env_ = {
6+
VITE_API_HOSTNAME: '${VITE_API_HOSTNAME}',
7+
VITE_WEBSOCKET_HOSTNAME: '${VITE_WEBSOCKET_HOSTNAME}'
8+
};
9+
</script>"
10+
11+
# Escape newlines for safe sed usage
12+
ESCAPED_SCRIPT=$(printf "%s\n" "$ENV_SCRIPT" | sed ':a;N;$!ba;s/\n/\\n/g')
13+
14+
# Inject just before the first <script type="module"> tag
15+
sed -i "s@<script type=\"module\"@${ESCAPED_SCRIPT}\n<script type=\"module\"@" /app/dist/index.html
16+
17+
# Start your app (adjust as needed, e.g. serve or nginx)
18+
exec "$@"

apps/dashboard/dockerfile

+28-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1-
FROM ghcr.io/novuhq/novu/base:1.0.0 AS builder
1+
FROM node:20-alpine3.19 AS builder
2+
RUN apk add g++ make py3-pip
3+
ENV NX_DAEMON=false
4+
25
WORKDIR /usr/src/app
6+
7+
RUN apk add --no-cache bash
8+
RUN npm install -g [email protected] --loglevel notice
9+
310
COPY .npmrc .
411
COPY package.json .
512

@@ -14,13 +21,24 @@ COPY pnpm-workspace.yaml .
1421
COPY pnpm-lock.yaml .
1522

1623
RUN --mount=type=cache,id=pnpm-store-dashboard,target=/root/.pnpm-store\
17-
pnpm install --frozen-lockfile
24+
pnpm install --frozen-lockfile --unsafe-perm
25+
1826
COPY [".prettierrc",".prettierignore", "./"]
19-
RUN pnpm build:dashboard
20-
21-
FROM alpine:latest
22-
RUN apk add --no-cache busybox
23-
WORKDIR /www
24-
COPY --from=builder /usr/src/app/apps/dashboard/build /www
25-
EXPOSE 80
26-
CMD ["busybox", "httpd", "-f", "-p", "80"]
27+
RUN CI='' pnpm build:dashboard --skip-nx-cache
28+
29+
FROM node:20-alpine
30+
31+
RUN npm install -g http-server --loglevel notice
32+
33+
USER 1000
34+
WORKDIR /app
35+
36+
COPY --chown=1000:1000 --from=builder /usr/src/app/apps/dashboard/dist /app/dist
37+
COPY --chown=1000:1000 --from=builder /usr/src/app/apps/dashboard/package.json /app/package.json
38+
COPY --chown=1000:1000 --from=builder /usr/src/app/apps/dashboard/docker-entrypoint.sh /app/docker-entrypoint.sh
39+
40+
RUN chmod +x /app/docker-entrypoint.sh
41+
ENTRYPOINT [ "/app/docker-entrypoint.sh" ]
42+
# Expose the port the app runs on
43+
EXPOSE 4000
44+
CMD [ "http-server", "dist", "-p", "4000" ]

apps/dashboard/src/config/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ export const CLERK_PUBLISHABLE_KEY = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY
1212

1313
export const APP_ID = import.meta.env.VITE_NOVU_APP_ID || '';
1414

15-
export const API_HOSTNAME = import.meta.env.VITE_API_HOSTNAME;
15+
export const API_HOSTNAME = window._env_.VITE_API_HOSTNAME || import.meta.env.VITE_API_HOSTNAME;
1616

1717
export const IS_EU = API_HOSTNAME === 'https://eu.api.novu.co';
1818

19-
export const WEBSOCKET_HOSTNAME = import.meta.env.VITE_WEBSOCKET_HOSTNAME;
19+
export const WEBSOCKET_HOSTNAME = window._env_.VITE_WEBSOCKET_HOSTNAME || import.meta.env.VITE_WEBSOCKET_HOSTNAME;
2020

2121
export const INTERCOM_APP_ID = import.meta.env.VITE_INTERCOM_APP_ID;
2222

docker/community/.env.example

+11-13
Original file line numberDiff line numberDiff line change
@@ -46,24 +46,22 @@ REDIS_CACHE_SERVICE_PORT=6379
4646
WS_PORT=3002
4747

4848
# Root URL
49-
REACT_APP_WS_URL=$HOST_NAME:3002
50-
# Uncomment this one when deploying Novu in the local environment
51-
# as Web app local Dockerfile will have to load this to be used.
52-
# Deployment version doesn't need as we inject it with API_ROOT_URL value.
53-
# REACT_APP_API_URL=http://localhost:3000
49+
VITE_API_HOSTNAME=$HOST_NAME:3000
50+
VITE_WEBSOCKET_HOSTNAME=$HOST_NAME:3002
5451
API_ROOT_URL=$HOST_NAME:3000
55-
DISABLE_USER_REGISTRATION=false
5652
FRONT_BASE_URL=$HOST_NAME:4200
5753
WIDGET_EMBED_PATH=$HOST_NAME:4701/embed.umd.min.js
5854
WIDGET_URL=$HOST_NAME:4500
55+
IS_API_IDEMPOTENCY_ENABLED=false
56+
IS_API_RATE_LIMITING_ENABLED=false
57+
IS_NEW_MESSAGES_API_RESPONSE_ENABLED=true
58+
IS_V2_ENABLED=true
59+
IS_CONTROLS_AUTOCOMPLETE_ENABLED=false
60+
IS_WORKFLOW_NODE_PREVIEW_ENABLED=false
61+
IS_ENHANCED_DIGEST_ENABLED=-false
62+
IS_EMAIL_INLINE_CSS_DISABLED=false
63+
IS_USE_MERGED_DIGEST_ID_ENABLED=false
5964

60-
# Context Paths
61-
# Only needed for setups with reverse-proxies
62-
GLOBAL_CONTEXT_PATH=
63-
WEB_CONTEXT_PATH=
64-
API_CONTEXT_PATH=
65-
WS_CONTEXT_PATH=
66-
WIDGET_CONTEXT_PATH=
6765

6866
# Analytics
6967
SENTRY_DSN=

docker/community/docker-compose.yml

+17-11
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ services:
4444
environment:
4545
NODE_ENV: ${NODE_ENV}
4646
API_ROOT_URL: ${API_ROOT_URL}
47-
DISABLE_USER_REGISTRATION: ${DISABLE_USER_REGISTRATION}
4847
PORT: ${API_PORT}
4948
FRONT_BASE_URL: ${FRONT_BASE_URL}
5049
MONGO_URL: ${MONGO_URL}
@@ -71,6 +70,10 @@ services:
7170
NEW_RELIC_LICENSE_KEY: ${NEW_RELIC_LICENSE_KEY}
7271
API_CONTEXT_PATH: ${API_CONTEXT_PATH}
7372
MONGO_AUTO_CREATE_INDEXES: ${MONGO_AUTO_CREATE_INDEXES}
73+
IS_API_IDEMPOTENCY_ENABLED: ${IS_API_IDEMPOTENCY_ENABLED}
74+
IS_API_RATE_LIMITING_ENABLED: ${IS_API_RATE_LIMITING_ENABLED}
75+
IS_NEW_MESSAGES_API_RESPONSE_ENABLED: ${IS_NEW_MESSAGES_API_RESPONSE_ENABLED}
76+
IS_V2_ENABLED: ${IS_V2_ENABLED}
7477
ports:
7578
- ${API_PORT}:${API_PORT}
7679

@@ -109,6 +112,9 @@ services:
109112
NEW_RELIC_LICENSE_KEY: ${NEW_RELIC_LICENSE_KEY}
110113
BROADCAST_QUEUE_CHUNK_SIZE: ${BROADCAST_QUEUE_CHUNK_SIZE}
111114
MULTICAST_QUEUE_CHUNK_SIZE: ${MULTICAST_QUEUE_CHUNK_SIZE}
115+
API_ROOT_URL: http://api:${API_PORT}
116+
IS_EMAIL_INLINE_CSS_DISABLED: ${IS_EMAIL_INLINE_CSS_DISABLED}
117+
IS_USE_MERGED_DIGEST_ID_ENABLED: ${IS_USE_MERGED_DIGEST_ID_ENABLED}
112118

113119
ws:
114120
image: 'ghcr.io/novuhq/novu/ws:2.1.1'
@@ -138,27 +144,27 @@ services:
138144
ports:
139145
- ${WS_PORT}:${WS_PORT}
140146

141-
web:
142-
image: 'ghcr.io/novuhq/novu/web:2.1.1'
147+
dashboard:
148+
image: 'ghcr.io/novuhq/novu/dashboard:2.1.1'
143149
depends_on:
144150
- api
145151
- worker
146-
container_name: web
152+
container_name: dashboard
147153
restart: unless-stopped
148154
logging:
149155
driver: 'json-file'
150156
options:
151157
max-size: '50m'
152158
max-file: '5'
153159
environment:
154-
REACT_APP_API_URL: ${API_ROOT_URL}
155-
REACT_APP_ENVIRONMENT: ${NODE_ENV}
156-
REACT_APP_WIDGET_EMBED_PATH: ${WIDGET_EMBED_PATH}
157-
REACT_APP_IS_SELF_HOSTED: 'true'
158-
REACT_APP_WS_URL: ${REACT_APP_WS_URL}
160+
VITE_API_HOSTNAME: ${VITE_API_HOSTNAME}
161+
VITE_SELF_HOSTED: true
162+
VITE_WEBSOCKET_HOSTNAME: ${VITE_WEBSOCKET_HOSTNAME}
163+
IS_CONTROLS_AUTOCOMPLETE_ENABLED: ${IS_CONTROLS_AUTOCOMPLETE_ENABLED}
164+
IS_WORKFLOW_NODE_PREVIEW_ENABLED: ${IS_WORKFLOW_NODE_PREVIEW_ENABLED}
165+
IS_ENHANCED_DIGEST_ENABLED: ${IS_ENHANCED_DIGEST_ENABLED}
159166
ports:
160-
- 4200:4200
161-
command: ['/bin/sh', '-c', 'pnpm run envsetup:docker && pnpm run start:static:build']
167+
- 4000:4000
162168

163169
volumes:
164170
mongodb: ~

0 commit comments

Comments
 (0)