<?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: Hasan Ali</title>
    <description>The latest articles on DEV Community by Hasan Ali (@hasanaliagar).</description>
    <link>https://dev.to/hasanaliagar</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%2F3717396%2Fb69e9e8e-d4b3-410e-b847-2c4c047b788b.png</url>
      <title>DEV Community: Hasan Ali</title>
      <link>https://dev.to/hasanaliagar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hasanaliagar"/>
    <language>en</language>
    <item>
      <title>Perplexity.ai Nedir?</title>
      <dc:creator>Hasan Ali</dc:creator>
      <pubDate>Mon, 19 Jan 2026 09:32:39 +0000</pubDate>
      <link>https://dev.to/hasanaliagar/perplexityai-nedir-2chb</link>
      <guid>https://dev.to/hasanaliagar/perplexityai-nedir-2chb</guid>
      <description>&lt;h2&gt;
  
  
  Perplexity.ai Nedir?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Google’a soru sorup 10 sekme açmaktan sıkıldıysan, bu yazı senin için.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Bu yazı dev.to okuyucuları için teknik ama keyifli bir dille hazırlanmıştır.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Bir düşün:&lt;br&gt;
Bir şey merak ediyorsun. Google’a yazıyorsun. İlk link reklam, ikinci link SEO şişirmesi, üçüncü link 2017’den kalma… Sonra bir de ChatGPT’ye soruyorsun; güzel anlatıyor ama içinden bir ses diyor ki:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Kaynağı ne bunun?” 🤨&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;İşte &lt;strong&gt;Perplexity.ai&lt;/strong&gt;, tam bu noktada sahneye çıkıyor.&lt;/p&gt;


&lt;h2&gt;
  
  
  🚀 Perplexity.ai Kısaca Nedir?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Perplexity.ai&lt;/strong&gt;, yapay zekâ destekli bir &lt;strong&gt;arama + cevap motoru&lt;/strong&gt;dur.&lt;/p&gt;

&lt;p&gt;Ama klasik bir chatbot değildir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web’de &lt;strong&gt;gerçek zamanlı arama yapar&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Birden fazla kaynağı tarar&lt;/li&gt;
&lt;li&gt;Cevabı &lt;strong&gt;özetleyerek üretir&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Ve en önemlisi: &lt;strong&gt;kaynak gösterir&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yani sana şunu der:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Bu cevabı uydurmadım, bak buradan aldım.”&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🤖 ChatGPT’den Farkı Ne?
&lt;/h2&gt;

&lt;p&gt;Bu kısım çok karışır, netleştirelim.&lt;/p&gt;
&lt;h3&gt;
  
  
  ChatGPT
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Genel bilgi + akıl yürütme&lt;/li&gt;
&lt;li&gt;Uzun sohbetlerde güçlü&lt;/li&gt;
&lt;li&gt;Kod yazma, içerik üretme konusunda çok iyi&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ama çoğu zaman:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web’e çıkmaz&lt;/li&gt;
&lt;li&gt;Kaynak vermez&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Perplexity
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Önce arar, sonra cevaplar&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Araştırma odaklıdır&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cevapların altında:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;linkler&lt;/li&gt;
&lt;li&gt;site isimleri&lt;/li&gt;
&lt;li&gt;bazen birebir alıntılar
bulunur&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ChatGPT = Akıllı anlatıcı&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Perplexity = Kaynaklı araştırmacı&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🧠 Perplexity Perde Arkasında Nasıl Çalışır?
&lt;/h2&gt;

&lt;p&gt;Basitleştirilmiş akış:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Soru sorulur
    ↓
Web araması yapılır
    ↓
İlgili içerikler seçilir
    ↓
LLM ile özetlenir
    ↓
Cevap + kaynaklar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yüzden Perplexity hissiyatı şudur:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Google ama okumayı senin yerine yapıyor.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📚 Neden Adı "Perplexity"?
&lt;/h2&gt;

