- Security Notice
- Features
- Project Structure
- Screenshots
- Prerequisites
- Installation
- Development / Debugging
- Build
- Configuration
- Testing
- Docker Deployment
- Troubleshooting
- Roadmap
- License
- Support
- Acknowledgments
- Documentation
- No Built-in Authentication: Pabawi currently has no user authentication or authorization system
- Localhost Access Only: The application should only be accessed via
localhostor127.0.0.1 - Network Access Not Recommended: Do not expose Pabawi directly to network access without external authentication
- Production Deployment: If network access is required, use a reverse proxy (nginx, Apache) with proper authentication and SSL termination
- Privileged Operations: Pabawi can execute commands and tasks on your infrastructure, based on your Bolt configurations - restrict access accordingly
For production or multi-user environments, implement external authentication through a reverse proxy before allowing network access.
- Multi-Source Inventory: View and manage nodes from Bolt inventory and PuppetDB
- Command Execution: Run ad-hoc commands on remote nodes with whitelist security
- Task Execution: Execute Bolt tasks with parameters automatic discovery
- Package Management: Install and manage packages across your infrastructure
- Execution History: Track all operations with detailed results and re-execution capability
- Dynamic Inventory: Automatically discover nodes from PuppetDB
- Node Facts: View comprehensive system information from Puppet agents
- Puppet Reports: Browse detailed Puppet run reports with metrics and resource changes
- Catalog Inspection: Examine compiled Puppet catalogs and resource relationships
- Event Tracking: Monitor individual resource changes and failures over time
- Catalogs diff: Compare and show differences in catalogs from different environments
- Hiera Data Browser: Explore hierarchical configuration data and key usage analysis
- Re-execution: Quickly repeat previous operations with preserved or modified parameters
- Expert Mode: View complete command lines and full output for debugging and auditing
- Real-time Streaming: Monitor command and task execution with live output
- Multi-Source Architecture: Seamlessly integrate data from multiple backend systems
- Graceful Degradation: Continue operating when individual integrations are unavailable
padawi/
├── frontend/ # Svelte 5 + Vite frontend
│ ├── src/
│ │ ├── components/ # UI components
│ │ ├── pages/ # Page components
│ │ └── lib/ # Utilities and stores
│ ├── package.json
│ └── vite.config.ts
├── backend/ # Node.js + TypeScript API server
│ ├── src/
│ │ ├── bolt/ # Bolt integration (temp)
│ │ ├── integrations/ # Plugin architecture
│ │ │ ├── bolt/ # Bolt plugin
│ │ │ ├── puppetdb/ # PuppetDB integration
│ │ │ ├── puppetserver/ # Puppetserver integration
│ │ │ └── hiera/ # Hiera integration
│ │ ├── database/ # SQLite database
│ │ ├── routes/ # API endpoints
│ │ └── services/ # Business logic
│ ├── test/ # Unit and integration tests
│ ├── package.json
│ └── tsconfig.json
├── docs/ # Documentation
└── package.json # Root workspace configuration
📸 View Complete Screenshots Gallery - Comprehensive visual documentation of all Pabawi features and interfaces.
Node inventory with multi-source support and node detail interface for operations
Bolt task execution interface and and detailed execution results with re-run capabilities
Puppet run reports with detailed metrics and Bolt Execution history with filtering
- Node.js 20+
- npm 9+
- Contrainer engine (when used via container image)
- Bolt CLI installed
- A local bolt project directory
- Eventual ssh keys used in Bolt configuration
- Network access to PuppetDB port 8081
- A local certificate signed the the PuppetCA used by PuppetDB
- Network access to PuppetServer port 8140
- A local certificate signed the the PuppetCA used by PuppetServer
- A local copy of your control-repo, with eventual external modules in Puppetfile
- If PuppetDB integration is not active, node facts files must be present on a local directory
# Install all dependencies
npm run install:all# Run backend (port 3000)
npm run dev:backend
# Run frontend (port 5173)
npm run dev:frontendDevelopment Mode (when running both servers separately):
- Frontend UI: http://localhost:5173 (Main application interface)
- Backend API: http://localhost:3000/api (API endpoints)
Production Mode (Docker or built application):
- Application: http://localhost:3000 (Frontend and API served together)
- The backend serves the built frontend as static files
Network Access: If you need to access Pabawi from other machines, use SSH port forwarding or implement a reverse proxy with proper authentication. Do not expose Pabawi directly to the network without authentication.
# Build both frontend and backend
npm run buildCopy backend/.env.example to backend/.env and configure the integrations you want, starting from general settings:
# Pabawi General Configurations
PORT=3000
LOG_LEVEL=info
DATABASE_PATH=./data/executions.db# Bolt Related settings
BOLT_PROJECT_PATH=.
BOLT_COMMAND_WHITELIST_ALLOW_ALL=false
BOLT_COMMAND_WHITELIST=["ls","pwd","whoami"]
BOLT_EXECUTION_TIMEOUT=300000To enable PuppetDB integration, add to backend/.env:
# Enable and configure PuppetDB integration
PUPPETDB_ENABLED=true
PUPPETDB_SERVER_URL=https://puppetdb.example.com
PUPPETDB_PORT=8081
# Token based Authentication (Puppet Enterprise only)
PUPPETDB_TOKEN=your-token-here
# Certs based Authentication (Puppet Enterprise and Open Source Puppet)
PUPPETDB_SSL_ENABLED=true
PUPPETDB_SSL_CA=/path/to/ca.pem
PUPPETDB_SSL_CERT=/path/to/cert.pem
PUPPETDB_SSL_KEY=/path/to/key.pem
PUPPETDB_SSL_REJECT_UNAUTHORIZED=trueSee PuppetDB Integration Setup Guide for detailed configuration instructions.
To enable PuppetServer integration, add to backend/.env:
# Enable and configure PuppetServer integration
PUPPETSERVER_ENABLED=true
PUPPETSERVER_SERVER_URL=https://puppet.example.com
PUPPETSERVERT_PORT=8140
# Token based Authentication (Puppet Enterprise only)
PUPPETSERVER_TOKEN=your-token-here
# Certs based Authentication (Puppet Enterprise and Open Source Puppet)
PUPPETSERVER_SSL_ENABLED=true
PUPPETSERVER_SSL_CA=/path/to/ca.pem
PUPPETSERVER_SSL_CERT=/path/to/cert.pem
PUPPETSERVER_SSL_KEY=/path/to/key.pem
PUPPETSERVER_SSL_REJECT_UNAUTHORIZED=trueSee PuppetServer Integration Setup Guide for detailed configuration instructions.
To enable Hiera integration, add to backend/.env:
# Enable Hiera
HIERA_ENABLED=true
HIERA_CONTROL_REPO_PATH=/path/to/control-repo
# Optional Configuration
HIERA_CONFIG_PATH=hiera.yaml
HIERA_ENVIRONMENTS=["production","development"]
# Fact Source Configuration
HIERA_FACT_SOURCE_PREFER_PUPPETDB=true
HIERA_FACT_SOURCE_LOCAL_PATH=/path/to/facts
# Cache Configuration
HIERA_CACHE_ENABLED=true
HIERA_CACHE_TTL=300000
HIERA_CACHE_MAX_ENTRIES=10000
# Code Analysis Configuration
HIERA_CODE_ANALYSIS_ENABLED=true
HIERA_CODE_ANALYSIS_LINT_ENABLED=true# Run all unit and integration tests
npm test
# Run backend tests only
npm test --workspace=backend
# Run frontend tests only
npm test --workspace=frontend# Run all E2E tests
npm run test:e2e
# Run E2E tests with UI (interactive)
npm run test:e2e:ui
# Run E2E tests in headed mode (visible browser)
npm run test:e2e:headedSee E2E Testing Guide for detailed information about end-to-end testing.
This project uses pre-commit hooks to ensure code quality and security before commits.
# Install pre-commit (requires Python)
pip install pre-commit
# Or using homebrew on macOS
brew install pre-commit
# Install the git hooks
pre-commit install
pre-commit install --hook-type commit-msg
# Run all hooks on all files
pre-commit run --all-files
# Run specific hook
pre-commit run eslint --all-files
# Update hooks to latest versions
pre-commit autoupdate# Skip pre-commit hooks (not recommended)
git commit --no-verify -m "message"For comprehensive Docker deployment instructions including all integrations, see the Docker Deployment Guide.
# Using the provided script (adapt as needed)
./scripts/docker-run.sh
# Or, without the need to git clone, manually executing a command as follows:
docker run -d \
--name pabawi \
--user "$(id -u):1001" \ # Your user must be able to read all the mounted files
-p 127.0.0.1:3000:3000 \
--platform "amd64" \ # amd64 or arm64
-v "$(pwd):/bolt-project:ro" \
-v "$(pwd)/data:/data" \
-v "$(pwd)/certs:/certs" \
-v "$HOME/.ssh:/home/pabawi/.ssh" \
--env-file ./env \
example42/padawi:latestAccess the application at http://localhost:3000
Important: The amount of volume mounts is up to you and depends on where, in the host filesystem, are the files which are needed by the Pabawi instance running inside the container. Also, the paths referenced in your .env file must be relative to container file system.
Examples:
| Kind of data | Path on the host | Volume Mount option | Env setting |
|---|---|---|---|
| Bolt project dir | $HOME/bolt-project | -v "${HOME}/bolt-project:/bolt:ro" | BOLT_PROJECT_PATH=/bolt |
| Control Repo | $HOME/control-repo | -v "${HOME}/control-repo:/control-repo:ro" | HIERA_CONTROL_REPO_PATH=/control-repo |
| Pabawi Data | $HOME/pabawi/data | -v "${HOME}/pabawi/data:/data" | DATABASE_PATH=/data/pabawi.db |
| Puppet certs - Ca | $HOME/puppet/certs/ca.pem | -v "${HOME}/puppet/certs:/certs" | PUPPETSERVER_SSL_CA=/certs/ca.pem |
| Puppet certs - Pabawi user cert | $HOME/puppet/certs/pabawi.pem | -v "${HOME}/puppet/certs:/certs" | PUPPETDB_SSL_CERT=/certs/pabawi.pem |
| Puppet certs - Pabawi user key | $HOME/puppet/certs/private/pabawi.pem | -v "${HOME}/puppet/certs:/certs" | PUPPETDB_SSL_KEY=/certs/private/pabawi.pem |
PUPPETSERVER_SSL_* settings can use the same paths of the relevant PUPPETDB_SSL_ ones.
# SSH port forwarding for remote access
ssh -L 3000:localhost:3000 user@your-pabawi-hostIf you want to allow Pabawi access to different users, you should configure a reverse proxy with authentication.
The docker-compose.yml file includes comprehensive configuration for all integrations:
# Start the service
docker-compose up -d
# View logs
docker-compose logs -f
# Stop the service
docker-compose downTo enable integrations, create a .env file in the project root with your configuration:
# PuppetDB Integration
PUPPETDB_ENABLED=true
PUPPETDB_SERVER_URL=https://puppetdb.example.com
PUPPETDB_PORT=8081
PUPPETDB_TOKEN=your-token-here
PUPPETDB_SSL_ENABLED=true
PUPPETDB_SSL_CA=/ssl-certs/ca.pem
PUPPETDB_SSL_CERT=/ssl-certs/client.pem
PUPPETDB_SSL_KEY=/ssl-certs/client-key.pem
# Puppetserver Integration
PUPPETSERVER_ENABLED=true
PUPPETSERVER_SERVER_URL=https://puppet.example.com
PUPPETSERVER_PORT=8140
PUPPETSERVER_SSL_ENABLED=true
PUPPETSERVER_SSL_CA=/ssl-certs/ca.pem
PUPPETSERVER_SSL_CERT=/ssl-certs/client.pem
PUPPETSERVER_SSL_KEY=/ssl-certs/client-key.pem
# Hiera Integration
HIERA_ENABLED=true
HIERA_CONTROL_REPO_PATH=/control-repo
HIERA_ENVIRONMENTS=["production","staging"]
HIERA_FACT_SOURCE_PREFER_PUPPETDB=trueUpdate the docker-compose.yml volumes section to include your SSL certificates and control repository:
volumes:
# Existing mounts
- ./bolt-project:/bolt-project:ro
- ./data:/data
# SSL certificates for PuppetDB/Puppetserver
- /path/to/ssl/certs:/ssl-certs:ro
# Hiera control repository
- /path/to/control-repo:/control-repo:roAccess the application at http://localhost:3000
If you see SQLITE_CANTOPEN: unable to open database file, the container user (UID 1001) doesn't have write access to the /data volume.
On Linux:
# Set correct ownership on the data directory
sudo chown -R 1001:1001 ./dataOn macOS/Windows: Docker Desktop handles permissions automatically. Ensure the directory exists:
mkdir -p ./dataUsing the docker-run.sh script: The provided script automatically handles permissions on Linux systems.
If PuppetDB integration shows "Disconnected":
- Verify PuppetDB is running and accessible
- Check configuration in
backend/.env - Test connectivity:
curl https://puppetdb.example.com:8081/pdb/meta/v1/version - Review logs with
LOG_LEVEL=debug - See PuppetDB Integration Setup Guide
If Hiera integration shows "Not Found" for all keys:
- Verify control repository path is correct (
HIERA_CONTROL_REPO_PATH) - Check
hiera.yamlexists in control repository root - Ensure hieradata directories exist and contain YAML files
- Verify node facts are available (PuppetDB or local files)
- Check hierarchy path interpolation with available facts
- Review logs with
LOG_LEVEL=debugfor detailed error messages
If expert mode doesn't show complete output:
- Ensure expert mode is enabled (toggle in navigation)
- Check execution was run with expert mode enabled
- Verify database has
stdoutandstderrcolumns - For historical executions, only those run in v0.2.0+ have full output
See Troubleshooting Guide for more solutions.
- Additional Integrations: Ansible, Choria, Tiny Puppet
- Additional Integrations (to evaluate): Terraform, AWS CLI, Azure CLI, Kubernetes
- Scheduled Executions: Cron-like scheduling for recurring tasks
- Custom Dashboards: User-configurable dashboard widgets
- RBAC: Role-based access control and user/groups management
- Audit Logging: Comprehensive audit trail
- CLI: Command Line tool
- v0.5.0: Report filtering, puppet run history visualization, enhanced expert mode with frontend logging
- v0.4.0: Hiera integration, puppetserver CA management removal, enhanced plugin architecture
- v0.3.0: Puppetserver integration, interface enhancements
- v0.2.0: PuppetDB integration, re-execution, expert mode enhancements
- v0.1.0: Initial release with Bolt integration
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
- Architecture Documentation - System architecture and plugin design
- Configuration Guide
- User Guide
- API Documentation
- PuppetDB Integration Setup
- Check the documentation
- Review Troubleshooting Guide
- Enable expert mode for detailed diagnostics
- Search existing GitHub Issues
- Create a new issue with:
- Version information
- Configuration (sanitized)
- Steps to reproduce
- Error messages and logs
Pabawi builds on excellent open-source projects:
- Puppet Bolt: Remote task execution engine
- PuppetDB: Centralized Puppet data storage
- Svelte 5: Reactive UI framework
- Node.js: Backend runtime
- TypeScript: Type-safe development
- SQLite: Embedded database
Special thanks to all contributors and the Puppet community.
- Architecture Documentation - System architecture and plugin design
- Configuration Guide - Complete configuration reference
- User Guide - Comprehensive user documentation
- API Documentation - REST API reference
- Integrations API Documentation - Complete API reference for all integrations
- API Endpoints Reference - Quick reference table of all endpoints
- Authentication Guide - Authentication setup and troubleshooting
- Error Codes Reference - Complete error code reference
- PuppetDB Integration Setup - PuppetDB configuration guide
- Puppetserver Setup - Puppetserver configuration guide
- PuppetDB API Documentation - PuppetDB-specific API endpoints
- E2E Testing Guide - End-to-end testing documentation
- Troubleshooting Guide - Common issues and solutions





