دسترسی از راه دور به برنامه‌های گرافیکی (GUI) با استفاده از Docker و Caddy در Ubuntu 24.04 و 26.04

مقدمه

بسیاری از برنامه‌های لینوکسی دارای رابط گرافیکی (GUI) هستند و معمولاً برای اجرا نیاز به یک محیط دسکتاپ دارند. اما اگر سرور شما فاقد محیط گرافیکی باشد یا بخواهید بدون نصب Desktop Environment از طریق مرورگر به این برنامه‌ها دسترسی داشته باشید، چه راهکاری وجود دارد؟

یکی از بهترین روش‌ها، اجرای برنامه‌های گرافیکی داخل Docker و انتشار آن‌ها از طریق یک Reverse Proxy مانند Caddy است. در این روش، تنها کافی است مرورگر خود را باز کنید تا بدون نیاز به اتصال Remote Desktop یا VNC، برنامه موردنظر را اجرا کنید.

در این آموزش یاد می‌گیرید چگونه یک برنامه گرافیکی را داخل Docker اجرا کرده و با استفاده از Caddy آن را به‌صورت امن و از طریق HTTPS در اختیار کاربران قرار دهید.

در این مقاله از پارمین کلود (Parmin Cloud) به‌عنوان زیرساخت ابری استفاده می‌کنیم و تمامی مراحل بر اساس Ubuntu 24.04 LTS (و همچنین Ubuntu 26.04) ارائه شده‌اند.


پیش‌نیازها

قبل از شروع، موارد زیر را آماده کنید:

  • یک سرور Ubuntu 24.04 یا Ubuntu 26.04
  • دسترسی کاربر دارای دسترسی sudo
  • یک دامنه که DNS آن به IP سرور اشاره کند.
  • نصب Docker
  • نصب Docker Compose Plugin
  • باز بودن پورت‌های 80 و 443 در فایروال

مرحله اول — نصب Docker از طریق میرور پارمین کلود

ابتدا فهرست بسته‌ها را به‌روزرسانی کنید:

sudo apt update

پیش‌نیازهای Docker را نصب کنید:

sudo apt install ca-certificates curl gnupg -y

کلید GPG پارمین کلود را دریافت کنید:

sudo install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://docker-ce.parmincloud.ir/gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

sudo chmod a+r /etc/apt/keyrings/docker.gpg

اکنون ریپازیتوری Docker پارمین کلود را اضافه کنید:

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://docker-ce.parmincloud.ir \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

فهرست بسته‌ها را دوباره بروزرسانی کنید:

sudo apt update

سپس Docker و افزونه Docker Compose را نصب کنید:

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

از اجرای صحیح Docker مطمئن شوید:

docker --version

همچنین نسخه Docker Compose را بررسی کنید:

docker compose version

در صورت مشاهده شماره نسخه، نصب Docker با موفقیت انجام شده است.


مرحله دوم — نصب و پیکربندی Caddy

در این مرحله، وب‌سرور Caddy را نصب می‌کنیم. وظیفه Caddy این است که درخواست‌های کاربران را دریافت کرده، به کانتینر Docker هدایت کند و همچنین به‌صورت خودکار گواهی SSL از Let’s Encrypt دریافت و تمدید کند.


چرا Caddy؟

در مقایسه با Nginx یا Apache، Caddy چند مزیت مهم دارد:

  • دریافت خودکار گواهی SSL
  • تمدید خودکار گواهی‌ها
  • پیکربندی بسیار ساده
  • Reverse Proxy داخلی
  • پشتیبانی کامل از HTTP/2 و HTTP/3
  • امنیت مناسب به‌صورت پیش‌فرض

به همین دلیل برای انتشار برنامه‌های Docker گزینه‌ای بسیار مناسب محسوب می‌شود.


نصب Caddy

ابتدا فهرست بسته‌ها را به‌روزرسانی کنید:

sudo apt update

سپس Caddy را نصب کنید:

sudo apt install caddy -y

پس از پایان نصب، وضعیت سرویس را بررسی کنید:

systemctl status caddy

اگر خروجی مشابه زیر مشاهده کردید، یعنی سرویس فعال است:

Active: active (running)

