This guide covers deploying the Secret Network Dashboard and Fee Grant Faucet to secretVM using Docker Compose and GitHub Container Registry (GHCR).
The deployment consists of two containerized services:
- Dashboard (
ghcr.io/mrgarbonzo/dash.scrt.network) - Frontend application for interacting with Secret Network - Faucet (
ghcr.io/mrgarbonzo/feegrantfaucet2.0) - Backend API that grants fee allowances to users
Both services communicate via a Docker network and expose ports 3000 (dashboard) and 3001 (faucet).
- Docker and Docker Compose installed
- Access to secretVM (TEE environment)
- A funded Secret Network wallet (mnemonic)
- Domain configured for
dash.scrt.network(optional but recommended)
Both repositories need to have the latest code pushed to trigger GHCR image builds:
# For FeeGrantFaucet2.0
cd /root/FeeGrantFaucet2.0
git add .
git commit -m "Add Docker and GitHub Actions configuration for GHCR"
git push origin main
# For dash.scrt.network
cd /root/dash.scrt.network
git add .
git commit -m "Add production Docker build and GHCR GitHub Actions"
git push origin masterAfter pushing, GitHub Actions will automatically build and push Docker images to GHCR:
- FeeGrantFaucet2.0: https://github.com/MrGarbonzo/FeeGrantFaucet2.0/actions
- dash.scrt.network: https://github.com/MrGarbonzo/dash.scrt.network/actions
Images will be available at:
ghcr.io/mrgarbonzo/feegrantfaucet2.0:latestghcr.io/mrgarbonzo/dash.scrt.network:latest
For secretVM to pull images without authentication:
- Go to https://github.com/MrGarbonzo?tab=packages
- Click on each package (feegrantfaucet2.0 and dash.scrt.network)
- Click "Package settings" → "Change visibility" → "Public"
Copy these files to your secretVM:
# From your local machine or CI/CD
scp docker-compose.yml secretvm:/opt/secret-dashboard/
scp .env.example secretvm:/opt/secret-dashboard/On secretVM, create your .env file:
cd /opt/secret-dashboard
cp .env.example .env
nano .env # Or use your preferred editorRequired configuration:
# CRITICAL: Your funded wallet mnemonic
FAUCET_MNEMOMIC="your twelve or twenty-four word mnemonic here"
# Secret Network LCD node
LCD_NODE=https://lcd.secret.adrius.starshell.net
# Faucet wallet address (get this from your mnemonic)
VITE_FAUCET_ADDRESS=secret1your_faucet_address_here
# External faucet URL (for browser access)
# Update with your domain or IP
VITE_FAUCET_URL=https://dash.scrt.network:3001/claimTo get your faucet address from mnemonic:
# Use secretcli or any Secret Network wallet tool
secretcli keys add faucet --recover
# Enter your mnemonic when prompted
# It will output the addresscd /opt/secret-dashboard
# Pull latest images
docker-compose pull
# Start services in detached mode
docker-compose up -d
# View logs
docker-compose logs -f
# Check service status
docker-compose psCheck dashboard:
curl http://localhost:3000Check faucet:
curl http://localhost:3001/claim/secret1ap26qrlp8mcq2pg6r47w43l0y8zkqm8a450s03Expected faucet response:
{
"feegrant": {
"granter": "secret1your_faucet_address",
"grantee": "secret1ap26qrlp8mcq2pg6r47w43l0y8zkqm8a450s03",
"allowance": {
"@type": "/cosmos.feegrant.v1beta1.BasicAllowance",
"spend_limit": [{ "amount": "50000", "denom": "uscrt" }],
"expiration": "2025-11-06T14:44:16Z"
}
}
}Point dash.scrt.network to your secretVM IP address:
A dash.scrt.network → YOUR_SECRETVM_IP
When new code is pushed to GitHub, new images are automatically built. To deploy updates:
cd /opt/secret-dashboard
docker-compose pull
docker-compose up -d# All services
docker-compose logs -f
# Dashboard only
docker-compose logs -f dashboard
# Faucet only
docker-compose logs -f faucet# Restart all
docker-compose restart
# Restart specific service
docker-compose restart dashboard
docker-compose restart faucetdocker-compose downdocker stats- Check if container is running:
docker-compose ps - Check logs:
docker-compose logs dashboard - Verify port 3000 is accessible:
curl http://localhost:3000 - Check if nginx is serving files:
docker-compose exec dashboard ls /usr/share/nginx/html
- Check container status:
docker-compose ps - Check logs for errors:
docker-compose logs faucet - Verify mnemonic is set:
docker-compose exec faucet env | grep FAUCET_MNEMOMIC - Test LCD node connectivity:
curl https://lcd.secret.adrius.starshell.net/node_info - Check wallet balance:
secretcli query bank balances YOUR_FAUCET_ADDRESS --node https://lcd.secret.adrius.starshell.net
Common issues:
-
Faucet wallet has insufficient funds
- Fund the wallet with SCRT
-
LCD node is down or slow
- Try a different LCD node in
.env
- Try a different LCD node in
-
CORS errors in browser
- Verify VITE_FAUCET_URL is correctly set
- Check browser console for errors
-
Wrong faucet address configured
- Ensure VITE_FAUCET_ADDRESS matches your actual faucet wallet
If you get authentication errors:
- Make packages public (see step 3 in Initial Setup)
- Or, authenticate Docker on secretVM:
echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin
- The
.envfile contains sensitive information (mnemonic). Keep it secure! - secretVM's TEE environment provides hardware-level encryption for the mnemonic
- Never commit
.envto version control - Regularly monitor faucet wallet balance
- Set up alerts for unusual activity
See .env.example for a complete list of configuration options.
FAUCET_MNEMOMIC- Your wallet mnemonic (required)LCD_NODE- Secret Network LCD endpoint (required)VITE_FAUCET_ADDRESS- Your faucet wallet address (required)VITE_FAUCET_URL- External faucet URL for browser access (required)
FAUCET_AMOUNT- Amount to grant (default: 50000 uscrt = 0.05 SCRT)FAUCET_RELOAD_TIME- Hours between grants (default: 24)VITE_MIXPANEL_ENABLED- Enable analytics (default: false)
For issues or questions: