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/slimslim/psr7guzzlehttp/guzzlevlucas/phpdotenv
🚀 Setup Instructions
-
put the folder in /var/www/html
-
Install dependencies
composer install -
Ensure PHP and NGINX are configured
Check in backend/nginx.conf
-
Map domain in /etc/hosts
127.0.0.1 test.lxdapp.local -
Make sure LXD is working
lxc list -
🔐 CAPTCHA Protection
The /api/v1/proxy POST endpoint expects a field panswer with the correct CAPTCHA.
You can configure PCaptcha class for custom logic.
-
🧪 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.