diff --git a/docker-compose.yml b/docker-compose.yml
index 33d40b5..bfd404b 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -42,7 +42,6 @@ services:
build:
dockerfile: Dockerfile
context: ./frontend
- target: prod
# open port 8000
ports:
- "8000:8000"
@@ -50,7 +49,7 @@ services:
rproxy:
image: docker.io/bitnami/nginx:1.27
volumes:
- - ./reverseproxy.local.conf:/opt/bitnami/nginx/conf/nginx.conf
+ - ./reverseproxy.local.conf:/var/conf/nginx.conf
depends_on:
- htwkalender-data-manager
- htwkalender-frontend
diff --git a/frontend/Dockerfile b/frontend/Dockerfile
index ead343c..0ad0af2 100644
--- a/frontend/Dockerfile
+++ b/frontend/Dockerfile
@@ -1,20 +1,3 @@
-#Calendar implementation for the HTWK Leipzig timetable. Evaluation and display of the individual dates in iCal format.
-#Copyright (C) 2024 HTWKalender support@htwkalender.de
-
-#This program is free software: you can redistribute it and/or modify
-#it under the terms of the GNU Affero General Public License as published by
-#the Free Software Foundation, either version 3 of the License, or
-#(at your option) any later version.
-
-#This program is distributed in the hope that it will be useful,
-#but WITHOUT ANY WARRANTY; without even the implied warranty of
-#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-#GNU Affero General Public License for more details.
-
-#You should have received a copy of the GNU Affero General Public License
-#along with this program. If not, see .
-
-# build stage
FROM docker.io/node:lts-alpine AS build
WORKDIR /app
@@ -23,20 +6,40 @@ RUN npm ci
COPY / ./
RUN npm run build
-# development stage
-FROM docker.io/node:lts-alpine AS dev
+FROM docker.io/nixos/nix:2.26.2 AS build-nginx
-WORKDIR /app
-COPY package*.json ./
-RUN npm install
-COPY . ./
+# Install nginx
+RUN mkdir -p /output/store
+RUN nix-env --profile /output/profile -i nginx
+RUN cp -va $(nix-store -qR /output/profile) /output/store
-# production stage
-# https://hub.docker.com/r/bitnami/nginx -> always run as non-root user
-FROM docker.io/bitnami/nginx:1.27 AS prod
+# Create empty directories needed by nginx
+RUN mkdir -p /to_add/var/log/nginx \
+ /to_add/var/cache/nginx/tmp \
+ /to_add/var/conf/ \
+ /to_add/var/conf/ \
+ /to_add/var/www \
+ /to_add/var/run
-# copy build files from build container
-COPY --from=build /app/dist /app
-COPY ./nginx.conf /opt/bitnami/nginx/conf/nginx.conf
+# Create user and group for nginx
+RUN nix-shell -p busybox --command "addgroup --system nginx && adduser --system -G nginx --uid 31337 nginx"
+# Make sure nginx can write to required directories
+RUN chown -R 31337 /to_add/
+
+FROM scratch
+
+# Copy over nginx files and dependencies
+COPY --from=build-nginx /output/store /nix/store
+COPY --from=build-nginx /output/profile/ /usr/local/
+COPY --from=build-nginx /to_add /
+
+# Copy required user information
+COPY --from=build-nginx /etc/passwd /etc/passwd
+COPY --from=build-nginx /etc/group /etc/group
+
+# Add user specific content and config
+COPY --from=build --chown=nginx:nginx /app/dist/ /var/www/
+COPY ./nginx.conf /var/conf/nginx.conf
EXPOSE 8000
+ENTRYPOINT ["nginx", "-p", "/var/"]
\ No newline at end of file
diff --git a/frontend/nginx.conf b/frontend/nginx.conf
index dc99832..e0cead5 100644
--- a/frontend/nginx.conf
+++ b/frontend/nginx.conf
@@ -13,50 +13,40 @@
#You should have received a copy of the GNU Affero General Public License
#along with this program. If not, see .
-
-worker_processes 4;
-
-error_log /opt/bitnami/nginx/logs/error.log;
-pid /opt/bitnami/nginx/tmp/nginx.pid;
+user nginx;
+worker_processes auto;
+pid /var/run/nginx.pid;
events {
- worker_connections 1024;
+ worker_connections 1024;
}
http {
- include mime.types;
- default_type application/octet-stream;
-
+ default_type application/octet-stream;
log_format anonymized '[$time_local] "$request" $status $body_bytes_sent "$http_referer"';
- access_log /opt/bitnami/nginx/logs/proxy_access.log anonymized;
- error_log /opt/bitnami/nginx/logs/proxy_error.log error;
+ access_log /var/log/nginx/proxy_access.log anonymized;
+ error_log /var/log/nginx/proxy_error.log error;
sendfile on;
keepalive_timeout 180s;
send_timeout 180s;
- client_body_temp_path /opt/bitnami/nginx/tmp/client_temp;
- proxy_temp_path /opt/bitnami/nginx/tmp/proxy_temp_path;
- fastcgi_temp_path /opt/bitnami/nginx/tmp/fastcgi_temp;
- uwsgi_temp_path /opt/bitnami/nginx/tmp/uwsgi_temp;
- scgi_temp_path /opt/bitnami/nginx/tmp/scgi_temp;
+ client_body_temp_path /var/cache/nginx/tmp/client_temp;
+ proxy_temp_path /var/cache/nginx/tmp/proxy_temp_path;
+ fastcgi_temp_path /var/cache/nginx/tmp/fastcgi_temp;
+ uwsgi_temp_path /var/cache/nginx/tmp/uwsgi_temp;
+ scgi_temp_path /var/cache/nginx/tmp/scgi_temp;
server {
- listen 8000;
- listen [::]:8000;
- server_name localhost;
+ listen 8000;
+ server_name localhost;
+
+ root /var/www;
+ index index.html;
location / {
- root /opt/bitnami/nginx/html;
- index index.html index.htm;
-
- #necessary to display vue subpage
- try_files $uri $uri.html $uri/ /index.html;
- }
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root /opt/bitnami/nginx/html;
+ try_files $uri $uri/ =404;
}
}
}