Skip to content

Install with Docker

The official image panelica/pnlcs-runtime carries PHP-FPM 8.4, nginx, Node.js 20 and supervisor. On its first start it downloads the latest PNLCS code, installs the PHP dependencies and builds the frontend, so there is nothing to build by hand.

Start it

You need a database next to it. This starts MariaDB and PNLCS on a private Docker network:

docker network create pnlcs-net

docker run -d --name pnlcs-db --network pnlcs-net \
  -v pnlcs_db:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=choose-a-root-password \
  -e MYSQL_DATABASE=pnlcs -e MYSQL_USER=pnlcs -e MYSQL_PASSWORD=choose-a-password \
  mariadb:11

docker run -d --name pnlcs --network pnlcs-net -p 8090:80 \
  -v pnlcs_app:/var/www/pnlcs \
  -e DB_HOST=pnlcs-db -e DB_DATABASE=pnlcs \
  -e DB_USERNAME=pnlcs -e DB_PASSWORD=choose-a-password \
  -e APP_URL=http://localhost:8090 \
  panelica/pnlcs-runtime:1.4

The two named volumes keep your data when a container is replaced: pnlcs_db holds the database, pnlcs_app the application with its .env and uploaded files (ticket attachments, logos, invoice PDFs).

The first start takes 3 to 5 minutes (Composer and the frontend build). Then open http://localhost:8090/install and follow the install wizard. It checks the requirements, creates the administrator with the username and password you choose, and closes itself for good when it is done.

The container runs the scheduler (invoices, reminders, suspensions, backups) every minute and keeps a queue worker running, both under supervisor: there is no cron line to add.

In production

  • Put it behind a reverse proxy that terminates HTTPS, and set APP_URL to the public https:// address.
  • Keep the database on a volume, and back it up (Backups).
  • The image's own page lists every environment variable and production notes: hub.docker.com/r/panelica/pnlcs-runtime.

Update

docker exec pnlcs /usr/local/bin/update.sh

See Updating for what it does and the one error you may meet.