From b80a860087e1e81f04f43c57f6f5f527c6891065 Mon Sep 17 00:00:00 2001 From: Anne Haley Date: Thu, 25 Jun 2026 17:25:20 +0000 Subject: [PATCH 1/3] build: Bump `large-image` version --- pyproject.toml | 4 ++-- uv.lock | 34 +++++++++++++++++----------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e32c055f..4f0f24a6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,8 +33,8 @@ dependencies = [ # Needed for GeoDjango and "large-image[gdal]" 'gdal==3.12.3.1', "geopandas==1.1.3", - "large-image-converter==1.34.1", - "large-image[gdal]==1.34.1", + "large-image-converter==1.34.3", + "large-image[gdal]==1.34.3", "matplotlib==3.10.9", # for raster colormaps "networkx==3.6.1", "numpy==2.4.3", diff --git a/uv.lock b/uv.lock index bd21712b..a309ffe1 100644 --- a/uv.lock +++ b/uv.lock @@ -1941,8 +1941,8 @@ requires-dist = [ { name = "geoai-py", marker = "extra == 'tasks'", specifier = "==0.37.2" }, { name = "geopandas", specifier = "==1.1.3" }, { name = "ipython", marker = "extra == 'development'", specifier = "==9.13.0" }, - { name = "large-image", extras = ["gdal"], specifier = "==1.34.1" }, - { name = "large-image-converter", specifier = "==1.34.1" }, + { name = "large-image", extras = ["gdal"], specifier = "==1.34.3" }, + { name = "large-image-converter", specifier = "==1.34.3" }, { name = "matplotlib", specifier = "==3.10.9" }, { name = "networkx", specifier = "==3.6.1" }, { name = "numpy", specifier = "==2.4.3" }, @@ -2820,7 +2820,7 @@ wheels = [ [[package]] name = "large-image" -version = "1.34.1" +version = "1.34.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cachetools" }, @@ -2829,9 +2829,9 @@ dependencies = [ { name = "pillow" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/12/d9e530f281eac316cf86daf526d96e632f399d5cca7d8d581ebc4b095244/large_image-1.34.1.tar.gz", hash = "sha256:e690ad0e895914063aff5f16cb1aed8760a44163f8d109c3fedee8b1c44e53eb", size = 878618, upload-time = "2026-03-24T19:13:49.1Z" } +sdist = { url = "https://files.pythonhosted.org/packages/59/d3/9f2f6d0f73508b45e86b85e03f9315dfe4bafe2cb8aa416ce69b3f90d77d/large_image-1.34.3.tar.gz", hash = "sha256:a1f2759dda327d27e52c3f317d53d28e92199de8e55692f353bcedbfe1a4ab17", size = 873397, upload-time = "2026-06-24T17:19:11.199Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/f1/53e45fe98c55b5bf97b707bb5abe73a9d5dd9f53067ff86c2b2c99b2fbe5/large_image-1.34.1-py3-none-any.whl", hash = "sha256:13d0b54bf32c60253cf42df452235ec10175a72ce5008d31953eb6ccde3ed335", size = 121171, upload-time = "2026-03-24T19:13:46.603Z" }, + { url = "https://files.pythonhosted.org/packages/c2/9e/beb061c5dfb58b9ffa86d1921c5872bb7a6bbfc173f2d29abeadfbbe36ec/large_image-1.34.3-py3-none-any.whl", hash = "sha256:320340ad5e7a24a06c39d5354576d77b9133bb1dbeeca968189aa42689ea0c90", size = 121434, upload-time = "2026-06-24T17:19:08.77Z" }, ] [package.optional-dependencies] @@ -2844,7 +2844,7 @@ zarr = [ [[package]] name = "large-image-converter" -version = "1.34.1" +version = "1.34.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "large-image-source-tiff" }, @@ -2853,14 +2853,14 @@ dependencies = [ { name = "pyvips" }, { name = "tifftools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/28/b0/337c14af8f246518222bd64e6215aca6f703924a75bfb6e6cf25ab20b019/large_image_converter-1.34.1.tar.gz", hash = "sha256:3eb152d6f516a432742247cc24ed22504d8663f61812760d6f87129e3544330d", size = 26263, upload-time = "2026-03-24T19:14:09.934Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/68/72d51e65fa169df6e2b94dbdaaaf7121b934eaa8db54e5c50a838d458a13/large_image_converter-1.34.3.tar.gz", hash = "sha256:4c5f6b0d111e2f36d94594e49adca6b9dbdbecb7804afc63d15a743c2a4ab540", size = 26271, upload-time = "2026-06-24T17:19:30.87Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/10/130b13aabe56375361e54280cb082e4946bf836298ddd6e6bfc035afcecf/large_image_converter-1.34.1-py3-none-any.whl", hash = "sha256:24d794219f22cd56c4616c97f3a587abbc64765733d702b6be54e9258fc17a41", size = 26399, upload-time = "2026-03-24T19:14:08.112Z" }, + { url = "https://files.pythonhosted.org/packages/3a/4b/a79bf5050be617e2e2323e06e5d266f2c45eb3d2c4827af590200962c706/large_image_converter-1.34.3-py3-none-any.whl", hash = "sha256:373eaeae8df888f560580faffe5735c02343ff5a3877e04c591b73ae483b9e6c", size = 26400, upload-time = "2026-06-24T17:19:29.271Z" }, ] [[package]] name = "large-image-source-gdal" -version = "1.34.1" +version = "1.34.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gdal" }, @@ -2868,28 +2868,28 @@ dependencies = [ { name = "packaging" }, { name = "pyproj" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/e1/29be2d830fb94e9edd9567a734c2b8abea9db5da4a14886aa9cdd9c0e3a8/large_image_source_gdal-1.34.1.tar.gz", hash = "sha256:3587a457f872b5a7993cc5168986a59146ac5d52c6df1bf14b2a4db49d2b995c", size = 23271, upload-time = "2026-03-24T19:14:45.545Z" } +sdist = { url = "https://files.pythonhosted.org/packages/23/51/69b5813b103ad992a3b40a316d236f24c9ddec1354b16db7da2004c822a7/large_image_source_gdal-1.34.3.tar.gz", hash = "sha256:0cbb6cab2ab9233130c89e9babbdc3db04002d4d120bc0b5bae9858c17cf0388", size = 23371, upload-time = "2026-06-24T17:20:05.73Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/8b/1ba4301af1dbfe74ca6825a48c97c554b6e0dc043f3f3e9a25429133425c/large_image_source_gdal-1.34.1-py3-none-any.whl", hash = "sha256:4bbb3f3c15e54f2e655d775079a56dfeb5848bb73db23cb02009096405606308", size = 20730, upload-time = "2026-03-24T19:14:43.84Z" }, + { url = "https://files.pythonhosted.org/packages/25/31/cd480e01b914246c82fdd2ddd9734748f919a9272b516609b78067a11e30/large_image_source_gdal-1.34.3-py3-none-any.whl", hash = "sha256:77f576e383e4ed9e32231c0c384cb986a61aa418c5e7ef210419cd1b83b1e9bf", size = 20729, upload-time = "2026-06-24T17:20:03.996Z" }, ] [[package]] name = "large-image-source-tiff" -version = "1.34.1" +version = "1.34.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "large-image" }, { name = "pylibtiff" }, { name = "tifftools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/e6/eec6435b855ce0a3cac93168d11680f8500a1f04743a3b9cdcc984e42503/large_image_source_tiff-1.34.1.tar.gz", hash = "sha256:b35717cac3588ea8bd95ff1f7f44c1dedc0b462f5bc9d7a372214b91bc26f5e8", size = 27348, upload-time = "2026-03-24T19:15:48.6Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/cf/61d9564a1fe52181d40f3f0e4c0c4ad6bfef7a0319a68f4f0257f084e6a5/large_image_source_tiff-1.34.3.tar.gz", hash = "sha256:c8c13957effbfaaaaf2e82009a8f8e7e2a0c082cf170310f74f42e439c397bc3", size = 27462, upload-time = "2026-06-24T17:21:02.325Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/4d/772fe6c024a05c6f0897dc603ee57bb7f7d6b2b49c27ca3f91862b927599/large_image_source_tiff-1.34.1-py3-none-any.whl", hash = "sha256:3799859a2b8aa05b40a4ebd8a087ac82726009fbf0435905de6fccdf95f89bdb", size = 25706, upload-time = "2026-03-24T19:15:46.756Z" }, + { url = "https://files.pythonhosted.org/packages/90/5c/cd2d433bfb03b62424d8005d2cd5688b758e91806a3793575ba78d6a0f45/large_image_source_tiff-1.34.3-py3-none-any.whl", hash = "sha256:f828a9af34e88a7ad7af0ca5709f9fa6c7eec4c5fdf825cd8ce493c3ebe2cb6a", size = 25706, upload-time = "2026-06-24T17:21:00.848Z" }, ] [[package]] name = "large-image-source-zarr" -version = "1.34.1" +version = "1.34.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "imagecodecs-numcodecs" }, @@ -2897,9 +2897,9 @@ dependencies = [ { name = "numcodecs" }, { name = "zarr" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/a9/73e5b2c4cee4ebbbc6ff96b27dcf65fedfdb370ca9fdfca7a5a1ccb5a349/large_image_source_zarr-1.34.1.tar.gz", hash = "sha256:dfa98c7ffdc487e784fafb96e21f1e0734471e613ae70c0fda982008e810bbf3", size = 23238, upload-time = "2026-03-24T19:16:07.117Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/5e/e9e6d5ba2cb993dc2b5b1ea50ac1048d28ad7d1a4f8484407f556ce9f74d/large_image_source_zarr-1.34.3.tar.gz", hash = "sha256:db658d78cabc23ed38ec724f784a1487e7434bee9c2935c00ec650690eaf4198", size = 23354, upload-time = "2026-06-24T17:21:17.767Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/b6/22a83c3477eee1c8512042627f3456d668a2c63b7d2815080e834b4d616b/large_image_source_zarr-1.34.1-py3-none-any.whl", hash = "sha256:68308a0c7eb6152934a3b8e46b9b506b9a54c9eea83fc8dd70c7ada99f58245e", size = 20175, upload-time = "2026-03-24T19:16:05.428Z" }, + { url = "https://files.pythonhosted.org/packages/ef/9d/1b623724101e01afccd7d57e48f68d64515e722293170e8d113babd082d1/large_image_source_zarr-1.34.3-py3-none-any.whl", hash = "sha256:3b7bf86cc2767d11867e9805ddeb9422867009829211c9f2d5080cac0e25731a", size = 20174, upload-time = "2026-06-24T17:21:16.71Z" }, ] [[package]] From 60cd5514bc1b4b597df9333aa990e2ee76740a18 Mon Sep 17 00:00:00 2001 From: Anne Haley Date: Thu, 25 Jun 2026 17:26:16 +0000 Subject: [PATCH 2/3] feat: Re-enable redis cache for large-image --- uvdat/settings/base.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/uvdat/settings/base.py b/uvdat/settings/base.py index 92f5d3bb..2ccf242e 100644 --- a/uvdat/settings/base.py +++ b/uvdat/settings/base.py @@ -157,6 +157,10 @@ } } +# Large image cache with Redis +LARGE_IMAGE_CACHE_BACKEND = "redis" +LARGE_IMAGE_CACHE_REDIS_URL = env.url("DJANGO_REDIS_URL").geturl() + UVDAT_WEB_URL: str = env.url("DJANGO_UVDAT_WEB_URL").geturl() UVDAT_ENABLE_FLOOD_SIMULATION: bool = env.bool("DJANGO_UVDAT_ENABLE_FLOOD_SIMULATION", default=True) UVDAT_ENABLE_FLOOD_NETWORK_FAILURE: bool = env.bool( From 9707ebe3830cae67107e79b377d5d404333f22e9 Mon Sep 17 00:00:00 2001 From: Anne Haley Date: Thu, 25 Jun 2026 17:29:31 +0000 Subject: [PATCH 3/3] feat: Set redis max memory policy to "volatile-lru" --- docker-compose.yml | 1 + terraform/django.tf | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index f5e1afad..c3749eef 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -48,6 +48,7 @@ services: redis: image: redis:alpine + command: ["redis-server", "--maxmemory", "4096MB", "--maxmemory-policy", "volatile-lru"] healthcheck: test: ["CMD", "redis-cli", "ping"] start_period: 30s diff --git a/terraform/django.tf b/terraform/django.tf index cb41cd9d..8b6de871 100644 --- a/terraform/django.tf +++ b/terraform/django.tf @@ -40,6 +40,10 @@ module "django" { resource "heroku_addon" "redis" { app_id = module.django.heroku_app_id plan = "heroku-redis:mini" + + config = { + maxmemory_policy = "volatile-lru" + } } output "dns_nameservers" {