This commit is contained in:
2026-08-28 17:31:02 +02:00
commit 2b30e8bd39
694 changed files with 49243 additions and 0 deletions
+64
View File
@@ -0,0 +1,64 @@
FROM node:20-alpine AS cms-builder
WORKDIR /cms
COPY cms/package*.json .
RUN npm ci
COPY cms/ .
ARG VITE_API_BASE_URL
ARG VITE_SHOP_FIAT_CURRENCY
ARG VITE_PRODUCT_THUMB_ALLOWED_MIMES
ARG VITE_PRODUCT_THUMB_MAX_FILE_BYTES
ARG VITE_SHOP_LOGO_ALLOWED_MIMES
ARG VITE_SHOP_LOGO_MAX_FILE_BYTES
ARG VITE_SHOP_FAVICON_ALLOWED_MIMES
ARG VITE_SHOP_FAVICON_MAX_FILE_BYTES
ARG VITE_DIGITAL_STOCK_ATTACHMENT_ALLOWED_MIMES
ARG VITE_DIGITAL_STOCK_ATTACHMENT_MAX_FILE_BYTES
ARG VITE_VALIDATION_PRODUCT_TITLE_MAX_LENGTH
ARG VITE_VALIDATION_CATEGORY_NAME_MAX_LENGTH
ARG VITE_VALIDATION_DISCOUNT_CODE_MAX_LENGTH
ARG VITE_VALIDATION_VARIANT_IMAGES_MAX
ARG VITE_VALIDATION_DIGITAL_STOCK_ATTACHMENTS_MAX
ARG VITE_VALIDATION_SHIPPING_NOTE_MIN_LENGTH
ARG VITE_VALIDATION_SHIPPING_NOTE_MAX_LENGTH
ARG VITE_VALIDATION_ORDER_MESSAGE_MAX_LENGTH
ARG VITE_ORDERS_DETAIL_POLL_INTERVAL_MS
ENV VITE_API_BASE_URL=$VITE_API_BASE_URL \
VITE_SHOP_FIAT_CURRENCY=$VITE_SHOP_FIAT_CURRENCY \
VITE_PRODUCT_THUMB_ALLOWED_MIMES=$VITE_PRODUCT_THUMB_ALLOWED_MIMES \
VITE_PRODUCT_THUMB_MAX_FILE_BYTES=$VITE_PRODUCT_THUMB_MAX_FILE_BYTES \
VITE_SHOP_LOGO_ALLOWED_MIMES=$VITE_SHOP_LOGO_ALLOWED_MIMES \
VITE_SHOP_LOGO_MAX_FILE_BYTES=$VITE_SHOP_LOGO_MAX_FILE_BYTES \
VITE_SHOP_FAVICON_ALLOWED_MIMES=$VITE_SHOP_FAVICON_ALLOWED_MIMES \
VITE_SHOP_FAVICON_MAX_FILE_BYTES=$VITE_SHOP_FAVICON_MAX_FILE_BYTES \
VITE_DIGITAL_STOCK_ATTACHMENT_ALLOWED_MIMES=$VITE_DIGITAL_STOCK_ATTACHMENT_ALLOWED_MIMES \
VITE_DIGITAL_STOCK_ATTACHMENT_MAX_FILE_BYTES=$VITE_DIGITAL_STOCK_ATTACHMENT_MAX_FILE_BYTES \
VITE_VALIDATION_PRODUCT_TITLE_MAX_LENGTH=$VITE_VALIDATION_PRODUCT_TITLE_MAX_LENGTH \
VITE_VALIDATION_CATEGORY_NAME_MAX_LENGTH=$VITE_VALIDATION_CATEGORY_NAME_MAX_LENGTH \
VITE_VALIDATION_DISCOUNT_CODE_MAX_LENGTH=$VITE_VALIDATION_DISCOUNT_CODE_MAX_LENGTH \
VITE_VALIDATION_VARIANT_IMAGES_MAX=$VITE_VALIDATION_VARIANT_IMAGES_MAX \
VITE_VALIDATION_DIGITAL_STOCK_ATTACHMENTS_MAX=$VITE_VALIDATION_DIGITAL_STOCK_ATTACHMENTS_MAX \
VITE_VALIDATION_SHIPPING_NOTE_MIN_LENGTH=$VITE_VALIDATION_SHIPPING_NOTE_MIN_LENGTH \
VITE_VALIDATION_SHIPPING_NOTE_MAX_LENGTH=$VITE_VALIDATION_SHIPPING_NOTE_MAX_LENGTH \
VITE_VALIDATION_ORDER_MESSAGE_MAX_LENGTH=$VITE_VALIDATION_ORDER_MESSAGE_MAX_LENGTH \
VITE_ORDERS_DETAIL_POLL_INTERVAL_MS=$VITE_ORDERS_DETAIL_POLL_INTERVAL_MS
RUN npm run build
FROM nginx:alpine
RUN apk add --no-cache gettext
COPY --from=cms-builder /cms/dist /usr/share/nginx/html/cms
COPY nginx/conf.d/ /etc/nginx/templates/conf.d/
COPY nginx/snippets/ /etc/nginx/templates/snippets/
COPY nginx/docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
+22
View File
@@ -0,0 +1,22 @@
server {
listen 80;
server_name ${CLEARNET_DOMAIN};
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name ${CLEARNET_DOMAIN};
ssl_certificate /etc/nginx/certs/live/${CLEARNET_DOMAIN}/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/live/${CLEARNET_DOMAIN}/privkey.pem;
include /etc/nginx/snippets/nullcart-locations-${SHOP_SURFACE}.conf;
}
+6
View File
@@ -0,0 +1,6 @@
server {
listen 8080;
server_name _;
include /etc/nginx/snippets/nullcart-locations-${SHOP_SURFACE}.conf;
}
+31
View File
@@ -0,0 +1,31 @@
#!/bin/sh
set -eu
render_locations() {
surface="$1"
SHOP_SURFACE="$surface"
export SHOP_SURFACE BACKEND_PORT
envsubst '${SHOP_SURFACE} ${BACKEND_PORT}' \
< /etc/nginx/templates/snippets/nullcart-locations.conf.template \
> "/etc/nginx/snippets/nullcart-locations-${surface}.conf"
}
render_server() {
template_path="$1"
output_path="$2"
surface="$3"
SHOP_SURFACE="$surface"
export SHOP_SURFACE CLEARNET_DOMAIN BACKEND_PORT
envsubst '${CLEARNET_DOMAIN} ${BACKEND_PORT} ${SHOP_SURFACE}' \
< "$template_path" \
> "$output_path"
}
mkdir -p /etc/nginx/snippets
render_locations clearnet
render_locations onion
render_server /etc/nginx/templates/conf.d/clearnet.conf.template /etc/nginx/conf.d/clearnet.conf clearnet
render_server /etc/nginx/templates/conf.d/onion.conf.template /etc/nginx/conf.d/onion.conf onion
exec nginx -g 'daemon off;'
@@ -0,0 +1,59 @@
location /uploads/public/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header x-shop-surface ${SHOP_SURFACE};
proxy_pass http://backend:${BACKEND_PORT};
}
location = /api/shop-settings/simplex-connect {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header x-shop-surface ${SHOP_SURFACE};
proxy_read_timeout 320s;
proxy_send_timeout 320s;
proxy_connect_timeout 30s;
proxy_pass http://backend:${BACKEND_PORT};
}
location /api {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header x-shop-surface ${SHOP_SURFACE};
proxy_read_timeout 120s;
proxy_send_timeout 120s;
proxy_pass http://backend:${BACKEND_PORT};
}
location = /cms {
return 301 /cms/;
}
location /cms/ {
root /usr/share/nginx/html;
try_files $uri $uri/ /cms/index.html;
}
location /pgadmin {
proxy_set_header X-Script-Name /pgadmin;
proxy_set_header Host $host;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_header Set-Cookie;
proxy_pass http://pgadmin;
proxy_redirect off;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header x-shop-surface ${SHOP_SURFACE};
proxy_pass http://backend:${BACKEND_PORT};
}