[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technology-en-postgresql":3,"technology-projects-en-postgresql":28,"mdc-rben4r-key":73},{"id":4,"title":5,"category":6,"content":7,"description":8,"extension":9,"faq":10,"icon":11,"links":12,"meta":21,"projects":22,"since":24,"stem":25,"updated":26,"__hash__":27},"technologies_en\u002Fen\u002Ftechnologies\u002Fpostgresql.yml","PostgreSQL","database","PostgreSQL is a relational database with support for transactions, structured queries and JSON data. I use it in DigiPulse to store monitoring data that the application turns into status views and incident history.\n\n## Working with monitoring records\n\nAvailability checks create data over time. Queries need to find results for a particular monitor and date range without reading unnecessary rows. Index selection, retention and aggregation all affect how that workload grows. Execution plans help show where a query spends its effort.\n\n## Tenant isolation needs a precise design\n\nA database per tenant and a schema per tenant are different architectures. PostgreSQL supports both, but schemas share a database and require appropriate permissions and query scoping. Neither arrangement alone guarantees compliance or prevents every cross-tenant access mistake.\n\n## How I choose a database\n\nPostgreSQL's relational constraints and JSONB type are useful when structured records and flexible payloads belong in the same application. MySQL is also a practical choice for established Laravel and WordPress projects. I compare the actual queries, data model and maintenance requirements before choosing an engine.\n","PostgreSQL for SaaS data: monitoring records in DigiPulse, relational constraints, query planning and options for tenant isolation.","yml",null,"i-simple-icons-postgresql",[13,18],{"label":14,"to":15,"color":16,"icon":17},"postgresql.org","https:\u002F\u002Fwww.postgresql.org","neutral","i-heroicons-arrow-top-right-on-square",{"label":19,"to":20,"color":16,"icon":17},"Technical reference","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fddl-schemas.html",{},[23],"digipulse","2019","en\u002Ftechnologies\u002Fpostgresql","2026-09-20","L5AT9WcKAKk_1FnV6zm2iU3pRc4b4oClbi75BuljXyI",[29],{"id":30,"title":31,"content":32,"date":33,"description":34,"extension":9,"featured":35,"image":36,"links":37,"meta":46,"stack":47,"stem":67,"tags":68,"url":40,"__hash__":72},"projects_en\u002Fen\u002Fprojects\u002Fdigipulse.yml","DigiPulse","Uptime monitoring SaaS — 60-second checks, SSL expiry tracking, Telegram and email notifications. The admin panel and core backend are built with Laravel (Octane, Reverb websockets) and Filament, while the monitoring engine is a separate Go service. Includes Google OAuth sign-in and Cloudflare Turnstile integration, plus an MCP server that exposes monitoring data directly to AI assistants. Self-hosted on Proxmox.\n\n## Key Features\n\n- **Dedicated Go engine** - availability checks run in a separate Go service, so constant 60-second polling never slows down the Laravel app\n- **Real-time dashboard** - Reverb websockets push status changes to the UI live, no manual refresh\n- **Octane + Filament** - resident-memory Laravel with a full admin panel for monitors, contacts and alert rules\n- **MCP server** - monitors and incidents are queryable from AI assistants (Claude, Cursor) via the Model Context Protocol\n- **Google OAuth + Turnstile** - passwordless sign-in and bot protection on public forms\n- **Self-hosted** - deployed on a Proxmox homelab I manage end-to-end\n\n## Tech Stack\n\n- **Backend**: Laravel (Octane, Reverb websockets)\n- **Admin Panel**: Filament\n- **Monitoring Engine**: Go (separate service)\n- **Database**: PostgreSQL\n- **AI Integration**: MCP server\n- **Infrastructure**: Self-hosted on Proxmox\n","2026-04-17","Uptime monitoring SaaS: event-driven architecture — Laravel (Octane, Reverb) + Filament dispatch checks through Redis to a lightweight Go worker; an MCP server exposes monitoring data to AI assistants; Telegram\u002Femail alerts",true,"\u002Fhero\u002Fdigipulse.avif",[38,42],{"label":39,"to":40,"color":41,"icon":17},"Live Demo","https:\u002F\u002Fdigipulse.cloud","primary",{"label":43,"to":44,"color":16,"icon":45},"GitHub","https:\u002F\u002Fgithub.com\u002FYurij2015\u002Fdigipulse-backend","i-simple-icons-github",{},[48,51,54,57,58,61,64],{"name":49,"icon":50},"Laravel","i-simple-icons-laravel",{"name":52,"icon":53},"Filament","i-simple-icons-filament",{"name":55,"icon":56},"Go","i-simple-icons-go",{"name":5,"icon":11},{"name":59,"icon":60},"Redis","i-simple-icons-redis",{"name":62,"icon":63},"Vue","i-simple-icons-vuedotjs",{"name":65,"icon":66},"MCP","i-heroicons-cpu-chip","en\u002Fprojects\u002Fdigipulse",[69,49,55,70,65,59,71],"SaaS","Monitoring","Event-driven","b7hu-_otqukg-JY_hPBvmlUYk5jVOx42XpCotH6Cvqo",{"data":74,"body":75},{},{"type":76,"children":77},"root",[78,86,93,98,104,109,115],{"type":79,"tag":80,"props":81,"children":82},"element","p",{},[83],{"type":84,"value":85},"text","PostgreSQL is a relational database with support for transactions, structured queries and JSON data. I use it in DigiPulse to store monitoring data that the application turns into status views and incident history.",{"type":79,"tag":87,"props":88,"children":90},"h2",{"id":89},"working-with-monitoring-records",[91],{"type":84,"value":92},"Working with monitoring records",{"type":79,"tag":80,"props":94,"children":95},{},[96],{"type":84,"value":97},"Availability checks create data over time. Queries need to find results for a particular monitor and date range without reading unnecessary rows. Index selection, retention and aggregation all affect how that workload grows. Execution plans help show where a query spends its effort.",{"type":79,"tag":87,"props":99,"children":101},{"id":100},"tenant-isolation-needs-a-precise-design",[102],{"type":84,"value":103},"Tenant isolation needs a precise design",{"type":79,"tag":80,"props":105,"children":106},{},[107],{"type":84,"value":108},"A database per tenant and a schema per tenant are different architectures. PostgreSQL supports both, but schemas share a database and require appropriate permissions and query scoping. Neither arrangement alone guarantees compliance or prevents every cross-tenant access mistake.",{"type":79,"tag":87,"props":110,"children":112},{"id":111},"how-i-choose-a-database",[113],{"type":84,"value":114},"How I choose a database",{"type":79,"tag":80,"props":116,"children":117},{},[118],{"type":84,"value":119},"PostgreSQL's relational constraints and JSONB type are useful when structured records and flexible payloads belong in the same application. MySQL is also a practical choice for established Laravel and WordPress projects. I compare the actual queries, data model and maintenance requirements before choosing an engine."]