<?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: Mahmud Ibrahim</title>
    <description>The latest articles on DEV Community by Mahmud Ibrahim (@rafi021).</description>
    <link>https://dev.to/rafi021</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%2F3156837%2F03762713-fed9-480e-a6c7-af68b234ddfe.jpg</url>
      <title>DEV Community: Mahmud Ibrahim</title>
      <link>https://dev.to/rafi021</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rafi021"/>
    <language>en</language>
    <item>
      <title>Dockerfile Cheat Sheet – বাংলা গাইড</title>
      <dc:creator>Mahmud Ibrahim</dc:creator>
      <pubDate>Tue, 20 May 2025 13:34:57 +0000</pubDate>
      <link>https://dev.to/rafi021/dockerfile-cheat-sheet-baanlaa-gaaidd-jk7</link>
      <guid>https://dev.to/rafi021/dockerfile-cheat-sheet-baanlaa-gaaidd-jk7</guid>
      <description>&lt;p&gt;আপনি যদি ডকার নিয়ে কাজ করেন, তাহলে Dockerfile ফাইল লিখতে পারাটা একটি অনিবার্য কাজ আপনার জন্য। এই চিটশীটে Dockerfile এর primary instruction set গুলো সংক্ষেপে তুলে ধরা হলো—বাংলা ভাষায়, যেন সহজে শেখা যায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🐳 FROM&lt;/strong&gt;&lt;br&gt;
