Skip to content

Commit ae6a25f

Browse files
authored
Create a Docker Image for Web (#4533)
1 parent e34749f commit ae6a25f

File tree

7 files changed

+53
-24
lines changed

7 files changed

+53
-24
lines changed

.github/workflows/build-self-host-docker-images.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,16 @@ jobs:
3434
- name: Set up Docker Buildx
3535
uses: docker/setup-buildx-action@v3
3636

37+
- name: Build and push web
38+
uses: docker/build-push-action@v6
39+
with:
40+
platforms: linux/amd64,linux/arm64
41+
push: true
42+
tags: ghcr.io/omnivore-app/sh-web:latest,ghcr.io/omnivore-app/sh-web:${{ github.sha }}
43+
file: packages/web/Dockerfile-self
44+
cache-from: type=registry,ref=ghcr.io/omnivore-app/sh-web:${{ github.sha }}
45+
cache-to: type=registry,ref=ghcr.io/omnivore-app/sh-web:${{ github.sha }},mode=max
46+
3747
- name: Build and push image-proxy
3848
uses: docker/build-push-action@v6
3949
with:

packages/web/Dockerfile-self

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,6 @@
33

44
FROM node:22.12-alpine as builder
55
ENV NODE_OPTIONS=--max-old-space-size=8192
6-
ARG APP_ENV
7-
ARG BASE_URL
8-
ARG SERVER_BASE_URL
9-
ARG HIGHLIGHTS_BASE_URL
10-
ENV NEXT_PUBLIC_APP_ENV=$APP_ENV
11-
ENV NEXT_PUBLIC_BASE_URL=$BASE_URL
12-
ENV NEXT_PUBLIC_SERVER_BASE_URL=$SERVER_BASE_URL
13-
ENV NEXT_PUBLIC_HIGHLIGHTS_BASE_URL=$HIGHLIGHTS_BASE_URL
146

157

168
RUN apk add g++ make python3 py3-setuptools
@@ -50,4 +42,6 @@ COPY --from=builder /app/node_modules /app/node_modules
5042
COPY --from=builder /app/package.json /app/package.json
5143

5244
EXPOSE 8080
53-
CMD ["yarn", "workspace", "@omnivore/web", "start"]
45+
COPY ./packages/web/env.sh /app/packages/web/env.sh
46+
RUN chmod +x /app/packages/web/env.sh
47+
ENTRYPOINT ["/app/packages/web/env.sh"]

packages/web/env.sh

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#!/bin/sh
2+
3+
if [ -z "$SERVER_BASE_URL" ]; then
4+
echo "Error: SERVER_BASE_URL environment variable is not set."
5+
exit 1
6+
fi
7+
8+
file_contents=$(cat /app/packages/web/public/env.js)
9+
new_contents=${file_contents//\{\{SERVER_BASE_URL\}\}/$SERVER_BASE_URL}
10+
echo "$new_contents" > /app/packages/web/public/env.js
11+
12+
if [ -z "$BASE_URL" ]; then
13+
echo "Error: BASE_URL environment variable is not set."
14+
exit 1
15+
fi
16+
17+
file_contents=$(cat /app/packages/web/public/env.js)
18+
new_contents=${file_contents//\{\{BASE_URL\}\}/$BASE_URL}
19+
echo "$new_contents" > /app/packages/web/public/env.js
20+
21+
yarn workspace @omnivore/web start

packages/web/lib/appConfig.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,26 @@ const baseURLRecords: BaseURLRecords = {
3030

3131
function serverBaseURL(env: AppEnvironment): string {
3232
const value = baseURLRecords[appEnv].serverBaseURL
33-
if (value.length == 0) {
34-
throw new Error(
35-
`Couldn't find environment variable for server base url in ${env} environment`
33+
if (value.length == 0 && global.window) {
34+
const windowEnv = (window as any).omnivoreEnv
35+
console.warn(
36+
`Couldn't find environment variable for server base url in ${env} environment, using ${windowEnv.SERVER_BASE_URL}`
3637
)
38+
39+
return windowEnv.SERVER_BASE_URL ?? ''
3740
}
3841
return value
3942
}
4043

4144
function webURL(env: AppEnvironment): string {
4245
const value = baseURLRecords[appEnv].webBaseURL
43-
if (value.length == 0) {
44-
throw new Error(
45-
`Couldn't find environment variable for web base url in ${env} environment`
46+
if (value.length == 0 && global.window) {
47+
const windowEnv = (window as any).omnivoreEnv
48+
console.warn(
49+
`Couldn't find environment variable for base url in ${env} environment, using ${windowEnv.BASE_URL}`
4650
)
51+
52+
return windowEnv.BASE_URL ?? ''
4753
}
4854
return value
4955
}

packages/web/pages/_document.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import NextDocument, { Html, Head, Main, NextScript } from 'next/document'
44
import { getCssText, globalStyles } from '../components/tokens/stitches.config'
55
import { Toaster } from 'react-hot-toast'
6+
import Script from 'next/script'
67

78
export default class Document extends NextDocument {
89
render() {
@@ -18,6 +19,7 @@ export default class Document extends NextDocument {
1819
<link rel="manifest" href="/manifest.webmanifest" />
1920
<script async src="/static/scripts/intercom.js" />
2021
<script async src="/static/scripts/inject-sw.js" />
22+
<Script strategy={"beforeInteractive"} src={"/env.js"} />
2123

2224
{/* prefetch (not preload) fonts that will be used by the reader */}
2325
<link rel="prefetch" href="/static/fonts/Lora/Lora-Regular.ttf" />

packages/web/public/env.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
window.omnivoreEnv = {
2+
SERVER_BASE_URL: "{{SERVER_BASE_URL}}",
3+
BASE_URL: "{{BASE_URL}}"
4+
}

self-hosting/docker-compose/docker-compose.yml

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,7 @@ services:
5454
condition: service_started
5555

5656
web:
57-
build:
58-
context: ../../
59-
dockerfile: ./packages/web/Dockerfile-self
60-
args:
61-
- APP_ENV=prod
62-
- BASE_URL=http://localhost:3000
63-
- SERVER_BASE_URL=http://localhost:4000
64-
- HIGHLIGHTS_BASE_URL=http://localhost:3000
65-
- USE_NATIVE_PDF=true
57+
image: "ghcr.io/omnivore-app/sh-web:latest"
6658
container_name: "omnivore-web"
6759
ports:
6860
- "3000:8080"

0 commit comments

Comments
 (0)