&lt;p&gt;Kısa bir geek notu 🤓&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Perplexity&lt;/em&gt;, dil modellerinde kullanılan bir metriktir&lt;/li&gt;
&lt;li&gt;Modelin dili ne kadar iyi tahmin ettiğini ölçer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ürün ismi olarak mesaj net:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Kafanı karıştıran soruları sadeleştiriyoruz.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✅ Hangi Sorularda Çok İyi?
&lt;/h2&gt;

&lt;p&gt;Özellikle şu senaryolarda parlıyor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“X nedir?”&lt;/li&gt;
&lt;li&gt;“X ile Y arasındaki fark nedir?”&lt;/li&gt;
&lt;li&gt;“2025’te en iyi … hangisi?”&lt;/li&gt;
&lt;li&gt;“Bu konuda kim ne diyor?”&lt;/li&gt;
&lt;li&gt;Teknik / akademik hızlı araştırmalar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Örnek:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"NestJS neden Fastify ile birlikte tercih ediliyor?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Perplexity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Birden fazla kaynağı tarar&lt;/li&gt;
&lt;li&gt;Artı / eksi yönleri özetler&lt;/li&gt;
&lt;li&gt;Altına referansları koyar&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ❌ Nerelerde İyi Değil?
&lt;/h2&gt;

&lt;p&gt;Her araç her iş için uygun değil:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uzun hikâye yazma&lt;/li&gt;
&lt;li&gt;Yaratıcı metin üretimi&lt;/li&gt;
&lt;li&gt;Derin sistem tasarımı&lt;/li&gt;
&lt;li&gt;Uzun sohbet + kişisel hafıza&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu alanlarda &lt;strong&gt;ChatGPT&lt;/strong&gt; daha güçlü.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 Aslında Perplexity Neyi Temsil Ediyor?
&lt;/h2&gt;

&lt;p&gt;Teknik adıyla:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;RAG (Retrieval Augmented Generation)&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yani:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bilgiyi hafızada tutmak yerine&lt;/li&gt;
&lt;li&gt;Her soruda &lt;strong&gt;gereken bilgiyi bulup&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Onun üzerinden cevap üretmek&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu yaklaşım, modern chatbot mimarilerinin temelidir.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ Chatbot Geliştirenler İçin Ders
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ Mesaj geçmişini taşıma&lt;br&gt;
✅ Gerekli veriyi çıkar ve gönder&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Perplexity’nin yaptığı şey tam olarak budur.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 ChatGPT + Perplexity Birlikte Kullanılır mı?
&lt;/h2&gt;

&lt;p&gt;Kesinlikle &lt;strong&gt;evet&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Perplexity → araştır, kaynak bul, özetle&lt;/li&gt;
&lt;li&gt;ChatGPT → yazıyı güzelleştir, kodu üret, mantığı kur&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Birçok developer bu ikiliyi birlikte kullanıyor.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Akılda Kalması Gereken 3 Nokta
&lt;/h2&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Perplexity = kaynaklı cevap&lt;/strong&gt;&lt;br&gt;
2️⃣ &lt;strong&gt;ChatGPT = üretim ve akıl yürütme&lt;/strong&gt;&lt;br&gt;
3️⃣ &lt;strong&gt;Modern AI sistemleri mesaj değil, bilgi taşır&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Tek Cümlelik Final
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Perplexity.ai, Google’da arayıp okuyacağın şeyi senin yerine okuyup, kaynaklarıyla birlikte özetleyen yapay zekâdır.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>perplexity</category>
      <category>productivity</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>Suno API: Text-to-Music for Developers</title>
      <dc:creator>Hasan Ali</dc:creator>
      <pubDate>Sun, 18 Jan 2026 10:23:09 +0000</pubDate>
      <link>https://dev.to/hasanaliagar/suno-api-text-to-music-for-developers-3c7h</link>
      <guid>https://dev.to/hasanaliagar/suno-api-text-to-music-for-developers-3c7h</guid>
      <description>&lt;h2&gt;
  
  
  What Is the Suno API?