فعال شدن خودکار Caddy پس از بوت

برای اینکه بعد از هر بار راه‌اندازی مجدد سرور، Caddy نیز به‌صورت خودکار اجرا شود، دستور زیر را اجرا کنید:

sudo systemctl enable caddy

باز کردن پورت‌های موردنیاز

اگر از UFW استفاده می‌کنید، پورت‌های HTTP و HTTPS را باز کنید:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload

بررسی دامنه

قبل از ادامه، مطمئن شوید دامنه شما به IP سرور اشاره می‌کند.

می‌توانید با دستور زیر این موضوع را بررسی کنید:

dig your-domain.com +short

یا:

nslookup your-domain.com

خروجی باید IP سرور شما باشد.


ساخت فایل تنظیمات Caddy

فایل تنظیمات را باز کنید:

sudo nano /etc/caddy/Caddyfile

ساختار اولیه فایل به شکل زیر خواهد بود:

your-domain.com {

}

در مراحل بعد، تنظیمات Reverse Proxy را داخل همین فایل اضافه خواهیم کرد.


اعمال تنظیمات

پس از هر بار ویرایش فایل Caddyfile، ابتدا صحت تنظیمات را بررسی کنید:

sudo caddy validate --config /etc/caddy/Caddyfile

اگر خطایی وجود نداشت، تنظیمات را بارگذاری کنید:

sudo systemctl reload caddy

مرحله سوم — اجرای برنامه گرافیکی در Docker

اکنون که Docker و Caddy آماده هستند، نوبت به اجرای برنامه گرافیکی داخل یک کانتینر Docker می‌رسد.

در این آموزش از یک ایمیج مبتنی بر LinuxServer استفاده می‌کنیم که امکان اجرای برنامه‌های GUI و دسترسی به آن‌ها از طریق مرورگر را فراهم می‌کند.


ایجاد پوشه پروژه

ابتدا یک پوشه برای فایل‌های پروژه ایجاد کنید:

mkdir ~/gui-app

و وارد آن شوید:

cd ~/gui-app

ایجاد فایل Docker Compose

فایل docker-compose.yml را ایجاد کنید:

nano docker-compose.yml

محتوای زیر را داخل فایل قرار دهید:

services:
  gui:
    image: lscr.io/linuxserver/webtop:ubuntu-kde
    container_name: gui-desktop

    restart: unless-stopped

    security_opt:
      - seccomp:unconfined

    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Tehran

    volumes:
      - ./config:/config

    ports:
      - "3000:3000"

    shm_size: "2gb"

سپس فایل را ذخیره کنید.


آشنایی با تنظیمات

در این فایل چند بخش مهم وجود دارد.

Image

image: lscr.io/linuxserver/webtop:ubuntu-kde

این ایمیج یک دسکتاپ کامل Ubuntu KDE را داخل Docker اجرا می‌کند.


Volumes

volumes:
  - ./config:/config

این مسیر باعث می‌شود تنظیمات برنامه حتی پس از حذف کانتینر نیز حفظ شوند.


Port Mapping

ports:
  - "3000:3000"

برنامه گرافیکی روی پورت 3000 اجرا می‌شود.

در ادامه Caddy درخواست‌های HTTPS را به همین پورت هدایت خواهد کرد.


Restart Policy

restart: unless-stopped

در صورت ریبوت شدن سرور، کانتینر به‌صورت خودکار مجدداً اجرا خواهد شد.


دریافت ایمیج از رجیستری پارمین کلود

اگر ایمیج موردنظر در رجیستری پارمین کلود موجود باشد، بهتر است آن را از میرور پارمین کلود دریافت کنید تا سرعت دانلود افزایش یابد.

برای نمونه:

docker pull hub.cr.parmincloud.ir/linuxserver/webtop:ubuntu-kde

سپس در فایل Compose مقدار image را به شکل زیر تغییر دهید:

image: hub.cr.parmincloud.ir/linuxserver/webtop:ubuntu-kde

در صورتی که ایمیج در میرور موجود نباشد، Docker به‌صورت خودکار آن را از رجیستری اصلی دریافت خواهد کرد.


اجرای کانتینر

