| |
| FROM node:20-alpine AS builder |
|
|
| WORKDIR /app |
|
|
| |
| COPY . . |
|
|
| |
| RUN npm ci --omit=dev || npm install |
|
|
| |
| RUN npm run build || echo "Build will run at runtime" |
|
|
| |
| FROM node:20-alpine |
|
|
| WORKDIR /app |
|
|
| |
| RUN apk add --no-cache nginx |
|
|
| |
| COPY --from=builder /app /app |
|
|
| |
| RUN mkdir -p /app/dist /app/config /app/bookmarks /run/nginx /var/log/nginx |
|
|
| |
| RUN cat > /etc/nginx/nginx.conf << 'EOF' |
| pid /tmp/nginx.pid; |
| events { |
| worker_connections 1024; |
| } |
| http { |
| include /etc/nginx/mime.types; |
| default_type application/octet-stream; |
| access_log /tmp/access.log; |
| error_log /tmp/error.log; |
| |
| server { |
| listen 7860; |
| server_name localhost; |
| root /app/dist; |
| index index.html; |
| |
| location / { |
| try_files $uri $uri/ /index.html; |
| } |
| |
| location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ { |
| expires 1y; |
| add_header Cache-Control "public, immutable"; |
| } |
| } |
| } |
| EOF |
|
|
| |
| ENV PORT=7860 |
| ENV MENAV_PORT=7860 |
| ENV MENAV_ENABLE_SYNC=false |
| ENV MENAV_IMPORT_BOOKMARKS=false |
|
|
| EXPOSE 7860 |
|
|
| |
| RUN cat > /entrypoint.sh << 'EOF' |
| |
| set -e |
|
|
| echo "[$(date)] Starting Menav..." |
|
|
| if [ "$MENAV_IMPORT_BOOKMARKS" = "true" ] && [ -d /app/bookmarks ]; then |
| echo "[$(date)] Importing bookmarks..." |
| npm run import-bookmarks || echo "Import failed, continuing" |
| fi |
|
|
| if [ "$MENAV_ENABLE_SYNC" = "true" ]; then |
| echo "[$(date)] Syncing data..." |
| npm run sync-all || echo "Sync failed, continuing" |
| fi |
|
|
| echo "[$(date)] Building project..." |
| npm run build |
|
|
| echo "[$(date)] Starting nginx on port 7860..." |
| nginx -c /etc/nginx/nginx.conf |
|
|
| tail -f /dev/null |
| EOF |
|
|
| RUN chmod +x /entrypoint.sh |
|
|
| CMD ["/entrypoint.sh"] |