The Dockerfile builds the Vue UI, installs the Python backend, and serves all HTTP surfaces through one TLS listener.
docker build -t cammycam:local .
docker run --rm --name cammycam \
--env-file .env \
-p 443:443/tcp \
-v cammycam-data:/data \
cammycam:local
Open https://<host>/. GraphQL uses /graphql. MCP Streamable HTTP uses
/mcp/ with Authorization: Bearer <CAMMY_MCP_API_KEY>. REST uses /api and
camera streams use /ws; all share TCP 443.
| Port | Protocol | Required | Purpose |
|---|---|---|---|
| 443 | TCP | Yes | UI, REST, GraphQL, MCP, WebSocket, firmware downloads |
| 5353 | UDP | Optional | mDNS discovery when CAMMY_ENABLE_MDNS=true |
| 1883 or 8883 | TCP outbound | Optional | External MQTT broker, plain or TLS |
Do not publish database, firmware-storage, or reset-delivery files as ports. For container mDNS, host networking is usually required because multicast does not cross standard Docker bridge networking reliably.
Required production values:
CAMMY_SECRET_KEY: stable token-signing secret.CAMMY_ADMIN_USER, CAMMY_ADMIN_PASSWORD: first administrator.CAMMY_MCP_API_KEY: independent bearer token for LLM/MCP clients.Storage and runtime:
CAMMY_DB, CAMMY_FIRMWARE_DIR, CAMMY_CERT_DIR,
CAMMY_RESET_TOKEN_FILE: persistent paths under /data by default.CAMMY_FIRMWARE_VERSION: active staged firmware version.CAMMY_PORT, CAMMY_NAME, CAMMY_TZ, LOG_LEVEL: listener and identity.CAMMY_ENABLE_MDNS: enables UDP multicast advertising; default false.MQTT integration uses CAMMY_MQTT_HOST, CAMMY_MQTT_PORT,
CAMMY_MQTT_USER, CAMMY_MQTT_PASSWORD, and CAMMY_MQTT_TLS.
CAMMY_ALLOW_DEFAULT_ADMIN and CAMMY_ALLOW_INSECURE_MCP are development-only.
GET /api/activityPOST /graphql, authenticated with a normal CammyCam access tokenPOST /mcp/, authenticated with CAMMY_MCP_API_KEYPOST /api/event/motion and POST /api/event/detectionMCP tools are search_activity and summarize_activity. Filters include
camera, event kind, object label, time range, confidence, and result limit.
Example MCP client settings:
{
"url": "https://cammy.example/mcp/",
"headers": { "Authorization": "Bearer ${CAMMY_MCP_API_KEY}" }
}
Example GraphQL query:
query RecentBirds {
activities(label: "bird", minConfidence: 0.8, limit: 25) {
cameraId
label
confidence
timestamp
}
}
Supply a regular CammyCam access token as the GraphQL bearer token. Generated
container certificates use an internal local CA; mount trusted certificate files
under CAMMY_CERT_DIR for production hostnames.