Skip to content

0.0.47

Latest

Choose a tag to compare

@github-actions github-actions released this 19 Oct 23:42
· 13 commits to main since this release

Added

  • feat: the API serves Prometheus metrics at /metrics on its own port when METRICS_ENABLED=true (off by default). Each active monitor has peekaping_monitor_status (0 Down, 1 Up, 2 Pending, 3 Maintenance), peekaping_monitor_last_heartbeat_timestamp_seconds, and peekaping_monitor_response_seconds while it is Up, labelled with the monitor's ID, name and type; a paused or deleted monitor has none. The endpoint needs no credentials and lists monitor names, so scrape it over a private network; the gateway doesn't forward it. See Prometheus Metrics (#267, #277, #350) (thanks @SiteRelEnby)
  • feat: SMTP monitor type. It connects over plain SMTP, STARTTLS or direct TLS, can log in with PLAIN authentication, can test whether the server is an open relay, and tracks the TLS certificate's expiry (#250) (thanks @czimnick)
  • feat: Microsoft Teams notification channel. Point it at a Workflows webhook to get alerts with the monitor's status, details and links (#245) (thanks @mtb77)
  • feat: a Slack notification channel can post with a bot token and a channel name instead of a webhook URL. The webhook URL is optional now: a channel needs a webhook URL or a bot token, and a bot token needs a channel (#248)
  • feat: a webhook notification channel can sign its requests. With a signing secret set, each request carries X-Webhook-Timestamp (Unix seconds) and X-Webhook-Signature (sha256= and the hex HMAC-SHA256 of {timestamp}.{payload}); without one, requests go out unsigned as before. Signed requests don't follow redirects. See Webhook for how to verify the signature (#288) (thanks @jonfriesen)
  • feat: REDIS_USERNAME sets the Redis ACL user for the API, producer, worker and ingester, for a shared Redis 6 or later where each application has its own user. Leave it empty to keep password-only authentication (#279, #280) (thanks @daftu)
  • feat: a stale-monitor watchdog. Every minute the leader producer finds active monitors that haven't been checked for longer than 3 check intervals (or interval + timeout + 60 seconds, if longer), logs a warning and queues a check. If a monitor is still stale once that check has had time to finish, its notification channels get one message, and another when it is checked again. The monitor list and page show "Not checked since ", and GET /api/v1/health reports stale_monitors and watchdog_ran_at (#321, #322)

Changed

  • feat: new installs keep heartbeats for 180 days instead of 365. An install counts as new when the API starts with no admin and no heartbeats yet. Upgrading changes nothing: an install that never saved a data retention period keeps 365 days, and a saved period stays as it is. Charts and uptime % come from stats, so only the recent heartbeats list and a monitor's event history reach back less far on new installs (#337)
  • refactor: SQL databases write a stats row with one INSERT ... ON CONFLICT statement instead of an UPDATE followed by an INSERT. What is stored doesn't change (#260, #311) (thanks @brewle)
  • feat: Grafana OnCall alerts also carry the heartbeat's status, ping_ms, retries and time, and the monitor's monitor_id, monitor_type and tags, so OnCall can route and group them. HTTP monitors add monitor_url (without credentials, query or fragment); TCP, ping, DNS and gRPC keyword monitors add monitor_host; other types send no target (#263) (thanks @brewle)
  • feat: the bundle images run the API, producer, worker and ingester as a non-root user, peekaping (UID/GID 1000); PUID and PGID change the IDs. Caddy, Redis, the database and supervisord keep their users. Upgrade note: on start, /app/data is chowned to that user, which changes the owner of files an older image wrote as root; where root can't change owners, such as NFS with root_squash, startup warns and carries on. A Docker socket at /var/run/docker.sock keeps working, and ping monitors need net.ipv4.ping_group_range to include the user's groups (Docker allows it by default; startup warns where it doesn't). See Bundle user and permissions (#163, #209, #316) (thanks @tafaust)
  • refactor: the API server runs on Go's standard HTTP router instead of Gin, and its 75 operations are typed Huma operations instead of Swag annotations. Paths, response formats, authentication and validation stay the same. The API reference is now OpenAPI 3.1 instead of Swagger 2, served as an interactive page at /docs; /swagger/index.html redirects there and /swagger/doc.json stays as an alias (#329, #332)

Fixed

  • fix: when the web app talks to the API on another URL (API_URL), a page load sends each API request once, to the API. Before, the first requests (the version check and the custom-domain lookup) went to the web app itself, failed, and ran again against the API (PP-210)
  • fix: a data retention period of 0, a negative number or a very large number no longer makes the hourly cleanup delete every heartbeat. The settings API returns 400 unless KEEP_DATA_PERIOD_DAYS is a whole number of days from 1 to 36,500 with type int. If an invalid value was stored before, or the setting can't be read, the cleanup logs an error and deletes no heartbeats instead of falling back to 365 days (#337)
  • fix: the hourly cleanup deletes expired heartbeats 5,000 at a time on SQL databases instead of in one statement, so a large backlog, such as the first run after lowering the data retention period, no longer blocks the API. On SQLite, deleting a million heartbeats used to hold the database for about 13 seconds; now no request waits more than about half a second. A migration replaces three heartbeat indexes that no query uses with one on the heartbeat time, which the cleanup deletes through. Each heartbeat gets about 15% smaller on SQLite, and loading a monitor's event history gets faster. The migration builds the new index, about 1 second per million heartbeats; on PostgreSQL new heartbeats wait while it does. On SQLite the database file stops growing but doesn't shrink on its own (#336)
  • fix: a network reconnect (a laptop waking, say) no longer wipes a half-filled form. The app re-checks the custom-domain lookup in the background and keeps the current screen mounted, instead of unmounting every route for the length of the refetch (#161, #228, PP-196)
  • fix: minute and hour stats have bounded retention. Every hour, minute stats older than 48 hours and hour stats older than 90 days are deleted; day stats are kept indefinitely and add about 365 rows per monitor each year. Uptime % and badges read minute stats for up to 24 hours and hour stats for up to 90 days, and charts read less. On SQL databases the rows are deleted 5,000 at a time, so the first run after upgrading clears a year of backlog without blocking the API. SQLite reuses freed pages, but its file does not shrink automatically (#315)
  • docs: explain SQL stats upgrade history limits, backups and rollback, and provide a manual SQLite disk-space reclamation procedure. The migration drops the mixed legacy stats table and rebuilds history only from retained heartbeats; take a database backup before upgrading. See Upgrading stats storage (PP-101)
  • fix: heartbeats for the same monitor that the ingester handles at the same time no longer overwrite each other's counts in the stats behind the response time chart and uptime %, and no longer fail with a unique-key error. On MongoDB they no longer create a second stats document for the same minute, hour or day. Each heartbeat now updates its stats with 3 statements instead of 6 to 9 (#312)
  • fix: the ingester logs an error with the monitor ID when it can't aggregate a heartbeat into the stats behind the response time chart and uptime %, instead of dropping the error (#260)
  • fix: the API, producer, worker and ingester binaries embed the time zone database, so TZ=Europe/Kyiv and maintenance windows with their own time zone work in any image instead of falling back to UTC, and a time zone that fails to load logs a warning. "Same as Server Timezone" is the zone the process runs in. Upgrade note: the separate API, producer, worker and ingester images (Docker Compose, Helm) used to ignore TZ and run in UTC; after upgrading they run in the TZ you set (the example .env files set America/New_York), so "Same as Server Timezone" windows, log timestamps and times in notification messages move to that zone. Set TZ=UTC to keep the old behavior. The bundle images already honored TZ (#261, #262) (thanks @brewle)
  • fix: the monitor page header shows the target of TCP, DNS, ping, Docker, gRPC, SNMP, MQTT, Kafka and RabbitMQ monitors, such as 1.1.1.1:443 or example.com (A @ 8.8.8.8:53), instead of only the monitor type. Monitors whose target holds credentials or a token (database, Redis and push monitors) still show only the type. Only http(s) URLs are links (#269, #270, #308) (thanks @HartD92)
  • fix: a status page that isn't published returns 404 on its public slug, custom domain and monitor routes, instead of serving its title and monitors. The View button on a draft status page therefore shows a 404 until the page is published (#305)
  • fix: badges are served only for monitors on a published status page. A monitor that is only on a draft page gets no badge, and a failed status page lookup returns 500 instead of serving the badge (#305)
  • fix: updating, pausing, resuming or deleting a monitor, maintenance window, notification channel, proxy, tag, status page or API key that doesn't exist returns 404 instead of reporting success, and so do the heartbeat, stats and TLS routes of a monitor that doesn't exist (#305)
  • fix: the certificate expiry badge and the monitor TLS endpoint no longer fail with 500 on SQL databases for a monitor without certificate info, and the response time badge shows "N/A" instead of "N/Ams" before the first heartbeat (#305)
  • fix: invalid updates return 400: a proxy's port or protocol in a partial update, a monitor's config in a partial update (checked against its type), and a maintenance window's partial update. A maintenance window's start and end time must be a valid HH:MM time; they weren't checked before (#305)
  • fix: the settings API serves only KEEP_DATA_PERIOD_DAYS and returns 404 for every other key, so callers can no longer read, change or delete the JWT signing secrets. Upgrading generates new signing secrets, which signs everyone out once. With more than one API replica, old and new pods reject each other's tokens until the rolling update finishes, so users can be signed out again during it; to avoid that, run kubectl scale deployment <release>-api --replicas=0 before helm upgrade, which scales it back up (#302)
  • fix: reject page sizes above 1,000 on paginated list endpoints (#295) (thanks @0xfurai)
  • fix: monitors no longer stop checking after a check times out; existing stuck monitors recover on upgrade (#237, #254, #265, #266, #294)
  • fix: editing, pausing or deleting a monitor drops its queued check and cancels a running one, so no result of the old config is recorded and the next check uses the current config, right away after an edit (#266)
  • fix: close idle HTTP connections after each check, so HTTP monitors no longer leak one socket per check (#287) (thanks @jonfriesen)
  • fix: ping monitors report an unreachable host as DOWN instead of "ping: executable file not found", no longer pick up other monitors' replies, work without root where unprivileged ICMP is allowed, and support IPv6 targets (#226, #297)
  • fix: editing a monitor, or creating one, no longer overwrites its stored status. The monitor list's status filter and the status badge read that stored status, so an edited Down monitor was listed under Up and its badge said Up. A new monitor starts as Pending, and on start the API repairs monitors whose stored status differs from their latest heartbeat's (#285, #352, #353)
  • fix: a push monitor's heartbeat is recorded as Maintenance, with the maintenance message, while the monitor is in a maintenance window, instead of the status the push reported. If the maintenance check fails, the push's own status is used (#349) (thanks @dajiaohuang)
  • fix: a push URL with status=down is recorded as Down, and its ping as the response time. Before, down failed to parse and counted as Up, and ping was ignored (#298) (thanks @sean0407)
  • fix: a gRPC monitor whose target can't be reached is Down. Before, any failure produced a made-up SERVING response, so it showed Up; the default method check also didn't match the proto's Check. A DNS monitor stops at its timeout instead of waiting 10 to 20 seconds on a resolver that never answers (#303)
  • fix: on SQLite, a cancelled request no longer makes every API write fail with database is locked (517) until the API restarts. The SQLite driver is upgraded to a version that closes the cancelled query's rows (#346)
  • fix: the monitor list card showed Pending and Maintenance monitors as Up, and the monitor page showed Pending as Down. Both show Up, Down, Pending or Maintenance by name (#344)
  • fix: after the socket reconnects, the monitor list keeps updating live instead of freezing until the page is reloaded (#343)
  • fix: a certificate expiry notice goes out once per threshold, such as 21, 14 and 7 days, instead of stopping after the first. A certificate first seen inside several thresholds gets only the nearest one, not all at once (#324)
  • fix: a recurring-interval maintenance window counts calendar days in its time zone. Before, it was active on the wrong days around midnight and daylight saving changes, so alerts fired during planned maintenance and were muted outside it. A single date-range window now includes its first minute (#323)
  • fix: failed logins lock an account on SQLite and MongoDB, as they do on PostgreSQL. The lock never applied there before. After BRUTEFORCE_MAX_ATTEMPTS failures (20 by default) within BRUTEFORCE_WINDOW (1 minute by default), the account is locked for BRUTEFORCE_LOCKOUT (1 minute by default). On every database, BRUTEFORCE_MAX_ATTEMPTS=1 now locks after one failure instead of two (#313)
  • fix: setting up 2FA a second time before verifying the first showed a QR code whose codes never verified, and a failed save of the 2FA status still answered "2FA verification successful" (#314)
  • fix: the production Docker Compose files and the self-hosting guides give web and gateway restart: unless-stopped, so the nginx gateway no longer stays stopped after a Docker restart. Add the two lines to a compose file you copied earlier (#33, #331)
  • fix: the Telegram channel's template hint names {{ monitor.name }} instead of a variable that doesn't exist (#253, #281) (thanks @dimonl)
  • fix: uptime % on the monitor page (24h, 7d, 30d and 365d) and the 24h, 30d and 90d badges count the right window. They read day stats, which count only when the day starts inside the window, so "24h" meant since midnight UTC and 7d and 30d dropped everything before the first midnight (#320)
  • fix: SQL databases keep minute, hour and day stats in their own tables (stat_minutely, stat_hourly, stat_daily). Before, one table mixed the three scales, so the 14:00 minute row also held the whole 14:00 hour, and maintenance checks lowered the average response time. Upgrade note: a migration creates the tables, rebuilds them from the heartbeats you still have and drops the old stats table; take a backup first, as the docs entry above says (#306)

Raw Commit List

  • docs: complete the changelog for 0.0.47 (#356) (Thanks @0xfurai) bd022fb
  • fix(release): list every PR merged since the last tag in the preflight (#355) (Thanks @0xfurai) 51a9314
  • PP-189 [2/2] fix(server): repair stored monitor statuses when the API starts (#353) (Thanks @0xfurai) bf8bd42
  • PP-189 [1/2] fix(server): keep a monitor's stored status when it is edited (#352) (Thanks @0xfurai) 42522ca
  • fix(docs): update branch naming convention for ticket work in issue tracker (Thanks @yevhen.piotrovskyi) bcfdd5e
  • feat(server): support Redis ACL username authentication (#280) (Thanks @daftu) c2c76a7
  • chore: add a release skill (#351) (Thanks @0xfurai) 82cdc61
  • fix(server): record push heartbeats as Maintenance in a maintenance window (#349) (Thanks @mikewushuwen) 32ea9ed
  • feat(server): add a Prometheus /metrics exporter (#350) (Thanks @0xfurai) 205c6c2
  • PP-204 [2/2] test(e2e): show Pending and Maintenance on the card and the page (#348) (Thanks @0xfurai) 52326f3
  • PP-121 [2/2] test: e2e for Down and Up with a webhook notification, status pages, 2FA and API keys (#334) (Thanks @0xfurai) 8f04302
  • PP-121 [1/2] test: run e2e against a local target, re-runnable, with strict monitor CRUD tests (#333) (Thanks @0xfurai) be657bc
  • PP-211 [2/2] fix(server): upgrade the SQLite driver so a cancelled query can't block writes (#346) (Thanks @0xfurai) 9d28b8a
  • chore(server): build with Go 1.26.4 (PP-211) (#345) (Thanks @0xfurai) 4cdfa9b
  • PP-204 [1/2] fix(web): show Pending and Maintenance by name on the monitor card and page (#344) (Thanks @0xfurai) 0bf7bdd
  • PP-199 refactor(server): replace Swag with typed Huma operations (#332) (Thanks @0xfurai) af61515
  • PP-205 fix(web): rejoin the monitor list room after a socket reconnect (#343) (Thanks @0xfurai) 1741561
  • PP-210 fix(web): configure the API client before the first render (#341) (Thanks @0xfurai) e8028d9
  • PP-106 [2/2] fix: keep heartbeats 180 days on new installs and reject invalid retention periods (#337) (Thanks @0xfurai) c5c9c71
  • PP-106 [1/2] fix(server): delete expired heartbeats in batches through a time index (#336) (Thanks @0xfurai) bec4338
  • PP-209 chore: replace pnpm with Bun (#340) (Thanks @0xfurai) 85d78de
  • fix(web): wait only for the first custom-domain lookup (PP-196) (#339) (Thanks @0xfurai) 425a778
  • feat: enhance ticket workflow documentation and introduce agent delegation (Thanks @yevhen.piotrovskyi) 340a511
  • fix: give web and gateway a restart policy in the compose files and docs (PP-194) (#331) (Thanks @0xfurai) 0e82a41
  • PP-101 test(server): guard stats retention and document upgrades (#330) (Thanks @0xfurai) fb5af0f
  • PP-200 refactor(server): replace Gin with the standard HTTP router (#329) (Thanks @0xfurai) 1905e4b
  • test(server): list monitors when the stale records can't be read (PP-16) (#328) (Thanks @0xfurai) 0f95bd1
  • fix(server): send each certificate expiry threshold once (PP-120) (#324) (Thanks @0xfurai) 109b111
  • test(server): cover heartbeats and the websocket server (PP-120) (#326) (Thanks @0xfurai) 64f493f
  • test(server): cover tags, monitor links, status pages and utils (PP-120) (#325) (Thanks @0xfurai) d104ff8
  • fix(server): count recurring-interval maintenance days on the calendar (PP-120) (#323) (Thanks @0xfurai) f786378
  • docs(ticket): update PR title format and closing work instructions for clarity (Thanks @yevhen.piotrovskyi) 4cf0be7
  • feat(web): mark monitors Peekaping has stopped checking (PP-16) (#322) (Thanks @0xfurai) fe7fea3
  • feat(server): add a stale-monitor watchdog (PP-16) (#321) (Thanks @0xfurai) 64cffca
  • fix(server): delete expired minute and hour stats in the hourly cleanup (PP-104) (#315) (Thanks @0xfurai) 91f0aab
  • test(server): cover the producer's leadership, failover and event listener (PP-113) (#318) (Thanks @0xfurai) abf7153
  • docs: add RepoCloud one-click deploy button (#292) (Thanks @cosark) 222781a
  • test(server): cover the producer's claim, reclaim and sync loop (PP-113) (#317) (Thanks @0xfurai) a2c16b6
  • test(server): delete or rewrite tests that can't fail (PP-119) (#319) (Thanks @0xfurai) ebc03fe
  • fix(server): compute uptime % from the right stats buckets (PP-105) (#320) (Thanks @0xfurai) 3e4c755
  • feat: run the bundle's Go processes as a non-root user (PP-140) (#316) (Thanks @0xfurai) ee990b2
  • fix(server): fix 2FA setup and verify, and test the auth service and middleware (PP-114) (#314) (Thanks @0xfurai) afe8331
  • fix(server): lock accounts after repeated failed logins on SQLite and Mongo (PP-114) (#313) (Thanks @0xfurai) 03aca77
  • fix(server): write stats with one atomic upsert per bucket (PP-103) (#312) (Thanks @0xfurai) f3e2581
  • feat(smtp): add SMTP health check monitor (#250) (Thanks @czimnick) 55ef393
  • adds optional HMAC-SHA256 signing to webhook notification channel (#288) (Thanks @jon) 431cac2
  • refactor(server): write each stats row with one upsert (PP-44) (#311) (Thanks @0xfurai) 2820dc0
  • feat(ticket): implement ticket management skills (Thanks @yevhen.piotrovskyi) afa4b66
  • test(server): golden-request tests for notification channels, with a shared HTTP client (PP-117) (#310) (Thanks @0xfurai) 262f45a
  • feat(ticket): add comprehensive ticket management workflow and scripts (Thanks @yevhen.piotrovskyi) a1bdf8d
  • test(server): cover the ingester's heartbeat state machine (PP-112) (#309) (Thanks @0xfurai) c3fb4db
  • feat(grafana-oncall): enrich notification payload with monitor details, tags and type-specific fields (#263) (Thanks @brewle) 43b9561
  • fix(server): embed the zone database and use time.Local for "Same as Server Timezone" (PP-45) (#262) (Thanks @brewle) f6f0e66
  • fix(web): correct the Telegram template variable hint (PP-46) (#281) (Thanks @dimonl) 1f840ec
  • fix(web): show monitor targets in the page header (PP-47) (#308) (Thanks @0xfurai) 0971d89
  • fix(server): store SQL stats per period and rebuild them from heartbeats (PP-102) (#306) (Thanks @0xfurai) 0bd0d96
  • test(server): add API tests for controllers, routes and public pages (PP-118) (#305) (Thanks @0xfurai) 537c7d8
  • Added Microsoft Teams Notification support (#245) (Thanks @sascha) 3fc78c2
  • feat: enhance Slack integration by adding optional Bot Token and upda… (#248) (Thanks @0xfurai) 772b266
  • fix(server): stop exposing JWT signing secrets through the settings API (#302) (Thanks @0xfurai) c8de50b
  • chore: drop asdf from the dev setup (#304) (Thanks @0xfurai) 6a08c03
  • docs: switch Linear key to PP and put it in PR titles and session names (Thanks @yevhen.piotrovskyi) 3c7354a
  • fix(server): report unreachable gRPC targets as down and run executor tests offline (#303) (Thanks @0xfurai) 1d85dd8
  • fix: honor push monitor status and ping parameters (#298) (Thanks @sean0407) 2e238da
  • ci: build Playwright images once and share them across jobs (#301) (Thanks @0xfurai) 4f1b774
  • chore: deploy landing and docs to Cloudflare Workers (#299) (Thanks @0xfurai) dc48b11
  • ci: run tests only when the code they cover changes (#300) (Thanks @0xfurai) 553574a
  • refactor(server): separate repository inputs from HTTP DTOs (#296) (Thanks @0xfurai) 02ee8a5
  • fix: cap page size on paginated list endpoints (#295) (Thanks @0xfurai) 8a43cee
  • fix(server): share one ping timeout between native ping and the fallback (Thanks @yevhen.piotrovskyi) 7efa971
  • feat: add treehouse skill and reference documentation, enhance agent skills linking (Thanks @yevhen.piotrovskyi) 1d3a746
  • docs: fix ping_group_range advice for rootless Podman and Docker (Thanks @yevhen.piotrovskyi) ca639d9
  • fix(server): explain ping permission failures when system ping also fails (Thanks @yevhen.piotrovskyi) a84617b
  • fix(server): report a ping timeout the same way when the check context expires (Thanks @yevhen.piotrovskyi) 005a232
  • chore: add changelog entry for #226 (Thanks @yevhen.piotrovskyi) 96ac447
  • docs: explain ICMP permissions for ping monitors (Thanks @yevhen.piotrovskyi) 4f87826
  • fix(chart): allow unprivileged ICMP on worker pods (Thanks @yevhen.piotrovskyi) f57bf03
  • fix(server): match ICMP replies and stop falling back to system ping on timeout (Thanks @yevhen.piotrovskyi) 9ea2bdf
  • fix: cancel a check that starts while its monitor is being purged (Thanks @yevhen.piotrovskyi) ad904bf
  • chore: update changelog entry for purging monitor checks (Thanks @yevhen.piotrovskyi) b41022e
  • fix(server): recover executor panics and cancel stale checks on edit (Thanks @yevhen.piotrovskyi) 2ac1918
  • fix(server): address review findings on the stuck monitor fix (Thanks @yevhen.piotrovskyi) 7761ec3
  • chore: add changelog entries for the stuck monitor fix (Thanks @yevhen.piotrovskyi) 4529472
  • fix(server): purge a monitor's queued check on edit, pause and delete (Thanks @yevhen.piotrovskyi) 6bf80eb
  • fix(server): stop archived health-check tasks from blocking monitors (Thanks @yevhen.piotrovskyi) 47fef2c
  • fix(server): bound health checks by their timeout in the worker (Thanks @yevhen.piotrovskyi) ffdd51f
  • chore: add Netlify ignore script to skip unrelated site builds (Thanks @yevhen.piotrovskyi) 3e804ac
  • chore: add changelog entry for #287 (Thanks @yevhen.piotrovskyi) 07ddb8b
  • fixes http monitor idle connection leak (Thanks @jon) 60a4e1e
  • chore: add robots.txt for search engine indexing (Thanks @yevhen.piotrovskyi) 742a60d
  • chore: add robots.txt for search engine indexing (Thanks @yevhen.piotrovskyi) 30ba527
  • chore: remove .tool-versions and add .tool-versions.template (Thanks @yevhen.piotrovskyi) 8e5acbe

Release Statistics

  • 100 commits since 0.0.46
  • 11 contributors

Contributors
Thanks to: @0xfurai @sascha @brewle @cosark @czimnick @daftu @dimonl @jon @mikewushuwen @sean0407 @yevhen.piotrovskyi

Docker Images

GitHub Container Registry (GHCR)

  • UI: ghcr.io/0xfurai/peekaping-web:0.0.47 / ghcr.io/0xfurai/peekaping-web:latest
  • API: ghcr.io/0xfurai/peekaping-api:0.0.47 / ghcr.io/0xfurai/peekaping-api:latest
  • Worker: ghcr.io/0xfurai/peekaping-worker:0.0.47 / ghcr.io/0xfurai/peekaping-worker:latest
  • Producer: ghcr.io/0xfurai/peekaping-producer:0.0.47 / ghcr.io/0xfurai/peekaping-producer:latest
  • Ingester: ghcr.io/0xfurai/peekaping-ingester:0.0.47 / ghcr.io/0xfurai/peekaping-ingester:latest
  • Migrate: ghcr.io/0xfurai/peekaping-migrate:0.0.47 / ghcr.io/0xfurai/peekaping-migrate:latest

Bundle Containers (GHCR)

  • SQLite Bundle: ghcr.io/0xfurai/peekaping-bundle-sqlite:0.0.47 / ghcr.io/0xfurai/peekaping-bundle-sqlite:latest
  • MongoDB Bundle: ghcr.io/0xfurai/peekaping-bundle-mongo:0.0.47 / ghcr.io/0xfurai/peekaping-bundle-mongo:latest
  • PostgreSQL Bundle: ghcr.io/0xfurai/peekaping-bundle-postgres:0.0.47 / ghcr.io/0xfurai/peekaping-bundle-postgres:latest

Docker Hub

  • UI: 0xfurai/peekaping-web:0.0.47 / 0xfurai/peekaping-web:latest
  • API: 0xfurai/peekaping-api:0.0.47 / 0xfurai/peekaping-api:latest
  • Worker: 0xfurai/peekaping-worker:0.0.47 / 0xfurai/peekaping-worker:latest
  • Producer: 0xfurai/peekaping-producer:0.0.47 / 0xfurai/peekaping-producer:latest
  • Ingester: 0xfurai/peekaping-ingester:0.0.47 / 0xfurai/peekaping-ingester:latest
  • Migrate: 0xfurai/peekaping-migrate:0.0.47 / 0xfurai/peekaping-migrate:latest

Bundle Containers (Docker Hub)

  • SQLite Bundle: 0xfurai/peekaping-bundle-sqlite:0.0.47 / 0xfurai/peekaping-bundle-sqlite:latest
  • MongoDB Bundle: 0xfurai/peekaping-bundle-mongo:0.0.47 / 0xfurai/peekaping-bundle-mongo:latest
  • PostgreSQL Bundle: 0xfurai/peekaping-bundle-postgres:0.0.47 / 0xfurai/peekaping-bundle-postgres:latest