<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ruben Alvarado</title>
    <description>The latest articles on DEV Community by Ruben Alvarado (@ralvaracode).</description>
    <link>https://dev.to/ralvaracode</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3500185%2Fee0dc951-b768-477e-8de9-886c6eb397b3.jpg</url>
      <title>DEV Community: Ruben Alvarado</title>
      <link>https://dev.to/ralvaracode</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ralvaracode"/>
    <language>en</language>
    <item>
      <title>Start with NvChad</title>
      <dc:creator>Ruben Alvarado</dc:creator>
      <pubDate>Sat, 16 May 2026 19:48:34 +0000</pubDate>
      <link>https://dev.to/ralvaracode/start-with-nvchad-50ee</link>
      <guid>https://dev.to/ralvaracode/start-with-nvchad-50ee</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ralvaracode.hashnode.dev/start-with-nvchad" rel="noopener noreferrer"&gt;Web Warrior Toolbox&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;NvChad is a code editor that is light weight and can be used from terminal screens. It has a system of add-ons (e.g. lazy vim) that lets you add functionalities found in GUI like editors. If you have a server that has only CLI and you want a rich feature editor, use this. NvChad can also be practicall when you have a dev-pc that will run heavy loads while you need to use an editor at same time(serving a heavy app locally while running Figma, youtube someone?). Anyway give it a try so you have another editor that you can use in these scenarios or other that you think it could be worth it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to install (Linux PC)
&lt;/h2&gt;

&lt;p&gt;the process to install has these parts&lt;/p&gt;

&lt;p&gt;Install git. You will need to clone a git repo after that.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;git
git &lt;span class="nt"&gt;--version&lt;/span&gt; // check version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install Neovim. you need version 0.10 or higher&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;neovim
nvim &lt;span class="nt"&gt;--version&lt;/span&gt; // check version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;install nerdfonts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.local/share/fonts
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/.local/share/fonts
wget https://github.com/ryanoasis/nerd-fonts/releases/latest/download/JetBrainsMono.zip
unzip JetBrainsMono.zip
fc-cache &lt;span class="nt"&gt;-fv&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ Then set the font in your terminal emulator.&lt;/p&gt;

&lt;p&gt;Clone the NvChad repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/NvChad/starter ~/.config/nvim
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;start nvchad&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvim
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;now when you access NvChad you can look at the file tree using space e to open it. Here some more commands to use with the tree&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tab // &lt;span class="nb"&gt;expand&lt;/span&gt;/collapse a folder
E // &lt;span class="nb"&gt;expand &lt;/span&gt;folder and subfolder
CC // collapse folder and subfolders
H // show/hide hidden folders
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and to move between panel use these commands&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ctrl+w // window mode
ctrl+&amp;lt;direction_key&amp;gt; // use hjkl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To open and close terminal window use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;alt + h // toggles horizontal terminal.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tab &amp;gt; Window &amp;gt; Buffer
&lt;/h2&gt;

&lt;p&gt;nvchad has these 3 elements to organize what is shown on screen&lt;/p&gt;

&lt;p&gt;A buffer is a file loaded in memory. when you press enter on a file in file tree you open a buffer. Remember these commands.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;in &lt;/span&gt;normal mode
:bd // close buffer &lt;span class="o"&gt;(&lt;/span&gt;buffer delete&lt;span class="o"&gt;)&lt;/span&gt;
:ls // get a list of buffers and its numbers
:b &amp;lt;N&amp;gt; // opens buffer with number N &lt;span class="o"&gt;(&lt;/span&gt;space can be ommited&lt;span class="o"&gt;)&lt;/span&gt;
tab // go to next buffer
shifht+tab // previous buffer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Windows and Tabs
&lt;/h2&gt;

&lt;p&gt;A windows is an element that shows 1 buffer. use :q to close a window (you will also close the buffer it contains). Use :qa to close all windows (this closes nvchad)&lt;/p&gt;

&lt;p&gt;A tab is an element that shows multiple windows. Here are some commands to manage them&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;:tabnew // create tab
:split // &lt;span class="nb"&gt;split &lt;/span&gt;with horizontal window
:vsplit // vertical &lt;span class="nb"&gt;split&lt;/span&gt;
:tabs // lists all tabs and windows
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Be patient and keep practicing to develop your skills and muscle memory 💪🥘&lt;/p&gt;