اکنون کانتینر را اجرا کنید:

docker compose up -d

بررسی وضعیت کانتینر

برای اطمینان از اجرای صحیح:

docker ps

باید خروجی مشابه زیر مشاهده کنید:

CONTAINER ID
IMAGE
STATUS

gui-desktop
Up

بررسی لاگ‌ها

اگر کانتینر اجرا نشد، لاگ‌ها را بررسی کنید:

docker compose logs -f

این دستور علت خطا را نمایش می‌دهد و معمولاً برای رفع مشکلات بسیار مفید است.


مرحله چهارم — انتشار برنامه گرافیکی با Caddy و فعال‌سازی HTTPS

اکنون کانتینر Docker در حال اجرا است و برنامه گرافیکی روی پورت 3000 در دسترس قرار دارد. در این مرحله، با استفاده از Caddy آن را روی دامنه منتشر می‌کنیم تا کاربران بتوانند از طریق HTTPS به آن دسترسی داشته باشند.


ویرایش فایل Caddyfile

فایل تنظیمات Caddy را باز کنید:

sudo nano /etc/caddy/Caddyfile

فرض کنید دامنه شما به شکل زیر است:

desktop.example.com

فایل را به شکل زیر ویرایش کنید:

desktop.example.com {

    reverse_proxy localhost:3000

    encode gzip

    log

}

در این تنظیمات:

  • تمام درخواست‌های HTTPS به پورت 3000 ارسال می‌شوند.
  • فشرده‌سازی Gzip فعال می‌شود.
  • لاگ درخواست‌ها نیز ثبت خواهد شد.

بررسی صحت تنظیمات

قبل از اعمال تغییرات، فایل را اعتبارسنجی کنید:

sudo caddy validate --config /etc/caddy/Caddyfile

اگر خروجی مشابه زیر بود:

Valid configuration

همه چیز درست است.


بارگذاری تنظیمات جدید

اکنون تنظیمات را اعمال کنید:

sudo systemctl reload caddy

در صورت نیاز می‌توانید سرویس را ریستارت کنید:

sudo systemctl restart caddy

بررسی وضعیت سرویس

برای اطمینان از اجرای صحیح Caddy:

systemctl status caddy

باید وضعیت زیر را مشاهده کنید:

Active: active (running)

دریافت خودکار گواهی SSL

یکی از مهم‌ترین مزیت‌های Caddy این است که نیازی به اجرای Certbot یا دریافت دستی گواهی SSL نیست.

اگر:

  • دامنه به IP سرور اشاره کند.
  • پورت‌های 80 و 443 باز باشند.

Caddy هنگام اولین درخواست، به‌صورت خودکار:

  • گواهی Let’s Encrypt دریافت می‌کند.
  • HTTPS را فعال می‌کند.
  • گواهی را در آینده نیز به‌صورت خودکار تمدید خواهد کرد.

آزمایش سرویس

اکنون مرورگر خود را باز کرده و آدرس زیر را وارد کنید:

https://desktop.example.com

اگر همه مراحل را به‌درستی انجام داده باشید، محیط دسکتاپ لینوکس داخل مرورگر نمایش داده می‌شود.

از این لحظه می‌توانید برنامه‌های گرافیکی را بدون نیاز به Remote Desktop یا VNC اجرا کنید.


بررسی لاگ‌های Caddy

در صورت بروز مشکل، لاگ‌های سرویس را مشاهده کنید:

journalctl -u caddy -f

همچنین لاگ‌های Docker را نیز بررسی کنید:

docker compose logs -f

این دو دستور معمولاً علت اکثر خطاهای احتمالی را مشخص می‌کنند.


مرحله پنجم — نصب برنامه‌های گرافیکی و مدیریت کانتینر

اکنون محیط گرافیکی از طریق مرورگر در دسترس است، اما احتمالاً می‌خواهید نرم‌افزارهای دلخواه خود مانند Firefox، VS Code، LibreOffice یا سایر برنامه‌های لینوکسی را نیز داخل آن اجرا کنید.

در این مرحله با نحوه نصب برنامه‌ها، حفظ اطلاعات و به‌روزرسانی کانتینر آشنا می‌شوید.


