Jeppe B dd4c9da86c Merge pull request #137
Add Bird voice webhook handler for automated gate opening and tighten test call number handling
2026-03-09 09:47:01 +01:00
2025-01-29 14:27:44 +01:00

Copenhagen Truck Wash API

Backend API for Copenhagen Truck Wash services.

Architecture & Stack

  • Edge Proxy: Traefik 2.11 (Handles TLS termination, routing, and rate limiting).
  • Web Server: Caddy 2.7 (Serves the PHP application via FastCGI).
  • PHP Runtime: PHP 8.2-FPM (Scale out with workers php1 to php5).
  • Cache/Queue: Redis 7.
  • Observability: Jaeger (Tracing), Prometheus (Metrics).

Getting Started

Prerequisites

  • Docker Desktop 4.x+
  • PHP 8.2 CLI (optional, for host-side testing)

Local Development

To bring up the minimal development stack (Traefik, Redis, Caddy, and one PHP worker):

docker compose up -d traefik redis php1 caddy

The API is accessible at:

  • http://localhost
  • https://localhost (using Traefik default cert)
  • http(s)://localhost/api/ (proxied with /api prefix stripped)

To start all services including multiple PHP workers and development tools (Jaeger, Portainer):

docker compose --profile dev up -d

Configuration

Configuration is primarily managed via environment variables.

  • The application root is located at services/nginx/app.
  • services/nginx/app/config.php loads configuration from the environment (requires USE_ENV=true).
  • php1 performs an automatic composer install on startup if AUTO_COMPOSER_INSTALL=true.

Testing

The project uses a lightweight testing approach using procedural PHP scripts.

Running Tests

Tests are located in services/nginx/app/tests/.

From the host (requires PHP 8.2):

php services/nginx/app/tests/subusers/SelfservePermissionInitTest.php

Inside Docker (recommended for integration tests):

docker compose exec -T php1 php /var/www/html/tests/subusers/SelfservePermissionInitTest.php

Creating New Tests

Place new tests under services/nginx/app/tests/<domain>/. Every test should define the WD constant to point to the app root:

if (!defined('WD')) { define('WD', dirname(__DIR__, 2)); }

Logs & Monitoring

  • Logs: docker compose logs -f [service_name] (e.g., php1, caddy, traefik).
  • Traefik Dashboard: http://traefik.localhost (available in dev).
  • Jaeger (Tracing): http://localhost:16686 (when running with --profile dev).
  • Portainer: http://localhost:9000 (when running with --profile dev).

API Documentation

  • OpenAPI: The authoritative OpenAPI 3.0 contract is at openapi.yaml.
  • Writerside: Documentation projects are located in /Writerside and /Writerside2.
S
Description
Staging repo for api (CI + promotion to GitHub)
Readme
40 MiB
Languages
PHP 93.5%
HTML 3.5%
JavaScript 1.9%
Shell 0.4%
Python 0.3%
Other 0.3%