Deployment Guide
Instructions for deploying Nebula components for local development and production.
Components
- Nebula Agent - Agent for GPU nodes
- Nebula Daemon (nebulad) - Platform daemon for orchestration
Nebula Agent
Agent binaries are automatically built and distributed via https://nebulactl.com for different platforms:
linux/amd64- Linux x86_64linux/arm64- Linux ARM64darwin/amd64- macOS Inteldarwin/arm64- macOS Apple Silicon
Download Agent
# Linux AMD64
curl -O https://nebulactl.com/linux/amd64/nebula-agent
chmod +x nebula-agent
./nebula-agent --version
# Linux ARM64
curl -O https://nebulactl.com/linux/arm64/nebula-agent
# macOS Intel
curl -O https://nebulactl.com/darwin/amd64/nebula-agent
# macOS Apple Silicon
curl -O https://nebulactl.com/darwin/arm64/nebula-agent
Initial Setup
SSH Configuration
# Add SSH key to server
ssh-copy-id root@your-server-ip
# Verify connection
ssh root@your-server-ip
Nginx Setup (once)
make deploy-nginx
This command:
- Checks Nginx presence on server
- Verifies Let's Encrypt SSL certificates
- Installs configuration for nebulactl.com
- Reloads Nginx
Deploy Binaries
make deploy
This command:
- Builds binaries for all 4 platforms locally
- Uploads them to server via SSH
- Sets correct permissions
- Makes them available via HTTPS
Execution time: ~2-3 minutes
Nebula Daemon (nebulad)
Platform daemon for managing agents, routing requests, and API gateway.
Quick Deploy
# Quick deploy (build + copy + restart)
./scripts/deploy-daemon.sh -h your-server-ip
# Or via Makefile
make deploy-daemon HOST=your-server-ip
Initial Installation (with systemd)
# Install systemd service, enable autostart
./scripts/deploy-daemon.sh -h your-server-ip --setup-service
# Or via Makefile
make deploy-daemon-full HOST=your-server-ip
Script Options
./scripts/deploy-daemon.sh [options]
Options:
-h, --host HOST Server IP or hostname (required for deploy)
-u, --user USER SSH user (default: root)
-P, --port PORT SSH port (default: 22)
-t, --target PLAT Target platform (default: linux/amd64)
-b, --build-only Build only, no deploy
-d, --deploy-only Deploy only (binary already built)
--setup-service Install/update systemd service
--no-restart Don't restart service
--dry-run Show commands without execution
--help Show help
Examples:
./scripts/deploy-daemon.sh -h 192.168.1.100 # Quick deploy
./scripts/deploy-daemon.sh -h 10.0.0.5 -u deploy # Different user
./scripts/deploy-daemon.sh -h 10.0.0.5 --setup-service # With systemd
./scripts/deploy-daemon.sh --build-only # Build only
./scripts/deploy-daemon.sh --build-only -t linux/arm64 # Build for ARM
Service Management
After installation with --setup-service:
# Status
systemctl status nebulad
# Logs
journalctl -u nebulad -f
# Restart
systemctl restart nebulad
# Stop
systemctl stop nebulad
Daemon Configuration
nebulad \
--data-dir /var/lib/nebulad \ # SQLite and data directory
--grpc-port 9090 \ # gRPC server
--http-port 8080 \ # HTTP gateway
--log-format json \ # Log format: json/text
--log-level info # Level: debug/info/warn/error
Make Commands
make help # Show all commands
# Agent
make deploy # Deploy nebula-agent to nebulactl.com
make deploy-nginx # Configure Nginx on remote server
make dist # Build agent for all platforms
# Daemon
make deploy-daemon HOST=<ip> # Deploy nebulad
make deploy-daemon-full HOST=<ip> # Deploy + systemd
make build-daemon-dist # Build nebulad for distribution
Server Structure
Agent
/var/www/nebulactl/
├── linux/
│ ├── amd64/nebula-agent
│ └── arm64/nebula-agent
└── darwin/
├── amd64/nebula-agent
└── arm64/nebula-agent
Daemon
/usr/local/bin/nebulad # Binary
/var/lib/nebulad/ # Data (SQLite)
/etc/systemd/system/nebulad.service # Systemd unit
Building Binaries
Hybrid approach for optimal GPU support:
linux/amd64 (main server platform):
- Built via Docker with
CGO_ENABLED=1 - Uses Debian-based image for glibc compatibility
- Full NVML/GPU monitoring support
Other platforms (linux/arm64, darwin/*):
- Native cross-compilation with
CGO_ENABLED=0 - GPU monitoring via stub (returns empty GPU list)
Build flags:
-ldflags="-s -w"- Size reduction (removes debug info)GOOSandGOARCH- Target platform
Troubleshooting
Check Agent Availability
for platform in "linux/amd64" "linux/arm64" "darwin/amd64" "darwin/arm64"; do
echo -n "$platform: "
curl -s -o /dev/null -w "%{http_code}\n" "https://nebulactl.com/$platform/nebula-agent"
done
Check Daemon Status
# On server
systemctl status nebulad
journalctl -u nebulad --no-pager -n 50
# Remotely
ssh root@<ip> systemctl status nebulad
View Logs
# Agent (Nginx)
ssh root@your-server-ip tail -f /var/log/nginx/nebulactl.access.log
# Daemon
ssh root@<ip> journalctl -u nebulad -f
Environment Variables
For CI/CD or automation:
export DEPLOY_HOST=your-server-ip
export DEPLOY_USER=root
export DEPLOY_PORT=22
export SSH_KEY_PATH=~/.ssh/deploy_key
export DEPLOY_PATH=/usr/local/bin
export NEBULAD_DATA_DIR=/var/lib/nebulad
export NEBULAD_SERVICE_NAME=nebulad
./scripts/deploy-daemon.sh
GitHub Actions
Deploy can be triggered via GitHub Actions:
- Go to Actions → Deploy Nebulad
- Click Run workflow
- Specify:
host— Server IPuser— SSH user (default: root)setup_service— Install systemd service
Requires DEPLOY_SSH_KEY secret with private SSH key.
Related Documentation
- CI/CD Pipeline — Detailed CI/CD workflow description, build strategy, semantic versioning
- GitHub Setup — Complete guide to configure GitHub repository for automated deployments