Initial commit: 200feet pipeline, docker packaging, and static site

This commit is contained in:
2026-07-02 00:38:32 -04:00
commit df18210492
31 changed files with 7188 additions and 0 deletions
+78
View File
@@ -0,0 +1,78 @@
# nginx site config for 200feet — static assets, aggressive compression,
# long cache on hashed/static GeoJSON, short cache on HTML so updates ship fast.
map $sent_http_content_type $expires {
default off;
text/html 10m;
application/json 1h;
application/geo+json 1h;
text/css 7d;
application/javascript 7d;
image/svg+xml 7d;
image/png 30d;
image/jpeg 30d;
font/woff2 30d;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
index index.html;
# Strong compression -- geojson compresses ~3x.
gzip on;
gzip_vary on;
gzip_comp_level 6;
gzip_min_length 256;
gzip_proxied any;
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/json
application/geo+json
application/xml
image/svg+xml
font/woff2;
# NOTE: do NOT redefine types {} here -- a types block in a server scope
# REPLACES the inherited /etc/nginx/mime.types instead of extending it,
# which makes nginx return application/octet-stream for everything else.
# .geojson files end up served as application/json (which fetch().json()
# handles fine), since the layer's location adds an explicit type below.
expires $expires;
add_header X-Content-Type-Options nosniff always;
add_header Referrer-Policy strict-origin-when-cross-origin always;
# Modest CSP. Leaflet + Turf + CARTO tiles + Google fonts are the third parties.
add_header Content-Security-Policy "default-src 'self'; img-src 'self' data: https://*.basemaps.cartocdn.com; script-src 'self' https://unpkg.com; style-src 'self' 'unsafe-inline' https://unpkg.com https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; connect-src 'self';" always;
# Healthcheck for Portainer / Docker
location = /healthz {
access_log off;
add_header Content-Type text/plain;
return 200 "ok\n";
}
# SPA-style fallback in case we ever add client routing.
location / {
try_files $uri $uri/ /index.html;
}
# Data files: longer cache acceptable, content keyed off the build.
location /data/ {
add_header Cache-Control "public, max-age=3600";
# Ensure JSON-ish content types for .geojson / .json
location ~* \.geojson$ { default_type application/geo+json; }
location ~* \.json$ { default_type application/json; }
try_files $uri =404;
}
# Don't log favicon / robot probes.
location = /favicon.ico { access_log off; log_not_found off; return 204; }
location = /robots.txt { access_log off; log_not_found off; return 200 "User-agent: *\nAllow: /\n"; }
}