&lt;/h2&gt;

&lt;p&gt;Imagine describing a piece of music in plain English and receiving a complete audio track in return.&lt;/p&gt;

&lt;p&gt;No instruments.&lt;br&gt;&lt;br&gt;
No samples.&lt;br&gt;&lt;br&gt;
No editing timelines.&lt;/p&gt;

&lt;p&gt;Just &lt;strong&gt;text turning into music&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is the core idea behind &lt;strong&gt;Suno&lt;/strong&gt;, and the &lt;strong&gt;Suno API&lt;/strong&gt; is how developers interact with this capability programmatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Suno in Plain Terms
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Suno is an AI-powered music generation platform.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You describe the music you want using natural language — the mood, the tempo, the style — and Suno generates a full track based on that description. Depending on the mode, the output may include instrumental music, vocals, or both.&lt;/p&gt;

&lt;p&gt;The API allows this process to happen &lt;strong&gt;outside of Suno’s user interface&lt;/strong&gt;, making it accessible to software systems and automation tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Exactly Is the Suno API?
&lt;/h2&gt;

&lt;p&gt;The Suno API is a &lt;strong&gt;text-to-music interface&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;From a high-level perspective, it works like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A system sends a text description of music&lt;/li&gt;
&lt;li&gt;An AI model interprets that description&lt;/li&gt;
&lt;li&gt;A music track is generated and returned as an audio asset&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re familiar with other generative AI systems, the concept should feel natural. It’s the same idea as text-to-image or text-to-speech — applied to music.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Developers Are Interested
&lt;/h2&gt;

&lt;p&gt;AI music generation becomes especially powerful when combined with automation and scale.&lt;/p&gt;

&lt;p&gt;Developers explore the Suno API for use cases such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatically generated background music&lt;/li&gt;
&lt;li&gt;Personalized audio experiences&lt;/li&gt;
&lt;li&gt;Creative tools driven by user input&lt;/li&gt;
&lt;li&gt;Content pipelines that require unique, royalty-free music&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this context, music becomes another form of &lt;strong&gt;data&lt;/strong&gt; that software can create, transform, and distribute.&lt;/p&gt;




&lt;h2&gt;
  
  
  Suno in Automation Workflows
&lt;/h2&gt;

&lt;p&gt;Tools like &lt;strong&gt;n8n&lt;/strong&gt; make Suno particularly interesting.&lt;/p&gt;

&lt;p&gt;By connecting Suno to a workflow engine, music generation can be triggered by events:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A scheduled job&lt;/li&gt;
&lt;li&gt;A user submission&lt;/li&gt;
&lt;li&gt;A webhook or external system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The generated audio can then be forwarded, stored, or combined with other media — all without manual steps.&lt;/p&gt;

&lt;p&gt;Suno effectively acts as a &lt;strong&gt;creative service&lt;/strong&gt; inside a larger system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Official vs Unofficial Access
&lt;/h2&gt;

&lt;p&gt;When researching the Suno API, it’s important to note that not all references mean the same thing.&lt;/p&gt;

&lt;p&gt;You’ll generally encounter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Official access provided directly by Suno&lt;/li&gt;
&lt;li&gt;Unofficial or community-built wrappers that interact with Suno indirectly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For anything beyond experimentation, understanding usage rights and limitations is essential.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;AI-generated music signals a broader shift in software development.&lt;/p&gt;

&lt;p&gt;Creativity is becoming programmable.&lt;br&gt;&lt;br&gt;
Audio is joining text and images as a first-class AI output.&lt;/p&gt;

