<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://sawczuk.dev/</id>
  <title>Sawczuk Consulting — Technical Insights</title>
  <subtitle>DevOps, Kubernetes, architecture, and infrastructure engineering logs.</subtitle>
  <updated>2026-08-06T11:00:00.000Z</updated>
  <author><name>Przemysław Sawczuk</name><uri>https://sawczuk.dev/</uri></author>
  <link href="https://sawczuk.dev/insights/" rel="alternate"/>
  <link href="https://sawczuk.dev/atom.xml" rel="self"/>
  
    <entry>
      <title>Washed-Out Black: Why Windows Prints Worse Than Linux to the Same CUPS Queue</title>
      <link href="https://sawczuk.dev/insights/windows-cups-postscript-washed-out-text/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/windows-cups-postscript-washed-out-text/</id>
      <published>2026-08-06T11:00:00.000Z</published>
      <updated>2026-08-06T11:00:00.000Z</updated>
      <summary>Black text printed from Windows came out as thin grey dots. The same CUPS queue was perfect from Linux and macOS. The culprit was the Microsoft IPP Class Driver rasterizing the page before it ever left the PC.</summary>
      <category term="Homelab"/>
      <category term="Networking"/>
    </entry>
  

    <entry>
      <title>The Printer That Swallows Jobs: HP P1005 Firmware Reload in an Unprivileged LXC</title>
      <link href="https://sawczuk.dev/insights/hp-p1005-cups-firmware-reload-lxc/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/hp-p1005-cups-firmware-reload-lxc/</id>
      <published>2026-08-06T09:00:00.000Z</published>
      <updated>2026-08-06T09:00:00.000Z</updated>
      <summary>CUPS reported every job as completed and the HP LaserJet P1005 printed nothing. The cause was a firmware blob that never got pushed, because udev doesn't run inside an unprivileged LXC container.</summary>
      <category term="Homelab"/>
      <category term="Linux"/>
    </entry>
  

    <entry>
      <title>When Your k3s Cluster Goes NotReady Because the Clock is Too Fast</title>
      <link href="https://sawczuk.dev/insights/k3s-clock-drift-tls-certificate-failure/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/k3s-clock-drift-tls-certificate-failure/</id>
      <published>2026-05-19T16:00:00.000Z</published>
      <updated>2026-05-19T16:00:00.000Z</updated>
      <summary>My k3s master node went NotReady because system clock drift caused TLS certificates to appear from the future.</summary>
      <category term="Kubernetes"/>
      <category term="Homelab"/>
    </entry>
  

    <entry>
      <title>Running Gitea with act_runner for Fully Local CI/CD</title>
      <link href="https://sawczuk.dev/insights/running-gitea-with-act-runner-fully-local-cicd/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/running-gitea-with-act-runner-fully-local-cicd/</id>
      <published>2026-03-31T18:00:00.000Z</published>
      <updated>2026-03-31T18:00:00.000Z</updated>
      <summary>I moved all my server and private configs to a self-hosted Gitea instance with act_runner, keeping everything local and away from external CI providers.</summary>
      <category term="CI/CD"/>
      <category term="Homelab"/>
    </entry>
  

    <entry>
      <title>Full HTTP Request/Response Logging in Istio with Envoy Lua Filters</title>
      <link href="https://sawczuk.dev/insights/istio-envoy-lua-http-full-logging/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/istio-envoy-lua-http-full-logging/</id>
      <published>2025-10-28T18:00:00.000Z</published>
      <updated>2025-10-28T18:00:00.000Z</updated>
      <summary>Envoy sidecars in Istio don't log request/response bodies by default. Here's how to solve it with Lua filters and structured JSON logging.</summary>
      <category term="Kubernetes"/>
      <category term="Observability"/>
    </entry>
  

    <entry>
      <title>When Bitnami Changed Their Docker Repository: A Vendor Lock-In Postmortem</title>
      <link href="https://sawczuk.dev/insights/bitnami-docker-repository-change-vendor-lock/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/bitnami-docker-repository-change-vendor-lock/</id>
      <published>2025-10-25T18:00:00.000Z</published>
      <updated>2025-10-25T18:00:00.000Z</updated>
      <summary>When Bitnami moved their Docker images to a legacy namespace and deprecated most versions, thousands of deployments broke overnight. Here's what happened and what it teaches about vendor dependency management.</summary>
      <category term="Containers"/>
      <category term="Kubernetes"/>
    </entry>
  

    <entry>
      <title>Production-Ready Terragrunt: tfEnv, SOPS, TFLint, and Pre-Commit Hooks</title>
      <link href="https://sawczuk.dev/insights/production-ready-terragrunt-terraform/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/production-ready-terragrunt-terraform/</id>
      <published>2024-08-04T17:49:09.000Z</published>
      <updated>2024-08-04T17:49:09.000Z</updated>
      <summary>Structuring a Terragrunt repository for production IaC — tfenv version pinning, SOPS secrets management, TFLint validation, and pre-commit hooks for code quality.</summary>
      <category term="Terraform"/>
      <category term="IaC"/>
    </entry>
  

    <entry>
      <title>Homelab Infrastructure as Code: Pi-hole + DNS + VPN on k3s</title>
      <link href="https://sawczuk.dev/insights/building-rpi-from-the-scratch/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/building-rpi-from-the-scratch/</id>
      <published>2022-01-28T22:58:33.000Z</published>
      <updated>2022-01-28T22:58:33.000Z</updated>
      <summary>Rebuilding a homelab ad-blocker from scratch with Pi-hole, Unbound DNS, and WireGuard VPN — all managed with k3s manifests and Git, because even homelabs deserve GitOps.</summary>
      <category term="Homelab"/>
      <category term="Kubernetes"/>
    </entry>
  

    <entry>
      <title>CloudMapper: Mapping AWS Resources and Finding Security Gaps</title>
      <link href="https://sawczuk.dev/insights/cloudmapper-aws-security-audit/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/cloudmapper-aws-security-audit/</id>
      <published>2022-01-28T21:11:38.000Z</published>
      <updated>2022-01-28T21:11:38.000Z</updated>
      <summary>Using CloudMapper to inventory your AWS environment, visualize resource relationships, and generate security vulnerability reports — in under 10 minutes.</summary>
      <category term="AWS"/>
      <category term="Security"/>
    </entry>
  

    <entry>
      <title>Git-Crypt: Encrypting Sensitive Files in Git Without a Separate Secrets Store</title>
      <link href="https://sawczuk.dev/insights/git-crypt-sensitive-files-in-git/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/git-crypt-sensitive-files-in-git/</id>
      <published>2021-12-20T23:50:13.000Z</published>
      <updated>2021-12-20T23:50:13.000Z</updated>
      <summary>Using git-crypt to encrypt credentials, keys, and config files directly in a Git repository — without splitting them into a separate secrets manager.</summary>
      <category term="Security"/>
      <category term="Git"/>
    </entry>
  

    <entry>
      <title>GitHub Actions: Using Official Template Actions for Reliable Pipelines</title>
      <link href="https://sawczuk.dev/insights/github-actions-template-actions-reliable-pipelines/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/github-actions-template-actions-reliable-pipelines/</id>
      <published>2021-12-09T17:47:29.000Z</published>
      <updated>2021-12-09T17:47:29.000Z</updated>
      <summary>Using official GitHub Actions template actions instead of raw shell steps — node-version pinning, caching, and why this prevents pipeline failures on cloud image updates.</summary>
      <category term="CI/CD"/>
      <category term="Automation"/>
    </entry>
  

    <entry>
      <title>Multi-Site WordPress on Docker: Reverse Proxy, SSL, and Containerized PHP</title>
      <link href="https://sawczuk.dev/insights/multi-site-wordpress-docker-reverse-proxy-ssl/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/multi-site-wordpress-docker-reverse-proxy-ssl/</id>
      <published>2021-11-21T19:23:17.000Z</published>
      <updated>2021-11-21T19:23:17.000Z</updated>
      <summary>Running multiple WordPress sites with different PHP versions on a single Docker host — using nginx-proxy with Let's Encrypt and automated SSL.</summary>
      <category term="Containers"/>
      <category term="Linux"/>
    </entry>
  

    <entry>
      <title>Standardizing Code Quality Across Teams with Pre-Commit CI</title>
      <link href="https://sawczuk.dev/insights/format-the-code-automatically-before-commit/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/format-the-code-automatically-before-commit/</id>
      <published>2021-09-24T14:56:53.000Z</published>
      <updated>2021-09-24T14:56:53.000Z</updated>
      <summary>Git hooks that enforce formatting, linting, and testing before code reaches CI — eliminating noise in pipelines and establishing a shared quality bar across teams.</summary>
      <category term="CI/CD"/>
      <category term="Git"/>
    </entry>
  

    <entry>
      <title>Syncing Bitbucket to AWS CodeCommit via Pipeline: Full SSH Setup</title>
      <link href="https://sawczuk.dev/insights/bitbucket-codecommit-pipeline-sync-ssh/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/bitbucket-codecommit-pipeline-sync-ssh/</id>
      <published>2021-08-01T23:01:48.000Z</published>
      <updated>2021-08-01T23:01:48.000Z</updated>
      <summary>Setting up a Bitbucket pipeline that pushes changes to AWS CodeCommit on every commit — without third-party integrations or additional authentication apps.</summary>
      <category term="AWS"/>
      <category term="CI/CD"/>
    </entry>
  

    <entry>
      <title>Kubernetes RBAC: Granting Read-Only Developer Access via ServiceAccount Tokens</title>
      <link href="https://sawczuk.dev/insights/kubernetes-rbac-read-only-access-tokens/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/kubernetes-rbac-read-only-access-tokens/</id>
      <published>2021-08-01T20:28:38.000Z</published>
      <updated>2021-08-01T20:28:38.000Z</updated>
      <summary>How to give developers read-only access to a running k8s cluster — ServiceAccount, ClusterRole, RoleBinding, and a ready-to-use kubeconfig generator script.</summary>
      <category term="Kubernetes"/>
      <category term="Security"/>
    </entry>
  

    <entry>
      <title>GitFlow &amp; Semantic Versioning: A Release Engineering Framework</title>
      <link href="https://sawczuk.dev/insights/gitflow-semantic-versioning-release-engineering/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/gitflow-semantic-versioning-release-engineering/</id>
      <published>2021-07-01T20:41:32.000Z</published>
      <updated>2021-07-01T20:41:32.000Z</updated>
      <summary>GitFlow branching model combined with automated semantic versioning — how to structure releases, manage hotfixes, and keep the changelog honest.</summary>
      <category term="Git"/>
      <category term="CI/CD"/>
    </entry>
  

    <entry>
      <title>Git Merging Strategies for GitOps-Ready Repositories</title>
      <link href="https://sawczuk.dev/insights/git-merging-strategies/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/git-merging-strategies/</id>
      <published>2021-06-30T18:23:03.000Z</published>
      <updated>2021-06-30T18:23:03.000Z</updated>
      <summary>Three git merge strategies and when to use each — with focus on how they impact GitOps workflows, CI/CD traceability, and repository cleanliness.</summary>
      <category term="Git"/>
      <category term="CI/CD"/>
    </entry>
  

    <entry>
      <title>Secure Ephemeral File Transfer in CI/CD Pipelines</title>
      <link href="https://sawczuk.dev/insights/easy-and-fast-file-sharing-from-the-command-line/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/easy-and-fast-file-sharing-from-the-command-line/</id>
      <published>2021-04-17T23:17:32.000Z</published>
      <updated>2021-04-17T23:17:32.000Z</updated>
      <summary>Using ephemeral, encrypted file sharing in CI/CD pipelines for secure artifact distribution, third-party API responses, and build log uploads — without permanent hosting.</summary>
      <category term="CI/CD"/>
      <category term="Linux"/>
    </entry>
  

    <entry>
      <title>Inspect Any Docker Container's Original Run Command with runlike</title>
      <link href="https://sawczuk.dev/insights/inspect-docker-container-run-command-runlike/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/inspect-docker-container-run-command-runlike/</id>
      <published>2021-04-17T19:34:54.000Z</published>
      <updated>2021-04-17T19:34:54.000Z</updated>
      <summary>Using runlike to reconstruct the docker run command from any running container — essential for debugging deployment drift and documenting how services were actually launched.</summary>
      <category term="Containers"/>
      <category term="Linux"/>
    </entry>
  

    <entry>
      <title>Message Queues in Production: Patterns for Reliable Pipelines</title>
      <link href="https://sawczuk.dev/insights/queuing-jobs-is-easier-than-you-think/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/queuing-jobs-is-easier-than-you-think/</id>
      <published>2020-12-10T00:47:47.000Z</published>
      <updated>2020-12-10T00:47:47.000Z</updated>
      <summary>Task queuing isn't just for backend developers — it's the backbone of resilient CI/CD pipelines, webhook processing, and event-driven infrastructure. Here's how to think about it operationally.</summary>
      <category term="Architecture"/>
      <category term="CI/CD"/>
    </entry>
  

    <entry>
      <title>Docker in Production: A Cross-Team Reliability Pattern</title>
      <link href="https://sawczuk.dev/insights/docker-in-production-cross-team-reliability/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/docker-in-production-cross-team-reliability/</id>
      <published>2020-11-24T19:39:40.000Z</published>
      <updated>2020-11-24T19:39:40.000Z</updated>
      <summary>Docker isn't just a dev convenience — it's a production reliability pattern that gives Dev, DevOps, and Ops teams a shared contract for how software is built, shipped, and operated.</summary>
      <category term="Containers"/>
      <category term="Architecture"/>
    </entry>
  

    <entry>
      <title>Teaching Infrastructure Thinking Through Production-Ready Bots</title>
      <link href="https://sawczuk.dev/insights/learning-programming-not-always-have-to-be-boring/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/learning-programming-not-always-have-to-be-boring/</id>
      <published>2020-11-09T00:31:12.000Z</published>
      <updated>2020-11-09T00:31:12.000Z</updated>
      <summary>How I teach junior developers to think in infrastructure — by building chatbots that eventually run on Docker, get deployed to a VPS, and integrate with message queues like RabbitMQ.</summary>
      <category term="Containers"/>
      <category term="Career"/>
    </entry>
  

    <entry>
      <title>Automating Proxy Deployments with Bash and Ansible</title>
      <link href="https://sawczuk.dev/insights/magic-of-whiptail-squid-proxy-instalation/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/magic-of-whiptail-squid-proxy-instalation/</id>
      <published>2020-11-04T21:50:47.000Z</published>
      <updated>2020-11-04T21:50:47.000Z</updated>
      <summary>Building a bash-based Squid proxy installer with interactive whiptail dialogs, then re-deploying it reliably with Ansible — a pattern for turning one-off scripts into reproducible infrastructure.</summary>
      <category term="Automation"/>
      <category term="Linux"/>
    </entry>
  

    <entry>
      <title>Self-Hosted VPN: WireGuard on a $5 VPS for Privacy and Remote Access</title>
      <link href="https://sawczuk.dev/insights/self-hosted-wireguard-vpn-5usd-vps/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/self-hosted-wireguard-vpn-5usd-vps/</id>
      <published>2020-11-01T21:37:05.000Z</published>
      <updated>2020-11-01T21:37:05.000Z</updated>
      <summary>Setting up a personal WireGuard VPN on a cheap VPS — bypassing regional locks, avoiding commercial VPN subscriptions, and owning your network infrastructure.</summary>
      <category term="Networking"/>
      <category term="Linux"/>
    </entry>
  

    <entry>
      <title>Pypyr: YAML Pipeline Automation for Complex CI/CD Workflows</title>
      <link href="https://sawczuk.dev/insights/pypyr-yaml-pipeline-automation-cicd/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/pypyr-yaml-pipeline-automation-cicd/</id>
      <published>2020-11-01T17:01:53.000Z</published>
      <updated>2020-11-01T17:01:53.000Z</updated>
      <summary>Pypyr is a task runner that fills the gaps in cloud CI/CD — handling error conditions, API calls, and parallel execution better than Makefile or plain bash scripts.</summary>
      <category term="CI/CD"/>
      <category term="Automation"/>
    </entry>
  

    <entry>
      <title>Cloud-Native Media Server: rclone + Jellyfin on a Budget VPS</title>
      <link href="https://sawczuk.dev/insights/cloud-native-media-server-rclone-jellyfin/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/cloud-native-media-server-rclone-jellyfin/</id>
      <published>2020-10-31T13:50:26.000Z</published>
      <updated>2020-10-31T13:50:26.000Z</updated>
      <summary>Building a private Netflix with 2TB of cloud storage — using rclone for encrypted mount, Jellyfin for media management, and a lightweight VPS for transcoding.</summary>
      <category term="Homelab"/>
      <category term="Linux"/>
    </entry>
  

    <entry>
      <title>Your Old Raspberry Pi Is Still Useful: DNS + VPN in 20 Minutes</title>
      <link href="https://sawczuk.dev/insights/reboot-your-raspberry-pi/" rel="alternate"/>
      <id>https://sawczuk.dev/insights/reboot-your-raspberry-pi/</id>
      <published>2020-10-27T23:08:49.000Z</published>
      <updated>2020-10-27T23:08:49.000Z</updated>
      <summary>Setting up a home DNS sinkhole and WireGuard VPN on a Raspberry Pi — the two services that make every device on your network faster, safer, and accessible from anywhere.</summary>
      <category term="Homelab"/>
      <category term="Networking"/>
    </entry>
  
</feed>