migrate/podman-to-docker (#92)
podman to docker Co-authored-by: openhands <openhands@all-hands.dev> Reviewed-on: https://codeberg.org/johba/harb/pulls/92
This commit is contained in:
parent
c2720c35a5
commit
5d71753086
13 changed files with 211 additions and 100 deletions
131
docs/docker.md
Normal file
131
docs/docker.md
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
# 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`
|
||||
- `bootstrap` – one-shot job running `DeployLocal.sol`, seeding liquidity, priming blocks, and writing shared env files
|
||||
- `ponder` – `npm run dev` for the indexer (port 42069 inside the pod)
|
||||
- `frontend` – Vite dev server for `web-app` (port 5173 inside the pod)
|
||||
- `txn-bot` – automation loop plus Express status API (port 43069 inside the pod)
|
||||
- `caddy` – front door at `http://<host>:80`, routing `/api/graphql`, `/health`, `/api/rpc`, and `/api/txn` to the internal services
|
||||
|
||||
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
|
||||
```
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
# Podman Staging Environment
|
||||
|
||||
The Podman stack mirrors `scripts/dev.sh` using long-lived containers. Every boot spins up a fresh Base Sepolia fork, redeploys contracts, seeds liquidity, and launches the live-reload services behind Caddy on port 80.
|
||||
|
||||
## Service Topology
|
||||
- `anvil` – Base Sepolia fork with optional mnemonic from `onchain/.secret.local`
|
||||
- `bootstrap` – one-shot job running `DeployLocal.sol`, seeding liquidity, priming blocks, and writing shared env files
|
||||
- `ponder` – `npm run dev` for the indexer (port 42069 inside the pod)
|
||||
- `frontend` – Vite dev server for `web-app` (port 5173 inside the pod)
|
||||
- `txn-bot` – automation loop plus Express status API (port 43069 inside the pod)
|
||||
- `caddy` – front door at `http://<host>:80`, routing `/api/graphql`, `/health`, `/api/rpc`, and `/api/txn` to the internal services
|
||||
|
||||
All containers mount the repository so code edits hot-reload exactly as the local script. Named volumes keep `node_modules` caches between restarts.
|
||||
|
||||
## Prerequisites
|
||||
- Podman 4.x (rootless recommended)
|
||||
- `podman-compose`
|
||||
|
||||
## Launching
|
||||
```bash
|
||||
podman-compose -f podman-compose.yml build
|
||||
podman-compose -f podman-compose.yml up
|
||||
```
|
||||
- First run takes several minutes while Foundry installs deps, deploys contracts, and runs the seeding transactions.
|
||||
- Use `podman-compose down` to stop. Bring-up always redeploys and rewrites `services/ponder/.env.local` plus `tmp/podman/txnBot.env`.
|
||||
|
||||
### Access Points (via Caddy)
|
||||
- Frontend: `http://<host>/`
|
||||
- GraphQL: `http://<host>/api/graphql`
|
||||
- RPC passthrough: `http://<host>/api/rpc`
|
||||
- Txn bot status: `http://<host>/api/txn/status`
|
||||
|
||||
## Configuration Knobs
|
||||
Set environment variables before `podman-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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue