Files
lxd-app/backend/app/README.md

3.1 KiB

LXD Proxy API (Slim Framework)

This is a PHP-based API using the Slim 4 Framework that dynamically manages and proxies traffic to LXD containers based on subdomain mappings.


🧩 Features

  • Automatically creates and starts LXD containers per subdomain
  • CAPTCHA validation for provisioning
  • Proxies requests to containerized environments
  • Persists domain-to-container mapping
  • Waits for container service to be ready before forwarding
  • Logs last access per container

📁 Project Structure

backend/ ├── app/ │ ├── src/ │ │ ├── Controllers/ │ │ │ └── ProxyController.php │ │ ├── Services/ │ │ │ └── LxdService.php │ │ └── Utils/ │ │ └── SubdomainHelper.php │ ├── vendor/ # Composer dependencies │ ├── public/ │ │ └── last-access-logs/ │ ├── config.json # Domain-to-container mappings │ └── index.php # Slim entry point ├── composer.json └── README.md


⚙️ Requirements

  • PHP 8.1+
  • LXD installed and configured
  • PHP-FPM + NGINX
  • Composer
  • slim/slim
  • slim/psr7
  • guzzlehttp/guzzle
  • vlucas/phpdotenv

🚀 Setup Instructions

  1. put the folder in /var/www/html

  2. Install dependencies

    composer install
    
    
    
  3. Ensure PHP and NGINX are configured

NGINX config example: ```bash server { listen 80; server_name *.lxdapp.local;

    root /var/www/html/lxd-app/backend/public;
    index index.php;

    location / {
        try_files $uri /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_read_timeout 300;
    }
}
  1. Map domain in /etc/hosts

    127.0.0.1   test.lxdapp.local
    
    
  2. Make sure LXD is working

    lxc list
    
    
  3. 🔐 CAPTCHA Protection

    The /api/v1/proxy POST endpoint expects a field panswer with the correct CAPTCHA.

    You can configure PCaptcha class for custom logic.

  4. 🧪 API Usage

    POST /api/v1/proxy

    Request Body:

    {
    "source": "login",
    "panswer": "abc123"
    }
    
    **Headers:**
    
    Origin: http://customer.lxdapp.local
    
    **Response:**
    ```bash
    {
    "status": "success",
    "ip": "10.210.189.24"
    }
    
    
    

🧠 Notes

Container names are auto-generated using the subdomain prefix.

All containers are mapped in config.json.

If a container does not yet exist, it's created, started, and software is installed.

The system waits for the container to expose port 80 before proxying.

🪵 Logs

Last access logs for containers are saved in:
public/last-access-logs/container-*.txt

NGINX error logs (for debugging):
```bash
tail -f /var/log/nginx/error.log

👨‍💻 Development

Codebase follows PSR-4 autoloading (App\ namespace).

To add new functionality, work within app/src/Controllers or Services.