Skip to main content
PropOps Web uses Docker Compose to bring up the web server, MariaDB database, and phpMyAdmin in a single command. The first run automatically creates your environment file, generates encryption keys, sets up the database, and seeds a default admin account.
PropOps Web is distributed as a Docker image. You will receive a docker-compose.yml file as part of your licence. Contact hello@propops.app if you have not received yours.

Installation

That’s it. PropOps Web is running.

What happens on first boot

When you run docker compose up for the first time, the entrypoint script automatically performs the following setup:

1. Environment file created

Your .env configuration file is created from .env.example and stored in docker-data/config/.env. This file persists across container rebuilds — updating the application code does not overwrite your configuration.

2. Encryption keys generated

Two cryptographic keys are auto-generated and written into your .env: Both are 64-character hex strings (32 random bytes). They are generated once and must not be changed after data has been encrypted.
Back up your docker-data/config/.env file securely. If you lose these keys, encrypted PII data in the database and encrypted job files cannot be recovered.

3. Database initialised

MariaDB applies the schema and all migrations automatically from the SQL files mounted into /docker-entrypoint-initdb.d/. This only happens on the very first boot when the database is empty.

4. Upload directories created

All required subdirectories under uploads/ are created with correct ownership (www-data) and permissions:

5. Security rules applied

.htaccess files are placed into sensitive upload directories to deny direct web access. Files in these directories are only accessible through authenticated API endpoints:
  • uploads/case-notes/ — denied
  • uploads/certifications/ — denied
  • uploads/gdpr/ — denied
  • extensions/ — denied
  • docker-data/config/ — denied

6. Admin account seeded

A default SysOps administrator account is created with a randomly generated 20-character password: The seeder grants all API and page permissions to the SysOps role. If a SysOps user already exists, seeding is skipped.
The generated password is only displayed once during the first boot. Retrieve it from the container logs:
Store it securely and change it immediately after logging in.
You can customise the default credentials by setting environment variables before the first boot:
Set SEED_SYSOPS=false to disable automatic user creation entirely.

Directory structure

After the first boot, your project directory will contain a docker-data/ folder with all persistent data:
The docker-data/ directory contains your database, uploads, and secrets — all specific to your installation. Back it up regularly.

Data persistence

All data in docker-data/ is stored on your host filesystem. This means:
  • Container rebuilds do not affect your data — updating the PropOps image does not touch uploads, database, or configuration.
  • Image updates do not overwrite your .env or uploaded files.
  • Backing up is straightforward — copy the docker-data/ directory to capture everything.

Services

Docker Compose starts three services:
Do not expose port 3306 (MariaDB) or 8081 (phpMyAdmin) to the internet in production. See Configuration for firewall and reverse proxy setup.