Usage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FROM {image}&lt;/li&gt;
&lt;li&gt;FROM {image}:{tag}&lt;/li&gt;
&lt;li&gt;FROM {image}@{digest}&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM node:18-alpine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 ইমেজ তৈরি করার জন্য কোন বেজ ইমেজ ব্যবহার হবে তা নির্ধারণ করে।&lt;br&gt;
🔹 এটি অবশ্যই প্রথম ইনস্ট্রাকশন হতে হবে (কমেন্ট বাদে)।&lt;br&gt;
🔹 :tag বা @digest নির্দিষ্ট করা যেতে পারে। না দিলে latest ধরা হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👤 MAINTAINER (Deprecated)&lt;/strong&gt;&lt;br&gt;
Usage: Maintainer {name}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MAINTAINER আপনার নাম &amp;lt;ইমেইল&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔸 ইমেজের লেখক (Author) হিসেবে তথ্য সংরক্ষণ করে।&lt;br&gt;
❌ এটি পুরানো হয়ে গেছে, এখন LABEL ব্যবহার করা হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚙️ RUN&lt;/strong&gt;&lt;br&gt;
Usage: Run {command}, RUN ["executable", "param1", "param2"]&lt;br&gt;
Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RUN apt-get update &amp;amp;&amp;amp; apt-get install -y curl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 ইমেজ তৈরির সময় কমান্ড রান করে।&lt;br&gt;
🔹 Shell ফর্ম ও Exec ফর্মে ব্যবহার করা যায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧠 CMD: Shell vs Exec&lt;/strong&gt;&lt;br&gt;
Usage: CMD ["executable", "param1", "param2"] --&amp;gt; exec form&lt;br&gt;
CMD command param1 param2  --&amp;gt; shell form&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CMD ["node", "app.js"]
CMD ["/bin/ping","localhost"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔸 কনটেইনার চালুর সময় ডিফল্ট কমান্ড বা আর্গুমেন্ট নির্ধারণ করে।&lt;br&gt;
🔸 শুধুমাত্র একটি CMD কার্যকর হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏷️ LABEL&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;LABEL maintainer="আপনার নাম" version="1.0"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 মেটাডাটা যোগ করতে ব্যবহৃত হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🌐 EXPOSE&lt;/strong&gt;&lt;br&gt;
Usage: Expose {port} [ ...]&lt;br&gt;
Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EXPOSE 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 কোন পোর্টগুলো অ্যাপ্লিকেশন শুনছে তা জানায়।&lt;br&gt;
🔹 কিন্তু এটি পোর্ট এক্সপোজ করে না, -p দিয়ে করতে হয়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🌱 ENV&lt;/strong&gt;&lt;br&gt;
Usage: Env{key} {value} &lt;br&gt;
Env = [=...]&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ENV NODE_ENV=production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 এনভায়রনমেন্ট ভ্যারিয়েবল সেট করে।&lt;br&gt;
🔹 পরবর্তীতে ব্যবহারযোগ্য থাকে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📂 ADD vs COPY&lt;/strong&gt;&lt;br&gt;
Usage: ADD  [ ...] &lt;br&gt;
COPY  [...] &lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ADD ./source /app
COPY ./source /app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 COPY: সাধারণ কপি করা।&lt;br&gt;
🔹 ADD: কপি ছাড়াও .tar.gz আনজিপ করে বা রিমোট ইউআরএল থেকেও ফাইল নামায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📁 VOLUME&lt;/strong&gt;&lt;br&gt;
Usage: Volume["path", ....]&lt;br&gt;
Volume path [path....]&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VOLUME ["/data"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 হোস্ট বা অন্য কনটেইনার থেকে ডেটা মাউন্ট করার জন্য নির্দিষ্ট লোকেশন তৈরি করে।&lt;br&gt;
🔹 উদাহরণ: লগ, ডেটাবেস ডেটা সংরক্ষণের জন্য।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📌 WORKDIR&lt;/strong&gt;&lt;br&gt;
Usage: Workdir {/path/to/workdir}&lt;br&gt;
Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WORKDIR /app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 পরবর্তী RUN, CMD, COPY, ADD ইনস্ট্রাকশনগুলো এই ডিরেক্টরিতে চালানো হবে।&lt;br&gt;
🔹 একাধিকবার ব্যবহার করা যায়। আপেক্ষিক পাথও দেওয়া যায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🛠️ ARG&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;ARG NODE_VERSION=18
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 বিল্ড টাইম ভ্যারিয়েবল যা --build-arg দিয়ে পাস করা যায়।&lt;br&gt;
🔹 ENV ভ্যারিয়েবল ARG-কে override করে।&lt;br&gt;
🔹 নিরাপত্তার জন্য সিক্রেট তথ্য ARG দিয়ে না দেওয়াই উত্তম।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔁 ONBUILD&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;ONBUILD COPY . /app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 ভবিষ্যতে এই ইমেজ অন্য কেউ FROM করলে তখন এই ইনস্ট্রাকশনগুলো চালানো হবে।&lt;br&gt;
🔹 শুধুমাত্র child ইমেজে চলে, grandchild এ না।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🛑 STOPSIGNAL&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;STOPSIGNAL SIGKILL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 কনটেইনার থামানোর সময় কোন সিগন্যাল পাঠানো হবে তা নির্ধারণ করে (যেমন SIGINT, SIGTERM)।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏥 HEALTHCHECK&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;HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
  CMD curl -f http://localhost:3000 || exit 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔹 কনটেইনার সুস্থ আছে কিনা তা পরীক্ষা করে।&lt;br&gt;
🔹 0 মানে healthy, 1 মানে unhealthy।&lt;br&gt;
🔹 HEALTHCHECK NONE দিয়ে এটি নিষ্ক্রিয় করা যায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📘 উপসংহার&lt;/strong&gt;&lt;br&gt;
এই ছিল Dockerfile এর মৌলিক ইন্সট্রাকশনগুলোর বাংলা সংক্ষিপ্ত বিবরণ।&lt;/p&gt;

&lt;p&gt;🔜 পরবর্তী পর্বে:&lt;br&gt;
👉 Dockerfile লেখার সেরা কিছু Best Practices!&lt;br&gt;
👉 কিভাবে ডকার ইমেজ ছোট, দ্রুত এবং নিরাপদ রাখা যায়।&lt;/p&gt;

&lt;p&gt;ফলো করুন এবং কমেন্টে জানান, কোন অংশটা আপনার সবচেয়ে দরকারি লেগেছে!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>cheatsheet</category>
    </item>
    <item>
      <title>How to Set Up a Monitoring Stack with Prometheus, Grafana, and Node Exporter Using Docker Compose</title>
      <dc:creator>Mahmud Ibrahim</dc:creator>
      <pubDate>Sat, 17 May 2025 08:37:00 +0000</pubDate>
      <link>https://dev.to/rafi021/how-to-set-up-a-monitoring-stack-with-prometheus-grafana-and-node-exporter-using-docker-compose-17cc</link>
      <guid>https://dev.to/rafi021/how-to-set-up-a-monitoring-stack-with-prometheus-grafana-and-node-exporter-using-docker-compose-17cc</guid>
      <description>&lt;p&gt;Monitoring your infrastructure is crucial for reliability and performance. In this article, we'll walk through a simple and effective monitoring stack using Docker Compose, featuring &lt;strong&gt;Prometheus&lt;/strong&gt; for metrics collection, &lt;strong&gt;Grafana&lt;/strong&gt; for visualization, and &lt;strong&gt;Node Exporter&lt;/strong&gt; for exposing host metrics.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── docker-compose.yml
├── prometheus.yml
└── provisioning/
    └── datasources/
        └── prometheus.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Understanding the &lt;code&gt;docker-compose.yml&lt;/code&gt; File
&lt;/h2&gt;

&lt;p&gt;Let's break down the main components of the &lt;code&gt;docker-compose.yml&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;prometheus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prom/prometheus:v3.3.1&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prometheus&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9090:9090"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./prometheus.yml:/etc/prometheus/prometheus.yml&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;prometheus_data:/prometheus&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;monitoring&lt;/span&gt;

  &lt;span class="na"&gt;grafana&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;grafana/grafana:12.0.0&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;grafana&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;GF_SECURITY_ADMIN_PASSWORD=admin&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;prometheus&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;monitoring&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./provisioning/datasources:/etc/grafana/provisioning/datasources&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;grafana_data:/var/lib/grafana&lt;/span&gt;

  &lt;span class="na"&gt;node_exporter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prom/node-exporter:v1.9.1&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node_exporter&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9100:9100"&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;monitoring&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;monitoring&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;prometheus_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local&lt;/span&gt;
  &lt;span class="na"&gt;grafana_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;local&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Service Breakdown
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prometheus&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses the official Prometheus image.&lt;/li&gt;
&lt;li&gt;Exposes port &lt;code&gt;9090&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Mounts a local &lt;code&gt;prometheus.yml&lt;/code&gt; config and a Docker volume for persistent data.&lt;/li&gt;
&lt;li&gt;Connected to a custom &lt;code&gt;monitoring&lt;/code&gt; network.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Grafana&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses the official Grafana image.&lt;/li&gt;
&lt;li&gt;Exposes port &lt;code&gt;3000&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sets the admin password via environment variable.&lt;/li&gt;
&lt;li&gt;Depends on Prometheus (starts after Prometheus is up).&lt;/li&gt;
&lt;li&gt;Mounts provisioning files and a persistent data volume.&lt;/li&gt;
&lt;li&gt;Connected to the &lt;code&gt;monitoring&lt;/code&gt; network.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Node Exporter&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses the official Node Exporter image.&lt;/li&gt;
&lt;li&gt;Exposes port &lt;code&gt;9100&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Connected to the &lt;code&gt;monitoring&lt;/code&gt; network.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Networks and Volumes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All services share the &lt;code&gt;monitoring&lt;/code&gt; bridge network.&lt;/li&gt;
&lt;li&gt;Prometheus and Grafana use named volumes for data persistence.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step-by-Step Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Clone the Repository
&lt;/h3&gt;

&lt;p&gt;Github Link: &lt;a href="https://github.com/rafi021/monitoring-stack-prometheus-grafana-node-exporter" rel="noopener noreferrer"&gt;https://github.com/rafi021/monitoring-stack-prometheus-grafana-node-exporter&lt;/a&gt;&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 &amp;lt;your-repo-url&amp;gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;your-repo-directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Review and Edit Configuration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;prometheus.yml&lt;/strong&gt;: Make sure Prometheus is configured to scrape Node Exporter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;provisioning/datasources/prometheus.yml&lt;/strong&gt;: Ensures Grafana automatically adds Prometheus as a data source.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;prometheus.yml&lt;/code&gt; file is the main configuration file for Prometheus. Here’s what each section does:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;global&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scrape_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;global&lt;/strong&gt;: Sets global configuration options.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;scrape_interval: 5s&lt;/strong&gt;: Prometheus will scrape (collect) metrics from all configured targets every 5 seconds.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;scrape_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;node'&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;node_exporter:9100'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# This points to the Node Exporter container&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;scrape_configs&lt;/strong&gt;: Defines the list of jobs (sets of targets) Prometheus should scrape.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;job_name: 'node'&lt;/strong&gt;: Names this scrape job "node" (for Node Exporter).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;static_configs&lt;/strong&gt;: Specifies static targets for this job.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;targets: ['node_exporter:9100']&lt;/strong&gt;: Prometheus will scrape metrics from the Node Exporter container at port 9100.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Summary:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This config tells Prometheus to collect metrics from the Node Exporter container every 5 seconds.&lt;/p&gt;

&lt;p&gt;This file &lt;code&gt;provisioning/datasources/prometheus.yml&lt;/code&gt; is a Grafana data source provisioning configuration. It tells Grafana to automatically add Prometheus as a data source when Grafana starts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;apiVersion: 1&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Specifies the version of the provisioning config format.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;datasources:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A list of data sources to add.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;name: Prometheus&lt;/strong&gt;
The name that will appear in Grafana.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;type: prometheus&lt;/strong&gt;
Specifies the data source type (Prometheus).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;access: proxy&lt;/strong&gt;
Grafana will proxy requests to Prometheus (recommended for most setups).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;url: &lt;a href="http://prometheus:9090" rel="noopener noreferrer"&gt;http://prometheus:9090&lt;/a&gt;&lt;/strong&gt;
The URL where Prometheus is accessible from within the Docker network (using the service name).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;isDefault: true&lt;/strong&gt;
Sets this data source as the default in Grafana.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Summary:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This file ensures that Prometheus is pre-configured as the default data source in Grafana, so you don’t have to add it manually.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Start the Stack
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&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;This command will pull the required images and start all services in the background.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Access the Services
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prometheus UI&lt;/strong&gt;: &lt;a href="http://localhost:9090" rel="noopener noreferrer"&gt;http://localhost:9090&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grafana UI&lt;/strong&gt;: &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;Default login: &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;admin&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Node Exporter Metrics&lt;/strong&gt;: &lt;a href="http://localhost:9100/metrics" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="http://localhost:9100/metrics" rel="noopener noreferrer"&gt;http://localhost:9100/metrics&lt;/a&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffeycu1izta4r0qhw50in.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%2Ffeycu1izta4r0qhw50in.png" alt="Prometheus node exporter health" width="800" height="327"&gt;&lt;/a&gt;&lt;br&gt;
Prometheus UI showing that the, node exporter endpoint is connected successfully. &lt;/p&gt;

&lt;h3&gt;
  
  
  5. Add Dashboards in Grafana
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Prometheus is already set as a data source.&lt;/li&gt;
&lt;li&gt;Import community dashboards or create your own to visualize Node Exporter metrics.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk0394fdrud2o3baez9ci.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%2Fk0394fdrud2o3baez9ci.png" alt="Grafana Dashboard Add" width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click + Create Dashboard&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetlikryii7jkokhafejb.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%2Fetlikryii7jkokhafejb.png" alt="Import Dashboard" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Import Node Exporter Dashboards: There are pre-configured dashboards available for Node Exporter. You can go to Grafana Dashboards and search for Node Exporter Full Dashboard (ID: 1860), which will give you a comprehensive view of your system metrics.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54oqdrr7mv4blvjq5rtp.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%2F54oqdrr7mv4blvjq5rtp.png" alt="Add 1860" width="677" height="697"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the Grafana Dashboards section, search for Node Exporter Full dashboard. The Dashboard ID for Node Exporter Full is 1860.&lt;/li&gt;
&lt;li&gt;Enter 1860 in the Import via ID field and click Load.&lt;/li&gt;
&lt;li&gt;In the Prometheus drop-down, choose the Prometheus data source you just configured.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynhtlded4nx2dcgrf78m.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%2Fynhtlded4nx2dcgrf78m.png" alt="Import" width="694" height="804"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click Import.&lt;/li&gt;
&lt;li&gt;Verify the Dashboard:&lt;/li&gt;
&lt;li&gt;Once the dashboard is imported, you should see a comprehensive view of your Ubuntu server’s metrics, including CPU usage, memory usage, disk I/O, network statistics, etc.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ydl9pqhgtq0qzov5wo0.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%2F7ydl9pqhgtq0qzov5wo0.png" alt="Node exporter Dashboard" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Stopping the Stack
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;p&gt;This will stop and remove all containers, but your data will persist in the named volumes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tips &amp;amp; Troubleshooting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Customizing Prometheus Targets&lt;/strong&gt;: Edit &lt;code&gt;prometheus.yml&lt;/code&gt; to add more scrape targets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persisting Data&lt;/strong&gt;: Data is stored in Docker volumes (&lt;code&gt;prometheus_data&lt;/code&gt;, &lt;code&gt;grafana_data&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logs&lt;/strong&gt;: Check logs with:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  docker-compose logs prometheus
  docker-compose logs grafana
  docker-compose logs node_exporter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Change Default Password&lt;/strong&gt;: For security, change the Grafana admin password in production.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;With just a few files and Docker Compose, you can have a powerful monitoring stack up and running in minutes. This setup is perfect for local development, testing, or even small production environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy Monitoring!&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;References:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://prometheus.io/docs/" rel="noopener noreferrer"&gt;Prometheus Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/" rel="noopener noreferrer"&gt;Grafana Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/prometheus/node_exporter" rel="noopener noreferrer"&gt;Node Exporter Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>docker</category>
      <category>linux</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Step-by-Step Guide: Laravel CI/CD with GitHub Actions</title>
      <dc:creator>Mahmud Ibrahim</dc:creator>
      <pubDate>Thu, 15 May 2025 19:49:23 +0000</pubDate>
      <link>https://dev.to/rafi021/step-by-step-guide-laravel-cicd-with-github-actions-i89</link>
      <guid>https://dev.to/rafi021/step-by-step-guide-laravel-cicd-with-github-actions-i89</guid>
      <description>&lt;p&gt;Continuous Integration (CI) is a must-have for modern web development. It helps you catch bugs early, ensures code quality, and saves you from manual testing headaches. In this article, I’ll walk you through a real-world GitHub Actions workflow for a Laravel project. Whether you’re new to CI/CD or just want to see how it works for Laravel, this guide is for you!&lt;/p&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw1306eerr9tnl82jjpte.gif" 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%2Fw1306eerr9tnl82jjpte.gif" alt="CI/CD Workflow Overview" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What is GitHub Actions?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/en/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt; is a free automation tool built into GitHub. It lets you run scripts and commands automatically when certain events happen in your repository—like pushing code or opening a pull request.&lt;/p&gt;




&lt;h2&gt;
  
  
  Workflow Overview
&lt;/h2&gt;

&lt;p&gt;Our workflow will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run on every push or pull request to the &lt;code&gt;main&lt;/code&gt; or &lt;code&gt;dev&lt;/code&gt; branches.&lt;/li&gt;
&lt;li&gt;Set up a MySQL database for testing.&lt;/li&gt;
&lt;li&gt;Install PHP and all required extensions.&lt;/li&gt;
&lt;li&gt;Cache Composer dependencies for faster builds.&lt;/li&gt;
&lt;li&gt;Install your Laravel app’s dependencies.&lt;/li&gt;
&lt;li&gt;Run static analysis and code quality checks.&lt;/li&gt;
&lt;li&gt;Run your automated tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s break down each step!&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Workflow Triggers
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dev"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dev"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This tells GitHub to run the workflow every time you push code or open a pull request to the &lt;code&gt;main&lt;/code&gt; or &lt;code&gt;dev&lt;/code&gt; branches.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Define the Job and Environment
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;tests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;We define a job called &lt;code&gt;tests&lt;/code&gt; that runs on the latest Ubuntu Linux environment provided by GitHub.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Set Up MySQL Database
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mysql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8.0&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;3306:3306&lt;/span&gt;
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test_db&lt;/span&gt;
    &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;--health-cmd="mysqladmin ping"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;We spin up a MySQL 8.0 database in Docker, set the root password, and create a database called &lt;code&gt;test_db&lt;/code&gt;. The health check ensures MySQL is ready before tests run.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Checkout Your Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This step pulls your repository’s code into the workflow environment so the next steps can work with it.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Setup PHP with All Laravel Extensions
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup PHP with PECL extension&lt;/span&gt;
  &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;shivammathur/setup-php@v2&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;php-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;8.4'&lt;/span&gt;
    &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mbstring, bcmath, ctype, fileinfo, json, tokenizer, xml, pdo, pdo_mysql, openssl, curl, zip, imagick, swoole&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;We install PHP 8.4 and all the extensions Laravel and its ecosystem commonly need. This ensures your app runs just like it would in production.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Cache Composer Dependencies
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Cache Composer dependencies&lt;/span&gt;
  &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/cache@v4&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;vendor&lt;/span&gt;
    &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}&lt;/span&gt;
    &lt;span class="na"&gt;restore-keys&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;${{ runner.os }}-composer-&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This is “smart caching.” If your dependencies haven’t changed, Composer can skip downloading and installing them, making your workflow much faster.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Copy the CI Environment File
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Copy .env file&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;cp .env.ci .env&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;We copy a special &lt;code&gt;.env.ci&lt;/code&gt; file to &lt;code&gt;.env&lt;/code&gt;. This file should contain settings for your test database and other CI-specific configs.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Install Composer Dependencies
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;composer install -q --no-ansi --no-interaction --no-scripts --no-progress&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;We install all PHP dependencies your Laravel app needs, using flags to make the process faster and quieter.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Generate Laravel Application Key
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Generate application key&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;php artisan key:generate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Laravel needs an application key for encryption and sessions. This command generates it.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Set Directory Permissions
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Directory permissions&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;sudo chown -R $USER:$USER storage bootstrap/cache&lt;/span&gt;
    &lt;span class="s"&gt;chmod -R 775 storage bootstrap/cache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Laravel needs write access to &lt;code&gt;storage&lt;/code&gt; and &lt;code&gt;bootstrap/cache&lt;/code&gt; for logs and cache files. This step ensures the permissions are correct.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Run Static Analysis with PHPStan
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;phpstan&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;./vendor/bin/phpstan analyse --level=5 --memory-limit=1G&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PHPStan checks your code for bugs and potential issues without running it. This helps you catch problems early.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  12. Run Code Quality Checks with PHP Insights
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;phpinsights&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;php artisan insights --no-interaction \&lt;/span&gt;
    &lt;span class="s"&gt;--min-quality=90 --min-complexity=90 \&lt;/span&gt;
    &lt;span class="s"&gt;--min-architecture=90 --min-style=90 \&lt;/span&gt;
    &lt;span class="s"&gt;--ansi --format=github-action&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PHP Insights analyzes your code for quality, complexity, architecture, and style. The workflow enforces minimum scores for each metric.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  13. Show Database Configuration
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Show DB config&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;grep DB_ .env&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This step prints out the database settings being used, so you can verify your tests are running against the correct database.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  14. Run Your Tests!
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run tests&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;php artisan test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  15. Deployment
&lt;/h2&gt;

&lt;p&gt;Deployment is automated via GitHub Actions and occurs after tests pass:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Main Branch:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
When code is pushed to the &lt;code&gt;main&lt;/code&gt; branch, the workflow connects to the main server using SSH and runs the deployment script (&lt;code&gt;main_deploy.sh&lt;/code&gt;).  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSH credentials are securely managed with GitHub Secrets.&lt;/li&gt;
&lt;li&gt;The script puts the application into maintenance mode, pulls the latest code, runs migrations, sets permissions, clears and caches configuration, and brings the application back up.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dev Branch:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;
When code is pushed to the &lt;code&gt;dev&lt;/code&gt; branch, a similar process runs, but targets the development server.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Deployment Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SSH into the target server.&lt;/li&gt;
&lt;li&gt;Change directory to &lt;code&gt;/var/www/htm/laravel-cicd&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Execute &lt;code&gt;./main_deploy.sh main&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can customize the deployment script (&lt;a href="//main_deploy.sh"&gt;main_deploy.sh&lt;/a&gt;) as needed for your environment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment to Main Server&lt;/span&gt;
              &lt;span class="s"&gt;if&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.ref == 'refs/heads/main'&lt;/span&gt;
              &lt;span class="s"&gt;uses&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;appleboy/ssh-action@master&lt;/span&gt;
              &lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.MAIN_SSH_HOT }}&lt;/span&gt;
                &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;${{ secrets.SSH_USER }}&lt;/span&gt;
                &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;${{ secrets.SSH_PASS }}&lt;/span&gt;
                &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
                  &lt;span class="s"&gt;cd /var/www/htm/laravel-cicd &amp;amp;&amp;amp; ./main_deploy.sh main&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment to Dev Server&lt;/span&gt;
              &lt;span class="s"&gt;if&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.ref == 'refs/heads/dev'&lt;/span&gt;
              &lt;span class="s"&gt;uses&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;appleboy/ssh-action@master&lt;/span&gt;
              &lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_HOST }}&lt;/span&gt;
                &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;${{ secrets.SSH_USER }}&lt;/span&gt;
                &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;${{ secrets.SSH_PASS }}&lt;/span&gt;
                &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
                  &lt;span class="s"&gt;cd /var/www/htm/laravel-cicd &amp;amp;&amp;amp; ./main_deploy.sh main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the &lt;code&gt;main_deploy.sh&lt;/code&gt; file with execute permission&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;chmod&lt;/span&gt; +x main_deploy.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Deploying the application..."&lt;/span&gt;