</description>
      <category>neovim</category>
      <category>coding</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Flexible Git Workflow - We Actually Use</title>
      <dc:creator>Ruben Alvarado</dc:creator>
      <pubDate>Thu, 14 May 2026 18:42:48 +0000</pubDate>
      <link>https://dev.to/ralvaracode/flexible-git-workflow-we-actually-use-n7p</link>
      <guid>https://dev.to/ralvaracode/flexible-git-workflow-we-actually-use-n7p</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published on my blog &lt;a href="https://ralvaracode.hashnode.dev/flexible-git-workflow-we-actually-use" rel="noopener noreferrer"&gt;Web Warrior Toolbox&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this article I write about the workflow we use on daily basis. This is a way to provide the team with simple and easy to understand rules that help them stay in order to have ready to deploy code bases. In this case, we are part of a team where 1 to 3 developers contribute to a code base. We make use of Gitlab and its issue boards to keep track of features. You can refer to these guidelines as a base and adapt for your own team. Be flexible and think about when the rules can be applied a when it is better to device new ways to solve your projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we develop?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Listen to stakeholders and take notes
&lt;/h3&gt;

&lt;p&gt;Start by speaking with stakeholders of the project and internal users from the team. This will give an insight of the the core features that define the application—(e.g. profiles, requests, and others). For each area, note the necessary changes and improvements for your project.&lt;/p&gt;

&lt;p&gt;After condensing your meeting notes into general issues, you’ll notice that issues usually combine between frontend and backend development work. You can further divide general issues into more specific ones that correspond to back or front end so they can be assigned to a developer.&lt;/p&gt;

&lt;p&gt;Example&lt;/p&gt;

&lt;p&gt;General Issue: request form&lt;/p&gt;

&lt;p&gt;Specific Issue: chevron arrow in select needs spacing (frontend).&lt;/p&gt;

&lt;p&gt;Specific Issue: retrieve the select options from a database (backend).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Create Feature Branches
&lt;/h3&gt;

&lt;p&gt;Now you have an issue board with general and specific issues. Each issue you create in a GitLab board is assigned a unique number. Use that number as a ticket reference in a conventional branch name. Create the branches you need from master branch or from a general branch as you see fit. You can use vscode extensions for conventional branches and conventional commits to simplify your life in this respect.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Merging Strategy: Keep It Simple
&lt;/h3&gt;

&lt;p&gt;Now, regarding merging: keep it simple and merge what you consider makes the process easier to understand. Sometimes it's more practical to merge an specific feature (like chevron arrow spacing of the select element) directly to master. Other times it makes sense to merge it first to a more general branch to test it and make sure it can go to master without making the app crash.&lt;/p&gt;

&lt;p&gt;Maintain a single major branch—master. Merge all features into master once they are deemed ready. This approach minimizes the number of Git commands developers need to remember and keeps the branch tree simple, reducing the learning curve for new team members.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Using Tags for Clarity and Safety
&lt;/h3&gt;

&lt;p&gt;Use tags on master with version numbers to track what has actually been deployed to production (e.g. semantic versioning). Tags also serve as warnings: when a buggy commit is tagged, others can easily notice and avoid using that version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;As you can see these rules are flexible and you can use them to evaluate what is worth keeping for your team and what is better to change. Designing a workflow is a continuous activity that can benefit your team by making communication more effective and accelerate the time it takes until production deployment. Since the best pattern varies from team to team, you need to keep notice of your particular conditions and customize the workflow to improve your development time to production.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>github</category>
      <category>gitlab</category>
    </item>
    <item>
      <title>MongoDB didn't start because of File permission issue</title>
      <dc:creator>Ruben Alvarado</dc:creator>
      <pubDate>Fri, 27 Feb 2026 20:52:10 +0000</pubDate>
      <link>https://dev.to/ralvaracode/mongodb-didnt-start-because-of-file-permission-issue-19i5</link>
      <guid>https://dev.to/ralvaracode/mongodb-didnt-start-because-of-file-permission-issue-19i5</guid>
      <description>&lt;p&gt;The Wired Tiger Turtle in the logs&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Originalled published on &lt;a href="https://ralvaracode.hashnode.dev/when-mongodb-refuses-to-start" rel="noopener noreferrer"&gt;Web Warrior Toolbox&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A Wired Tiger Turtle Story...
