-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
54 lines (52 loc) · 2.44 KB
/
Copy pathdocker-compose.yml
File metadata and controls
54 lines (52 loc) · 2.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# Deploy compose. Every value is interpolated from the environment (Compose also
# auto-loads a sibling `.env` for these `${...}` substitutions), so this file is
# safe to publish — no secrets are hard-coded. The container is NEVER exposed on
# a host port: it is reachable only from the proxy network, and an identity-aware
# authorization proxy (e.g. Pomerium) must front it. See README.md.
services:
parcel-mcp:
image: ${IMAGE:-ghcr.io/jb09/parcel-api-mcp:latest}
container_name: ${CONTAINER_NAME:-parcel-mcp}
restart: unless-stopped
# Each variable is set explicitly so exactly what the app receives is visible
# here. Values come from the host environment / sibling `.env`. Defaults match
# server.py; the required secret has none and must be provided.
environment:
PARCEL_API_BASE: ${PARCEL_API_BASE:-https://api.parcel.app/external}
PARCEL_API_KEY: ${PARCEL_API_KEY:?PARCEL_API_KEY is required}
DEFAULT_FILTER_MODE: ${DEFAULT_FILTER_MODE:-active}
READ_ONLY: ${READ_ONLY:-false}
PARCEL_TIMEOUT: ${PARCEL_TIMEOUT:-15}
STARTUP_TEST: ${STARTUP_TEST:-false}
REQUIRE_POMERIUM_IDENTITY: ${REQUIRE_POMERIUM_IDENTITY:-false}
POMERIUM_IDENTITY_HEADER: ${POMERIUM_IDENTITY_HEADER:-x-pomerium-assertion,x-pomerium-jwt-assertion}
POMERIUM_JWKS_URL: ${POMERIUM_JWKS_URL:-}
POMERIUM_AUDIENCE: ${POMERIUM_AUDIENCE:-}
POMERIUM_ISSUER: ${POMERIUM_ISSUER:-}
# DNS-rebinding guard (MCP SDK 2.x). Empty = guard off (the app logs a
# warning). Set it to the Host the app actually RECEIVES — behind a proxy
# that is usually the upstream address below, not the public route name.
MCP_ALLOWED_HOSTS: ${MCP_ALLOWED_HOSTS:-}
MCP_ALLOWED_ORIGINS: ${MCP_ALLOWED_ORIGINS:-}
# No published `ports:` on purpose — do not bind a public interface. The
# authorization proxy reaches the server by container name over the internal
# `proxy` network below; the app listens on port 8080.
networks:
- proxy
labels:
# Opt in to Watchtower so weekly CI rebuilds are pulled automatically.
- "com.centurylinklabs.watchtower.enable=true"
healthcheck:
test:
- CMD
- python
- -c
- "import urllib.request; urllib.request.urlopen('http://localhost:8080/healthz').read()"
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
networks:
proxy:
external: true
name: ${PROXY_NETWORK:-pomerium}