php artisan down
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Putting the application into maintenance mode..."&lt;/span&gt;

git pull origin main
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Pulling the latest changes from the main branch..."&lt;/span&gt;

php artisan migrate &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Running database migrations..."&lt;/span&gt;

php artisan up
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Bringing the application back up..."&lt;/span&gt;

&lt;span class="nb"&gt;chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 775 storage bootstrap/cache
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Setting permissions..."&lt;/span&gt;

php artisan optimize:clear
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Clearing caches..."&lt;/span&gt;
php artisan config:cache
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Caching configuration..."&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Deployment completed successfully!"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Finally, we run all your Laravel tests. These tests will use the MySQL test database you set up earlier.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;With this workflow, every push or pull request is automatically tested in a fresh environment, with a real database, and all the tools you need for code quality. This helps you catch bugs early, maintain high standards, and move faster as a team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Make sure your &lt;code&gt;.env.ci&lt;/code&gt; file is committed and contains the correct database settings for CI!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Happy automating!&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If you have questions or want to see more CI/CD tips for Laravel, let me know in the comments.&lt;/p&gt;




&lt;p&gt;Github Link: &lt;a href="https://github.com/rafi021/laravel-cicd" rel="noopener noreferrer"&gt;https://github.com/rafi021/laravel-cicd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Feel free to copy, modify, and use this workflow in your own Laravel projects!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>laravel</category>
      <category>cicd</category>
      <category>githubactions</category>
    </item>
    <item>
      <title>🚀Setting Up Kafka with Docker Compose and Node.js: A Practical Guide</title>
      <dc:creator>Mahmud Ibrahim</dc:creator>
      <pubDate>Tue, 13 May 2025 16:36:36 +0000</pubDate>
      <link>https://dev.to/rafi021/setting-up-kafka-with-docker-compose-and-nodejs-a-practical-guide-26c6</link>
      <guid>https://dev.to/rafi021/setting-up-kafka-with-docker-compose-and-nodejs-a-practical-guide-26c6</guid>
      <description>&lt;p&gt;Apache Kafka is a powerful distributed event streaming platform widely used for building real-time data pipelines and applications. However, setting up Kafka can be daunting, especially when integrating it with a Node.js application. This article explores a GitHub project that simplifies this process by using Docker Compose to set up a Kafka environment and a Node.js Express application to test Kafka's functionality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overview of the Project&lt;/strong&gt;&lt;br&gt;