&lt;/h2&gt;

&lt;p&gt;While troubleshooting a project, I wanted to run the db locally before deploying my hotfix. I set my pc for that and I mocked a database with some useful data for my test before deploying to production that day.&lt;/p&gt;

&lt;p&gt;Two days later a new issue that needed a hotfix came to me and I needed to test again with a local database. I tried to start the db with the usual command &lt;code&gt;systemctl start mongod&lt;/code&gt; but I saw it didn't start when I checked with &lt;code&gt;systemctl status mongod&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When I checked status I saw a message saying that it didn't start but i couldn't understand the reason why.🤨&lt;/p&gt;

&lt;p&gt;After following multiple suggestions from chatbots and getting lost myself 😵‍💫 I understood that the answer to that question was in a place I didn't use to look at 💬​: THE LOGS! 🪵​&lt;/p&gt;

&lt;p&gt;In Linux you have that place dedicated to record what did your applications say and probably you didn't see or don't remember. Just look at &lt;code&gt;/var/log&lt;/code&gt; and then check your respective log.&lt;/p&gt;

&lt;p&gt;In my case I found the file &lt;code&gt;/var/log/mongodb/mongod.log&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Since it had many lines I just checked the last part of the log with the &lt;code&gt;tail&lt;/code&gt; command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-n300&lt;/span&gt; /var/log/mongodb/mongod.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Still with that I got a wall of text so i decided to fed my chatbot to provide some advice. The chatbot showed that the most frequent text was indeed the most important part of this issue.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;ERROR]: __posix_open_file, 924: /var/lib/mongodb/WiredTiger.turtle: handle-open: open: Permission denied&lt;span class="s2"&gt;"}} 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;A wild Wire-tiger-turtle-appeared!🔌​🐯​​🐢&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The chatbot suggested that &lt;code&gt;/var/lib/mongodb/WiredTiger.turtle&lt;/code&gt; should be owned by &lt;code&gt;mongodb&lt;/code&gt;. I noted the file was owned by root. I tryed changing the owner to mongodb and it didn't work. Then tried changing the folder to be owned by mongodb. This last attemp was sucesful when i restarted mongod and check with &lt;code&gt;systemctl status mongod&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned from that story
&lt;/h2&gt;

&lt;p&gt;This story is longer than what I wrote. At the start I didn't know where to look and i received suggestions from the chatbot that lead me nowhere. This is the reason why I want to highlight the importance of logs. They provide some important detail that you can use to feed a chatbot, chat with another team member and to understand yourself what is happening. Take this story as a way to keep checking them when issues arise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side story
&lt;/h2&gt;

&lt;p&gt;why did that &lt;code&gt;wiredTiger.turtle&lt;/code&gt; file became owned by root? Well it happened that when I did the first hot fix I started the db with &lt;code&gt;sudo mongod --config /etc/mongod.conf&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;With that command I could use mongodb without problems during that session but I got the problem I tried to tweak again the app two days later.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Let's keep coding, dev-san ​🤓​ 頑張って!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>mongodb</category>
      <category>linux</category>
      <category>database</category>
      <category>webdev</category>
    </item>
    <item>
      <title>PostGres Database Replication Using Pglogical</title>
      <dc:creator>Ruben Alvarado</dc:creator>
      <pubDate>Tue, 24 Feb 2026 20:52:44 +0000</pubDate>
      <link>https://dev.to/ralvaracode/postgres-database-replication-using-pglogical-3pd3</link>
      <guid>https://dev.to/ralvaracode/postgres-database-replication-using-pglogical-3pd3</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ralvaracode.hashnode.dev/postgres-database-replication-using-pglogical" rel="noopener noreferrer"&gt;Hashnode&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is an example of PostgreSQL database replication using the pglogical extension. In this example, I used Docker containers, with each container having its own database. When data is written to the primary database, the secondary container receives the same data.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👨‍💻A man proudly told his wife, &lt;em&gt;“I’m an SQL DB admin!”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;She threw him out of the house…&lt;/p&gt;

