Note: This document describes the console commands for the Torrust Tracker Deployer tool.
- Create Template: Generate environment configuration template (JSON)
- Create Environment: Create new deployment environment from configuration file
- Show: Display environment information with state-aware details
- Provision: VM infrastructure provisioning with OpenTofu (LXD and Hetzner Cloud)
- Register: Register existing instances as an alternative to provisioning (for pre-existing VMs, servers, or containers)
- Configure: VM configuration with Docker, Docker Compose, and firewall via Ansible
- Test: Verification of deployment infrastructure (cloud-init, Docker, Docker Compose)
- Release: Deploy application configuration and files (tracker config, docker-compose stack)
- Run: Start Torrust Tracker services and validate accessibility
- Destroy: Infrastructure cleanup and environment destruction
- Template rendering system (OpenTofu, Ansible, Tracker, Docker Compose templates)
- SSH connectivity validation
- Environment state management and persistence
- Porcelain commands (high-level
deploycommand) - Additional cloud providers (AWS, Azure, GCP)
The deployment follows a linear state progression:
- created → Environment configuration exists
- provisioned → VM/container infrastructure is running
- configured → Basic system setup complete (Docker, networking, etc.)
- released → Application files and configuration deployed
- running → Torrust Tracker application is active
- destroyed → Infrastructure cleaned up
Each command transitions the deployment to the next state.
The full deployment workflow with all implemented commands:
# 1. Generate configuration template
torrust-tracker-deployer create template --provider lxd > my-env.json
# 2. Edit my-env.json with your settings (SSH keys, tracker config, etc.)
# 3. Create environment from configuration
torrust-tracker-deployer create environment --env-file my-env.json
# 4a. Provision NEW VM infrastructure
torrust-tracker-deployer provision my-environment
# 4b. OR Register EXISTING infrastructure (alternative to provision)
torrust-tracker-deployer register my-environment --instance-ip 192.168.1.100
# 5. Configure system (Docker, Docker Compose, firewall)
torrust-tracker-deployer configure my-environment
# 6. Verify deployment infrastructure
torrust-tracker-deployer test my-environment
# 7. Deploy application configuration and files
torrust-tracker-deployer release my-environment
# 8. Start Torrust Tracker services
torrust-tracker-deployer run my-environment
# 9. Destroy environment when done
torrust-tracker-deployer destroy my-environmentThis workflow deploys a complete Torrust Tracker instance with all configuration and services running.
The deployer implements a hybrid approach offering two levels of command interface:
Individual commands for precise control over each deployment step:
create→provision→configure→release→run- Each command performs one specific operation
- Ideal for CI/CD, automation, debugging, and advanced users
- Implementation Priority: High (these are implemented first)
Simplified commands that orchestrate multiple plumbing commands:
deploy- Intelligent deployment from current state to running- Automatically determines next steps based on environment state
- If environment is already provisioned, starts from configure
- If environment is already configured, starts from release
- Implementation Priority: Medium (after plumbing commands are stable)
# Porcelain: Simple deployment (future)
torrust-tracker-deployer create myenv
torrust-tracker-deployer deploy myenv # Runs provision→configure→release→run
# Plumbing: Step-by-step control (current focus)
torrust-tracker-deployer create myenv
torrust-tracker-deployer provision myenv
torrust-tracker-deployer configure myenv
torrust-tracker-deployer release myenv
torrust-tracker-deployer run myenvNote: Porcelain commands only automate the core deployment workflow (provision → configure → release → run). Management commands like create, list, check, status, destroy remain individual operations.
# Utility Commands (Planned)
torrust-tracker-deployer check # Validate required tools (not yet implemented)
torrust-tracker-deployer list # List all environments (not yet implemented)
# Environment Management
torrust-tracker-deployer create template [PATH] # ✅ Generate configuration template
torrust-tracker-deployer create environment -f <file> # ✅ Create environment from config
torrust-tracker-deployer show <env> # ✅ Display environment information
# Plumbing Commands (Low-Level)
torrust-tracker-deployer provision <env> # ✅ Create VM infrastructure
torrust-tracker-deployer register <env> --instance-ip <IP> # ✅ Register existing infrastructure
torrust-tracker-deployer configure <env> # ✅ Setup VM (Docker, Docker Compose, firewall)
torrust-tracker-deployer release <env> # ✅ Deploy application files and configuration
torrust-tracker-deployer run <env> # ✅ Start Torrust Tracker services
# Validation
torrust-tracker-deployer test <env> # ✅ Verify infrastructure (cloud-init, Docker, Docker Compose)
# Cleanup
torrust-tracker-deployer destroy <env> # ✅ Destroy infrastructure and clean upStatus: ❌ Not Implemented
State Transition: None
Purpose: Verify all required third-party tools are installed and properly configured.
torrust-tracker-deployer check [OPTIONS]Validates:
- OpenTofu installation and version
- Ansible installation and version
- LXD setup and permissions
- SSH key availability
- Network connectivity to container registries
Options:
--fix- Attempt to auto-install missing tools
Environment Variables:
RUST_LOG=debug- Show detailed validation steps via tracing
Example Output:
✅ OpenTofu v1.6.0 - OK
✅ Ansible v2.15.0 - OK
✅ LXD v5.0 - OK
❌ SSH key not found at ~/.ssh/id_rsa
⚠️ Docker registry connectivity - Slow response
Status: ❌ Not Implemented
State Transition: None (read-only)
Purpose: Display a summary of all available deployment environments.
torrust-tracker-deployer list [OPTIONS]Should Display:
- Environment name
- Current deployment state (created, provisioned, configured, etc.)
- Creation timestamp
- Last modified timestamp
- Infrastructure status (if provisioned)
- Brief resource summary (IP address, instance type)
Options:
--format <table|json|yaml>- Output format--state <state>- Filter by deployment state--sort <name|created|modified|state>- Sort criteria
Environment Variables:
RUST_LOG=debug- Show detailed listing information via tracing
Example Output:
NAME STATE CREATED MODIFIED IP ADDRESS
e2e-test provisioned 2 hours ago 30 min ago 10.140.190.14
production running 5 days ago 1 hour ago 10.140.192.45
staging configured 1 day ago 6 hours ago 10.140.191.23
development destroyed 3 days ago 2 days ago -
Status: ✅ Implemented
State Transition: None (read-only)
Purpose: Display detailed information about a specific environment's current state.
torrust-tracker-deployer show <environment>Displays State-Aware Information:
- Environment name and current state
- Provider type (LXD, Hetzner, etc.)
- Infrastructure details (IP, SSH port, SSH user, SSH key path) for Provisioned+ states
- Ready-to-use SSH connection command
- Tracker service URLs for Released/Running states
- Next-step guidance based on current state
Key Features:
- Fast execution - Reads only from local storage, no network connections
- State-aware output - Shows different information based on environment state
- Actionable guidance - Tells users what to do next
Example Output (Running State):
Environment: my-environment
State: Running
Provider: LXD
Infrastructure:
Instance IP: 10.140.190.171
SSH Port: 22
SSH User: torrust
SSH Key: ~/.ssh/torrust_deployer_key
Connection:
ssh -i ~/.ssh/torrust_deployer_key torrust@10.140.190.171
Tracker Services:
UDP Trackers:
- udp://10.140.190.171:6969/announce
HTTP Trackers:
- http://10.140.190.171:7070/announce
API Endpoint:
- http://10.140.190.171:1212/api
Health Check:
- http://10.140.190.171:1313/health_check
Tracker is running! Use the URLs above to connect.
Example Output (Created State):
Environment: my-environment
State: Created
Provider: LXD
Next: Run 'provision my-environment' to create infrastructure
Status: ❌ Not Implemented (future porcelain command)
State Transition: Current state → running (intelligent progression)
Purpose: Orchestrate the deployment workflow from the current environment state to running.
torrust-tracker-deployer deploy <environment> [OPTIONS]Intelligent Behavior:
- From
created: Runsprovision→configure→release→run - From
provisioned: Runsconfigure→release→run - From
configured: Runsrelease→run - From
released: Runsrun - From
running: Reports already running (no-op)
Benefits:
- Simplified user experience for common deployment workflow
- Automatic state detection and appropriate action selection
- Reduces need to remember command sequences
- Ideal for development and testing workflows
Options:
--skip-run- Deploy but don't start services--dry-run- Show what steps would be executed--verbose- Show detailed progress information
Environment Variables:
RUST_LOG=debug- Show detailed deployment orchestration via tracing
Implementation Note: This is a porcelain command that will be implemented after the underlying plumbing commands (provision, configure, release, run) are stable.
Status: ❌ Not Implemented (essential for deployment)
State Transition: → created
Purpose: Initialize a new deployment environment configuration.
torrust-tracker-deployer create <environment-name> [OPTIONS]Current Limitation: Only one hardcoded environment is supported. This command is essential for creating environments and must be implemented for basic deployment functionality.
Essential Functionality:
- Generate environment configuration files
- Set up directory structure for the environment
- Create SSH key pairs if needed
- Initialize template customizations
Options:
--provider <lxd|multipass>- Infrastructure provider--template <path>- Custom template directory--ssh-key <path>- Specific SSH key to use
Status: ✅ Implemented (in E2E tests)
State Transition: created → provisioned
Purpose: Create and initialize VM/container infrastructure.
torrust-tracker-deployer provision <environment> [OPTIONS]Current Implementation:
- Renders OpenTofu templates to
build/tofu/ - Runs
tofu initandtofu apply - Creates LXD container with cloud-init
- Waits for network connectivity
- Returns instance IP address
What It Does:
- Template rendering (OpenTofu configurations)
- Infrastructure initialization (
tofu init) - Resource creation (
tofu apply) - Network and SSH connectivity validation
Options:
--auto-approve- Skip confirmation prompts--keep-on-failure- Don't cleanup on provision failure
Environment Variables:
RUST_LOG=debug- Detailed provisioning logs via tracing
Status: ✅ Implemented
State Transition: created → provisioned
Purpose: Register existing infrastructure as an alternative to provisioning new resources.
torrust-tracker-deployer register <environment> --instance-ip <IP_ADDRESS>Current Implementation:
- Loads existing environment in
Createdstate - Validates SSH connectivity using environment's SSH credentials
- Sets
runtime_outputs.instance_ipto the provided IP address - Marks environment with
provision_method: Registeredmetadata - Renders Ansible templates with runtime variables
- Transitions to
Provisionedstate
Use Cases:
- Deploy to spare/existing servers
- Use infrastructure from unsupported cloud providers
- E2E testing with Docker containers (faster than VMs)
- Custom infrastructure configurations
Arguments:
<environment>- Name of environment inCreatedstate--instance-ip <IP_ADDRESS>- IP address of existing instance (IPv4 or IPv6)
Instance Requirements:
- Ubuntu 24.04 LTS
- SSH connectivity with credentials from
create environment - Public SSH key installed for access
- Username with sudo access
Example:
# First, create the environment with SSH credentials
torrust-tracker-deployer create environment -f config.json
# Register existing server instead of provisioning
torrust-tracker-deployer register my-environment --instance-ip 192.168.1.100
# Output:
# ✓ Loading environment...
# ✓ Validating SSH connectivity...
# ✓ Registering instance IP: 192.168.1.100
# ✓ Rendering Ansible templates...
# ✓ Environment registered successfullyImportant: When you destroy a registered environment, the underlying infrastructure is preserved. Only the deployer's environment data is removed. This is a key safety feature for registered instances.
Environment Variables:
RUST_LOG=debug- Detailed registration logs via tracing
Status: ✅ Implemented
State Transition: provisioned → configured
Purpose: Configure the provisioned infrastructure with required software and system settings.
torrust-tracker-deployer configure <environment>Current Implementation:
- Renders Ansible templates with runtime variables
- Waits for cloud-init completion
- Installs Docker engine via Ansible playbook
- Installs Docker Compose via Ansible playbook
- Verifies successful installation
- Updates environment state to
configured
Planned Enhancements (Future):
- System security configuration (UFW firewall, automatic updates) - Partially implemented in app layer
- User account setup
- System monitoring setup
- Log rotation configuration
Example:
# Configure provisioned environment
torrust-tracker-deployer configure my-environment
# Output:
# ✓ Rendering Ansible templates...
# ✓ Waiting for cloud-init completion...
# ✓ Installing Docker...
# ✓ Installing Docker Compose...
# ✓ Environment configured successfullyStatus: ❌ Not Implemented (critical for deployment)
State Transition: configured → released
Purpose: Deploy Torrust Tracker application files and configuration.
torrust-tracker-deployer release <environment> [OPTIONS]Critical Functionality:
- Generate Docker Compose configuration for Torrust Tracker
- Create environment variable files
- Copy application configuration to VM
- Pull required Docker images
- Validate configuration files
Options:
--config <path>- Custom tracker configuration--image-tag <tag>- Specific Torrust Tracker image version--dry-run- Validate without deploying
Status: ❌ Not Implemented
State Transition: released → running
Purpose: Start the Torrust Tracker Docker Compose stack.
torrust-tracker-deployer run <environment> [OPTIONS]Should Include:
- Execute
docker-compose up -d - Validate service startup
- Check container health status
- Display service URLs and ports
Options:
--wait- Wait for all services to be healthy--logs- Show service logs during startup--timeout <seconds>- Startup timeout
Status: ✅ Implemented
State Transition: None (validation only, does not change environment state)
Purpose: Verify that the deployment infrastructure is properly configured and ready.
torrust-tracker-deployer test <environment>Current Implementation:
- Verifies cloud-init completion on the provisioned instance
- Validates Docker installation and availability
- Validates Docker Compose installation and version
- Returns success/failure status for the entire infrastructure stack
Use Cases:
- Verify infrastructure after provisioning
- Confirm configuration was successful
- Validate environment before application deployment
- Troubleshooting infrastructure issues
Example:
# Test infrastructure readiness
torrust-tracker-deployer test my-environment
# Output:
# ✓ Checking cloud-init status...
# ✓ Validating Docker installation...
# ✓ Validating Docker Compose installation...
# ✓ All infrastructure checks passedPlanned Enhancements (Future):
- HTTP endpoint health checks (when application is deployed)
- Torrent tracker API validation (when tracker is running)
- Database connectivity tests (when database is deployed)
- Performance baseline checks
Status: ✅ Implemented
State Transition: Configured → Released
Purpose: Deploy application configuration files and prepare the environment for running services.
torrust-tracker-deployer release <environment>Current Implementation:
- Creates storage directory structure on VM (
/opt/torrust/storage/tracker/) - Initializes SQLite database for tracker
- Renders tracker configuration from environment settings (
tracker.toml) - Generates Docker Compose environment variables (
.env) - Deploys all configuration files to VM
- Synchronizes Docker Compose stack files
What Gets Deployed:
- Tracker configuration:
/opt/torrust/storage/tracker/etc/tracker.toml - Database file:
/opt/torrust/storage/tracker/lib/database/tracker.db - Environment variables:
/opt/torrust/.env - Docker Compose stack:
/opt/torrust/docker-compose.yml
Use Cases:
- Deploy application after infrastructure is configured
- Update tracker configuration (re-run after editing environment.json)
- Prepare environment for running services
Example:
# Deploy application configuration
torrust-tracker-deployer release my-environment
# Output:
# ✓ Creating tracker storage directories...
# ✓ Initializing tracker database...
# ✓ Rendering tracker templates...
# ✓ Deploying tracker configuration...
# ✓ Deploying Docker Compose files...
# ✓ Release complete - environment ready to runConfiguration Source:
The release command uses tracker configuration from your environment JSON:
{
"tracker": {
"core": {
"database_name": "tracker.db",
"private": false
},
"udp_trackers": [{ "bind_address": "0.0.0.0:6868" }],
"http_trackers": [{ "bind_address": "0.0.0.0:7070" }],
"http_api": {
"bind_address": "0.0.0.0:1212",
"admin_token": "MyAccessToken"
}
}
}Idempotent Operation:
- Can be re-run safely to update configuration
- Existing database is preserved
- Configuration files are overwritten with new values
Status: ✅ Implemented
State Transition: Released → Running
Purpose: Start the Torrust Tracker application services and validate they are running.
torrust-tracker-deployer run <environment>Current Implementation:
- Starts Docker Compose services (
docker compose up -d) - Validates services are running via Docker status
- Performs external health checks on tracker API
- Verifies firewall allows external access
Services Started:
- Tracker container (
torrust/tracker:develop)- UDP Tracker endpoints (ports 6868, 6969 by default)
- HTTP Tracker endpoint (port 7070 by default)
- HTTP API endpoint (port 1212 by default)
Health Checks Performed:
- Docker Compose Status - Verifies containers are running
- Tracker API Health (required) - Tests external accessibility of HTTP API
- Endpoint:
http://<vm-ip>:1212/api/health_check - Validates service functionality AND firewall configuration
- Endpoint:
- HTTP Tracker Health (required) - Tests external accessibility of HTTP tracker
- Endpoint:
http://<vm-ip>:7070/health_check - Validates HTTP tracker is accessible externally
- Endpoint:
Use Cases:
- Start tracker services after release
- Restart services after configuration changes
- Validate tracker is accessible externally
Example:
# Start tracker services
torrust-tracker-deployer run my-environment
# Output:
# ✓ Starting Docker Compose services...
# ✓ Validating services are running...
# ✓ Checking tracker API accessibility...
# ✓ Tracker services running and accessibleVerification:
After running, you can access the tracker:
# Get VM IP
VM_IP=$(torrust-tracker-deployer show my-environment | grep 'IP Address' | awk '{print $3}')
# Test tracker API
curl http://$VM_IP:1212/api/health_check
# Get tracker statistics
curl http://$VM_IP:1212/api/v1/statsAnnounce URLs:
- UDP:
udp://<vm-ip>:6868/announceorudp://<vm-ip>:6969/announce - HTTP:
http://<vm-ip>:7070/announce
Status: ❌ Not Implemented
State Transition: None (read-only)
Purpose: Display comprehensive environment status and information.
torrust-tracker-deployer status <environment> [OPTIONS]Should Display:
- Current deployment state
- Infrastructure status (VM running, IP address)
- Service health (containers, ports, endpoints)
- Resource usage (CPU, memory, disk)
- Recent deployment history
Options:
--format <table|json|yaml>- Output format--watch- Continuous monitoring mode--services-only- Show only service status
Status: 🔄 Being Implemented
State Transition: Any state → destroyed
Purpose: Clean up all infrastructure and resources for an environment.
torrust-tracker-deployer destroy <environment> [OPTIONS]Current Implementation:
- Runs
tofu destroy --auto-approve - Removes LXD containers and networks
- Cleans up temporary files
Should Include:
- Stop running services gracefully
- Backup data if requested
- Remove all infrastructure resources
- Clean up local configuration files
- Confirm destruction completion
Options:
--force- Skip confirmation prompts--backup- Create backup before destruction--keep-data- Preserve persistent data volumes
Essential low-level commands for the complete deployment workflow:
- ✅
create template- Template generation (completed) - ✅
create environment- Environment initialization (completed) - ✅
provision- Infrastructure provisioning (completed) - ✅
register- Register existing infrastructure (completed) - ✅
configure- System configuration (completed) - ✅
test- Infrastructure validation (completed) - ✅
destroy- Infrastructure cleanup (completed) - ❌
release- Application deployment (not yet implemented - critical for deploying Torrust Tracker) - ❌
run- Service management (not yet implemented)
Management and operational commands:
- ❌
status- Environment monitoring (not yet implemented) - ❌
list- Environment listing and overview (not yet implemented)
High-level commands built on top of stable plumbing commands:
- ❌
deploy- Smart deployment orchestration (not yet implemented - porcelain command)
Additional features and utilities:
- ❌
check- Tool validation (not yet implemented)
- Hybrid approach: Combines low-level plumbing commands with high-level porcelain commands
- Plumbing first: Individual commands (
provision,configure, etc.) implemented before orchestration commands - Porcelain commands scope: Only automate the deployment workflow (
provision→configure→release→run) - Management commands:
create,list,check,status,destroyremain individual operations
- All commands use the tracing crate for logging (control verbosity with
RUST_LOGenvironment variable) - Set
RUST_LOG=debugfor detailed output,RUST_LOG=infofor standard output - Configuration should be environment-aware once multi-env support is added
- Error handling should be consistent across all commands
- Each command should validate prerequisites before execution
- State transitions should be atomic where possible