This project provides a ready-to-use Kafka environment using Docker Compose and a Node.js Express application (kafka-express-app) to test Kafka by producing and consuming messages. It is an excellent starting point for developers looking to integrate Kafka into their applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project Structure&lt;/strong&gt;&lt;br&gt;
clone this github repo: &lt;a href="https://github.com/rafi021/kafka-docker-compose" rel="noopener noreferrer"&gt;https://github.com/rafi021/kafka-docker-compose&lt;/a&gt;&lt;br&gt;
The repository is well-organized, with the following structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kafka-docker/
├── docker-compose.yml       # Docker Compose file for Kafka setup
├── kafka-express-app/       # Node.js Express application
│   ├── src/
│   │   ├── kafka/
│   │   │   ├── producer.ts  # Kafka producer logic
│   │   │   └── consumer.ts  # Kafka consumer logic
│   │   ├── routes/
│   │   │   └── index.ts     # Express routes
│   │   └── app.ts           # Express app entry point
│   ├── package.json         # Node.js dependencies and scripts
│   ├── tsconfig.json        # TypeScript configuration
│   └── .env                 # Environment variables
└── README.md                # Project documentation

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Kafka Setup with Docker Compose&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The docker-compose.yml file defines the services required to run Kafka, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zookeeper: Manages Kafka brokers.&lt;/li&gt;
&lt;li&gt;Kafka Broker: The Kafka server.&lt;/li&gt;
&lt;li&gt;Schema Registry: Manages Avro schemas for Kafka topics.&lt;/li&gt;
&lt;li&gt;Kafka Connect: Connects Kafka to external systems.&lt;/li&gt;
&lt;li&gt;Control Center: A web UI for managing Kafka.&lt;/li&gt;
&lt;li&gt;kafka-express-app: The Node.js application for testing Kafka.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Steps to Start Kafka&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start Docker Services: Run the following command to start all services:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Verify Services: Check if all services are running:
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Access Control Center: Open the Confluent Control Center in your browser:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  http://localhost:9021
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(If you don't see anything, then wait for 1 min. Let the containers spin up and connect with each other.)&lt;/p&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn463kwd9ec028v2pzgaa.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%2Fn463kwd9ec028v2pzgaa.png" alt="confluent home" width="627" height="908"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the Click of this page. It will open the cluster details page. &lt;/p&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fijv4ryf3fdauyzapjma4.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%2Fijv4ryf3fdauyzapjma4.png" alt="confluent cluter detail" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;here you can see numbers of broker running, topics, partitions and other details. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Node.js Application Setup&lt;/strong&gt;&lt;br&gt;
The kafka-express-app is a Node.js Express application that interacts with Kafka. It includes producer and consumer logic written in TypeScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Environment Variables&lt;/strong&gt;&lt;br&gt;
Create a .env file in the kafka-express-app directory with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;KAFKA_CLIENT_ID=my-app
KAFKA_BROKERS=localhost:9092
KAFKA_GROUP_ID=test-group
KAFKA_TOPIC=test-topic

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Install Dependencies&lt;/strong&gt;&lt;br&gt;
Navigate to the kafka-express-app directory and install the required dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd kafka-express-app
npm install

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Build the Application&lt;/strong&gt;&lt;br&gt;
Compile the TypeScript code to JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run build

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Run the Application&lt;/strong&gt;&lt;br&gt;
Start the application in development mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run dev

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or start the compiled application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm start

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Testing Kafka&lt;/strong&gt;&lt;br&gt;
The Node.js application provides endpoints to test Kafka's producer and consumer functionality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Produce a Message&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use a tool like curl or Postman to send a POST request to the /api/publish endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST http://localhost:3000/api/publish \
-H "Content-Type: application/json" \
-d '{"topic": "test-topic", "message": "Hello Kafka!"}'

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Consume Messages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Send a GET request to the /api/subscribe endpoint to start consuming messages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl http://localhost:3000/api/subscribe

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see the consumed messages logged in the console.&lt;/p&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2o8qf3nawh2i3rypn9n8.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%2F2o8qf3nawh2i3rypn9n8.png" alt="terminal test" width="800" height="311"&gt;&lt;/a&gt;&lt;/p&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F03beq1jyasn08qp5q4je.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%2F03beq1jyasn08qp5q4je.png" alt="kafka topic" width="800" height="738"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stopping Services&lt;/strong&gt;&lt;br&gt;
To stop all Docker services, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose down

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Troubleshooting&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kafka Broker Connection Issues: Ensure the KAFKA_BROKERS in .env matches the broker address in docker-compose.yml (e.g., broker:29092).&lt;/li&gt;
&lt;li&gt;Port Conflicts: Ensure the ports defined in docker-compose.yml (e.g., 9092, 29092, 9021) are not in use by other applications.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
This project simplifies the process of setting up Kafka with Docker Compose and integrating it with a Node.js application. Whether you're a beginner or an experienced developer, this repository provides a solid foundation for building real-time data streaming applications.&lt;br&gt;
If you're looking to dive into Kafka and Node.js, this project is a great place to start. Try it out, and let us know your thoughts in the comments below!&lt;/p&gt;

</description>
      <category>kafka</category>
      <category>microservices</category>
      <category>webdev</category>
      <category>docker</category>
    </item>
    <item>
      <title>🚀 Set Up RabbitMQ with MQTT and Management UI Using Docker</title>
      <dc:creator>Mahmud Ibrahim</dc:creator>
      <pubDate>Tue, 13 May 2025 09:04:52 +0000</pubDate>
      <link>https://dev.to/rafi021/set-up-rabbitmq-with-mqtt-and-management-ui-using-docker-m7o</link>
      <guid>https://dev.to/rafi021/set-up-rabbitmq-with-mqtt-and-management-ui-using-docker-m7o</guid>
      <description>&lt;p&gt;RabbitMQ is a powerful message broker that supports multiple protocols, including &lt;strong&gt;AMQP&lt;/strong&gt; and &lt;strong&gt;MQTT&lt;/strong&gt;. If you’re building event-driven microservices or IoT-based apps, having RabbitMQ locally with MQTT support is extremely useful.&lt;/p&gt;

&lt;p&gt;In this guide, you’ll learn how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spin up RabbitMQ using Docker&lt;/li&gt;
&lt;li&gt;Enable the Management UI&lt;/li&gt;
&lt;li&gt;Add MQTT protocol support&lt;/li&gt;
&lt;li&gt;Test both MQTT and AMQP pub/sub functionality via terminal scripts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s dive in!&lt;/p&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjucy1b4h4ysxsmxcirrn.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%2Fjucy1b4h4ysxsmxcirrn.png" alt="rabbitmq" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Prerequisites
&lt;/h3&gt;

&lt;p&gt;Before you start, make sure you have the following installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Docker Compose&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;jq&lt;/code&gt; for parsing JSON (used in the subscriber script)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install &lt;code&gt;jq&lt;/code&gt; on Ubuntu:&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 &lt;span class="nb"&gt;install &lt;/span&gt;jq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🧱 Step 1: Docker Compose Setup
&lt;/h3&gt;

&lt;p&gt;Create a file called &lt;code&gt;rabbitmq-docker-compose.yml&lt;/code&gt; and paste in the following configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;services:
  &lt;span class="c"&gt;# RabbitMQ&lt;/span&gt;
  rabbitmq:
    image: rabbitmq:4-management
    container_name: rabbitmq
    restart: unless-stopped
    ports:
      - &lt;span class="s2"&gt;"15672:15672"&lt;/span&gt; &lt;span class="c"&gt;# RabbitMQ Management UI&lt;/span&gt;
      - &lt;span class="s2"&gt;"5672:5672"&lt;/span&gt; &lt;span class="c"&gt;# RabbitMQ AMQP&lt;/span&gt;
    environment:
      RABBITMQ_HOST: &lt;span class="s1"&gt;'%'&lt;/span&gt;
      RABBITMQ_DEFAULT_USER: user
      RABBITMQ_DEFAULT_PASS: root
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq
    networks:
      - rabbitmq_network
    healthcheck:
      &lt;span class="nb"&gt;test&lt;/span&gt;:
        - CMD
        - rabbitmq-diagnostics
        - &lt;span class="s1"&gt;'-q'&lt;/span&gt;
        - ping
      retries: 3
      &lt;span class="nb"&gt;timeout&lt;/span&gt;: 5s
      interval: 30s

volumes:
  rabbitmq_data:
    driver: &lt;span class="nb"&gt;local

&lt;/span&gt;networks:
  rabbitmq_network:
    driver: bridge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🚀 Step 2: Launch the RabbitMQ Container
&lt;/h3&gt;

&lt;p&gt;Run the following command to spin up the service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose &lt;span class="nt"&gt;-f&lt;/span&gt; rabbitmq-docker-compose.yml up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify that it’s 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 should see the RabbitMQ container up and listening on ports 5672, 15672, and 1883.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌐 Step 3: Access the RabbitMQ Management UI
&lt;/h3&gt;

&lt;p&gt;Open your browser and visit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http://localhost:15672
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Log in with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Username:&lt;/strong&gt; &lt;code&gt;user&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password:&lt;/strong&gt; &lt;code&gt;root&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’ll get a full dashboard with queues, exchanges, bindings, and users.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔌 Step 4: Enable MQTT Plugin
&lt;/h3&gt;

&lt;p&gt;RabbitMQ supports MQTT through its plugin system. To enable it:&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; rabbitmq rabbitmq-plugins &lt;span class="nb"&gt;enable &lt;/span&gt;rabbitmq_mqtt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify that it’s enabled:&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; rabbitmq rabbitmq-plugins list | &lt;span class="nb"&gt;grep &lt;/span&gt;mqtt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see output 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;&lt;span class="o"&gt;[&lt;/span&gt;E&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; rabbitmq_mqtt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔄 Step 5: Test MQTT with Mosquitto
&lt;/h3&gt;

&lt;h3&gt;
  
  
  ✅ Install Mosquitto Clients
&lt;/h3&gt;

&lt;p&gt;On Ubuntu:&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 &lt;span class="nb"&gt;install &lt;/span&gt;mosquitto-clients
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation. Open a new terminal and type the command to publish a message&lt;/p&gt;

&lt;p&gt;📤 Publish a Message&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mosquitto_pub &lt;span class="nt"&gt;-h&lt;/span&gt; localhost &lt;span class="nt"&gt;-p&lt;/span&gt; 1883 &lt;span class="nt"&gt;-t&lt;/span&gt; test_mqtt &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Hello, MQTT!"&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; user &lt;span class="nt"&gt;-P&lt;/span&gt; root
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📥 Subscribe to a Topic
&lt;/h3&gt;

&lt;p&gt;In a second terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mosquitto_sub &lt;span class="nt"&gt;-h&lt;/span&gt; localhost &lt;span class="nt"&gt;-p&lt;/span&gt; 1883 &lt;span class="nt"&gt;-t&lt;/span&gt; test_mqtt &lt;span class="nt"&gt;-u&lt;/span&gt; user &lt;span class="nt"&gt;-P&lt;/span&gt; root
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Hello, MQTT!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🖥️ Step 6: Test AMQP Pub/Sub (Optional Bash Scripts)
&lt;/h3&gt;

&lt;p&gt;You can also test RabbitMQ’s core AMQP protocol using &lt;code&gt;publisher.sh&lt;/code&gt; and &lt;code&gt;subscriber.sh&lt;/code&gt; scripts.&lt;/p&gt;

&lt;p&gt;🖋 Sample &lt;code&gt;publisher.sh&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;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nv"&gt;RABBITMQ_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;
&lt;span class="nv"&gt;RABBITMQ_PASS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"root"&lt;/span&gt;
&lt;span class="nv"&gt;RABBITMQ_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"localhost"&lt;/span&gt;
&lt;span class="nv"&gt;QUEUE_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"test_queue"&lt;/span&gt;

&lt;span class="c"&gt;# Declare the queue&lt;/span&gt;
curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RABBITMQ_USER&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$RABBITMQ_PASS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; PUT &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"auto_delete":false,"durable":true}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"http://&lt;/span&gt;&lt;span class="nv"&gt;$RABBITMQ_HOST&lt;/span&gt;&lt;span class="s2"&gt;:15672/api/queues/%2F/&lt;/span&gt;&lt;span class="nv"&gt;$QUEUE_NAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Publish messages every 5 seconds&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nv"&gt;MESSAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Hello, RabbitMQ, This is a message from docker compose! &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RABBITMQ_USER&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$RABBITMQ_PASS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;properties&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:{},&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;routing_key&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt;$QUEUE_NAME&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;payload&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt;$MESSAGE&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;payload_encoding&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;}"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="s2"&gt;"http://&lt;/span&gt;&lt;span class="nv"&gt;$RABBITMQ_HOST&lt;/span&gt;&lt;span class="s2"&gt;:15672/api/exchanges/%2F/amq.default/publish"&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" [x] Sent '&lt;/span&gt;&lt;span class="nv"&gt;$MESSAGE&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;
  &lt;span class="nb"&gt;sleep &lt;/span&gt;5
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🖋 Sample &lt;code&gt;subscriber.sh&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;&lt;span class="c"&gt;#!/bin/bash  &lt;/span&gt;
&lt;span class="nv"&gt;RABBITMQ_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;
&lt;span class="nv"&gt;RABBITMQ_PASS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"root"&lt;/span&gt;
&lt;span class="nv"&gt;RABBITMQ_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"localhost"&lt;/span&gt;
&lt;span class="nv"&gt;QUEUE_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"test_queue"&lt;/span&gt;