ورود به کانتینر

ابتدا وارد کانتینر شوید:

docker exec -it gui-desktop bash

اکنون داخل سیستم‌عامل Ubuntu اجرا شده در Docker قرار دارید.


بروزرسانی بسته‌ها

قبل از نصب هر نرم‌افزار، فهرست بسته‌ها را بروزرسانی کنید:

apt update

در صورت نیاز، بسته‌های نصب‌شده را نیز ارتقا دهید:

apt upgrade -y

نصب برنامه‌های گرافیکی

برای مثال، نصب Firefox:

apt install firefox -y

یا LibreOffice:

apt install libreoffice -y

همچنین می‌توانید ابزارهای موردنیاز توسعه‌دهندگان را نصب کنید:

apt install git curl wget nano vim -y

نصب Visual Studio Code

اگر قصد دارید محیط توسعه کاملی داخل کانتینر داشته باشید، می‌توانید نسخه Linux نرم‌افزار Visual Studio Code را نیز نصب کنید.

در صورت استفاده از مخازن رسمی، مراحل نصب مطابق مستندات VS Code خواهد بود.


نصب مرورگرهای دیگر

در صورت نیاز می‌توانید مرورگرهایی مانند:

  • Chromium
  • Firefox
  • Brave

را نیز نصب کنید.


نگهداری اطلاعات پس از حذف کانتینر

در فایل Compose این بخش را ایجاد کرده بودیم:

volumes:
  - ./config:/config

به کمک Volume، اطلاعات زیر حفظ خواهند شد:

  • تنظیمات کاربران
  • فایل‌های شخصی
  • تنظیمات برنامه‌ها
  • تاریخچه مرورگر
  • فایل‌های Desktop

در نتیجه حتی اگر کانتینر حذف شود، اطلاعات از بین نخواهند رفت.


توقف کانتینر

در صورت نیاز:

docker compose stop

اجرای مجدد

docker compose start

راه‌اندازی مجدد

docker compose restart

توقف و حذف کانتینر

اگر قصد حذف کانتینر را دارید:

docker compose down

دقت کنید که به دلیل استفاده از Volume، اطلاعات ذخیره‌شده همچنان باقی خواهند ماند.


بروزرسانی ایمیج Docker

برای دریافت نسخه جدید ایمیج:

docker compose pull

سپس کانتینر را مجدداً ایجاد کنید:

docker compose up -d

با این روش، بدون نیاز به نصب مجدد نرم‌افزارها یا از دست دادن تنظیمات، از آخرین نسخه ایمیج استفاده خواهید کرد.


بررسی میزان مصرف منابع

برای مشاهده میزان مصرف CPU و RAM کانتینر:

docker stats

این دستور اطلاعاتی مانند:

  • میزان استفاده از CPU
  • حافظه RAM
  • مصرف شبکه
  • میزان خواندن و نوشتن دیسک

را به‌صورت لحظه‌ای نمایش می‌دهد.


مرحله ششم — نکات امنیتی، بهترین روش‌ها و جمع‌بندی

در این مرحله، چند توصیه مهم برای افزایش امنیت و پایداری این سرویس را بررسی می‌کنیم تا بتوانید از آن در محیط‌های عملیاتی (Production) نیز استفاده کنید.


دسترسی را فقط از طریق HTTPS فراهم کنید

اگر از Caddy استفاده می‌کنید، این وب‌سرور به‌صورت خودکار گواهی SSL دریافت کرده و تمام ارتباطات را رمزنگاری می‌کند.

بهتر است کاربران همیشه از آدرس زیر استفاده کنند:

https://desktop.example.com

و از دسترسی مستقیم به پورت داخلی Docker (مانند 3000) جلوگیری شود.


پورت کانتینر را در اینترنت منتشر نکنید

اگر تنها Caddy قرار است به کانتینر متصل شود، نیازی نیست پورت 3000 روی تمام اینترفیس‌های شبکه در دسترس باشد.

به جای:

ports:
  - "3000:3000"

می‌توانید آن را فقط روی لوپ‌بک سیستم منتشر کنید:

ports:
  - "127.0.0.1:3000:3000"

