# 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 make build-fx # fx-oracle, fx-ingestor make build-payments # payments-orchestrator make build-gateways # chain, mntx, tgsettle ``` --- ## ๐Ÿ” 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/: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`** ๐Ÿš€