&lt;span class="c"&gt;# Continuously fetch messages from the queue&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nv"&gt;RESPONSE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RABBITMQ_USER&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$RABBITMQ_PASS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"count":1,"ackmode":"ack_requeue_false","encoding":"auto","truncate":50000}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="s2"&gt;"http://&lt;/span&gt;&lt;span class="nv"&gt;$RABBITMQ_HOST&lt;/span&gt;&lt;span class="s2"&gt;:15672/api/queues/%2F/&lt;/span&gt;&lt;span class="nv"&gt;$QUEUE_NAME&lt;/span&gt;&lt;span class="s2"&gt;/get"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Response: &lt;/span&gt;&lt;span class="nv"&gt;$RESPONSE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;MESSAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RESPONSE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.[0].payload'&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="si"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MESSAGE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"null"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MESSAGE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;" [x] Received '&lt;/span&gt;&lt;span class="nv"&gt;$MESSAGE&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;
  &lt;span class="k"&gt;fi

  &lt;/span&gt;&lt;span class="nb"&gt;sleep &lt;/span&gt;1
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;▶️ Make Scripts Executable&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;chmod&lt;/span&gt; +x publisher.sh subscriber.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run them in separate terminals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./publisher.sh  
./subscriber.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft419kcjm3c7ro0gu1sg6.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%2Ft419kcjm3c7ro0gu1sg6.png" alt="rabbitmq in functional" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🧯 Step 7: Stop the Service
&lt;/h3&gt;

&lt;p&gt;When you’re done testing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose &lt;span class="nt"&gt;-f&lt;/span&gt; rabbitmq-docker-compose.yml down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Summary
&lt;/h3&gt;

&lt;p&gt;GitHub Link: &lt;a href="https://github.com/rafi021/rabbitmq-message-broker-docker-compose" rel="noopener noreferrer"&gt;https://github.com/rafi021/rabbitmq-message-broker-docker-compose&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Youtube : &lt;a href="https://youtu.be/Wld_qudiTeo" rel="noopener noreferrer"&gt;https://youtu.be/Wld_qudiTeo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You’ve now set up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RabbitMQ with MQTT and AMQP support&lt;/li&gt;
&lt;li&gt;A web-based Management UI&lt;/li&gt;
&lt;li&gt;Pub/Sub testing with both MQTT clients and bash scripts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This local setup is great for developing event-driven backends, IoT systems, or microservices without relying on cloud infrastructure.&lt;/p&gt;

&lt;p&gt;If you found this helpful, consider bookmarking or sharing it with your team.&lt;/p&gt;

</description>
      <category>eventdriven</category>
      <category>pubsub</category>
      <category>microservices</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🚀 Set Up Redis with RedisInsight Using Docker for Local Development</title>
      <dc:creator>Mahmud Ibrahim</dc:creator>
      <pubDate>Tue, 13 May 2025 07:48:34 +0000</pubDate>
      <link>https://dev.to/rafi021/set-up-redis-with-redisinsight-using-docker-for-local-development-3gci</link>
      <guid>https://dev.to/rafi021/set-up-redis-with-redisinsight-using-docker-for-local-development-3gci</guid>
      <description>&lt;h3&gt;
  
  
  🚀 Set Up Redis with RedisInsight Using Docker for Local Development
&lt;/h3&gt;

&lt;p&gt;Redis is a high-performance in-memory data store, widely used for caching, pub/sub, queues, and more. When working locally, inspecting what’s happening inside Redis can be difficult without a user-friendly UI.&lt;/p&gt;

&lt;p&gt;That’s where &lt;strong&gt;RedisInsight&lt;/strong&gt; comes in — an official Redis GUI that helps you visualize and manage your Redis instance.&lt;/p&gt;

&lt;p&gt;In this tutorial, we’ll use &lt;strong&gt;Docker Compose&lt;/strong&gt; to spin up a Redis container and a RedisInsight UI side-by-side for your local development setup.&lt;/p&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F790sluzccu2uy5yj6nnh.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%2F790sluzccu2uy5yj6nnh.png" alt="redis" width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Prerequisites
&lt;/h3&gt;

&lt;p&gt;Make sure you have the following tools installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Docker Compose&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These work across Linux, macOS, and Windows.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠 Step-by-Step Setup
&lt;/h3&gt;

&lt;h3&gt;
  
  
  📁 Step 1: Create a project directory
&lt;/h3&gt;

&lt;p&gt;Open your terminal and run:&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;redis-docker-setup  
&lt;span class="nb"&gt;cd &lt;/span&gt;redis-docker-setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📝 Step 2: Create the &lt;code&gt;docker-compose.yml&lt;/code&gt; file
&lt;/h3&gt;

&lt;p&gt;Now, inside this folder, create a file named &lt;code&gt;docker-compose.yml&lt;/code&gt; and paste the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;services:
  &lt;span class="c"&gt;#redis&lt;/span&gt;
  redis:
    image: redis:alpine
    container_name: redis
    restart: unless-stopped
    ports:
      - &lt;span class="s2"&gt;"6379:6379"&lt;/span&gt;
    volumes:
      - redis-data:/data
    networks:
      - redis-network
    healthcheck:
      &lt;span class="nb"&gt;test&lt;/span&gt;:
        - CMD
        - redis-cli
        - ping
      retries: 3
      &lt;span class="nb"&gt;timeout&lt;/span&gt;: 5s
  &lt;span class="c"&gt;#redis-insight&lt;/span&gt;
  redis-insight:
    image: redis/redisinsight:latest
    container_name: redis-insight
    restart: unless-stopped
    ports:
      - &lt;span class="s2"&gt;"5540:5540"&lt;/span&gt;
    volumes:
      - redis-insight-data:/data
    networks:
      - redis-network
    depends_on:
      - redis

volumes:
  redis-data:
    driver: &lt;span class="nb"&gt;local
  &lt;/span&gt;redis-insight-data:
    driver: &lt;span class="nb"&gt;local
&lt;/span&gt;networks:
  redis-network:
    driver: bridge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🚀 Step 3: Run the containers
&lt;/h3&gt;

&lt;p&gt;In your terminal, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&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;Docker will pull the latest Redis and RedisInsight images and start both containers.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Step 4: Open RedisInsight in your browser
&lt;/h3&gt;

&lt;p&gt;Once the containers are running, navigate to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http://localhost:5540
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihvh67bsjl8kb2ntw6ts.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%2Fihvh67bsjl8kb2ntw6ts.png" alt="redisinsight" width="721" height="911"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check the recommended settings and also check the terms &amp;amp; conditions switch, and then hit the “Submit” button.&lt;/p&gt;

&lt;p&gt;RedisInsight will launch in your browser. It may ask you to add a Redis database. Just enter and then hit Add Database:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Host&lt;/strong&gt;: &lt;code&gt;redis&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port&lt;/strong&gt;: &lt;code&gt;6379&lt;/code&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F58h8eb4o3csfmo2gx3rd.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%2F58h8eb4o3csfmo2gx3rd.png" alt="redisinsight login" width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RedisInsight will connect to your Redis instance running in Docker.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔄 More: Redis Persistence
&lt;/h3&gt;

&lt;p&gt;We’ve enabled persistence in Redis using:&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;command&lt;/span&gt;: &lt;span class="se"&gt;\[&lt;/span&gt;&lt;span class="s2"&gt;"redis-server"&lt;/span&gt;, &lt;span class="s2"&gt;"--appendonly"&lt;/span&gt;, &lt;span class="s2"&gt;"yes"&lt;/span&gt;&lt;span class="se"&gt;\]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures that Redis data is stored on disk (in the &lt;code&gt;redis-data&lt;/code&gt; volume), not just in-memory, which is perfect for dev environments where data loss during restarts is a concern.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧼 Step 5: Tear down the containers (optional)
&lt;/h3&gt;

&lt;p&gt;To stop and remove the containers and associated volumes:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔚 Conclusion
&lt;/h3&gt;

&lt;p&gt;GitHub Link: &lt;a href="https://github.com/rafi021/redis-redisinsight-docker-compose" rel="noopener noreferrer"&gt;https://github.com/rafi021/redis-redisinsight-docker-compose&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Youtube: &lt;a href="https://youtu.be/C7c08gENGLI" rel="noopener noreferrer"&gt;https://youtu.be/C7c08gENGLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using Docker Compose, you can set up a complete Redis stack with RedisInsight in seconds — no local installation, no config headaches. This is ideal for developers working with caching layers, pub/sub systems, or simply learning Redis.&lt;/p&gt;

&lt;p&gt;If you found this article helpful, feel free to bookmark it or share it with your team!&lt;/p&gt;

&lt;p&gt;Would you like a similar setup tutorial for RabbitMQ, MongoDB Compass, or PostgreSQL with Adminer? Let me know!&lt;/p&gt;

</description>
      <category>redis</category>
      <category>redisinsight</category>
      <category>docker</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🚀 Set Up PostgreSQL and Adminer Using Docker for Local Web Development</title>
      <dc:creator>Mahmud Ibrahim</dc:creator>
      <pubDate>Tue, 13 May 2025 07:44:04 +0000</pubDate>
      <link>https://dev.to/rafi021/set-up-postgresql-and-adminer-using-docker-for-local-web-development-104m</link>
      <guid>https://dev.to/rafi021/set-up-postgresql-and-adminer-using-docker-for-local-web-development-104m</guid>
      <description>&lt;p&gt;Setting up a local database environment for development shouldn’t be a hassle. Whether you’re building microservices or monolithic applications, Docker makes it incredibly easy to run PostgreSQL and Adminer locally without polluting your host system.&lt;/p&gt;

