docs: add internal deployment guide, remove temp debug files
All checks were successful
Build and Push Monarch MCP Docker Image / build (push) Successful in 11s

- Delete BUG-REPORT.md (bug resolved)
- Delete MonarchAPI.md (research complete, library chosen)
- Add .deployment.md with Komodo stack ops, auth notes, and troubleshooting
This commit is contained in:
2026-05-05 03:27:20 +00:00
parent 9a6a0ac700
commit d704f5b82b

207
.deployment.md Normal file
View File

@@ -0,0 +1,207 @@
# Monarch MCP Custom — Deployment Guide
> **Internal / Private.** Not for public distribution. This doc covers how the local Komodo deployment works and how to operate it.
---
## Architecture
```
Git push to main
|
v
Gitea Actions (.gitea/workflows/build.yaml)
|
v
Docker build + push to gitea.ext.ben.io/b3nw/monarch-mcp-custom:latest
|
v
Komodo Stack "monarch-mcp" pulls image and deploys
|
v
Container runs on host port 8070 (mapped to container 8000)
```
---
## Gitea Build Workflow
**File:** `.gitea/workflows/build.yaml`
Triggers on every push to `main` or `master`:
1. Checks out the repo
2. Logs into `gitea.ext.ben.io` container registry (uses `secrets.CR_PAT`)
3. Builds and pushes `gitea.ext.ben.io/b3nw/monarch-mcp-custom:latest`
### Manual Build Trigger
If you need to force a rebuild without a code change, push an empty commit:
```bash
git commit --allow-empty -m "chore: trigger rebuild"
git push origin main
```
Or edit `.gitea/workflows/build.yaml` and push.
---
## Komodo Stack Deployment
**Stack Name:** `monarch-mcp`
**Server:** `6942f06939bbe4eb5a9f21aa` (main Docker host)
**Image:** `gitea.ext.ben.io/b3nw/monarch-mcp-custom:latest`
**Host Port:** `8070` → Container `8000`
### Environment Variables (from `.env`)
| Variable | Purpose | Source |
|---|---|---|
| `MONARCH_TOKEN` | Session token for Monarch Money API | Extract from browser DevTools |
| `MONARCH_EMAIL` | Account email for re-auth fallback | Plaintext |
| `MONARCH_PASSWORD` | Account password for re-auth fallback | Plaintext |
| `MONARCH_MFA_SECRET` | TOTP secret for re-auth fallback | Plaintext (from 2FA setup) |
| `MONARCH_PORT` | Host port mapping (default 8070) | `.env` |
| `LOG_LEVEL` | Python logging level (INFO/DEBUG) | `.env` |
### How to Redeploy
**Via Komodo UI:**
1. Navigate to Stacks → monarch-mcp
2. Click **Deploy** (or **Pull** then **Deploy** to force fresh image)
**Via MCP / API:**
```python
# Using the komodo_mcp tool
DeployStack(stack="monarch-mcp")
```
**Force fresh image pull:**
The stack has `auto_pull: true`, so a standard Deploy should pull the latest image. If not, use **Pull Stack** first.
---
## Container Operations
### Check Logs
**Via Komodo UI:**
Stack → monarch-mcp → Logs → Select service `monarch-mcp`
**Via Komodo API:**
```python
GetStackLog(stack="monarch-mcp", services=["monarch-mcp"], tail=50)
```
### Health Check
The container exposes a health endpoint:
```bash
curl http://localhost:8070/health
# Expected: {"status": "ok"}
```
Docker compose healthcheck config (in `compose.yaml`):
- Interval: 30s
- Timeout: 10s
- Retries: 3
- Start period: 10s
---
## Local Development
### Install Dependencies
```bash
uv sync
```
### Run Locally
```bash
uv run python src/monarch_mcp_custom/server.py
# or
python -m monarch_mcp_custom.server
```
### Test the Library Directly
```bash
uv run python -c "
from monarchmoney import MonarchMoney, MonarchMoneyEndpoints
print(MonarchMoneyEndpoints.BASE_URL)
"
```
---
## Authentication Notes
### Token Source
The `MONARCH_TOKEN` is a session token extracted from browser DevTools:
1. Log into Monarch Money at `https://app.monarch.com`
2. Open DevTools → Network → filter by `graphql`
3. Click any request → Headers → `Authorization: Token <value>`
4. Copy the token value (without `Token ` prefix)
### Token Lifetime
Tokens appear to last several months. If API calls start returning 401:
1. Extract a fresh token from the browser
2. Update the `MONARCH_TOKEN` env var in Komodo
3. Redeploy the stack
### Re-Authentication Fallback
If token auth fails, the MCP server will attempt to re-authenticate using `MONARCH_EMAIL`, `MONARCH_PASSWORD`, and `MONARCH_MFA_SECRET`. This is subject to rate limiting by Monarch.
---
## Troubleshooting
### 401 Unauthorized
- Token expired? Extract fresh token from browser.
- Check `MONARCH_TOKEN` is set correctly in Komodo stack env.
- Verify library version in startup logs (should show `monarchmoney 1.3.2+` and `BASE_URL: https://api.monarch.com`).
### 429 Rate Limited
- Monarch Money rate-limits login attempts.
- Wait ~15-60 seconds before retrying.
- The retry decorator handles 429 with a 15s backoff.
### Image Not Updating
- Check Gitea Actions for build failures.
- Force a **Pull Stack** in Komodo before deploying.
- Verify the commit hash in Komodo matches the latest.
### Build Fails
- Check `.gitea/workflows/build.yaml` logs in Gitea.
- Ensure `secrets.CR_PAT` is valid for `gitea.ext.ben.io`.
---
## Useful Commands
```bash
# Quick health check
curl -s http://localhost:8070/health | jq .
# Check running container
docker ps | grep monarch-mcp
# Inspect container logs directly on host
docker logs monarch-mcp-custom --tail 50 -f
# Restart container
docker restart monarch-mcp-custom
```
---
## Related Resources
- **Repo:** `git.local.ben.io:b3nw/monarch-mcp-custom.git`
- **Container Registry:** `gitea.ext.ben.io/b3nw/monarch-mcp-custom`
- **Komodo Stack:** `monarch-mcp` (ID: `694b492b6e2254e6ad636e9b`)
- **Upstream Library:** https://github.com/bradleyseanf/monarchmoneycommunity