{"id":48196768,"url":"https://github.com/fclairamb/solidping","last_synced_at":"2026-05-04T00:11:53.623Z","repository":{"id":346462707,"uuid":"1189028253","full_name":"fclairamb/solidping","owner":"fclairamb","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-24T02:04:25.000Z","size":17771,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-25T00:20:35.347Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fclairamb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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":null,"dco":null,"cla":null}},"created_at":"2026-03-22T22:29:37.000Z","updated_at":"2026-03-23T23:35:34.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/fclairamb/solidping","commit_stats":null,"previous_names":["fclairamb/solidping"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/fclairamb/solidping","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fclairamb%2Fsolidping","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fclairamb%2Fsolidping/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fclairamb%2Fsolidping/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fclairamb%2Fsolidping/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fclairamb","download_url":"https://codeload.github.com/fclairamb/solidping/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fclairamb%2Fsolidping/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31407674,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2026-04-04T18:08:12.849Z","updated_at":"2026-05-04T00:11:53.617Z","avatar_url":"https://github.com/fclairamb.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SolidPing\n\nA distributed monitoring platform for checking availability and performance of services across multiple protocols.\n\n## Overview\n\nSolidPing is a multi-tenant monitoring system that enables organizations to monitor their infrastructure through distributed workers executing health checks. It's designed for low resource consumption and easy self-hosting.\n\n### Key Features\n\n- **32 check types**: HTTP, TCP, UDP, ICMP, DNS, SSL/Domain, SSH, FTP/SFTP, SMTP/POP3/IMAP, Email (JMAP passive inbox), WebSocket, gRPC, 6 databases (Postgres, MySQL, MSSQL, Oracle, MongoDB, Redis), 3 message queues (Kafka, RabbitMQ, MQTT), Docker, SNMP, game server (Source/A2S, Minecraft), headless browser, custom JS, heartbeat\n- **Distributed workers**: Multi-region check execution with lease-based scheduling\n- **Multi-tenant**: Organization-scoped data isolation, RBAC, 2FA (TOTP), labels with autocomplete\n- **Low footprint**: Single binary; SQLite, embedded Postgres, or external Postgres\n- **Fast checks**: Sub-minute frequencies supported\n- **Notifications (9 native)**: Slack (OAuth + threads + Marketplace install), Discord (OAuth + webhook), Email, Webhooks, Google Chat, Mattermost, Ntfy, Opsgenie, Pushover\n- **Incidents**: Adaptive resolution with cooldown, group-incident correlation (one alert per outage, not per check), acknowledgment, snooze, manual resolve\n- **On-call \u0026 escalation**: Rotation schedules with overrides, multi-step escalation policies (user / schedule / connection / all-admins targets, repeats)\n- **Credentials encryption at rest**: Envelope encryption with out-of-band master key; secrets never echoed back to the dashboard\n- **Status pages**: Sections, resources, public availability metrics, locale-aware date formatting\n- **Maintenance windows**: Recurring suppression of alerts\n- **JavaScript scripting**: Sandboxed custom monitoring logic\n- **Browser monitoring**: Headless Chrome via Rod\n- **MCP server**: AI/LLM tool access via Model Context Protocol\n- **OAuth**: Google, GitHub, GitLab, Microsoft, Slack, Discord SSO (per-provider enable toggle)\n- **Observability**: Prometheus `/metrics`, Sentry integration, OpenTelemetry\n- **CLI client**: Manage checks and results from the terminal\n- **i18n**: Multi-language dashboard (English, French)\n\n## Quick Start\n\n### Prerequisites\n- Go 1.24+\n- PostgreSQL 15+\n- Docker (for development)\n- Bun (for frontend development)\n\n### Development Setup\n\n```bash\n# Start PostgreSQL\ndocker-compose up -d\n\n# Build and run\nmake build \u0026\u0026 ./solidping serve\n\n# Or use hot reload for development\nmake dev-test   # Backend + frontend with hot reload\n```\n\n### Default Credentials\n- Email: `admin@solidping.com`\n- Password: `solidpass`\n- Organization: `default`\n\n### API Example\n```bash\n# Get a JWT token\nTOKEN=$(curl -s -X POST -H 'Content-Type: application/json' \\\n  -d '{\"org\":\"default\",\"email\":\"admin@solidping.com\",\"password\":\"solidpass\"}' \\\n  'http://localhost:4000/api/v1/auth/login' | jq -r '.accessToken')\n\n# List checks\ncurl -s -H \"Authorization: Bearer $TOKEN\" \\\n  'http://localhost:4000/api/v1/orgs/default/checks'\n```\n\n## Supported Check Types\n\n### Network\n| Protocol | Description |\n|----------|-------------|\n| HTTP/HTTPS | Status codes, body matching, JSON assertions, Basic Auth |\n| TCP | Port connectivity |\n| UDP | Port reachability |\n| ICMP | Ping |\n| DNS | Record resolution |\n| WebSocket | Connection check |\n\n### Security \u0026 Certificates\n| Protocol | Description |\n|----------|-------------|\n| SSL/TLS | Certificate validity and expiration |\n| Domain | Domain name expiration (WHOIS) |\n\n### Email\n| Protocol | Description |\n|----------|-------------|\n| SMTP | Server connectivity, STARTTLS, AUTH |\n| POP3 | Server availability |\n| IMAP | Server availability |\n| Email (JMAP) | Passive inbox monitoring — receive a known message via JMAP and assert delivery |\n\n### Databases\n| Protocol | Description |\n|----------|-------------|\n| PostgreSQL | Connection + query execution |\n| MySQL/MariaDB | Connection + query execution |\n| MongoDB | Ping command |\n| Redis | PING command |\n\n### Remote Access\n| Protocol | Description |\n|----------|-------------|\n| SSH | Server availability |\n| FTP | Server availability |\n| SFTP | Server availability |\n\n### Message Queues\n| Protocol | Description |\n|----------|-------------|\n| Kafka | Broker connectivity |\n| RabbitMQ | Broker connectivity |\n| MQTT | Broker connectivity |\n\n### Infrastructure\n| Type | Description |\n|------|-------------|\n| Docker | Container health |\n| SNMP | Device monitoring |\n| gRPC | Service health |\n| A2S | Source / Steam game server query (Valve A2S) |\n| Minecraft | Minecraft server query |\n\n### Specialized\n| Type | Description |\n|------|-------------|\n| Heartbeat | Passive monitoring via incoming pings |\n| JavaScript | Sandboxed custom monitoring logic |\n| Browser | Headless Chrome (Rod) — JS, CSS, full render |\n\n## Environment Variables\n\nAll `SP_` prefixed variables are handled by the configuration system. Precedence: **Environment variables** \u003e `config.local.yml` \u003e `config.yml` \u003e defaults.\n\n### Core\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `SP_DB_TYPE` | Database type: `postgres`, `sqlite`, `sqlite-memory`, `postgres-embedded` | `sqlite` |\n| `SP_DB_URL` | PostgreSQL connection string | — |\n| `SP_DB_DIR` | SQLite data directory | `.` |\n| `SP_DB_RESET` | Reset database on startup (`true`/`1`) | `false` |\n| `SP_SERVER_LISTEN` | HTTP listen address | `:4000` |\n| `SP_BASE_URL` | Public URL where SolidPing is accessible | `http://localhost:4000` |\n| `SP_SHUTDOWN_TIMEOUT` | Graceful shutdown timeout (duration) | `30s` |\n| `SP_RUN_MODE` | Runtime mode: `test`, `demo` | — |\n| `SP_LOG_LEVEL` | Log level: `debug`, `info`, `warn`, `error` | `info` |\n| `SP_NODE_ROLE` | Node role: `all`, `api`, `jobs`, `checks` | `all` |\n| `SP_NODE_REGION` | Worker region (required when role=`checks`) | — |\n| `SP_SERVER_JOB_WORKER_NB` | Concurrent job workers | `2` |\n| `SP_SERVER_CHECK_WORKER_NB` | Concurrent check workers | `3` |\n| `PORT` | HTTP port (overrides `SP_SERVER_LISTEN`) | — |\n\n### Authentication\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `SP_AUTH_JWT_SECRET` | JWT signing secret (auto-generated if unset) | — |\n| `SP_AUTH_REGISTRATION_EMAIL_PATTERN` | Restrict registration by email regex | — |\n\n### Email (SMTP)\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `SP_EMAIL_ENABLED` | Enable email sending | `false` |\n| `SP_EMAIL_HOST` | SMTP server hostname | — |\n| `SP_EMAIL_PORT` | SMTP port | `587` |\n| `SP_EMAIL_USERNAME` | SMTP username | — |\n| `SP_EMAIL_PASSWORD` | SMTP password | — |\n| `SP_EMAIL_FROM` | Sender email address | — |\n| `SP_EMAIL_FROMNAME` | Sender display name | — |\n| `SP_EMAIL_AUTHTYPE` | Auth type: `plain`, `login`, `cram-md5` | `login` |\n| `SP_EMAIL_PROTOCOL` | Encryption: `none`, `starttls`, `ssl` | `starttls` |\n| `SP_EMAIL_INSECURESKIPVERIFY` | Skip TLS certificate verification | `false` |\n\n### OAuth Providers\n\nSet both `_CLIENT_ID` and `_CLIENT_SECRET` to enable an OAuth provider.\n\n| Provider | Variables |\n|----------|-----------|\n| Google | `SP_GOOGLE_CLIENT_ID`, `SP_GOOGLE_CLIENT_SECRET` |\n| GitHub | `SP_GITHUB_CLIENT_ID`, `SP_GITHUB_CLIENT_SECRET` |\n| GitLab | `SP_GITLAB_CLIENT_ID`, `SP_GITLAB_CLIENT_SECRET` |\n| Microsoft | `SP_MICROSOFT_CLIENT_ID`, `SP_MICROSOFT_CLIENT_SECRET` |\n\n### Slack Integration\n\n| Variable | Description |\n|----------|-------------|\n| `SP_SLACK_APP_ID` | Slack app ID |\n| `SP_SLACK_CLIENT_ID` | Slack client ID |\n| `SP_SLACK_CLIENT_SECRET` | Slack client secret |\n| `SP_SLACK_SIGNING_SECRET` | Slack signing secret |\n\n### Development\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `SP_REDIRECTS` | Dev proxy redirects (format: `/path:host:port/target,...`) | — |\n| `LOG_LEVEL` | Log level (read early, before config loads) | `info` |\n| `NO_COLOR` | Disable colored terminal output | — |\n| `FORCE_COLOR` | Force colored terminal output | — |\n\n### CLI\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `SOLIDPING_CONFIG` | CLI config file path | `~/.config/solidping/settings.json` |\n| `SOLIDPING_URL` | Server URL override | — |\n| `SOLIDPING_ORG` | Organization override | — |\n| `SOLIDPING_VERBOSE` | Verbose CLI logging | `false` |\n\n## Architecture\n\n### Core Components\n- **API Server**: REST API for managing checks, incidents, and results\n- **Dashboard** (`web/dash0`): Admin UI (React + TanStack Router + shadcn/ui)\n- **Status Page** (`web/status0`): Public-facing status dashboard\n- **Workers**: Distributed agents executing monitoring checks\n- **Notifications**: Slack, Discord, Email, Webhooks, Google Chat, Mattermost, Ntfy, Opsgenie, Pushover\n- **Database**: PostgreSQL (partitioned results) or SQLite\n\n### Technology Stack\n- **Backend**: Go 1.24+, bunrouter, Bun ORM, koanf\n- **Frontend**: React 19, TypeScript, Vite, TanStack Router/Query, Tailwind CSS, shadcn/ui\n- **Database**: PostgreSQL (production), SQLite (development/single-node)\n\n### Project Structure\n```\nsolidping/\n├── server/\n│   ├── main.go                  # CLI entry point (serve, migrate, client)\n│   └── internal/\n│       ├── app/                 # Server setup, services, embedded assets\n│       ├── handlers/            # HTTP handlers + business logic\n│       ├── checkers/            # Protocol checker implementations\n│       ├── notifications/       # Notification channels\n│       ├── models/              # Database entities\n│       ├── migrations/          # Database migrations\n│       └── middleware/          # Auth, CORS, org context\n├── web/\n│   ├── dash0/                   # Admin dashboard (React)\n│   └── status0/                 # Public status page\n├── docker-compose.yml           # Development PostgreSQL\n├── Dockerfile                   # Production container\n└── Makefile                     # Build targets\n```\n\n## Development\n\n### Commands\n```bash\nmake build            # Build complete application\nmake dev-test         # Hot-reload backend + frontend\nmake dev-backend      # Backend only with hot reload (air)\nmake dev-dash0        # Dashboard dev server\nmake test             # Run backend tests\nmake lint             # Lint all code\nmake fmt              # Format all code\nmake docker-build     # Build Docker image\n```\n\n### CLI Client\n```bash\n# Build the CLI\nmake build-cli\n\n# Usage\n./bin/sp auth login\n./bin/sp checks list\n./bin/sp results list\n```\n\n## Goals\n\n### Primary\n- Many protocols and test types\n- Low memory footprint\n- Fast execution (sub-minute checks)\n- Easy self-hosting (single binary + PostgreSQL)\n- Cross-platform (Linux, macOS, Windows)\n- Public status pages\n\n### Non-Goals\n- Multi-step transactional / scripted user-flow testing (use Playwright directly for that)\n- Application Performance Monitoring / RUM (use Datadog, New Relic, or Site24x7)\n\n## Inspiration\n\n- [uptime-kuma](https://github.com/louislam/uptime-kuma) - Great self-hosted monitoring tool\n\n## License\n\nAGPL-3.0 - See [LICENSE.md](LICENSE.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffclairamb%2Fsolidping","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffclairamb%2Fsolidping","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffclairamb%2Fsolidping/lists"}