PropOps is licensed software. Each self-hosted instance requires a valid licence key issued by PropOps Technologies Ltd. Contact hello@propops.app to obtain a licence before deploying.
Minimum server requirements
| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 2 vCPU | 4 vCPU |
| RAM | 2 GB | 4 GB |
| Disk | 20 GB SSD | 40 GB+ SSD |
| OS | Ubuntu 22.04 LTS | Ubuntu 22.04 LTS |
| Docker | 24.x | latest stable |
| Docker Compose | v2.x | latest stable |
| Open ports | 80, 443 | 80, 443 |
Disk usage grows over time as photos, documents, and certificate uploads accumulate. Monitor
/uploads and expand storage before it fills. For production deployments, mount a cloud block device (e.g. AWS EBS, Hetzner Volume) at the uploads path.Prerequisites
Before you begin, ensure the following are installed on the host:Install Docker Compose v2
Docker Compose v2 ships as a plugin in modern Docker installations:If not available, install the plugin:
Installation
1. Clone the repository
2. Create the environment file
Copy the example environment file and populate your values:3. Start the containers
4. Run the database migrations
On first boot the schema is applied automatically. For upgrades, apply any pending migrations:5. Set file permissions
The application needs write access to the uploads directory:HTTPS with a reverse proxy
PropOps must be served over HTTPS in production. The recommended approach is to place Nginx with Certbot (Let’s Encrypt) in front of the Docker containers.Install Nginx and Certbot
Create the Nginx site config
/etc/nginx/sites-available/propops and enable it:
Issue an SSL certificate
Managing the containers
| Task | Command |
|---|---|
| Start all services | docker compose up -d |
| Stop all services | docker compose down |
| View logs (all) | docker compose logs -f |
| View web logs only | docker compose logs -f web |
| Restart web container | docker compose restart web |
| Open a shell in the container | docker compose exec web bash |
| Apply a database migration | docker compose exec web php scripts/migrate.php |
| Clear application cache | docker compose exec web php scripts/clear-cache.php |
Upgrading
Backups
Database backup
Uploads backup
Firewall rules
At a minimum, expose only the ports your reverse proxy needs:3306 (MySQL) or 8081 (phpMyAdmin) directly to the internet. Access phpMyAdmin through an SSH tunnel if needed:
First-time configuration
Once the application is running:- Navigate to
https://propops.yourcompany.com— you will see the PropOps login screen. - Sign in with the default admin credentials created during schema initialisation.
- Go to Admin → Settings → General to set your organisation name, logo, and default VAT rate.
- Go to Admin → Branches to create your first branch.
- Go to Admin → Users to invite staff members and configure roles.
- Review Admin → Settings → Email to confirm your SMTP configuration is sending correctly.
Troubleshooting
Containers won't start
Containers won't start
Check for port conflicts — another process may already be using port 8080 or 3306:Review container logs for the error:
Database connection refused
Database connection refused
Ensure the The
db container is healthy before the web container starts. Check:db service should show healthy. If it shows starting, wait 30–60 seconds and try again. The web container has a depends_on declaration for db, but depends_on only waits for the container to start, not for MySQL to be ready to accept connections.File uploads failing
File uploads failing
Check that the uploads directory is writable by Also check your Nginx
www-data:client_max_body_size setting — the default is 1 MB, which is too small for most document uploads. Set it to at least 50M.Push notifications not working
Push notifications not working
Ensure HTTPS is required for push notifications — they will not work on plain HTTP.
VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY, and VAPID_SUBJECT are set in .env. Generate new VAPID keys if needed:Emails not sending
Emails not sending
Test your SMTP configuration from inside the container:Check
APP_URL is set to your public HTTPS URL. Links in emails are built from this value.