torrust-tracker-deployer 0.1.0

Torrust Tracker Deployer - Deployment Infrastructure with Ansible and OpenTofu
Documentation
# Docker Provisioned Instance Configuration

This directory contains the Docker configuration representing a **provisioned instance** - the state of a VM after provisioning but before configuration in the deployment lifecycle.

## Overview

This Docker configuration provides an Ubuntu 24.04 container that simulates a freshly provisioned VM:

- **SSH Server**: For Ansible connectivity (via supervisor)
- **Base System**: Clean Ubuntu 24.04 LTS installation
- **Sudo User**: `torrust` user with passwordless sudo access
- **Network Access**: For package downloads during configuration phase
- **No App Dependencies**: Docker, Docker Compose, etc. not yet installed (that's the configure phase)

## Files

- `Dockerfile`: Main container configuration for provisioned instance state
- `supervisord.conf`: Supervisor configuration for SSH service management
- `entrypoint.sh`: Container initialization script
- `README.md`: This documentation file

## Deployment Phase Context

This container represents the **provisioned** state in the deployment lifecycle:

```text
┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│    Provision    │───▶│   Configure     │───▶│    Release      │───▶│      Run        │
│                 │    │                 │    │                 │    │                 │
│ • VM Created    │    │ • Install Docker│    │ • Deploy Apps   │    │ • Start Services│
│ • SSH Ready     │    │ • Install Deps  │    │ • Config Files  │    │ • Validate      │
│ • User Setup    │    │ • System Config │    │ • Certificates  │    │ • Monitor       │
└─────────────────┘    └─────────────────┘    └─────────────────┘    └─────────────────┘
   THIS CONTAINER
```

**Future Expansion**: Additional containers can represent later phases:

- `docker/configured-instance/` - After Ansible configuration
- `docker/released-instance/` - After application deployment

## Usage

### Building the Container

From the project root directory:

```bash
# Build the provisioned instance Docker image
docker build -f docker/provisioned-instance/Dockerfile -t torrust-provisioned-instance:latest .
```

### Running the Container

#### Basic Run (for testing)

```bash
# Run provisioned instance container with SSH access
docker run -d \
  --name torrust-provisioned \
  -p 2222:22 \
  torrust-provisioned-instance:latest
```

#### Connect via SSH

```bash
# Connect using password authentication (initial setup)
sshpass -p "torrust123" ssh -p 2222 -o StrictHostKeyChecking=no torrust@localhost

# Or copy SSH key and use key authentication
sshpass -p "torrust123" scp -P 2222 -o StrictHostKeyChecking=no fixtures/testing_rsa.pub torrust@localhost:~/.ssh/authorized_keys
ssh -i fixtures/testing_rsa -p 2222 -o StrictHostKeyChecking=no torrust@localhost
```

### Integration with E2E Configuration Tests

The provisioned instance container simulates the state after VM provisioning and is designed for E2E configuration testing:

1. **Container Lifecycle**: Tests manage container creation and cleanup
2. **SSH Authentication**: Initial password authentication (`torrust:torrust123`)
3. **SSH Key Setup**: Tests copy SSH public key during setup phase
4. **Port Mapping**: SSH port (22) is mapped to host for Ansible connectivity
5. **Inventory Generation**: Container IP is added to Ansible inventory

### Configuration Details

#### User Configuration

- **Username**: `torrust` (matches LXD VM configuration)
- **Password**: `torrust123` (for initial SSH access)
- **Groups**: `sudo`
- **Shell**: `/bin/bash`
- **Sudo**: Passwordless sudo access (`NOPASSWD:ALL`)
- **SSH**: Password authentication enabled initially, key-based authentication supported

#### SSH Configuration

- **Port**: 22 (standard SSH port)
- **Authentication**: Password authentication enabled (`torrust123`)
- **Public Key**: Key-based authentication supported (tests copy public key)
- **Root Login**: Disabled

#### Supervisor Configuration

- **Process Manager**: Supervisor instead of systemd (container-friendly)
- **Services**: SSH service managed by supervisor
- **Logging**: Supervisor handles service logging
- **No Privileges**: No `--privileged` flag required

## Requirements

### For Building

- Docker installed on the build system
- Project repository with `fixtures/testing_rsa.pub` file

### For Running

- Docker installed on the system
- No special privileges required (no `--privileged` flag needed)
- SSH client for connectivity testing

## Troubleshooting

### Container Won't Start

1. Check if Docker daemon is running
2. Verify no port conflicts on port 2222
3. Check container logs: `docker logs <container-name>`

### SSH Connection Fails

1. Verify SSH port mapping: `-p 2222:22`
2. Test password authentication: `sshpass -p "torrust123" ssh -p 2222 torrust@localhost`
3. Check if SSH service is running inside container
4. Verify container is accessible: `docker exec -it <container-name> bash`

### Key Authentication Issues

1. Ensure public key is copied correctly to container
2. Verify SSH key file permissions (should be 600)
3. Check authorized_keys file in container: `~/.ssh/authorized_keys`

## Architecture

This container configuration supports the E2E test split architecture:

```text
┌─────────────────────────────────────────┐
│         E2E Config Tests Binary         │
│                                         │
│  ┌─────────────────────────────────────┐│
│  │       Docker Container              ││
│  │  ┌─────────────────────────────────┐││
│  │  │      Ubuntu 24.04 LTS           │││
│  │  │  - SSH Server (port 22)         │││
│  │  │  - Supervisor (process mgmt)    │││
│  │  │  - torrust user (sudo access)   │││
│  │  │  - Package management (apt)     │││
│  │  └─────────────────────────────────┘││
│  └─────────────────────────────────────┘│
│             ▲                           │
│             │ SSH (port 2222)           │
│             ▼                           │
│  ┌─────────────────────────────────────┐│
│  │         Ansible Client              ││
│  │  - install-docker.yml               ││
│  │  - install-docker-compose.yml       ││
│  │  - Dynamic inventory generation     ││
│  └─────────────────────────────────────┘│
└─────────────────────────────────────────┘
```

## Related Documentation

- [Docker Configuration Testing Research]../../docs/research/e2e-docker-config-testing.md
- [E2E Testing Guide]../../docs/e2e-testing/