Skip to main content

Quickstart with Docker

Prerequisites​

  • Docker 24+ and Docker Compose v2+
  • 2GB+ RAM available
  • Ports 8010 (API), 5432 (PostgreSQL), 6379 (Redis) available

One-Command Production Deploy​

# Create project directory
mkdir walletpress && cd walletpress

# Download docker-compose
curl -L https://raw.githubusercontent.com/RugMunchMedia/walletpress/main/docker-compose.yml -o docker-compose.yml

# Generate secure vault key
export VAULT_KEY=$(openssl rand -base64 32)

# Start all services
docker compose up -d

That's it. WalletPress API will be available at http://localhost:8010.


What Gets Deployed​

ServiceImagePortPurpose
walletpresswalletpress/walletpress:latest8010REST API, MCP, x402
postgrespostgres:16-alpine5432Primary database
redisredis:7-alpine6379Cache, queues, rate limiting

Configuration​

Environment Variables​

Create a .env file (or export in shell):

# Required
VAULT_KEY= # 32-byte base64 key (generate: openssl rand -base64 32)
DATABASE_URL=postgresql://user:pass@postgres:5432/walletpress
REDIS_URL=redis://redis:6379

# Optional
LOG_LEVEL=info # debug, info, warn, error
API_RATE_LIMIT=100 # requests per second per IP
MCP_ENABLED=true # enable MCP server
X402_ENABLED=true # enable x402 marketplace
WORDPRESS_PLUGIN_ENABLED=true # enable WordPress plugin endpoints
ARWEAVE_ENABLED=true # enable Arweave proof commits

Generating VAULT_KEY​

# Option 1: OpenSSL (recommended)
openssl rand -base64 32

# Option 2: Python
python3 -c "import secrets, base64; print(base64.b64encode(secrets.token_bytes(32)).decode())"

# Option 3: Node.js
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"

Save this key securely. Losing it means losing access to all encrypted wallet data.


Verify Installation​

# Health check
curl http://localhost:8010/health
# {"status":"healthy","version":"1.0.0","services":{"database":"connected","redis":"connected","vault":"unlocked"}}

# API documentation (Swagger UI)
open http://localhost:8010/docs

# MCP endpoint (SSE)
curl -N http://localhost:8010/mcp/sse

# x402 endpoint
curl http://localhost:8010/.well-known/x402

First Wallet Generation​

# Generate a wallet for Ethereum and Solana
curl -X POST http://localhost:8010/api/v1/wallets \
-H "Content-Type: application/json" \
-d '{
"chains": ["ethereum", "solana"],
"label": "my-first-wallet",
"derivation_path": "m/44\'/60\'/0\'/0/0"
}'

# Response
{
"id": "wlt_abc123...",
"label": "my-first-wallet",
"chains": {
"ethereum": {
"address": "0x742d35Cc6634C0532925a3b8D4C0532925a3b8D4",
"derivation_path": "m/44'/60'/0'/0/0",
"public_key": "0x04..."
},
"solana": {
"address": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
"derivation_path": "m/44'/501'/0'/0'",
"public_key": "<solana-public-key>"
}
},
"created_at": "2026-11-02T12:00:00Z",
"arweave_proof": "https://arweave.net/abc123..."
}

Production Hardening​

Reverse Proxy (nginx)​

server {
listen 443 ssl http2;
server_name api.walletpress.yourdomain.com;

ssl_certificate /etc/letsencrypt/live/api.walletpress.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.walletpress.yourdomain.com/privkey.pem;

location / {
proxy_pass http://localhost:8010;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# WebSocket support for MCP SSE
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

# Timeouts
proxy_connect_timeout 30s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}

# Health check endpoint (no auth)
location /health {
proxy_pass http://localhost:8010/health;
access_log off;
}
}

Systemd Service​

# /etc/systemd/system/walletpress.service
[Unit]
Description=WalletPress API
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/walletpress
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
TimeoutStartSec=120

[Install]
WantedBy=multi-user.target
sudo systemctl enable --now walletpress

Backup Strategy​

#!/bin/bash
# /opt/walletpress/backup.sh - run via cron daily at 03:00

BACKUP_DIR="/backups/walletpress/$(date +%Y-%m-%d)"
mkdir -p "$BACKUP_DIR"

# Database
docker exec walletpress-postgres pg_dump -U walletpress walletpress | gzip > "$BACKUP_DIR/database.sql.gz"

# Vault data (encrypted)
docker cp walletpress:/data/vault "$BACKUP_DIR/vault"

# Arweave proofs index
docker exec walletpress-postgres pg_dump -U walletpress -t arweave_proofs walletpress | gzip > "$BACKUP_DIR/arweave_proofs.sql.gz"

# Retain 30 days
find /backups/walletpress -type d -mtime +30 -exec rm -rf {} \;

Troubleshooting​

IssueSolution
vault: lockedCheck VAULT_KEY matches the one used to encrypt data
database: connection refusedEnsure PostgreSQL is healthy: docker compose logs postgres
redis: connection refusedEnsure Redis is healthy: docker compose logs redis
Port 8010 in useChange port in docker-compose.yml or stop conflicting service
MCP SSE not workingEnsure nginx proxy has proxy_http_version 1.1 and upgrade headers

Next Steps​