2025-11-08 14:08:46 +01:00
# Docker Development Environment
The Docker stack powers `scripts/dev.sh` using containerized services. Every boot spins up a fresh Base Sepolia fork, redeploys contracts, seeds liquidity, and launches the live-reload services behind Caddy on port 8081.
## Service Topology
- `anvil` – Base Sepolia fork with optional mnemonic from `onchain/.secret.local`
2026-02-03 12:07:28 +01:00
- `bootstrap` – one-shot job running `DeployLocal.sol` , seeding liquidity, priming blocks, and writing shared env files (uses `scripts/bootstrap-common.sh` )
- `postgres` – PostgreSQL 16 database for Ponder indexer state
- `ponder` – `npm run dev` for the indexer (port 42069)
- `webapp` – Vite dev server for `web-app` (port 5173)
- `landing` – Vite dev server for landing page (port 5174)
- `txn-bot` – automation loop plus Express status API (port 43069)
- `caddy` – reverse proxy at `http://localhost:8081` , routing `/app/` → webapp, `/api/graphql` → ponder, `/api/rpc` → anvil, `/` → landing
2025-11-08 14:08:46 +01:00
All containers mount the repository so code edits hot-reload exactly as the local script. Named volumes keep `node_modules` caches between restarts.
## Prerequisites
### Linux
```bash
# Install Docker Engine
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# Logout and login again for group changes to take effect
```
### Mac
```bash
# Install Colima (open-source Docker Desktop alternative)
brew install colima docker docker-compose
# Start Colima VM with recommended resources
colima start --cpu 4 --memory 8 --disk 100
# Verify installation
docker ps
```
## Launching
**Recommended**: Use the helper script
```bash
./scripts/dev.sh start
```
This will:
1. Build kraiken-lib
2. Start Anvil (Base Sepolia fork)
3. Deploy contracts via bootstrap
4. Start Ponder (indexes events)
5. Start web-app, landing, txn-bot
6. Start Caddy reverse proxy on port 8081
**Startup time**: ~6 minutes on first run (includes Ponder indexing 300+ blocks)
**Manual approach** (not recommended):
```bash
docker compose up -d
```
**Stopping the stack:**
```bash
./scripts/dev.sh stop
# or
docker compose down
```
**Quick restarts for development:**
- `./scripts/dev.sh restart --light` - Fast restart (~10-20s): only webapp + txnbot, preserves Anvil/Ponder state. **Use for frontend changes.**
- `./scripts/dev.sh restart --full` - Full restart (~6 min): redeploys contracts, fresh state. **Use for contract changes.**
**Important**: Every full restart redeploys contracts and rewrites `services/ponder/.env.local` and `tmp/containers/txnBot.env` .
### Access Points (via Caddy on port 8081)
**For reviewing code changes in your browser:**
- Landing page: `http://localhost:8081/` (marketing site)
- Web-app: `http://localhost:8081/app/` (staking interface - **use this for testing** )
- GraphQL Playground: `http://localhost:8081/api/graphql`
- TxnBot status: `http://localhost:8081/api/txn/status`
**Direct RPC access:**
- Anvil RPC: `http://localhost:8081/api/rpc` (or `http://localhost:8545` directly)
**Hot reload workflow:**
1. Start stack: `./scripts/dev.sh start`
2. Open `http://localhost:8081/app/` in your browser
3. Edit files in `web-app/src/` - changes appear instantly (Vite HMR)
4. Edit files in `landing/src/` - changes appear on `http://localhost:8081/`
5. Edit smart contracts in `onchain/src/` - requires `./scripts/dev.sh restart --full`
## Configuration Knobs
Set environment variables before `docker-compose up` :
- `FORK_URL` – Anvil upstream RPC (defaults to `https://sepolia.base.org` )
- `DEPLOYER_PK` , `DEPLOYER_ADDR` – override deployer wallet; otherwise derived from `.secret.local` or Foundry defaults
- `TXNBOT_PRIVATE_KEY` , `TXNBOT_ADDRESS` , `TXNBOT_FUND_VALUE` – customise bot signer and funding
Edit `containers/Caddyfile` if you need different routes or ports.
## Known Limitations
- State is ephemeral; every restart wipes the fork and redeploys contracts.
- Processes run in dev/watch mode (`npm run dev` ), so staging traffic is not production hardened.
- Secrets live in env files inside the repo mount because no external secret store is wired in.
## Troubleshooting
### Mac: "Cannot connect to Docker daemon"
```bash
# Ensure Colima is running
colima status
colima start
# Verify Docker can connect
docker ps
```
### Permission errors on Linux
```bash
# Add your user to the docker group
sudo usermod -aG docker $USER
# Logout and login again, or use:
newgrp docker
```
### Port conflicts
If you see "port already in use" errors:
```bash
# Check what's using the port
lsof -i :8081 # or :8545, :5173, etc.
# Stop conflicting services or change ports in docker-compose.yml
```