Skip to main content

Documentation Index

Fetch the complete documentation index at: https://help.propops.app/llms.txt

Use this file to discover all available pages before exploring further.

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:
KeyPurpose
PII_ENCRYPTION_KEYEncryption key for personally identifiable information in the database (names, emails, phone numbers) and job files (documents, photos, videos, GDPR reports)
PII_HMAC_KEYHMAC key for searchable encrypted field hashes
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:
DirectoryPurpose
avatarsUser profile photos
branchesBranch logos and assets
cache/thumbnailsGenerated image thumbnails
case-notesJob case note attachments
certificationsContractor certification documents
dashboard-bannersCustom dashboard banner images
gdprGDPR data export reports
jobsJob photos and documents
notices/headersNotice board header images
temp/chunksTemporary file upload chunks
thumbnails/avatarsResized avatar thumbnails
thumbnails/branch-logosResized branch logo thumbnails

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:
FieldDefault value
Emailweb@propops.app
PasswordRandomly generated (printed once in container logs)
RoleSysOps (full system access)
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:
docker compose logs web | grep "seed-sysops"
Store it securely and change it immediately after logging in.
You can customise the default credentials by setting environment variables before the first boot:
# In docker-compose.yml under web > environment, or in your .env
SEED_SYSOPS_EMAIL=admin@yourcompany.com
SEED_SYSOPS_PASSWORD=YourChosenPassword!    # Optional — overrides random generation
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:
propops/
├── docker-compose.yml     # Provided by PropOps
├── docker-data/           # All persistent data (created on first boot)
│   ├── config/
│   │   ├── .env           # Your environment configuration
│   │   └── .htaccess      # Denies direct web access
│   ├── uploads/           # User-uploaded files
│   │   ├── avatars/
│   │   ├── branches/
│   │   ├── case-notes/
│   │   │   └── .htaccess  # Denies direct access
│   │   ├── certifications/
│   │   │   └── .htaccess  # Denies direct access
│   │   ├── gdpr/
│   │   │   └── .htaccess  # Denies direct access
│   │   └── ...            # Other upload subdirectories
│   ├── extensions/        # Platform extensions
│   │   └── .htaccess      # Denies direct access
│   ├── mysql/             # MariaDB database files
│   └── mysql-logs/        # Database query and error logs
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:
ServiceImagePortPurpose
webghcr.io/propops-technologies-ltd/propops-web808080PHP 8.5 / Apache — the PropOps application
dbmariadb:10.113306MariaDB database server
phpmyadminphpmyadmin/phpmyadmin808180Web-based database management
Do not expose port 3306 (MariaDB) or 8081 (phpMyAdmin) to the internet in production. See Configuration for firewall and reverse proxy setup.