&lt;p&gt;The Suno API sits at this intersection — where engineering meets creative generation — and points toward a future where software doesn’t just process information, but produces experiences.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>music</category>
      <category>api</category>
      <category>automation</category>
    </item>
    <item>
      <title>Run PgBouncer with SCRAM Auth Using Docker</title>
      <dc:creator>Hasan Ali</dc:creator>
      <pubDate>Sun, 18 Jan 2026 08:46:26 +0000</pubDate>
      <link>https://dev.to/hasanaliagar/run-pgbouncer-with-scram-auth-using-docker-158n</link>
      <guid>https://dev.to/hasanaliagar/run-pgbouncer-with-scram-auth-using-docker-158n</guid>
      <description>&lt;p&gt;If you’re running PostgreSQL in production, &lt;strong&gt;PgBouncer&lt;/strong&gt; is almost mandatory for efficient connection pooling.&lt;/p&gt;

&lt;p&gt;This setup runs PgBouncer in Docker &lt;strong&gt;with SCRAM-SHA-256 authentication&lt;/strong&gt;, using the &lt;em&gt;exact password hash stored in Postgres&lt;/em&gt; — no weak MD5 hacks 🚫&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Goal
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;⚡ Add connection pooling for PostgreSQL
&lt;/li&gt;
&lt;li&gt;🔐 Use &lt;strong&gt;SCRAM-SHA-256&lt;/strong&gt; authentication (secure by default)
&lt;/li&gt;
&lt;li&gt;🐳 Run PgBouncer in Docker
&lt;/li&gt;
&lt;li&gt;🌐 Connect services via Docker network
&lt;/li&gt;
&lt;li&gt;🔒 Expose PgBouncer locally only
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧾 Bash Script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
#!/usr/bin/env bash
set -euo pipefail

PGB_INI_PATH="/etc/pgbouncer/pgbouncer.ini"
PGB_USERLIST_PATH="/etc/pgbouncer/userlist.txt"

PG_HOST="postgres"
PG_PORT="5432"
PG_DB="postgres"
PG_USER="admin"

LISTEN_ADDR="0.0.0.0"
LISTEN_PORT="6432"

PGB_CONTAINER="pgbouncer"
PGB_IMAGE="edoburu/pgbouncer:v1.24.1-p1"

mkdir -p "$(dirname "$PGB_INI_PATH")" "$(dirname "$PGB_USERLIST_PATH")"

SCRAM_LINE="$(docker exec -i "$PG_HOST" psql -U "$PG_USER" -d "$PG_DB" -tA -c \
"SELECT '\"' || rolname || '\" \"' || rolpassword || '\"'
 FROM pg_authid
 WHERE rolname = '$PG_USER';" || true)"

if [[ -z "$SCRAM_LINE" ]]; then
  echo "ERROR: failed to fetch SCRAM hash from Postgres"
  exit 1
fi

if ! grep -q 'SCRAM-SHA-256' &amp;lt;&amp;lt;&amp;lt;"$SCRAM_LINE"; then
  echo "ERROR: Postgres password is not SCRAM-SHA-256"
  exit 1
fi

cat &amp;gt; "$PGB_INI_PATH" &amp;lt;&amp;lt;EOF
[databases]
$PG_DB = host=$PG_HOST port=$PG_PORT dbname=$PG_DB

[pgbouncer]
listen_addr = $LISTEN_ADDR
listen_port = $LISTEN_PORT
auth_type = scram-sha-256
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 20
reserve_pool_size = 5
reserve_pool_timeout = 5
log_connections = 1
log_disconnections = 1
log_pooler_errors = 1
ignore_startup_parameters = extra_float_digits
EOF

printf "%s\n" "$SCRAM_LINE" &amp;gt; "$PGB_USERLIST_PATH"

docker run -d \
  --name "$PGB_CONTAINER" \
  --network app-net \
  -p 127.0.0.1:${LISTEN_PORT}:${LISTEN_PORT} \
  -v "$(realpath "$PGB_INI_PATH"):/etc/pgbouncer/pgbouncer.ini:ro" \
  -v "$(realpath "$PGB_USERLIST_PATH"):/etc/pgbouncer/userlist.txt:ro" \
  "$PGB_IMAGE"

