Deploying the Decentralized Registry
This guide walks you through deploying your own OpenRegistry + IPFS stack on Akash Network.
Prerequisites
Before you begin, ensure you have:
- Akash CLI installed (
brew install akash-provider-services) - Akash wallet with at least 5 AKT tokens
- Domain with DNS management access (Namecheap, Cloudflare, etc.)
- Docker installed locally
Architecture Overview
You'll be deploying three services on Akash:
┌──────────── Akash Deployment ────────────┐
│ │
│ PostgreSQL (metadata) │
│ ├─ Port: 5432 (internal) │
│ └─ Storage: 20GB │
│ │
│ IPFS Node (storage) │
│ ├─ API: 5001 (internal) │
│ ├─ Gateway: 8080 (public) │
│ ├─ Swarm: 4001 (P2P) │
│ └─ Storage: 100GB │
│ │
│ OpenRegistry (OCI API) │
│ ├─ Port: 5000 (public) │
│ └─ Storage: 10GB │
│ │
└───────────────────────────────────────────┘Step 1: Setup Akash CLI
Install Akash CLI
macOS:
brew tap akash-network/tap
brew install akash-provider-servicesLinux:
curl -sSfL https://raw.githubusercontent.com/akash-network/node/master/install.sh | shVerify Installation
akash version
# Should output: v0.x.xConfigure Environment
export AKASH_NODE=https://rpc.akash.network:443
export AKASH_CHAIN_ID=akashnet-2
export AKASH_GAS=auto
export AKASH_GAS_ADJUSTMENT=1.5
export AKASH_GAS_PRICES=0.025uaktAdd these to your ~/.bashrc or ~/.zshrc to make them permanent.
Step 2: Create Akash Wallet
Generate New Wallet
akash keys add registry-wallet
# Save the mnemonic phrase securely!Or Import Existing Wallet
akash keys add registry-wallet --recover
# Enter your mnemonic phraseGet Your Address
export AKASH_ACCOUNT_ADDRESS=$(akash keys show registry-wallet -a)
echo $AKASH_ACCOUNT_ADDRESSFund Your Wallet
You need at least 5 AKT tokens:
- Buy AKT: Exchanges
- Testnet Faucet: https://faucet.akash.network
Check Balance
akash query bank balances $AKASH_ACCOUNT_ADDRESS --node $AKASH_NODEStep 3: Configure Deployment
Download SDL File
Download the deployment configuration:
curl -O https://raw.githubusercontent.com/alternatefutures/backend/main/deploy-registry.yamlEdit Configuration
Open deploy-registry.yaml and update these values:
services:
postgres:
env:
# Change this password!
- POSTGRES_PASSWORD=YOUR_SECURE_PASSWORD_HERE
registry:
env:
# Change this JWT secret (min 32 characters)
- OPEN_REGISTRY_SIGNING_SECRET=YOUR_JWT_SECRET_MIN_32_CHARS_HERE
# Match PostgreSQL password
- OPEN_REGISTRY_DB_PASSWORD=YOUR_SECURE_PASSWORD_HERE
# Your registry domain
- OPEN_REGISTRY_DOMAIN=registry.yourdomain.com
expose:
- port: 5000
as: 80
to:
- global: true
accept:
# Change to your domain
- registry.yourdomain.com
ipfs:
expose:
- port: 8080
as: 8080
to:
- global: true
accept:
# Change to your domain
- ipfs.yourdomain.comGenerate Secure Passwords
# Generate secure password
openssl rand -base64 32
# Generate JWT secret
openssl rand -base64 48Step 4: Deploy to Akash
Create Deployment
akash tx deployment create deploy-registry.yaml \
--from registry-wallet \
--node $AKASH_NODE \
--chain-id $AKASH_CHAIN_ID \
--fees 5000uaktGet Deployment ID
Save the DSEQ (deployment sequence) from the output:
export AKASH_DSEQ=<your-dseq-number>Wait for Bids
Providers will send bids for your deployment (usually takes 30-60 seconds):
akash query market bid list \
--owner $AKASH_ACCOUNT_ADDRESS \
--node $AKASH_NODE \
--dseq $AKASH_DSEQAccept a Bid
Choose a provider and create a lease:
export AKASH_PROVIDER=<provider-address-from-bid>
akash tx market lease create \
--dseq $AKASH_DSEQ \
--from registry-wallet \
--provider $AKASH_PROVIDER \
--node $AKASH_NODE \
--chain-id $AKASH_CHAIN_ID \
--fees 5000uaktSend Manifest
akash provider send-manifest deploy-registry.yaml \
--dseq $AKASH_DSEQ \
--from registry-wallet \
--provider $AKASH_PROVIDER \
--node $AKASH_NODEGet Service Endpoints
akash provider lease-status \
--dseq $AKASH_DSEQ \
--from registry-wallet \
--provider $AKASH_PROVIDER \
--node $AKASH_NODENote the forwarded_ports - these are your public IPs and ports!
Step 5: Configure DNS
Get Provider IP
From the lease status, note the provider's IP address.
Add DNS Records
Using Namecheap:
- Log into Namecheap
- Go to Domain List → Manage → Advanced DNS
- Add A Records:
Type: A Record
Host: registry
Value: <provider-ip>
TTL: Automatic
Type: A Record
Host: ipfs
Value: <provider-ip>
TTL: AutomaticUsing Cloudflare:
# Add DNS records via CLI
curl -X POST "https://api.cloudflare.com/client/v4/zones/<zone-id>/dns_records" \
-H "Authorization: Bearer <api-token>" \
-H "Content-Type: application/json" \
--data '{
"type": "A",
"name": "registry",
"content": "<provider-ip>",
"ttl": 1,
"proxied": false
}'
curl -X POST "https://api.cloudflare.com/client/v4/zones/<zone-id>/dns_records" \
-H "Authorization: Bearer <api-token>" \
-H "Content-Type: application/json" \
--data '{
"type": "A",
"name": "ipfs",
"content": "<provider-ip>",
"ttl": 1,
"proxied": false
}'Wait for DNS Propagation
DNS changes can take 5-60 minutes to propagate. Check status:
dig registry.yourdomain.com
dig ipfs.yourdomain.comStep 6: Test Your Registry
Test OCI API
curl https://registry.yourdomain.com/v2/
# Should return: {}Test IPFS Gateway
curl https://ipfs.yourdomain.com/ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn
# Should return: hello worldsPush First Image
# Build a simple image
echo "FROM alpine:latest" > Dockerfile
echo "CMD echo 'Hello from decentralized registry!'" >> Dockerfile
docker build -t test-image .
# Tag for your registry
docker tag test-image registry.yourdomain.com/test-image:latest
# Push
docker push registry.yourdomain.com/test-image:latestPull Image
docker pull registry.yourdomain.com/test-image:latest
docker run registry.yourdomain.com/test-image:latest
# Should output: Hello from decentralized registry!Step 7: Monitor Your Deployment
View Logs
Registry logs:
akash provider lease-logs \
--dseq $AKASH_DSEQ \
--from registry-wallet \
--provider $AKASH_PROVIDER \
--node $AKASH_NODE \
--service registry \
--followIPFS logs:
akash provider lease-logs \
--dseq $AKASH_DSEQ \
--from registry-wallet \
--provider $AKASH_PROVIDER \
--node $AKASH_NODE \
--service ipfs \
--followCheck Service Status
akash provider service-status \
--dseq $AKASH_DSEQ \
--from registry-wallet \
--provider $AKASH_PROVIDER \
--node $AKASH_NODEIPFS Stats
Check IPFS node storage:
curl http://ipfs.yourdomain.com:5001/api/v0/repo/stat | jqCosts and Billing
Estimated Monthly Cost
- Compute: ~$30-50/month
- Storage (130GB total): Included in compute cost
- Bandwidth: Pay-as-you-go
Total: ~$40-70/month for production-ready registry
Monitoring Spending
Check your deployment cost:
akash query market lease list \
--owner $AKASH_ACCOUNT_ADDRESS \
--node $AKASH_NODE \
--dseq $AKASH_DSEQFunding Your Deployment
Deposits are deducted every block. Ensure your wallet has sufficient balance.
Top up if needed:
akash tx deployment deposit 5000000uakt \
--dseq $AKASH_DSEQ \
--from registry-wallet \
--node $AKASH_NODEUpdating Your Deployment
Update Configuration
- Edit
deploy-registry.yaml - Update the deployment:
akash tx deployment update deploy-registry.yaml \
--dseq $AKASH_DSEQ \
--from registry-wallet \
--node $AKASH_NODE- Send updated manifest:
akash provider send-manifest deploy-registry.yaml \
--dseq $AKASH_DSEQ \
--from registry-wallet \
--provider $AKASH_PROVIDER \
--node $AKASH_NODETroubleshooting
Deployment Fails
Check SDL validation:
akash deployment validate deploy-registry.yamlCommon issues:
- Insufficient balance
- Invalid SDL syntax
- Port conflicts
No Bids Received
Possible causes:
- Price too low
- Resource requirements too high
- No providers available
Solution: Increase bid price in SDL:
pricing:
registry:
amount: 2000 # Increase from 1000Services Not Starting
Check logs:
akash provider lease-logs \
--dseq $AKASH_DSEQ \
--from registry-wallet \
--provider $AKASH_PROVIDER \
--node $AKASH_NODE \
--followCommon issues:
- Environment variables not set
- Database connection failures
- IPFS initialization errors
DNS Not Resolving
Check DNS propagation:
dig registry.yourdomain.com +traceVerify A record:
nslookup registry.yourdomain.comClear DNS cache:
# macOS
sudo dscacheutil -flushcache
# Linux
sudo systemctl restart systemd-resolvedSecurity Best Practices
1. Use Strong Passwords
Generate cryptographically secure passwords:
openssl rand -base64 322. Enable TLS
Akash providers typically include Let's Encrypt automatically. Verify:
curl -I https://registry.yourdomain.com
# Look for: SSL certificate from Let's Encrypt3. Regular Backups
Backup PostgreSQL database:
# Enter the postgres container
akash provider lease-shell \
--dseq $AKASH_DSEQ \
--from registry-wallet \
--provider $AKASH_PROVIDER \
--service postgres
# Inside container
pg_dump -U postgres open_registry > backup.sql4. Monitor Access
Review registry access logs regularly:
akash provider lease-logs \
--dseq $AKASH_DSEQ \
--service registry | grep "POST\|GET"Next Steps
- Use Your Registry - Push and pull images
- CLI Integration - Add registry commands to CLI
- Monitoring - Set up alerts and dashboards
Support
Need help deploying?