اوبنتوداکرسرور

آموزش اجرای برنامه‌های گرافیکی (GUI) در داکر و دسترسی از راه دور با Caddy در اوبونتو ۲۴.۰۴

با وجود رشد روزافزون سرویس‌های ابری، هنوز هم نیاز به اجرای برنامه‌های نیتیو (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 روی سرورهای ابری پارمین کلود کاملاً قابل تعمیم و کاربردی است.

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

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

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

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

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