echo "PgBouncer is up 🚀"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>pgbouncer</category>
      <category>postgres</category>
      <category>docker</category>
      <category>devops</category>
    </item>
    <item>
      <title>Join a Server to Tailscale Using Docker</title>
      <dc:creator>Hasan Ali</dc:creator>
      <pubDate>Sun, 18 Jan 2026 08:43:11 +0000</pubDate>
      <link>https://dev.to/hasanaliagar/join-a-server-to-tailscale-using-docker-4gga</link>
      <guid>https://dev.to/hasanaliagar/join-a-server-to-tailscale-using-docker-4gga</guid>
      <description>&lt;p&gt;Managing private servers securely doesn’t have to involve VPN gateways or complex firewall rules.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;Tailscale&lt;/strong&gt;, you can drop a server into your private mesh network in minutes — and yes, it works great in Docker 🐳✨&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Goal
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🕸️ Join a server to a Tailscale network
&lt;/li&gt;
&lt;li&gt;🐳 Run Tailscale inside Docker
&lt;/li&gt;
&lt;li&gt;🌐 Use host networking for full access
&lt;/li&gt;
&lt;li&gt;🔐 Authenticate using a Tailscale auth key
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧾 Bash Script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
#!/usr/bin/env bash
set -euo pipefail

CONTAINER="tailscale"
IMAGE="tailscale/tailscale:v1.90.9"
TS_AUTHKEY="tskey-XXXX"

docker run -d \
  --name "$CONTAINER" \
  --network host \
  --cap-add NET_ADMIN \
  --cap-add SYS_MODULE \
  -e TS_AUTHKEY="$TS_AUTHKEY" \
  "$IMAGE"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>tailscale</category>
      <category>docker</category>
      <category>networking</category>
      <category>security</category>
    </item>
    <item>
      <title>Run TimescaleDB with Docker in Minutes</title>
      <dc:creator>Hasan Ali</dc:creator>
      <pubDate>Sun, 18 Jan 2026 08:41:07 +0000</pubDate>
      <link>https://dev.to/hasanaliagar/run-timescaledb-with-docker-in-minutes-2d0m</link>
      <guid>https://dev.to/hasanaliagar/run-timescaledb-with-docker-in-minutes-2d0m</guid>
      <description>&lt;p&gt;Time-series data needs a database that’s fast, reliable, and production-ready.&lt;br&gt;&lt;br&gt;
That’s exactly what &lt;strong&gt;TimescaleDB&lt;/strong&gt; (built on PostgreSQL) is great at 🐘⚡&lt;/p&gt;

