Prerequisites
Hardware| Resource | Minimum | Recommended |
|---|---|---|
| RAM | 4 GB | 8 GB |
| CPU | 2 cores | 4 cores |
| Disk | 20 GB | 50 GB |
- Linux host: RHEL 8/9, Rocky Linux, AlmaLinux, Ubuntu 22.04+, or any Docker-capable system
- Docker 24+ or Podman 4+ (for container deployment)
- Network access to target hosts on port 22 (SSH)
curlandopensslavailable on the host
| Port | Service | Direction |
|---|---|---|
| 3000 | Frontend (dev/Docker) | Inbound |
| 8000 | Backend API | Inbound |
| 22 | SSH to scan targets | Outbound |
| 443/80 | Frontend (production) | Inbound |
Deployment options
- Docker (recommended)
- Podman
- RPM (bare metal)
- From source
Docker Compose is the fastest path to a running OpenWatch instance. The compose file defines six services: PostgreSQL 15, Redis 7, the FastAPI backend, a Celery worker, a Celery beat scheduler, and an Nginx-based React frontend.Open Generate random keys with:Subsequent starts (without code changes) can skip the build:
1. Clone the repository
2. Configure environment
Copy the example environment file and set secure values:.env and set the required variables:3. Start services
4. Verify
5. Log in
| Field | Value |
|---|---|
| Username | admin |
| Password | admin |
6. Stop services
Production deployment
For production, use the Docker Compose overlay that enables HTTPS, FIPS mode, resource limits, and JSON logging:| Setting | Development | Production |
|---|---|---|
OPENWATCH_DEBUG | true | false |
OPENWATCH_FIPS_MODE | false | true |
OPENWATCH_REQUIRE_HTTPS | false | true |
OPENWATCH_SSH_STRICT_MODE | false | true |
| Frontend ports | 3000:80 | 443:443, 80:80 |
| Resource limits | None | Per-service CPU/memory limits |
| Log driver | Default | JSON file with rotation |
| Restart policy | unless-stopped | always |
- Place TLS certificates in
security/certs/and keys insecurity/keys/. - Set all environment variables to strong, unique values.
- Configure firewall rules to restrict access to ports 8000 and 3000/443.
Post-install checklist
- Backend health check passes:
curl http://localhost:8000/health - Frontend loads in browser
- Default admin password changed
- SSH credentials configured for target hosts
- TLS certificates in place (production only)
- Log rotation configured for
/openwatch/logs/ - Firewall rules restrict access to exposed ports
Environment variables
| Variable | Description | Example |
|---|---|---|
POSTGRES_PASSWORD | PostgreSQL password | Random 32+ character string |
REDIS_PASSWORD | Redis authentication password | Random 32+ character string |
OPENWATCH_SECRET_KEY | Application secret for session signing | openssl rand -hex 32 |
MASTER_KEY | Master encryption key | openssl rand -hex 32 |
OPENWATCH_ENCRYPTION_KEY | Data-at-rest encryption key | openssl rand -hex 32 |
Troubleshooting
Backend container fails to start
Backend container fails to start
Check logs for database connection issues:
Frontend returns 502 Bad Gateway
Frontend returns 502 Bad Gateway
The backend may still be initializing. Wait 30 seconds and retry. Check that the backend container is running:
docker ps | grep openwatch-backend.Celery worker not processing tasks
Celery worker not processing tasks
Permission denied on volume mounts (Podman/SELinux)
Permission denied on volume mounts (Podman/SELinux)
Add the
:Z suffix to volume mounts in the compose file.