# Sendico Development Environment - Setup Guide

Complete Docker Compose + Makefile build system for local development.

## 🎯 What's Included

**13 Services:**
- ✅ Discovery (Service Registry)
- ✅ FX Oracle & FX Ingestor
- ✅ Billing Fees
- ✅ Ledger (Double-Entry Accounting)
- ✅ Payments Orchestrator
- ✅ Chain Gateway (Blockchain)
- ✅ MNTX Gateway (Card Payouts)
- ✅ TGSettle Gateway (Telegram Settlements)
- ✅ Notification
- ✅ BFF (Backend for Frontend / Server)
- ✅ Frontend (Flutter Web)

**Infrastructure:**
- MongoDB Replica Set (3 nodes)
- NATS with JetStream
- Vault (single node, for application data only)

---

## 🚀 Quick Start

```bash
# 1. First time setup
make init

# 2. Start everything
make up

# 3. Initialize Vault (if services need blockchain keys, external API keys)
make vault-init

# 4. Check status
make status

# 5. View frontend
open http://localhost:3000
```

---

## 📋 Prerequisites

- Docker & Docker Compose
- Make
- Go 1.24+ (for local proto generation)
- protoc, protoc-gen-go, protoc-gen-go-grpc (for proto generation)

---

## 🔧 Configuration

### Environment Variables

Edit `.env.dev` (created after `make init`):

```bash
# MongoDB
MONGO_USER=dev_root
MONGO_PASSWORD=dev_password_123

# NATS
NATS_USER=dev_nats
NATS_PASSWORD=nats_password_123

# Vault (for application data only)
VAULT_ADDR=http://dev-vault:8200
```

**IMPORTANT:** These are plaintext credentials for dev infrastructure only!

---

## 📊 Service Ports

**Infrastructure:**
- MongoDB: `localhost:27017`
- NATS: `localhost:4222`
- NATS Monitoring: `localhost:8222`
- Vault: `localhost:8200`

**Services:**
- Discovery: `localhost:9407`
- FX Oracle: `localhost:50051` (gRPC), `localhost:9400` (metrics)
- FX Ingestor: `localhost:9102`
- Billing Fees: `localhost:50060` (gRPC), `localhost:9402` (metrics)
- Ledger: `localhost:50052` (gRPC), `localhost:9401` (metrics)
- Payments Orchestrator: `localhost:50062` (gRPC), `localhost:9403` (metrics)
- Chain Gateway: `localhost:50070` (gRPC), `localhost:9404` (metrics)
- MNTX Gateway: `localhost:50075` (gRPC), `localhost:9405` (metrics), `localhost:8084` (HTTP)
- TGSettle Gateway: `localhost:50080` (gRPC), `localhost:9406` (metrics)
- Notification: `localhost:8081`
- BFF: `localhost:8080`
- Frontend: `localhost:3000`

---

## 🛠️ Common Commands

### Lifecycle

```bash
make up          # Start all services
make down        # Stop all services
make restart     # Restart all services
make status      # Check status
make clean       # Remove everything (containers + volumes)
```

### Development

```bash
# View logs
make logs                      # All services
make logs SERVICE=dev-ledger   # Specific service

# Rebuild after code changes
make rebuild SERVICE=dev-ledger

# Regenerate protobuf
make proto
```

### Selective Startup

```bash
# Start infrastructure only
make infra-up

# Then start services
make services-up

# Or start specific service groups
make build-core      # discovery, ledger, billing-fees, billing-documents
make build-fx        # fx-oracle, fx-ingestor
make build-payments  # payments-orchestrator, payments-quotation, payments-methods
make build-gateways  # chain, tron, aurora, chsettle
make build-backend   # notification, callbacks, bff
```

---

## 🔐 Vault Setup

Vault is **only for application data** (blockchain keys, external API keys).
Infrastructure credentials (MongoDB, NATS) are in `.env.dev`.

### Initialize Vault

```bash
make vault-init
```

This will:
1. Initialize Vault with 1 key share
2. Unseal Vault automatically
3. Save keys to `vault-keys.txt` (NEVER commit this!)
4. Display root token

### Using Vault in Services

Services that need Vault (e.g., Chain Gateway for blockchain keys):
1. Set `VAULT_ADDR` in service environment
2. Use Vault client to fetch secrets at runtime
3. Store secrets in Vault: `kv/data/chain/ethereum/private_key`

---

## 🏗️ Development Workflow

### Typical Day

```bash
# Morning: Start environment
make up

# Work on ledger service
vim api/ledger/internal/service/ledger/posting.go

# Rebuild ledger
make rebuild SERVICE=dev-ledger

# View logs
make logs SERVICE=dev-ledger

# Test
curl http://localhost:9401/health

# End of day
make down
```

### After Changing Protos

```bash
# Regenerate protos
make proto

# Rebuild affected services
make rebuild SERVICE=dev-ledger
make rebuild SERVICE=dev-payments-orchestrator
```

### Frontend Development

For faster iteration, run frontend locally instead of Docker:

```bash
# Start backend services only
make infra-up
make services-up

# Run frontend locally
cd frontend/pweb
flutter run -d chrome
```

---

## 🔍 Debugging

### MongoDB Replica Set Issues

```bash
# Check replica set status
docker exec -it dev-mongo-1 mongosh -u dev_root -p dev_password_123 --eval "rs.status()"

# Reinitialize
make down
make up
docker logs dev-mongo-init
```

### Service Can't Connect to MongoDB

```bash
# Check if replica set is initialized
docker logs dev-mongo-init

# Check MongoDB is healthy
docker ps | grep mongo
```

### Vault Sealed

```bash
# Get unseal key from vault-keys.txt
UNSEAL_KEY=$(grep 'Unseal Key 1:' vault-keys.txt | awk '{print $NF}')

# Unseal
docker exec dev-vault vault operator unseal $UNSEAL_KEY
```

### Service Crash Loop

```bash
# Check logs
make logs SERVICE=dev-ledger

# Check environment variables
docker inspect dev-ledger | grep -A 20 Env

# Rebuild from scratch
make rebuild SERVICE=dev-ledger
```

---

## 📦 Docker Images

All images tagged as `sendico-dev/<service>:latest`:
- `sendico-dev/discovery:latest`
- `sendico-dev/ledger:latest`
- `sendico-dev/billing-fees:latest`
- `sendico-dev/fx-oracle:latest`
- `sendico-dev/fx-ingestor:latest`
- `sendico-dev/payments-orchestrator:latest`
- `sendico-dev/chain-gateway:latest`
- `sendico-dev/mntx-gateway:latest`
- `sendico-dev/tgsettle-gateway:latest`
- `sendico-dev/notification:latest`
- `sendico-dev/bff:latest`
- `sendico-dev/frontend:latest`

---

## 🧪 Testing Full Flow

```bash
# 1. Start everything
make up

# 2. Check all services are healthy
make status

# 3. Test discovery
curl http://localhost:9407/health

# 4. Test ledger
curl http://localhost:9401/health

# 5. Test BFF
curl http://localhost:8080/api/v1/health

# 6. Test frontend
open http://localhost:3000
```

---

## 🗑️ Cleanup

```bash
# Stop everything
make down

# Remove volumes (fresh start)
make clean

# Remove images
docker rmi $(docker images 'sendico-dev/*' -q)
```

---

## 📂 File Structure

```
sendico/
├── docker-compose.dev.yml      # All service definitions
├── .env.dev                    # Plaintext credentials
├── Makefile                    # Build commands
├── SETUP.md                    # This file
├── vault-keys.txt              # Vault keys (gitignored)
└── docker/
    └── dev/
        ├── README.md           # Detailed docs
        ├── mongo.key           # MongoDB keyfile
        ├── vault/
        │   └── config.hcl      # Vault config
        └── *.dockerfile        # Service builds
```

---

## 🆘 Getting Help

```bash
# Show all available commands
make help

# List all services
make list-services

# Check service health
make health
```

---

## 🎓 Next Steps

1. **Initialize Vault with secrets** for Chain Gateway
2. **Seed test data** into MongoDB
3. **Run integration tests**
4. **Add monitoring** (Prometheus/Grafana - optional)
5. **Document API endpoints** in each service

---

## ⚠️ Important Notes

- **Never commit `.env.dev`** - Contains credentials
- **Never commit `vault-keys.txt`** - Contains Vault keys
- **Vault is for app data only** - Not for infrastructure secrets
- **Use `dev-` prefix** for all service names to avoid conflicts
- **MongoDB keyfile** must have `400` permissions

---

## 📝 Troubleshooting Checklist

- [ ] Docker is running
- [ ] Docker Compose v2 is installed (`docker compose version`)
- [ ] `.env.dev` exists and has correct values
- [ ] Vault is initialized and unsealed (`make vault-init`)
- [ ] MongoDB replica set is initialized (`docker logs dev-mongo-init`)
- [ ] All services are healthy (`make status`)
- [ ] No port conflicts on host machine
- [ ] Proto generation succeeded (`make proto`)

---

**Ready to build? Run `make init && make up`** 🚀