&lt;p&gt;Because he had &lt;strong&gt;one to many relationships&lt;/strong&gt;💔 — SQL News Network&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Start Docker
&lt;/h2&gt;

&lt;p&gt;If you have docker engine use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start docker
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;docker // &lt;span class="k"&gt;if &lt;/span&gt;you want start at boot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or if you have docker desktop use this in debian Linux (installed from .deb package)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; start docker-desktop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create configuration files
&lt;/h2&gt;

&lt;p&gt;You need to create 2 config files as shown in this folder tree&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/&amp;lt;PATH_TO_PROJECT&amp;gt;/docker/
│
├── Dockerfile.pglogical
└── postgres/
    └── docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Define config files
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; is the file that defines how to run the containers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;RATH_TO_PROJECT&amp;gt;/docker/postgres/ 
nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;paste this content for your yml&lt;/p&gt;

&lt;p&gt;container names are inside the services part. For these example containers are &lt;code&gt;pg1&lt;/code&gt; and &lt;code&gt;pg2&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;services:
  pg1:
    build:
      context: ..
      dockerfile: Dockerfile.pglogical      
    container_name: pg1
    &lt;span class="nb"&gt;command&lt;/span&gt;:
      - postgres
      - &lt;span class="nt"&gt;-c&lt;/span&gt;
      - &lt;span class="nv"&gt;shared_preload_libraries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;pglogical
      - &lt;span class="nt"&gt;-c&lt;/span&gt;
      - &lt;span class="nv"&gt;wal_level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;logical
      - &lt;span class="nt"&gt;-c&lt;/span&gt;
      - &lt;span class="nv"&gt;max_replication_slots&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10
      - &lt;span class="nt"&gt;-c&lt;/span&gt;
      - &lt;span class="nv"&gt;max_wal_senders&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: testdb
      POSTGRES_HOST_AUTH_METHOD: trust
    ports:
      - &lt;span class="s2"&gt;"5433:5432"&lt;/span&gt;
    volumes:
      - pg1_data:/var/lib/postgresql/data
    networks:
      - pgnet

  pg2:
    build:
      context: ..
      dockerfile: Dockerfile.pglogical
    container_name: pg2
    &lt;span class="nb"&gt;command&lt;/span&gt;:
      - postgres
      - &lt;span class="nt"&gt;-c&lt;/span&gt;
      - &lt;span class="nv"&gt;shared_preload_libraries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;pglogical
      - &lt;span class="nt"&gt;-c&lt;/span&gt;
      - &lt;span class="nv"&gt;wal_level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;logical
      - &lt;span class="nt"&gt;-c&lt;/span&gt;
      - &lt;span class="nv"&gt;max_replication_slots&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10
      - &lt;span class="nt"&gt;-c&lt;/span&gt;
      - &lt;span class="nv"&gt;max_wal_senders&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: testdb
      POSTGRES_HOST_AUTH_METHOD: trust
    ports:
      - &lt;span class="s2"&gt;"5434:5432"&lt;/span&gt;
    volumes:
      - pg2_data:/var/lib/postgresql/data
    networks:
      - pgnet

networks:
  pgnet:
    driver: bridge

volumes:
  pg1_data:
  pg2_data:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; has a limitation: It doesn’t let you install software inside the system images!&lt;/p&gt;

&lt;p&gt;Since pglogical is not included in the images we need to create &lt;code&gt;Dockerfile.pglogical&lt;/code&gt; to specify that we want to add pglogical to the image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;FROM postgres:16

RUN apt-get update &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; postgresql-18-pglogical &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Start the containers
&lt;/h2&gt;

