
با وجود رشد روزافزون سرویسهای ابری، هنوز هم نیاز به اجرای برنامههای نیتیو (Native) و دسکتاپ وجود دارد. با استفاده از ترکیب noVNC و TigerVNC، میتوانید نرمافزارهای دسکتاپ را داخل یک کانتینر داکر اجرا کرده و تنها با استفاده از یک مرورگر وب به آنها دسترسی داشته باشید. این کار به شما اجازه میدهد برنامههای سنگین را روی یک سرور ابری با منابع بالا اجرا کنید و از هر دستگاهی (حتی موبایل یا تبلت) به آن متصل شوید.
در این آموزش، قصد داریم نرمافزار مدیریت ایمیل Mozilla Thunderbird را داخل داکر کانتینری کنیم. سپس با استفاده از وبسرور Caddy، امنیت آن را تأمین کرده و دسترسی تحت وب و WebDAV را برای آن فراهم سازیم.
پیشنیازها
برای شروع این آموزش به موارد زیر نیاز دارید:
-
یک سرور ابری اوبونتو ۲۴.۰۴ (Ubuntu 24.04 LTS) در پارمین کلود با حداقل ۲ گیگابایت رم و ۴ گیگابایت فضای ذخیرهسازی.
-
کاربر غیر ریشه با دسترسیهای
sudo. -
نصب بودن داکر روی سرور (میتوانید از راهنمای نصب داکر پارمین کلود استفاده کنید).
گام اول — پیکربندی مدیر فرایند Supervisord
از آنجا که کانتینر شما شامل چند بخش مختلف (سرور نمایش، مدیریت پنجرهها، برنامه اصلی و…) است، به یک مدیریتکننده فرایند (Process Manager) نیاز دارید. در این جا از supervisord استفاده میکنیم.
ابتدا پوشهای به نام thunderbird بسازید و وارد آن شوید:
Bash
mkdir ~/thunderbird
cd ~/thunderbird
فایل تنظیمات supervisord.conf را ایجاد کنید:
Bash
nano ~/thunderbird/supervisord.conf
بخش اول تنظیمات را برای پیکربندی عمومی اضافه کنید:
Ini, TOML
[supervisord]
nodaemon=true
pidfile=/tmp/supervisord.pid
logfile=/dev/fd/1
logfile_maxbytes=0
در این بخش nodaemon=true قرار داده شده تا supervisord در پیشزمینه (Foreground) کانتینر باقی بماند.
سپس تنظیمات اجرا و راهاندازی TigerVNC (سرور ترکیبی VNC و X11) را به ادامه فایل اضافه کنید:
Ini, TOML
[program:x11]
priority=0
command=/usr/bin/Xtigervnc -desktop "Thunderbird" -localhost -rfbport 5900 -SecurityTypes None -AlwaysShared -AcceptKeyEvents -AcceptPointerEvents -AcceptSetDesktopSize -SendCutText -AcceptCutText :0
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
اکنون بخش مربوط به easy-novnc را اضافه کنید که وظیفه تبدیل ترافیک VNC به WebSocket برای مرورگر را بر عهده دارد:
Ini, TOML
[program:easy-novnc]
priority=0
command=/usr/local/bin/easy-novnc --addr :8080 --host localhost --port 5900 --no-url-password --novnc-params "resize=remote"
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
حالا OpenBox را بهعنوان مدیر پنجره (Window Manager) به فایل اضافه کنید تا امکان تغییر اندازه پنجرهها و داشتن نوار عنوان فراهم شود:
Ini, TOML
[program:openbox]
priority=1
command=/usr/bin/openbox
environment=DISPLAY=:0
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
در نهایت، دستور اجرای برنامه اصلی (Thunderbird) را اضافه کنید:
Ini, TOML
[program:app]
priority=1
environment=DISPLAY=:0
command=/usr/bin/thunderbird
autorestart=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true
فایل را ذخیره کرده و ببندید.
گام دوم — تنظیم منوی OpenBox
برای اینکه بتوانید در صورت نیاز کلیکراست کرده و برنامههایی مانند ترمینال یا ابزارهای پایش سیستم را باز کنید، فایل menu.xml را بسازید:
Bash
nano ~/thunderbird/menu.xml
محتوای زیر را درون آن قرار دهید:
XML
<?xml version="1.0" encoding="utf-8"?>
<openbox_menu xmlns="http://openbox.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://openbox.org/ file:///usr/share/openbox/menu.xsd">
<menu id="root-menu" label="Openbox 3">
<item label="Thunderbird">
<action name="Execute">
<execute>/usr/bin/thunderbird</execute>
</action>
</item>
<item label="Terminal">
<action name="Execute">
<execute>/usr/bin/x-terminal-emulator</execute>
</action>
</item>
<item label="Htop">
<action name="Execute">
<execute>/usr/bin/x-terminal-emulator -e htop</execute>
</action>
</item>
</menu>
</openbox_menu>
فایل را ذخیره کرده و خارج شوید.
گام سوم — ساخت Dockerfile اصلی
اکنون فایل Dockerfile را ایجاد میکنیم تا تمام بخشها را با پایه سیستمعامل بهروز Debian Bookworm (12) ساختاردهی کند:
Bash
nano ~/thunderbird/Dockerfile
محتوای زیر را داخل فایل بگذارید:
Dockerfile
# مرحله اول: کامپایل easy-novnc
FROM golang:1.22-bookworm AS easy-novnc-build
WORKDIR /src
RUN go mod init build && \
go get github.com/geek1011/easy-novnc@v1.1.0 && \
go build -o /bin/easy-novnc github.com/geek1011/easy-novnc
# مرحله دوم: ایمیج اصلی بر پایه دبیان ۱۲
FROM debian:bookworm
RUN apt-get update -y && \
apt-get install -y --no-install-recommends openbox tigervnc-standalone-server supervisor gosu && \
rm -rf /var/lib/apt/lists/* && \
mkdir -p /usr/share/desktop-directories
RUN apt-get update -y && \
apt-get install -y --no-install-recommends lxterminal nano wget openssh-client rsync ca-certificates xdg-utils htop tar xz-utils gzip bzip2 zip unzip && \
rm -rf /var/lib/apt/lists/*
RUN apt-get update -y && \
apt-get install -y --no-install-recommends thunderbird && \
rm -rf /var/lib/apt/lists/*
COPY --from=easy-novnc-build /bin/easy-novnc /usr/local/bin/
COPY menu.xml /etc/xdg/openbox/
COPY supervisord.conf /etc/
EXPOSE 8080
RUN groupadd --gid 1000 app && \
useradd --home-dir /data --shell /bin/bash --uid 1000 --gid 1000 app && \
mkdir -p /data
VOLUME /data
CMD ["sh", "-c", "chown app:app /data /dev/stdout && exec gosu app supervisord"]
فایل را ذخیره کرده و ببندید.
گام چهارم — ساخت و اجرای کانتینر برنامه
برای ساخت ایمیج و راهاندازی شبکه و ولومهای داده، دستورات زیر را در پوشه ~/thunderbird اجرا کنید:
Bash
# ساخت ایمیج داکر
docker build -t thunderbird .
# ایجاد شبکه اختصاصی
docker network create thunderbird-net
# ایجاد ولوم برای ماندگاری دادهها
docker volume create thunderbird-data
# اجرای کانتینر
docker run --detach --restart=always --volume=thunderbird-data:/data --net=thunderbird-net --name=thunderbird-app thunderbird
گام پنجم — تنظیم وبسرور Caddy برای احراز هویت و WebDAV
برای ایجاد لایه امنیتی و دسترسی فایلها، یک پوشه جدید برای Caddy میسازیم:
Bash
mkdir ~/caddy
cd ~/caddy
nano ~/caddy/Dockerfile
کد زیر را داخل Dockerfile قرار دهید:
Dockerfile
FROM golang:1.22-bookworm AS caddy-build
WORKDIR /src
RUN echo 'module caddy' > go.mod && \
echo 'require github.com/caddyserver/caddy/v2 v2.8.4' >> go.mod && \
echo 'require github.com/mholt/caddy-webdav v0.0.0-20220622150212-3200ed430030' >> go.mod
RUN echo 'package main' > caddy.go && \
echo 'import caddycmd "github.com/caddyserver/caddy/v2/cmd"' >> caddy.go && \
echo 'import _ "github.com/caddyserver/caddy/v2/modules/standard"' >> caddy.go && \
echo 'import _ "github.com/mholt/caddy-webdav"' >> caddy.go && \
echo 'func main() { caddycmd.Main() }' >> caddy.go
RUN go build -o /bin/caddy .
FROM debian:bookworm
RUN apt-get update -y && \
apt-get install -y --no-install-recommends gosu ca-certificates && \
rm -rf /var/lib/apt/lists/*
COPY --from=caddy-build /bin/caddy /usr/local/bin/
COPY Caddyfile /etc/
EXPOSE 8080
RUN groupadd --gid 1000 app && \
useradd --home-dir /data --shell /bin/bash --uid 1000 --gid 1000 app && \
mkdir -p /data
VOLUME /data
WORKDIR /data
CMD ["sh", "-c", "chown app:app /data && exec gosu app /usr/local/bin/caddy run -adapter caddyfile -config /etc/Caddyfile"]
ذخیره کرده و حالا فایل تنظیمات Caddyfile را ایجاد کنید:
Bash
nano ~/caddy/Caddyfile
کدهای زیر را قرار دهید:
Plaintext
{
order webdav last
}
:8080 {
log
root * /data
reverse_proxy thunderbird-app:8080
handle_path /files/* {
file_server browse
}
redir /files /files/
handle /webdav/* {
webdav {
prefix /webdav
}
}
redir /webdav /webdav/
basicauth /* {
{env.APP_USERNAME} {env.APP_PASSWORD_HASH}
}
}
حالا ایمیج Caddy را بسازید:
Bash
docker build -t thunderbird-caddy .
برای هش کردن رمز عبور خود (به جای mypass رمز دلخواه بنویسید) دستور زیر را بزنید:
Bash
docker run --rm -it thunderbird-caddy caddy hash-password -plaintext 'mypass'
خروجی هش شده را کپی کنید. حالا سرویس وبسرور را اجرا کنید (به جای myuser نامکاربری و به جای mypass-hash هش مرحله قبل را بگذارید):
Bash
docker run --detach --restart=always --volume=thunderbird-data:/data --net=thunderbird-net --name=thunderbird-web --env=APP_USERNAME="myuser" --env=APP_PASSWORD_HASH="mypass-hash" --publish=8080:8080 thunderbird-caddy
نکته جهت بهبود سرعت و رفع تحریمها:
اگر قصد دارید داکر روی سرور ابری پارمین کلود با بالاترین سرعت ایمیجها را دانلود کند، میتوانید آدرس میرورهای اختصاصی پارمین کلود را در فایل
/etc/docker/daemon.jsonبهصورت زیر تنظیم کنید:JSON
{ "registry-mirrors": [ "https://hub.cr.parmincloud.ir", "https://ghcr.cr.parmincloud.ir", "https://k8s.cr.parmincloud.ir", "https://quay.cr.parmincloud.ir", "https://gcr.cr.parmincloud.ir" ] }
گام ششم — تست و اتصال به برنامه
۱. مرورگر خود را باز کرده و به آدرس http://your_server_ip:8080 بروید.
۲. نامکاربری و رمزعبور تعیینشده را وارد کرده و روی Connect کلیک کنید.
۳. محیط گرافیکی Thunderbird نمایش داده میشود که بهصورت خودکار با ابعاد مرورگر شما هماهنگ میگردد.
-
دسترسی به فایلها از مرورگر: آدرس
http://your_server_ip:8080/files/ -
اتصال پروتکل WebDAV: آدرس
http://your_server_ip:8080/webdav/
جمعبندی
شما با موفقیت توانستید یک برنامه گرافیکی را داخل کانتینر داکر اجرا کرده و با وبسرور Caddy دسترسی امن تحت وب برای آن فراهم کنید. این روش برای کانتینری کردن سایر نرمافزارهای دسکتاپ لینوکس مانند GIMP، پلتفرمهای مهندسی یا حتی اجرای برنامههای ویندوزی با Wine روی سرورهای ابری پارمین کلود کاملاً قابل تعمیم و کاربردی است.
از همراهی شما با پارمین کلود سپاسگزاریم.