&lt;p&gt;In this article, you’ll learn how to use Docker Compose to spin up a PostgreSQL container along with Adminer — a lightweight and powerful database management tool, often considered a simpler alternative to pgAdmin.&lt;/p&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foxlfzr5s6og58fy8vmfb.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%2Foxlfzr5s6og58fy8vmfb.png" alt="postgresql and admin" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PostgreSql and Adminer using Docker Compose&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Prerequisites
&lt;/h3&gt;

&lt;p&gt;Before we begin, make sure you have the following installed on your machine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Docker Compose&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tools work on Windows, macOS, and Linux.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠 Step-by-Step Setup Guide
&lt;/h3&gt;

&lt;h3&gt;
  
  
  📁 Step 1: Create a project folder
&lt;/h3&gt;

&lt;p&gt;Open your terminal and run the following:&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;postgres-docker-setup  
&lt;span class="nb"&gt;cd &lt;/span&gt;postgres-docker-setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will be the root folder for your setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Step 2: Create the &lt;code&gt;docker-compose.yml&lt;/code&gt; file
&lt;/h3&gt;

&lt;p&gt;Inside the folder, create a file named &lt;code&gt;docker-compose.yml&lt;/code&gt; and paste the following content:&lt;br&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:
  &lt;span class="c"&gt;# PostgreSQL&lt;/span&gt;
  postgres:
    image: postgres:17
    container_name: postgres
    restart: unless-stopped
    ports:
      - &lt;span class="s2"&gt;"5432:5432"&lt;/span&gt;
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      PGPASSWORD: admin
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin
      POSTGRES_DB: mydb
    networks:
      - postgres-network
  &lt;span class="c"&gt;#adminer&lt;/span&gt;
  adminer:
    image: adminer:5.2.1
    container_name: adminer
    restart: unless-stopped
    ports:
      - &lt;span class="s2"&gt;"8080:8080"&lt;/span&gt;
    environment:
      ADMINER_DEFAULT_SERVER: postgres
    networks:
      - postgres-network

networks:
  postgres-network:
    driver: bridge

volumes:
  postgres-data:
    driver: &lt;span class="nb"&gt;local&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;What this does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sets up a PostgreSQL container with a custom user and password.&lt;/li&gt;
&lt;li&gt;Persist your data using a Docker volume.&lt;/li&gt;
&lt;li&gt;Launches Adminer for easy database access via your browser.&lt;/li&gt;
&lt;li&gt;Exposes PostgreSQL on port &lt;code&gt;5432&lt;/code&gt; and Adminer on port &lt;code&gt;8080&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🚀 Step 3: Launch the containers
&lt;/h3&gt;

&lt;p&gt;In the terminal, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&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;Docker will download the required images and start the containers in the background.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Step 4: Access Adminer in the browser
&lt;/h3&gt;

&lt;p&gt;Go to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http://localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fill in the login form like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;System&lt;/strong&gt;: PostgreSQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server&lt;/strong&gt;: postgres&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Username&lt;/strong&gt;: admin&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password&lt;/strong&gt;: admin&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: mydb&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpxe7hf0q2pxdgy37c214.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%2Fpxe7hf0q2pxdgy37c214.png" alt="adminer login page" width="721" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once logged in, you’ll have full access to your PostgreSQL database through a friendly interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧼 Step 5: Stop and clean up (optional)
&lt;/h3&gt;

&lt;p&gt;To shut everything down and remove the volumes:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔚 Conclusion
&lt;/h3&gt;

&lt;p&gt;GitHub Link: &lt;a href="https://github.com/rafi021/postgresql-adminer-docker-compose" rel="noopener noreferrer"&gt;https://github.com/rafi021/postgresql-adminer-docker-compose&lt;/a&gt;&lt;br&gt;&lt;br&gt;
YouTube: &lt;a href="https://youtu.be/P1u-OtVz96c" rel="noopener noreferrer"&gt;https://youtu.be/P1u-OtVz96c&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With just a single YAML file and a couple of terminal commands, you can have a fully functional PostgreSQL environment for local development. Adminer provides an elegant way to browse and manage your data without having to install extra software on your machine.&lt;/p&gt;

&lt;p&gt;If this guide helped you, consider bookmarking it or leaving a comment. Would you like to see similar Docker-based setups for MongoDB, Redis, or Elasticsearch? Let me know!&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>adminer</category>
      <category>docker</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🚀 How to Set Up MySQL and phpMyAdmin Using Docker for Local Web Development</title>
      <dc:creator>Mahmud Ibrahim</dc:creator>
      <pubDate>Tue, 13 May 2025 07:40:17 +0000</pubDate>
      <link>https://dev.to/rafi021/how-to-set-up-mysql-and-phpmyadmin-using-docker-for-local-web-development-2804</link>
      <guid>https://dev.to/rafi021/how-to-set-up-mysql-and-phpmyadmin-using-docker-for-local-web-development-2804</guid>
      <description>&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjzzjd4aku11u3b1uo0te.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%2Fjzzjd4aku11u3b1uo0te.png" alt="mysql, phpmyadmin" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MySQL and phpMyAdmin using Docker Compose&lt;/p&gt;

&lt;p&gt;As a web developer, having a reliable and isolated environment for your database is crucial. Instead of installing MySQL and phpMyAdmin directly on your system, Docker allows you to set up both tools in containers — quickly, cleanly, and consistently across different projects.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll walk through running &lt;strong&gt;MySQL&lt;/strong&gt; with &lt;strong&gt;phpMyAdmin&lt;/strong&gt; using &lt;strong&gt;Docker Compose&lt;/strong&gt;. This setup is perfect for local development and works seamlessly across Windows, macOS, and Linux.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Prerequisites
&lt;/h3&gt;

&lt;p&gt;Before we begin, make sure you have the following installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Docker Compose&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠 Step-by-Step Guide
&lt;/h3&gt;

&lt;h3&gt;
  
  
  📁 Step 1: Create a Project Directory
&lt;/h3&gt;

&lt;p&gt;Open your terminal and create a new directory for your Docker setup:&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;mysql-docker-setup  
&lt;span class="nb"&gt;cd &lt;/span&gt;mysql-docker-setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📝 Step 2: Create a &lt;code&gt;docker-compose.yml&lt;/code&gt; File
&lt;/h3&gt;

&lt;p&gt;Inside the project directory, create a file named &lt;code&gt;docker-compose.yml&lt;/code&gt; and paste the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;services:
  &lt;span class="c"&gt;#db&lt;/span&gt;
  db:
    image: &lt;span class="s1"&gt;'mysql/mysql-server:8.0'&lt;/span&gt;
    container_name: mysql
    restart: unless-stopped
    ports:
      - &lt;span class="s1"&gt;'3306:3306'&lt;/span&gt;
    volumes:
      - mysqldata:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ROOT_HOST: &lt;span class="s1"&gt;'%'&lt;/span&gt;
      MYSQL_DATABASE: mydb
      MYSQL_USER: user
      MYSQL_PASSWORD: root
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
    networks:
      - mysql-network
    healthcheck:
      &lt;span class="nb"&gt;test&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"CMD"&lt;/span&gt;, &lt;span class="s2"&gt;"mysqladmin"&lt;/span&gt;, &lt;span class="s2"&gt;"ping"&lt;/span&gt;, &lt;span class="s2"&gt;"-h"&lt;/span&gt;, &lt;span class="s2"&gt;"localhost"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
      interval: 10s
      &lt;span class="nb"&gt;timeout&lt;/span&gt;: 5s
      retries: 3
  &lt;span class="c"&gt;#phpmyadmin&lt;/span&gt;
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    restart: unless-stopped
    ports:
      - &lt;span class="s1"&gt;'8080:80'&lt;/span&gt;
    environment:
      PMA_HOST: db
      PMA_PORT: 3306
      PMA_USER: user
      PMA_PASSWORD: root
    depends_on:
      - db
    networks:
      - mysql-network

networks:
  mysql-network:
    driver: bridge

volumes:
  mysqldata:
    driver: &lt;span class="nb"&gt;local&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This configuration does the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sets up a MySQL 8 container with user &lt;code&gt;user&lt;/code&gt; and password &lt;code&gt;root&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Persist data using a Docker volume&lt;/li&gt;
&lt;li&gt;Connects phpMyAdmin to MySQL for easy GUI access via your browser&lt;/li&gt;
&lt;li&gt;Exposes MySQL on port &lt;code&gt;3306&lt;/code&gt; and phpMyAdmin on port &lt;code&gt;8080&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Step 3: Start the Containers
&lt;/h3&gt;

&lt;p&gt;In the terminal, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&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;Docker will download the necessary images and start both containers in the background.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Step 4: Access phpMyAdmin
&lt;/h3&gt;

&lt;p&gt;Once the containers are running, open your browser and go to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http://localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Log in using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Username&lt;/strong&gt;: &lt;code&gt;user&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password&lt;/strong&gt;: &lt;code&gt;root&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You should now see the phpMyAdmin interface connected to your MySQL database!&lt;/p&gt;

&lt;h3&gt;
  
  
  🧼 Step 5: Stop and Remove Containers (Optional)
&lt;/h3&gt;

&lt;p&gt;When you’re done, you can stop and remove everything with:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  🧩 Conclusion
&lt;/h3&gt;

&lt;p&gt;Github Link: &lt;a href="https://github.com/rafi021/mysql-phpmyadmin-docker-compose" rel="noopener noreferrer"&gt;https://github.com/rafi021/mysql-phpmyadmin-docker-compose&lt;/a&gt;&lt;br&gt;
Youtube: &lt;a href="https://youtu.be/lkR__D9NEYc" rel="noopener noreferrer"&gt;https://youtu.be/lkR__D9NEYc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using Docker for local database development is a game-changer. It keeps your environment clean, reproduces setups, and saves time across projects. With just one YAML file and a couple of commands, you’re ready to build and test apps using MySQL with a GUI frontend like phpMyAdmin.&lt;/p&gt;

&lt;p&gt;Let me know in the comments if you’d like to see a similar guide for PostgreSQL, MongoDB, or other services!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🚀 Set Up MongoDB with Mongo Express Using Docker for Local Development</title>
      <dc:creator>Mahmud Ibrahim</dc:creator>
      <pubDate>Tue, 13 May 2025 07:36:44 +0000</pubDate>
      <link>https://dev.to/rafi021/set-up-mongodb-with-mongo-express-using-docker-for-local-development-1ocm</link>
      <guid>https://dev.to/rafi021/set-up-mongodb-with-mongo-express-using-docker-for-local-development-1ocm</guid>
      <description>&lt;p&gt;MongoDB is a powerful NoSQL database widely used in modern applications. When building full-stack apps locally, it’s helpful to pair MongoDB with a lightweight admin interface, and &lt;strong&gt;Mongo Express&lt;/strong&gt; is the perfect fit.&lt;/p&gt;

