<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Sam Robbins&#39; Website on Lekshmi Kolappan</title>
    <link>https://l4linux.com/</link>
    <description>Recent content in Sam Robbins&#39; Website on Lekshmi Kolappan</description>
    <generator>Hugo</generator>
    <language>en-gb</language>
    <lastBuildDate>Sat, 25 Oct 2025 23:00:00 +0000</lastBuildDate>
    <atom:link href="https://l4linux.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>StackQuest - DevOps Knowledge Platform</title>
      <link>https://l4linux.com/portfolio/stack-quest/</link>
      <pubDate>Sat, 25 Oct 2025 23:00:00 +0000</pubDate>
      <guid>https://l4linux.com/portfolio/stack-quest/</guid>
      <description>&lt;h2 id=&#34;what-is-the-significance-of-this&#34;&gt;What is the significance of this?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Interactive Learning Platform&lt;/strong&gt;: A quest-based knowledge platform for mastering DevOps, SRE, and Cloud engineering concepts&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Curated Content&lt;/strong&gt;: High-quality questions and challenges across 12+ categories covering essential DevOps skills&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Session Tracking&lt;/strong&gt;: Intelligent system prevents question repetition for focused learning&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Zero Infrastructure&lt;/strong&gt;: Static site deployed on GitHub Pages with automatic CI/CD&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Open Source Community&lt;/strong&gt;: Contributions welcome to expand the knowledge base&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Mobile Responsive&lt;/strong&gt;: Works seamlessly on desktop and mobile devices&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;how-is-automation-accomplished&#34;&gt;How is automation accomplished?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;GitHub Actions CI/CD&lt;/strong&gt;: Automated deployment to GitHub Pages on every push to main branch&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Static Site Architecture&lt;/strong&gt;: No server-side dependencies, fast loading times&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;JavaScript-powered&lt;/strong&gt;: Client-side question randomization and session management&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Markdown-based Content&lt;/strong&gt;: Easy content management through markdown files&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category-based Organization&lt;/strong&gt;: Structured content across multiple technology domains&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Session Persistence&lt;/strong&gt;: Browser localStorage for tracking answered questions&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Web browser (Chrome, Firefox, Safari, or Edge)&lt;/li&gt;&#xA;&lt;li&gt;No installation or setup required - works directly in browser&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;source-code&#34;&gt;Source Code&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://github.com/Lforlinux/StackQuest&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;how-to-contribute&#34;&gt;How to contribute?&lt;/h2&gt;&#xA;&lt;h3 id=&#34;getting-started&#34;&gt;Getting Started&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Fork the repository&lt;/strong&gt; to your GitHub account&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Clone your fork&lt;/strong&gt; locally: &lt;code&gt;git clone https://github.com/yourusername/StackQuest.git&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Create a feature branch&lt;/strong&gt;: &lt;code&gt;git checkout -b feature/your-feature&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Make your changes&lt;/strong&gt; (add questions, fix bugs, improve UI, etc.)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Test locally&lt;/strong&gt; by opening &lt;code&gt;index.html&lt;/code&gt; in your browser&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Commit and push&lt;/strong&gt; your changes: &lt;code&gt;git push origin feature/your-feature&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Create a Pull Request&lt;/strong&gt; on the original repository&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;GitHub Actions will automatically deploy&lt;/strong&gt; your changes once merged&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;deployment&#34;&gt;Deployment&lt;/h3&gt;&#xA;&lt;p&gt;The project uses GitHub Actions for automatic deployment to GitHub Pages:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Self-Hosted Finance</title>
      <link>https://l4linux.com/blog/actual-fianance/</link>
      <pubDate>Sat, 27 Sep 2025 08:53:27 +0530</pubDate>
      <guid>https://l4linux.com/blog/actual-fianance/</guid>
      <description>&lt;h1 id=&#34;self-hosted-finance-taking-control-of-your-money-with-actual-budget&#34;&gt;Self-Hosted Finance: Taking Control of Your Money with Actual Budget&lt;/h1&gt;&#xA;&lt;p&gt;&lt;em&gt;Building your own personal finance stack, one Docker container at a time&lt;/em&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;-my-budgeting-journey-from-diary-to-self-hosted-finance&#34;&gt;💰 My Budgeting Journey: From Diary to Self-Hosted Finance&lt;/h2&gt;&#xA;&lt;p&gt;My personal finance journey started simple — with a pen and paper diary tracking every expense. As my financial life became more complex, I graduated to Google Sheets for better calculations and visualization. But when I discovered the power of dedicated budgeting software, I faced the same question that plagues every homelab enthusiast:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Self-Hosted Sound: Building My Personal High-Fidelity Music Streaming Setup</title>
      <link>https://l4linux.com/blog/self-hosted-sound-high-fidelity-music-streaming/</link>
      <pubDate>Wed, 02 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://l4linux.com/blog/self-hosted-sound-high-fidelity-music-streaming/</guid>
      <description>&lt;p&gt;🎵 &lt;strong&gt;Self-Hosted Sound: Building My Personal High-Fidelity Music Streaming Setup&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;In a world where everything is now a subscription — from task managers to weather apps — streaming music has become another monthly bill we all accept without thinking. But as someone who has always leaned into open-source and self-hosted solutions, I began to ask myself a simple question:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Why pay every month for compressed audio when I could host my own music server — in full lossless quality — and actually own my collection?&lt;/p&gt;</description>
    </item>
    <item>
      <title>HaaS: Homelab as a Service</title>
      <link>https://l4linux.com/blog/haas-homelab-as-a-service/</link>
      <pubDate>Tue, 01 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://l4linux.com/blog/haas-homelab-as-a-service/</guid>
      <description>&lt;p&gt;In today&amp;rsquo;s world of SaaS everything — where every tool comes with a monthly subscription 💸 — I often find myself asking: &amp;ldquo;Why pay for all of this when powerful, open-source alternatives exist? 🐧&amp;rdquo; Having worked with open-source software from the very beginning of my career, I&amp;rsquo;ve always believed that owning your data and infrastructure is the way forward. 🗝️&lt;/p&gt;&#xA;&lt;p&gt;For a long time, I dreamt of building my own NAS (Network Attached Storage) 🗄️. Like many hobbyists, I started with the world&amp;rsquo;s tiniest computer — the Raspberry Pi 🥧. I paired it with open-source NAS operating systems like TrueNAS and OpenMediaVault, experimenting for a few years. But while these setups were fun and educational, they fell short when it came to performance and reliability. ⚡️❌&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes GitOps Platform - Complete EKS Infrastructure &amp; Platform Toolkit</title>
      <link>https://l4linux.com/portfolio/kubernetes-gitops-platform/</link>
      <pubDate>Wed, 15 Jan 2025 23:00:00 +0000</pubDate>
      <guid>https://l4linux.com/portfolio/kubernetes-gitops-platform/</guid>
      <description>&lt;h2 id=&#34;what-is-the-significance-of-this&#34;&gt;What is the significance of this?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Complete Infrastructure as Code&lt;/strong&gt;: Provision entire AWS EKS cluster and all platform services with a single command&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;GitOps Automation&lt;/strong&gt;: ArgoCD automatically deploys and manages all platform applications from Git repositories&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Production-Ready Platform&lt;/strong&gt;: Comprehensive observability stack with monitoring, logging, and testing tools&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;High Availability&lt;/strong&gt;: Multi-AZ deployment with auto-scaling worker nodes and Horizontal Pod Autoscaler (HPA)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Zero-Downtime Deployments&lt;/strong&gt;: Kubernetes rolling updates ensure continuous service availability&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Complete Observability&lt;/strong&gt;: Prometheus, Grafana, Loki, and Promtail for metrics, logs, and dashboards&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;SRE-Ready&lt;/strong&gt;: Availability testing and sanity checks built-in&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;how-is-automation-accomplished&#34;&gt;How is automation accomplished?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Terraform Infrastructure&lt;/strong&gt;: Complete AWS infrastructure provisioning (VPC, EKS, IAM, Security Groups) as code&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Docker Containerization&lt;/strong&gt;: Terraform runs in Docker for consistent execution across team members&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Helm Charts&lt;/strong&gt;: Application deployment automation with Helm templates and values management&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;ArgoCD GitOps&lt;/strong&gt;: App-of-apps pattern automatically deploys entire platform toolkit from Git&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Makefile Automation&lt;/strong&gt;: One-command deployment (&lt;code&gt;make deploy&lt;/code&gt;) for entire infrastructure stack&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Auto-Scaling&lt;/strong&gt;: HPA for pod scaling and AWS Auto Scaling Groups for worker node scaling&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Automated Sync&lt;/strong&gt;: ArgoCD continuously syncs Git changes to cluster with self-healing capabilities&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;AWS Account&lt;/strong&gt;: Programmatic access with IAM user&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;IAM Policies&lt;/strong&gt;: AmazonEC2FullAccess, IAMFullAccess, AutoScalingFullAccess, AmazonEKSClusterPolicy, AmazonEKSWorkerNodePolicy, AmazonVPCFullAccess, AmazonEKSServicePolicy, AmazonEKS_CNI_Policy&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Docker&lt;/strong&gt;: Installed and running for Terraform containerization&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;AWS CLI&lt;/strong&gt;: Configured with credentials (&lt;code&gt;~/.aws/credentials&lt;/code&gt; or &lt;code&gt;AWS_PROFILE&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Git&lt;/strong&gt;: For cloning repositories&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;source-code&#34;&gt;Source Code&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Infrastructure Repository: https://github.com/Lforlinux/k8s-infrastructure-as-code&#xA;Platform Toolkit Repository: https://github.com/Lforlinux/k8s-platform-toolkit&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;how-to-provision-the-infrastructure&#34;&gt;How to provision the infrastructure&lt;/h2&gt;&#xA;&lt;h3 id=&#34;quick-start-deployment&#34;&gt;Quick Start Deployment&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0080ff;font-style:italic&#34;&gt;# Clone the infrastructure repository&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/Lforlinux/k8s-infrastructure-as-code.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#5918bb;font-weight:bold&#34;&gt;cd&lt;/span&gt; k8s-infrastructure-as-code&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0080ff;font-style:italic&#34;&gt;# Configure AWS credentials&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aws configure&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0080ff;font-style:italic&#34;&gt;# OR set AWS_PROFILE environment variable&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#5918bb;font-weight:bold&#34;&gt;export&lt;/span&gt; AWS_PROFILE&lt;span style=&#34;color:#2c5dcd&#34;&gt;=&lt;/span&gt;your-profile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0080ff;font-style:italic&#34;&gt;# Deploy entire stack with one command&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make deploy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;Review the Terraform plan and type &lt;code&gt;yes&lt;/code&gt; to proceed. The deployment includes:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cloud CV - Serverless Resume with AWS Infrastructure as Code</title>
      <link>https://l4linux.com/portfolio/cloud-cv/</link>
      <pubDate>Fri, 03 Jan 2025 23:00:00 +0000</pubDate>
      <guid>https://l4linux.com/portfolio/cloud-cv/</guid>
      <description>&lt;h2 id=&#34;what-is-the-significance-of-this&#34;&gt;What is the significance of this?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Serverless Architecture&lt;/strong&gt;: A fully serverless resume website showcasing modern cloud-native development practices&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Infrastructure as Code&lt;/strong&gt;: Complete AWS infrastructure managed through Terraform with automated deployments&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;CI/CD Pipeline&lt;/strong&gt;: GitHub Actions automation for one-click deployments with visitor counter functionality&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Local Development&lt;/strong&gt;: LocalStack integration for local AWS development without cloud costs&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Professional Portfolio&lt;/strong&gt;: Demonstrates SRE/DevOps expertise through the project itself&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;how-is-automation-accomplished&#34;&gt;How is automation accomplished?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Terraform Infrastructure&lt;/strong&gt;: Complete AWS infrastructure provisioned as code including S3, CloudFront, Lambda, DynamoDB, and API Gateway&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;GitHub Actions CI/CD&lt;/strong&gt;: Automated deployment pipeline that builds, tests, and deploys on every commit&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Serverless Backend&lt;/strong&gt;: Python Lambda function with DynamoDB for visitor counter with CORS support&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Static Website Hosting&lt;/strong&gt;: S3 + CloudFront for global CDN with automatic HTTPS and custom domain support&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;LocalStack Development&lt;/strong&gt;: Local AWS environment for development and testing without cloud costs&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Infrastructure Monitoring&lt;/strong&gt;: CloudWatch logs and metrics for observability and debugging&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;AWS account with programmatic access&lt;/li&gt;&#xA;&lt;li&gt;AWS IAM user with the following policies:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;AmazonS3FullAccess&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;CloudFrontFullAccess&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;AWSLambdaFullAccess&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;AmazonDynamoDBFullAccess&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;AmazonAPIGatewayAdministrator&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;IAMFullAccess&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;CloudWatchLogsFullAccess&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Terraform &amp;gt;= 1.0&lt;/li&gt;&#xA;&lt;li&gt;Docker (for LocalStack development)&lt;/li&gt;&#xA;&lt;li&gt;Git and GitHub account&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;source-code&#34;&gt;Source Code&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://github.com/Lforlinux/Cloud-CV&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;how-to-deploy-the-infrastructure&#34;&gt;How to deploy the infrastructure&lt;/h2&gt;&#xA;&lt;h3 id=&#34;automated-deployment-recommended&#34;&gt;Automated Deployment (Recommended)&lt;/h3&gt;&#xA;&lt;p&gt;The project uses GitHub Actions for one-click deployment:&lt;/p&gt;</description>
    </item>
    <item>
      <title>diffctl</title>
      <link>https://l4linux.com/bin/diffctl/</link>
      <pubDate>Fri, 03 Jan 2025 23:00:00 +0000</pubDate>
      <guid>https://l4linux.com/bin/diffctl/</guid>
      <description>&lt;h1 id=&#34;diffctl&#34;&gt;diffctl&lt;/h1&gt;&#xA;&lt;p&gt;A smart, sysadmin-friendly diff checker for text and JSON. Built for Linux admins and power users, diffctl provides intelligent, side-by-side and unified diffing for text and JSON, with a modern UI and Docker support.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-diffctl&#34;&gt;What is diffctl?&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;diffctl&lt;/strong&gt; is a web-based tool that provides intelligent diffing capabilities for text and JSON content. It features automatic mode detection, real-time comparison, and a modern responsive interface.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-features&#34;&gt;Key Features&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Intelligent Mode Detection&lt;/strong&gt;: Automatically detects whether input is text or JSON&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Text Diff Mode&lt;/strong&gt;: Compare plain text with line-by-line difference highlighting&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;JSON Diff Mode&lt;/strong&gt;: Compare JSON objects with structured property-by-property comparison&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Multiple View Modes&lt;/strong&gt;: Unified view and side-by-side comparison&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Real-time Comparison&lt;/strong&gt;: Instant diff results as you type&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Dark/Light Theme&lt;/strong&gt;: Toggle between themes with persistent user preference&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Docker Support&lt;/strong&gt;: Easy deployment with Docker and Docker Compose&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;&#xA;&lt;h3 id=&#34;option-1-docker-recommended&#34;&gt;Option 1: Docker (Recommended)&lt;/h3&gt;&#xA;&lt;h4 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Docker and Docker Compose installed on your system&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;quick-start-with-docker&#34;&gt;Quick Start with Docker&lt;/h4&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Clone the repository:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/Lforlinux/diffctl.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#5918bb;font-weight:bold&#34;&gt;cd&lt;/span&gt; diffctl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;Build and run with Docker Compose:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker-compose up --build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;Open your browser and navigate to &lt;code&gt;http://localhost:3000&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;option-2-local-development&#34;&gt;Option 2: Local Development&lt;/h3&gt;&#xA;&lt;h4 id=&#34;prerequisites-1&#34;&gt;Prerequisites&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Node.js (version 16 or higher)&lt;/li&gt;&#xA;&lt;li&gt;npm or yarn&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;installation-1&#34;&gt;Installation&lt;/h4&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Clone the repository:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/Lforlinux/diffctl.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#5918bb;font-weight:bold&#34;&gt;cd&lt;/span&gt; diffctl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;Install dependencies:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;Start the development server:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm run dev&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;Open your browser and navigate to &lt;code&gt;http://localhost:5173&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;&#xA;&lt;h3 id=&#34;text-comparison&#34;&gt;Text Comparison&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Enter your original text in the left textarea&lt;/li&gt;&#xA;&lt;li&gt;Enter your modified text in the right textarea&lt;/li&gt;&#xA;&lt;li&gt;The tool will automatically detect it as text mode&lt;/li&gt;&#xA;&lt;li&gt;Click &amp;ldquo;Compare&amp;rdquo; to see the differences&lt;/li&gt;&#xA;&lt;li&gt;Switch between &amp;ldquo;Unified View&amp;rdquo; and &amp;ldquo;Side-by-Side View&amp;rdquo;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;json-comparison&#34;&gt;JSON Comparison&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Enter your original JSON in the left textarea&lt;/li&gt;&#xA;&lt;li&gt;Enter your modified JSON in the right textarea&lt;/li&gt;&#xA;&lt;li&gt;The tool will automatically detect it as JSON mode&lt;/li&gt;&#xA;&lt;li&gt;Click &amp;ldquo;Compare&amp;rdquo; to see structured property differences&lt;/li&gt;&#xA;&lt;li&gt;View added, removed, and modified properties&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;theme-toggle&#34;&gt;Theme Toggle&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Click the theme toggle button in the top-right corner&lt;/li&gt;&#xA;&lt;li&gt;Your preference is saved and will persist across sessions&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;tech-stack&#34;&gt;Tech Stack&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;React 18&lt;/strong&gt;: Modern React with hooks&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Vite&lt;/strong&gt;: Fast build tool and dev server&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tailwind CSS&lt;/strong&gt;: Utility-first CSS framework&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Custom Diff Logic&lt;/strong&gt;: Proprietary text and JSON comparison algorithms&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;features-in-detail&#34;&gt;Features in Detail&lt;/h2&gt;&#xA;&lt;h3 id=&#34;intelligent-mode-detection&#34;&gt;Intelligent Mode Detection&lt;/h3&gt;&#xA;&lt;p&gt;The tool automatically analyzes both inputs to determine if they contain:&lt;/p&gt;</description>
    </item>
    <item>
      <title>HaaS: Homelab as a Service - Private Cloud Infrastructure</title>
      <link>https://l4linux.com/portfolio/haas-homelab-as-a-service/</link>
      <pubDate>Fri, 03 Jan 2025 23:00:00 +0000</pubDate>
      <guid>https://l4linux.com/portfolio/haas-homelab-as-a-service/</guid>
      <description>&lt;h2 id=&#34;what-is-the-significance-of-this&#34;&gt;What is the significance of this?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Private Cloud&lt;/strong&gt;: Complete control over your data and infrastructure&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Cost Savings&lt;/strong&gt;: Eliminates multiple SaaS subscriptions ($50-200/month)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Data Sovereignty&lt;/strong&gt;: No dependency on third-party cloud services&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Learning Platform&lt;/strong&gt;: Hands-on experience with enterprise technologies&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: Start small and grow with your needs&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt;: Enhanced privacy and control over sensitive data&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;how-is-automation-accomplished&#34;&gt;How is automation accomplished?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Docker Orchestration&lt;/strong&gt;: Containerized applications with automated lifecycle management&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Portainer Management&lt;/strong&gt;: Web-based container orchestration and monitoring&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;SSH Automation&lt;/strong&gt;: Terminal-based configuration and maintenance&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tailscale VPN&lt;/strong&gt;: Zero-config secure remote access&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Synology DSM&lt;/strong&gt;: Built-in package management and system administration&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Backup Automation&lt;/strong&gt;: Scheduled data protection and disaster recovery&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Synology NAS (DS923+ or compatible)&lt;/li&gt;&#xA;&lt;li&gt;Docker and Portainer installed&lt;/li&gt;&#xA;&lt;li&gt;Tailscale VPN account&lt;/li&gt;&#xA;&lt;li&gt;Basic understanding of containerization&lt;/li&gt;&#xA;&lt;li&gt;Network infrastructure (router, switches)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;source-code&#34;&gt;Source Code&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://github.com/portainer/portainer&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;how-to-deploy-the-infrastructure&#34;&gt;How to deploy the infrastructure&lt;/h2&gt;&#xA;&lt;h3 id=&#34;synology-nas-setup&#34;&gt;Synology NAS Setup&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Hardware Configuration&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>RAG-Powered Local LLM Assistant</title>
      <link>https://l4linux.com/portfolio/opensource-llm-rag-stack/</link>
      <pubDate>Fri, 03 Jan 2025 23:00:00 +0000</pubDate>
      <guid>https://l4linux.com/portfolio/opensource-llm-rag-stack/</guid>
      <description>&lt;h2 id=&#34;what-makes-this-special&#34;&gt;What makes this special?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Complete Privacy&lt;/strong&gt;: Your AI assistant runs entirely on your local infrastructure - no data leaves your network&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Persistent Memory&lt;/strong&gt;: Chroma vector database remembers everything you teach it, creating a truly personalized AI&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Local LLM Power&lt;/strong&gt;: Ollama runs powerful language models locally, no internet required for AI responses&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Your Data, Your Control&lt;/strong&gt;: All documents, conversations, and embeddings stored securely on your own storage&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Zero Subscription Costs&lt;/strong&gt;: Open-source stack with no ongoing fees or usage limits&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Self-Hosted Excellence&lt;/strong&gt;: Full control over your AI assistant&amp;rsquo;s capabilities and data retention&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;how-does-it-work&#34;&gt;How does it work?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Smart Document Processing&lt;/strong&gt;: Upload your documents and Chroma automatically creates searchable knowledge&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Intelligent Memory&lt;/strong&gt;: Your AI remembers past conversations and can reference your uploaded documents&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Local Processing&lt;/strong&gt;: Everything runs on your hardware - documents, conversations, and AI responses stay private&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Easy Setup&lt;/strong&gt;: One-command deployment with Docker Compose for hassle-free installation&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Model Flexibility&lt;/strong&gt;: Choose from various open-source LLM models that run entirely offline&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Real-time Monitoring&lt;/strong&gt;: Track your AI&amp;rsquo;s performance and resource usage with built-in dashboards&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;what-you-need&#34;&gt;What you need&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Docker &amp;amp; Docker Compose installed&lt;/li&gt;&#xA;&lt;li&gt;8GB+ RAM (for running AI models locally)&lt;/li&gt;&#xA;&lt;li&gt;Basic familiarity with Docker commands&lt;/li&gt;&#xA;&lt;li&gt;Your own documents to create a personalized AI knowledge base&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;source-code&#34;&gt;Source Code&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://github.com/Lforlinux/Opensource-LLM-RAG-Stack&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;how-to-deploy-the-infrastructure&#34;&gt;How to deploy the infrastructure&lt;/h2&gt;&#xA;&lt;h3 id=&#34;quick-start-deployment&#34;&gt;Quick Start Deployment&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0080ff;font-style:italic&#34;&gt;# Clone the repository&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/Lforlinux/Opensource-LLM-RAG-Stack.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#5918bb;font-weight:bold&#34;&gt;cd&lt;/span&gt; Opensource-LLM-RAG-Stack&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0080ff;font-style:italic&#34;&gt;# Quick start (includes model setup)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./start.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0080ff;font-style:italic&#34;&gt;# Or manual setup:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0080ff;font-style:italic&#34;&gt;# Start all services (includes Ollama)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker-compose up -d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0080ff;font-style:italic&#34;&gt;# Set up Ollama with a model&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./scripts/setup-ollama.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;docker-compose-architecture&#34;&gt;Docker Compose Architecture&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;28&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;29&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;30&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;31&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;32&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;version&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0c6&#34;&gt;&amp;#34;3.8&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;services&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;ollama&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;ollama/ollama:latest&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;ports&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#0c6&#34;&gt;&amp;#34;11434:11434&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;volumes&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- ollama-data:/root/.ollama&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;environment&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- OLLAMA_HOST=0.0.0.0&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- OLLAMA_ORIGINS=*&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;open-webui&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;ghcr.io/open-webui/open-webui:main&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;ports&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#0c6&#34;&gt;&amp;#34;3000:8080&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;environment&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- OLLAMA_API_BASE_URL=http://ollama:11434&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- VECTOR_DB=chroma&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- DATABASE_URL=postgresql://user:password@postgres:5432/chatdb&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;chroma&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;ghcr.io/chroma-core/chroma:latest&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;ports&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#0c6&#34;&gt;&amp;#34;8000:8000&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;environment&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- CHROMA_DB_IMPL=duckdb+parquet&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;postgres&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;postgres:15-alpine&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;environment&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;POSTGRES_USER&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;user&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;POSTGRES_PASSWORD&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;password&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;POSTGRES_DB&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;chatdb&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Lforlinux/Opensource-LLM-RAG-Stack/main/scripts/RAG-LLM-stack.png&#34; alt=&#34;RAG LLM Stack Architecture&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Self-Hosted Finance: Taking Control of Your Money with Actual Budget</title>
      <link>https://l4linux.com/portfolio/self-hosted-finance/</link>
      <pubDate>Fri, 03 Jan 2025 23:00:00 +0000</pubDate>
      <guid>https://l4linux.com/portfolio/self-hosted-finance/</guid>
      <description>&lt;h2 id=&#34;what-is-the-significance-of-this&#34;&gt;What is the significance of this?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Financial Independence&lt;/strong&gt;: Complete control over personal finance data with zero subscription costs&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Data Sovereignty&lt;/strong&gt;: Personal financial information never leaves your infrastructure&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Cost Savings&lt;/strong&gt;: Eliminates $179.88/year YNAB subscription, saving nearly $1,800 over 10 years&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Privacy &amp;amp; Security&lt;/strong&gt;: No third-party access to sensitive financial data&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Customization&lt;/strong&gt;: Unlimited flexibility in budgeting methodology and reporting&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;how-is-automation-accomplished&#34;&gt;How is automation accomplished?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Docker Containerization&lt;/strong&gt;: Actual Budget server running in Docker with automated restarts&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Portainer Management&lt;/strong&gt;: Web-based container orchestration and monitoring&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Automated Backups&lt;/strong&gt;: Scheduled database backups with version control&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;VPN Integration&lt;/strong&gt;: Secure remote access via Tailscale for mobile budget management&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bank Sync&lt;/strong&gt;: Automatic transaction import (country-specific features)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal Tracking&lt;/strong&gt;: Automated progress monitoring for financial objectives&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Synology NAS (DS923+ or compatible)&lt;/li&gt;&#xA;&lt;li&gt;Docker and Portainer installed&lt;/li&gt;&#xA;&lt;li&gt;Tailscale VPN for secure remote access&lt;/li&gt;&#xA;&lt;li&gt;Basic understanding of Docker containers&lt;/li&gt;&#xA;&lt;li&gt;Budget data for migration (optional)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;source-code&#34;&gt;Source Code&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://github.com/actualbudget/actual&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;how-to-deploy-the-infrastructure&#34;&gt;How to deploy the infrastructure&lt;/h2&gt;&#xA;&lt;h3 id=&#34;docker-compose-setup&#34;&gt;Docker Compose Setup&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;version&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0c6&#34;&gt;&amp;#34;3.8&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;services&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;actual&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;actualbudget/actual-server:latest&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;container_name&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;actual-budget&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;restart&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;always&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;ports&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#0c6&#34;&gt;&amp;#34;5006:5006&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;environment&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- NODE_ENV=production&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;volumes&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- /volume1/docker-config/actual-budget:/data&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;networks&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- actual-network&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;networks&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;actual-network&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;driver&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;bridge&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;deployment-steps&#34;&gt;Deployment Steps&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Create Directory Structure&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p /volume1/docker-config/actual-budget&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;&lt;strong&gt;Deploy with Portainer&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Import the Docker Compose stack&lt;/li&gt;&#xA;&lt;li&gt;Configure volume mounts for data persistence&lt;/li&gt;&#xA;&lt;li&gt;Set up network connectivity&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;&lt;strong&gt;Access the Application&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Navigate to &lt;code&gt;http://your-nas-ip:5006&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Create your first budget&lt;/li&gt;&#xA;&lt;li&gt;Import existing financial data&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;&#xA;&lt;h3 id=&#34;core-components&#34;&gt;Core Components&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Actual Budget Server&lt;/strong&gt;: Node.js application serving budget data&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;SQLite Database&lt;/strong&gt;: Local data storage with backup capabilities&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Docker Container&lt;/strong&gt;: Isolated runtime environment&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Portainer&lt;/strong&gt;: Container management and monitoring&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tailscale&lt;/strong&gt;: Secure VPN for remote access&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;data-flow&#34;&gt;Data Flow&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Transaction Entry&lt;/strong&gt;: Manual entry or bank sync&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Budget Allocation&lt;/strong&gt;: Assign dollars to categories&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Real-time Updates&lt;/strong&gt;: Instant sync across devices&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Reporting&lt;/strong&gt;: Generate financial insights and trends&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;key-features&#34;&gt;Key Features&lt;/h2&gt;&#xA;&lt;h3 id=&#34;budget-management&#34;&gt;Budget Management&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Envelope Budgeting&lt;/strong&gt;: YNAB-compatible methodology&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category Management&lt;/strong&gt;: Custom spending categories&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal Setting&lt;/strong&gt;: Track progress toward financial objectives&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Account Reconciliation&lt;/strong&gt;: Keep bank accounts in sync&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;advanced-features&#34;&gt;Advanced Features&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Dashboard Customization&lt;/strong&gt;: Import/export JSON configurations&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Mobile Support&lt;/strong&gt;: Responsive web interface&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Offline Capability&lt;/strong&gt;: Works without internet connection&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Data Export&lt;/strong&gt;: Full data portability&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;financial-impact&#34;&gt;Financial Impact&lt;/h2&gt;&#xA;&lt;h3 id=&#34;cost-comparison&#34;&gt;Cost Comparison&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Period&lt;/th&gt;&#xA;          &lt;th&gt;YNAB Cost&lt;/th&gt;&#xA;          &lt;th&gt;Actual Budget&lt;/th&gt;&#xA;          &lt;th&gt;Savings&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Monthly&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;$14.99&lt;/td&gt;&#xA;          &lt;td&gt;$0&lt;/td&gt;&#xA;          &lt;td&gt;$14.99&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Yearly&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;$179.88&lt;/td&gt;&#xA;          &lt;td&gt;$0&lt;/td&gt;&#xA;          &lt;td&gt;$179.88&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;5 Years&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;$899.40&lt;/td&gt;&#xA;          &lt;td&gt;$0&lt;/td&gt;&#xA;          &lt;td&gt;$899.40&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;10 Years&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;$1,798.80&lt;/td&gt;&#xA;          &lt;td&gt;$0&lt;/td&gt;&#xA;          &lt;td&gt;$1,798.80&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;additional-benefits&#34;&gt;Additional Benefits&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Data Ownership&lt;/strong&gt;: Complete control over financial data&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Privacy&lt;/strong&gt;: No third-party access to sensitive information&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Customization&lt;/strong&gt;: Unlimited flexibility in budgeting approach&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Learning&lt;/strong&gt;: Valuable technical skills in homelab management&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;security--privacy&#34;&gt;Security &amp;amp; Privacy&lt;/h2&gt;&#xA;&lt;h3 id=&#34;data-protection&#34;&gt;Data Protection&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Local Storage&lt;/strong&gt;: All data remains on your infrastructure&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Encrypted Backups&lt;/strong&gt;: Secure backup strategies&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;VPN Access&lt;/strong&gt;: Tailscale for secure remote connections&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;No Cloud Dependencies&lt;/strong&gt;: Complete data sovereignty&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;best-practices&#34;&gt;Best Practices&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Regular Updates&lt;/strong&gt;: Keep containers current for security&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Backup Strategy&lt;/strong&gt;: Automated, encrypted backups&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Access Control&lt;/strong&gt;: Secure authentication and authorization&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Network Security&lt;/strong&gt;: Isolated container networking&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;monitoring--maintenance&#34;&gt;Monitoring &amp;amp; Maintenance&lt;/h2&gt;&#xA;&lt;h3 id=&#34;health-checks&#34;&gt;Health Checks&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Container Status&lt;/strong&gt;: Monitor via Portainer dashboard&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Database Integrity&lt;/strong&gt;: Regular backup verification&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Performance Metrics&lt;/strong&gt;: Resource usage monitoring&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Log Analysis&lt;/strong&gt;: Troubleshooting and optimization&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;backup-strategy&#34;&gt;Backup Strategy&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0080ff;font-style:italic&#34;&gt;# Automated backup script&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0080ff;font-style:italic&#34;&gt;#!/bin/bash&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DATE&lt;span style=&#34;color:#2c5dcd&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;$(&lt;/span&gt;date +%Y%m%d_%H%M%S&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp /volume1/docker-config/actual-budget/actual.db /volume1/backups/actual_$DATE.db&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;troubleshooting&#34;&gt;Troubleshooting&lt;/h2&gt;&#xA;&lt;h3 id=&#34;common-issues&#34;&gt;Common Issues&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Database Corruption&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Self-Hosted Music Streaming: High-Fidelity Audio with Complete Control</title>
      <link>https://l4linux.com/portfolio/self-hosted-music-streaming/</link>
      <pubDate>Fri, 03 Jan 2025 23:00:00 +0000</pubDate>
      <guid>https://l4linux.com/portfolio/self-hosted-music-streaming/</guid>
      <description>&lt;h2 id=&#34;what-is-the-significance-of-this&#34;&gt;What is the significance of this?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Audio Quality&lt;/strong&gt;: Lossless FLAC streaming vs compressed MP3 from commercial services&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Data Ownership&lt;/strong&gt;: Complete control over your music library and metadata&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Cost Savings&lt;/strong&gt;: Eliminates monthly streaming subscriptions ($10-15/month)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Privacy&lt;/strong&gt;: No tracking or data collection by streaming companies&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Customization&lt;/strong&gt;: Unlimited library size and organization&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Offline Access&lt;/strong&gt;: Full library available without internet connection&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;how-is-automation-accomplished&#34;&gt;How is automation accomplished?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Docker Orchestration&lt;/strong&gt;: Plex Media Server with automated container management&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;YouTube Integration&lt;/strong&gt;: Automated music downloading via YouTubeDL-Material&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Metadata Management&lt;/strong&gt;: MongoDB for subscription and media metadata&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Mobile Sync&lt;/strong&gt;: Plexamp app with offline download capabilities&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;VPN Access&lt;/strong&gt;: Secure remote streaming via Tailscale&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Automated Organization&lt;/strong&gt;: Smart library management and metadata matching&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Synology NAS (DS923+ or compatible)&lt;/li&gt;&#xA;&lt;li&gt;Docker and Portainer installed&lt;/li&gt;&#xA;&lt;li&gt;Tailscale VPN for secure remote access&lt;/li&gt;&#xA;&lt;li&gt;FLAC music library (optional)&lt;/li&gt;&#xA;&lt;li&gt;Basic understanding of media server concepts&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;source-code&#34;&gt;Source Code&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://github.com/plexinc/plex-media-server&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;how-to-deploy-the-infrastructure&#34;&gt;How to deploy the infrastructure&lt;/h2&gt;&#xA;&lt;h3 id=&#34;docker-compose-setup&#34;&gt;Docker Compose Setup&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;28&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;29&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;30&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;31&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;32&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;33&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;34&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;35&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;36&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;37&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;38&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;39&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;40&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;41&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;42&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;43&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;44&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;45&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;46&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;47&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;version&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0c6&#34;&gt;&amp;#34;3.8&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;services&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;plex&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;container_name&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;plex&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;lscr.io/linuxserver/plex:latest&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;devices&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- /dev/dri:/dev/dri&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;privileged&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;network_mode&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;host&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;environment&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- PUID=1026&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- PGID=100&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- VERSION=docker&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;restart&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;unless-stopped&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;volumes&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- /volume1/docker-config/plex:/config:rw&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- /volume1/Movies:/Movies:rw&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- /volume1/Music:/Music:rw&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;ytdl_material&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;tzahi12345/youtubedl-material:latest&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;container_name&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;ytdl_material&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;restart&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;always&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;depends_on&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- ytdl-mongo-db&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;ports&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#0c6&#34;&gt;&amp;#34;8998:17442&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;environment&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;ytdl_mongodb_connection_string&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0c6&#34;&gt;&amp;#39;mongodb://ytdl-mongo-db:27017&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;ytdl_use_local_db&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0c6&#34;&gt;&amp;#39;false&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;write_ytdl_config&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0c6&#34;&gt;&amp;#39;true&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;volumes&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- /volume1/docker-config/ytdl/appdata:/app/appdata&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- /volume1/Music/:/app/audio &lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- /volume1/docker-config/ytdl/video:/app/video&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- /volume1/docker-config/ytdl/subscriptions:/app/subscriptions&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- /volume1/docker-config/ytdl/users:/app/users&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;ytdl-mongo-db&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;mongo:4&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;container_name&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;mongo-db&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;restart&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;always&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;logging&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;driver&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0c6&#34;&gt;&amp;#34;none&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#2c5dcd;font-weight:bold&#34;&gt;volumes&lt;/span&gt;:&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cbcbcb&#34;&gt;      &lt;/span&gt;- /volume1/docker-config/ytdl/db:/data/db&lt;span style=&#34;color:#cbcbcb&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;deployment-steps&#34;&gt;Deployment Steps&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Create Directory Structure&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p /volume1/docker-config/plex&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p /volume1/docker-config/ytdl/&lt;span style=&#34;color:#2c5dcd&#34;&gt;{&lt;/span&gt;appdata,video,subscriptions,users,db&lt;span style=&#34;color:#2c5dcd&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p /volume1/Music&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;&lt;strong&gt;Deploy with Portainer&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Import the Docker Compose stack&lt;/li&gt;&#xA;&lt;li&gt;Configure volume mounts for media and configuration&lt;/li&gt;&#xA;&lt;li&gt;Set up network connectivity&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;&lt;strong&gt;Configure Plex&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Access Plex web interface&lt;/li&gt;&#xA;&lt;li&gt;Set up media libraries&lt;/li&gt;&#xA;&lt;li&gt;Configure remote access via Tailscale&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;&#xA;&lt;h3 id=&#34;core-components&#34;&gt;Core Components&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Plex Media Server&lt;/strong&gt;: Central media hub for music and video&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;YouTubeDL-Material&lt;/strong&gt;: Automated music downloading from YouTube&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;MongoDB&lt;/strong&gt;: Database for managing subscriptions and metadata&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Portainer&lt;/strong&gt;: Container orchestration and management&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tailscale&lt;/strong&gt;: Secure VPN for remote access&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;audio-quality-comparison&#34;&gt;Audio Quality Comparison&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Format&lt;/th&gt;&#xA;          &lt;th&gt;Bitrate&lt;/th&gt;&#xA;          &lt;th&gt;Type&lt;/th&gt;&#xA;          &lt;th&gt;Quality&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;MP3 (High)&lt;/td&gt;&#xA;          &lt;td&gt;~320 kbps&lt;/td&gt;&#xA;          &lt;td&gt;Lossy&lt;/td&gt;&#xA;          &lt;td&gt;Good for casual listening&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;CD Audio&lt;/td&gt;&#xA;          &lt;td&gt;~1,411 kbps&lt;/td&gt;&#xA;          &lt;td&gt;Uncompressed&lt;/td&gt;&#xA;          &lt;td&gt;Full resolution&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;FLAC&lt;/td&gt;&#xA;          &lt;td&gt;700–3,500 kbps&lt;/td&gt;&#xA;          &lt;td&gt;Lossless&lt;/td&gt;&#xA;          &lt;td&gt;No quality loss&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Hi-Res Audio&lt;/td&gt;&#xA;          &lt;td&gt;~9,216 kbps&lt;/td&gt;&#xA;          &lt;td&gt;Lossless (24-bit)&lt;/td&gt;&#xA;          &lt;td&gt;Studio quality&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;key-features&#34;&gt;Key Features&lt;/h2&gt;&#xA;&lt;h3 id=&#34;music-management&#34;&gt;Music Management&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Lossless Audio&lt;/strong&gt;: FLAC support for audiophile-quality streaming&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Metadata Matching&lt;/strong&gt;: Automatic artist, album, and track information&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Library Organization&lt;/strong&gt;: Smart categorization and search&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Offline Sync&lt;/strong&gt;: Download music for offline listening&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;advanced-features&#34;&gt;Advanced Features&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Gapless Playback&lt;/strong&gt;: Seamless album listening experience&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Loudness Leveling&lt;/strong&gt;: Consistent volume across tracks&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Crossfade&lt;/strong&gt;: Smooth transitions between songs&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Mobile Apps&lt;/strong&gt;: Plexamp for iOS and Android&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;audio-setup&#34;&gt;Audio Setup&lt;/h2&gt;&#xA;&lt;h3 id=&#34;budget-audiophile-configuration&#34;&gt;Budget Audiophile Configuration&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;In-Ear Monitors&lt;/strong&gt;: KZ EDX Pro ($10) for neutral tuning&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Lossless Streaming&lt;/strong&gt;: FLAC files from your own server&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;No Digital Processing&lt;/strong&gt;: Clean analog sound path&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Passive Noise Isolation&lt;/strong&gt;: Immersive listening experience&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;quality-benefits&#34;&gt;Quality Benefits&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Instrument Separation&lt;/strong&gt;: Clear distinction between instruments&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Dynamic Range&lt;/strong&gt;: Full frequency response&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;No Compression Artifacts&lt;/strong&gt;: Pure audio reproduction&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Artist Intent&lt;/strong&gt;: Music as recorded in studio&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;media-sourcing&#34;&gt;Media Sourcing&lt;/h2&gt;&#xA;&lt;h3 id=&#34;legal-flac-sources&#34;&gt;Legal FLAC Sources&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Qobuz&lt;/strong&gt;: High-resolution music downloads&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bandcamp&lt;/strong&gt;: Direct artist support&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;HDtracks&lt;/strong&gt;: Audiophile-quality downloads&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Community Forums&lt;/strong&gt;: Legal sharing recommendations&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;collection-building&#34;&gt;Collection Building&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Album Purchases&lt;/strong&gt;: Support artists directly&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Lossless Rips&lt;/strong&gt;: Convert existing CDs to FLAC&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Community Sharing&lt;/strong&gt;: Legal FLAC collections&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;YouTube Integration&lt;/strong&gt;: Download and convert to FLAC&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;mobile-experience&#34;&gt;Mobile Experience&lt;/h2&gt;&#xA;&lt;h3 id=&#34;plexamp-features&#34;&gt;Plexamp Features&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Offline Downloads&lt;/strong&gt;: Full library available offline&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Smart Playlists&lt;/strong&gt;: AI-powered music discovery&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Car Mode&lt;/strong&gt;: Optimized for driving&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Sleep Timer&lt;/strong&gt;: Automatic playback control&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Crossfade&lt;/strong&gt;: Smooth transitions&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;remote-access&#34;&gt;Remote Access&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tailscale VPN&lt;/strong&gt;: Secure connection from anywhere&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Mobile Sync&lt;/strong&gt;: Download music for offline use&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bandwidth Optimization&lt;/strong&gt;: Adaptive quality streaming&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Multi-Device&lt;/strong&gt;: Sync across all devices&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;cost-analysis&#34;&gt;Cost Analysis&lt;/h2&gt;&#xA;&lt;h3 id=&#34;streaming-service-comparison&#34;&gt;Streaming Service Comparison&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Service&lt;/th&gt;&#xA;          &lt;th&gt;Monthly Cost&lt;/th&gt;&#xA;          &lt;th&gt;Audio Quality&lt;/th&gt;&#xA;          &lt;th&gt;Library Size&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Spotify Premium&lt;/td&gt;&#xA;          &lt;td&gt;$10.99&lt;/td&gt;&#xA;          &lt;td&gt;320 kbps MP3&lt;/td&gt;&#xA;          &lt;td&gt;Unlimited&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Apple Music&lt;/td&gt;&#xA;          &lt;td&gt;$10.99&lt;/td&gt;&#xA;          &lt;td&gt;Lossless&lt;/td&gt;&#xA;          &lt;td&gt;100M+ songs&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Tidal HiFi&lt;/td&gt;&#xA;          &lt;td&gt;$19.99&lt;/td&gt;&#xA;          &lt;td&gt;Lossless&lt;/td&gt;&#xA;          &lt;td&gt;100M+ songs&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Self-Hosted&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;$0&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;FLAC Lossless&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Unlimited&lt;/strong&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;long-term-savings&#34;&gt;Long-term Savings&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Annual Savings&lt;/strong&gt;: $131.88 (Spotify) to $239.88 (Tidal)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;10-Year Savings&lt;/strong&gt;: $1,318.80 to $2,398.80&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;No Subscription Fatigue&lt;/strong&gt;: One-time setup cost&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Data Ownership&lt;/strong&gt;: Priceless privacy and control&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;security--privacy&#34;&gt;Security &amp;amp; Privacy&lt;/h2&gt;&#xA;&lt;h3 id=&#34;data-protection&#34;&gt;Data Protection&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Local Storage&lt;/strong&gt;: All media remains on your infrastructure&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;No Tracking&lt;/strong&gt;: No data collection or analytics&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;VPN Access&lt;/strong&gt;: Secure remote connections only&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;User Control&lt;/strong&gt;: Complete privacy over listening habits&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;best-practices&#34;&gt;Best Practices&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Regular Updates&lt;/strong&gt;: Keep containers current&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Backup Strategy&lt;/strong&gt;: Protect your music library&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Access Control&lt;/strong&gt;: Secure authentication&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Network Isolation&lt;/strong&gt;: Container network security&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;troubleshooting&#34;&gt;Troubleshooting&lt;/h2&gt;&#xA;&lt;h3 id=&#34;common-issues&#34;&gt;Common Issues&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Audio Quality Problems&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>subnetctl</title>
      <link>https://l4linux.com/bin/subnetctl/</link>
      <pubDate>Fri, 03 Jan 2025 23:00:00 +0000</pubDate>
      <guid>https://l4linux.com/bin/subnetctl/</guid>
      <description>&lt;h1 id=&#34;subnetctl&#34;&gt;subnetctl&lt;/h1&gt;&#xA;&lt;p&gt;A web-based utility for managing and analyzing network subnets with advanced CIDR operations, designed for DevOps engineers and network administrators.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-subnetctl&#34;&gt;What is subnetctl?&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;subnetctl&lt;/strong&gt; is a web-based tool that simplifies network subnet management, CIDR calculations, and network analysis. It&amp;rsquo;s particularly useful for cloud infrastructure management, IP address planning, and network troubleshooting.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-features&#34;&gt;Key Features&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;CIDR Operations&lt;/strong&gt;: Calculate subnets, supernets, and network boundaries&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;IP Address Management&lt;/strong&gt;: Validate, convert, and analyze IP addresses&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Network Planning&lt;/strong&gt;: Plan and optimize network allocations&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Cloud Integration&lt;/strong&gt;: Generate Terraform and CloudFormation network configurations&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Visualization&lt;/strong&gt;: Generate network diagrams and subnet maps&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Modern Web Interface&lt;/strong&gt;: Clean, responsive UI with real-time calculations&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;&#xA;&lt;h3 id=&#34;option-1-docker-recommended&#34;&gt;Option 1: Docker (Recommended)&lt;/h3&gt;&#xA;&lt;h4 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Docker and Docker Compose installed on your system&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;quick-start-with-docker&#34;&gt;Quick Start with Docker&lt;/h4&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Clone the repository:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/Lforlinux/subnetctl.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#5918bb;font-weight:bold&#34;&gt;cd&lt;/span&gt; subnetctl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;Build and run with Docker Compose:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker-compose up --build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;Open your browser and navigate to &lt;code&gt;http://localhost:3000&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;option-2-local-development&#34;&gt;Option 2: Local Development&lt;/h3&gt;&#xA;&lt;h4 id=&#34;prerequisites-1&#34;&gt;Prerequisites&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Node.js (version 16 or higher)&lt;/li&gt;&#xA;&lt;li&gt;npm or yarn&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;installation-1&#34;&gt;Installation&lt;/h4&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Clone the repository:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://github.com/Lforlinux/subnetctl.git&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#5918bb;font-weight:bold&#34;&gt;cd&lt;/span&gt; subnetctl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;Install dependencies:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;Start the development server:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm run dev&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;Open your browser and navigate to &lt;code&gt;http://localhost:5173&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;&#xA;&lt;h3 id=&#34;basic-operations&#34;&gt;Basic Operations&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Enter CIDR notation (e.g., 192.168.1.0/24) in the input field&lt;/li&gt;&#xA;&lt;li&gt;View subnet information including network, broadcast, and host count&lt;/li&gt;&#xA;&lt;li&gt;Calculate subnet boundaries and available IP ranges&lt;/li&gt;&#xA;&lt;li&gt;Generate network visualizations and diagrams&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;advanced-features&#34;&gt;Advanced Features&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Network Planning&lt;/strong&gt;: Plan complete network infrastructures with multiple subnets&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Overlap Detection&lt;/strong&gt;: Identify and resolve network conflicts&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Cloud Integration&lt;/strong&gt;: Generate Terraform and CloudFormation configurations&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bulk Analysis&lt;/strong&gt;: Process multiple CIDR blocks simultaneously&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;use-cases&#34;&gt;Use Cases&lt;/h2&gt;&#xA;&lt;h3 id=&#34;cloud-infrastructure&#34;&gt;Cloud Infrastructure&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Plan AWS VPC subnets and CIDR blocks&lt;/li&gt;&#xA;&lt;li&gt;Generate Terraform network configurations&lt;/li&gt;&#xA;&lt;li&gt;Validate network designs before deployment&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;network-troubleshooting&#34;&gt;Network Troubleshooting&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Identify IP address conflicts&lt;/li&gt;&#xA;&lt;li&gt;Analyze network overlaps&lt;/li&gt;&#xA;&lt;li&gt;Validate routing configurations&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;ip-address-management&#34;&gt;IP Address Management&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Track IP address allocations&lt;/li&gt;&#xA;&lt;li&gt;Plan network expansions&lt;/li&gt;&#xA;&lt;li&gt;Optimize network utilization&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;tech-stack&#34;&gt;Tech Stack&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;React 18&lt;/strong&gt;: Modern React with hooks&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Vite&lt;/strong&gt;: Fast build tool and dev server&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tailwind CSS&lt;/strong&gt;: Utility-first CSS framework&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Custom Network Logic&lt;/strong&gt;: Proprietary CIDR calculation algorithms&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;contributing&#34;&gt;Contributing&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Fork the repository&lt;/li&gt;&#xA;&lt;li&gt;Create a feature branch (&lt;code&gt;git checkout -b feature/amazing-feature&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Commit your changes (&lt;code&gt;git commit -m &#39;Add some amazing feature&#39;&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Push to the branch (&lt;code&gt;git push origin feature/amazing-feature&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Open a Pull Request&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;license&#34;&gt;License&lt;/h2&gt;&#xA;&lt;p&gt;This project is licensed under the MIT License - see the &lt;a href=&#34;https://github.com/Lforlinux/subnetctl/blob/main/LICENSE&#34;&gt;LICENSE&lt;/a&gt; file for details.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Overview of ChatGPT and DevOps use cases</title>
      <link>https://l4linux.com/blog/chatgpt/</link>
      <pubDate>Sat, 10 Dec 2022 01:23:24 +0530</pubDate>
      <guid>https://l4linux.com/blog/chatgpt/</guid>
      <description>&lt;hr&gt;&#xA;&lt;h2 id=&#34;what-is-chatgpt&#34;&gt;What is ChatGPT?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GPT (Generative Pretrained Transformer) is a type of natural language processing (NLP) model developed by OpenAI. It is a large, powerful model that can generate human-like text based on the input it receives.&lt;/li&gt;&#xA;&lt;li&gt;It is optimized for generating responses to user input in a conversational context, and it can be trained on specific domains&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;what-is-the-significane-of-it&#34;&gt;What is the significane of it?&lt;/h2&gt;&#xA;&lt;p&gt; &lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Sam Altman, the CEO and founder of OpenAI, recently announced the official release of the openGPT &lt;a href=&#34;(https://twitter.com/sama/status/1598038815599661056)&#34;&gt;one week earlier&lt;/a&gt;(on November 30).&lt;/li&gt;&#xA;&lt;li&gt;Currently, the service is free. It might be turned to a paid service because, according to &lt;a href=&#34;https://twitter.com/sama/status/1599671496636780546?s=24&#34;&gt;Sam&lt;/a&gt;, the average cost each chat is only a few cents.&lt;/li&gt;&#xA;&lt;li&gt;The number of users has now surpassed 1 million, and it only took 5 days from debut to accomplish &lt;a href=&#34;https://twitter.com/sama/status/1599668808285028353&#34;&gt;this.&lt;/a&gt; Instagram took 2.5 months, Facebook 10 months, and Netflix 48 months.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;is-it-useful-for-me&#34;&gt;Is it useful for me?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Oh, Yeah! No matter whatever field you are on. ChatGPT is genius tool in many ways!&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The results I&amp;rsquo;m seeing from ChatGPT makes me appreciate humans even more, especially those who think critically, and continue to push the boundaries on creative expression.&#xA;ChatGPT feels like the baseline of what we are capable of and sets the bar so we can raise it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Jenkins Pipeline</title>
      <link>https://l4linux.com/blog/declartive-vs-scripted-pipeline/</link>
      <pubDate>Sun, 25 Jul 2021 08:53:27 +0530</pubDate>
      <guid>https://l4linux.com/blog/declartive-vs-scripted-pipeline/</guid>
      <description>&lt;h3 id=&#34;what-is-jenkins-pipeline-&#34;&gt;What is Jenkins Pipeline 🤔&lt;/h3&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Jenkins Pipeline allows us to write the Jenkins build steps in code&lt;/li&gt;&#xA;&lt;li&gt;Pipelines are robust. So if your server undergoes an unpredicted restart, the pipeline will be automatically resumed.&lt;/li&gt;&#xA;&lt;li&gt;Jenkins Pipelines support big projects. You can run many jobs, and even use pipelines in a loop&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;jenkins-pipeline-format&#34;&gt;Jenkins Pipeline format&lt;/h3&gt;&#xA;&lt;p&gt;Jenkins Pipeline can be defined by a text file called JenkinsFile. You can implement pipeline as code using JenkinsFile, and this can be defined by using a DSL (Domain Specific Language).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxy vs Reverse Proxy</title>
      <link>https://l4linux.com/blog/proxy-vs-reverseproxy/</link>
      <pubDate>Sat, 24 Jul 2021 08:53:27 +0530</pubDate>
      <guid>https://l4linux.com/blog/proxy-vs-reverseproxy/</guid>
      <description>&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;In this post we will see what is proxy and reverse proxy.&lt;/li&gt;&#xA;&lt;li&gt;We will also discuss the differnce between them.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;what-is-proxy&#34;&gt;What is proxy?&lt;/h2&gt;&#xA;&lt;p&gt;Proxy is an act where someelse doing something for you on your behalf.&lt;/p&gt;&#xA;&lt;p&gt;Simple explantion of a proxy act in the below image.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/Lforlinux/lforlinux.github.io/master/posts/proxy.png&#34; alt=&#34;N|Solid&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-proxy-server&#34;&gt;What is Proxy server?&lt;/h2&gt;&#xA;&lt;p&gt;It is a server that sits in front of a group of client machines. When those computers make requests to sites and services on the Internet, the proxy server intercepts those requests and then communicates with web servers on behalf of those clients, like a middleman.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bash scripting - set command </title>
      <link>https://l4linux.com/blog/bash-set-e/</link>
      <pubDate>Thu, 22 Jul 2021 08:53:27 +0530</pubDate>
      <guid>https://l4linux.com/blog/bash-set-e/</guid>
      <description>&lt;h2 id=&#34;-bash-scripting---set-command-and-its-usage&#34;&gt;🖥 Bash scripting - set command and its usage&lt;/h2&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;In this post we will see what is set in bash scripting&lt;/li&gt;&#xA;&lt;li&gt;We will also discuss when to use set -e.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;set-command&#34;&gt;Set command&lt;/h2&gt;&#xA;&lt;p&gt;Use the set command to set or unset values of shell options and positional parameters. You can change the value of shell attributes and positional parameters, or display the names and values of shell variables using set command.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Boto3 Resource, Client and Session</title>
      <link>https://l4linux.com/blog/boto3/</link>
      <pubDate>Thu, 15 Jul 2021 01:23:24 +0530</pubDate>
      <guid>https://l4linux.com/blog/boto3/</guid>
      <description>&lt;h2 id=&#34;core-concepts-of-boto3&#34;&gt;Core concepts of Boto3&lt;/h2&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;There are few concepts of boto3 (aws sdk) like Session, Resource, Client, Meta, Collections, Paginators&lt;/li&gt;&#xA;&lt;li&gt;In this post we will discuss about the kehy difference between  Resource, Client and Session&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;session&#34;&gt;Session&lt;/h2&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;A session manages state about a particular configuration. By default, a session is created for you when needed. However, it&amp;rsquo;s possible and recommended that in some scenarios you maintain your own session. Sessions typically store the following:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Jenkins as a Container</title>
      <link>https://l4linux.com/blog/jenkins-as-docker/</link>
      <pubDate>Mon, 28 Dec 2020 01:23:24 +0530</pubDate>
      <guid>https://l4linux.com/blog/jenkins-as-docker/</guid>
      <description>&lt;h2 id=&#34;run-jenkins-as-a-container-with-the-stateful-volume&#34;&gt;&lt;em&gt;Run jenkins as a container with the stateful volume!&lt;/em&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;why-jenkins-as-a-container-&#34;&gt;Why Jenkins as a container 🤔&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;It&amp;rsquo;s helps simplify the installation process.&lt;/li&gt;&#xA;&lt;li&gt;Decrease dependency errors.&lt;/li&gt;&#xA;&lt;li&gt;The Turnaround time for an Jenkins server installation is just few minutes.&lt;/li&gt;&#xA;&lt;li&gt;Cross platform compatible.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;why-do-we-need-a-stateful-volume&#34;&gt;Why do we need a stateful volume!🤨&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Containers are often an ephemeral where in Jeknins we need to save our workloads even if we are not using it regularly. As in we will setting up the users, credentials inside Jenkins so it is important to save this as a stateful volume.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;lets-get-started-&#34;&gt;Let&amp;rsquo;s get started! 🎬&lt;/h3&gt;&#xA;&lt;p&gt;Create the volume for Jenkins on Docker host.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docker-container-howitworks</title>
      <link>https://l4linux.com/blog/docker-cli-container-howitworks/</link>
      <pubDate>Fri, 18 Dec 2020 08:53:27 +0530</pubDate>
      <guid>https://l4linux.com/blog/docker-cli-container-howitworks/</guid>
      <description>&lt;h2 id=&#34;-docker-container-creation---how-it-works&#34;&gt;🐳 Docker container creation - How it works!&lt;/h2&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;In this post we will see what is happening when we run a command # docker container run -it -d nginx&lt;/li&gt;&#xA;&lt;li&gt;We will also discuss some components involved during the container creation process&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;docker-cli-docker-&#34;&gt;Docker CLI (docker) 💻&lt;/h2&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Docker CLI (docker)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4d4d4d;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/usr/bin/docker&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;Docker is used as a reference to the whole set of docker tools and at the beginning, it was a monolith. But now docker-cli is only responsible for user-friendly communication with docker.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubectl alias</title>
      <link>https://l4linux.com/blog/kubectl-alias/</link>
      <pubDate>Thu, 17 Dec 2020 08:53:27 +0530</pubDate>
      <guid>https://l4linux.com/blog/kubectl-alias/</guid>
      <description>&lt;h2 id=&#34;play-with-kubernets-at-ease&#34;&gt;&lt;em&gt;Play with kubernets at ease!&lt;/em&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;alias-whatwhy-&#34;&gt;Alias? What,Why 🤔&lt;/h3&gt;&#xA;&lt;hr&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;An alias is a (usually short) name that the shell translates into another (usually longer) name or command. Aliases allow you to define new commands by substituting a string for the first token of a simple command.&lt;/li&gt;&#xA;&lt;li&gt;It can be used to avoid typing long commands or as a means to correct incorrect input. For common patterns it can reduce keystrokes and improve efficiency. A simple example is setting default options on commands to avoid having to type them each time a command is run&lt;/li&gt;&#xA;&lt;li&gt;✨ Be lazy - use less keys on your keyboard ✨ 😜&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Start your day with a list of things you know you tend to waste time on&#xA;As &lt;em&gt;Alicia Rades&lt;/em&gt; writes on the &lt;a href=&#34;https://www.lifehack.org/author/alicia-j-rades&#34;&gt;lifehack&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>AWS EKS Deployment through terraform</title>
      <link>https://l4linux.com/portfolio/terraform-eks/</link>
      <pubDate>Fri, 19 Jun 2020 23:00:00 +0000</pubDate>
      <guid>https://l4linux.com/portfolio/terraform-eks/</guid>
      <description>&lt;h2 id=&#34;what-is-the-significance-of-this&#34;&gt;What is the significance of this?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Using this repository, you can provision the application as well as all of your cloud infrastructure with a single command.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;how-is-automation-accomplished&#34;&gt;How is automation accomplished?&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Terraform has been used to provision infrastructure on AWS.&lt;/li&gt;&#xA;&lt;li&gt;To make provision for application On the AWS EKS, deployment has been performed through using Helm template.&lt;/li&gt;&#xA;&lt;li&gt;To fit the Kubernetes design, the NodeJS service has been changed to a microservice.&lt;/li&gt;&#xA;&lt;li&gt;Terraform has been converted into a docker container microservice to improve team cooperation by ensuring that everyone uses the same version of the software.&lt;/li&gt;&#xA;&lt;li&gt;This project makes use of Makefile to automate the provisioning of the full stack with a single command.&lt;/li&gt;&#xA;&lt;li&gt;For convenience of usage, the load and performance testing tool locust has been transformed into a docker container.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;prerequisite&#34;&gt;Prerequisite&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;AWS account access&lt;/li&gt;&#xA;&lt;li&gt;AWS iam programmatic user access with the follwing policy attached to the user&lt;/li&gt;&#xA;&lt;li&gt;AmazonEC2FullAccess,IAMFullAccess,AutoScalingFullAccess,AmazonEKSClusterPolicy,     ￼&lt;/li&gt;&#xA;&lt;li&gt;AmazonEKSWorkerNodePolicy,AmazonVPCFullAccess,AmazonEKSServicePolicy,AmazonEKS_CNI_Policy&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;source-code&#34;&gt;Source Code&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://github.com/Lforlinux/aws-terraform-nodejs&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;how-to-provision-the-infra&#34;&gt;How to provision the infra&lt;/h2&gt;&#xA;&lt;p&gt;Makefile has been leveraged for the simple approach towards the one-click entire stack deployment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Jenkins as a container</title>
      <link>https://l4linux.com/portfolio/jenkins-as-a-container/</link>
      <pubDate>Fri, 19 Jun 2020 23:00:00 +0000</pubDate>
      <guid>https://l4linux.com/portfolio/jenkins-as-a-container/</guid>
      <description>&lt;h2 id=&#34;run-jenkins-as-a-container-with-the-stateful-volume&#34;&gt;&lt;em&gt;Run jenkins as a container with the stateful volume!&lt;/em&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;why-jenkins-as-a-container-&#34;&gt;Why Jenkins as a container 🤔&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;It&amp;rsquo;s helps simplify the installation process.&lt;/li&gt;&#xA;&lt;li&gt;Decrease dependency errors.&lt;/li&gt;&#xA;&lt;li&gt;The Turnaround time for an Jenkins server installation is just few minutes.&lt;/li&gt;&#xA;&lt;li&gt;Cross platform compatible.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;why-do-we-need-a-stateful-volume&#34;&gt;Why do we need a stateful volume!🤨&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Containers are often an ephemeral where in Jeknins we need to save our workloads even if we are not using it regularly. As in we will setting up the users, credentials inside Jenkins so it is important to save this as a stateful volume.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;lets-get-started-&#34;&gt;Let&amp;rsquo;s get started! 🎬&lt;/h3&gt;&#xA;&lt;p&gt;Create the volume for Jenkins on Docker host.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
