diff --git a/Dockerfile b/Dockerfile index 1aebbec..38aadae 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,21 @@ FROM nginx:alpine-slim +# Copy custom nginx configuration +COPY nginx.conf /etc/nginx/nginx.conf + +# Copy website files COPY . /usr/share/nginx/html +# Copy minify script and make it executable +COPY ./utils/minify.sh /tmp/minify.sh +RUN chmod +x /tmp/minify.sh + +# Minify all JavaScript files in-place +RUN find /usr/share/nginx/html -name "*.js" -type f -exec /tmp/minify.sh {} \; && \ + rm -r /tmp && \ + rm -r /usr/share/nginx/html/.git && \ + rm -r /usr/share/nginx/html/utils + EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..8887993 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,110 @@ +user nginx; +worker_processes auto; +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; + use epoll; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + # Performance optimizations + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + client_max_body_size 20M; + + # Gzip compression + gzip on; + gzip_vary on; + gzip_proxied any; + gzip_comp_level 6; + gzip_types + text/plain + text/css + text/xml + text/javascript + application/json + application/javascript + application/x-javascript + application/xml+rss + image/svg+xml; + gzip_min_length 256; + gzip_disable "msie6"; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + add_header Referrer-Policy "strict-origin-when-cross-origin" always; + + server { + listen 80; + server_name localhost; + root /usr/share/nginx/html; + index index.html; + + # Charset + charset utf-8; + + # Custom error pages + error_page 404 /index.html; + error_page 500 502 503 504 /50x.html; + + # Main location + location / { + try_files $uri $uri/ /index.html; + } + + # Cache static assets + location ~* \.(jpg|jpeg|png|gif|ico|svg|webp)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + access_log off; + } + + location ~* \.(css|js)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + access_log off; + } + + location ~* \.(woff|woff2|ttf|otf|eot)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + access_log off; + } + + # HTML files - shorter cache + location ~* \.html$ { + expires 1h; + add_header Cache-Control "public, must-revalidate"; + } + + # Deny access to hidden files + location ~ /\. { + deny all; + access_log off; + log_not_found off; + } + + # Deny access to backup files + location ~ ~$ { + deny all; + access_log off; + log_not_found off; + } + } +} diff --git a/utils/minify.sh b/utils/minify.sh new file mode 100644 index 0000000..6fc37d6 --- /dev/null +++ b/utils/minify.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +# Minify a JavaScript file in-place +# Usage: ./minify.sh + +if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + exit 1 +fi + +FILE="$1" + +if [ ! -f "$FILE" ]; then + echo "Error: File '$FILE' not found" + exit 1 +fi + +# Check if the file is a JavaScript file +if [[ ! "$FILE" =~ \.js$ ]]; then + echo "Error: File must have .js extension" + exit 1 +fi + +# Minify the file using a simple approach with sed and tr +# This removes comments, extra whitespace, and newlines +TMP_FILE="${FILE}.tmp" + +# Remove single-line comments, multi-line comments, and compress whitespace +sed 's|//.*$||g' "$FILE" | \ + tr '\n' ' ' | \ + sed 's|/\*.*\*/||g' | \ + sed 's/[[:space:]]\+/ /g' | \ + sed 's/[[:space:]]*\([{};,=()[\]<>+\-*/%!&|?:]\)[[:space:]]*/\1/g' | \ + sed 's/^[[:space:]]*//;s/[[:space:]]*$//' > "$TMP_FILE" + +# Replace original file with minified version +mv "$TMP_FILE" "$FILE" + +echo "Minified: $FILE"