&lt;p&gt;In this guide, you’ll learn how to spin up &lt;strong&gt;MongoDB&lt;/strong&gt; with &lt;strong&gt;Mongo Express&lt;/strong&gt; using Docker Compose. No native installs, no config nightmares — just containers working together like magic.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Prerequisites
&lt;/h3&gt;

&lt;p&gt;To follow along, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Docker Compose&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This setup works on &lt;strong&gt;Windows&lt;/strong&gt;, &lt;strong&gt;macOS&lt;/strong&gt;, and &lt;strong&gt;Linux&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠 Step-by-Step Setup Guide
&lt;/h3&gt;

&lt;h3&gt;
  
  
  📁 Step 1: Create your project directory
&lt;/h3&gt;

&lt;p&gt;Open your terminal and run:&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;mongo-docker-setup  
&lt;span class="nb"&gt;cd &lt;/span&gt;mongo-docker-setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📝 Step 2: Create the &lt;code&gt;docker-compose.yml&lt;/code&gt; file
&lt;/h3&gt;

&lt;p&gt;Inside the folder, create a file named &lt;code&gt;docker-compose.yml&lt;/code&gt; and paste this content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;services:
  &lt;span class="c"&gt;# MongoDB&lt;/span&gt;
  mongodb:
    image: mongodb/mongodb-community-server:latest
    container_name: mongodb
    ports:
      - &lt;span class="s2"&gt;"27017:27017"&lt;/span&gt;
    volumes:
      - mongodb_data:/data/db
    environment:
      - &lt;span class="nv"&gt;MONGO_INITDB_ROOT_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;user
      - &lt;span class="nv"&gt;MONGO_INITDB_ROOT_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;root
    networks:
      - mongodb_network
    healthcheck:
      &lt;span class="nb"&gt;test&lt;/span&gt;:
        - CMD
        - mongosh
        - &lt;span class="s1"&gt;'mongodb://localhost:27017/admin'&lt;/span&gt;
        - &lt;span class="s1"&gt;'--eval=db.runCommand({ ping: 1 })'&lt;/span&gt;
      retries: 3
      &lt;span class="nb"&gt;timeout&lt;/span&gt;: 5s
  &lt;span class="c"&gt;# Mongo Express&lt;/span&gt;
  mongo-express:
    image: mongo-express:latest
    container_name: mongo-express
    restart: unless-stopped
    ports:
      - &lt;span class="s2"&gt;"8081:8081"&lt;/span&gt;
    environment:
      ME_CONFIG_MONGODB_SERVER: mongodb
      ME_CONFIG_MONGODB_ADMINUSERNAME: user
      ME_CONFIG_MONGODB_ADMINPASSWORD: root
      ME_CONFIG_MONGODB_ENABLE_ADMIN: &lt;span class="s2"&gt;"true"&lt;/span&gt;
    depends_on:
      - mongodb
    networks:
      - mongodb_network

networks:
  mongodb_network:
    driver: bridge

volumes:
  mongodb_data:
    driver: &lt;span class="nb"&gt;local&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔍 What This Does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sets up a MongoDB server with a root username/password.&lt;/li&gt;
&lt;li&gt;Stores data persistently using a Docker volume.&lt;/li&gt;
&lt;li&gt;Launches Mongo Express as a web-based GUI for your database.&lt;/li&gt;
&lt;li&gt;Connects the two services over a Docker bridge network.&lt;/li&gt;
&lt;li&gt;Exposes ports &lt;code&gt;27017&lt;/code&gt; for MongoDB and &lt;code&gt;8081&lt;/code&gt; for Mongo Express.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Step 3: Start the containers
&lt;/h3&gt;

&lt;p&gt;Run 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 compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will pull the necessary images and start both services in the background.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Step 4: Access Mongo Express
&lt;/h3&gt;

&lt;p&gt;Once the services are up, visit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http://localhost:8081
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(If you see not found page, then run the following command in the terminal)&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; mongodb mongosh &lt;span class="nt"&gt;--username&lt;/span&gt; user &lt;span class="nt"&gt;--password&lt;/span&gt; root &lt;span class="nt"&gt;--authenticationDatabase&lt;/span&gt; admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Credential for Admin Login: admin/pass&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl3yvu3kkfbpcqd9vjghi.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%2Fl3yvu3kkfbpcqd9vjghi.png" alt="mongo-express login page" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You’ll see the Mongo Express dashboard, where you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Browse databases&lt;/li&gt;
&lt;li&gt;Create collections&lt;/li&gt;
&lt;li&gt;Add, edit, or delete documents&lt;/li&gt;
&lt;li&gt;Run queries using MongoDB syntax&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Login is automatic because the credentials are already passed through environment variables.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧼 Step 5: Stop and clean up (optional)
&lt;/h3&gt;

&lt;p&gt;To stop and remove everything:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This stops the services and removes the volumes (i.e., your MongoDB data will be wiped).&lt;/p&gt;

&lt;h3&gt;
  
  
  🔚 Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Github Link: &lt;a href="https://github.com/rafi021/mongodb-mongo-express-docker-compose" rel="noopener noreferrer"&gt;https://github.com/rafi021/mongodb-mongo-express-docker-compose&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Youtube: &lt;a href="https://youtu.be/Dj-tQg_srxM" rel="noopener noreferrer"&gt;https://youtu.be/Dj-tQg_srxM&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With just a few lines of Docker Compose, you’ve created a full MongoDB development environment — complete with a UI for browsing and managing data. No need to install MongoDB locally or mess with GUIs. Just run, develop, and enjoy!&lt;/p&gt;

&lt;p&gt;If you found this guide useful, consider sharing it with your team. Want to see similar Docker setups for Redis, PostgreSQL, RabbitMQ, or Elasticsearch? Let me know in the comments!&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>docker</category>
      <category>microservices</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🚀 Docker ব্যবহার করে লোকাল মেশিনে PostgreSQL এবং Adminer সেটআপ করুন</title>
      <dc:creator>Mahmud Ibrahim</dc:creator>
      <pubDate>Tue, 13 May 2025 06:50:41 +0000</pubDate>
      <link>https://dev.to/rafi021/docker-bybhaar-kre-lokaal-meshine-postgresql-ebn-adminer-settaap-krun-m5h</link>
      <guid>https://dev.to/rafi021/docker-bybhaar-kre-lokaal-meshine-postgresql-ebn-adminer-settaap-krun-m5h</guid>
      <description>&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foxlfzr5s6og58fy8vmfb.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%2Foxlfzr5s6og58fy8vmfb.png" alt="postgresql,adminer and docker" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;একজন ওয়েব ডেভেলপার হিসেবে ডেটাবেস নিয়ে কাজ করা প্রতিদিনের বিষয়। PostgreSQL একটি শক্তিশালী রিলেশনাল ডাটাবেস, আর Adminer একটি lightweight GUI টুল, যেটা আপনি pgAdmin -এর বিকল্প হিসেবে ব্যবহার করতে পারেন।&lt;/p&gt;

&lt;p&gt;Docker ব্যবহার করে আপনি PostgreSQL ও Adminer খুব সহজেই লোকাল এনভায়রনমেন্টে ব্যবহার করতে পারবেন, আলাদা কোনো সফটওয়্যার ইনস্টল ছাড়াই। চলুন দেখে নিই কিভাবে করবেন সেটআপ।&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ পূর্বশর্ত
&lt;/h3&gt;

&lt;p&gt;নিচের সফটওয়্যারগুলো আপনার সিস্টেমে থাকতে হবে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Docker&lt;/li&gt;
&lt;li&gt;  Docker Compose&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠 Step by Step Guide
&lt;/h3&gt;

&lt;h3&gt;
  
  
  📁 ধাপ ১: একটি ফোল্ডার তৈরি করুন
&lt;/h3&gt;

&lt;p&gt;টার্মিনালে গিয়ে নিচের কমান্ডগুলো রান করুন:&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;postgres-docker-setup  
&lt;span class="nb"&gt;cd &lt;/span&gt;postgres-docker-setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📝 ধাপ ২: &lt;code&gt;docker-compose.yml&lt;/code&gt; ফাইল তৈরি করুন
&lt;/h3&gt;

&lt;p&gt;নতুন একটি ফাইল তৈরি করুন &lt;code&gt;docker-compose.yml&lt;/code&gt; নামে এবং নিচের YAML কনফিগারেশনটি পেস্ট করুন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;services:
  &lt;span class="c"&gt;# PostgreSQL&lt;/span&gt;
  postgres:
    image: postgres:17
    container_name: postgres
    restart: unless-stopped
    ports:
      - &lt;span class="s2"&gt;"5432:5432"&lt;/span&gt;
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      PGPASSWORD: admin
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin
      POSTGRES_DB: mydb
    networks:
      - postgres-network
  &lt;span class="c"&gt;#adminer&lt;/span&gt;
  adminer:
    image: adminer:5.2.1
    container_name: adminer
    restart: unless-stopped
    ports:
      - &lt;span class="s2"&gt;"8080:8080"&lt;/span&gt;
    environment:
      ADMINER_DEFAULT_SERVER: postgres
    networks:
      - postgres-network

networks:
  postgres-network:
    driver: bridge

volumes:
  postgres-data:
    driver: &lt;span class="nb"&gt;local&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই কনফিগারেশনটি যা করে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  PostgreSQL ডাটাবেস কনটেইনার সেট করে&lt;/li&gt;
&lt;li&gt;  ডাটাবেজ ডেটা সংরক্ষণের জন্য Docker ভলিউম ব্যবহার করে&lt;/li&gt;
&lt;li&gt;  Adminer GUI ইন্টারফেস চালায়, যাতে আপনি GUI দিয়ে ডাটাবেস দেখতে ও ম্যানেজ করতে পারেন&lt;/li&gt;
&lt;li&gt;  PostgreSQL-কে 5432 পোর্টে এবং Adminer-কে 8080 পোর্টে এক্সপোজ করে&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 ধাপ ৩: কনটেইনার চালু করুন
&lt;/h3&gt;

