<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Docker on DevOps Engineer &amp; CloudAdmin</title><link>https://ruadmin.root.sx/tags/docker/</link><description>Recent content in Docker on DevOps Engineer &amp; CloudAdmin</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><atom:link href="https://ruadmin.root.sx/tags/docker/index.xml" rel="self" type="application/rss+xml"/><item><title>.NET Backend Observability &amp; Telemetry Integration</title><link>https://ruadmin.root.sx/posts/sre-observability/dotnet-telemetry-observability/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruadmin.root.sx/posts/sre-observability/dotnet-telemetry-observability/</guid><description>&lt;h2 id="net-backend-observability-telemetry-integration--performance-optimization"&gt;.NET Backend Observability: Telemetry Integration &amp;amp; Performance Optimization&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="client"&gt;Client&lt;/h4&gt;
&lt;p&gt;E-commerce platform with high-load .NET 8 backend&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="challenge"&gt;Challenge&lt;/h4&gt;
&lt;p&gt;The .NET backend had no observability — no distributed tracing, no centralized metrics, no structured logging. Finding slow requests required manual log digging. The team needed full OpenTelemetry integration: trace propagation from Ingress through .NET to downstream services (PostgreSQL, Redis, RabbitMQ, HTTP upstreams), automatic slow-query detection, and a path to optimize P99 latency.&lt;/p&gt;</description></item><item><title>CI/CD &amp; Production Infrastructure for a Social App</title><link>https://ruadmin.root.sx/posts/cicd/ci-cd-dating/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruadmin.root.sx/posts/cicd/ci-cd-dating/</guid><description>&lt;h2 id="production-infrastructure--cicd-for-a-social-app-launch"&gt;Production Infrastructure &amp;amp; CI/CD for a Social App Launch&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="client"&gt;Client&lt;/h4&gt;
&lt;p&gt;Puzzle Master — a social matching platform&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="challenge"&gt;Challenge&lt;/h4&gt;
&lt;p&gt;The startup had a production-ready Nest.js backend and Angular frontend, but zero infrastructure: deployments were manual, there was no CI/CD, no monitoring, no backups, and no separation between dev and prod environments. The goal was to build a complete DevOps stack from scratch before the public launch.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="solution"&gt;Solution&lt;/h4&gt;
&lt;h6 id="1-application-containerization"&gt;1. Application Containerization&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Multi-stage Dockerfile for backend (Nest.js + Prisma, non-root user)&lt;/li&gt;
&lt;li&gt;Multi-stage Dockerfile for frontend (Angular 12, legacy OpenSSL, Nginx for static assets)&lt;/li&gt;
&lt;li&gt;Docker Compose full stack: PostgreSQL 15, Redis 7, imgproxy, Nginx&lt;/li&gt;
&lt;li&gt;Healthchecks and &lt;code&gt;depends_on&lt;/code&gt; for correct startup ordering&lt;/li&gt;
&lt;li&gt;Isolated dev and prod environments in &lt;code&gt;/opt/dev&lt;/code&gt; and &lt;code&gt;/opt/prod&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="2-gitlab-cicd"&gt;2. GitLab CI/CD&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Migration of repository from Bitbucket to GitLab&lt;/li&gt;
&lt;li&gt;Pipeline for backend and frontend: build → push → deploy&lt;/li&gt;
&lt;li&gt;GitLab Container Registry for Docker image storage&lt;/li&gt;
&lt;li&gt;Automatic deploy to dev on every push; manual trigger for prod&lt;/li&gt;
&lt;li&gt;SSH deployment to VPS via &lt;code&gt;SSH_PRIVATE_KEY&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="3-nginx-reverse-proxy"&gt;3. Nginx Reverse Proxy&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Environment-agnostic config via &lt;code&gt;envsubst&lt;/code&gt; for dev/prod parity&lt;/li&gt;
&lt;li&gt;SSL/TLS (TLSv1.2, TLSv1.3) with Cloudflare certificates&lt;/li&gt;
&lt;li&gt;Routing: &lt;code&gt;/api/*&lt;/code&gt; → backend:4000, &lt;code&gt;/*&lt;/code&gt; → frontend:80&lt;/li&gt;
&lt;li&gt;www → root domain redirect (301)&lt;/li&gt;
&lt;li&gt;Separate imgproxy stack with SSL termination&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="4-security-ansible"&gt;4. Security (Ansible)&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Server hardening via Ansible: SSH key-only auth, root login disabled&lt;/li&gt;
&lt;li&gt;UFW Firewall: only ports 80, 443, and custom SSH open&lt;/li&gt;
&lt;li&gt;Database accessible only via SSH tunnel&lt;/li&gt;
&lt;li&gt;All secrets stored in GitLab CI/CD variables&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="5-monitoring"&gt;5. Monitoring&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Prometheus + Grafana with automated dashboard provisioning&lt;/li&gt;
&lt;li&gt;Exporters: Node, cAdvisor, Postgres, Redis, Nginx, Blackbox&lt;/li&gt;
&lt;li&gt;5 Grafana dashboards: server, Docker containers, PostgreSQL, Redis, Nginx&lt;/li&gt;
&lt;li&gt;Alertmanager with Slack/webhook integration; alerts on CPU/RAM/Disk/API/SSL&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="6-database-backups"&gt;6. Database Backups&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Automated &lt;code&gt;pg_dump&lt;/code&gt; every hour&lt;/li&gt;
&lt;li&gt;gzip compression and upload to S3-compatible object storage (Cloudflare R2)&lt;/li&gt;
&lt;li&gt;Prometheus backup metrics: success status, size, timestamp&lt;/li&gt;
&lt;li&gt;Alerts: &lt;code&gt;DatabaseBackupMissing&lt;/code&gt;, &lt;code&gt;DatabaseBackupFailed&lt;/code&gt;, &lt;code&gt;DatabaseBackupSizeAnomaly&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="technologies"&gt;Technologies&lt;/h4&gt;
&lt;div class="row"&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/gitlab-original.svg" alt="GitLab"&gt;&lt;div&gt;GitLab CI&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/docker-original.svg" alt="Docker"&gt;&lt;div&gt;Docker&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/ansible-original.svg" alt="Ansible"&gt;&lt;div&gt;Ansible&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/prometheus-original.svg" alt="Prometheus"&gt;&lt;div&gt;Prometheus&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/nginx.svg" alt="Nginx"&gt;&lt;div&gt;Nginx&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/postgresql.svg" alt="PostgreSQL"&gt;&lt;div&gt;PostgreSQL&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h4 id="results"&gt;Results&lt;/h4&gt;
&lt;p&gt;✅ &lt;strong&gt;Deploy:&lt;/strong&gt; git push to main → automatic build and deploy to server&lt;br&gt;
✅ &lt;strong&gt;Environments:&lt;/strong&gt; full dev/prod isolation on a single VPS&lt;br&gt;
✅ &lt;strong&gt;Monitoring:&lt;/strong&gt; 5 dashboards, alerts across 6 categories&lt;br&gt;
✅ &lt;strong&gt;Backups:&lt;/strong&gt; automated hourly &lt;code&gt;pg_dump&lt;/code&gt; to Cloudflare R2&lt;br&gt;
✅ &lt;strong&gt;Security:&lt;/strong&gt; UFW, key-based SSH, database inaccessible from outside&lt;br&gt;
✅ &lt;strong&gt;Scalability:&lt;/strong&gt; architecture ready for database extraction to a dedicated server&lt;/p&gt;</description></item><item><title>CI/CD &amp; Production Infrastructure for a Web Application</title><link>https://ruadmin.root.sx/posts/cicd/ci-cd-js/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruadmin.root.sx/posts/cicd/ci-cd-js/</guid><description>&lt;h2 id="production-infrastructure--cicd-for-a-company-website"&gt;Production Infrastructure &amp;amp; CI/CD for a Company Website&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="client"&gt;Client&lt;/h4&gt;
&lt;p&gt;A manufacturer of branded research products that needed a website to present its product catalog to customers&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="challenge"&gt;Challenge&lt;/h4&gt;
&lt;p&gt;The developers had written the code of a conventional web application (NestJS backend + Next.js frontend), but infrastructure was completely missing: manual deployments, no CI/CD, no server setup, no monitoring, no backups and no separation between test and production environments. The goal was to build a complete DevOps stack from scratch: GitLab CI/CD, a self-hosted server, two isolated environments, HTTPS, monitoring, alerting and automated backups.&lt;/p&gt;</description></item><item><title>CI/CD with GitLab + Kubernetes: deploy in 10 minutes</title><link>https://ruadmin.root.sx/posts/cicd/ci-cd-gitlab/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruadmin.root.sx/posts/cicd/ci-cd-gitlab/</guid><description>&lt;h2 id="cicd-automation-from-2-hours-to-10-minutes-per-deploy"&gt;CI/CD automation: from 2 hours to 10 minutes per deploy&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="client"&gt;Client&lt;/h4&gt;
&lt;p&gt;E-commerce startup, 5-person engineering team&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="challenge"&gt;Challenge&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Manual deployment took 2 hours&lt;/li&gt;
&lt;li&gt;Frequent release errors&lt;/li&gt;
&lt;li&gt;No fast rollback path&lt;/li&gt;
&lt;li&gt;Required: CI/CD automation, GitOps, fast rollback&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="solution"&gt;Solution&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Self-hosted GitLab&lt;/li&gt;
&lt;li&gt;GitLab CI pipeline (Build → Test → Deploy)&lt;/li&gt;
&lt;li&gt;Managed Kubernetes in Yandex Cloud&lt;/li&gt;
&lt;li&gt;Flux CD for GitOps&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h4 id="technologies"&gt;Technologies&lt;/h4&gt;
&lt;div class="row"&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/gitlab-original.svg" alt="GitLab"&gt;&lt;div&gt;GitLab&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/docker-original.svg" alt="Docker"&gt;&lt;div&gt;Docker&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/kubernetes-plain.svg" alt="Kubernetes"&gt;&lt;div&gt;Kubernetes&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/helm-original.svg" alt="Helm"&gt;&lt;div&gt;Helm&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/flux-cd.svg" alt="Flux CD"&gt;&lt;div&gt;Flux CD&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h4 id="results"&gt;Results&lt;/h4&gt;
&lt;p&gt;✅ &lt;strong&gt;Deploy time:&lt;/strong&gt; from 2 hours to 10 minutes (12x)&lt;br&gt;
✅ &lt;strong&gt;Errors:&lt;/strong&gt; −90%&lt;br&gt;
✅ &lt;strong&gt;Deploy frequency:&lt;/strong&gt; from 1/week to 10+/day&lt;br&gt;
✅ &lt;strong&gt;Rollback time:&lt;/strong&gt; from 1 hour to 2 minutes&lt;/p&gt;</description></item><item><title>Migration and DevOps for a CS-Cart Marketplace</title><link>https://ruadmin.root.sx/posts/clouds/cscart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruadmin.root.sx/posts/clouds/cscart/</guid><description>&lt;h2 id="infrastructure-and-deployment-of-a-multi-vendor-cs-cart-marketplace"&gt;Infrastructure and Deployment of a Multi-Vendor CS-Cart Marketplace&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="client"&gt;Client&lt;/h4&gt;
&lt;p&gt;Multi-vendor marketplace&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="challenge"&gt;Challenge&lt;/h4&gt;
&lt;p&gt;Revive a legacy marketplace project and migrate it from standard shared hosting to a modern cloud environment. Ensure high availability, build CI/CD infrastructure, set up test environments, integrate third-party delivery services, and automate routine operations with AI. At the final stage, prepare an on-premise server (NAS) on the client side for cold repository storage.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="solution"&gt;Solution&lt;/h4&gt;
&lt;h6 id="1-infrastructure-in-yandex-cloud-terraform"&gt;1. Infrastructure in Yandex Cloud (Terraform)&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Built IaC configuration (Terraform) to provision Yandex Cloud infrastructure (virtual networks, VMs).&lt;/li&gt;
&lt;li&gt;Configured separate virtual machines for production and development environments.&lt;/li&gt;
&lt;li&gt;Attached and partitioned additional disks, deployed automated backups for databases and files to Yandex Object Storage (S3).&lt;/li&gt;
&lt;li&gt;Used Yandex Cloud Postbox for reliable service email delivery (domain, SPF, DKIM configured).&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="2-containerization-and-microservices"&gt;2. Containerization and Microservices&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Migrated the marketplace from classic hosting to a Docker-based VPS environment.&lt;/li&gt;
&lt;li&gt;Built a custom &lt;code&gt;Dockerfile&lt;/code&gt; for CS-Cart and a &lt;code&gt;docker-compose&lt;/code&gt; stack with a microservice-oriented web server architecture.&lt;/li&gt;
&lt;li&gt;Established full-featured dev and prod environments.&lt;/li&gt;
&lt;li&gt;Configured deployment pipelines via a local Git server (Forgejo).&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="3-marketplace-platform-cs-cart"&gt;3. Marketplace Platform (CS-Cart)&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Upgraded the CS-Cart core and optimized the database by removing obsolete, unused plugins.&lt;/li&gt;
&lt;li&gt;Deployed a clean platform installation with a new commercial theme.&lt;/li&gt;
&lt;li&gt;Configured multi-vendor business logic: role separation and seller dashboards.&lt;/li&gt;
&lt;li&gt;Integrated and configured modules: dynamic product loading, AI capabilities, smart live search, and SEO module.&lt;/li&gt;
&lt;li&gt;Integrated shipping (CDEK) and payment systems. Launched automated data exchange with 1C accounting systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="4-automation-and-n8n"&gt;4. Automation and n8n&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Deployed n8n process orchestration.&lt;/li&gt;
&lt;li&gt;Integrated ChatGPT API to automate repetitive operations such as content generation and normalization.&lt;/li&gt;
&lt;li&gt;Configured workers and triggers for store business workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="5-security-and-cloudflare"&gt;5. Security and Cloudflare&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Configured Cloudflare Proxy DNS.&lt;/li&gt;
&lt;li&gt;Implemented Cloudflare Turnstile to reduce spam during sign-up and checkout flows.&lt;/li&gt;
&lt;li&gt;Added bot protection: disabled direct registrations, configured strict caching, and filtered low-quality traffic.&lt;/li&gt;
&lt;li&gt;Installed SSL certificates and configured proper redirects.&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="6-on-premise-infrastructure-and-documentation"&gt;6. On-Premise Infrastructure and Documentation&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Set up a dedicated subdomain with a wiki engine for technical and user documentation.&lt;/li&gt;
&lt;li&gt;Implemented local infrastructure in the client’s office based on Synology NAS: Docker, S3 buckets, and backups.&lt;/li&gt;
&lt;li&gt;Deployed a local Git server (Forgejo) with a CI/CD runner for version control and long-term preservation of project assets.&lt;/li&gt;
&lt;li&gt;Collected a complete backup of Terraform states, passwords, codebases, and configurations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="7-project-archival-and-repositories"&gt;7. Project Archival and Repositories&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Migrated the production site to backup hosting for archival mode and disabled active synchronizations.&lt;/li&gt;
&lt;li&gt;Procured and configured Synology NAS in the office: external access, Docker, S3 buckets.&lt;/li&gt;
&lt;li&gt;Deployed Forgejo with a runner under the &lt;code&gt;git.*&lt;/code&gt; domain.&lt;/li&gt;
&lt;li&gt;Repositories included: website source code, theme and add-ons, documentation, n8n workflows, Telegram bots, DB backups, terraform-yandex, terraform-cloudflare, and password vault.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="technologies"&gt;Technologies&lt;/h4&gt;
&lt;div class="row"&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/docker-original.svg" alt="Docker"&gt;&lt;div&gt;Docker&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/terraform-original.svg" alt="Terraform"&gt;&lt;div&gt;Terraform&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/yandex.svg" alt="Yandex Cloud"&gt;&lt;div&gt;Yandex Cloud&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/nginx.svg" alt="Nginx"&gt;&lt;div&gt;Nginx&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/forgejo-original.svg" alt="Forgejo"&gt;&lt;div&gt;Forgejo&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/linux-original.svg" alt="Linux"&gt;&lt;div&gt;Linux&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h4 id="results"&gt;Results&lt;/h4&gt;
&lt;p&gt;✅ &lt;strong&gt;Infrastructure:&lt;/strong&gt; shared hosting → VPS in Yandex Cloud via Terraform, fully containerized with Docker&lt;br&gt;
✅ &lt;strong&gt;Platform:&lt;/strong&gt; clean CS-Cart Multi-Vendor installation replaced a heavily modified legacy core&lt;br&gt;
✅ &lt;strong&gt;Theme and modules:&lt;/strong&gt; commercial theme, live search, UX/UI improvements, SMS authentication, AJAX catalog&lt;br&gt;
✅ &lt;strong&gt;Integrations:&lt;/strong&gt; CDEK, Boxberry, Russian Post, Faster Payments System (SBP), and dual-environment 1C exchange&lt;br&gt;
✅ &lt;strong&gt;Documentation:&lt;/strong&gt; wiki on &lt;code&gt;docs.*&lt;/code&gt; subdomain with a complete project structure&lt;br&gt;
✅ &lt;strong&gt;Automation:&lt;/strong&gt; n8n + ChatGPT API for routine operations&lt;br&gt;
✅ &lt;strong&gt;Backups:&lt;/strong&gt; Yandex Object Storage + mirrored copy on office Synology NAS&lt;br&gt;
✅ &lt;strong&gt;Git:&lt;/strong&gt; self-hosted Forgejo on NAS with runner and full project repositories&lt;br&gt;
✅ &lt;strong&gt;Archival handover:&lt;/strong&gt; project fully transferred to the client’s on-premise Synology NAS, including a private Forgejo Git server.&lt;/p&gt;</description></item><item><title>Prometheus + Grafana Monitoring Stack</title><link>https://ruadmin.root.sx/posts/sre-observability/monitoring-prometheus/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruadmin.root.sx/posts/sre-observability/monitoring-prometheus/</guid><description>&lt;h2 id="observability-stack-for-microservices-architecture"&gt;Observability Stack for Microservices Architecture&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="client"&gt;Client&lt;/h4&gt;
&lt;p&gt;Early-stage startup&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="challenge"&gt;Challenge&lt;/h4&gt;
&lt;p&gt;After migrating to a microservices architecture (15+ services), the team had no centralized monitoring in place. Issues were only discovered through user complaints — typically 30+ minutes after they occurred. A full observability stack was needed to detect and diagnose problems proactively.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="solution"&gt;Solution&lt;/h4&gt;
&lt;h6 id="1-monitoring-architecture"&gt;1. Monitoring Architecture&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prometheus&lt;/strong&gt; for metrics collection&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grafana&lt;/strong&gt; for visualization&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Loki&lt;/strong&gt; for centralized log aggregation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jaeger&lt;/strong&gt; for distributed tracing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alertmanager&lt;/strong&gt; for notifications&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="2-metrics-collection"&gt;2. Metrics Collection&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Automatic service discovery in Kubernetes&lt;/li&gt;
&lt;li&gt;Application-level custom metrics&lt;/li&gt;
&lt;li&gt;System metrics via node-exporter&lt;/li&gt;
&lt;li&gt;Database metrics via postgres-exporter and redis-exporter&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="3-grafana-dashboards"&gt;3. Grafana Dashboards&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Per-service dashboards for each microservice&lt;/li&gt;
&lt;li&gt;Unified infrastructure overview dashboard&lt;/li&gt;
&lt;li&gt;SLA/SLO tracking metrics&lt;/li&gt;
&lt;li&gt;Business metrics (RPS, conversion rate)&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="4-centralized-logging-loki"&gt;4. Centralized Logging (Loki)&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Log aggregation across all services&lt;/li&gt;
&lt;li&gt;Full-text log search via Grafana&lt;/li&gt;
&lt;li&gt;Log-to-metric correlation&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="5-distributed-tracing-jaeger"&gt;5. Distributed Tracing (Jaeger)&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;HTTP request tracing across services&lt;/li&gt;
&lt;li&gt;Call chain visualization&lt;/li&gt;
&lt;li&gt;Bottleneck identification&lt;/li&gt;
&lt;li&gt;Per-service latency analysis&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="6-alerting"&gt;6. Alerting&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Alerts delivered to Slack / PagerDuty / custom webhooks&lt;/li&gt;
&lt;li&gt;Critical issue escalation&lt;/li&gt;
&lt;li&gt;On-call rotation support&lt;/li&gt;
&lt;li&gt;Automatic incident creation&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="technologies"&gt;Technologies&lt;/h4&gt;
&lt;div class="row"&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/prometheus-original.svg" alt="Prometheus"&gt;&lt;div&gt;Prometheus&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/grafana-original.svg" alt="Grafana"&gt;&lt;div&gt;Grafana&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/kubernetes-plain.svg" alt="Kubernetes"&gt;&lt;div&gt;Kubernetes&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/docker-original.svg" alt="Docker"&gt;&lt;div&gt;Docker&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/helm-original.svg" alt="Helm"&gt;&lt;div&gt;Helm&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/linux-original.svg" alt="Linux"&gt;&lt;div&gt;Linux&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h4 id="results"&gt;Results&lt;/h4&gt;
&lt;p&gt;✅ &lt;strong&gt;MTTD:&lt;/strong&gt; reduced from 30 minutes to under 1 minute&lt;br&gt;
✅ &lt;strong&gt;MTTR:&lt;/strong&gt; recovery time reduced by 60%&lt;br&gt;
✅ &lt;strong&gt;Alerts:&lt;/strong&gt; proactive notifications before users are impacted&lt;br&gt;
✅ &lt;strong&gt;Visibility:&lt;/strong&gt; full observability across all services&lt;br&gt;
✅ &lt;strong&gt;Capacity planning:&lt;/strong&gt; data-driven resource forecasting&lt;/p&gt;</description></item><item><title>Self-Hosted Cloud Storage with Nextcloud</title><link>https://ruadmin.root.sx/posts/self-hosted/nextcloud/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruadmin.root.sx/posts/self-hosted/nextcloud/</guid><description>&lt;h2 id="self-hosted-corporate-cloud"&gt;Self-Hosted Corporate Cloud&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="client"&gt;Client&lt;/h4&gt;
&lt;p&gt;Mid-sized business with strict data privacy and data residency requirements&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="challenge"&gt;Challenge&lt;/h4&gt;
&lt;p&gt;The company relied on third-party cloud services to store and share work files, creating data leakage risks and dependency on external providers. They needed a self-hosted solution with in-browser document editing, deleted file recovery, revision history, and additional collaboration tools — calendar, notes, and email — all under their own control.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="solution"&gt;Solution&lt;/h4&gt;
&lt;h6 id="1-nextcloud-aio-deployment"&gt;1. Nextcloud AIO Deployment&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nextcloud All-in-One&lt;/strong&gt; — official Docker image with the full stack out of the box&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt; for application data storage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redis&lt;/strong&gt; for caching and background job queues&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nginx&lt;/strong&gt; as a reverse proxy with automatic SSL/TLS&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="2-in-browser-document-editing"&gt;2. In-Browser Document Editing&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nextcloud Office&lt;/strong&gt; (Collabora Online) — built-in office suite&lt;/li&gt;
&lt;li&gt;Support for .docx, .xlsx, .pptx and ODF formats&lt;/li&gt;
&lt;li&gt;Real-time collaborative editing&lt;/li&gt;
&lt;li&gt;No local software installation required&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="3-file-management"&gt;3. File Management&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Deleted files trash bin with configurable retention period&lt;/li&gt;
&lt;li&gt;File version history — roll back to any previous revision&lt;/li&gt;
&lt;li&gt;Granular access control: folders, share links, passwords&lt;/li&gt;
&lt;li&gt;Mobile and desktop sync clients&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="4-collaboration-tools"&gt;4. Collaboration Tools&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Calendar&lt;/strong&gt; (CalDAV) — team scheduling and events&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Notes&lt;/strong&gt; — personal and team notes with Markdown support&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mail&lt;/strong&gt; — built-in web client for corporate email (IMAP/SMTP)&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="5-backup"&gt;5. Backup&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Borg Backup&lt;/strong&gt; — incremental backup built into Nextcloud AIO&lt;/li&gt;
&lt;li&gt;Data deduplication and compression&lt;/li&gt;
&lt;li&gt;Scheduled automatic runs&lt;/li&gt;
&lt;li&gt;Remote storage for backups (S3-compatible / SFTP)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="technologies"&gt;Technologies&lt;/h4&gt;
&lt;div class="row"&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/nextcloud.svg" alt="Nextcloud"&gt;&lt;div&gt;Nextcloud&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/docker-original.svg" alt="Docker"&gt;&lt;div&gt;Docker&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/postgresql.svg" alt="PostgreSQL"&gt;&lt;div&gt;PostgreSQL&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/nginx.svg" alt="Nginx"&gt;&lt;div&gt;Nginx&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/linux-original.svg" alt="Linux"&gt;&lt;div&gt;Linux&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h4 id="results"&gt;Results&lt;/h4&gt;
&lt;p&gt;✅ &lt;strong&gt;Data ownership:&lt;/strong&gt; files stay on company servers, no third-party providers&lt;br&gt;
✅ &lt;strong&gt;In-browser editing:&lt;/strong&gt; office documents open and edit directly in the browser&lt;br&gt;
✅ &lt;strong&gt;Safety net:&lt;/strong&gt; version history and trash bin protect against accidental data loss&lt;br&gt;
✅ &lt;strong&gt;Unified platform:&lt;/strong&gt; single solution for files, calendar, notes, and email&lt;br&gt;
✅ &lt;strong&gt;Automated backups:&lt;/strong&gt; incremental backup via Borg Backup on a set schedule&lt;/p&gt;</description></item><item><title>Self-Hosted Corporate Messenger (Matrix)</title><link>https://ruadmin.root.sx/posts/self-hosted/matrix-messenger/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruadmin.root.sx/posts/self-hosted/matrix-messenger/</guid><description>&lt;h2 id="self-hosted-secure-messenger-for-enterprise-communications"&gt;Self-Hosted Secure Messenger for Enterprise Communications&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="client"&gt;Client&lt;/h4&gt;
&lt;p&gt;Mid-size business with strict data privacy and security requirements&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="challenge"&gt;Challenge&lt;/h4&gt;
&lt;p&gt;The company required full control over its internal communications — no third-party servers, no data leakage risks. The solution had to support end-to-end encryption, voice and video calls, file sharing, and seamless integration with existing corporate infrastructure, all manageable by an internal team.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="solution"&gt;Solution&lt;/h4&gt;
&lt;h6 id="1-server-stack"&gt;1. Server Stack&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Matrix Synapse&lt;/strong&gt; as the core messaging server&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PostgreSQL 16&lt;/strong&gt; for persistent data storage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caddy&lt;/strong&gt; as reverse proxy with automatic SSL/TLS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker Compose&lt;/strong&gt; for service orchestration&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="2-client-applications"&gt;2. Client Applications&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Element Web&lt;/strong&gt; for browser access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Element Desktop&lt;/strong&gt; for Windows/macOS/Linux&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Element Mobile&lt;/strong&gt; for iOS/Android&lt;/li&gt;
&lt;li&gt;Consistent interface across all platforms&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="3-voice--video-calls"&gt;3. Voice &amp;amp; Video Calls&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Coturn&lt;/strong&gt; (TURN/STUN server) for NAT traversal&lt;/li&gt;
&lt;li&gt;Group video call support&lt;/li&gt;
&lt;li&gt;UDP ports 49160–49200 for media traffic&lt;/li&gt;
&lt;li&gt;Automatic configuration via environment variables&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="4-administration"&gt;4. Administration&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Synapse Admin&lt;/strong&gt; web UI for user and room management&lt;/li&gt;
&lt;li&gt;Usage statistics and monitoring&lt;/li&gt;
&lt;li&gt;Accessible on a dedicated port (8888)&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="5-security"&gt;5. Security&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;End-to-end encrypted messages&lt;/li&gt;
&lt;li&gt;Automatic SSL/TLS certificates via Caddy&lt;/li&gt;
&lt;li&gt;Public registration disabled&lt;/li&gt;
&lt;li&gt;Optional federation with other Matrix servers&lt;/li&gt;
&lt;li&gt;Healthchecks on all services&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="6-automation"&gt;6. Automation&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Single Bash script for full stack initialization&lt;/li&gt;
&lt;li&gt;Automatic Synapse config generation&lt;/li&gt;
&lt;li&gt;Automated admin user creation via &lt;code&gt;expect&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Docker Compose with dependency ordering and healthchecks&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="technologies"&gt;Technologies&lt;/h4&gt;
&lt;div class="row"&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/docker-original.svg" alt="Docker"&gt;&lt;div&gt;Docker&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/postgresql.svg" alt="PostgreSQL"&gt;&lt;div&gt;PostgreSQL&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/caddy.svg" alt="Caddy"&gt;&lt;div&gt;Caddy&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/bash.svg" alt="Bash"&gt;&lt;div&gt;Bash&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/linux-original.svg" alt="Linux"&gt;&lt;div&gt;Linux&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/element.svg" alt="Element"&gt;&lt;div&gt;Element + Matrix + Synapse&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h4 id="results"&gt;Results&lt;/h4&gt;
&lt;p&gt;✅ &lt;strong&gt;Data ownership:&lt;/strong&gt; full control over messages and user data — no third-party servers&lt;br&gt;
✅ &lt;strong&gt;Scale:&lt;/strong&gt; 100+ concurrent users&lt;br&gt;
✅ &lt;strong&gt;Features:&lt;/strong&gt; text, voice, video, file sharing up to 1.5 GB, E2E encryption&lt;br&gt;
✅ &lt;strong&gt;Speed:&lt;/strong&gt; full deployment in 5 minutes with a single script&lt;br&gt;
✅ &lt;strong&gt;Reliability:&lt;/strong&gt; automatic SSL certificates, healthchecks, auto-restart&lt;/p&gt;</description></item><item><title>Self-Hosted Project Management with Plane</title><link>https://ruadmin.root.sx/posts/self-hosted/plane-so/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruadmin.root.sx/posts/self-hosted/plane-so/</guid><description>&lt;h2 id="self-hosted-project-management-with-plane-so"&gt;Self-Hosted Project Management with Plane So&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="client"&gt;Client&lt;/h4&gt;
&lt;p&gt;A company seeking its own project management tool hosted on their office infrastructure&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="challenge"&gt;Challenge&lt;/h4&gt;
&lt;p&gt;The client wanted an open-source alternative to Jira/Linear for project and task management, deployed on their own server within an existing Coolify environment. Requirements included: installing the latest version of Plane CE, ensuring proper operation behind Traefik reverse proxy, extracting the database as a separate Coolify service for convenient archiving, and setting up regular backups for all data.&lt;/p&gt;</description></item><item><title>Self-Hosted Remote Desktop with RustDesk</title><link>https://ruadmin.root.sx/posts/self-hosted/rustdesk-remote-desktop/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruadmin.root.sx/posts/self-hosted/rustdesk-remote-desktop/</guid><description>&lt;h2 id="self-hosted-remote-desktop-with-rustdesk"&gt;Self-Hosted Remote Desktop with RustDesk&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="client"&gt;Client&lt;/h4&gt;
&lt;p&gt;A company providing support and maintenance for the 1C platform&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="challenge"&gt;Challenge&lt;/h4&gt;
&lt;p&gt;The client needed a secure, self-hosted remote desktop solution to allow their support engineers to connect to client workstations and servers. They required full control over data, no reliance on third-party cloud services, and a solution that works reliably within corporate networks.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="solution"&gt;Solution&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Deployed &lt;strong&gt;RustDesk OSS&lt;/strong&gt; (open-source) server using Docker Compose&lt;/li&gt;
&lt;li&gt;Configured &lt;strong&gt;hbbs&lt;/strong&gt; (ID/relay server) and &lt;strong&gt;hbbr&lt;/strong&gt; (relay server) components&lt;/li&gt;
&lt;li&gt;Configured firewall rules and network access for secure connections&lt;/li&gt;
&lt;li&gt;Provided client configuration files for easy deployment across the support team&lt;/li&gt;
&lt;li&gt;Documented maintenance procedures and backup strategy&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="technologies"&gt;Technologies&lt;/h4&gt;
&lt;div class="row"&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/rustdesk.svg" alt="RustDesk"&gt;&lt;div&gt;RustDesk&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/docker-original.svg" alt="Docker"&gt;&lt;div&gt;Docker&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/linux-original.svg" alt="Linux"&gt;&lt;div&gt;Linux&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/bash.svg" alt="Bash"&gt;&lt;div&gt;Bash&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h4 id="results"&gt;Results&lt;/h4&gt;
&lt;p&gt;✅ &lt;strong&gt;Full data sovereignty&lt;/strong&gt; — all connection metadata and relay traffic stays on client&amp;rsquo;s infrastructure&lt;br&gt;
✅ &lt;strong&gt;Zero licensing costs&lt;/strong&gt; — open-source RustDesk eliminates per-seat fees&lt;br&gt;
✅ &lt;strong&gt;Reliable connectivity&lt;/strong&gt; — engineers can access client machines from anywhere&lt;br&gt;
✅ &lt;strong&gt;Simple client rollout&lt;/strong&gt; — pre-configured client configs for quick team onboarding&lt;br&gt;
✅ &lt;strong&gt;Corporate network friendly&lt;/strong&gt; — works through NAT/firewalls with relay servers&lt;/p&gt;</description></item><item><title>WireGuard VPN Infrastructure</title><link>https://ruadmin.root.sx/posts/network-security/vpn-services/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruadmin.root.sx/posts/network-security/vpn-services/</guid><description>&lt;h2 id="wireguard-vpn-infrastructure"&gt;WireGuard VPN Infrastructure&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="challenge"&gt;Challenge&lt;/h4&gt;
&lt;p&gt;A distributed team of 15+ engineers working across multiple locations needed secure, low-latency access to internal corporate infrastructure — without relying on heavyweight legacy VPN appliances. The existing setup introduced significant overhead, was difficult to maintain, and caused frequent connectivity issues for remote employees. The goal was to replace it with a lightweight, self-hosted solution that is fast, auditable, and easy to scale.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="solution"&gt;Solution&lt;/h4&gt;
&lt;h6 id="1-technology-selection"&gt;1. Technology Selection&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Protocol evaluation: OpenVPN, WireGuard, Outline&lt;/li&gt;
&lt;li&gt;WireGuard chosen for its speed, simplicity, and modern cryptography&lt;/li&gt;
&lt;li&gt;Docker for isolation and portability&lt;/li&gt;
&lt;li&gt;Ansible for automated provisioning&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="2-infrastructure"&gt;2. Infrastructure&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;VPS hosted in a neutral jurisdiction (Netherlands)&lt;/li&gt;
&lt;li&gt;Docker Compose for service orchestration&lt;/li&gt;
&lt;li&gt;WireGuard running in a container&lt;/li&gt;
&lt;li&gt;Nginx for the web management panel&lt;/li&gt;
&lt;li&gt;Prometheus + Grafana for monitoring&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="3-automation"&gt;3. Automation&lt;/h6&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Ansible playbook for deployment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Deploy WireGuard VPN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hosts&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;vpn_servers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;roles&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;docker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;wireguard&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;monitoring&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;backup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h6 id="4-security"&gt;4. Security&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Automatic key rotation&lt;/li&gt;
&lt;li&gt;Firewall rules (UFW)&lt;/li&gt;
&lt;li&gt;Fail2ban for brute-force protection&lt;/li&gt;
&lt;li&gt;ChaCha20-Poly1305 traffic encryption&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="5-monitoring"&gt;5. Monitoring&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Bandwidth and throughput metrics&lt;/li&gt;
&lt;li&gt;Downtime alerts&lt;/li&gt;
&lt;li&gt;Connection logging&lt;/li&gt;
&lt;li&gt;Automatic restart on failure&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="technologies"&gt;Technologies&lt;/h4&gt;
&lt;div class="row"&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/wireguard.svg" alt="WireGuard"&gt;&lt;div&gt;WireGuard&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/docker-original.svg" alt="Docker"&gt;&lt;div&gt;Docker&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/ansible-original.svg" alt="Ansible"&gt;&lt;div&gt;Ansible&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/prometheus-original.svg" alt="Prometheus"&gt;&lt;div&gt;Prometheus&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h4 id="results"&gt;Results&lt;/h4&gt;
&lt;p&gt;✅ &lt;strong&gt;Uptime:&lt;/strong&gt; 99.8% over 6+ months of operation&lt;br&gt;
✅ &lt;strong&gt;Speed:&lt;/strong&gt; stable 100+ Mbps&lt;br&gt;
✅ &lt;strong&gt;Access:&lt;/strong&gt; OpenAI API, ChatGPT, GitHub Copilot, npm registry&lt;br&gt;
✅ &lt;strong&gt;Deployment time:&lt;/strong&gt; ~20 minutes per new server&lt;br&gt;
✅ &lt;strong&gt;Users:&lt;/strong&gt; 15+ developers with zero connectivity issues&lt;/p&gt;</description></item></channel></rss>