init
This commit is contained in:
@@ -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"]
|
||||
@@ -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;
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
server {
|
||||
listen 8080;
|
||||
server_name _;
|
||||
|
||||
include /etc/nginx/snippets/nullcart-locations-${SHOP_SURFACE}.conf;
|
||||
}
|
||||
Executable
+31
@@ -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};
|
||||
}
|
||||
Reference in New Issue
Block a user