&lt;p&gt;Use this command to start the containers&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;ROUTE_TO_DOCKER_YML&amp;gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check that containers are running&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you will get something like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;CONTAINER ID   IMAGE          COMMAND                  CREATED      STATUS         PORTS                                         NAMES
c61ef5d393cc   postgres-pg1   &lt;span class="s2"&gt;"docker-entrypoint.s..."&lt;/span&gt;   3 days ago   Up 4 minutes   0.0.0.0:5433-&amp;gt;5432/tcp, &lt;span class="o"&gt;[&lt;/span&gt;::]:5433-&amp;gt;5432/tcp   pg1
b055528784d5   postgres-pg2   &lt;span class="s2"&gt;"docker-entrypoint.s..."&lt;/span&gt;   3 days ago   Up 4 minutes   0.0.0.0:5434-&amp;gt;5432/tcp, &lt;span class="o"&gt;[&lt;/span&gt;::]:5434-&amp;gt;5432/tcp   pg2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  Where each line is a container you have running&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get pglogical running in each container
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Follow this instructions for &lt;code&gt;pg1&lt;/code&gt; and &lt;code&gt;pg2&lt;/code&gt; the examples shown are also for &lt;code&gt;pg1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install pglogical in each container using the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; pg1 psql &lt;span class="nt"&gt;-U&lt;/span&gt; postgres &lt;span class="nt"&gt;-d&lt;/span&gt; testdb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable the extension in each container&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;CREATE EXTENSION pglogical&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The use this sql command to check installed extensions in each container&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;testdb=# \dx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;example output when pglogical is installed&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                   List of installed extensions
   Name    | Version |   Schema   |          Description           
-----------+---------+------------+--------------------------------
 pglogical | 2.4.6   | pglogical  | PostgreSQL Logical Replication
 plpgsql   | 1.0     | pg_catalog | PL/pgSQL procedural language
