Skip to content

feat: [#236] make Docker Compose tracker ports dynamic#237

Merged
josecelano merged 4 commits intomainfrom
236-dynamic-tracker-ports-in-docker-compose
Dec 15, 2025
Merged

feat: [#236] make Docker Compose tracker ports dynamic#237
josecelano merged 4 commits intomainfrom
236-dynamic-tracker-ports-in-docker-compose

Conversation

@josecelano
Copy link
Copy Markdown
Member

@josecelano josecelano commented Dec 15, 2025

Description

This PR implements dynamic tracker ports in Docker Compose templates, replacing hardcoded port values with Tera template variables extracted from the tracker configuration.

Closes #236

Changes

Core Implementation

  • Extended DockerComposeContext with tracker port fields (udp_tracker_ports, http_tracker_ports, http_api_port)
  • Created TrackerPorts struct to group port parameters and resolve clippy too_many_arguments warning
  • Implemented extract_tracker_ports() helper to extract ports from TrackerConfig domain model
  • Updated docker-compose.yml.tera template with Tera loops for dynamic port rendering

Files Modified

  • src/infrastructure/templating/docker_compose/template/wrappers/docker_compose/context.rs - Added TrackerPorts struct and port fields
  • src/application/steps/rendering/docker_compose_templates.rs - Implemented port extraction logic
  • templates/docker-compose/docker-compose.yml.tera - Replaced hardcoded ports with dynamic Tera variables
  • Updated 27+ test call sites across context.rs, template.rs, docker_compose.rs, project_generator.rs

Testing

Automated Tests ✅

  • 1473 unit tests pass (11.95s)
  • 8 E2E integration tests pass
  • 371 doc tests pass (22.20s)
  • All linters pass (markdown, YAML, TOML, clippy, rustfmt, shellcheck, cspell)
  • Pre-commit validation: 6/6 steps pass (4m 58s)

Manual E2E Test ✅

Successfully completed full deployment workflow with custom port configuration.

Test Configuration:

  • 3 UDP Tracker Ports: 8080, 8081, 8082 (instead of default 6868, 6969)
  • 2 HTTP Tracker Ports: 9090, 9091 (instead of default 7070)
  • 1 HTTP API Port: 3030 (instead of default 1212)

Test Results:

  1. ✅ Environment created successfully
  2. ✅ Infrastructure provisioned with LXD
  3. ✅ Instance configured with Ansible
  4. ✅ docker-compose.yml generated with correct dynamic ports:
    ports:
      # UDP Tracker Ports (dynamically configured)
      - 8080:8080/udp
      - 8081:8081/udp
      - 8082:8082/udp
      # HTTP Tracker Ports (dynamically configured)
      - 9090:9090
      - 9091:9091
      # HTTP API Port (dynamically configured)
      - 3030:3030
  5. ✅ Tracker started successfully
  6. ✅ Container verified running with correct port mappings:
    0.0.0.0:8080-8082->8080-8082/udp
    0.0.0.0:9090-9091->9090-9091/tcp
    0.0.0.0:3030->3030/tcp
    
  7. ✅ Services verified accessible from outside VM (IP: 10.140.190.152):
    • HTTP API: curl http://10.140.190.152:3030/api/health_check{"status":"Ok"}
    • HTTP Tracker 1: curl http://10.140.190.152:9090/announce → Responding
    • HTTP Tracker 2: curl http://10.140.190.152:9091/announce → Responding
  8. ✅ Environment destroyed cleanly

Key Achievements:

  • ✅ Multiple UDP trackers (3 ports) working simultaneously
  • ✅ Multiple HTTP trackers (2 ports) working simultaneously
  • ✅ Custom API port responding correctly
  • ✅ All services accessible on configured custom ports

Implementation Details

Before (Hardcoded):

ports:
  - "6868:6868/udp"
  - "6969:6969/udp"
  - "7070:7070"
  - "1212:1212"

After (Dynamic):

ports:
  {% for port in udp_tracker_ports %}
  - "{{ port }}:{{ port }}/udp"
  {% endfor %}
  {% for port in http_tracker_ports %}
  - "{{ port }}:{{ port }}"
  {% endfor %}
  - "{{ http_api_port }}:{{ http_api_port }}"

Architecture

The implementation follows the existing pattern established by AnsibleVariablesContext:

  1. Port extraction in RenderDockerComposeTemplatesStep
  2. Domain model (TrackerConfig) as source of truth
  3. Infrastructure layer handles serialization
  4. Tera template rendering with dynamic loops

Commits

Checklist

  • Code follows DDD layer placement guidelines
  • All automated tests pass
  • Pre-commit validation passes
  • Conventional commit format used
  • Issue number referenced in commits
  • Manual E2E test completed
  • Feature verified working in real deployment

- Add udp_tracker_ports, http_tracker_ports, http_api_port fields to DockerComposeContext
- Update new_sqlite() and new_mysql() constructors to accept port parameters
- Add getter methods for port fields
- Implement extract_tracker_ports() helper in RenderDockerComposeTemplatesStep
- Update all unit tests to provide port values
- Phase 1 complete: Context extended, port extraction implemented
- Replace hardcoded UDP ports (6868, 6969) with loop over udp_tracker_ports
- Replace hardcoded HTTP port (7070) with loop over http_tracker_ports
- Replace hardcoded API port (1212) with http_api_port variable
- Add descriptive comments explaining dynamic configuration
- Phase 4 complete: Template now renders ports from context
- Add assertions to check default ports (6969 UDP, 7070 HTTP, 1212 API) are rendered
- Verify hardcoded port 6868 is NOT present in output
- Ensures template correctly uses Tera variables instead of hardcoded values
- Phase 5 complete: Testing and verification added
…s struct

- Create TrackerPorts struct to group port parameters (udp_tracker_ports, http_tracker_ports, http_api_port)
- Reduces DockerComposeContext::new_mysql() from 8 to 6 parameters (below clippy limit of 7)
- Update all constructors and call sites to use TrackerPorts
- Export TrackerPorts from docker_compose module for public API
- Add TrackerPorts imports in test modules only where needed
@josecelano josecelano self-assigned this Dec 15, 2025
@josecelano
Copy link
Copy Markdown
Member Author

ACK 95d5e13

@josecelano josecelano merged commit a540a12 into main Dec 15, 2025
34 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Dynamic Tracker Ports in Docker Compose Template

1 participant