{"id":13557140,"url":"https://github.com/intaro/pinboard","last_synced_at":"2026-05-30T20:00:53.991Z","repository":{"id":65539707,"uuid":"9739493","full_name":"intaro/pinboard","owner":"intaro","description":"Realtime PHP monitoring system which aggregates and displays Pinba data.","archived":false,"fork":false,"pushed_at":"2026-05-28T05:05:41.000Z","size":5789,"stargazers_count":473,"open_issues_count":17,"forks_count":89,"subscribers_count":43,"default_branch":"master","last_synced_at":"2026-05-28T07:09:59.561Z","etag":null,"topics":["apm","docker","monitoring","mysql","performance-monitoring","php","pinba","symfony"],"latest_commit_sha":null,"homepage":"http://intaro.github.io/pinboard/","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/intaro.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG","contributing":"docs/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2013-04-29T02:07:13.000Z","updated_at":"2026-05-28T05:05:36.000Z","dependencies_parsed_at":"2023-01-28T06:25:10.840Z","dependency_job_id":null,"html_url":"https://github.com/intaro/pinboard","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/intaro/pinboard","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intaro%2Fpinboard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intaro%2Fpinboard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intaro%2Fpinboard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intaro%2Fpinboard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/intaro","download_url":"https://codeload.github.com/intaro/pinboard/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/intaro%2Fpinboard/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33707328,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apm","docker","monitoring","mysql","performance-monitoring","php","pinba","symfony"],"created_at":"2024-08-01T12:04:11.259Z","updated_at":"2026-05-30T20:00:53.947Z","avatar_url":"https://github.com/intaro.png","language":"PHP","funding_links":[],"categories":["PHP","php"],"sub_categories":[],"readme":"# Pinboard\n\nA web admin panel for **Pinba** — a MySQL storage engine that collects real-time performance statistics from PHP applications.\n\nPinba was originally developed by [@tony2001](https://github.com/tony2001/pinba_engine) for MySQL ≤ 5.6 and is no longer maintained. This project ships with the [@XOlegator/pinba_engine](https://github.com/XOlegator/pinba_engine) fork, which adds MySQL 8.0 and 8.4 support. Pinboard itself is agnostic to which engine build you use.\n\n![Pinboard screenshots](docs/images/screenshot.png)\n\n## What is this?\n\n**Pinba** is a system for passive performance monitoring of PHP sites:\n\n1. **PHP extension** (`pinba`) — embedded in each PHP process, collects request timing, memory usage, CPU time, and custom timer groups. Sends a UDP packet to a Pinba server at the end of every request.\n2. **Pinba MySQL engine** (`pinba_engine`) — a MySQL plugin that receives those UDP packets and stores them as virtual tables. Acts as the \"server\" that listens on UDP port 30002.\n3. **Pinboard** (this project) — a Symfony web app that reads data from the Pinba MySQL engine, aggregates it on a 15-minute schedule, and displays dashboards with request-time histograms, memory usage graphs, error rates, and slow-request logs.\n\n```\nPHP app  ──UDP──▶  MySQL + pinba_engine  ──SQL──▶  Pinboard web UI\n(pinba ext)           (collects stats)              (aggregates \u0026 shows)\n```\n\n## Quick start (Docker Hub — recommended)\n\nThe fastest way to run the full stack. No build step needed.\n\n**Prerequisites:** Docker Engine + Docker Compose v2.\n\n```bash\n# 1. Copy the example env file and fill in the required values\ncp .env.public.example .env\n\n# Edit .env — set APP_SECRET (openssl rand -hex 32) and passwords\nnano .env\n\n# 2. Start the stack\ndocker compose -f docker-compose.public.yml up -d\n\n# 3. Create the first admin user (run once)\ndocker exec pinboard-web php bin/console add-user admin@example.com yourpassword ROLE_ADMIN\n```\n\nOpen **http://localhost:8080** (or `PINBOARD_HTTP_PORT` from your `.env`).\n\n### Sending stats from your PHP app\n\nAdd to your PHP configuration (`php.ini` or pool config):\n\n```ini\npinba.enabled = 1\npinba.server  = \u003cdocker-host-ip\u003e:30002\n; use PINBA_UDP_PORT from .env if you changed it from the default\n```\n\nRestart PHP-FPM and make a few requests on your site.\n\n\u003e **When will data appear?**\n\u003e\n\u003e Pinboard aggregates raw Pinba data on a 15-minute schedule. There is a two-stage warm-up:\n\u003e\n\u003e | Time after first request | What becomes visible |\n\u003e |---|---|\n\u003e | ~15 min (1 aggregation) | Server appears on the **main dashboard** (`/`) with basic request stats |\n\u003e | ~2.5 h (10 aggregations) | Server appears in the **navigation menu** on the left |\n\u003e\n\u003e The navigation menu requires at least 10 aggregation cycles to filter out one-off or test traffic.\n\u003e To see data immediately without waiting, trigger aggregation manually:\n\u003e\n\u003e ```bash\n\u003e docker exec pinboard-aggregate php bin/console aggregate\n\u003e ```\n\u003e\n\u003e Even after a manual run the navigation menu will remain empty until 10 cycles have accumulated. Use the main dashboard link directly in the meantime.\n\n### Docker images used\n\n| Image | Description |\n|---|---|\n| `xolegator/pinba-engine:8.4-lts` | MySQL 8.4 LTS with Pinba storage engine plugin |\n| `xolegator/pinboard:latest` | Pinboard web UI + aggregate worker |\n\nThe MySQL image bundles the [XOlegator/pinba_engine](https://github.com/XOlegator/pinba_engine) plugin — a fork of the original [tony2001/pinba_engine](https://github.com/tony2001/pinba_engine) with MySQL 8.0/8.4 support added.\n\n## Developer setup (run on host)\n\nFor local development without Docker.\n\n**Requirements:** PHP ≥ 8.5, MySQL 8.x with `pinba_engine` plugin, Node.js ≥ 22, pnpm ≥ 9.\n\n```bash\n# PHP dependencies\ncomposer install\n\n# Frontend dependencies and build\npnpm install\npnpm build\n\n# App configuration\ncp .env .env.local\n# Edit .env.local — set DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD\n\n# Database migrations\nphp bin/console doctrine:migrations:migrate\n\n# Create first user\nphp bin/console add-user admin@example.com yourpassword ROLE_ADMIN\n\n# Start a web server (e.g. Symfony CLI or nginx + php-fpm)\nsymfony serve\n```\n\n## Developer setup (Docker — dev stack)\n\nFor development with Docker, using source-mounted volumes and Xdebug support:\n\n```bash\n# Start dev stack (MySQL 8.4 LTS by default)\nmake up\n\n# Or explicitly choose MySQL version:\nmake up84   # MySQL 8.4 LTS (same as default)\nmake up80   # MySQL 8.0 (for compatibility testing)\n\n# Run migrations and create a user\nmake db_migrate\ndocker compose --env-file ./docker/.env -f ./docker/docker-compose.yml \\\n  exec -u www-data php-fpm php bin/console add-user admin@example.com yourpassword ROLE_ADMIN\n```\n\nSee [docs/docker.md](docs/docker.md) for full details on both the dev stack and the public image stack.\n\n## Console commands\n\n| Command | Description |\n|---|---|\n| `php bin/console aggregate` | Run the aggregation pipeline (normally runs via cron every 15 min) |\n| `php bin/console add-user \u003cemail\u003e \u003cpassword\u003e [ROLE] [hosts_regexp]` | Create or update a user |\n| `php bin/console users:migrate-file-to-db` | Migrate users from file-based auth to DB |\n| `php bin/console users:migrate-db-to-file` | Migrate users from DB auth to file |\n| `php bin/console register-crontab` | Print a crontab entry for the aggregation job |\n\n## Configuration\n\nKey environment variables (set in `.env.local` or as Docker env):\n\n| Variable | Default | Description |\n|---|---|---|\n| `DB_HOST` | `127.0.0.1` | MySQL host |\n| `DB_PORT` | `3306` | MySQL port |\n| `DB_NAME` | `pinba` | Database name |\n| `DB_USER` | — | Database user |\n| `DB_PASSWORD` | — | Database password |\n| `DB_SERVER_VERSION` | `8.4.0` | MySQL server version (for Doctrine) |\n| `APP_AUTH_USER_SOURCE` | `file` | User storage: `file` or `db` |\n| `APP_RECORDS_LIFETIME` | `P1M` | How long to keep raw data (ISO 8601 duration) |\n| `APP_AGGREGATION_PERIOD` | `PT15M` | Aggregation window size |\n| `APP_LOGGING_LONG_REQUEST_TIME_GLOBAL` | `1.5` | Slow request threshold (seconds) |\n| `APP_NOTIFICATION_ENABLE` | `0` | Enable email notifications |\n\nFull variable reference: [docs/configuration.md](docs/configuration.md)\n\n## Related projects\n\n- **[XOlegator/pinba_engine](https://github.com/XOlegator/pinba_engine)** — MySQL 8.0/8.4 port of the Pinba storage engine (fork of the original [tony2001/pinba_engine](https://github.com/tony2001/pinba_engine), which supported MySQL ≤ 5.6 and is no longer maintained).\n- **[PHP Pinba extension](https://github.com/tony2001/pinba_extension)** — the PHP extension that sends UDP packets. Available for PHP 7/8 via PECL or package managers.\n\n## Documentation\n\n- [Configuration reference](docs/configuration.md)\n- [Docker: quick-start \u0026 dev stack](docs/docker.md)\n- [Deployment \u0026 operations](docs/deployment.md)\n- [Testing](docs/testing.md)\n- [Code standards](docs/standards.md)\n\n## Upgrading from 1.x\n\nIf you have an existing Pinboard 1.x (Silex-based) installation:\n\n1. Back up the database.\n2. Check out this branch / the new release.\n3. Run `composer install \u0026\u0026 pnpm install \u0026\u0026 pnpm build`.\n4. Copy your old `config/parameters.yml` — file-based auth settings are preserved.\n5. Run `php bin/console doctrine:migrations:migrate`.\n\nSee [docs/deployment.md](docs/deployment.md) for the full upgrade guide.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fintaro%2Fpinboard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fintaro%2Fpinboard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fintaro%2Fpinboard/lists"}