- Add SYNOR_BOOTSTRAP_PEERS env var for runtime seed node configuration - Implement secrets provider abstraction for faucet wallet key security (supports file-based secrets in /run/secrets for production) - Create WASM crypto crate foundation for web wallet (Ed25519, BIP-39) - Add DEPLOYMENT.md guide for testnet deployment - Add SECURITY_AUDIT_SCOPE.md for external security audit preparation - Document seed node deployment process in synor-network Security improvements: - Faucet now auto-detects /run/secrets for secure key storage - CORS already defaults to specific origins (https://faucet.synor.cc) - Bootstrap peers now configurable at runtime without recompilation
6.4 KiB
Synor Testnet Deployment Guide
This guide covers deploying the Synor blockchain testnet, including seed nodes, validators, and supporting infrastructure.
Prerequisites
- Rust 1.75+ with
wasm32-unknown-unknowntarget - Docker (optional, for containerized deployment)
- 3+ servers with static IPs or DNS hostnames
- Ports: 17511 (P2P), 17110 (RPC), 17111 (WebSocket)
1. Build from Source
# Clone and build
git clone https://github.com/g1-technologies/synor.git
cd synor
# Build release binaries
cargo build --release -p synord -p synor-cli
# Binaries will be in target/release/
2. Deploy Seed Nodes
Seed nodes are the first nodes deployed. They provide initial peer discovery for the network.
2.1 Deploy First Seed Node
# On testnet-seed1.synor.cc
./synord --network testnet \
--data-dir /var/lib/synor \
--rpc-host 0.0.0.0 \
--rpc-port 17110 \
--ws-port 17111 \
--p2p-port 17511
Get the peer ID from startup logs:
INFO synor_network::service: Local peer ID: 12D3KooWXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Record this peer ID - you'll need it for other nodes.
2.2 Deploy Additional Seed Nodes
For the second and third seed nodes, configure them to bootstrap from the first:
# On testnet-seed2.synor.cc
export SYNOR_BOOTSTRAP_PEERS="/dns4/testnet-seed1.synor.cc/tcp/17511/p2p/12D3KooWXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
./synord --network testnet \
--data-dir /var/lib/synor \
--rpc-host 0.0.0.0 \
--rpc-port 17110
After all seed nodes are running, record all peer IDs:
| Seed Node | Hostname | Peer ID |
|---|---|---|
| Seed 1 (US-East) | testnet-seed1.synor.cc | 12D3KooW... |
| Seed 2 (EU-Frankfurt) | testnet-seed2.synor.cc | 12D3KooW... |
| Seed 3 (Asia-Singapore) | testnet-seed3.synor.cc | 12D3KooW... |
2.3 Configure Bootstrap Peers
Once all seed nodes are running, update the SYNOR_BOOTSTRAP_PEERS environment variable on each node:
export SYNOR_BOOTSTRAP_PEERS="\
/dns4/testnet-seed1.synor.cc/tcp/17511/p2p/12D3KooW...,\
/dns4/testnet-seed2.synor.cc/tcp/17511/p2p/12D3KooW...,\
/dns4/testnet-seed3.synor.cc/tcp/17511/p2p/12D3KooW..."
Or create a config file at ~/.synor/config.toml:
[p2p]
seeds = [
"/dns4/testnet-seed1.synor.cc/tcp/17511/p2p/12D3KooW...",
"/dns4/testnet-seed2.synor.cc/tcp/17511/p2p/12D3KooW...",
"/dns4/testnet-seed3.synor.cc/tcp/17511/p2p/12D3KooW...",
]
3. Deploy Faucet
The faucet provides testnet tokens to developers.
3.1 Generate Faucet Wallet
# Generate a new wallet for the faucet
synor-cli wallet create --name faucet
# Note the address for genesis allocation
synor-cli wallet list
3.2 Configure Faucet
IMPORTANT: Store the faucet private key securely!
For production, use a secrets manager (AWS Secrets Manager, HashiCorp Vault, etc.):
# Development only - NOT for production
export FAUCET_WALLET_KEY="your-private-key-here"
export FAUCET_RPC_URL="http://testnet-seed1.synor.cc:17110"
export FAUCET_DRIP_AMOUNT="1000000000" # 10 SYNOR (8 decimals)
export FAUCET_COOLDOWN="3600" # 1 hour between requests
# Run faucet
./faucet --port 8080
3.3 Secure the Faucet Key (Production)
Instead of environment variables, integrate with a secrets manager:
// Example: AWS Secrets Manager integration
// See apps/faucet/src/secrets.rs for implementation
4. Deploy Block Explorer
The explorer provides blockchain visibility.
# Configure explorer
export EXPLORER_RPC_URL="http://testnet-seed1.synor.cc:17110"
export EXPLORER_WS_URL="ws://testnet-seed1.synor.cc:17111"
# Run explorer backend
./explorer --port 3000
# For production, restrict CORS:
export EXPLORER_CORS_ORIGINS="https://explorer.synor.cc,https://testnet.synor.cc"
5. Security Checklist
Network Security
- Firewall configured (allow 17511, 17110, 17111)
- DDoS protection enabled
- Rate limiting configured on RPC endpoints
Node Security
- Node runs as non-root user
- Data directory has restricted permissions
- Log rotation configured
Key Management
- Faucet key stored in secrets manager (not env vars)
- Validator keys stored securely
- Key backup procedures documented
CORS Configuration
- Explorer CORS restricted to specific origins
- Faucet CORS restricted to specific origins
- RPC CORS configured appropriately
6. Monitoring
Prometheus Metrics
Enable metrics on synord:
./synord --network testnet --metrics --metrics-port 9090
Scrape endpoint: http://localhost:9090/metrics
Key Metrics to Monitor
synor_peer_count- Number of connected peerssynor_block_height- Current block heightsynor_sync_progress- Sync progress percentagesynor_mempool_size- Pending transactionssynor_blocks_per_second- Block production rate
7. Troubleshooting
Node won't connect to peers
- Check firewall rules (port 17511)
- Verify bootstrap peers are reachable
- Check peer ID format in SYNOR_BOOTSTRAP_PEERS
# Test connectivity
nc -zv testnet-seed1.synor.cc 17511
Node stuck syncing
- Check disk space
- Verify network bandwidth
- Increase sync batch size if needed
High memory usage
- Adjust cache size in config
- Enable pruning for non-archive nodes
8. Updating Nodes
Rolling Updates
- Stop node gracefully:
kill -SIGTERM <pid> - Wait for shutdown (check logs)
- Update binary
- Restart node
Breaking Changes
For consensus changes, coordinate a hard fork:
- Announce upgrade block height
- Deploy new binaries to all nodes
- All nodes must upgrade before fork height
Quick Reference
Environment Variables
| Variable | Description | Example |
|---|---|---|
SYNOR_BOOTSTRAP_PEERS |
Comma-separated bootstrap multiaddrs | /dns4/seed1.../p2p/12D3... |
SYNOR_DATA_DIR |
Data directory path | /var/lib/synor |
SYNOR_LOG_LEVEL |
Log verbosity | info, debug, trace |
FAUCET_WALLET_KEY |
Faucet private key (use secrets manager!) | - |
EXPLORER_CORS_ORIGINS |
Allowed CORS origins | https://explorer.synor.cc |
Default Ports (Testnet)
| Service | Port |
|---|---|
| P2P | 17511 |
| RPC | 17110 |
| WebSocket | 17111 |
| Metrics | 9090 |
| Faucet | 8080 |
| Explorer | 3000 |
Last updated: January 2026