From c91b1e867ae397f70be6abdd6be68e3ef6c24993 Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Mon, 9 Mar 2026 12:43:17 -0400 Subject: [PATCH 1/2] add docker-compose.yml and example override; allow uploading latest_model to container --- .gitignore | 2 ++ Dockerfile | 3 ++- docker-compose.override.yml.example | 13 +++++++++++++ docker-compose.yml | 11 +++++++++++ latest_model/.gitkeep | 0 5 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 docker-compose.override.yml.example create mode 100644 docker-compose.yml create mode 100644 latest_model/.gitkeep diff --git a/.gitignore b/.gitignore index 8623408..91b417b 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,5 @@ config.yml env.list test-results* *.ipynb +docker-compose.override.yml +latest_model/** diff --git a/Dockerfile b/Dockerfile index ad19023..6332ada 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11.6 as base +FROM python:3.11.6 AS base RUN apt-get update && apt-get install -y libgdal-dev uwsgi-plugin-python3 @@ -21,6 +21,7 @@ RUN UWSGI_EMBED_PLUGINS=stats_pusher_statsd pip install -r requirements.txt # Copy app and libs COPY --chown=inaturalist:inaturalist app.py /home/inaturalist/vision COPY --chown=inaturalist:inaturalist lib /home/inaturalist/vision/lib +COPY --chown=inaturalist:inaturalist latest_model* /home/inaturalist/vision/latest_model # Create directories for the log and static content RUN mkdir /home/inaturalist/vision/log diff --git a/docker-compose.override.yml.example b/docker-compose.override.yml.example new file mode 100644 index 0000000..bfdf470 --- /dev/null +++ b/docker-compose.override.yml.example @@ -0,0 +1,13 @@ +services: + inaturalist_vision_api: + environment: + APP_SECRET: somesecret + MODEL_NAME: Latest Model + VISION_MODEL_PATH: /home/inaturalist/vision/latest_model/vision.h5 + TAXONOMY_PATH: /home/inaturalist/vision/latest_model/taxonomy.csv + TF_GEO_MODEL_PATH: /home/inaturalist/vision/latest_model/geo.h5 + ELEVATION_H3_R4_PATH: /home/inaturalist/vision/latest_model/elevation_r4_5m.csv + GEO_THRESHOLDS_PATH: /home/inaturalist/vision/latest_model/thresholds.csv + TAXON_RANGES_PATH: /home/inaturalist/vision/latest_model/taxon_range_csvs + SYNONYMS_PATH: /home/inaturalist/vision/latest_model/synonyms.csv + SYNONYMS_TAXONOMY_PATH: /home/inaturalist/vision/latest_model/synonym_taxonomy.csv diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..221cd25 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,11 @@ +services: + inaturalist_vision_api: + container_name: inaturalist_vision_api + build: + target: development + ports: + - 6006:6006 +networks: + default: + external: true + name: inaturalist_default diff --git a/latest_model/.gitkeep b/latest_model/.gitkeep new file mode 100644 index 0000000..e69de29 From 21f600e2b14132c6a4eb53333f845a9cd8e03048 Mon Sep 17 00:00:00 2001 From: Patrick Leary Date: Mon, 9 Mar 2026 14:40:48 -0400 Subject: [PATCH 2/2] move latest_model to mounted volume; set default debug to true and PYTHONUNBUFFERED for printing to console --- Dockerfile | 1 - app.py | 1 + docker-compose.override.yml.example | 9 --------- docker-compose.yml | 15 +++++++++++++++ 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6332ada..fb96980 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,7 +21,6 @@ RUN UWSGI_EMBED_PLUGINS=stats_pusher_statsd pip install -r requirements.txt # Copy app and libs COPY --chown=inaturalist:inaturalist app.py /home/inaturalist/vision COPY --chown=inaturalist:inaturalist lib /home/inaturalist/vision/lib -COPY --chown=inaturalist:inaturalist latest_model* /home/inaturalist/vision/latest_model # Create directories for the log and static content RUN mkdir /home/inaturalist/vision/log diff --git a/app.py b/app.py index 65dc8f2..5e6cd65 100644 --- a/app.py +++ b/app.py @@ -7,6 +7,7 @@ if "APP_SECRET" in os.environ: CONFIG = { "app_secret": os.environ["APP_SECRET"], + "debug": os.environ["DEBUG"], "models": [{ "name": os.environ["MODEL_NAME"], "vision_model_path": os.environ["VISION_MODEL_PATH"], diff --git a/docker-compose.override.yml.example b/docker-compose.override.yml.example index bfdf470..4c56eec 100644 --- a/docker-compose.override.yml.example +++ b/docker-compose.override.yml.example @@ -2,12 +2,3 @@ services: inaturalist_vision_api: environment: APP_SECRET: somesecret - MODEL_NAME: Latest Model - VISION_MODEL_PATH: /home/inaturalist/vision/latest_model/vision.h5 - TAXONOMY_PATH: /home/inaturalist/vision/latest_model/taxonomy.csv - TF_GEO_MODEL_PATH: /home/inaturalist/vision/latest_model/geo.h5 - ELEVATION_H3_R4_PATH: /home/inaturalist/vision/latest_model/elevation_r4_5m.csv - GEO_THRESHOLDS_PATH: /home/inaturalist/vision/latest_model/thresholds.csv - TAXON_RANGES_PATH: /home/inaturalist/vision/latest_model/taxon_range_csvs - SYNONYMS_PATH: /home/inaturalist/vision/latest_model/synonyms.csv - SYNONYMS_TAXONOMY_PATH: /home/inaturalist/vision/latest_model/synonym_taxonomy.csv diff --git a/docker-compose.yml b/docker-compose.yml index 221cd25..b9f682d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,8 +3,23 @@ services: container_name: inaturalist_vision_api build: target: development + environment: + APP_SECRET: somesecret + DEBUG: True + PYTHONUNBUFFERED: 1 + MODEL_NAME: Latest Model + VISION_MODEL_PATH: /home/inaturalist/vision/latest_model/vision.h5 + TAXONOMY_PATH: /home/inaturalist/vision/latest_model/taxonomy.csv + TF_GEO_MODEL_PATH: /home/inaturalist/vision/latest_model/geo.h5 + ELEVATION_H3_R4_PATH: /home/inaturalist/vision/latest_model/elevation_r4_5m.csv + GEO_THRESHOLDS_PATH: /home/inaturalist/vision/latest_model/thresholds.csv + TAXON_RANGES_PATH: /home/inaturalist/vision/latest_model/taxon_range_csvs + SYNONYMS_PATH: /home/inaturalist/vision/latest_model/synonyms.csv + SYNONYMS_TAXONOMY_PATH: /home/inaturalist/vision/latest_model/synonym_taxonomy.csv ports: - 6006:6006 + volumes: + - ./latest_model:/home/inaturalist/vision/latest_model networks: default: external: true