&lt;p&gt;In this post, we’ll spin up a &lt;strong&gt;TimescaleDB container&lt;/strong&gt; using a clean Bash script.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Goal
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🐳 Run TimescaleDB in Docker
&lt;/li&gt;
&lt;li&gt;🌐 Attach it to an existing Docker network (&lt;code&gt;app-net&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;💾 Persist data using volumes
&lt;/li&gt;
&lt;li&gt;🔁 Make restarts predictable
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧾 Bash Script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
#!/usr/bin/env bash
set -euo pipefail

DB="postgres"
USER="admin"
PASSWORD="PASSWORD"

CONTAINER="timescaledb"
IMAGE="timescale/timescaledb:2.24.0-pg18"

docker run -d \
  --name "$CONTAINER" \
  --network app-net \
  -e POSTGRES_PASSWORD="$PASSWORD" \
  -e POSTGRES_USER="$USER" \
  -e POSTGRES_DB="$DB" \
  -v timescale_data:/var/lib/postgresql/data \
  "$IMAGE"

echo "TimescaleDB is up 🚀 (image: $IMAGE)"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>timescaledb</category>
      <category>postgres</category>
      <category>docker</category>
      <category>devops</category>
    </item>
    <item>
      <title>Secure Ubuntu Server Setup with Docker</title>
      <dc:creator>Hasan Ali</dc:creator>
      <pubDate>Sun, 18 Jan 2026 08:36:32 +0000</pubDate>
      <link>https://dev.to/hasanaliagar/secure-ubuntu-server-setup-with-docker-ufw-and-fail2ban-5102</link>
      <guid>https://dev.to/hasanaliagar/secure-ubuntu-server-setup-with-docker-ufw-and-fail2ban-5102</guid>
      <description>&lt;p&gt;Before running production workloads, it’s critical to &lt;strong&gt;secure your server&lt;/strong&gt; and install the right foundations.&lt;/p&gt;

&lt;p&gt;This Bash script prepares a fresh &lt;strong&gt;Ubuntu server&lt;/strong&gt; with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker + Docker Compose&lt;/li&gt;
&lt;li&gt;UFW firewall&lt;/li&gt;
&lt;li&gt;Fail2Ban (SSH protection)&lt;/li&gt;
&lt;li&gt;Fish shell (optional but nice 🐟)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎯 What This Script Does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🔄 Updates the system&lt;/li&gt;
&lt;li&gt;🐳 Installs Docker &amp;amp; Docker Compose&lt;/li&gt;
&lt;li&gt;🔐 Secures SSH with UFW + rate limiting&lt;/li&gt;
&lt;li&gt;🚫 Protects against brute-force attacks using Fail2Ban&lt;/li&gt;
&lt;li&gt;🧑‍💻 Improves shell experience with Fish&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧾 Bash Script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
#!/usr/bin/env bash
set -euo pipefail

sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y

sudo apt install -y \
  apt-transport-https \
  ca-certificates \
  curl \
  gnupg \
  software-properties-common \
  ufw \
  fail2ban

curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl enable --now docker
sudo usermod -aG docker "$USER"

sudo apt install -y fish
chsh -s /usr/bin/fish

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw limit OpenSSH
sudo ufw --force enable

sudo tee /etc/fail2ban/jail.local &amp;gt; /dev/null &amp;lt;&amp;lt; 'EOF'
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
banaction = ufw

[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
backend = systemd
EOF

sudo systemctl enable --now fail2ban
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ubuntu</category>
      <category>docker</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>Run Cloudflare Tunnel with Docker in 5 Minutes</title>
      <dc:creator>Hasan Ali</dc:creator>
      <pubDate>Sun, 18 Jan 2026 08:32:50 +0000</pubDate>
      <link>https://dev.to/hasanaliagar/run-cloudflare-tunnel-with-docker-in-5-minutes-hol</link>
      <guid>https://dev.to/hasanaliagar/run-cloudflare-tunnel-with-docker-in-5-minutes-hol</guid>
      <description>&lt;p&gt;No public IP, no port forwarding, no reverse proxy headaches — but you still want to expose your service securely?&lt;/p&gt;

&lt;p&gt;That’s exactly where &lt;strong&gt;Cloudflare Tunnel (cloudflared)&lt;/strong&gt; shines ✨&lt;/p&gt;

&lt;p&gt;In this post, we’ll quickly walk through a &lt;strong&gt;small but powerful Bash script&lt;/strong&gt; that runs Cloudflare Tunnel using Docker.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Goal
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🔒 Keep your server private
&lt;/li&gt;
&lt;li&gt;🌍 Let Cloudflare handle public traffic
&lt;/li&gt;
&lt;li&gt;🐳 Run everything in Docker
&lt;/li&gt;
&lt;li&gt;🎟️ Authenticate using a &lt;strong&gt;Tunnel Token&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧾 Bash Script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
#!/usr/bin/env bash
set -euo pipefail

CONTAINER="cloudflared"
IMAGE="cloudflare/cloudflared:2025.11.1"
TUNNEL_TOKEN="eyJhIjo..."

docker run -d \
  --name "$CONTAINER" \
  --restart unless-stopped \
  --network app-net \
  "$IMAGE" \
  tunnel --no-autoupdate run --token "$TUNNEL_TOKEN"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>cloudflare</category>
      <category>docker</category>
      <category>bash</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
