# Copy environment template
cp .env.docker .env
# Edit .env with your actual values
# - Supabase credentials
# - Solana wallet address
# - Google OAuth credentials
# - NEXTAUTH_SECRET (generate with: openssl rand -base64 32)# Build and start all services
docker-compose up -d
# Check logs
docker-compose logs -f
# Stop services
docker-compose down- Public Frontend: http://localhost:3000
- Admin Panel: http://localhost:3001
- Backend API: http://localhost:3000/api/*
- Express API server
- SEO analysis service
- Payment processing (x402 + Solana)
- Screenshot generation (Puppeteer + Chromium)
- Next.js 14 (App Router)
- Google OAuth authentication
- User & credit management
- Payment monitoring
- Analytics dashboard
docker build -f Dockerfile.admin -t easy-seo-admin:latest ./docker run -d \
-p 3001:3001 \
--env-file .env \
--name easy-seo-admin \
easy-seo-admin:latest# Run backend only
docker-compose up backend
# Run admin only (requires backend)
docker-compose up admin
# Rebuild after code changes
docker-compose up --build- Set strong
NEXTAUTH_SECRET(min 32 chars) - Use environment-specific
NEXTAUTH_URL(https in production) - Restrict Google OAuth to specific domains
- Use Supabase service role key only on server
- Add admin users to
admin_userstable - Enable firewall rules for ports 3000/3001
- Use reverse proxy (nginx) with SSL in production
# Backend health
curl http://localhost:3000/api/health
# Admin health (should return HTML)
curl http://localhost:3001# View logs
docker-compose logs -f backend
docker-compose logs -f admin
# Container stats
docker stats easy-seo-backend-1 easy-seo-admin-1
# Restart services
docker-compose restart backend
docker-compose restart admin- Check
NEXTAUTH_SECRETis set - Verify
GOOGLE_CLIENT_IDandGOOGLE_CLIENT_SECRET - Ensure Supabase credentials are correct
- Check logs:
docker-compose logs admin
- Chromium is pre-installed in Alpine image
- Check memory limits:
docker stats - Increase Docker memory if needed
- Verify
SUPABASE_URLand keys - Check network:
docker network inspect easy-seo-network - Test Supabase connectivity from container:
docker exec -it easy-seo-backend-1 wget -O- $SUPABASE_URL
Update .env for production:
NEXTAUTH_URL=https://admin.yourdomain.com
SOLANA_RPC_URL=https://mainnet.helius-rpc.com/?api-key=YOUR_KEY
# ... other production values# /etc/nginx/sites-available/easy-seo
# Backend API
server {
listen 80;
server_name api.yourdomain.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
# Admin Panel
server {
listen 80;
server_name admin.yourdomain.com;
location / {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}sudo certbot --nginx -d api.yourdomain.com -d admin.yourdomain.com# Set restart policy
docker-compose up -d --restart=always- Backend: ~450MB (Node 20 + Chromium)
- Admin: ~200MB (Node 20 + Next.js build)
# Pull latest code
git pull
# Rebuild and restart
docker-compose down
docker-compose up -d --build
# Prune old images
docker image prune -aNeed help? Check admin/docs/DEPLOYMENT_CHECKLIST.md for detailed production deployment steps.