داکردواپسسرور

چگونه برنامه‌های گرافیکی (GUI) را با داکر و Caddy اجرا و از راه دور دسترسی پیدا کنیم؟

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

با ترکیب noVNC و TigerVNC، می‌توانید برنامه‌های دسکتاپ دبیان را داخل یک کانتینر داکر اجرا کرده و تنها از طریق یک مرورگر وب (بدون نیاز به نصب هیچ نرم‌افزار جانبی) به آن‌ها دسترسی داشته باشید. همچنین، اجرای برنامه روی سرور ابری پارمین کلود به شما این امکان را می‌دهد که از منابع پردازشی و سخت‌افزاری قوی‌تر سرور بهره‌مند شوید.

در این آموزش، قصد داریم نرم‌افزار مدیریت ایمیل Mozilla Thunderbird را داخل داکر دبیان ۱۲ کانتینری کرده و سپس با استفاده از وب‌سرور Caddy، امنیت و دسترسی وب آن را تأمین کنیم.

در پایان این راهنما، شما می‌توانید از هر دستگاهی (حتی موبایل یا تبلت) به مرورگر خود وصل شده و با Thunderbird کار کنید. همچنین به‌صورت اختیاری می‌توانید از طریق پروتکل WebDAV به فایل‌های داخل کانتینر دسترسی داشته باشید.

پیش‌نیازها

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

  1. یک سرور ابری با سیستم‌عامل دبیان ۱۲ (Debian 12) در پارمین کلود (پیشنهاد می‌شود حداقل ۲ گیگابایت رم و ۴ گیگابایت فضای ذخیره‌سازی داشته باشد).

  2. یک کاربر غیر root با دسترسی‌های sudo.

  3. نصب بودن داکر (Docker) روی سرور.

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

  • کلید GPG داکر: [https://docker-ce.parmincloud.ir/gpg](https://docker-ce.parmincloud.ir/gpg)

  • آدرس مخزن (Repo): [https://docker-ce.parmincloud.ir/](https://docker-ce.parmincloud.ir/)

گام اول — پیکربندی مدیر فرآیند (supervisord)

از آنجا که کانتینر شما شامل چند سرویس هم‌زمان (سرور گرافیکی، مرورگر وب، مدیریت پنجره و خود برنامه) است، به یک ابزار مدیریت فرآیند نیاز داریم. برای این کار از 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

[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

[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

[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

[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

این بخش‌ها چه کاری انجام می‌دهند؟

  • [supervisord]: گزینه nodaemon=true باعث می‌شود فرآیند اصلی در foreground داکر باقی بماند و کانتینر خاموش نشود.

  • [program:x11]: اجراکننده TigerVNC است که محیط نمایش گرافیکی (X11 Display) را روی پورتی ایزوله ایجاد می‌کند.

  • [program:easy-novnc]: یک ابزار سبک است که پروتکل VNC را به WebSocket تبدیل می‌کند تا در مرورگر قابل نمایش باشد. پارامتر resize=remote باعث می‌شود رزولوشن برنامه به‌طور خودکار با اندازه پنجره مرورگر شما تنظیم شود.

  • [program:openbox]: مدیر پنجره‌ها (Window Manager) است تا محیط دارای کلیدهای کم/بزرگ کردن پنجره و نوار عنوان باشد.

  • [program:app]: اجرای خود نرم‌افزار Thunderbird روی نمایشگر مجازی :0.

گام دوم — تنظیم منوی OpenBox

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

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

اکنون فایل اصلی ساخت ایمیج کانتینر را ایجاد می‌کنیم. نسخه پایدار Debian 12 (Bookworm) و میرورهای داخلی پارمین کلود را برای این مرحله تنظیم کرده‌ایم.

Bash

nano ~/thunderbird/Dockerfile

کد زیر را درون آن کپی کنید:

Dockerfile

# مرحله ۱: ساخت easy-novnc با استفاده از Golang و میرورهای پارمین کلود
FROM hub.cr.parmincloud.ir/library/golang:1.22-bookworm AS easy-novnc-build
WORKDIR /src

# تنظیم میرور Go و ساخت برنامه
RUN go env -w GOPROXY=https://goproxy.cn,direct && \
    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 hub.cr.parmincloud.ir/library/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"]

فایل را ذخیره کرده و ببندید.

گام چهارم — ساخت و اجرای کانتینر

اکنون ایمیج را ساخته و یک شبکه‌ی داخلی به همراه Volume برای ماندگاری اطلاعات ایمیل‌ها ایجاد می‌کنیم:

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 می‌سازیم.

یک پوشه جدید به نام caddy ایجاد کنید:

Bash

mkdir ~/caddy
cd ~/caddy
nano ~/caddy/Dockerfile

کدهای زیر را درون Dockerfile جدید قرار دهید:

Dockerfile

FROM hub.cr.parmincloud.ir/library/golang:1.22-bookworm AS caddy-build
WORKDIR /src
RUN go env -w GOPROXY=https://goproxy.cn,direct && \
    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-20220622150308-0fc28259b36d' >> go.mod

RUNecho '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 hub.cr.parmincloud.ir/library/debian:bookworm

RUN apt-get update -y && \
    apt-get install -y --no-install-recommends gosu && \
    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

محتوای زیر را اضافه کنید:

Code snippet

{
    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 /* {
        {$APP_USERNAME} {$APP_PASSWORD_HASH}
    }
}

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

ایمیج Caddy را بسازید:

Bash

docker build -t thunderbird-caddy .

حالا یک رمز عبور قوی انتخاب کرده و عبارت زیر را اجرا کنید تا هش هش‌افزوده آن تولید شود (به‌جای mypass رمز دلخواه را بنویسید):

Bash

docker run --rm -it thunderbird-caddy caddy hash-password --plaintext 'mypass'

خروجی این دستور یک عبارت هش‌شده مانند $2a$14$... خواهد بود. آن را کپی کنید.

در نهایت کانتینر وب را اجرا کنید (مقدار 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

گام ششم — تست و ورود به برنامه

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

http://SERVER_IP:8080

  1. نام کاربری و رمز عبوری که در لایه Caddy تعریف کردید را وارد کنید.

  2. صفحه easy-noVNC ظاهر می‌شود؛ روی Connect کلیک کنید.

  3. محیط گرافیکی Thunderbird به‌صورت کامل و واکنش‌گرا (Responsive) در مرورگر شما بارگذاری می‌شود!

دسترسی به فایل‌ها:

  • برای مدیریت و دانلود فایل‌های کانتینر از طریق وب، آدرس http://SERVER_IP:8080/files/ را باز کنید.

  • برای متصل کردن دیسک به‌صورت WebDAV روی ویندوز یا لینوکس، می‌توانید از آدرس http://SERVER_IP:8080/webdav/ استفاده نمایید.

جمع‌بندی

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

این ساختار پایه فوق‌العاده‌ای است و می‌توانید به جای Thunderbird، نرم‌افزارهای دیگری مانند GIMP (ویرایشگر تصویر)، Wine (برای اجرای نرم‌افزارهای ویندوزی) یا Cutter را روی سرورهای ابری پارمین کلود پیاده‌سازی و اجرا نمایید.

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

نوشته های مشابه

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

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

دکمه بازگشت به بالا