&lt;p&gt;টার্মিনালে নিচের কমান্ডটি চালান:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&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;Docker ইমেজগুলো ডাউনলোড করে কনটেইনারগুলো চালু করে দিবে ব্যাকগ্রাউন্ডে।&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ ধাপ ৪: Adminer এক্সেস করুন
&lt;/h3&gt;

&lt;p&gt;ব্রাউজারে যান:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http://localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;লগইন Information:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;System&lt;/strong&gt;: PostgreSQL&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Server&lt;/strong&gt;: postgres&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Username&lt;/strong&gt;: admin&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Password&lt;/strong&gt;: admin&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Database&lt;/strong&gt;: mydb&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpxe7hf0q2pxdgy37c214.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%2Fpxe7hf0q2pxdgy37c214.png" alt="adminer login page" width="721" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;এখন আপনি Adminer GUI ব্যবহার করে PostgreSQL ডাটাবেসে কাজ করতে পারবেন!&lt;/p&gt;

&lt;h3&gt;
  
  
  🧼 ধাপ ৫: বন্ধ ও রিমুভ করুন (ঐচ্ছিক)
&lt;/h3&gt;

&lt;p&gt;সব শেষ হলে আপনি নিচের কমান্ড দিয়ে কনটেইনার বন্ধ ও ভলিউম ডিলিট করতে পারেন:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔚 উপসংহার
&lt;/h3&gt;

&lt;p&gt;GitHub Link: &lt;a href="https://github.com/rafi021/postgresql-adminer-docker-compose" rel="noopener noreferrer"&gt;https://github.com/rafi021/postgresql-adminer-docker-compose&lt;/a&gt;&lt;br&gt;
YouTube: &lt;a href="https://youtu.be/P1u-OtVz96c" rel="noopener noreferrer"&gt;https://youtu.be/P1u-OtVz96c&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PostgreSQL এবং Adminer লোকাল মেশিনে Docker দিয়ে চালানো খুব সহজ, দ্রুত এবং ক্লিন। আপনি ডাটাবেস টেস্টিং, ডেভেলপমেন্ট বা মাইগ্রেশন — যেকোনো কিছুতে এটি ব্যবহার করতে পারেন।&lt;/p&gt;

&lt;p&gt;এই গাইডটি আপনাকে সহায়ক মনে হলে কমেন্টে জানান — আমরা MongoDB, Redis কিংবা Elasticsearch নিয়েও গাইড বানাতে পারি!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>postgres</category>
      <category>docker</category>
      <category>adminer</category>
    </item>
    <item>
      <title>🚀 লোকাল ওয়েব ডেভেলপমেন্টের জন্য Docker ব্যবহার করে MySQL এবং phpMyAdmin সেটআপ করুন</title>
      <dc:creator>Mahmud Ibrahim</dc:creator>
      <pubDate>Tue, 13 May 2025 06:44:33 +0000</pubDate>
      <link>https://dev.to/rafi021/lokaal-oyyeb-ddebhelpmentter-jny-docker-bybhaar-kre-mysql-ebn-phpmyadmin-settaap-krun-2hgg</link>
      <guid>https://dev.to/rafi021/lokaal-oyyeb-ddebhelpmentter-jny-docker-bybhaar-kre-mysql-ebn-phpmyadmin-settaap-krun-2hgg</guid>
      <description>&lt;h3&gt;
  
  
  🚀 লোকাল ওয়েব ডেভেলপমেন্টের জন্য Docker ব্যবহার করে MySQL এবং phpMyAdmin সেটআপ করুন
&lt;/h3&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjzzjd4aku11u3b1uo0te.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%2Fjzzjd4aku11u3b1uo0te.png" alt="mysql, phpmyadmin and docker" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;একজন ওয়েব ডেভেলপার হিসেবে ডাটাবেসের জন্য নির্ভরযোগ্য ও আলাদা একটি এনভায়রনমেন্ট খুবই গুরুত্বপূর্ণ। MySQL ও phpMyAdmin সরাসরি সিস্টেমে ইনস্টল করার বদলে, Docker ব্যবহার করে আপনি এই টুলগুলো কনটেইনারে রান করতে পারেন — দ্রুত এবং প্রত্যেক প্রজেক্টে একইভাবে।&lt;/p&gt;

&lt;p&gt;এই গাইডে, আমরা দেখাবো কিভাবে Docker Compose ব্যবহার করে &lt;strong&gt;MySQL&lt;/strong&gt; এবং &lt;strong&gt;phpMyAdmin&lt;/strong&gt; লোকাল মেশিনে Steup করবেন। এটা সব ধরনের অপারেটিং সিস্টেমে — Windows, macOS, Linux কাজ করবে।&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Requirement
&lt;/h3&gt;

&lt;p&gt;এই টিউটোরিয়াল শুরুর আগে নিশ্চিত করুন যে আপনার মেশিনে নিচের সফটওয়্যারগুলো ইনস্টল আছে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Docker&lt;/li&gt;
&lt;li&gt;  Docker Compose&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠 ধাপে ধাপে গাইড
&lt;/h3&gt;

&lt;h3&gt;
  
  
  📁 ধাপ ১: একটি প্রজেক্ট ফোল্ডার তৈরি করুন
&lt;/h3&gt;

&lt;p&gt;টার্মিনালে নিচের কমান্ড রান করুন:&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;mysql-docker-setup  
&lt;span class="nb"&gt;cd &lt;/span&gt;mysql-docker-setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📝 ধাপ ২: &lt;code&gt;docker-compose.yml&lt;/code&gt; ফাইল তৈরি করুন
&lt;/h3&gt;

&lt;p&gt;এই ফোল্ডারের ভিতরে &lt;code&gt;docker-compose.yml&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:
  &lt;span class="c"&gt;#db&lt;/span&gt;
  db:
    image: &lt;span class="s1"&gt;'mysql/mysql-server:8.0'&lt;/span&gt;
    container_name: mysql
    restart: unless-stopped
    ports:
      - &lt;span class="s1"&gt;'3306:3306'&lt;/span&gt;
    volumes:
      - mysqldata:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ROOT_HOST: &lt;span class="s1"&gt;'%'&lt;/span&gt;
      MYSQL_DATABASE: mydb
      MYSQL_USER: user
      MYSQL_PASSWORD: root
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
    networks:
      - mysql-network
    healthcheck:
      &lt;span class="nb"&gt;test&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"CMD"&lt;/span&gt;, &lt;span class="s2"&gt;"mysqladmin"&lt;/span&gt;, &lt;span class="s2"&gt;"ping"&lt;/span&gt;, &lt;span class="s2"&gt;"-h"&lt;/span&gt;, &lt;span class="s2"&gt;"localhost"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
      interval: 10s
      &lt;span class="nb"&gt;timeout&lt;/span&gt;: 5s
      retries: 3
  &lt;span class="c"&gt;#phpmyadmin&lt;/span&gt;
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    restart: unless-stopped
    ports:
      - &lt;span class="s1"&gt;'8080:80'&lt;/span&gt;
    environment:
      PMA_HOST: db
      PMA_PORT: 3306
      PMA_USER: user
      PMA_PASSWORD: root
    depends_on:
      - db
    networks:
      - mysql-network

networks:
  mysql-network:
    driver: bridge

volumes:
  mysqldata:
    driver: &lt;span class="nb"&gt;local&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;এই কনফিগারেশনটি যা করে:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  একটি MySQL 8 কনটেইনার সেট উপ করে&lt;/li&gt;
&lt;li&gt;  ডাটাবেজ ডেটা সংরক্ষণের জন্য Docker ভলিউম ব্যবহার করে&lt;/li&gt;
&lt;li&gt;  phpMyAdmin GUI এর মাধ্যমে MySQL ম্যানেজ করা যায়&lt;/li&gt;
&lt;li&gt;  MySQL এর জন্য 3306 এবং phpMyAdmin এর জন্য 8080 পোর্ট ওপেন করে&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 ধাপ ৩: কনটেইনার চালু করুন
&lt;/h3&gt;

&lt;p&gt;টার্মিনালে কমান্ড দিন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&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;Docker প্রয়োজনীয় ইমেজগুলো ডাউনলোড করবে এবং কনটেইনার চালু করবে।&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ ধাপ ৪: phpMyAdmin ব্যবহার করুন
&lt;/h3&gt;

&lt;p&gt;ব্রাউজারে যান:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http://localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;লগইন করুন:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Username&lt;/strong&gt;: &lt;code&gt;user&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Password&lt;/strong&gt;: &lt;code&gt;root&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;এখন আপনি phpMyAdmin ইন্টারফেস দেখতে পারবেন!&lt;/p&gt;

&lt;h3&gt;
  
  
  🧼 ধাপ ৫: কনটেইনার বন্ধ ও রিমুভ করুন (Optional)
&lt;/h3&gt;

&lt;p&gt;যদি কাজ শেষ হয়ে যায়, কনটেইনার বন্ধ করতে নিচের কমান্ড দিন:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose down &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔚 উপসংহার
&lt;/h3&gt;

&lt;p&gt;GitHub Link: &lt;a href="https://github.com/rafi021/mysql-phpmyadmin-docker-compose" rel="noopener noreferrer"&gt;https://github.com/rafi021/mysql-phpmyadmin-docker-compose&lt;/a&gt;&lt;br&gt;&lt;br&gt;
YouTube: &lt;a href="https://youtu.be/lkR__D9NEYc" rel="noopener noreferrer"&gt;https://youtu.be/lkR__D9NEYc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docker দিয়ে লোকাল ডাটাবেস ডেভেলপমেন্ট করা খুবই সহজ। মাত্র একটি YAML ফাইল ও কয়েকটি কমান্ডেই আপনি তৈরি করে ফেলতে পারেন একটি সম্পূর্ণ ডাটাবেস Environment। এখন আপনি সহজেই MySQL এবং phpMyAdmin ব্যবহার করে আপনার অ্যাপের ডাটাবেজ অংশ ডেভেলপ করতে পারেন।&lt;/p&gt;

&lt;p&gt;কমেন্টে জানান, আপনি PostgreSQL বা MongoDB এর জন্য এরকম গাইড চান কিনা!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>mysql</category>
      <category>phpmyadmin</category>
      <category>php</category>
    </item>
  </channel>
</rss>