در این حالت، تنها خود سرور به این پورت دسترسی خواهد داشت و تمام کاربران از طریق Caddy به سرویس متصل می‌شوند.


از احراز هویت استفاده کنید

اگر محیط گرافیکی بدون احراز هویت منتشر شود، هر فردی که آدرس دامنه را بداند می‌تواند به آن دسترسی پیدا کند.

بنابراین توصیه می‌شود یکی از روش‌های زیر را پیاده‌سازی کنید:

  • Basic Authentication در Caddy
  • اتصال به سرویس‌های OAuth
  • احراز هویت از طریق Authelia
  • استفاده از سرویس‌های Single Sign-On مانند Keycloak

دسترسی کاربران را محدود کنید

اگر این سرویس فقط برای تیم داخلی یا سازمان شما استفاده می‌شود، بهتر است دسترسی را محدود کنید.

برای مثال می‌توانید:

  • تنها IPهای مشخص را مجاز کنید.
  • از VPN استفاده کنید.
  • دسترسی را پشت Cloudflare Zero Trust یا Tailscale قرار دهید.

به‌روزرسانی منظم ایمیج‌ها

برای جلوگیری از آسیب‌پذیری‌های امنیتی، ایمیج‌های Docker را به‌صورت منظم به‌روزرسانی کنید:

docker compose pull
docker compose up -d

همچنین بهتر است نسخه‌های جدید Docker و Caddy را نیز به‌صورت دوره‌ای نصب کنید.


از اطلاعات خود نسخه پشتیبان تهیه کنید

اگر اطلاعات کاربران داخل Volume ذخیره می‌شود، بهتر است به‌صورت منظم از آن نسخه پشتیبان تهیه کنید.

برای مثال:

tar -czf backup-config.tar.gz config/

در صورت بروز مشکل یا مهاجرت به سرور جدید، می‌توانید این فایل را بازیابی کنید.


مانیتورینگ سرویس

برای بررسی سلامت سرویس، این دستورات کاربردی هستند:

مشاهده وضعیت کانتینر:

docker ps

بررسی مصرف منابع:

docker stats

مشاهده لاگ‌های کانتینر:

docker compose logs -f

مشاهده لاگ‌های Caddy:

journalctl -u caddy -f

استفاده از این ابزارها به شما کمک می‌کند مشکلات احتمالی را سریع‌تر شناسایی و برطرف کنید.


جمع‌بندی

در این آموزش یاد گرفتید چگونه یک برنامه گرافیکی لینوکسی را داخل Docker اجرا کرده و آن را از طریق Caddy روی اینترنت منتشر کنید. این روش، بدون نیاز به نصب محیط دسکتاپ روی سرور یا استفاده از پروتکل‌هایی مانند VNC و Remote Desktop، امکان دسترسی ایمن به برنامه‌های GUI را تنها از طریق مرورگر فراهم می‌کند.

در طول مقاله مراحل زیر را انجام دادیم:

  • نصب Docker روی Ubuntu 24.04 و 26.04 با استفاده از میرورهای پارمین کلود.
  • نصب و پیکربندی Caddy به‌عنوان Reverse Proxy.
  • ایجاد و اجرای یک کانتینر Docker برای اجرای محیط گرافیکی.
  • انتشار سرویس روی دامنه با HTTPS و دریافت خودکار گواهی SSL.
  • نصب و مدیریت برنامه‌های گرافیکی داخل کانتینر.
  • بررسی نکات امنیتی، نگهداری و به‌روزرسانی سرویس.

این معماری برای سناریوهای مختلفی مانند ارائه محیط توسعه تحت وب، اجرای نرم‌افزارهای گرافیکی روی سرور، آزمایش برنامه‌ها، دسترسی از راه دور به ابزارهای لینوکسی و ایجاد دسکتاپ‌های ابری سبک، گزینه‌ای مناسب و منعطف محسوب می‌شود. با رعایت نکات امنیتی و به‌روزرسانی منظم سرویس‌ها، می‌توانید از این راهکار در محیط‌های عملیاتی نیز با اطمینان استفاده کنید.

از همراهی شما با پارمین کلود سپاسگزاریم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

دیدگاهی بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *