# Sendico Development Environment

Docker Compose + Makefile build system for local development.

## Architecture

**Infrastructure:**
- MongoDB replica set (3 nodes) - credentials in `.env.dev`
- NATS with JetStream - credentials in `.env.dev`
- Vault (single node) - for application data ONLY (blockchain keys, external API keys)

**Services:**
- Discovery, Ledger, Billing Fees, Billing Documents, FX Oracle, Payments Orchestrator
- Chain Gateway, MNTX Gateway, TGSettle Gateway
- FX Ingestor, Notification, BFF (Server), Callbacks, Frontend

## Quick Start

```bash
# 1. Initialize environment (first time)
make init

# 2. Start all services
make up

# 3. Initialize Vault (if services need it for application data)
make vault-init

# 4. View logs
make logs SERVICE=ledger

# 5. Stop everything
make down
```

## Credentials

All in `.env.dev` (plaintext for dev):
- MongoDB: `dev_root` / `dev_password_123`
- NATS: `dev_nats` / `nats_password_123`
- Vault: Run `make vault-init` to get root token

## Common Commands

```bash
make build                  # Build all images
make up                     # Start environment
make down                   # Stop environment
make logs SERVICE=ledger    # View service logs
make rebuild SERVICE=ledger # Rebuild specific service
make proto                  # Regenerate protobuf
make clean                  # Remove everything
make status                 # Check service status
```

## Vault Usage

**Vault is ONLY for application data**, not infrastructure secrets!

Examples:
- Blockchain private keys (Chain Gateway)
- External API keys (MNTX, TGSettle)
- Webhook signing secrets (Callbacks)
- Production-like secrets

Infrastructure (MongoDB, NATS) uses plain `.env.dev` credentials.

Callbacks, BFF, Chain, and TRON run Vault Agent sidecars with AppRole.
Set the corresponding `*_VAULT_ROLE_ID` and `*_VAULT_SECRET_ID` values in `.env.dev`.

## Network

All services on `sendico-dev` network. Vault also on `cicd` network to connect to infra Vault if needed.

## Rebuilding Services

After code changes:

```bash
# Rebuild specific service
make rebuild SERVICE=ledger

# Or manually
docker compose -f docker-compose.dev.yml build ledger
docker compose -f docker-compose.dev.yml up -d --force-recreate ledger
```

## Adding New Services

1. Create Dockerfile: `ci/dev/yourservice.dockerfile`
2. Add service to `docker-compose.dev.yml`
3. Use environment variables from `.env.dev`
4. Connect to `sendico-dev` network

## Troubleshooting

**MongoDB replica set not initializing:**
```bash
make down
make up
# Wait for health checks, then:
docker logs dev-mongo-init
```

**Vault sealed:**
```bash
make vault-init
# Save the unseal key and root token from vault-keys.txt
```

**Service can't connect to MongoDB:**
- Check replica set: `docker exec -it dev-mongo-1 mongosh -u dev_root -p dev_password_123 --eval "rs.status()"`
- Ensure `dev-mongo-init` completed: `docker ps -a | grep init`

**Proto generation errors:**
```bash
make proto
# Check output for missing dependencies
```

## Files

- `docker-compose.dev.yml` - All services
- `.env.dev` - Plaintext credentials
- `Makefile` - Build commands
- `ci/dev/*.dockerfile` - Service builds
- `ci/dev/mongo.key` - MongoDB replica set key
- `ci/dev/vault/config.hcl` - Vault config
