VisitorPortal has two supported setup paths:
- Demo setup: start the released Docker image with the bundled scripts.
- Development setup: mount the source tree with
docker-compose.ymland build locally.
Use the demo setup when you want to try VisitorPortal without installing PHP, Composer, npm or Node.js on your machine.
Requirements:
- Docker Desktop or Docker Engine is installed and running.
- Docker Compose v2 is available as
docker compose.
Windows:
start.batmacOS/Linux:
sh start.shThe start script:
- creates
.env.demofrom.env.demo.examplewhen needed, - checks Docker and Docker Compose v2,
- pulls the VisitorPortal image,
- starts the app, queue, scheduler, database, Mailhog and Gotenberg containers,
- runs setup inside the app container,
- loads demo data.
After startup:
- App: http://localhost:8080
- Mailhog: http://localhost:8025
If the default ports are already used, set different host ports in .env.demo:
APP_PORT=8081
MAILHOG_PORT=8026All demo accounts use ChangeMe-42!.
| Role | |
|---|---|
| Admin | admin@example.org |
| Reception | reception@example.org |
| Employee | employee@example.org |
| Manager | manager@example.org |
| Welcome monitor | welcome@example.org |
| Security/reception | security@example.org |
Demo users, visitors and visits use reserved example.org, example.com and example.net domains. Demo seeders are blocked in APP_ENV=production. Do not use demo credentials in production.
Stop the demo while keeping local volumes:
sh stop.shReset the demo database and storage volumes:
sh reset-demo.shPull and restart the configured demo image:
sh update.shWindows users can use the matching .bat scripts.
Official demo ZIPs contain .env.demo.example with the published release tag:
VISITORPORTAL_VERSION=v1.2.0This keeps demos reproducible. Source checkouts contain RELEASE_VERSION_PLACEHOLDER until the release workflow replaces it. If you build a demo package manually, replace the placeholder before publishing it.
See Release Artifacts for which ZIP to download.
The development stack uses docker-compose.yml. Its web service is named web.
cp backend/.env.example backend/.env
docker compose run --rm web composer install
docker compose up -d --build
docker compose exec web php artisan key:generate
docker compose exec web php artisan migrate:fresh --seedDevelopment URLs:
- App: http://localhost:8080
- Vite dev server: http://localhost:5173
- Mailhog: http://localhost:8025
Development services:
web: Apache, PHP 8.4 and Laravelnode: Node.js 24 frontend toolingdb: MariaDB 11.4queue: Laravel queue workerscheduler: Laravel scheduler workermailhog: local mail testinggotenberg: PDF rendering
Demo stack status:
docker compose --env-file .env.demo -f docker-compose.demo.yml psDemo app logs:
docker compose --env-file .env.demo -f docker-compose.demo.yml logs --tail=120 appDevelopment app logs:
docker compose logs --tail=120 webRun tests in the development container:
docker compose exec web php artisan testRun Pint in the development container:
docker compose exec web ./vendor/bin/pint --testBuild frontend assets:
docker compose run --rm node npm run build- Docker is not running: start Docker Desktop or the Docker daemon and run the script again.
Docker Compose v2 is required.: update Docker Desktop or install the Docker Compose plugin.- Port
8080or8025is already used: changeAPP_PORTorMAILHOG_PORTin.env.demo, then restart. - Image pull failed: check network access to GitHub Container Registry and the configured
VISITORPORTAL_VERSION. The script continues if the image is already available locally. - App is unhealthy after startup: wait a little longer on first boot, then inspect
appanddblogs. The demo app healthcheck has a longer startup grace period because migrations and seeding can take time. - Database is still starting: inspect
docker compose --env-file .env.demo -f docker-compose.demo.yml logs --tail=120 dband retry after the DB is healthy. - You want a clean demo: run
reset-demo.shorreset-demo.bat. This deletes local demo volumes. - You want a newer release: download the new demo ZIP or set
VISITORPORTAL_VERSIONin.env.demo, then run the update script.
Docker is the recommended development environment. If you run Artisan directly on the host, the local PHP CLI must provide the required extensions, including pdo_mysql, dom, mbstring, xml, xmlwriter, intl, zip, fileinfo and gmp.
Ubuntu/WSL example:
sudo apt update
sudo apt install php8.4-mysql php8.4-xml php8.4-mbstring php8.4-intl php8.4-zip php8.4-gmpCheck loaded extensions:
php -m | grep -E 'PDO|pdo_mysql|dom|mbstring|xml|xmlwriter|intl|zip|gmp'