Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
477cee6
Get containers running and yearly + monthly examples running
manuvanegas Aug 29, 2025
a4eb6eb
Update .gitignore
manuvanegas Mar 13, 2026
29814b9
Add Titiler as internal service + Directory overhaul
manuvanegas Mar 13, 2026
3b8b557
remove GeoServer, wire TiTiler, externalize tile/storage settings
manuvanegas Apr 1, 2026
9c2e084
upgrade to Python 3.13 and Pydantic v2
manuvanegas Apr 1, 2026
c040b46
Migrate to Pydantic v2 stateless models, remove compute layer
manuvanegas Apr 1, 2026
80beebc
Background tasks and metadata/index IO support
manuvanegas Apr 1, 2026
4c64ed8
Subdivide core services, add tile streaming + extract-once/analyze-ma…
manuvanegas Apr 1, 2026
392a471
v3 API — metadata, tile proxy, async timeseries pipeline
manuvanegas Apr 1, 2026
b7ab570
Wire V3 router, use asynccontextmanager lifespan; add placeholder `cr…
manuvanegas Apr 1, 2026
84ed0a0
Add integration and unit tests
manuvanegas Apr 1, 2026
1ac4562
Fix: Handle NaN values at JSON serialization
manuvanegas Apr 10, 2026
5a6cce8
Add Redis job store service
manuvanegas Apr 15, 2026
11c8557
Add RedisJobStore tests and fixture
manuvanegas Apr 15, 2026
0d07c3e
Fix: handle point and sub-pixel geometries
manuvanegas Apr 22, 2026
c0195f6
Fix area calculation and use pyproj.CRS to detect geograph crs
manuvanegas Apr 22, 2026
bf9c3b0
Normalize timesteps and strip base_series from status endpoint
manuvanegas Apr 22, 2026
333c0b7
Add colorbar support and per-variable colormap
manuvanegas Apr 28, 2026
3e3d76c
Address Copilot reviewer's comments
manuvanegas May 26, 2026
c49952d
Move metadata to deploy context and update Dockerfile
manuvanegas May 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Git
.git/
.github/

# Python caches and environments
__pycache__/
*.pyc
*.pyo
*.pyd
venv/
.venv/
env/

# IDE and OS files
.DS_Store
.vscode/
.idea/

# Local Data and Logs
img_logs/
*.log

# Tests
timeseries/app/tests/

# Deployment configs (we only COPY what we need)
deploy/compose/
docker-compose.yml
no_overwrite_dockercompose.yml
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
.DS_Store
img_logs
# backup files
*~
.swp
Expand Down
41 changes: 23 additions & 18 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,34 +1,39 @@
include config.mk
-include config.mk # use a minus (-) so Make doesn't crash if it's missing

UID=$(shell id -u)
GID=$(shell id -g)
DOCKER_SHARE_MOUNT=img_logs

GEOSERVER_ADMIN_PASSWORD_PATH=geoserver/docker/secrets/geoserver_admin_password
DOCKER_SHARE_MOUNT=docker/shared
# Set the default ENVIRONMENT to dev if it hasn't been set by config.mk or the CLI
ENVIRONMENT ?= dev

.PHONY: help
help: ##- Instructions for using this Makefile. Run ./configure {dev|staging|prod} first
.PHONY: help init build deploy

# Make 'help' the default target if someone just types `make`
.DEFAULT_GOAL := help

help: ##- Instructions for using this Makefile.
@echo "usage: make [target] ..."
@echo "Run 'make init' first to generate your local config.mk file."
@echo "targets:"
@sed -e '/#\{2\}-/!d; s/\\$$//; s/:[^#\t]*/:/; s/#\{2\}- *//' $(MAKEFILE_LIST)

.PHONY: build
build: docker-compose.yml | $(GEOSERVER_ADMIN_PASSWORD_PATH) ##- Build and pull the required docker images
docker compose build --pull
# Target to physically create the config.mk file
config.mk:
@echo "Generating default config.mk..."
@echo "ENVIRONMENT=dev" > config.mk
@echo "# Change to 'prod' for production deployment" >> config.mk

$(GEOSERVER_ADMIN_PASSWORD_PATH):
echo "Creating geoserver secret"; \
mkdir -p geoserver/docker/secrets; \
echo -n $$(openssl rand -base64 22) > geoserver/docker/secrets/geoserver_admin_password
init: config.mk ##- Initialize the local workspace with default configuration files
@echo "Initialized config.mk. You can edit it now, or just run 'make deploy'."

docker-compose.yml: deploy/base.yml deploy/$(ENVIRONMENT).yml timeseries/deploy/Dockerfile config.mk
build: deploy/compose/base.yml deploy/compose/$(ENVIRONMENT).yml deploy/Dockerfile
@echo "Building for ENVIRONMENT: $(ENVIRONMENT)"
case "$(ENVIRONMENT)" in \
dev|prod) docker compose -f deploy/base.yml -f "deploy/$(ENVIRONMENT).yml" --project-directory . config > docker-compose.yml;; \
dev|prod) docker compose -f deploy/compose/base.yml -f "deploy/compose/$(ENVIRONMENT).yml" --project-directory . config > docker-compose.yml;; \
*) echo "invalid environment. must be dev or prod" 1>&2; exit 1;; \
esac
docker compose build --pull

.PHONY: deploy
deploy: build ##- build and deploy the web app
deploy: build ##- build and deploy the web app
mkdir -p $(DOCKER_SHARE_MOUNT)
docker compose up -d

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ make deploy
Try out the analysis endpoint

```bash
http --json POST localhost:8002/datasets/yearly < yearly.json
http --json POST localhost:8002/datasets/monthly < monthly.json
http --json POST localhost:8001/timeseries < timeseries/app/tests/data/requests/yearly.json
http --json POST localhost:8002/timeseries < timeseries/app/tests/data/requests/monthly.json
```

Run the tests
Expand Down
16 changes: 0 additions & 16 deletions configure

This file was deleted.

25 changes: 25 additions & 0 deletions deploy/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
FROM python:3.13

ARG ENVIRONMENT
ENV ENVIRONMENT="${ENVIRONMENT}"

RUN apt-get update && apt-get install -y libgdal-dev && rm -rf /var/lib/apt/lists/*

WORKDIR /code

RUN pip install --no-cache-dir --upgrade pip

COPY deploy/requirements /code/requirements

RUN mkdir /shared && \
pip install --no-cache-dir \
-r requirements/base.txt -r requirements/${ENVIRONMENT}.txt

COPY deploy/metadata/${ENVIRONMENT}.yml /code/metadata.yml
COPY deploy/logging/${ENVIRONMENT}.yml /code/config/logging.yml
COPY deploy/settings/${ENVIRONMENT}.yml /code/config/app_settings.yml
COPY deploy/colormaps/custom.json /code/config/colormaps.json

COPY timeseries/app /code/app

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--reload"]
10 changes: 10 additions & 0 deletions deploy/Dockerfile.titiler
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
FROM ghcr.io/developmentseed/titiler:latest

COPY titiler_custom/ /titiler_custom/
COPY deploy/colormaps/custom.json /titiler_custom/custom.json

RUN python3 /titiler_custom/build_colormaps.py

WORKDIR /titiler_custom

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
14 changes: 0 additions & 14 deletions deploy/base.yml

This file was deleted.

3 changes: 3 additions & 0 deletions deploy/colormaps/custom.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"skope-precip": ["#B5834A", "#CDAA78", "#DEC499", "#EFE0CA", "#D8EEEA", "#9ECEC6", "#5CAFA8", "#358C87"]
}
36 changes: 36 additions & 0 deletions deploy/compose/base.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
services:
server:
build:
context: .
dockerfile: deploy/Dockerfile
restart: always
environment:
REDIS_URL: redis://redis:6379
volumes:
- ./img_logs:/shared
networks:
- internal_geospatial_net # Internal network to see Titiler
- default # External access to reach S3 and serve the frontend
redis:
image: redis:7-alpine
command: redis-server --save "" --appendonly no
restart: always
networks:
- internal_geospatial_net

titiler:
build:
context: .
dockerfile: deploy/Dockerfile.titiler
restart: always
environment:
CPL_VSIL_CURL_ALLOWED_EXTENSIONS: .tif,.ovr
GDAL_DISABLE_READDIR_ON_OPEN: EMPTY_DIR
AWS_NO_SIGN_REQUEST: YES
networks:
# Titiler is ONLY on the internal network.
- internal_geospatial_net

networks:
internal_geospatial_net:
driver: bridge
17 changes: 17 additions & 0 deletions deploy/compose/dev.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
services:
server:
build:
args:
ENVIRONMENT: dev
image: openskope/skope-api:latest
volumes:
- ./timeseries/app:/code/app
- ./timeseries/metadata.yml:/code/metadata.yml
- ../bnd_data.nosync:/data
- ./deploy/settings/dev.yml:/code/config/app_settings.yml
- ./deploy/colormaps/custom.json:/code/config/colormaps.json
ports:
- "127.0.0.1:8001:8000"
titiler:
volumes:
- ../bnd_data.nosync:/data
13 changes: 0 additions & 13 deletions deploy/prod.yml → deploy/compose/prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,3 @@ services:
- /projects/skope/datasets:/data
ports:
- "0.0.0.0:8001:8000"
geoserver:
restart: always
ports:
- 0.0.0.0:8600:8080/tcp
environment:
EXISTING_DATA_DIR: "true"
CSRF_WHITELIST: "geoserver.openskope.org"
GEOSERVER_DATA_DIR: "/data/geoserver/state"
volumes:
- /projects/skope/datasets:/projects/skope/datasets:rw
- /data/geoserver/state:/data/geoserver/state:rw
- ./geoserver/docker/secrets/geoserver_admin_password:/run/secrets/geoserver_admin_password:ro
- ./geoserver/settings:/settings:rw
14 changes: 0 additions & 14 deletions deploy/dev.yml

This file was deleted.

File renamed without changes.
File renamed without changes.
Loading