(2 rows)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Register database as a pglogical node named pg1 and pg2&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT pglogical.create_node(
    node_name := 'pg1',
    dsn := 'host=pg1 port=5432 dbname=testdb user=postgres password=postgres'
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create table in the provider database
&lt;/h2&gt;

&lt;p&gt;On &lt;strong&gt;pg1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Connect postgres&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT pglogical.create_replication_set(
    'demo_set',
    replicate_insert := true,
    replicate_update := true,
    replicate_delete := true,
    replicate_truncate := true
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create demo table &amp;amp; baseline data
&lt;/h2&gt;

&lt;p&gt;On &lt;strong&gt;pg1&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE demo_events (
    id SERIAL PRIMARY KEY,
    message TEXT,
    created_at TIMESTAMP DEFAULT now()
);

INSERT INTO demo_events (message)
SELECT 'baseline row ' || g
FROM generate_series(1,5) g;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the table to the replication set:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT pglogical.replication_set_add_table(
    'demo_set',
    'demo_events'
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create subscriptor
&lt;/h2&gt;

&lt;p&gt;On &lt;strong&gt;pg2&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT pglogical.create_subscription(
    subscription_name := 'sub_pg1',
    provider_dsn := 'host=pg1 port=5432 dbname=testdb user=postgres password=postgres',
    replication_sets := ARRAY['demo_set'],
    synchronize_structure := true,
    synchronize_data := true
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait a few seconds, then verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM demo_events;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see the &lt;strong&gt;5 baseline rows&lt;/strong&gt; on &lt;code&gt;pg2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Finally if you try to insert data in the table from pg1 (primary db) it will be successful but if you try from pg2 (replica db) you will get a error-only error. which shows that replication is working as expected.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;INSERT INTO demo_events &lt;span class="o"&gt;(&lt;/span&gt;message&lt;span class="o"&gt;)&lt;/span&gt;
VALUES &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'inserted new row'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enjoy! 🎉 You now have your replicated databases working. Feel the power of synchronized data with no more differing versions! 🔄💪&lt;/p&gt;




</description>
      <category>postgres</category>
      <category>database</category>
    </item>
    <item>
      <title>Docker Desktop and LM Studio installation</title>
      <dc:creator>Ruben Alvarado</dc:creator>
      <pubDate>Wed, 18 Feb 2026 20:44:23 +0000</pubDate>
      <link>https://dev.to/ralvaracode/docker-desktop-and-lm-studio-installation-3kdc</link>
      <guid>https://dev.to/ralvaracode/docker-desktop-and-lm-studio-installation-3kdc</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://ralvaracode.hashnode.dev/docker-desktop-and-lm-studio-installation" rel="noopener noreferrer"&gt;Hashnode&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can self-host LLMs to automate tasks on your system like retrieving information from a website, writing a database, interacting with note apps, etc. To set up a PC for these automations you can install Docker and LM Studio. This document provides step-by-step instructions for installing and configuring these tools.🤓&lt;/p&gt;

&lt;h2&gt;
  
  
  🐳&lt;strong&gt;Install docker desktop in Ubuntu Linux&lt;/strong&gt;🐧
&lt;/h2&gt;




&lt;p&gt;Docker Desktop provides pre-packaged MCP servers to interact with web tools, databases, and other systems. It integrates seemlesly with LM Studio, which runs and manages your local LLMs.&lt;/p&gt;

&lt;p&gt;Before installing and running these tools, it is important to ensure that your system supports hardware virtualization, which is required for efficient container and virtual machine execution.&lt;/p&gt;

&lt;p&gt;First check that you have kmv module loaded to linux kernel with this command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsmod | &lt;span class="nb"&gt;grep &lt;/span&gt;kvm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You should get a response like this that shows that kvm is running&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;08:14:19
kvm_intel             487424  18
kvm                  1425408  17 kvm_intel
irqbypass              12288  1 kvm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Download latest DEB package. In my case I used this lnk&lt;/p&gt;

&lt;p&gt;&lt;a href="https://desktop.docker.com/linux/main/amd64/docker-desktop-amd64.deb?utm_source=docker&amp;amp;utm_medium=webreferral&amp;amp;utm_campaign=docs-driven-download-linux-amd64" rel="noopener noreferrer"&gt;Docker Desktop DEB package Download Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install the package using apt. Replace &amp;lt;route_to_download_folder&amp;gt; with the route where you have your downloads.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
 &lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;route_to_download_folder&amp;gt;
 &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; ./docker-desktop-amd64.deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Sucess you now have Docker Desktop!🤵&lt;/p&gt;
&lt;h2&gt;
  
  
  🎧&lt;strong&gt;Install LM Studio&lt;/strong&gt;
&lt;/h2&gt;



&lt;p&gt;LM Studio lets you run large language models locally on your PC, including models such as LLaMA, Mistral, and DeepSeek. Running models locally ensures full privacy and allows you to work offline.&lt;/p&gt;

&lt;p&gt;To install LM Studio, download the application from the official website:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lmstudio.ai/" rel="noopener noreferrer"&gt;https://lmstudio.ai/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow these commands to install app image. Replace &lt;code&gt;&amp;lt;lmstudio_folder&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;download_folder&amp;gt;&lt;/code&gt; with the respective routes in your PC.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &amp;lt;lmstudio_folder&amp;gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;lmstudio_folder&amp;gt;
&lt;span class="nb"&gt;mv&lt;/span&gt; &amp;lt;download_folder&amp;gt;/LM-Studio-0.3.36-1-x64.AppImage &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x LM-Studio-0.3.36-1-x64.AppImage
./LM-Studio-0.3.36-1-x64.AppImage &lt;span class="nt"&gt;-appimage-extract&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;After extraction is complete, navigate to this folder inside &lt;code&gt;&amp;lt;lmstudio_folder&amp;gt;&lt;/code&gt; and set chrome-sandbox to be executed as root from a normal user (no sudo command requiered for execution)&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;squashfs-root
&lt;span class="nb"&gt;sudo chown &lt;/span&gt;root:root chrome-sandbox
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;4755 chrome-sandbox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now enable LM Studio to be found when you press windows (super key) in Ubuntu. Follow these commands to create the desktop file.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/.local/share/applications/
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano lmstudio.desktop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Paste these lines to the desktop file. Replace &amp;lt;USER_NAME&amp;gt; with your username in your PC&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;Desktop Entry]
&lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;LM Studio
&lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Application
&lt;span class="nv"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/&amp;lt;USER_NAME&amp;gt;/lmStudio/squashfs-root/lm-studio
&lt;span class="nv"&gt;Icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/&amp;lt;USER_NAME&amp;gt;/lmStudio/squashfs-root/lm-studio.png
&lt;span class="nv"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Press the super key and type “lm studio”. You can access the application without knowing its exact location now.🤩&lt;/p&gt;
&lt;h2&gt;
  
  
  References to Explore
&lt;/h2&gt;




&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://docs.docker.com/desktop/setup/install/linux/ubuntu/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.docker.com%2Fimages%2Fthumbnail.webp" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://docs.docker.com/desktop/setup/install/linux/ubuntu/" rel="noopener noreferrer" class="c-link"&gt;
            Ubuntu | Docker Docs
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Learn how to install, launch, and upgrade Docker Desktop on Ubuntu. This quick guide will cover prerequisites, installation methods, and more.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.docker.com%2Fassets%2Fimages%2Ffavicon-32x32.png" width="32" height="32"&gt;
          docs.docker.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Bhzpph-OgXU"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>ai</category>
      <category>linux</category>
      <category>docker</category>
    </item>
    <item>
      <title>Set New Branch in Git</title>
      <dc:creator>Ruben Alvarado</dc:creator>
      <pubDate>Wed, 08 Oct 2025 18:35:59 +0000</pubDate>
      <link>https://dev.to/ralvaracode/set-new-branch-in-git-31gc</link>
      <guid>https://dev.to/ralvaracode/set-new-branch-in-git-31gc</guid>
      <description>&lt;p&gt;If you want to add a new feature to an app you have cloned. You can create a new branch for that feature following these git commands.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git switch -c &amp;lt;branch-name&amp;gt; // creates the branch
git add &amp;lt;file-or-folder&amp;gt;     // or use '.' to stage all changes
git commit -m "&amp;lt;commit-message&amp;gt;"
git push --set-upstream origin &amp;lt;branch-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also simply try &lt;code&gt;git push&lt;/code&gt;, in that case you will get a warning that the branch doesn't exist in remote yet and you receive a suggestion using the &lt;code&gt;--set-upstream&lt;/code&gt; parameter. Instead of memorizing the last command with the parameter you can copy and paste the command that the terminal suggests.&lt;/p&gt;

&lt;p&gt;And that it. Use this snippet to preserve working code in master and your new code in your feature or bug fix branch.&lt;/p&gt;

&lt;p&gt;🤓Happy coding😎&lt;/p&gt;

</description>
      <category>git</category>
    </item>
    <item>
      <title>🚀 How to Upload Environment Variables to GitLab CI/CD</title>
      <dc:creator>Ruben Alvarado</dc:creator>
      <pubDate>Sat, 13 Sep 2025 21:28:24 +0000</pubDate>
      <link>https://dev.to/ralvaracode/how-to-upload-environment-variables-to-gitlab-cicd-mo3</link>
      <guid>https://dev.to/ralvaracode/how-to-upload-environment-variables-to-gitlab-cicd-mo3</guid>
      <description>&lt;p&gt;Managing secrets and configuration in GitLab pipelines doesn’t have to be messy. Here’s a quick guide to securely upload your environment variables and integrate them into your .gitlab-ci.yml workflow.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In Gitlab goto left side bar, Settings, CI/CD&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to variables section, click add variable&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbeta.appflowy.cloud%2Fapi%2Ffile_storage%2F67b91e9f-1e54-4861-9909-2038e29a9b3d%2Fv1%2Fblob%2F1b81d85c-ec6d-406f-9903-82cf598f9cb0%2Fgdp_i-zbG263nXSlHGFRk9JnEP5XlLNq4oyqo1TWa4k%3D." class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbeta.appflowy.cloud%2Fapi%2Ffile_storage%2F67b91e9f-1e54-4861-9909-2038e29a9b3d%2Fv1%2Fblob%2F1b81d85c-ec6d-406f-9903-82cf598f9cb0%2Fgdp_i-zbG263nXSlHGFRk9JnEP5XlLNq4oyqo1TWa4k%3D." alt="Variables Menu" width="1249" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;From right side bar select select &lt;code&gt;visible&lt;/code&gt; and deselect &lt;code&gt;protect variable&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3v7irfjl2429f1v33ta.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3v7irfjl2429f1v33ta.png" alt="Add Variable Menu" width="391" height="933"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In Key write the name of the file that will store all the variables&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In value enter the key and values of your variables (values are written without ")&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure that your yml script adds the env vars file&lt;br&gt;
&lt;code&gt;.gitlab-ci.yml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Autotest:
  stage: test
  image: node:22
  before_script:
    - cat "$ENV_VARS" | tr -d '\r' &amp;gt; .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ve now securely injected environment variables into your GitLab CI/CD pipeline. No more hardcoding secrets or juggling config files—just clean, maintainable automation.&lt;/p&gt;

</description>
      <category>cicd</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
