FROM node:20-alpine AS frontend-build WORKDIR /frontend COPY frontend/package.json frontend/package-lock.json* ./ RUN npm install COPY frontend/ ./ RUN npm run build FROM postgres:16-bookworm AS runtime ARG GEOINTEL_INSTALL_AI=false ENV GEOINTEL_ENV=production \ GEOINTEL_API_PREFIX=/api/v1 \ GEOINTEL_STORAGE_ROOT=/app/storage \ STORAGE_ROOT=/app/storage \ GEOINTEL_ALL_IN_ONE=1 \ PATH="/opt/geointel/venv/bin:${PATH}" RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ curl \ gdal-bin \ libgl1 \ libglib2.0-0 \ libgdal-dev \ libgeos-dev \ libpq-dev \ libproj-dev \ libsm6 \ libx11-6 \ libxcb1 \ libxext6 \ libxrender1 \ nginx \ postgresql-16-postgis-3 \ postgresql-16-postgis-3-scripts \ proj-bin \ python3-dev \ python3-venv \ && ln -sf /usr/bin/python3.11 /usr/local/bin/python3 \ && ln -sf /usr/bin/python3.11 /usr/bin/python3 \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY backend/ /app/ COPY fixtures/ /app/fixtures/ COPY scripts/prepare_operator_real_data_samples.py /app/scripts/prepare_operator_real_data_samples.py COPY scripts/export_operator_yolo_tile_dataset.py /app/scripts/export_operator_yolo_tile_dataset.py COPY scripts/audit_operator_yolo_dataset_quality.py /app/scripts/audit_operator_yolo_dataset_quality.py COPY scripts/render_operator_yolo_label_qa_contact_sheets.py /app/scripts/render_operator_yolo_label_qa_contact_sheets.py COPY scripts/train_operator_yolo_detector.sh /app/scripts/train_operator_yolo_detector.sh COPY deploy/unraid/nginx-all-in-one.conf /etc/nginx/conf.d/default.conf COPY deploy/unraid/all-in-one-start.sh /usr/local/bin/geointel-all-in-one-start COPY --from=frontend-build /frontend/dist/ /usr/share/nginx/html/ RUN /usr/bin/python3.11 -m venv /opt/geointel/venv \ && pip install --no-cache-dir --upgrade pip setuptools \ && extras=".[gis]" \ && if [ "$GEOINTEL_INSTALL_AI" = "true" ]; then extras=".[gis,ai]"; fi \ && pip install --no-cache-dir "$extras" \ && python scripts/gis_import_smoke.py \ && python scripts/yolo_preflight.py --json >/tmp/geointel-yolo-preflight.json \ && chmod +x /usr/local/bin/geointel-all-in-one-start \ && chmod +x /app/scripts/train_operator_yolo_detector.sh \ && rm -f /etc/nginx/sites-enabled/default \ && mkdir -p /app/storage /run/nginx /var/log/nginx VOLUME ["/var/lib/postgresql/data", "/app/storage"] EXPOSE 80 HEALTHCHECK --interval=30s --timeout=5s --retries=10 --start-period=60s \ CMD curl -fsS http://127.0.0.1/health >/dev/null || exit 1 CMD ["/usr/local/bin/geointel-all-in-one-start"]