<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jack Pelorus</title>
    <description>The latest articles on DEV Community by Jack Pelorus (@jack_pelorus_379400349092).</description>
    <link>https://dev.to/jack_pelorus_379400349092</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4051644%2F7bc4bd2d-8812-4c67-8b5b-6cbd827bc445.jpg</url>
      <title>DEV Community: Jack Pelorus</title>
      <link>https://dev.to/jack_pelorus_379400349092</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jack_pelorus_379400349092"/>
    <language>en</language>
    <item>
      <title>Python, PostgreSQL, and MQTT</title>
      <dc:creator>Jack Pelorus</dc:creator>
      <pubDate>Wed, 29 Jul 2026 21:09:28 +0000</pubDate>
      <link>https://dev.to/jack_pelorus_379400349092/python-postgresql-and-mqtt-ggd</link>
      <guid>https://dev.to/jack_pelorus_379400349092/python-postgresql-and-mqtt-ggd</guid>
      <description>&lt;p&gt;Why this combination keeps winning for IoT telemetry backends — not in a benchmark, but against flaky gateways, replayed data, and firmware that never quite agrees with itself.&lt;/p&gt;

&lt;p&gt;If you’ve ever built the backend for a fleet of IoT devices — sensors, gateways, industrial equipment reporting temperature, humidity, GPS, battery, signal strength — you’ve faced the same fork in the road early on: what do you build the ingestion layer with, and what do you store the data in?&lt;/p&gt;

&lt;p&gt;After building a telemetry backend from scratch for a real fleet of LoRa/BLE sensors and gateways — handling dual ingestion paths, binary and JSON payload formats, automatic recovery of lost data, and a growing set of operational dashboards — I keep coming back to the same combination: Python (FastAPI + asyncio) for the API, MQTT for device transport, and PostgreSQL for storage. Here’s why that combination holds up so well for this specific problem, not just “in general.”&lt;/p&gt;

&lt;p&gt;Full Article: &lt;a href="https://medium.com/@jackpelorus/python-postgresql-and-mqtt-the-boring-stack-that-actually-survives-a-real-device-fleet-9297146cbe8d?sharedUserId=jackpelorus" rel="noopener noreferrer"&gt;https://medium.com/@jackpelorus/python-postgresql-and-mqtt-the-boring-stack-that-actually-survives-a-real-device-fleet-9297146cbe8d?sharedUserId=jackpelorus&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mqtt</category>
      <category>python</category>
      <category>postgres</category>
      <category>iot</category>
    </item>
    <item>
      <title>AWS ECS Terragrunt Boilerplate</title>
      <dc:creator>Jack Pelorus</dc:creator>
      <pubDate>Wed, 29 Jul 2026 15:15:26 +0000</pubDate>
      <link>https://dev.to/jack_pelorus_379400349092/aws-ecs-terragrunt-boilerplate-31mk</link>
      <guid>https://dev.to/jack_pelorus_379400349092/aws-ecs-terragrunt-boilerplate-31mk</guid>
      <description>&lt;p&gt;A production-derived, multi-layer Terraform + Terragrunt setup for running containerized services on AWS ECS Fargate, behind an ALB, with blue/green deploys via CodeDeploy, a Grafana observability stack, and RDS-backed data services.&lt;/p&gt;

&lt;p&gt;This is a sanitized boilerplate extracted from a real client deployment: the architecture, module boundaries, and CI/CD pattern are used as-is in production; all account IDs, domains, credentials, and client-specific naming have been replaced with placeholders. Ports, service names, and a couple of example task definitions (SuiteCRM, pgAdmin) are kept in because they're useful reference points for wiring up your own services, not because you need them.&lt;br&gt;
Why this structure&lt;/p&gt;

&lt;p&gt;Terraform modules describe what a resource looks like; they don't know about environments, state, or dependency ordering between layers. Terragrunt is used here to keep environment configuration (env.yaml, region.yaml) out of the modules entirely, wire up remote state automatically per layer, and express the dependency graph between layers (services depends on ecs-base and database, etc.) without copy-pasting backend blocks or duplicating variables across environments.&lt;/p&gt;

&lt;p&gt;Github repo : &lt;a href="https://github.com/jacksmartv/AWS-ECS-Terragrunt-Boilerplate" rel="noopener noreferrer"&gt;https://github.com/jacksmartv/AWS-ECS-Terragrunt-Boilerplate&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ecs</category>
      <category>aws</category>
      <category>terraform</category>
      <category>devops</category>
    </item>
    <item>
      <title>k6 + Playwright Load Testing on AWS</title>
      <dc:creator>Jack Pelorus</dc:creator>
      <pubDate>Tue, 28 Jul 2026 15:19:49 +0000</pubDate>
      <link>https://dev.to/jack_pelorus_379400349092/k6-playwright-load-testing-on-aws-4dm3</link>
      <guid>https://dev.to/jack_pelorus_379400349092/k6-playwright-load-testing-on-aws-4dm3</guid>
      <description>&lt;p&gt;Production-grade Terraform project that deploys a self-hosted load testing environment on AWS EC2 with Docker, Grafana, Prometheus, optional PostgreSQL, and a web GUI for running both k6 load tests and Playwright browser tests.&lt;br&gt;
Architecture&lt;/p&gt;

&lt;p&gt;k6-gui is a Flask web app that runs both test types from the browser: k6 load tests via docker compose run, and Playwright browser tests via docker compose exec into the long-running playwright-runner container (Monaco editor, real-time log streaming, HTML reports for both). See terraform/modules/ec2-k6/templates/k6-gui/README.md for details.&lt;/p&gt;

&lt;p&gt;Git Repo: &lt;a href="https://github.com/jacksmartv/K6-PW-test-management-platform" rel="noopener noreferrer"&gt;https://github.com/jacksmartv/K6-PW-test-management-platform&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>performance</category>
      <category>terraform</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
