{"id":23701028,"url":"https://github.com/zimbres/ssltrack","last_synced_at":"2026-05-28T22:00:53.136Z","repository":{"id":335790732,"uuid":"1121846537","full_name":"zimbres/SSLTrack","owner":"zimbres","description":"SSL certificate expiration monitoring","archived":false,"fork":false,"pushed_at":"2026-03-10T11:46:46.000Z","size":231,"stargazers_count":11,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-10T18:48:30.777Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":false,"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/zimbres.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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":null,"dco":null,"cla":null}},"created_at":"2025-12-23T16:46:16.000Z","updated_at":"2026-03-10T11:46:22.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/zimbres/SSLTrack","commit_stats":null,"previous_names":["zimbres/ssltrack"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/zimbres/SSLTrack","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zimbres%2FSSLTrack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zimbres%2FSSLTrack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zimbres%2FSSLTrack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zimbres%2FSSLTrack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zimbres","download_url":"https://codeload.github.com/zimbres/SSLTrack/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zimbres%2FSSLTrack/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33627939,"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-28T02:00:06.440Z","response_time":99,"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":[],"created_at":"2024-12-30T09:31:36.571Z","updated_at":"2026-05-28T22:00:53.111Z","avatar_url":"https://github.com/zimbres.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SSLTrack\n\nMonitor SSL/TLS certificate expiration across multiple domains and receive email alerts before they expire. SSLTrack uses a distributed architecture with remote agents that can check certificates from different network locations.\n\n![Home](assets/images/Home.png)\n\n![Domains](assets/images/SSLTrack.png)\n\n---\n\n## Features\n\n- **Certificate monitoring** — track expiry dates, issuer, and common name for any domain\n- **Distributed agents** — deploy lightweight agents in different networks to check certificates from multiple vantage points\n- **Email alerts** — automated SMTP notifications when certificates approach expiration (configurable threshold)\n- **Blazor web UI** — manage domains, agents, and settings from a browser\n- **REST API** — full API with Swagger/OpenAPI documentation\n- **Background scheduling** — Hangfire-powered recurring jobs for checks, alerts, and log cleanup\n- **Docker ready** — pre-built images on Docker Hub, Docker Compose included\n\n---\n\n## Quick Start (Docker Compose)\n\nThe fastest way to run SSLTrack with a bundled SMTP test server:\n\n```bash\ngit clone https://github.com/zimbres/SSLTrack.git\ncd SSLTrack\n\n# Edit the two config files before starting\n# appsettings.ssltrack.json  — main app config\n# appsettings.agent.json     — agent config\n\ndocker compose up -d\n```\n\n| Service | URL |\n|---|---|\n| SSLTrack web UI | http://localhost:8080 |\n| SMTP4Dev (test mail) | http://localhost:8025 |\n\n---\n\n## Pre-built Container\n\n```bash\ndocker pull zimbres/ssltrack\n```\n\n\u003e Docker Hub: https://hub.docker.com/r/zimbres/ssltrack\n\n---\n\n## Manual Installation\n\nA pre-compiled binary is available for Windows and Linux. Requires the ASP.NET Core Runtime 10.x.\n\n- [Download .NET 10.0 Runtime](https://dotnet.microsoft.com/en-us/download/dotnet/10.0)\n- Download the latest release from the [Releases page](../../releases)\n\n```bash\n# Linux (example)\n./SSLTrack\n```\n\n---\n\n## Configuration\n\n### Main Application (`appsettings.ssltrack.json`)\n\n```json\n{\n  \"ConnectionStrings\": {\n    \"Data\": \"Data Source=./data/data.db\"\n  },\n  \"Configurations\": {\n    \"DaysToExpiration\": 30,\n    \"AlertsEnabled\": true,\n    \"UpdateCron\": \"*/5 * * * *\",\n    \"AlertCron\": \"*/5 * * * *\",\n    \"ClearLogsCron\": \"*/5 * * * *\"\n  },\n  \"MailProperties\": {\n    \"Name\": \"Domain Monitor\",\n    \"MailFrom\": \"domain@domain.com\",\n    \"MailTo\": \"alerts@domain.com\",\n    \"Bcc\": \"\",\n    \"Subject\": \"\",\n    \"Body\": \"\",\n    \"IsBodyHtml\": true,\n    \"Username\": \"\",\n    \"Password\": \"\",\n    \"SmtpHost\": \"smtp-ssltrack\",\n    \"Port\": 25,\n    \"EnableSsl\": false\n  }\n}\n```\n\n| Key | Description |\n|---|---|\n| `DaysToExpiration` | Days before expiry to start alerting |\n| `AlertsEnabled` | Enable or disable email alerts |\n| `UpdateCron` | Cron schedule for certificate checks |\n| `AlertCron` | Cron schedule for sending alert emails |\n| `ClearLogsCron` | Cron schedule for clearing old logs |\n\n### Agent (`appsettings.agent.json`)\n\n```json\n{\n  \"Configurations\": {\n    \"Delay\": 5,\n    \"SSLTrackApiAddress\": \"http://app:8080\",\n    \"AgentId\": 2,\n    \"AuthType\": \"\",\n    \"GrantType\": \"client_credentials\",\n    \"ClientId\": \"ID\",\n    \"Username\": \"ssltrack_agents\",\n    \"Password\": \"ssltrack_agents\",\n    \"AuthUrl\": \"https://auth/application/o/token/\"\n  },\n  \"HttpClientConfiguration\": {\n    \"UseProxy\": false,\n    \"IgnoreSsl\": true\n  }\n}\n```\n\n| Key | Description |\n|---|---|\n| `Delay` | Seconds between certificate check cycles |\n| `SSLTrackApiAddress` | URL of the main SSLTrack server |\n| `AgentId` | Unique numeric ID for this agent (must match an agent record in the UI) |\n| `AuthType` | Leave empty for no auth, `Basic` or `OAuth2` |\n| `IgnoreSsl` | Skip TLS validation for the connection to the main server |\n\n---\n\n## Architecture\n\n```\n┌──────────────────────────────┐\n│       SSLTrack Web App       │  Blazor UI + REST API + Hangfire scheduler\n│ SQLite · EF Core · MudBlazor │\n└──────────────┬───────────────┘\n               │ HTTP (REST)\n     ┌─────────┴──────────┐\n     │                    │\n┌────┴─────┐         ┌────┴─────┐\n│  Agent 1 │   ...   │  Agent N │  .NET Worker services\n│ (local)  │         │ (remote) │  Poll domains, check certs, report back\n└──────────┘         └──────────┘\n```\n\n- The **main application** stores domains and agents in SQLite, runs scheduled jobs, and serves the UI and API.\n- Each **agent** is a lightweight background worker. It fetches its assigned domains from the main app, connects to each domain to retrieve the SSL certificate, and posts the results back.\n- Agents can authenticate with the main API using **no auth**, **HTTP Basic**, or **OAuth2 client credentials**. Requires Web App deployed behind a reverse proxy with authentication capabilities. Example: \"traefik basic auth\", \"Authentik\", \"Keycloak\", etc.\n\n---\n\n## API Reference\n\nInteractive documentation is available at `/api/swagger` when the application is running.\n\n| Method | Endpoint | Description |\n|---|---|---|\n| `GET` | `/api/domains` | List all domains |\n| `GET` | `/api/domains/agents/{agentId}` | Domains assigned to an agent |\n| `POST` | `/api/domains` | Add a domain |\n| `PUT` | `/api/domains/{domainName}` | Update domain certificate data |\n| `DELETE` | `/api/domains/{domainId}` | Remove a domain |\n| `GET` | `/api/health` | Health check |\n| `HEAD` | `/api/ping/{agentId}` | Agent heartbeat |\n| `GET` | `/api/logs` | Retrieve logs |\n| `POST` | `/api/logs/clear` | Clear all logs |\n\nHangfire dashboard: `/hangfire`\n\n---\n\n## Warning — Background Jobs\n\n\u003e Background jobs (certificate checks and email alerts) will not start automatically when the application restarts unless there is activity on the web UI or API.\n\nTo keep jobs running reliably, configure an external uptime monitor to call the health endpoint periodically:\n\n```\nGET https://your-server/api/health\n```\n\nOr follow the [Hangfire production deployment guide](https://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html).\n\n---\n\n## Development\n\n### Requirements\n\n- [.NET 10 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/10.0)\n- Docker (optional, for Docker Compose)\n\n### Run locally\n\n```bash\n# Main application (http://localhost:5096)\ncd src/SSLTrack\ndotnet run\n\n# Agent — in a separate terminal\ncd src/SSLTrackAgent\ndotnet run\n```\n\n### Run with .NET Aspire\n\n```bash\ncd src/SSLTrack.AppHost\ndotnet run\n```\n\n---\n\n## License\n\n[GNU Affero General Public License v3](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzimbres%2Fssltrack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzimbres%2Fssltrack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzimbres%2Fssltrack/lists"}