# Warehouse A warehousing app: define storage locations, create items, then receive, withdraw, and adjust stock, with an audit trail and low-stock email alerts. To run the local development server, try: ``` export PHP_ENV=prod && php -S 127.0.0.1:8000 -t . ``` ## Running with Docker ``` docker compose up -d --build ``` This starts two services: - **app** — nginx + php-fpm, served at http://localhost:9092 - **db** — MySQL 8, exposed on host port `33060` (only used if `DB_CONNECTION=mysql`) The default database connection is **SQLite** (`database/database.sqlite`), configured via `DB_CONNECTION` in `.env` / `docker-compose.yml`. On first boot the `app` container automatically creates the SQLite file with the correct permissions and runs migrations. To switch to MySQL instead, set `DB_CONNECTION=mysql` in `docker-compose.yml`. To run migrations manually (e.g. after adding a new migration file): ``` docker compose exec app php command.php migrate docker compose exec app php command.php migrate --fresh # drops all tables first, for a clean slate ``` ### phpLiteAdmin A SQLite admin UI is available at http://localhost:9091, password `admin` (change it via the `PHPLITEADMIN_PASSWORD` environment variable in `docker-compose.yml`). It's a development-only tool — don't expose this port outside your local machine. Note: host ports `9092`/`9091` map to the app's internal `80`/`8081` — the host side is deliberately different from the container side because Windows reserves `8081` and `9090` in its dynamic TCP port exclusion range (Hyper-V/WSL2), which blocks Docker from binding either. Check with `netsh interface ipv4 show excludedportrange protocol=tcp` if you hit a similar "ports are not available ... forbidden by its access permissions" error on another port. ## Framework guide This app is built on a small custom MVC framework in `framework/`. See [docs/framework.md](docs/framework.md) for how routing, controllers, views, models/migrations, validation, sessions, caching, queues, and the CLI commands all work. ## Raspberry Pi deployment If you want to run this app directly on a Raspberry Pi with `nginx` and `php-fpm`, see [docs/deploy-raspberry-pi.md](docs/deploy-raspberry-pi.md) and use `scripts/deploy-raspi.sh`.