مقدمه
بسیاری از برنامههای لینوکسی دارای رابط گرافیکی (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.
- نصب و مدیریت برنامههای گرافیکی داخل کانتینر.
- بررسی نکات امنیتی، نگهداری و بهروزرسانی سرویس.
این معماری برای سناریوهای مختلفی مانند ارائه محیط توسعه تحت وب، اجرای نرمافزارهای گرافیکی روی سرور، آزمایش برنامهها، دسترسی از راه دور به ابزارهای لینوکسی و ایجاد دسکتاپهای ابری سبک، گزینهای مناسب و منعطف محسوب میشود. با رعایت نکات امنیتی و بهروزرسانی منظم سرویسها، میتوانید از این راهکار در محیطهای عملیاتی نیز با اطمینان استفاده کنید.
از همراهی شما با پارمین کلود سپاسگزاریم.
نظرات کاربران