server server .

server

نحوه نصب و استفاده از TimescaleDB در Ubuntu 20.04

بسياري از برنامه ها ، مانند سيستم هاي مانيتورينگ و سيستم هاي جمع آوري داده، اطلاعات را براي تحليل بيشتر جمع مي كنند. اين تجزيه و تحليل ها اغلب به نحوه تغيير يك بخش از داده يا يك سيستم با زمان نگاه مي كنند. در اين موارد ، داده ها به عنوان يك سري زمان نمايش داده مي شوند ، و هر نقطه داده همراه با يك timestamp همراه است. نمونه اي از آن ها به اين صورت است:
2020-06-01 09:00:00 server.cpu.1 0.9
2020-06-01 09:00:00 server.cpu.15 0.8
2020-06-01 09:01:00 server.cpu.1 0.9
2020-06-01 09:01:00 server.cpu.15 0.8

اخيراً به لطف اينترنت اشياء (IoT) و اينترنت صنعتي اشياء، ارتباط داده هاي مجموعه زماني افزايش يافته است. اكنون تعداد بيشتر و بيشتري دستگاه وجود دارد كه اطلاعات مجموعه هاي مختلفي را جمع آوري مي كنند: از جمله ثبت كننده هاي عملكرد ورزشي ، ساعت هاي هوشمند ، ايستگاه هاي خانگي آب و هوا و سنسورهاي مختلف. اين دستگاه ها اطلاعات زيادي را جمع مي كنند و تمام اين داده ها بايد در جايي ذخيره شوند.
بانك هاي اطلاعاتي كلاسيك رابطه اي اغلب براي ذخيره داده ها استفاده مي شود ، اما وقتي صحبت از حجم عظيم داده هاي سري زماني است ، ديگر مناسب نخواهند بود. هنگامي كه نياز به پردازش ميزان زيادي داده هاي مجموعه زماني داريد ، ديتابيس رابطه اي مي تواند خيلي كند باشد. به همين دليل ، بانكهاي اطلاعاتي بهينه سازي شده اي به نام پايگاه داده هاي NoSQL ايجاد شده اند تا از مشكلات پايگاه هاي داده رابطه اي جلوگيري شود.
TimescaleDB يك پايگاه داده منبع باز است كه براي ذخيره داده هاي سري زماني بهينه شده است. اين برنامه به عنوان پسوند PostgreSQL پياده سازي شده است و سهولت استفاده از پايگاه هاي داده رابطه اي و سرعت پايگاه داده هاي NoSQL را تركيب مي كند. در نتيجه ، به شما امكان مي دهد تا از PostgreSQL براي ذخيره داده هاي كاري و داده هاي سري هاي زماني به صورت همزمان استفاده كنيد.
با دنبال كردن اين آموزش ، TimescaleDB را روي Ubuntu 20.04 تنظيم ميكنيد ، آن را پيكربندي كرده و ياد مي گيريد كه چگونه با آن كار كنيد. با ايجاد پايگاه داده هاي سري زماني و ايجاد درخواست هاي ساده اين كار را انجام خواهيد داد. در آخر ، خواهيد ديد كه چگونه داده هاي غير ضروري را حذف كنيد.
پيش نيازها
براي دنبال كردن اين آموزش ، به موارد زير نياز داريد:
يك سرور مجازي Ubuntu 20.04 كه با دنبال كردن راهنماي اوليه راه اندازي سرور مجازي با Ubuntu 20.04 نصب شده باشد، و شامل يك كاربر غير ريشه با امتيازات sudo و فايروال تنظيم شده باشد
PostgreSQL كه بر روي سرور مجازي شما نصب شده باشد. براي نصب و پيكربندي آن ، راهنماي نصب و استفاده از PostgreSQL در Ubuntu 20.04 را دنبال كنيد.
مرحله 1 – نصب TimescaleDB
TimescaleDB در منابع پكيجي پيش فرض Ubuntu در دسترس نيست ، بنابراين در اين مرحله شما آن را از منبع شخص ثالث TimescaleDB نصب خواهيد كرد.
ابتدا يك فايل منبع جديد ايجاد كنيد:
$ sudo add-apt-repository ppa:timescale/timescaledb-ppa

با زدن enter اين عمل را تاييد كنيد:
$ sudo apt update

اكنون مي توانيد مراحل نصب را ادامه دهيد. در اين آموزش از PostgreSQL نسخه 12 استفاده شده است. اگر از نسخه ديگري از PostgreSQL استفاده مي كنيد (به عنوان مثال 11 يا 10) ، مقدار مورد نظر را در دستور زير جايگزين كرده و آن را اجرا كنيد:
$ sudo apt install timescaledb-postgresql-12

توجه: در نسخه بعدي پشتيباني نسخه هاي 9.6.3+ و 10.9+ حذف خواهد شد.
TimescaleDB اكنون نصب شده و آماده استفاده است. در مرحله بعد ، آن را روشن كرده و برخي از تنظيمات مرتبط با آن را در فايل پيكربندي PostgreSQL براي بهينه سازي بانك اطلاعات تنظيم خواهيد كرد.
مرحله 2 – پيكربندي TimescaleDB
ماژول TimescaleDB با تنظيمات پيش فرض پيكربندي PostgreSQL خوب كار مي كند ، اما براي بهبود عملكرد و استفاده بهتر از منابع پردازنده ، حافظه و منابع ديسك ، توسعه دهندگان TimescaleDB پيكربندي برخي پارامترهاي فردي را پيشنهاد مي كنند. اين كار مي تواند به صورت خودكار با ابزار timescaledb-tune يا با ويرايش دستي فايل postgresql.conf سرور مجازي شما انجام شود.
در اين آموزش از ابزار timescaledb-tune استفاده خواهيد كرد. اين ابزار، فايل postgresql.conf را مي خواند و به صورت تعاملي پيشنهاد ايجاد تغييرات را مي دهد.
براي شروع wizard پيكربندي دستور زير را اجرا كنيد:
$ sudo timescaledb-tune
ابتدا از شما خواسته مي شود مسير فايل پيكربندي PostgreSQL را تأييد كنيد:
Output
Using postgresql.conf at this path:
/etc/postgresql/12/main/postgresql.conf

Is this correct? [(y)es/(n)o]:

ابزار به طور خودكار مسير فايل پيكربندي را تشخيص مي دهد ، بنابراين با وارد كردن y اين كار را تأييد كنيد:
Output

Is this correct? [(y)es/(n)o]: y
Writing backup to:
/tmp/timescaledb_tune.backup202005300523

در مرحله بعد از شما خواسته مي شود متغير shared_preload_libraries را تغيير دهيد تا قبل از شروع سرور مجازي PostgreSQL ، ماژول TimescaleDB را دانلود كنيد:
Output
shared_preload_libraries needs to be updated
Current:
#shared_preload_libraries = ”
Recommended:
shared_preload_libraries = ‘timescaledb’
Is this okay? [(y)es/(n)o]:

shared_preload_libraries ليستي از ماژول هاي جدا شده با كاما را به عنوان يك مقدار ميپذيرد و مشخص ميكند كه PostgreSQL بايد قبل از شروع سرور مجازي پايگاه داده كدام ماژول ها را لود كند. با ايجاد اين تغيير ، ماژول timescaledb به آن ليست اضافه مي شود.
سپس ، ماژول TimescaleDB را با تايپ y در اعلان بعدي و فشار دادن ENTER فعال كنيد:
Output

Is this okay? [(y)es/(n)o]: y
success: shared_preload_libraries will be updated

بر اساس ويژگي هاي سرور مجازي خود و نسخه PostgreSQL ، به شما پيشنهاد مي شود تنظيمات خود را انجام دهيد. براي شروع فرآيند تنظيم ، y را فشار دهيد:
Output
Tune memory/parallelism/WAL and other settings? [(y)es/(n)o]: y
Recommendations based on 7.79 GB of available memory and 4 CPUs for PostgreSQL 12

Memory settings recommendations
Current:
shared_buffers = 128MB
#effective_cache_size = 4GB
#maintenance_work_mem = 64MB
#work_mem = 4MB
Recommended:
shared_buffers = 1990MB
effective_cache_size = 5971MB
maintenance_work_mem = 1019114kB
work_mem = 5095kB
Is this okay? [(y)es/(s)kip/(q)uit]:

timescaledb-tune به طور خودكار حافظه موجود سرور مجازي را تشخيص داده و مقادير توصيه شده را براي تنظيمات shared_buffers ، effective_cache_size ، maintenance_work_mem و work_mem محاسبه مي كند.
براي مثال shared_buffers مقدار حافظه اختصاص داده شده براي ذخيره داده ها را تعيين مي كند. به طور پيش فرض ، اين تنظيمات براي طيف وسيع تري از پلتفرم ها نسبتاً كم است ، بنابراين timescaledb-tune ايجاد فضاي بيشتر براي ذخيره اطلاعات مانند جستارهاي مكرر ، افزايش مقدار را پيشنهاد داده است كه استفاده بهتر از منابع را منجر ميشود. متغير work_mem نيز افزايش يافته است تا امكان انواع پيچيده تري را نيز فراهم كند.
اگر مي خواهيد در مورد چگونگي انجام اين كار اطلاعات بيشتري كسب كنيد ، صفحه GitHub را براي ديدن timescaledb-tune چك كنيد.
براي پذيرش مقادير ، y را وارد كنيد:
Output

Is this okay? [(y)es/(s)kip/(q)uit]: y
success: memory settings will be updated

در اين مرحله ، اگر سرور مجازي شما داراي چندين CPU باشد ، توصيه هاي مربوط به تنظيمات موازي سازي را پيدا خواهيد كرد. در حالي كه اگر يك CPU داشته باشيد ، timescaledb-tune با استفاده از جدول زماني شما را مستقيماً به تنظيمات WAL هدايت ميكند.
سرور مجازي هايي كه داراي چندين CPU هستند ، با توصيه هايي مانند اين روبرو مي شوند:
Output
Parallelism settings recommendations
Current:
missing: timescaledb.max_background_workers
#max_worker_processes = 8
#max_parallel_workers_per_gather = 2
#max_parallel_workers = 8
Recommended:
timescaledb.max_background_workers = 8
max_worker_processes = 15
max_parallel_workers_per_gather = 2
max_parallel_workers = 4
Is this okay? [(y)es/(s)kip/(q)uit]:

اين تنظيمات تعداد نيروهايي كه درخواست ها و كارهاي پس زمينه را پردازش مي كنند را تنظيم مي كند. مي توانيد اطلاعات بيشتري در مورد اين تنظيمات را از مطالب TimescaleDB و PostgreSQL كسب كنيد.
y را وارد كنيد و براي پذيرش اين تنظيمات enter بزنيد:
Output

Is this okay? [(y)es/(s)kip/(q)uit]: y
success: parallelism settings will be updated

در مرحله بعد ، توصيه هايي براي Write Ahead Log (WAL) پيدا خواهيد كرد:
Output
WAL settings recommendations
Current:
#wal_buffers = -1
#min_wal_size = 80MB
Recommended:
wal_buffers = 16MB
min_wal_size = 512MB
Is this okay? [(y)es/(s)kip/(q)uit]:

WAL يكپارچگي داده ها را حفظ مي كند ، اما تنظيمات پيش فرض مي تواند باعث عدم كارآيي I / O شود كه عملكرد نوشتن را كند مي كند. براي بهينه سازي اين تنظيمات y را تايپ و وارد كنيد:
Output

Is this okay? [(y)es/(s)kip/(q)uit]: y
success: WAL settings will be updated

اكنون چند توصيه متفرقه خواهيد ديد:
Output
Miscellaneous settings recommendations
Current:
#default_statistics_target = 100
#random_page_غير مجاز مي باشدt = 4.0
#checkpoint_completion_target = 0.5
#max_locks_per_transaction = 64
#autovacuum_max_workers = 3
#autovacuum_naptime = 1min
#effective_io_concurrency = 1
Recommended:
default_statistics_target = 500
random_page_غير مجاز مي باشدt = 1.1
checkpoint_completion_target = 0.9
max_locks_per_transaction = 64
autovacuum_max_workers = 10
autovacuum_naptime = 10
effective_io_concurrency = 200
Is this okay? [(y)es/(s)kip/(q)uit]:

تمام اين پارامترهاي مختلف با هدف افزايش كارايي هستند. به عنوان مثال ، SSD ها مي توانند بسياري از درخواست هاي همزمان را پردازش كنند ، بنابراين بهترين مقدار براي effective_io_concurrency ممكن است در بين صدها مورد باشد. مي توانيد اطلاعات بيشتري در مورد اين گزينه ها را در مستندات PostgreSQL بيابيد.
براي ادامه ، y را وارد كنيد و enter بزنيد.
Output

Is this okay? [(y)es/(s)kip/(q)uit]: y
success: miscellaneous settings will be updated
Saving changes to: /etc/postgresql/12/main/postgresql.conf

در نتيجه ، يك فايل پيكربندي آماده را در /var/lib/pgsql/12/data/postgresql.conf دريافت خواهيد كرد.
توجه: اگر نصب را از ابتدا انجام مي دهيد ، مي توانيد فرمان اوليه را نيز با فلگ هاي –quiet و –yes اجرا كنيد ، كه به طور خودكار تمام توصيه ها را اعمال مي كند و تغييراتي در فايل پيكربندي postgresql.conf ايجاد مي كند:
$ sudo timescaledb-tune –quiet –yes

براي اينكه تغييرات پيكربندي عملي شوند ، بايد سرويس PostgreSQL را مجدداً راه اندازي كنيد:
$ sudo systemctl restart postgresql.service

اكنون ديتابيس با پارامترهاي بهينه در حال اجرا است و آماده همكاري با داده هاي سري زماني ميباشد. در مراحل بعدي ، كار با اين داده ها را امتحان ميكنيد: ايجاد بانك اطلاعاتي جديد و هايپرجداول و انجام عمليات.
مرحله 3 – ايجاد يك بانك اطلاعاتي جديد و Hypertable
با بهينه سازي تنظيم TimescaleDB ، آماده كار با داده هاي سري زماني هستيد. TimescaleDB به عنوان پسوند PostgreSQL پياده سازي مي شود ، بنابراين عمليات با داده هاي سري زماني تفاوت چنداني با عمليات داده هاي رابطه اي ندارند. در عين حال ، بانك اطلاعاتي به شما امكان مي دهد تا در آينده داده هاي سري زماني و جداول رابطه اي را آزادانه تركيب كنيد.
ابتدا يك پايگاه داده جديد ايجاد مي كنيد و پسوند TimescaleDB را براي آن فعال مي كنيد. به پايگاه داده PostgreSQL وارد شويد:
$ sudo -u postgres psql
اكنون يك ديتابيس جديد ايجاد كرده و به آن متصل شويد. اين آموزش پايگاه داده را timeseries نامگذاري مي كند:
Postgres=# CREATE DATABASE timeseries;
Postgres=# c timeseries

مي توانيد اطلاعات ديگري در مورد كار با بانك اطلاعاتي PostgreSQL را در نحوه ايجاد ، حذف و مديريت جداول در PostgreSQL در يك آموزش Cloud Server دريافت كنيد.
در آخر ، پسوند TimescaleDB را فعال كنيد:
Timeseries=# CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
خروجي زير را مشاهده خواهيد كرد:
Output
WARNING:
WELCOME TO
_____ _ _ ____________
|_ _(_) | | | _ ___
| | _ _ __ ___ ___ ___ ___ __ _| | ___| | | | |_/ /
| | | | _ ` _ / _ / __|/ __/ _` | |/ _ | | | ___
| | | | | | | | | __/__ (_| (_| | | __/ |/ /| |_/ /
|_| |_|_| |_| |_|___||___/_____,_|_|___|___/ ____/
Running version 1.7.1
For more information on TimescaleDB, please visit the following links:

1. Getting started: https://docs.timescale.com/getting-started
2. API reference documentation: https://docs.timescale.com/api
3. How TimescaleDB is designed: https://docs.timescale.com/introduction/architecture

Note: TimescaleDB collects anonymous reports to better understand and assist our users.
For more information and how to disable, please see our docs https://docs.timescaledb.com/using-timescaledb/telemetry.

CREATE EXTENSION
نكته اوليه تعامل با داده هاي سري زماني، hypertable ها هستند ، مفهوم انتزاعي بسياري از جداول جداگانه كه داده ها را نگه مي دارند ، به نام chunks.
براي ايجاد يك hypertable ، با يك جدول SQL معمولي شروع كنيد و سپس از طريق تابع create_hypertable آن را به hypertable تبديل كنيد.
يك جدول تهيه كنيد كه داده ها را براي رديابي دما و رطوبت در كل دستگاه ها در طول زمان ذخيره كند:
Timeseries=# CREATE TABLE conditions (
Timeseries=# time TIMESTAMP WITH TIME ZONE NOT NULL,
Timeseries=# device_id TEXT,
Timeseries=# temperature NUMERIC,
Timeseries=# humidity NUMERIC
Timeseries=# );

اين دستور يك جدول با نام conditions شامل چهار ستون ايجاد مي كند. ستون اول timestamp را ذخيره مي كند كه شامل منطقه زماني است و نمي تواند خالي باشد. در مرحله بعد ، از ستون زمان براي تبديل جدول خود به يك Hypertable استفاده مي كنيد كه در زمان تقسيم مي شود:
Timeseries=# SELECT create_hypertable(‘conditions’, ‘time’);

اين دستور تابع create_hypertable() را فراميخواند، كه يك هايپرجدول TimescaleDB را از جدول PostgreSQL ايجاد مي كند ، و جايگزين دومي مي نمايد.
خروجي زير را دريافت خواهيد كرد:
Output
create_hypertable
————————-
(1,public,conditions,t)
(1 row)

در اين مرحله ، يك Hypertable جديد براي ذخيره داده هاي سري زماني ايجاد كرده ايد. اكنون مي توانيد با نوشتن hypertable ، آن را با داده ها پر كنيد و سپس فرايند حذف آن را اجرا كنيد.
مرحله 4 – نوشتن و حذف داده ها
در اين مرحله داده ها را با استفاده از دستورات استاندارد SQL وارد مي كنيد و مجموعه هاي زيادي از داده ها را از منابع خارجي وارد مي كنيد. اين به شما جنبه هاي پايگاه داده رابطه اي TimescaleDB را نشان مي دهد.
ابتدا دستورات ساده را امتحان كنيد. با استفاده از دستور استاندارد INSERT SQL مي توانيد داده ها را به hypertable وارد كنيد. برخي از داده هاي دما و رطوبت نمونه را براي دستگاه تئوري weather-pro-000000 با استفاده از دستور زير وارد كنيد:
Timeseries=# INSERT INTO conditions(time, device_id, temperature, humidity)
Timeseries=# VALUES (NOW(), ‘weather-pro-000000’, 84.1, 84.1);
خروجي زير را دريافت خواهيد كرد:
Output
INSERT 0 1

همچنين مي توانيد چندين رديف داده به طور همزمان وارد كنيد. موارد زير را امتحان كنيد:
Timeseries=# INSERT INTO conditions
Timeseries=# VALUES
Timeseries=# (NOW(), ‘weather-pro-000002’, 71.0, 51.0),
Timeseries=# (NOW(), ‘weather-pro-000003’, 70.5, 50.5),
Timeseries=# (NOW(), ‘weather-pro-000004’, 70.0, 50.2);
خروجي زير را دريافت خواهيد كرد:
Output
INSERT 0 3

همچنين مي توانيد مشخص كنيد كه دستور INSERT با استفاده از عبارت RETURNING برخي يا تمام داده هاي درج شده را باز گرداند:
Timeseries=# INSERT INTO conditions
Timeseries=# VALUES (NOW(), ‘weather-pro-000002’, 70.1, 50.1) RETURNING *;

خروجي زير را مشاهده خواهيد كرد:
Output
time | device_id | temperature | humidity
——————————-+——————–+————-+———-
2020-05-30 05:31:27.842009+00 | weather-pro-000002 | 70.1 | 50.1
(1 row)

اگر مي خواهيد داده ها را از hypertable حذف كنيد ، از دستور استاندارد DELETE SQL استفاده كنيد. موارد زير را اجرا كنيد تا هركدام از داده ها كه داراي دماي بالاتر از 80 يا رطوبت بالاي 50 باشد ، حذف كنيد:
Timeseries=# DELETE FROM conditions WHERE temperature > 80;
Timeseries=# DELETE FROM conditions WHERE humidity > 50;

پس از عمل حذف ، توصيه مي شود از دستور VACUUM استفاده كنيد ، تا فضايي كه هنوز توسط داده هايي كه حذف شده اند مورد استفاده قرار مي گيرد آزاد شود.
Timeseries=# VACUUM conditions;

مي توانيد اطلاعات بيشتري در مورد دستور VACUUM در مستندات PostgreSQL بيابيد.
اين فرمان ها براي ورود داده ها در مقياس كوچك مناسب هستند ، اما از آنجا كه داده هاي سري زماني اغلب داده هاي عظيمي را از چندين دستگاه به طور همزمان توليد مي كنند ، دانستن چگونگي درج صدها يا هزاران سطر به طور همزمان ضروري است. اگر داده هاي منابع خارجي را به صورت ساختاري ، به عنوان مثال با فرمت csv تهيه كرده ايد ، اين كار را مي توانيد به سرعت انجام دهيد.
براي آزمايش اين مرحله ، از يك مجموعه داده نمونه استفاده مي كنيد كه داده هاي دما و رطوبت را از مكان هاي مختلف نشان مي دهد. اين داده ها توسط توسعه دهندگان TimescaleDB ايجاد شده اند تا به شما امكان دهد پايگاه داده خود را امتحان كنيد. در مستندات TimescaleDB مي توانيد اطلاعات بيشتري در مورد مجموعه داده هاي نمونه را بررسي كنيد
سپس داده ها را از مجموعه داده نمونه weather_smallبه پايگاه داده خود وارد ميكنيد. اول ، از Postgresql خارج شويد:
Timeseries=# q
سپس مجموعه داده را دانلود كرده و آن را اكستركت كنيد:
$ wget https://timescaledata.blob.core.windows.net/datasets/weather_small.tar.gz

$ tar -xvzf weather_small.tar.gz

سپس ، داده هاي دما و رطوبت را به پايگاه داده خود وارد كنيد:
$ sudo -u postgres psql -d timeseries -c “COPY conditions FROM weather_small_conditions.csv CSV”
اين ديتابيس به بانك اطلاعاتي timeseries  متصل مي شود و دستور COPY را اجرا ميكند كه داده ها را از فايل انتخاب شده به قسمت conditions در hypertable كپي كند. چند ثانيه طول ميكشد تا اجرا شود.
پس از وارد كردن داده ها به جدول خود ، خروجي زير را دريافت خواهيد كرد:
Output
COPY 1000000

در اين مرحله داده ها را به صورت دستي و در گروه هايي به hypertable اضافه مي كنيد. در مرحله بعدي ، به اجراي درخواست ها ادامه دهيد.
مرحله 5 – جستجوي داده ها
اكنون كه جدول شما حاوي داده است ، مي توانيد درخواست هاي مختلفي را براي تجزيه و تحليل آن انجام دهيد.
براي شروع ، وارد پايگاه داده شويد:
$ sudo -u postgres psql -d timeseries
همانطور كه قبلاً ذكر شد ، براي كار با hypertables مي توانيد از دستورات استاندارد SQL استفاده كنيد. به عنوان مثال ، براي نشان دادن 10 ورودي گذشته از بخش conditions ، دستور زير را اجرا كنيد:
Timeseries=# SELECT * FROM conditions LIMIT 10;
خروجي زير را مشاهده خواهيد كرد:
Output
time | device_id | temperature | humidity
————————+——————–+——————–+———-
2016-11-15 12:00:00+00 | weather-pro-000000 | 39.9 | 49.9
2016-11-15 12:00:00+00 | weather-pro-000001 | 32.4 | 49.8
2016-11-15 12:00:00+00 | weather-pro-000002 | 39.800000000000004 | 50.2
2016-11-15 12:00:00+00 | weather-pro-000003 | 36.800000000000004 | 49.8
2016-11-15 12:00:00+00 | weather-pro-000004 | 71.8 | 50.1
2016-11-15 12:00:00+00 | weather-pro-000005 | 71.8 | 49.9
2016-11-15 12:00:00+00 | weather-pro-000006 | 37 | 49.8
2016-11-15 12:00:00+00 | weather-pro-000007 | 72 | 50
2016-11-15 12:00:00+00 | weather-pro-000008 | 31.3 | 50
2016-11-15 12:00:00+00 | weather-pro-000009 | 84.4 | 87.8
(10 rows)

اين دستور به شما امكان مي دهد ببيند چه داده اي در پايگاه داده است. از آنجا كه ديتابيس حاوي يك ميليون ركورد است ، شما از LIMIT 10 براي محدود كردن خروجي به 10 ورودي استفاده كرديد.
براي ديدن جديدترين ورودي ها ، آرايه داده ها را بر اساس زماني و به صورت نزولي مرتب كنيد:
Timeseries=# SELECT * FROM conditions ORDER BY time DESC LIMIT 20;
با اين كار 20 ورودي اخير به خروجي فرستاده مي شود.
همچنين مي توانيد يك فيلتر اضافه كنيد. به عنوان مثال ، براي ديدن ورودي هاي دستگاه Weather-Pro-000000 ، فرمان هاي زير را اجرا كنيد:
Timeseries=# SELECT * FROM conditions WHERE device_id = ‘weather-pro-000000’ ORDER BY time DESC LIMIT 10;

در اين حالت ، 10 مورد از آخرين داده هاي دما و رطوبت ثبت شده توسط دستگاه weather-pro-000000 را مشاهده خواهيد كرد.
علاوه بر دستورات استاندارد SQL ، TimescaleDB همچنين تعدادي كاركرد ويژه را ارائه مي دهد كه براي تجزيه و تحليل داده هاي سري زماني مفيد هستند. به عنوان مثال ، براي يافتن ميانه مقادير درجه حرارت ، مي توانيد از query زير با عملكرد percentile_cont استفاده كنيد:
Timeseries=# SELECT percentile_cont(0.5)
Timeseries=# WITHIN GROUP (ORDER BY temperature)
Timeseries=# FROM conditions
Timeseries=# WHERE device_id = ‘weather-pro-000000’;

خروجي زير را مشاهده خواهيد كرد:
Output
percentile_cont
——————-
40.49999999999998
(1 row)

به اين ترتيب ، دماي متوسط ​​را براي كل دوره مشاهده ميكنيد كه در آن سنسور weather-pro-00000 قرار دارد.
براي نمايش آخرين مقادير از هر يك از سنسورها ، مي توانيد از آخرين تابع استفاده كنيد:
Timeseries=# select device_id, last(temperature, time)
Timeseries=# FROM conditions
Timeseries=# GROUP BY device_id;

در خروجي ليستي از تمام سنسورها و آخرين مقادير مربوط را مشاهده خواهيد كرد.
براي بدست آوردن مقادير اوليه از تابع first استفاده كنيد.
مثال زير پيچيده تر است. ميانگين دما ، حداقل و حداكثر دما براي سنسور انتخاب شده در 24 ساعت گذشته را نشان مي دهد:
Timeseries=# SELECT time_bucket(‘1 hour’, time) “hour”,
Timeseries=# trunc(avg(temperature), 2) avg_temp,
Timeseries=# trunc(min(temperature), 2) min_temp,
Timeseries=# trunc(max(temperature), 2) max_temp
Timeseries=# FROM conditions
Timeseries=# WHERE device_id = ‘weather-pro-000000’
Timeseries=# GROUP BY “hour” ORDER BY “hour” DESC LIMIT 24;

در اينجا شما از تابع time_bucket استفاده كرده ايد كه به عنوان نسخه قدرتمند تابع PostgreSQL date_trunc عمل مي كند. در نتيجه خواهيد ديد كه در كدام دوره از روز دماي هوا افزايش يا كاهش مي يابد:
Output
hour | avg_temp | min_temp | max_temp
————————+———-+———-+———-
2016-11-16 21:00:00+00 | 42.00 | 42.00 | 42.00
2016-11-16 20:00:00+00 | 41.92 | 41.69 | 42.00
2016-11-16 19:00:00+00 | 41.07 | 40.59 | 41.59
2016-11-16 18:00:00+00 | 40.11 | 39.79 | 40.59
2016-11-16 17:00:00+00 | 39.46 | 38.99 | 39.79
2016-11-16 16:00:00+00 | 38.54 | 38.19 | 38.99
2016-11-16 15:00:00+00 | 37.56 | 37.09 | 38.09
2016-11-16 14:00:00+00 | 36.62 | 36.39 | 37.09
2016-11-16 13:00:00+00 | 35.59 | 34.79 | 36.29
2016-11-16 12:00:00+00 | 34.59 | 34.19 | 34.79
2016-11-16 11:00:00+00 | 33.94 | 33.49 | 34.19
2016-11-16 10:00:00+00 | 33.27 | 32.79 | 33.39
2016-11-16 09:00:00+00 | 33.37 | 32.69 | 34.09
2016-11-16 08:00:00+00 | 34.94 | 34.19 | 35.49
2016-11-16 07:00:00+00 | 36.12 | 35.49 | 36.69
2016-11-16 06:00:00+00 | 37.02 | 36.69 | 37.49
2016-11-16 05:00:00+00 | 38.05 | 37.49 | 38.39
2016-11-16 04:00:00+00 | 38.71 | 38.39 | 39.19
2016-11-16 03:00:00+00 | 39.72 | 39.19 | 40.19
2016-11-16 02:00:00+00 | 40.67 | 40.29 | 40.99
2016-11-16 01:00:00+00 | 41.63 | 40.99 | 42.00
2016-11-16 00:00:00+00 | 42.00 | 42.00 | 42.00
2016-11-15 23:00:00+00 | 42.00 | 42.00 | 42.00
2016-11-15 22:00:00+00 | 42.00 | 42.00 | 42.00
(24 rows)

مي توانيد توابع مفيدي را در مستندات TimescaleDB بيابيد.
اكنون مي دانيد كه چگونه مي توانيد داده هاي خود را مديريت كنيد. در مرحله بعدي ، نحوه حذف داده هاي غير ضروري و نحوه فشرده سازي داده ها را مرور خواهيد كرد.
مرحله 6 – پيكربندي فشرده سازي و حذف داده ها
با تجمع داده ها ، فضاي بيشتري در هارد ديسك شما جاي مي گيرد. براي صرفه جويي در فضا ، آخرين نسخه TimescaleDB يك ويژگي فشرده سازي داده را ارائه مي دهد. اين ويژگي به هيچ وجه نيازي به تنظيمات فايل سيستم نخواهد داشت و مي توان از آن براي كارآمد ساختن سريعتر پايگاه داده استفاده كرد. براي اطلاعات بيشتر در مورد نحوه عملكرد اين فشرده سازي ، به مقاله فشرده سازي از TimescaleDB نگاهي بيندازيد.
ابتدا فشرده سازي hypertable خود را فعال كنيد:
Timeseries=# ALTER TABLE conditions SET (
Timeseries=# timescaledb.compress,
Timeseries=# timescaledb.compress_segmentby = ‘device_id’
Timeseries=# );

خروجي زير را دريافت خواهيد كرد:
Output
NOTICE: adding index _compressed_hypertable_2_device_id__ts_meta_sequence_num_idx ON _timescaledb_internal._compressed_hypertable_2 USING BTREE(device_id, _ts_meta_sequence_num)
ALTER TABLE

توجه: همچنين مي توانيد TimescaleDB را براي فشرده سازي داده ها در مدت زماني مشخص تنظيم كنيد. به عنوان مثال ، مي توانيد دستور زير را اجرا كنيد:
Timeseries=# SELECT add_compress_chunks_policy(‘conditions’, INTERVAL ‘7 days’);
در اين مثال ، داده ها بعد از يك هفته به طور خودكار فشرده مي شوند.
مي توانيد آمار مربوط به داده هاي فشرده شده را با اين دستور مشاهده كنيد:
Timeseries=# SELECT * FROM timescaledb_information.compressed_chunk_stats;
سپس ليستي از chunk ها را با وضعيت آنها مشاهده خواهيد كرد: وضعيت فشرده سازي و ميزان فضاي داده هاي فشرده نشده و فشرده شده در بايت ها.
اگر به مدت طولاني نيازي به ذخيره داده نداريد ، مي توانيد داده هاي قديمي را حذف كنيد تا حتي فضاي بيشتري آزاد شود. براي اين كار يك تابع ويژه drop_chunks وجود دارد. به شما امكان مي دهد بخش هايي با داده هاي قديمي تر از زمان مشخص شده را حذف كنيد:
Timeseries=# SELECT drop_chunks(interval ’24 hours’, ‘conditions’);
اين درخواست تمام قسمت ها را از بخش conditions در hypertable كه فقط شامل داده هاي قديمي تر از روز قبل است ، خالي مي كند.
خروجي زير را دريافت خواهيد كرد:
Output
drop_chunks
—————————————-
_timescaledb_internal._hyper_1_2_chunk
(1 row)

براي حذف خودكار داده هاي قديمي ، مي توانيد يك كار cron پيكربندي كنيد. براي كسب اطلاعات بيشتر در مورد نحوه استفاده از cron براي اتوماسيون كارهاي مختلف سيستم ، به آموزش ما در اين مورد مراجعه كنيد.
از پايگاه داده خارج شويد:
Timeseries=# /q
سپس ، crontab خود را با دستور زير ويرايش كنيد ، كه بايد از پوسته اجرا شود:
$ sudo crontab -e
اكنون خط زير را به انتهاي فايل اضافه كنيد:
crontab

0 1 * * * /usr/bin/psql -h localhost -p 5432 -U postgres -d postgres -c “SELECT drop_chunks(interva

اين كار داده هاي منسوخ را كه قديمي تر از يك روز هستند را ساعت 1 صبح هر روز حذف مي كند.
نتيجه
اكنون TimescaleDB را روي سرور مجازي Ubuntu 20.04 خود تنظيم كرده ايد. همچنين ايجاد Hypertables ، قرار دادن داده ها در آن ، جستجوي داده ها ، فشرده سازي و حذف سوابق غير ضروري را امتحان كرديد. با استفاده از اين مثالها ، مي توانيد از مزاياي كليدي TimescaleDB نسبت به سيستم هاي معمول مديريت پايگاه داده رابطه اي براي ذخيره داده هاي سري زماني استفاده كنيد ، از جمله:
• نرخ پذيرش بيشتر داده ها
• عملكرد سريعتر درخواست ها
• ويژگي هاي زمان گرا
اكنون كه مي دانيد چگونه داده هاي سري زماني را ذخيره كنيد ، مي توانيد از داده ها براي ايجاد نمودار استفاده كنيد. TimescaleDB با ابزارهاي تجسم مناسب براي PostgreSQL مانند Grafana سازگار است. براي كسب اطلاعات بيشتر در مورد اين ابزار محبوب تجسم سازي، مي توانيد از آموزش نحوه نصب و ايمن كردن Grafana در اوبونتو 20.04 استفاده كنيد. اگر مايل به كسب اطلاعات بيشتر در مورد بانكهاي اطلاعاتي هستيد ، به صفحه مبحث بانك اطلاعات ما نگاهي بيندازيد.

 

از اين لينك ها زير مي توانيد آمورش هاي بيشتري براي لينوكس پيدا كنيد :

دسترسي از راه دور به برنامه GUI با Docker در اوبونتو 18.04

راه اندازي سايت توسعه Jekyll در اوبونتو 20.04

نحوه راه اندازي سايت توسعه Jekyll در اوبونتو 18.04

نحوه نصب و استفاده از Docker Compose در اوبونتو 20.04

نحوه اجراي چند نسخه PHP بر روي يك سرور با استفاده از Apache و PHP-FPM در CentOS 8

نحوه نصب و استفاده از TimescaleDB در Ubuntu 20.04

نحوه نصب و راه اندازي Laravel با Docker Compose در اوبونتو 20.04

 

 

خريد vps – خريد سرور مجازي – خريد سرور – سرور هلند – فروش vps – سرور مجازي آمريكا – خريدvps – سرور مجازي هلند – فروش سرور مجازي – سرور آمريكا – vps – سرور مجازي انگليس – سرور مجازي آلمان – سرور مجازي كانادا – خريد vps آمريكا – خريد وي پي اس – سرور – خريد سرور مجازي هلند – vps خريد – سرور مجازي فرانسه – سرور مجازي هلند – خريد vps آمريكا – خريد سرور مجازي ارزان هلند – vps – خريد vps هلند – خريد سرور مجازي آمريكا – خريد vps فرانسه – تست vps – سرور مجازي تست – سرور مجازي ويندوز – ارزانترين vps – خريد وي پي اس – vps ارزان – 

 

برچسب‌ها:


برچسب: ،
ادامه مطلب
امتیاز:
 
بازدید:
+ نوشته شده: ۸ تير ۱۳۹۹ساعت: ۰۱:۱۰:۲۰ توسط:sima موضوع:

نحوه نصب و راه اندازي Laravel با Docker Compose در اوبونتو 20.04

كانتينرايز كردن يك برنامه به فرآيند سازگاري يك برنامه و اجزاي آن گفته ميشود براي اينكه بتوان آن را در محيط هاي سبك كه به كانتينر شناخته مي شود اجرا كنيد. چنين محيط هايي منزوي و يكبار مصرف هستند و مي توانند براي توسعه ، آزمايش و بكارگيري برنامه هاي كاربردي براي توليد ، از آن استفاده كرد.
در اين راهنما ، ما از Docker Compose براي كانتينرايز كردن برنامه Laravel براي توسعه استفاده خواهيم كرد. پس از اتمام ، يك برنامه نمايشي Laravel در سه كانتينرها سرويس جداگانه اجرا مي شود:
• يك سرويس app كه PHP7.4-FPM را اجرا ميكند.
• سرويس db كه MySQL 5.7 را اجرا مي كند.
• سرويس nginx كه قبل از ارائه برنامه Laravel به كاربر نهايي از سرويس برنامه براي تجزيه كد PHP استفاده مي كند.
براي ايجاد يك روند توسعه ساده و تسهيل اشكال زدايي برنامه ، فايل هاي برنامه را با استفاده از حجم هاي مشترك همگام سازي خواهيم كرد. همچنين خواهيم ديد كه چگونه مي توان از دستورات docker-compose exec براي اجراي Composer و Artisan در كانتينر برنامه استفاده كرد.
پيش نيازها
⦁ دسترسي به يك دستگاه محلي يا سرور مجازي توسعه Ubuntu 20.04 به عنوان يك كاربر غير ريشه و داراي امتيازات sudo. اگر از سرور مجازي راه دور استفاده مي كنيد ، توصيه مي شود يك فايروال فعال نصب شود. براي تنظيم اين موارد ، لطفاً به راهنماي راه اندازي سرور مجازي اوليه ما براي اوبونتو 20.04 مراجعه كنيد.
⦁ Docker نصب شده بر روي سرور مجازي تان، مراحل 1 و 2 نحوه نصب و استفاده از Docker را در اوبونتو 20.04 دنبال كنيد.
⦁ Docker Compose نصب شده بر روي سرور مجازي تان. مرحله 1 نحوه نصب Docker Compose را در اوبونتو 20.04 را دنبال كنيد.
مرحله 1 – به دست آوردن برنامه نسخه ي نمايشي
براي شروع ، برنامه نسخه ي نمايشي Laravel را از منبع Github آن دريافت خواهيم كرد. ما علاقه مند به شاخه tutorial-01 هستيم كه شامل برنامه اصلي Laravel است كه در اولين راهنماي اين مجموعه ايجاد كرده ايم.
براي به دست آوردن كد برنامه اي كه با اين آموزش سازگار است ، با دستور زير آموزش نسخه-1.0.1 را روي ديركتوري هوم خود دانلود كنيد:
⦁ $ cd ~
⦁ $ curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zip

براي باز كردن كد برنامه به دستور unzip نياز خواهيم داشت. اگر قبلاً اين بسته را نصب نكرده ايد ، اكنون اين كار را انجام دهيد:
⦁ $ sudo apt update

⦁ $ sudo apt install unzip
اكنون محتويات برنامه را از حالت فشرده خارج كرده و براي دسترسي آسانتر نام ديركتوري باز شده را تغيير دهيد:
⦁ $ unzip travellist.zip

⦁ $ mv travellist-laravel-demo-tutorial-1.0.1 travellist-demo

به ديركتوري travellist-demo برويد:
⦁ $ cd travellist-demo
در مرحله بعدي ، يك فايل پيكربندي .env براي تنظيم برنامه ايجاد خواهيم كرد.
مرحله 2 – تنظيم فايل .env برنامه
فايل هاي پيكربندي Laravel در پوشه اي به نام config ، در ديركتوري اصلي برنامه قرار دارند. علاوه بر اين ، از يك فايل .env براي تنظيم پيكربندي وابسته به محيط ، مانند اعتبارات و اطلاعاتي كه ممكن است بين استقرارها متفاوت باشد ، استفاده مي شود. اين فايل در revision control گنجانده نشده است.
هشدار: فايل تنظيمات محيط شامل اطلاعات حساس در مورد سرور مجازي شما ، از جمله اطلاعات پايگاه داده و كليدهاي امنيتي است. به همين دليل ، شما هرگز نبايد اين فايل را به صورت عمومي به اشتراك بگذاريد.
مقادير موجود در فايل .env بر مقادير تعيين شده در فايل هاي پيكربندي معمولي واقع در ديركتوري config  ارجحيت دارند. هر نصب بر روي يك محيط جديد نياز به يك فايل متناسب با محيط دارد تا مواردي از قبيل تنظيمات اتصال بانك اطلاعاتي ، گزينه هاي اشكال زدايي ، URL برنامه را از موارد ديگري كه بسته به نوع محيطي كه برنامه در آن اجرا ميشود تغيير ميكنند، متمايز نمايد.
اكنون ما يك فايل .env جديد را براي سفارشي كردن گزينه هاي پيكربندي براي محيط توسعه اي كه تنظيم مي كنيم ايجاد خواهيم كرد. Laravel با يك فايل.env مثال همراه است كه مي توانيم آن را كپي كنيم تا نمونه خودمان را ايجاد كنيم:
⦁ $ cp .env.example .env

اين فايل را با استفاده از nano يا ويرايشگر متن مورد نظر خود باز كنيد:
⦁ $ nano .env

فايل .env كنوني از برنامه نمايشي Travellist شامل تنظيماتي براي استفاده از يك پايگاه داده محلي MySQL ، با 127.0.0.1 به عنوان ميزبان پايگاه داده است. ما بايد متغير DB_HOST را به روز كنيم تا به سرويس ديتابيس كه در محيط Docker خود ايجاد خواهيم كرد اشاره كند. در اين راهنما ، ما سرويس ديتابيس خود را db مي ناميم. پيش برويد و مقدار ذكر شده DB_HOST را با نام سرويس بانك اطلاعات جايگزين كنيد:
.env
APP_NAME=Travellist
APP_ENV=dev
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost:8000

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password

در صورت تمايل مي توانيد نام بانك اطلاعاتي ، نام كاربري و رمزعبور را نيز تغيير دهيد. اين متغيرها در مرحله بعدي استفاده مي شود كه در آن فايل docker-compose.yml را براي پيكربندي خدمات خود تنظيم خواهيم كرد.
پس از پايان ويرايش ، فايل را ذخيره كنيد. اگر از nano استفاده كرده ايد ، مي توانيد با فشار دادن Ctrl + x اين كار را انجام دهيد، سپس Y و Enter را براي تأييد فشار دهيد.
مرحله 3 – تنظيم Dockerfile برنامه
اگرچه هر دو سرويس MySQL و Nginx ما مبتني بر تصاوير پيش فرض به دست آمده از Docker Hub خواهد بود ، اما ما هنوز نياز به ساختن يك تصوير دلخواه براي كانتينر برنامه داريم. براي آن يك Dockerfile جديد ايجاد خواهيم كرد.
تصوير travellist  ما بر اساس PHP: 7.4-fpm تصوير رسمي PHP از Docker Hub خواهد بود. در بالاي آن محيط اصلي PHP-FPM ، چند ماژول PHP اضافي و ابزار مديريت متعلقات Composer را نصب خواهيم كرد.
همچنين يك كاربر جديد براي سيستم ايجاد خواهيم كرد. اين كار براي اجراي دستورات artisan  و composer  هنگام تهيه برنامه ضروري است. تنظيم uid تضمين مي كند كه كاربر درون كانتينر داراي همان كاربري است كه كاربر سيستم شما در دستگاه ميزبان شما دارد ، جايي كه running Docker را اجرا ميكنيد. به اين ترتيب ، هر فايل ايجاد شده توسط اين دستورات با مجوزهاي صحيح در هاست تكرار مي شود. اين نكته همچنين بدان معني است كه شما مي توانيد از ويرايشگر كد مورد نظر خود در دستگاه ميزبان استفاده كنيد تا برنامه اي را كه درون كانتينرها اجرا مي شود توسعه دهيد.
يك Dockerfile جديد ايجاد كنيد:
⦁ $ nano Dockerfile
محتواي زير را در Dockerfile خود كپي كنيد:
Dockerfile
FROM php:7.4-fpm

# Arguments defined in docker-compose.yml
ARG user
ARG uid

# Install system dependencies
RUN apt-get update && apt-get install -y
git
curl
libpng-dev
libonig-dev
libxml2-dev
zip
unzip

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

# Get latest Composer
COPY –from=composer:latest /usr/bin/composer /usr/bin/composer

# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer &&
chown -R $user:$user /home/$user

# Set working directory
WORKDIR /var/www

USER $user

فراموش نكنيد كه فايل را پس از اتمام كار ذخيره كنيد.
Dockerfile ما با تعريف تصوير پايه اي كه ما استفاده مي كنيم شروع مي شود: php: 7.4-fpm.
پس از نصب بسته هاي سيستم و پسوندهاي PHP ، با كپي كردن composer  قابل اجرا از آخرين تصوير رسمي آن روي تصوير برنامه كاربردي خود ، Composer را نصب مي كنيم.
سپس كاربر جديد سيستم با استفاده از آرگومانهاي user و uid كه در ابتداي Dockerfile اعلام شد ، ايجاد و تنظيم مي شود. اين مقادير توسط Docker Compose در زمان ساخت وارد مي شوند.
در آخر ، ديركتوري پيش فرض در حال كار را به عنوان / var / www تنظيم كرده و به كاربر تازه ايجاد شده سوييچ مي كنيم. اين كار اطمينان حاصل مي كند كه شما به عنوان يك كاربر معمولي متصل ميشويد ، و هنگام اجراي دستورات composer و artisan در كانتينر برنامه ، در كانتينر صحيح قرار داريد.
مرحله چهارم – تنظيم پيكربندي Nginx و فايلهاي رونوشت ديتابيس
هنگام ايجاد محيط هاي توسعه با Docker Compose ، اغلب لازم است فايل هاي پيكربندي يا شروع را با كانتينرهاي سرويس به اشتراك بگذاريد تا اين سرويس ها را تنظيم يا به صورت خودكار راه اندازي كنيد. اين روش ايجاد تغيير در فايل هاي پيكربندي را براي تنظيم دقيق محيط خود در هنگام تهيه برنامه ، تسهيل مي كند.
اكنون پوشه اي را با فايل هايي تنظيم خواهيم كرد كه براي پيكربندي و شروع كانتينرهاي سرويس ما استفاده مي شود.
براي راه‌اندازي Nginx ، يك فايل travellist.conf را به اشتراك خواهيم گذاشت كه نحوه ارائه برنامه را پيكربندي خواهد كرد. پوشه docker-compose / nginx را با دستور زير ايجاد كنيد:
⦁ $ mkdir -p docker-compose/nginx

فايل جديدي به نام travellist.conf را در آن ديركتوري باز كنيد:
⦁ $ nano docker-compose/nginx/travellist.conf

پيكربندي Nginx زير را در آن فايل كپي كنيد:
docker-compose/nginx/travellist.conf

server {
listen 80;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/public;
location ~ .php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}

اين فايل، Nginx را براي گوش دادن به پورت 80 و استفاده از index.php به عنوان صفحه ايندكس پيش فرض پيكربندي مي كند. وroot مطالب را بر روي /var/www/public تنظيم مي كند ، و سپس Nginx را براي استفاده از سرويس برنامه در پورت 9000 تنظيم مي كند تا فايل هاي * .php را پردازش كند.
پس از پايان ويرايش ، فايل را ذخيره كنيد و ببنديد.
براي راه اندازي بانك اطلاعاتي MySQL ، يك رونوشت پايگاه داده را به اشتراك مي گذاريم كه هنگام شروع كانتينر ، وارد مي شود. اين ويژگي ارائه شده توسط تصوير MySQL 5.7 است كه ما از آن كانتينرها استفاده خواهيم كرد.
يك پوشه جديد براي فايل هاي شروع MySQL خود در داخل پوشه docker-compose ايجاد كنيد:
⦁ $ mkdir docker-compose/mysql
يك فايل .sll جديد را باز كنيد:
⦁ $ nano docker-compose/mysql/init_db.sql

رونوشت MySQL زير بر اساس پايگاه داده اي است كه ما در Laravel روي راهنماي LEMP خود تنظيم كرده ايم. و يك جدول جديد به نام places ايجاد مي كند. سپس ، جدول را با مجموعه اي از مكان هاي نمونه پر مي كند.
كد زير را به فايل اضافه كنيد:
docker-compose/mysql/db_init.sql
DROP TABLE IF EXISTS `places`;

CREATE TABLE `places` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`visited` tinyint(1) NOT NULL DEFAULT ‘0’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `places` (name, visited) VALUES (‘Berlin’,0),(‘Budapest’,0),(‘Cincinnati’,1),(‘Denver’,0),(‘Helsinki’,0),(‘Lisbon’,0),(‘Moscow’,1),(‘Nairobi’,0),(‘Oslo’,1),(‘Rio’,0),(‘Tokyo’,0);

جدول places  شامل سه فيلد است: id ، name و visited. قسمت visited ، فلگي است كه براي شناسايي مكانهايي كه هنوز در حالت to go هستند، استفاده مي شود. در تغيير مكان هاي نمونه يا مكان هاي جديد آزادانه عمل كنيد. پس از اتمام كار ، فايل را ذخيره كنيد و ببنديد.
ما تنظيمات Dockerfile برنامه و فايل هاي پيكربندي سرويس را به پايان رسانديم. در مرحله بعدي ، Docker Compose را تنظيم خواهيم كرد تا هنگام ايجاد خدمات ، از اين فايل ها استفاده كنيم.
مرحله 5 – ايجاد يك محيط چند كانتينري با Docker Compose
Docker Compose به شما امكان مي دهد محيطهاي چند كانتينري را براي برنامه هاي در حال اجرا در Docker ايجاد كنيد. با استفاده از تعاريف سرويس ، محيط هاي كاملاً قابل تنظيم با چندين كانتينر را ايجاد مي كند كه مي توانند شبكه ها و حجم داده ها را به اشتراك بگذارند. اين امر امكان ادغام يكپارچه بين اجزاي برنامه را فراهم مي آورد.
براي تنظيم تعاريف سرويس ، يك فايل جديد با نام docker-compose.yml ايجاد خواهيم كرد. به طور معمول ، اين فايل در ريشه پوشه برنامه قرار دارد و محيط كانتينر شده شما ، از جمله تصاوير پايه اي كه براي ساخت كانتينرهاي خود استفاده خواهيد كرد ، و نحوه تعامل سرويس هاي شما را تعريف مي كند.
ما سه سرويس مختلف را در فايل docker-compose.yml خود تعريف خواهيم كرد: app ،db و nginx.
سرويس app براساس Dockerfile كه قبلاً ايجاد كرده ايم ، تصويري به نام travellist ايجاد مي كند. كانتينر تعريف شده توسط اين سرويس ، سرور مجازي php-fpm را براي تجزيه كد PHP اجرا مي كند و نتايج را به سرويس nginx ارسال مي كند ، كه روي يك كانتينر جداگانه اجرا مي شود. سرويس mysql يك كانتينر تعريف مي كند كه سرور مجازي MySQL 5.7 را راه اندازي مي كند. سرويس هاي ما شبكه پل مانندي با نام travellist را به اشتراك مي گذارند.
فايل هاي برنامه هم در app و هم سوريس هاي nginx از طريق bind mounts (نصب هاي اتصالي) همگام مي شوند. bind mounts در محيط هاي توسعه مفيد هستند زيرا امكان همگام سازي دو طرفه بين دستگاه ميزبان و كانتينرها را فراهم مي كنند.
يك فايل docker-compose.yml جديد در ريشه پوشه برنامه ايجاد كنيد:
⦁ $ nano docker-compose.yml

يك فايل معمولي docker-compose.yml با تعريف نسخه شروع مي شود و به دنبال آن يك گره services  قرار مي گيرد كه تحت آن همه سرويس ها تعريف مي شوند. شبكه هاي اشتراكي معمولاً در پايين آن فايل تعريف مي شوند.
براي شروع ، اين كد boilerplate را در فايل docker-compose.yml خود كپي كنيد:
docker-compose.yml
version: “3.7”
services:

networks:
travellist:
driver: bridge

اكنون گره services  را ويرايش خواهيم كرد تا خدمات app ، db و nginx را شامل شود.
سرويس app
سرويس app كانتينري به نام travellist-app را تنظيم ميكند. اين تصوير جديد Docker را بر اساس Dockerfile كه در همان مسير فايل docker-compose.yml قرار دارد ، مي سازد. تصوير جديد به صورت محلي تحت عنوان travellist ذخيره مي شود.
حتي اگر ريشه سند به عنوان برنامه در كانتينر nginx قرار داشته باشد ، ما به فايل هاي برنامه نيز در جايي داخل كانتينر برنامه نياز داريم ، بنابراين مي توانيم وظايف خط فرمان را با ابزار Laravel Artisan اجرا كنيم.
تعريف خدمات زير را در زير گره خدمات خود ، درون فايل docker-compose.yml كپي كنيد:
docker-compose.yml
app:
build:
args:
user: sammy
uid: 1000
context: ./
dockerfile: Dockerfile
image: travellist
container_name: travellist-app
restart: unless-stopped
working_dir: /var/www/
volumes:
– ./:/var/www
networks:
– travellist

اين تنظيمات موارد زير را انجام مي دهد:
⦁ Build: اين پيكربندي به Docker Compose مي گويد يك تصوير محلي براي سرويس app ، با استفاده از مسير مشخص شده (محتوا) و Dockerfile براي دستورالعمل ها بسازد. آرگومان هاي user و uid براي سفارشي سازي دستورات ايجاد كاربر در زمان ساخت به Dockerfile تزريق مي شوند.
⦁ Image: نامي كه براي تصوير استفاده خواهد شد ساخته ميشود.
⦁ container_name: نام كانتينر را براي اين سرويس تنظيم مي كند.
⦁ Restart: هميشه ريستارت ميكند ، مگر اينكه سرويس متوقف شود.
⦁ working_dir: دايركتوري پيش فرض براي اين سرويس را به عنوان / var / www تنظيم مي كند.
⦁ Volumes: يك واليوم مشترك ايجاد مي كند كه محتويات موجود از دايركتوري فعلي را به / var / www داخل كانتينر همگام سازي مي كند. توجه كنيد كه اين، ريشه سند شما نيست ، زيرا در كانتينر nginx قرار دارد.
⦁ networks: براي استفاده از شبكه اي به نام Travellist ، اين سرويس را تنظيم ميكند.
سرويس db
سرويس db از تصوير پيش ساخته MySQL 5.7 از Docker Hub استفاده مي كند. از آنجا كه Docker Compose به طور خودكار فايلهاي متغير .env را كه در همان ديركتوري فايل docker-compose.yml قرار دارد لود مي كند ، مي توانيم تنظيمات پايگاه داده خود را از فايل Laravel .env كه در مرحله قبلي ايجاد كرديم ، بدست آوريم.
تعريف سرويس زير را درست بعد از سرويس app در گره services  خود وارد كنيد:
docker-compose.yml
db:
image: mysql:5.7
container_name: travellist-db
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
– ./docker-compose/mysql:/docker-entrypoint-initdb.d
networks:
– travellist

اين تنظيمات موارد زير را انجام مي دهد:
⦁ Image: تصوير Docker را كه بايد براي اين كانتينر استفاده شود ، تعريف مي كند. در اين حالت ، ما از تصوير MySQL 5.7 Docker Hub استفاده مي كنيم.
⦁ container_name:نام كانتينر را براي اين سرويس تنظيم مي كند: travellist-db.
⦁ restart: هميشه اين سرويس را ريستارت كنيد ، مگر اينكه صريحاً متوقف شده باشد.
⦁ environment: متغيرهاي محيط را در كانتينر جديد تعريف مي كند. ما براي تنظيم سرويس MySQL از مقادير به دست آمده از فايل Laravel .env استفاده مي كنيم كه به طور خودكار يك پايگاه داده جديد و كاربر را بر اساس متغيرهاي محيط ارائه شده ايجاد مي كند.
⦁ Volumes:يك حجم براي به اشتراك گذاشتن يك پايگاه داده dsql ايجاد مي كند كه براي شروع بانك اطلاعاتي برنامه كاربردي خواهد بود. تصوير MySQL به طور خودكار فايل هاي .ql قرار داده شده در ديركتوري /docker-entrypoint-initdb.d را درون كانتينر وارد مي كند.
⦁ networks: براي استفاده از شبكه اي به نام Travellist ، اين سرويس را تنظيم ميكند.
سرويس nginx
سرويس nginx از يك تصوير پيش ساخته Nginx در بالاي Alpine ، توزيع لينوكس سبك استفاده مي كند. كانتينري به نام travellist-nginx ايجاد مي كند و از تعريف پورت ها براي ايجاد تغيير مسير از پورت 8000 روي سيستم ميزبان براي پورت 80 درون كانتينر استفاده مي كند.
تعريف خدمات زير را در گره خدمات خود ، درست بعد از سرويس db وارد كنيد:
اين تنظيمات موارد زير را انجام مي دهد:
docker-compose.yml
nginx:
image: nginx:1.17-alpine
container_name: travellist-nginx
restart: unless-stopped
ports:
– 8000:80
volumes:
– ./:/var/www
– ./docker-compose/nginx:/etc/nginx/conf.d
networks:
– travellist
⦁ Image: تصوير Docker را كه بايد براي اين كانتينر استفاده شود ، تعريف مي كند. در اين حالت ، ما از تصوير Alpine Nginx 1.17 استفاده مي كنيم.
⦁ container_name: نام كانتينر را براي اين سرويس تنظيم مي كند: travellist-nginx
⦁ restart: هميشه اين سرويس را ريستارت كنيد ، مگر اينكه صريحاً متوقف شده باشد.
⦁ ports: تغيير مسير پورت را تنظيم مي كند كه امكان دسترسي خارجي از طريق پورت 8000 به سرور مجازي وب را كه پورت 80 در داخل كانتينر كار مي كند ، فراهم مي كند.
⦁ volumes: دو واليوم مشترك ايجاد مي كند. اولي همگام سازي محتوا از ديركتوري فعلي با / var / www داخل كانتينر را انجام ميدهد. به اين ترتيب ، وقتي تغييرات محلي را در فايل هاي برنامه اعمال مي كنيد ، به سرعت در برنامه ارائه شده توسط Nginx در داخل كانتينر منعكس مي شوند. دومي اطمينان حاصل خواهد كرد كه فايل پيكربندي Nginx ، واقع در docker-compose / nginx / travellist.conf ، در پوشه تنظيمات Nginx كانتينر كپي شده است.
⦁ networks: براي استفاده از شبكه اي به نام Travellist ، اين سرويس را تنظيم كنيد.
فايل docker-compose.yml پاياني
فايل docker-compose.yml نهايي اين گونه خواهد بود:
docker-compose.yml
version: “3.7”
services:
app:
build:
args:
user: sammy
uid: 1000
context: ./
dockerfile: Dockerfile
image: travellist
container_name: travellist-app
restart: unless-stopped
working_dir: /var/www/
volumes:
– ./:/var/www
networks:
– travellist

db:
image: mysql:5.7
container_name: travellist-db
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
– ./docker-compose/mysql:/docker-entrypoint-initdb.d
networks:
– travellist

nginx:
image: nginx:alpine
container_name: travellist-nginx
restart: unless-stopped
ports:
– 8000:80
volumes:
– ./:/var/www
– ./docker-compose/nginx:/etc/nginx/conf.d/
networks:
– travellist

networks:
travellist:
driver: bridge

اطمينان حاصل كنيد كه فايل را پس از پايان كار ذخيره كنيد.
مرحله 6 – اجراي برنامه با Docker Compose
اكنون براي ايجاد تصوير برنامه و اجراي سرويس هايي كه در مجموعه خود مشخص كرده ايم ، از دستورات docker-compose استفاده خواهيم كرد.
تصوير app را با دستور زير بسازيد:
⦁ $ docker-compose build app

اين دستور ممكن است چند دقيقه طول بكشد تا تكميل شود. خروجي مشابه اين را مشاهده خواهيد كرد:
Output
Building app
Step 1/11 : FROM php:7.4-fpm
—> fa37bd6db22a
Step 2/11 : ARG user
—> Running in f71eb33b7459
Removing intermediate container f71eb33b7459
—> 533c30216f34
Step 3/11 : ARG uid
—> Running in 60d2d2a84cda
Removing intermediate container 60d2d2a84cda
—> 497fbf904605
Step 4/11 : RUN apt-get update && apt-get install -y git curl libpng-dev libonig-dev …
Step 7/11 : COPY –from=composer:latest /usr/bin/composer /usr/bin/composer
—> e499f74896e3
Step 8/11 : RUN useradd -G www-data,root -u $uid -d /home/$user $user
—> Running in 232ef9c7dbd1
Removing intermediate container 232ef9c7dbd1
—> 870fa3220ffa
Step 9/11 : RUN mkdir -p /home/$user/.composer && chown -R $user:$user /home/$user
—> Running in 7ca8c0cb7f09
Removing intermediate container 7ca8c0cb7f09
—> 3d2ef9519a8e
Step 10/11 : WORKDIR /var/www
—> Running in 4a964f91edfa
Removing intermediate container 4a964f91edfa
—> 00ada639da21
Step 11/11 : USER $user
—> Running in 9f8e874fede9
Removing intermediate container 9f8e874fede9
—> fe176ff4702b

Successfully built fe176ff4702b
Successfully tagged travellist:latest

پس از اتمام ساخت ، مي توانيد محيط را در حالت پس زمينه اجرا كنيد:
⦁ $ docker-compose up -d
⦁ Output
⦁ Creating travellist-db … done
⦁ Creating travellist-app … done
⦁ Creating travellist-nginx … done

اين كار كانتينرهاي شما را در پس زمينه اجرا مي كند. براي نشان دادن اطلاعات در مورد وضعيت خدمات فعال خود ، اين دستور را اجرا كنيد:
⦁ $ docker-compose ps
خروجي مانند اين را خواهيد ديد:
Output
Name Command State Ports
——————————————————————————–
travellist-app docker-php-entrypoint php-fpm Up 9000/tcp
travellist-db docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
travellist-nginx /docker-entrypoint.sh ngin … Up 0.0.0.0:8000->80/tcp

اكنون محيط شما در حال اجرا است ، اما ما هنوز بايد چند دستور را اجرا كنيم تا تنظيمات برنامه به پايان برسد. براي اجراي دستورات موجود در كانتينرهاي سرويس مانند ls-l مي توانيد از دستور docker-compose براي نمايش اطلاعات در مورد فايل ها در ديركتوري برنامه استفاده كنيد:
⦁ $ docker-compose exec app ls -l
⦁ Output
total 260
-rw-rw-r– 1 sammy sammy 737 Jun 9 11:19 Dockerfile
-rw-rw-r– 1 sammy sammy 101 Jan 7 08:05 README.md
drwxrwxr-x 6 sammy sammy 4096 Jan 7 08:05 app
-rwxr-xr-x 1 sammy sammy 1686 Jan 7 08:05 artisan
drwxrwxr-x 3 sammy sammy 4096 Jan 7 08:05 bootstrap
-rw-rw-r– 1 sammy sammy 1501 Jan 7 08:05 composer.json
-rw-rw-r– 1 sammy sammy 179071 Jan 7 08:05 composer.lock
drwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 config
drwxrwxr-x 5 sammy sammy 4096 Jan 7 08:05 database
drwxrwxr-x 4 sammy sammy 4096 Jun 9 11:19 docker-compose
-rw-rw-r– 1 sammy sammy 965 Jun 9 11:27 docker-compose.yml
-rw-rw-r– 1 sammy sammy 1013 Jan 7 08:05 package.json
-rw-rw-r– 1 sammy sammy 1405 Jan 7 08:05 phpunit.xml
drwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 public
-rw-rw-r– 1 sammy sammy 273 Jan 7 08:05 readme.md
drwxrwxr-x 6 sammy sammy 4096 Jan 7 08:05 resources
drwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 routes
-rw-rw-r– 1 sammy sammy 563 Jan 7 08:05 server.php
drwxrwxr-x 5 sammy sammy 4096 Jan 7 08:05 storage
drwxrwxr-x 4 sammy sammy 4096 Jan 7 08:05 tests
drwxrwxr-x 41 sammy sammy 4096 Jun 9 11:32 vendor
-rw-rw-r– 1 sammy sammy 538 Jan 7 08:05 webpack.mix.js

اكنون composer install را براي نصب متعلقات برنامه اجرا ميكنيم:
⦁ $ docker-compose exec app composer install

خروجي مانند اين را خواهيد ديد:
Output
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 85 installs, 0 updates, 0 removals
– Installing doctrine/inflector (1.3.1): Downloading (100%)
– Installing doctrine/lexer (1.2.0): Downloading (100%)
– Installing dragonmantank/cron-expression (v2.3.0): Downloading (100%)
– Installing erusev/parsedown (1.7.4): Downloading (100%)
– Installing symfony/polyfill-ctype (v1.13.1): Downloading (100%)
– Installing phpoption/phpoption (1.7.2): Downloading (100%)
– Installing vlucas/phpdotenv (v3.6.0): Downloading (100%)
– Installing symfony/css-selector (v5.0.2): Downloading (100%)

Generating optimized autoload files
> IlluminateFoundationComposerScripts::postAutoloadDump
> @php artisan package:discover –ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/غير مجاز مي باشد
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.

آخرين كاري كه قبل از تست برنامه بايد انجام دهيم توليد يك كليد برنامه منحصر به فرد با ابزار خط فرمان artisan Laravel است. اين كليد براي رمزگذاري بخش هاي كاربر و ساير داده هاي حساس استفاده مي شود:
⦁ $ docker-compose exec app php artisan key:generate

Output
Application key set successfully.

اكنون به مرورگر خود برويد و به نام دامنه يا آدرس IP سرور مجازي خود در پورت 8000 دسترسي پيدا كنيد:
http://server_domain_or_IP:8000

توجه:در اين حالت اين دمو را در دستكاه محلي خود اجرا ميكنيد، از http://localhost:8000 براي دسترسي به برنامه از مرورگر خود استفاده كنيد.
صفحه اي را به اين شكل مشاهده خواهيد كرد:

مي توانيد از دستور logs براي بررسي ورود هاي ايجاد شده توسط سرويس هاي خود استفاده كنيد:
⦁ $ docker-compose logs nginx

Attaching to travellist-nginx

travellist-nginx | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
travellist-nginx | /docker-entrypoint.sh: Configuration complete; ready for start up
travellist-nginx | 192.168.0.1 – – [09/Jun/2020:11:46:34 +0000] “GET / HTTP/1.1” 200 627 “-” “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36”
travellist-nginx | 192.168.0.1 – – [09/Jun/2020:11:46:35 +0000] “GET / HTTP/1.1” 200 627 “-” “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36”

اگر مي خواهيد در هنگام حفظ وضعيت كليه سرويس هاي آن ، محيط Docker Compose را متوقف كنيد ، اين دستور را اجرا كنيد:

⦁ $ docker-compose pause
Output
Pausing travellist-db … done
Pausing travellist-nginx … done
Pausing travellist-app … done
براي ادامه دوباره برنامه:
⦁ $ docker-compose unpause
Output
Unpausing travellist-app … done
Unpausing travellist-nginx … done
Unpausing travellist-db … done

براي خاموش كردن محيط Docker Compose و حذف همه كانتينرها ، شبكه ها و واليوم هاي آن ، اين دستور را اجرا كنيد:
⦁ $ docker-compose down
Output
Stopping travellist-nginx … done
Stopping travellist-db … done
Stopping travellist-app … done
Removing travellist-nginx … done
Removing travellist-db … done
Removing travellist-app … done
Removing network travellist-laravel-demo_travellist

براي مشاهده كليه دستورات Docker Compose ، لطفاً مرجع خط فرمان Docker Compose را بررسي كنيد.
نتيجه
در اين راهنما ، ما يك محيط Docker با سه كانتينر را با استفاده از Docker Compose تنظيم كرده ايم تا زيرساخت هاي خود را در يك فايل YAML تعريف كنيم.
از اين مرحله به بعد ، مي توانيد بدون نياز به نصب و راه اندازي يك سرور مجازي وب محلي براي توسعه و آزمايش بر روي برنامه Laravel خود كار كنيد. علاوه بر اين ، با يك محيط يكبار مصرف كه مي تواند به راحتي تكثير و توزيع شود ، كار مي كنيد ، كه مي تواند در هنگام تهيه برنامه شما و همچنين هنگام حركت به سمت يك محيط توليد ، مفيد باشد.

 

از اين لينك ها زير مي توانيد آمورش هاي بيشتري براي لينوكس پيدا كنيد :

دسترسي از راه دور به برنامه GUI با Docker در اوبونتو 18.04

راه اندازي سايت توسعه Jekyll در اوبونتو 20.04

نحوه راه اندازي سايت توسعه Jekyll در اوبونتو 18.04

نحوه نصب و استفاده از Docker Compose در اوبونتو 20.04

نحوه اجراي چند نسخه PHP بر روي يك سرور با استفاده از Apache و PHP-FPM در CentOS 8

نحوه نصب و استفاده از TimescaleDB در Ubuntu 20.04

نحوه نصب و راه اندازي Laravel با Docker Compose در اوبونتو 20.04

 

 

خريد vps – خريد سرور مجازي – خريد سرور – سرور هلند – فروش vps – سرور مجازي آمريكا – خريدvps – سرور مجازي هلند – فروش سرور مجازي – سرور آمريكا – vps – سرور مجازي انگليس – سرور مجازي آلمان – سرور مجازي كانادا – خريد vps آمريكا – خريد وي پي اس – سرور – خريد سرور مجازي هلند – vps خريد – سرور مجازي فرانسه – سرور مجازي هلند – خريد vps آمريكا – خريد سرور مجازي ارزان هلند – vps – خريد vps هلند – خريد سرور مجازي آمريكا – خريد vps فرانسه – تست vps – سرور مجازي تست – سرور مجازي ويندوز – ارزانترين vps – خريد وي پي اس – vps ارزان – 

 

برچسب‌ها:


برچسب: ،
ادامه مطلب
امتیاز:
 
بازدید:
+ نوشته شده: ۸ تير ۱۳۹۹ساعت: ۰۱:۰۳:۱۱ توسط:sima موضوع:

نحوه نصب و استفاده از Docker در اوبونتو 20.04

Docker برنامه اي است كه پروسه مديريت فرآيندهاي برنامه را در كانتينرها را ساده مي كند. كانتينرها به شما امكان مي دهند برنامه هاي خود را در فرآيندهاي جدا از منابع اجرا كنيد. آنها شبيه به ماشين هاي مجازي هستند ، اما كانتينرها قابل حمل تر، سازگارتر با منابع و وابسته تر به سيستم عامل هاست هستند.
براي آشنايي دقيق با مؤلفه هاي مختلف يك كانتينر Docker ، اكوسيستم Docker: مقدمه اي براي مولفه هاي مشترك را بررسي كنيد.
در اين آموزش ، Docker Community Edition (CE) را در اوبونتو 20.04 نصب و استفاده خواهيد كرد. شما خود Docker را نصب خواهيد كرد ، با كانتينرها و تصاوير كار مي كنيد و يك تصوير را به مخزن Docker وارد مي كنيد.
پيش نيازها
براي دنبال كردن اين آموزش به موارد زير نياز داريد:
• يك سرور مجازي Ubuntu 20.04 با پيروي از راهنماي تنظيم اوليه سرور مجازي Ubuntu 20.04 ، از جمله يك كاربر sudo غير ريشه و فايروال راه اندازي شده.
• اگر مي خواهيد تصاوير خود را ايجاد كنيد و آنها را به سمت Docker Hub هدايت كنيد ، همانطور كه در مراحل 7 و 8 نشان داده شده است ، يك حساب كاربري در Docker Hub ايجاد كنيد.
مرحله 1 – نصب Docker
بسته نصب Docker موجود در مخزن رسمي اوبونتو ممكن است آخرين نسخه نباشد. براي اطمينان از آخرين نسخه ، Docker را از مخزن رسمي Docker نصب خواهيم كرد. براي انجام اين كار ، يك منبع جديد بسته اضافه خواهيم كرد ، تا اطمينان حاصل شود كه دانلودها معتبر هستند ، كليد GPG را از Docker اضافه كرده و سپس بسته را نصب كنيد.
ابتدا ليست بسته هاي موجود را به روز كنيد:
⦁ $ sudo apt update

در مرحله بعد ، چند بسته پيش نياز را نصب كنيد كه اجازه استفاده از بسته ها را از طريق HTTPS به apt بدهد:
⦁ $ sudo apt install apt-transport-https ca-certificates curl software-properties-common

سپس كليد GPG را براي مخزن رسمي Docker به سيستم خود اضافه كنيد:
⦁ $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –

مخزن Docker را به منابع APT اضافه كنيد:
⦁ $ sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable”

در مرحله بعد ، پايگاه داده بسته را با بسته هاي Docker از repo كه تازه اضافه شده به روز كنيد:
⦁ $ sudo apt update

مطمئن شويد كه به جاي repo پيش فرض اوبونتو قصد داريد از repo Docker نصب را انجام دهيد:
⦁ $ apt-cache policy docker-ce

خروجي مشابه اين را خواهيد ديد ، اگرچه ممكن است شماره نسخه Docker متفاوت باشد:
Output of apt-cache policy docker-ce
docker-ce:
Installed: (none)
Candidate: 5:19.03.9~3-0~ubuntu-focal
Version table:
5:19.03.9~3-0~ubuntu-focal 500
500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

توجه كنيد كه docker-ce نصب نشده است ، اما نامزد نصب، از مخزن Docker براي اوبونتو 20.04 است (focal).
در آخر ، Docker را نصب كنيد:
⦁ $ sudo apt install docker-ce

اكنون بايد Docker نصب شود ، Daemon شروع به كار كند و روند قادر به شروع در زمان بوت ميشود. بررسي كنيد كه در حال اجرا است:
⦁ $ sudo systemctl status docker

خروجي بايد مانند موارد زير باشد ، نشان مي دهد كه اين سرويس فعال و در حال اجرا است:
Output
● docker.service – Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-05-19 17:00:41 UTC; 17s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 24321 (dockerd)
Tasks: 8
Memory: 46.4M
CGroup: /system.slice/docker.service
└─24321 /usr/bin/dockerd -H fd:// –containerd=/run/containerd/containerd.sock

نصب Docker اكنون نه تنها سرويس Docker (Daemon) بلكه ابزار خط فرمان docker يا همان كلاينت Docker را به شما مي دهد. ما نحوه استفاده از دستور docker را بعدا در اين آموزش بررسي خواهيم كرد.
مرحله 2 – اجراي فرمان Docker بدون sudo (اختياري)
به طور پيش فرض ، دستور docker فقط مي تواند توسط كاربر root يا توسط يك كاربر در گروه docker اجرا شود ، كه به طور خودكار در طي مراحل نصب Docker ايجاد مي شود. اگر سعي كنيد فرمان docker را بدون پيشوند آن با sudo يا بدون حضور در گروه docker اجرا كنيد ، خروجي مانند اين را دريافت خواهيد كرد:
Output
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See ‘docker run –help’.

اگر مي خواهيد از تايپ كردن sudo اجتناب كنيد ، هر زمان كه دستور docker را اجرا كرديد ، نام كاربري خود را به گروه docker اضافه كنيد:
⦁ $ sudo usermod -aG docker ${USER}

براي اعمال عضويت در گروه جديد ، از سرور مجازي خارج شويد و دوباره وارد سيستم شويد يا دستور زير را تايپ كنيد:
⦁ $ su – ${USER}

براي ادامه از شما خواسته مي شود رمزعبور كاربري خود را وارد كنيد.
با تايپ كردن دستور زير تأييد كنيد كه كاربر شما اكنون به گروه docker اضافه شده است:
⦁ $ id -nG

Output
sammy sudo docker

اگر نياز داريد كه يك كاربر را به گروه docker اضافه كنيد كه با آن وارد نشده ايد ، آن نام كاربري را به صراحت اعلام كنيد:
⦁ $ sudo usermod -aG docker username

بقيه اين مقاله فرض مي كنيد كه شما دستور docker را به عنوان كاربر در گروه docker اجرا مي كنيد. اگر اين انتخاب را نكرديد ، لطفاً دستورات را با sudo وارد كنيد.
بياييد دستور docker را بررسي كنيم.
مرحله 3 – استفاده از دستور Docker
استفاده از docker شامل عبور از آن زنجيره اي گزينه ها و دستورات است كه پس از آن آرگومان ها قرار مي گيرند. تركيب دستور به اين شكل است:
⦁ $ docker [option] [command] [arguments]

براي مشاهده همه دستورات فرعي، تايپ كنيد:
⦁ $ docker

در مورد Docker 19 ، ليست كاملي از زيرفرمان هاي موجود شامل موارد زير است:
Output
attach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container’s changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container’s filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container’s filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource uغير مجاز مي باشدe statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes

براي مشاهده گزينه هاي موجود براي يك دستور خاص ، تايپ كنيد:
⦁ $ docker docker-subcommand –help

براي مشاهده اطلاعات گسترده سيستم درباره Docker ، از دستور زير استفاده كنيد:
⦁ $ docker info

بياييد برخي از اين دستورات را بررسي كنيم. ما با كار با تصاوير شروع خواهيم كرد.
مرحله 4 – كار با تصاوير Docker
كانتينرهاي Docker از تصاوير Docker ساخته شده اند. به طور پيش فرض ، Docker اين تصاوير را از Docker Hub دريافت ميكند ، يك رجيستري Docker كه توسط Docker ، يعني شركت پشتيبان پروژه Docker اداره مي شود. هر كسي مي تواند تصاوير Docker خود را در Docker Hub ميزباني كند ، بنابراين بيشتر برنامه ها و توزيع هاي لينوكس مورد نياز شما داراي تصاوير ميزباني شده در آنجا خواهند بود.
براي بررسي اينكه آيا مي توانيد به تصاوير در Docker Hub دسترسي پيدا كرده و آن ها دانلود كنيد ، اين دستور را تايپ كنيد:
⦁ $ docker run hello-world

خروجي نشان مي دهد كه Docker به درستي كار ميكند:
Output
Unable to find image ‘hello-world:latest’ locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c

8eeb426ad9a20c7ee045538ef34847f44f1
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This mesغير مجاز مي باشدe shows that your installation appears to be working correctly.

Docker در ابتدا قادر نبود تصوير hello world را به صورت لوكال پيدا كند ، بنابراين تصوير را از Docker Hub دانلود ميكرد ، كه مخزن پيش فرض ميباشد. پس از دانلود تصوير ، Docker يك كانتينر از تصوير و برنامه موجود در داخل كانتينر را اجرا كرده و پيام را نمايش داد.
با استفاده از دستور docker با زيرفرمان search  مي توانيد تصاوير موجود در Docker Hub را جستجو كنيد. به عنوان مثال ، براي جستجوي تصوير اوبونتو ، تايپ كنيد:
⦁ $ docker search ubuntu

اسكريپت Docker Hub را خزش كرده و ليستي از تمام تصويرهايي را كه نام آنها با رشته جستجو مطابقت دارد ، برمي گرداند. در اين مورد، خروجي مشابه اين خواهد بود:
Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 10908 [OK]
dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface … 428 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 244 [OK]
consol/ubuntu-xfce-vnc Ubuntu container with “headless” VNC session… 218 [OK]
ubuntu-upstart Upstart is an event-based replacement for th… 108 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with

در ستون OFFICIAL ، ok ، تصويري را بيان ميكند كه توسط شركت پشتيبان پروژه ساخته و پشتيباني ميشود. هنگامي كه تصويري را كه مي خواهيد از آن استفاده كنيد مشخص كرديد ، مي توانيد آن را با استفاده از زيرفرمان pull  در رايانه خود دانلود كنيد.
دستور زير را براي دانلود تصوير رسمي اوبونتو در رايانه خود اجرا كنيد:
⦁ $ docker pull ubuntu

خروجي زير را مشاهده خواهيد كرد:
Output
Using default tag: latest
latest: Pulling from library/ubuntu
d51af753c3d3: Pull complete
fc878cd0a91c: Pull complete
6154df8ff988: Pull complete
fee5db0ff82f: Pull complete
Digest: sha256:747d2dbbaaee995098c9792d99b

d333c6783ce56150d1b11e333bbceed5c54d7
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

پس از دانلود يك تصوير ، مي توانيد يك كانتينر را با استفاده از تصوير دانلود شده با زيرفرمان run اجرا كنيد. همانطور كه با مثال hello world مشاهده كرديد ، اگر هنگام اجراي docker با زيرفرمان run ، تصويري دانلود نشده است ، كلاينت Docker ابتدا تصوير را دانلود مي كند ، سپس يك كانتينر را با استفاده از آن اجرا مي كنيد.
براي ديدن تصاويري كه در رايانه شما دانلود شده است ، اين دستور را تايپ كنيد:
⦁ $ docker images

خروجي شبيه به زير خواهد بود:
Output
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB
hello-world latest bf756fb1ae65 4 months ago 13.3kB

همانطور كه بعداً در اين آموزش مشاهده خواهيد كرد ، تصاويري كه شما براي اجراي كانتينرها از آنها استفاده مي كنيد قابل تغيير است و از آنها براي توليد تصاوير جديد استفاده مي شود ، كه ممكن است بعدا در Docker Hub يا ساير رجيستري هاي Docker آپلود شود (اصطلاح فني آنpushed  است).
بياييد ببينيم كه چگونه كانتينرها را با جزئيات بيشتري اجرا كنيم.
مرحله 5 – اجراي يك كانتينر Docker
كانتينر hello-world شما كه در مرحله قبل اجرا شد نمونه اي از كانتينري است كه پس از انتشار يك پيام آزمايشي اجرا و ارائه مي شود. كانتينرها مي توانند بسيار مفيدتر از آن باشند و مي توانند تعاملي باشند. از اين گذشته ، آنها شبيه به ماشين هاي مجازي هستند ، فقط با منابع سازگار تر هستند.
به عنوان نمونه ، بگذاريد كانتينري را با استفاده از آخرين تصوير اوبونتو اجرا كنيم. تركيبي از سوئيچ هاي -i و -t به شما امكان دسترسي پوسته تعاملي به داخل كانتينرها را مي دهد:
⦁ $ docker run -it ubuntu

اعلان فرمان شما بايد تغيير كند تا منعكس كننده اين واقعيت باشد كه اكنون در داخل كانتينر كار مي كنيد و بايد به شكل درآيد:
Output
root@d9b100f2f636:/#

به شناسه كانتينر را در اعلان فرمان توجه داشته باشيد. در اين مثال d9b100f2f636 است. بعداً به آن شناسه كانتينر احتياج داريد تا بتوانيد كانتينر آن را حذف كنيد.
اكنون مي توانيد هر دستوري را درون كانتينر اجرا كنيد. به عنوان مثال ، بياييد پايگاه داده بسته را درون كانتينر به روز كنيم. لازم نيست كه هر دستور را با sudo تنظيم كنيد ، زيرا به عنوان كاربر اصلي در داخل كانتينر كار مي كنيد:
⦁ root@d9b100f2f636:/# apt update

سپس هر برنامه اي را در آن نصب كنيد. بگذاريد Node.js را نصب كنيم:
⦁ root@d9b100f2f636:/# apt install nodejs

اين Node.js را در مخزن از مخزن رسمي اوبونتو نصب مي كند. پس از اتمام نصب ، تأييد كنيد كه Node.js نصب شده است:
⦁ root@d9b100f2f636:/# node -v

شماره نسخه نمايش داده شده در ترمينال خود را مشاهده خواهيد كرد:
Output
v10.19.0

هرگونه تغيير در داخل كانتينر فقط براي آن كانتينر اعمال مي شود.
براي خروج از كانتينر ، exit را در اعلان تايپ كنيد.
بياييد نگاهي به مديريت كانتينرهاي موجود در سيستم خود بيندازيم.
مرحله 6 – مديريت كانتينرهاي Docker
پس از مدتي استفاده از Docker ، بسياري از كانتينرهاي فعال (در حال اجرا) و غيرفعال را در رايانه خود خواهيد داشت. براي مشاهده موارد فعال ، از دستور زير استفاده كنيد:
⦁ $ docker ps

خروجي مشابه زير را مشاهده خواهيد كرد:
Output
CONTAINER ID IMAGE COMMAND CREATED

در اين آموزش ، دو كانتينر را شروع كرديد. يكي از تصوير hello world و ديگري از تصوير ubuntu. هر دو كانتينرديگر در حال اجرا نيستند ، اما هنوز هم در سيستم شما وجود دارند.
براي مشاهده همه كانتينرها – فعال و غيرفعال ، docker ps را با كليد -a اجرا كنيد:
⦁ $ docker ps -a

خروجي مشابه اين را مشاهده خواهيد كرد:
1c08a7a0d0e4 ubuntu “/bin/bash” 2 minutes ago Exited (0) 8 seconds ago quizzical_mcnulty
a707221a5f6c hello-world “/hello” 6 minutes ago Exited (0) 6 minutes ago youthful_curie

براي مشاهده جديدترين كانتينري كه ايجاد كرده ايد ، سوئيچ -l را از آن عبور دهيد:
⦁ $ docker ps -l

$ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

$ 1c08a7a0d0e4 ubuntu “/bin/bash” 2 minutes ago Exited (0) 40 seconds ago quizzical_mcnulty
$

براي شروع يك كانتينر متوقف شده ، از docker start استفاده كنيد ، به دنبال آن شناسه كانتينر يا نام كانتينر مي آيد. بياييد كانتينر مستقر در اوبونتو را با شناسه 1c08a7a0d0e4 شروع كنيم:
⦁ $ docker start 1c08a7a0d0e4

كانتينر شروع مي شود و مي توانيد از docker ps براي ديدن وضعيت آن استفاده كنيد:
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu “/bin/bash” 3 minutes ago Up 5 seconds quizzical_mcnulty

براي متوقف كردن يك كانتينر در حال اجرا ، از docker stop استفاده كنيد ، به دنبال آن شناسه يا نام كانتينر درج ميشود. اين بار ، ما از اسمي استفاده مي كنيم كه Docker به كانتينر اختصاص داده است ، و quizzical_mcnulty ميباشد:
⦁ $ docker stop quizzical_mcnulty

وقتي تصميم گرفتيد كه ديگر نيازي به كانتينر نداشته باشيد ، آنرا با دستور docker rm ، دوباره با استفاده از شناسه كانتينر يا نام آن جدا كنيد. از دستور docker ps -a براي يافتن شناسه يا نام كانتينر مربوط به تصوير مربوط به hello world استفاده كنيد و آن را حذف كنيد.
⦁ $ docker rm youthful_curie

مي توانيد كانتينر جديدي را راه اندازي كرده و با استفاده از سوئيچ –name آن را نامگذاري كنيد. همچنين مي توانيد براي ايجاد يك كانتينر در صورت متوقف شدن ، از كليد سوئيچ –rm استفاده كنيد. براي اطلاعات بيشتر در مورد اين گزينه ها و ساير موارد ، به فرمان docker run help مراجعه كنيد.
كانتينرها را مي توان به تصاويري تبديل كرد كه مي توانيد از آنها براي ساخت كانتينرهاي جديد استفاده كنيد. بياييد ببينيم كه چگونه اين كار مي كند.
مرحله 7 – انجام تغييرات در يك كانتينر روي يك تصوير Docker
هنگامي كه يك تصوير Docker را راه اندازي مي كنيد ، مي توانيد درست مانند يك ماشين مجازي ، فايل ها را ايجاد ، اصلاح و حذف كنيد. تغييراتي كه ايجاد مي كنيد فقط در مورد آن كانتينر اعمال مي شود. مي توانيد آن را شروع و متوقف كنيد ، اما هنگامي كه آن را با دستور docker rm از بين ميبريد ، تغييرات به راحتي از بين مي روند.
در اين بخش نحوه ذخيره حالت يك كانتينر به عنوان تصوير جديد Docker به شما نشان داده مي شود.
پس از نصب Node.js در داخل كانتينر اوبونتو ، اكنون يك كانتينر در حال متوقف كردن تصوير وجود دارد ، اما اين كانتينر با كانتينري كه براي ايجاد تصوير استفاده كرديد، فرق مي كند. اما ممكن است بخواهيد بعداً از اين كانتينرهايNode.js به عنوان پايه اي براي تصاوير جديد استفاده كنيد.
سپس با استفاده از دستور زير تغييرات را به عنوان نمونه جديد Docker انجام دهيد.
⦁ $ docker commit -m “What you did to the image” -a “Author Name” container_id repository/new_image_name

سوئيچ -m f براي پيام تعهدي است كه به شما و ديگران كمك مي كند بدانند چه تغييراتي ايجاد كرده ايد ، در حالي كه -a براي مشخص كردن نويسنده استفاده مي شود. bowl_id همان چيزي است كه شما در ابتداي آموزش هنگام ذكر جلسه تعاملي Docker يادداشت كرديد. مخزن معمولاً نام كاربري Docker Hub شماست، مگر اينكه مخازن اضافي را در Docker Hub ايجاد كرده باشيد.
به عنوان مثال ، براي كاربر sammy ، با شناسه كانتينر d9b100f2f636 ، دستور زير را خواهيم داشت:
⦁ $ docker commit -m “added Node.js” -a “sammy” d9b100f2f636 sammy/ubuntu-nodejs

وقتي يك تصوير را ارائه مي كنيد ، تصوير جديد به صورت محلي در رايانه شما ذخيره مي شود. بعداً در اين آموزش ، ياد مي گيريد كه چگونه يك تصوير را به رجيستري Docker مانند Docker Hub وارد كنيد تا ديگران بتوانند به آن دسترسي پيدا كنند.
دوباره ليست كردن تصاوير Docker ، تصوير جديد و همچنين قديمي كه از آن گرفته شده است را نشان مي دهد:
⦁ $ docker images

خروجي مانند اين را خواهيد ديد:
Output
REPOSITORY TAG IMAGE ID CREATED SIZE
sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB

در اين مثال ، ubuntu-nodejs تصوير جديد است كه از تصوير موجود اوبونتو از Docker Hub گرفته شده است. تفاوت اندازه نشان دهنده تغييراتي است كه ايجاد شده است. و در اين مثال ، تغيير در نصب NodeJS بود. بنابراين دفعه ديگر كه بايد با استفاده از اوبونتو با پيش نصب NodeJS يك كانتينر را اجرا كنيد ، مي توانيد از تصوير جديد استفاده كنيد.
همچنين مي توانيد تصاوير را از يك Dockerfile بسازيد ، كه به شما امكان مي دهد نصب نرم افزار را در يك تصوير جديد خودكار كنيد. با اين حال ، اين مسئله خارج از محدوده اين آموزش است.
حال بگذاريد تصوير جديد را با ديگران به اشتراك بگذاريم تا بتوانند كانتينرها را از آن ايجاد كنيم.
مرحله 8 – وارد كردن تصاوير Docker به مخزن Docker
مرحله منطقي بعدي پس از ايجاد يك تصوير جديد از يك تصوير موجود ، به اشتراك گذاري آن با چند نفر از دوستانتان ، كل جهان موجود در Docker Hub يا ساير رجيستري هاي Docker است كه به آن دسترسي داريد. براي وارد كردن يك تصوير به Docker هاب يا هر رجيستري ديگر Docker ، بايد در آنجا يك حساب كاربري داشته باشيد.
در اين بخش نحوه ورود تصوير Docker به Docker Hub به شما نشان داده مي شود. براي يادگيري نحوه ايجاد رجيستري خصوصي Docker خود ، مقاله نحوه تنظيم يك رجيستري Docker خصوصي در اوبونتو 14.04 را بررسي كنيد.
براي وارد كردن تصوير ، ابتدا وارد Docker Hub شويد.
⦁ $ docker login -u docker-registry-username

از شما خواسته مي شود با استفاده از گذرواژه Docker Hub اعتبار خود را تأييد كنيد. اگر گذرواژه صحيح را وارد كنيد ، تأييد اعتبار بايد موفق آميز باشد.
توجه: اگر نام كاربري رجيستري Docker شما با نام كاربري محلي كه براي ايجاد تصوير از آن استفاده كرده ايد متفاوت است ، بايد تصوير خود را با نام كاربري رجيستري خود تگ كنيد. براي مثالي كه در مرحله آخر آورده شده است ، بايد تايپ كنيد:
⦁ $ docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

سپس مي توانيد با استفاده از دستور زير تصوير را وارد كنيد:
براي وارد كردن تصوير ubuntu-nodejs به مخزن sammy ، اين دستور عبارت است از:
⦁ $ docker push sammy/ubuntu-nodejs

ممكن است اين فرآيند آپلود كردن تصاوير مدتي طول بكشد ، اما پس از اتمام ، خروجي به اين صورت خواهد بود:
Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed

پس از وارد كردن تصوير به رجيستري ، بايد مانند صفحه نمايش تصوير زير ، در داشبورد حساب شما فهرست شود.

اگر تلاش براي وارد كردن تصوير منجر به خطايي از اين دست شود ، احتمالاً log in نشده ايد:
Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication required

با docker login وارد شويد و تلاش براي ورود را تكرار كنيد. سپس تأييد كنيد كه در صفحه مخزن Docker Hub شما وجود دارد.
اكنون مي توانيد با استفاده از docker pull sammy / ubuntu-nodejs ، تصوير را به دستگاه جديد وارد كنيد و از آن براي اجراي يك كانتينر جديد استفاده كنيد.
نتيجه
در اين آموزش Docker را نصب كرده ايد ، با تصاوير و كانتينرها كار كرده ايد و يك تصوير اصلاح شده را به Docker Hub وارد كرده ايد.

 

برچسب‌ها:


برچسب: ،
ادامه مطلب
امتیاز:
 
بازدید:
+ نوشته شده: ۸ تير ۱۳۹۹ساعت: ۱۲:۳۵:۱۲ توسط:sima موضوع:

نحوه راه اندازي Nginx با پشتيباني HTTP / 2 در اوبونتو 18.04

Nginx يك سرور مجازي وب منبع باز سريع و قابل اعتماد است. شهرت آن به دليل اشغال كم حافظه ، مقياس پذيري بالا ، سهولت پيكربندي و پشتيباني از طيف گسترده اي از پروتكل ها ميباشد.
HTTP / 2 نسخه جديدي از پروتكل نقل و انتقال Hypertext است كه در وب براي ارائه صفحات از سرور مجازي به مرورگر استفاده مي شود. HTTP / 2 اولين به روزرساني عمده HTTP در تقريباً دو دهه اخير است : HTTP1.1 در سال 1999 به عموم مردم معرفي شد در حالي كه صفحه هاي وب معمولاً فقط يك فايل HTML با شيوه نامه CSS درون خطي بودند. اينترنت از آن زمان به طرز چشمگيري تغيير كرده است، و اكنون ما با محدوديت هاي HTTP 1.1 روبرو هستيم – پروتكل سرعت انتقال بالقوه را براي اكثر وب سايت هاي مدرن محدود مي كند زيرا قسمت هايي از يك صفحه را در يك صف دانلود مي كند (دانلود قسمت قبلي بايد قبل از قسمت بعدي كامل شود) ، و به طور متوسط ​​يك صفحه وب مدرن به دانلود حدود 100 درخواست نياز دارد (هر درخواست يك عكس ، فايل js ، فايل CSS و غيره است).
HTTP / 2 اين مشكل را حل مي كند زيرا باعث ايجاد چند تغيير اساسي مي شود:
• همه درخواست ها به صورت موازي دانلود مي شوند ، نه در صف
• هدرهاي HTTP فشرده مي شوند
• صفحات به عنوان يك باينري ، نه به عنوان يك فايل متني انتقال پيدا ميكنند، كه كارآمدتر است
• سرور مجازي ها مي توانند داده ها را “push” كنندحتي بدون درخواست كاربر ، كه سرعت را براي كاربران با تأخير بالا بهبود مي بخشد
اگرچه HTTP / 2 به رمزگذاري نياز ندارد ، اما توسعه دهندگان دو مرورگر محبوب ، گوگل كروم و موزيلا فايرفاكس ، اظهار داشتند كه به دلايل امنيتي از HTTP / 2 فقط براي اتصالات HTTPS پشتيباني مي كنند. از اين رو ، اگر تصميم داريد سرور مجازي هايي را با پشتيباني HTTP / 2 تنظيم كنيد ، بايد آنها را با HTTPS نيز ايمن كنيد.
اين آموزش به شما كمك مي كند تا يك سرور مجازي سريع و مطمئن Nginx با پشتيباني HTTP / 2 تنظيم كنيد.
پيش نيازها
قبل از شروع كار ، به چند مورد نياز خواهيم داشت:
⦁ يك سرور مجازي Ubuntu 18.04 با پيروي از راهنماي تنظيم اوليه سرور مجازي Ubuntu 18.04 ، شامل يك كاربر sudo غير ريشه و فايروال.
⦁ Nginx كه بر روي سرور مجازي شما نصب شده باشد ، و مي توانيد با دنبال كردن نحوه نصب Nginx در اوبونتو 18.04 ، اين كار را انجام دهيد.
⦁ نام دامنه پيكربندي شده براي اشاره به سرور مجازي شما. مي توانيد در Namecheap خريداري كنيد يا يكي از آنها را به صورت رايگان در Freenom دريافت كنيد.
⦁ گواهي TLS / SSL كه براي سرور مجازي شما تنظيم شده است. سه گزينه داريد:
o با دنبال كردن چگونگي ايمن سازي Nginx با Let’s Encrypt در Ubuntu 18.04 مي توانيد گواهي رايگان از Let’s Encrypt دريافت كنيد.
o همچنين مي توانيد با دنبال كردن نحوه ايجاد يك گواهي SSL خود امضا شده براي Nginx در اوبونتو 18.04 ، يك گواهي خود امضا شده ايجاد و تنظيم كنيد.
o مي توانيد گواهي را از ارائه دهندگان ديگر خريداري كرده و Nginx را پيكربندي كنيد تا با پيروي از مراحل 2 تا 6 نحوه ايجاد يك گواهي SSL خود امضا شده براي Nginx در اوبونتو 18.04 از آن استفاده كنيد.
⦁ Nginx به گونه اي پيكربندي شود تا ترافيك را از پورت 80 به پورت 443 هدايت كند ، كه بايد با پيش نيازهاي قبلي پوشش داده شود.
⦁ Nginx به گونه اي پيكربندي شود تا از يك كليد 2040 بيتي يا بالاتر Ephemeral Diffie-Hellman (DHE) استفاده كند ، كه بايد با پيش نيازهاي قبلي نيز پوشش داده شود.
مرحله 1 – فعال كردن پشتيباني HTTP / 2
اگر مرحله نصب بلوك سرور مجازي را در آموزش نصب Nginx دنبال كرديد ، بايد يك سرور مجازي براي دامنه خود در / etc / nginx / sites-available / your_domain خود با server_namedirective كه قبلاً به طور مناسب تنظيم شده است ، داشته باشيد. اولين تغييري كه ما ايجاد خواهيم كرد اصلاح بلوك سرور مجازي دامنه شما براي استفاده از HTTP / 2 خواهد بود.
فايل پيكربندي را براي دامنه خود باز كنيد:
$ sudo nano /etc/nginx/sites-available/your_domain

در اين فايل ، متغيرهاي listen مربوط به پورت 443 را بيابيد:
your_domain’>/etc/nginx/sites-available/your_domain

listen [::]:443 ssl ipv6only=on;
listen 443 ssl;

مورد اول مربوط به اتصالات IPv6 است. مورد دوم براي كليه اتصالات IPv4 است. ما HTTP / 2 را براي هر دو فعال خواهيم كرد.
هر يك از دستورالعمل هاي listen را تغيير دهيد تا http2 را شامل شود:
your_domain’>/etc/nginx/sites-available/your_domain

listen [::]:443 ssl http2 ipv6only=on;
listen 443 ssl http2;

اين به Nginx مي گويد كه از HTTP / 2 با مرورگرهاي پشتيباني شده استفاده كند.
فايل پيكربندي را ذخيره كرده و ويرايشگر متن را ويرايش كنيد.
هر زمان كه در فايل هاي پيكربندي Nginx تغييراتي ايجاد كنيد ، بايد پيكربندي خطاهاي نحوي را مانند اين موارد بررسي كنيد:
$ sudo nginx –t

اگر نحو بدون خطا باشد ، خروجي زير را مشاهده خواهيد كرد:
Output of sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

در مرحله بعد ، ما سرور مجازي خود را پيكربندي خواهيم كرد تا از ليست محدودتر رمزها استفاده شود.
مرحله 2 – حذف سوئيت هاي رمزگذاري شده قديمي و ناايمن
HTTP / 2 داراي ليست سياه رمزهاي قديمي و ناامن است ، بنابراين بايد از آنها اجتناب كنيم. مجموعه هاي cipher مجموعه هاي رمزنگاري هستند كه نحوه رمزگذاري داده هاي انتقال يافته را توصيف مي كنند.
روشي كه براي تعريف cipher استفاده خواهيد كرد بستگي به نحوه پيكربندي گواهينامه هاي TLS / SSL شما براي Nginx دارد.
اگر براي به دست آوردن گواهينامه هاي خود از Certbot استفاده كرده ايد ، فايل /etc/letsencrypt/options-ssl-nginx.conf را نيز ايجاد كرده است كه حاوي cipher هايي است كه براي HTTP / 2 به اندازه كافي قوي نيستند. اصلاح اين فايل متأسفانه مانع از اعمال به روزرساني Certbot در آينده خواهد شد ، بنابراين ما فقط به Nginx ميگوييم كه از اين فايل استفاده نكند و ما ليست رمزهاي خود را مشخص خواهيم كرد.
فايل پيكربندي بلوك سرور مجازي را براي دامنه خود باز كنيد:
$ sudo nano /etc/nginx/sites-available/your_domain

خطي را كه شامل فايل هاي گزينه options-ssl-nginx.conf است پيدا كنيد و آن را حذف كنيد:
your_domain’>/etc/nginx/sites-available/your_domain

# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot<^>

در زير آن خط ، اين خط را براي تعريف رمز مجاز اضافه كنيد:
your_domain’>/etc/nginx/sites-available/your_domain

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

فايل را ذخيره كرده و از ويرايشگر خارج شويد.
اگر از گواهينامه هاي خود امضا شده يا از يك گواهي از سوي شخص ثالث استفاده كرده ايد و مطابق پيش نيازها آن را پيكربندي كرده ايد ، فايل /etc/nginx/snippets/ssl-params.conf را در ويرايشگر متن خود باز كنيد:
$ sudo nano /etc/nginx/snippets/ssl-params.conf

خط زير را پيدا كنيد:
/etc/nginx/snippets/ssl-params.conf

ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;

آن را به اين صورت اصلاح كنيد:
/etc/nginx/snippets/ssl-params.conf


ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3

فايل را ذخيره كنيد و از ويرايشگر خود خارج شويد.
يك بار ديگر ، پيكربندي خطاهاي نحوي را بررسي كنيد:
$ sudo nginx -t

اگر خطايي ديديد ، آن ها را هدف قرار داده و دوباره تست كنيد.
هنگامي كه خطايي نديديد ، Nginx را ريستارت كنيد:
$ sudo systemctl reload nginx

با راه اندازي مجدد سرور مجازي ، تأييد كنيد كه به خوبي كار مي كند.
مرحله 3 – تأييد فعال بودن HTTP / 2
بياييد اطمينان حاصل كنيم كه سرور مجازي با HTTP / 2 كار مي كند.
از دستور curl براي ايجاد درخواست به سايت خود و مشاهده هدر ها استفاده كنيد:
$ curl -I -L https://your_domain

خروجي زير را مشاهده خواهيد كرد:
Output
HTTP/1.1 301 Moved Permanently
Server: nginx/1.14.0 (Ubuntu)
Date: Fri, 06 Jul 2018 19:07:12 GMT
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
Location: https://your_domain/

HTTP/2 200
server: nginx/1.14.0 (Ubuntu)
date: Fri, 06 Jul 2018 19:07:12 GMT
content-type: text/html
content-length: 16
last-modified: Fri, 06 Jul 2018 16:55:37 GMT
etag: “5b3f9f09-10”
accept-ranges: bytes

همچنين مي توانيد تأييد كنيد كه HTTP / 2 در گوگل كروم در حال استفاده است. كروم را باز كرده و به http: // your_domain برويد. ابزارهاي برنامه نويسي كروم را باز كنيد (View -> Developer -> Developer Tools) و مجدد صفحه را لود كنيد (View -> Reload This Page). به سربرگ Network برويد ، بر روي رديف header جدول كه با Name شروع مي شود ، كليك راست كنيد و از منوي بازشده گزينه پروتكل را انتخاب كنيد.
h2 (مخفف HTTP / 2) را در يك ستون پروتكل جديد مشاهده خواهيد كرد كه نشان مي دهد HTTP / 2 در حال كار است.

در اين مرحله ، شما آماده ارائه مطالب از طريق پروتكل HTTP / 2 هستيد. بياييد با فعال كردن HSTS ، امنيت و عملكرد را بهبود ببخشيم.
مرحله 4 – فعال كردن امنيت سختگيرانه انتقال HTTP (HSTS)
حتي اگر درخواستهاي HTTP شما به HTTPS تغيير مسير دهند ، مي توانيد HTTP Strict Transport Security (HSTS) را فعال كنيد تا از انجام اين تغيير مسيرها جلوگيري شود. اگر مرورگر يك هدرHSTS پيدا كند ، ديگر سعي نخواهد كرد تا براي يك بازه زماني معين ، دوباره از طريق HTTP معمولي به سرور مجازي متصل شود. صرفنظر از نوع داده ، آن را فقط با اتصال HTTPS رمزگذاري شده داده تبادل مي كند. اين هدر همچنين از ما در برابر حملات تخريب پروتكل محافظت مي كند.
فايل پيكربندي Nginx را در ويرايشگر خود باز كنيد:
$ sudo nano /etc/nginx/nginx.conf

براي فعال كردن HSTS ، اين خط را به فايل اضافه كنيد:
/etc/nginx/nginx.conf
http {

##
# Virtual Host Configs
##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
add_header Strict-Transport-Security “max-age=15768000” always;
}

max-age در ثانيه تنظيم مي شود. مقدار 15768000 معادل 6 ماه است.
به طور پيش فرض ، اين هدر به زيردامنه ها اضافه نمي شود. اگر زير دامنه داريد و مي خواهيد HSTS روي همه آنها اعمال شود ، بايد متغير includeSubDomains را در انتهاي خط اضافه كنيد ، مانند اين:
/etc/nginx/nginx.conf
add_header Strict-Transport-Security “max-age=15768000; includeSubDomains” always;

فايل را ذخيره كنيد و از ويرايشگر خارج شويد.
يك بار ديگر ، پيكربندي خطاهاي نحوي را بررسي كنيد:
$ sudo nginx -t

سرانجام ، سرور مجازي Nginx را دوباره راه اندازي كنيد تا تغييرات اعمال شود.
$ sudo systemctl reload nginx

نتيجه
سرور مجازي Nginx شما اكنون در خدمت صفحات HTTP / 2 است. اگر مي خواهيد استحكام اتصال SSL خود را آزمايش كنيد ، لطفا به SSL Qualys LAB مراجعه كرده و تست را براي سرور مجازي خود اجرا كنيد. اگر همه چيز به درستي تنظيم شده است ، بايد يك علامت A + براي امنيت دريافت كنيد.

 

برچسب‌ها:


برچسب: ،
ادامه مطلب
امتیاز:
 
بازدید:
+ نوشته شده: ۸ تير ۱۳۹۹ساعت: ۱۲:۳۰:۲۹ توسط:sima موضوع:

چگونه مي توان پلتفرم Cloud IDE كد سرور را روي Debian 10 تنظيم كرد

با حركت ابزارهاي گسترش دهنده به سمت cloud ، ايجاد و تطابق پذيري پلتفرم cloud IDE (محيط پيشرفت ادغام شده) در حال رشد است. Cloud IDE ها امكان همكاري زمان واقعي (real-time) بين تيم هاي توسعه دهنده را فراهم مي كنند تا در يك محيط توسعه يكپارچه كار كنند و ناسازگاري ها را به حداقل مي رساند اما توليد را افزايش ميدهد. چون از طريق مرورگرهاي وب قابل دسترسي اند ، Cloud IDE ها در هر نوع دستگاه مدرن موجود هستند.
code-server يك كد مايكروسافت ويژوال استوديو است كه روي يك سرور مجازي از راه دور اجرا مي شود و مستقيماً از مرورگر شما قابل دسترسي است. ويژوال استوديو كد يك ويرايشگر كد مدرن با پشتيباني Git ادغام شده، يك اشكال زدا براي كد، داراي تكميل خودكار هوشمند و ويژگي هاي قابل سفارشي سازي و قابل بسط ميباشد. بدان معني كه مي توانيد از دستگاه هاي مختلف با سيستم عامل هاي مختلف استفاده كنيد و هميشه يك محيط توسعه مداوم داشته باشيد.
در اين آموزش ، پلتفرم cloud IDE كد سرور مجازي را بر روي دستگاه Debian 10 خود تنظيم كرده و آن را در دامنه قرار مي دهيد ، كه با گواهي TLS در Let’s Encrypt ايمن شده است. در آخر، كد ويژوال استوديو را روي سرور مجازي Debian 10 خود راه اندازي ميكنيد كه در دامنه شما در دسترس است و با پسورد محافظت ميشود.
پيش نيازها
⦁ سرور مجازي كه Debian 10 را اجرا ميكند با حداقل 2 گيگابايت رم ، دسترسي به ريشه و يك حساب sudo و غير ريشه. مي توانيد اين كار را با دنبال كردن راهنماي اوليه تنظيم سرور انجام دهيد.
⦁ Nginx كه روي سرور مجازي شما نصب شده باشد. براي راهنمايي در مورد نحوه انجام اين كار ، مراحل 1 تا 4 نحوه نصب Nginx را در Debian 10 مطالعه كنيد.
⦁ يك نام دامنه كاملا ثبت شده براي ميزباني كد سرور مجازي ، كه به سرور مجازي شما اشاره ميكند. در اين آموزش از code-server.your-domain استفاده مي شود. مي توانيد نام دامنه را در Namecheap خريداري كنيد ، به صورت رايگان در Freenom دريافت كنيد ، يا از ثبت دامنه مورد نظر خود استفاده كنيد.
مرحله 1 – نصب كد- سرور مجازي
در اين بخش كد-سرور مجازي را روي سرور مجازي خود تنظيم مي كنيد. اين مستلزم دانلود آخرين نسخه و ايجاد سرويس سيستمي است كه كد-سرور مجازي را هميشه در پس زمينه اجرا مي كند. همچنين رويكرد ريستارت را براي سرويس تعيين خواهيد كرد ، به اين ترتيب كد-سرور مجازي پس از خرابي يا ريبوت احتمالي در دسترس خواهد بود.
همه داده هاي مربوط به كد-سرور مجازي را در پوشه اي به نام ~ / code-server ذخيره مي كنيد. با اجراي دستور زير آن را ايجاد كنيد:
⦁ $ mkdir ~/code-server
به آن پوشه برويد:
⦁ $ cd ~/code-server

بايد به صفحه نسخه هاي كد-سرور مجازي Github برويد و آخرين لينوكس را انتخاب كنيد (نام فايل شامل “linux” خواهد بود). در زمان نوشتن ، آخرين نسخه 3.2.0 بوده است. با اجراي دستور زير آن را با استفاده از wget دانلود كنيد:
$ wget https://github.com/cdr/code-server/releases/download/3.2.0/code-server-3.2.0-linux-x86_64.tar.gz

سپس با اجراي اين دستور، آرشيو را باز كنيد:
⦁ $ tar -xzvf code-server-3.2.0-linux-x86_64.tar.gz

پوشه اي دقيقاً به نام فايل اصلي كه دانلود كرده ايد ، دريافت ميكنيد كه شامل كد منبع كد-سرور مجازي است. آن را در / usr / lib / code-server كپي كنيد تا با اجراي دستور زير بتوانيد به صورت گسترده به آن دسترسي پيدا كنيد:
⦁ $ sudo cp -r code-server-3.2.0-linux-x86_64 /usr/lib/code-server

سپس ، يك لينك نمادين را در / usr / bin / code-server ايجاد كنيد ، كه به قابليت اجراي كد-سرور مجازي اشاره كند:
⦁ $ sudo ln -s /usr/lib/code-server/code-server /usr/bin/code-server

در مرحله بعد ، يك پوشه براي كد-سرور مجازي ايجاد كنيد ، كه در آن داده هاي كاربر را ذخيره مي كند:
⦁ $ sudo mkdir /var/lib/code-server

اكنون كه كد-سرور مجازي را دانلود كرده ايد و آن را در سراسر سيستم در دسترس قرار داده ايد ، يك سرويس سيستمي ايجاد خواهيد كرد تا كد-سرور مجازي را هميشه در پس زمينه اجرا كنيد.
پيكربندي سرويس را در فايلي به نام code-server.service ، در ديركتوريuser / lib / systemd / system ذخيره خواهيد كرد ، جايي كه سيستم عامل سرويس هاي خود را ذخيره مي كند. آن را با استفاده از ويرايشگر متن خود ايجاد كنيد:
⦁ $ sudo nano /lib/systemd/system/code-server.service

خطوط زير را اضافه كنيد:

/lib/systemd/system/code-server.service
[Unit]
Description=code-server
After=nginx.service

[Service]
Type=simple
Environment=PASSWORD=your_password
ExecStart=/usr/bin/code-server –bind-addr 127.0.0.1:8080 –user-data-dir /var/lib/code-server –auth password
Restart=always

[Install]
WantedBy=multi-user.target

در اينجا ابتدا شرح سرويس را مشخص مي كنيد. سپس ، اعلام مي كنيد كه سرويس nginx قبل از اين بايد شروع شود. بعد از بخش [Unit] نوع سرويس را تعريف مي كنيد (simple بدان معني است كه فرايند بايد به سادگي اجرا شود) و فرماني را كه اجرا مي شود ارائه مي دهد.
همچنين مشخص مي كنيد كه اجراي كد-سرور مجازي جهاني بايد با چند آرگومان خاص براي كد-سرور مجازي آغاز شود. –bind-addr 127.0.0.1:8080 آن را به localhost  در پورت 8080 متصل مي كند ، بنابراين فقط از داخل سرور مجازي شما قابل دسترسي است. –user-data-dir /var/lib/code-server دايركتوري داده هاي كاربر خود را تنظيم مي كند ، و –auth password مشخص مي كند كه بايد بازديد كنندگان را با يك رمزعبور ، مشخص شده در متغير محيط PASSWORD كه در خط بالاي آن مشخص شده است ، تأييد كند.
به ياد داشته باشيد كه your_password را با رمز عبور دلخواه خود جايگزين كنيد ، سپس فايل را ذخيره كنيد و ببنديد.
خط بعدي به systemd مي گويد تا كد-سرور مجازي را در تمام مواقع عدم كاركرد ريستارت كند (براي مثال ، هنگام خرابي يا قطع فرايند). بخش [Install] به سيستم دستور مي دهد تا در صورت امكان ورود به سرور مجازي شما ، اين سرويس را شروع كند.
با اجراي دستور زير سرويس كد-سرور مجازي را شروع كنيد:
⦁ $ sudo systemctl start code-server

با مشاهده وضعيت آن بررسي كنيد كه درست شروع شده است:
⦁ $ sudo systemctl status code-server

خروجي مشابه اين مشاهده خواهيد كرد:
Output
● code-server.service – code-server
Loaded: loaded (/lib/systemd/system/code-server.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2020-05-13 19:31:00 UTC; 13s ago
Main PID: 1851 (node)
Tasks: 14 (limit: 2378)
Memory: 25.7M
CGroup: /system.slice/code-server.service
├─1851 /usr/lib/code-server/node /usr/lib/code-server/out/node/entry.js –bind-addr 127.0.0.1:8080 –user-data-dir /var/lib/code-server –auth pas
└─1862 /usr/lib/code-server/node /usr/lib/code-server/out/node/entry.js –bind-addr 127.0.0.1:8080 –user-data-dir /var/lib/code-server –auth pas

May 13 19:31:00 code-server-update systemd[1]: Started code-server.
May 13 19:31:01 code-server-update code-server[1851]: info code-server 3.2.0 fd36a99a4c78669970ebc4eb05768293b657716f
May 13 19:31:01 code-server-update code-server[1851]: info HTTP server listening on http://127.0.0.1:8080
May 13 19:31:01 code-server-update code-server[1851]: info – Using custom password for authentication
May 13 19:31:01 code-server-update code-server[1851]: info – Not serving HTTPS
May 13 19:31:01 code-server-update code-server[1851]: info Automatic updates are enabled

براي شروع خودكار كد-سرور مجازي پس از راه اندازي مجدد سرور ، سرويس خود را با اجراي دستور زير فعال كنيد:
⦁ $ sudo systemctl enable code-server

در اين مرحله ، كد-سرور مجازي را دانلود كرده و آن را در سطح جهاني در دسترس قرار داده ايد. سپس ، يك سرويس سيستمي براي آن ايجاد كرده ايد و آن را فعال كرده ايد ، بنابراين كد-سرور مجازي از هر بوت سرور مجازي شروع مي شود. سپس ، با پيكربندي Nginx به عنوان يك پروكسي معكوس بين بازديد كننده و كد-سرور مجازي آن را در معرض نمايش دامنه خود قرار مي دهيد.
مرحله 2 – قرار دادن كد-سرور مجازي در معرض دامنه
در اين بخش ، Nginx را به عنوان يك پروكسي معكوس براي كد-سرور مجازي پيكربندي مي كنيد.
همانطور كه در مرحله پيش نياز Nginx آموخته ايد ، فايل هاي پيكربندي سايت آن تحت /etc/nginx/sites-available ذخيره مي شوند و بعداً بايد با /etc/nginx/sites-enabled لينك شوند تا فعال گردند.
پيكربندي را براي قرار دادن كد-سرور مجازي در دامنه خود در فايلي به نام code-server.conf ، تحت /etc/nginx/sites-available ذخيره مي كنيد. با ايجاد ويرايشگر خود را شروع به كار كنيد:
⦁ $ sudo nano /etc/nginx/sites-available/code-server.conf

خطوط زير را اضافه كنيد:
/etc/nginx/sites-available/code-server.conf
server {
listen 80;
listen [::]:80;

server_name code-server.your-domain;

location / {
غير مجاز مي باشد_pass http://localhost:8080/;
غير مجاز مي باشد_set_header Upgrade $http_upgrade;
غير مجاز مي باشد_set_header Connection upgrade;
غير مجاز مي باشد_set_header Accept-Encoding gzip;
}
}

code-server.your-domain را با دامنه مورد نظر خود جايگزين كنيد ، سپس فايل را ذخيره كنيد و ببنديد.
در اين فايل ، تعريف مي كنيد كه Nginx بايد به پورت HTTP 80 گوش كند. سپس ، يك server_name را تعيين مي كنيد كه به Nginx مي گويد براي كدام دامنه درخواست ها را بپذيرد و اين پيكربندي خاص را اعمال كند. در بلوك بعدي ، براي مكان ريشه (/) ، مشخص مي كنيد كه درخواست ها بايد به كد-سرور مجازي در حال اجرا در localhost:8080 به جلو و عقب منتقل شوند. سه خط بعدي (كه با غير مجاز مي باشد_set_header شروع ميشود) به Nginx دستور مي دهد تا برخي از هدرهاي درخواست HTTP را كه براي عملكرد صحيح WebSockets مورد نياز هستند ، استفاده كند.
براي فعال كردن پيكربندي اين سايت، بايد سيملينكي از آن را با دستور زير در پوشه /etc/nginx/sites-enabled ايجاد كنيد:
$ sudo ln -s /etc/nginx/sites-available/code-server.conf /etc/nginx/sites-enabled/code-server.conf

براي آزمايش اعتبار پيكربندي ، دستور زير را اجرا كنيد:
⦁ $ sudo nginx -t

خروجي زير را مشاهده خواهيد كرد:
Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

براي اينكه پيكربندي عملي شود ، بايد Nginx را مجدداً راه اندازي كنيد:
⦁ $ sudo systemctl restart nginx

اكنون نصب سرور مجازي كد شما در دامنه شما قابل دسترسي است. در مرحله بعد ، با استفاده از يك گواهي نامه Let’s Encrypt TLS رايگان ، آن را ايمن خواهيد كرد.

مرحله 3 – امنيت بخشيدن به دامنه
در اين بخش دامنه خود را با استفاده از گواهي نامه Let’s Encrypt TLS كه با استفاده از Certbot تهيه مي نماييد، ايمن مي كنيد.
براي نصب آخرين نسخه Certbot ، دستور زير را اجرا كنيد:
⦁ $ sudo apt install certbot python-certbot-nginx

به عنوان بخشي از پيش نيازها، ufw (فايروال كامپايل نشده) را فعال و آن را براي ارائه ترافيك HTTP رمزگذاري نشده پيكربندي كرديد. براي امكان دسترسي به سايت ايمن، بايد آن را به گونه اي پيكربندي كنيد كه ترافيك رمزگذاري شده را با اجراي دستور زير بپذيرد:
⦁ $ sudo ufw allow https

خروجي به صورت زير خواهد بود:
Output
Rule added
Rule added (v6)
به صورت مشابه با Nginx، بايد آن را براي اعمال پيكربندي مجدد لود كنيد:
$ sudo ufw reload
خروجي به اين صورت خواهد بود:
Output
Firewall reloaded

سپس در مرورگر خود به دامنه مورد استفاده براي سرور مجازي كد برويد. اعلان ورود به سرور مجازي كد را مشاهده خواهيد كرد.

سرور مجازي كد از شما مي خواهد رمز عبور خود را وارد كنيد. رمز عبوري كه در مرحله قبل تنظيم كرديد وارد كنيد و Enter IDE را بزنيد. اكنون سرور مجازي كد را وارد كرده و فوراً رابط كاربري گرافيكي آن را مشاهده مي كنيد.

اكنون كه بررسي كرد كد سرور مجازي به درستي در اختيار دامنه قرار گرفته است، گواهي هاي Let’s Encrypt TLS را براي ايمني با استفاده از Certbot نصب ميكنيد.
$ sudo certbot –nginx -d code-server.your-domain

در اين دستور ، شما certbot را براي درخواست گواهينامه ها براي دامنه خود اجرا مي كنيد – نام دامنه را با پارامتر -d وارد ميكنيد. پرچم –nginx به آن مي گويد براي پشتيباني از HTTPS ، پيكربندي سايت Nginx را به طور خودكار تغيير دهيد. به ياد داشته باشيد كه دامنه code-server.your خود را با نام دامنه خود جايگزين كنيد.
اگر اولين بار است كه Certbot را اجرا مي كنيد ، از شما خواسته مي شود كه يك آدرس ايميل براي اخطارهاي ضروري وارد كنيد و شرايط خدمات EFF را بپذيريد. سپس Certbot درخواست Let’s Encrypt براي گواهي دامنه شما را ميدهد. سپس از شما سؤال مي كند كه آيا مايليد همه ترافيك HTTP را به HTTPS هدايت كنيد:
Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
1: No redirect – Make no further changes to the webserver configuration.
2: Redirect – Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you’re confident your site works on HTTPS. You can undo this
change by editing your web server’s configuration.
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Select the appropriate number [1-2] then [enter] (press ‘c’ to cancel):

توصيه مي شود براي به حداكثر رساندن امنيت گزينه دوم را انتخاب كنيد. پس از وارد كردن انتخاب خود ، ENTER را فشار دهيد.
خروجي مشابه اين خواهد بود:
Output
IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/code-server.your-domain/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/code-server.your-domain/privkey.pem
Your cert will expire on … To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the “certonly” option. To non-interactively renew *all* of
your certificates, run “certbot renew”
– Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
– If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

اين بدان معني است كه Certbot موفق به توليد گواهينامه هاي TLS شده و آنها را در پيكربندي Nginx براي دامنه شما به كار مي برد. اكنون مي توانيد دامنه كد سرور مجازي خود را در مرورگر خود مجدد لود كنيد و يك پدلاك (قفل) در سمت چپ آدرس سايت مشاهده كنيد ، اين بدان معني است كه اتصال شما به درستي ايمن است.
اكنون كه كد-سرور مجازي را از طريق يك پروكسي معكوس Nginx در دامنه خود داريد ، آماده استفاده از واسط كاربري كد-سرور مجازي هستيد.
مرحله 4 – استفاده از رابط كد-سرور مجازي
در اين بخش از برخي از ويژگي هاي رابط كد-سرور مجازي استفاده خواهيد كرد. از آنجا كه كد-سرور مجازي ويژوال استوديو كد در حال اجرا در cloud است ، همان رابط كاربري نسخه دسكتاپ مستقل را دارد.
در سمت چپ IDE ، يك رديف عمودي از شش دكمه وجود دارد كه بيشترين ويژگي هاي مورد استفاده را در يك صفحه جانبي كه با عنوان Activity Bar شناخته مي شود باز مي كند.

اين نوار قابل تنظيم است بنابراين مي توانيد اين نماها را به ترتيب ديگري جابجا كنيد يا آنها را از نوار حذف كنيد. به طور پيش فرض ، اولين دكمه منوي كلي را به صورت كشويي باز مي كند ، در حالي كه نماي دوم پنل اكسپلورر را باز مي كند كه پيمايش درخت مانند از ساختار پروژه را فراهم مي كند. مي توانيد پوشه ها و فايل هاي خود را در اينجا مديريت كنيد – ايجاد ، حذف ، جابجايي و تغيير نام آنها در صورت لزوم. نماي بعدي دسترسي به عملكرد جستجو و جايگزيني را فراهم مي كند
به دنبال اين ، به ترتيب پيش فرض ، نماي شما از سيستم هاي كنترل منبع مانند Git قرار ميگيرد. كد ويژوال استوديو همچنين از ساير ارائه دهندگان كنترل منبع پشتيباني مي كند و مي توانيد در اين مستندات دستورالعمل هاي بيشتري را براي جريان كاري كنترل منبع با ويرايشگر بيابيد.

گزينه اشكال زدايي در نوار فعاليت ، كليه اقدامات معمول را براي اشكال زدايي در پنل ارائه مي دهد. ويژوال استوديو كد با پشتيباني داخلي براي اشكال زدايي زمان اجراي Node.js و هر زباني كه به Javascript تبديل شود همراه است. براي ساير زبانها مي توانيد افزونه هايي را براي اشكال زدايي مورد نياز نصب كنيد. مي توانيد پيكربندي هاي اشكال زدايي را در فايل launch.jsonذخيره كنيد.

نماي نهايي در نوار فعاليت ، منويي را براي دسترسي به افزونه هاي موجود در Marketplace فراهم مي كند.
قسمت اصلي GUI ويرايشگر شماست كه مي توانيد آن ها را با استفاده از زبانه ها براي ويرايش كد خود جدا كنيد. مي توانيد نماي ويرايش خود را به يك سيستم شبكه يا به فايل هاي جانبي تغيير دهيد.

پس از ايجاد فايل جديد از طريق منوي File ، يك فايل خالي در يك تب جديد باز مي شود و پس از ذخيره سازي ، نام فايل در پنل جانبي Explorer قابل مشاهده خواهد بود. ايجاد پوشه ها را مي توان با كليك راست بر روي نوار كناري Explorer و كليك بر روي New Folder انجام داد. مي توانيد پوشه اي را با كليك بر روي نام آن و همچنين drag و drop فايل ها و پوشه ها به قسمتهاي بالايي بسط دهيد تا آنها را به يك مكان جديد منتقل كنيد.

مي توانيد با وارد كردن CTRL + SHIFT + `، يا با كليك كردن بر روي ترمينال در منوي كشويي بالاي منو ، و انتخاب New Terminal ، به ترمينال دسترسي پيدا كنيد. ترمينال در يك پنل پايين تر باز خواهد شد و ديركتوري كار آن روي فضاي كاري پروژه تنظيم مي شود ، كه شامل فايل ها و پوشه هاي نمايش داده شده در پنل سمت Explorer است.
شما يك نماي كلي سطح بالا از رابط كد سرور مجازي را جستجو كرده ايد و برخي از متداول ترين ويژگي ها را مشاهده كرده ايد.
نتيجه
اكنون كد-سرور مجازي ، يك IDE همه كاره cloud را در اختيار داريد كه بر روي سرور مجازي Debian 10 شما نصب شده است ، در دامنه شما قرار گرفته و با استفاده از گواهي Let’s Encrypt ايمن شده است. هم اكنون مي توانيد بر روي پروژه ها بصورت جداگانه و همچنين در يك مجموعه همكاري تيمي كار كنيد. اجراي IDE cloud منابع موجود در دستگاه محلي شما را آزاد مي كند و به شما امكان مي دهد منابع را در صورت لزوم مقياس كنيد. براي اطلاعات بيشتر در مورد ويژگي هاي ديگر و دستورالعمل هاي دقيق در مورد ساير مؤلفه هاي كد-سرور مجازي ، به مطالب كد ويژوال استوديو مراجعه كنيد.

 

برچسب‌ها:


برچسب: ،
ادامه مطلب
امتیاز:
 
بازدید:
+ نوشته شده: ۸ تير ۱۳۹۹ساعت: ۱۲:۲۴:۳۹ توسط:sima موضوع:

نحوه دسترسي از راه دور به برنامه هاي GUI با استفاده از Docker و Caddy در Debian 10

حتي با محبوبيت روزافزون خدمات ابري ، نياز به اجراي برنامه هاي بومي هنوز وجود دارد.
با استفاده از noVNC و TigerVNC ، مي توانيد برنامه هاي بومي را درون يك كانتينر Docker اجرا كنيد و از راه دور با استفاده از يك مرورگر وب به آنها دسترسي پيدا كنيد. علاوه بر اين ، مي توانيد برنامه خود را بر روي سرور مجازي با منابع سيستم بيشتر از آنچه به صورت محلي موجود داريد اجرا كنيد ، كه مي تواند در هنگام اجراي برنامه هاي بزرگ ، انعطاف پذيري بيشتري را ارائه دهد.
در اين آموزش ، Mozilla Thunderbird ، كلاينت ايميل را با استفاده از Docker كانتينرايز مي كنيد. پس از آن ، آن را ايمن كرده و با استفاده از سرور مجازي وب Caddy امكان دسترسي از راه دور را فراهم خواهيد كرد.
پس از اتمام كار ، فقط با يك مرورگر وب مي توانيد از هر وسيله اي به Thunderbird دسترسي پيدا كنيد. همچنين به صورت اختياري مي توانيد با استفاده از WebDAV به طور محلي به فايل هاي موجود در آن دسترسي پيدا كنيد. همچنين يك تصوير كاملاً خود شمول از Docker خواهيد داشت كه مي توانيد در هر مكاني اجرا كنيد.
پيش نيازها
قبل از شروع اين راهنما ، به موارد زير نياز خواهيد داشت:
⦁ يك سرور مجازي Debian 10 با حداقل 2 گيگابايت رم و فضاي ديسك 4 گيگابايتي.
⦁ يك كاربر غير ريشه با امتيازات sudo.
⦁ Docker كه روي سرور مجازي شما تنظيم شده باشد. مي توانيد نحوه نصب و استفاده از Docker در Debian 10 را در اين لينك دنبال كنيد.
مرحله 1 – ايجاد پيكربندي supervisord
اكنون كه سرور مجازي شما در حال اجرا است و Docker نصب شده است ، آماده هستيد تا پيكربندي كانتينر برنامه خود را شروع كنيد. از آنجا كه كانتينر شما از چندين مؤلفه تشكيل شده است ، براي راه اندازي و نظارت بر آنها بايد از يك مدير فرآيند استفاده كنيد. در اينجا ، از supervisord استفاده خواهيد كرد. supervisord يك مدير فرآيند است كه در پايتون نوشته شده و اغلب براي موزون كردن كانتينرهاي پيچيده استفاده مي شود.
ابتدا دايركتوري به نام thunderbird براي كانتينر خود ايجاد كنيد و وارد شويد:
⦁ $ mkdir ~/thunderbird

⦁ $ cd ~/thunderbird

اكنون با استفاده از nano يا ويرايشگر مورد نظر خود ، فايلي به نام supervisord.conf ايجاد و باز كنيد:
⦁ $ nano ~/thunderbird/supervisord.conf

اكنون اين اولين بلوك كد را به supervisord.conf اضافه كنيد ، كه گزينه هاي جهاني براي supervisord را تعريف مي كند:
~/thunderbird/supervisord.conf
[supervisord]
nodaemon=true
pidfile=/tmp/supervisord.pid
logfile=/dev/fd/1
logfile_maxbytes=0
در اين بخش ، شما خود supervisord را پيكربندي مي كنيد. بايد nodaemon را روي true تنظيم كنيد زيرا درون يك كانتينر Docker به عنوان ورودي وارد مي شود. بنابراين ، مي خواهيد كه در پيش زمينه اجرا شود. همچنين pidfile را روي مسيري كه توسط يك كاربر غير ريشه قابل دسترسي است و logfile را روي stdout تنظيم ميكنيد تا بتوانيد ورودها را مشاهده كنيد.
در مرحله بعد ، يك بلوك كد كوچك ديگر را به supervisord.conf اضافه كنيد. اين بلوك TigerVNC را كه يك سرور مجازي تركيبي VNC / X11 است شروع مي كند:
~/thunderbird/supervisord.conf

[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

در اين بلوك ، سرور مجازي X11 را تنظيم مي كنيد. X11 يك پروتكل سرور مجازي نمايشگر است ، همان چيزي است كه به برنامه هاي GUI اجازه اجرا مي دهد. توجه داشته باشيد كه در آينده باWayland جايگزين خواهد شد ، اما دسترسي از راه دور هنوز در دست توسعه است.
براي اين كانتينر ، شما از TigerVNC و سرور مجازي داخلي VNC استفاده مي كنيد. كه داراي چندين مزيت نسبت به استفاده از يك سرور مجازي جداگانه X11 و VNC است:
• زمان پاسخ سريعتر ، زيرا كشيدن GUI مستقيماً روي سرور مجازي VNC انجام مي شود به جاي اينكه روي يك بافر چارچوب واسطه (حافظه اي كه محتويات صفحه را ذخيره مي كند) انجام شود.
• تغيير اندازه خودكار صفحه ، كه به برنامه ريموت اجازه مي دهد تا به طور خودكار تغيير اندازه دهد تا با كلاينت (در اين حالت ، پنجره مرورگر وب شما) متناسب باشد.
در صورت تمايل ، مي توانيد آرگومان را براي گزينه -desktop از Thunderbird به چيز ديگري كه انتخاب كرده ايد تغيير دهيد. سرور مجازي انتخاب شما را به عنوان تيتر صفحه وب مورد استفاده براي دسترسي به برنامه شما نمايش مي دهد.
اكنون ، بياييد يك بلوك سوم از كد را به supervisord.conf اضافه كنيم تا easy-novnc را شروع كنيم:
~/thunderbird/supervisord.conf

[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

در اين بلوك ، يك easy-novnc را راه اندازي مي كنيد ، يك سرور مجازي مستقل كه يك پوشش حول noVNC فراهم مي كند. اين سرور مجازي دو نقش را انجام مي دهد. ابتدا يك صفحه اتصال ساده فراهم مي كند كه به شما امكان مي دهد گزينه هاي اتصال را پيكربندي كنيد و به شما امكان مي دهد موارد پيش فرض را تنظيم كنيد. دوم ، VNC را روي WebSocket پروكسي ميكند ، كه به آن امكان دسترسي از طريق يك مرورگر وب معمولي را مي دهد.
معمولاً تغيير اندازه در سمت كلاينت انجام مي شود (يعني مقياس بندي تصوير) ، اما شما از گزينه resize=remote استفاده مي كنيد تا از تنظيمات وضوح تصويري از راه دور TigerVNC استفاده كامل كنيد. اين گزينه همچنين تأخير كمتري را در دستگاه هاي كندتر مانند Chromebooks رده پايين ايجاد مي كند:
توجه: در اين آموزش از easy-novnc استفاده شده است. در صورت تمايل مي توانيد به جاي آن از websockify و يك وب سرور مجازي جداگانه استفاده كنيد. مزيت easy-novnc اين است كه ميزان حافظه و زمان راه اندازي آن به ميزان قابل توجهي پايين است و خود شمول به حساب مي آيد. easy-novnc همچنين يك صفحه اتصال تميزتر نسبت به noVNC پيش فرض ارائه مي دهد و تنظيم گزينه هاي پيش فرض مفيد براي اين ستاپ (مانند resize=remote) را ممكن مي سازد.

براي شروع OpenBox ، يعني مدير پنجره ، بلوك زير را به پيكربندي خود اضافه كنيد:
~/thunderbird/supervisord.conf

[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

در اين بلوك ، شما در حال راه اندازي OpenBox ، مدير پنجره سبك X11 هستيد. مي توانيد از اين مرحله بگذريد ، اما بدون آن ، نمودارهاي ميله اي عنوان را نداريد يا نمي توانيد اندازه ويندوز را تغيير دهيد.
در آخر ، بياييد آخرين بلوك را به supervisord.conf اضافه كنيم ، كه برنامه اصلي را شروع مي كند:
~/thunderbird/supervisord.conf

[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

در اين بلوك آخر ، براي اطمينان از اجراي Thunderbird بعد از TigerVNC ، اولويت را روي 1 تنظيم كنيد در غير اين صورت با يك شرايط مسابقه روبرو مي شويد و به طور تصادفي در شروع كار ناكام خواهيد ماند. بنابراين autorestart = true قرار دهيد تا اگر برنامه به اشتباه بسته شد ، برنامه را مجدداً باز كنيد. متغير محيط DISPLAY به برنامه مي گويد تا روي سرور مجازي VNC كه قبلاً تنظيم كرده ايد نمايش داده شود.
در اينجا ظاهر نهايي supervisord.conf شما نمايش داده شده است:
~/thunderbird/supervisord.conf
[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

اگر مي خواهيد برنامه ديگري را كانتينرايز كنيد ، /usr/bin/thunderbird را با مسير قابل اجراي برنامه خود جايگزين كنيد. در غير اين صورت ، اكنون آماده پيكربندي منوي اصلي GUI خود هستيد.
مرحله 2 – تنظيم منوي OpenBox
اكنون كه مدير پروسه شما پيكربندي شده است ، بياييد منوي OpenBox را تنظيم كنيم. اين منو به ما امكان مي دهد تا برنامه ها را درون كانتينر راه اندازي كنيم. همچنين يك ترمينال و مانيتور پردازش براي اشكال زدايي در صورت لزوم را در اختيار خواهيم داشت.
در داخل ديركتوري برنامه خود ، از nano يا ويرايشگر متن مورد علاقه خود استفاده كنيد تا فايل جديدي به نام menu.xml ايجاد و باز كنيد:
⦁ $ nano ~/thunderbird/menu.xml

اكنون كد زير را به menu.xml اضافه كنيد:
~/thunderbird/menu.xml





/usr/bin/thunderbird




/usr/bin/x-terminal-emulator




/usr/bin/x-terminal-emulator -e htop



اين فايل XML شامل آيتم هاي منو است كه با كليك راست بر روي دسكتاپ ظاهر مي شود. هر مورد از يك ليبل و يك عمل تشكيل شده است.
اگر مي خواهيد برنامه ديگري را كانتينرايز كنيد ، / usr / bin / thunderbird را با مسير اجرايي برنامه خود جايگزين كنيد و ليبل مورد را تغيير دهيد.
مرحله 3 – ايجاد Dockerfile
اكنون كه OpenBox پيكربندي شده است ، Dockerfile را ايجاد خواهيد كرد ، كه همه چيز را به هم پيوند مي دهد.
يك Dockerfile در ديركتوري كانتينر خود ايجاد كنيد:
⦁ $nano ~/thunderbird/Dockerfile

براي شروع ، بياييد براي ساختن easy-novnc كد ديگري اضافه كنيم:
~/thunderbird/Dockerfile
FROM golang:1.14-buster 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

در مرحله اول ، شما در حال ساختن easy-novnc هستيد. براي سادگي و صرفه جويي در فضا اين كار در يك مرحله جداگانه انجام مي شود – به زنجيره ابزار كليGo در تصوير نهايي خود نيازي نداريد. به@ v1.1.0 در دستور build توجه داشته باشيد. اين تضمين مي كند كه نتيجه تعيين كننده است ، و از آن جهت مهم است كه Docker نتيجه هر مرحله را ذخيره مي كند. اگر نسخه صريح را مشخص نكرده ايد ، Docker در زمان ساخت اولين تصوير، آخرين نسخه هاي easy-novnc را ارجاع مي دهد. علاوه بر اين ، بهتر است اطمينان حاصل كنيد كه يك نسخه خاص از easy-novnc را دانلود مي كنيد تا در صورت ايجاد تغييرات در رابط CLI آن را داشته باشيد.
حالا بياييد مرحله دوم را ايجاد كنيم كه به تصوير نهايي تبديل مي شود. در اينجا از Debian 10 (Buster) به عنوان تصوير پايه استفاده خواهيد كرد. توجه داشته باشيد كه از آنجا كه اين كار در يك كانتينر در حال اجرا است ، صرف نظر از توزيع شما در سرور مجازي خود ، كار خواهد كرد.
سپس ، بلوك زير را به Dockerfile خود اضافه كنيد:
~/thunderbird/Dockerfile

FROM debian:buster
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

در اين دستورالعمل ، شما Debian 10 را به عنوان تصوير پايه خود نصب مي كنيد و سپس حداقل مورد نياز براي اجراي برنامه هاي GUI را در كانتينر خود نصب مي كنيد. توجه داشته باشيد كه apt-get update را به عنوان بخشي از همان دستورالعمل ها براي جلوگيري از مشكلات ذخيره سازي در Docker ، اجرا كنيد. براي صرفه جويي در فضا ، همچنين ليست هاي بسته را كه بعد از آن دانلود شده است حذف مي كنيد (بسته هاي ذخيره شده به صورت پيش فرض حذف مي شوند). همچنين /usr/share/desktop-directories را ايجاد مي كنيد زيرا برخي برنامه ها به دايركتوري موجود بستگي دارند.
بياييد يك بلوك كد كوچك ديگر اضافه كنيم:
~/thunderbird/Dockerfile

RUN apt-get update -y &&
apt-get install -y –no-install-recommends lxterminal nano wget openssh-client rsync ca-certificates xdg-utils htop tar xzip gzip bzip2 zip unzip &&
rm -rf /var/lib/apt/lists

در اين دستورالعمل ، شما در حال نصب برخي از نرم افزارها و بسته هاي عمومي مفيد هستيد. موارد قابل توجه در اينجا xd-utils (كه دستورات پايه مورد استفاده برنامه هاي دسكتاپ را در لينوكس فراهم مي كند) و ca-certificates (كه گواهي هاي ريشه را نصب مي كند تا به ما امكان دسترسي به سايت هاي HTTPS را بدهد) هستند.
اكنون مي توانيم دستورالعمل برنامه اصلي را اضافه كنيم:
~/thunderbird/Dockerfile

RUN apt-get update -y &&
apt-get install -y –no-install-recommends thunderbird &&
rm -rf /var/lib/apt/lists

مانند گذشته ، در اينجا ما در حال نصب برنامه هستيم. اگر برنامه كاربردي ديگري را كانتينرايز ميكنيد ، مي توانيد اين دستورات را با دستورالعمل هاي لازم براي نصب برنامه خاص خود جايگزين كنيد. برخي از برنامه ها براي اجراي داخل Docker به كار كمي بيشتر نياز دارند. به عنوان مثال ، اگر برنامه اي را نصب مي كنيد كه از Chrome ،Chromium يا QtWebEngine استفاده مي كند ، بايد از آرگومان خط فرمان –no-sandbox استفاده كنيد ، زيرا در Docker پشتيباني نمي شود.
در مرحله بعد ، بياييد دستورالعمل هايي را اضافه كنيم تا چند فايل آخر به كانتينر اضافه شود:
~/thunderbird/Dockerfile

COPY –from=easy-novnc-build /bin/easy-novnc /usr/local/bin/
COPY menu.xml /etc/xdg/openbox/
COPY supervisord.conf /etc/
EXPOSE 8080

در اينجا شما مي توانيد فايل هاي پيكربندي را كه قبلاً ايجاد كرده ايد به تصوير اضافه كرده و از مرحله اول كپي كردن باينري easy-novnc را انجام دهيد.
اين بلوك كد بعدي دايركتوري داده را ايجاد مي كند و كاربر اختصاصي را براي برنامه شما اضافه مي كند. از آن جهت مهم است كه برخي برنامه ها از اجرا به عنوان ريشه خودداري مي كنند. همچنين بهتر است كه حتي در يك كانتينر ، برنامه ها را به صورت ريشه اجرا نكنيد.
~/thunderbird/Dockerfile

RUN groupadd –gid 1000 app &&
useradd –home-dir /data –shell /bin/bash –uid 1000 –gid 1000 app &&
mkdir -p /data
VOLUME /data

براي اطمينان از يك UID / GID سازگار براي فايل ها ، صريحاً هر دو را روي 1000 تنظيم مي كنيد. همچنين مي توانيد يك حجم را در دايركتوري داده قرار دهيد تا اطمينان حاصل شود كه بين راه ريستارت ها همچنان ادامه دارد.
در آخر ، دستورالعمل هايي را براي راه اندازي همه موارد اضافه مي كنيم:
~/thunderbird/Dockerfile

CMD [“sh”, “-c”, “chown app:app /data /dev/stdout && exec gosu app supervisord”]

با تنظيم دستور پيش فرض روي supervisord ، مدير فرآيندهاي مورد نياز براي اجراي برنامه شما را راه اندازي مي كند. در اين حالت ، به جاي ENTRYPOINT از CMD استفاده مي كنيد. در بيشتر موارد ، تفاوتي ايجاد نمي كند ، اما استفاده از CMD براي اين منظور به چند دليل مناسب تر است. اولا ، supervisord هيچ آرگوماني مربوط به ما را دريافت نميكند ، و اگر آرگومان هايي را به كانتينر ارائه مي دهيد ، آنها CMD را جايگزين مي كنند و به ENTRYPOINT اضافه مي شوند. دوما ، استفاده از CMD به ما امكان مي دهد هنگام ارسال آرگومان ها به داخل كانتينر ، يك دستور كاملاً متفاوت (كه توسط / bin / sh -c اجرا خواهد شد) ارائه دهيم ، كه اشكال زدايي را آسان تر مي كند.
و در آخر ، لازم است قبل از شروع supervisord ، chown را به عنوان ريشه اجرا كنيد تا از مشكلات مجوز در حجم داده جلوگيري كنيد و به فرآيند كودك (child) اجازه دهيد stdout را باز كند. اين همچنين بدان معني است كه شما بايد به جاي دستورالعمل USER براي تعويض كاربر از gosu استفاده كنيد.
در اينجا ظاهر Dockerfile تكميل شده شما به شرح زير است:
~/thunderbird/Dockerfile
FROM golang:1.14-buster 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:buster

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 xzip 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”]

Dockerfile خود را ذخيره كرده و ببنديد. اكنون آماده ساخت و اجراي كانتينر خود هستيم و سپس به Thunderbird – كه يك برنامه GUI است، دسترسي پيدا خواهيم كرد.
مرحله 4 – ساخت و اجراي كانتينر
مرحله بعدي ساخت كانتينر شما و تنظيم آن در زمان راه اندازي است. همچنين مي توانيد يك حجم براي حفظ داده هاي برنامه بين ريستارت ها و به روز رساني تنظيم كنيد.
ابتدا كانتينر خود را بسازيد. حتماً اين دستورات را در ديركتوري ~ / thunderbird اجرا كنيد:
⦁ $ 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

توجه داشته باشيد كه در صورت تمايل ، مي توانيد thunderbird-app را بعد از گزينه –name با نام ديگري جايگزين كنيد. هرچه انتخاب كرديد ، اكنون برنامه شما كانتينرايز شده و در حال اجرا است. اكنون بياييد از سرور مجازي وب Caddy براي امنيت آن استفاده كنيم و از راه دور به آن متصل شويم.
مرحله 5 – تنظيم Caddy
در اين مرحله ، وب سرور مجازي Caddy را تنظيم مي كنيد تا تأييد هويت انجام شود و به صورت اختياري ، دسترسي از راه دور فايل از طريق WebDAV را انجام دهد. براي سادگي و اينكه به شما امكان استفاده از پروكسي معكوس موجود خود را بدهد ، آن را در يك كانتينر ديگر اجرا كنيد.
يك ديركتوري جديد ايجاد كنيد و سپس به داخل آن برويد:
⦁ $ mkdir ~/caddy

⦁ $ cd ~/caddy

اكنون با استفاده از nano يا ويرايشگر مورد نظر خود ، يك Dockerfile جديد ايجاد كنيد:
⦁ $ nano ~/caddy/Dockerfile

سپس بخش هاي زير را اضافه كنيد:
~/caddy/Dockerfile
FROM golang:1.14-buster AS caddy-build
WORKDIR /src
RUN echo ‘module caddy’ > go.mod &&
echo ‘require github.com/caddyserver/caddy/v2 v2.0.0’ >> go.mod &&
echo ‘require github.com/mholt/caddy-webdav v0.0.0-20200523051447-bc5d19941ac3’ >> 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:buster

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”]

اين Dockerfile با فعال كردن افزونه WebDAV ، Caddy را ايجاد مي كند ، و سپس آن را در پورت 8080 با Caddyfile در / etc / Caddyfile راه اندازي مي كند. فايل را ذخيره كنيد و ببنديد.
سپس سرور مجازي وب Caddy را پيكربندي مي كنيد. فايلي به نام Caddyfile را در دايركتوري كه تازه ايجاد كرده ايد ايجاد كنيد:
⦁ $ nano ~/caddy/Caddyfile

اكنون بلوك كد زير را به Caddyfile خود اضافه كنيد:
~/caddy/Caddyfile
{
order webdav last
}
:8080 {
log
root * /data
reverse_غير مجاز مي باشد thunderbird-app:8080

handle /files/* {
uri strip_prefix /files
file_server browse
}
redir /files /files/

handle /webdav/* {
uri strip_prefix /webdav
webdav
}
redir /webdav /webdav/

basicauth /* {
{env.APP_USERNAME} {env.APP_PASSWORD_HASH}
}
}

اين Caddyfile ديركتوري اصلي را به كانتينر thunderbird-app كه در مرحله 4 ايجاد كرده ايد پروكسي ميكند ( Docker آن را در IP صحيح تجزيه مي كند). همچنين يك مرورگر فايل مبتني بر وب فقط قابل خواندن در /files ارائه مي كند و يك سرور مجازي WebDAV را روي / webdav اجرا مي كند كه مي توانيد براي دسترسي به فايل هاي خود به صورت محلي قرار دهيد. نام كاربري و رمز عبور از متغيرهاي محيط APP_USERNAME و APP_PASSWORD_HASH خوانده مي شود.
اكنون كانتينر را بسازيد:
⦁ $ docker build -t thunderbird-caddy .

Caddy v2 نياز به hash رمز عبور مورد نظر شما دارد. دستور زير را اجرا كنيد و به ياد داشته باشيد كه mypass را با يك رمز عبور قوي به انتخاب خود جايگزين كنيد:
⦁ $ docker run –rm -it thunderbird-caddy caddy hash-password -plaintext ‘mypass’

اين دستور يك رشته كاراكتر را توليد مي كند. اين كار را براي تهيه دستور بعدي در كليپ بورد خود كپي كنيد.
اكنون آماده اجراي كانتينر هستيد. اطمينان حاصل كنيد كه myuser را با نام كاربري مورد نظر خود جايگزين كنيد و mypass-hash را با همان دستوري كه در مرحله قبل اجرا كرديد جايگزين نماييد. همچنين مي توانيد پورت (8080 در اينجا) را براي دسترسي به سرور مجازي خود در پورت ديگري تغيير دهيد:
$ 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

اكنون آماده دسترسي و آزمايش برنامه خود هستيم.
مرحله 6 – تست و مديريت برنامه
بياييد به برنامه دسترسي پيدا كنيم و از عملكرد آن اطمينان حاصل نماييم.
ابتدا http: // your_server_ip: 8080 را در يك مرورگر وب باز كنيد ، با اعتباراتي كه قبلاً انتخاب كرده ايد وارد شويد و روي connect كليك كنيد.

اكنون مي توانيد با برنامه تعامل برقرار كنيد ، و براي تنظيم مناسب پنجره مرورگر ، بايد به طور خودكار تغيير اندازه دهد.

اگر بر روي دسكتاپ سياه رنگ كليك راست كنيد، بايد منويي را مشاهده كنيد كه به شما امكان دسترسي به يك ترمينال را مي دهد. اگر كليك وسط كنيد ​​، بايد ليستي از پنجره ها را ببينيد.

اكنون http://your_server_ip:8080/files/ را در يك مرورگر وب باز كنيد. بايد بتوانيد به فايل هاي خود دسترسي پيدا كنيد.

به صورت اختياري ، مي توانيد http: // your_server_ip: 8080 / webdav / خود را در يك كلاينت WebDAV نصب كنيد. بايد بتوانيد مستقيماً به فايل هاي خود دسترسي پيدا كرده و آن ها را تغيير دهيد. اگر از گزينه Map network drive در ويندوز اكسپلورر استفاده مي كنيد ، بايد براي اضافه كردنHTTPS از يك پروكسي معكوس استفاده كنيد يا HKLMSYSTEMCurrentControlSetServicesWebClientParametersBasicAuthLevel را روي DWORD:2 تنظيم كنيد.
در هر صورت ، برنامه GUI بومي شما اكنون براي استفاده از راه دور آماده است.
نتيجه
اكنون با موفقيت يك كانتينر Docker را براي Thunderbird تنظيم كرده ايد و سپس با استفاده از Caddy ، دسترسي به آن را از طريق يك مرورگر وب پيكربندي كرده ايد. در صورت نياز به بروزرساني برنامه خود ، كانتينرها را متوقف كنيد ، docker rm thunderbird-app thunderbird-web را اجراي كنيد، تصاوير را مجدد بسازيد و سپس دستورات docker را از مراحل قبلي بالا مجدداً اجرا كنيد. از آنجا كه در يك حجم ذخيره مي شود ، داده هاي شما همچنان حفظ مي شوند.
اگر مي خواهيد در مورد دستورات اساسي Docker اطلاعات بيشتري كسب كنيد ، مي توانيد اين لينك آموزش يا اين صفحه را بخوانيد. براي استفاده طولاني مدت تر ، ميتوانيد HTTPS را براي امنيت بيشتر فعال كنيد (براي اين كار به دامنه اي نياز داريد).
علاوه بر اين ، اگر بيش از يك برنامه نصب كرده ايد ، مي توانيد به جاي شروع هر كانتينر به صورت دستي ، از Docker Compose يا Kubernetes استفاده كنيد. و به ياد داشته باشيد ، اين آموزش مي تواند به عنوان پايه اي براي اجراي ساير برنامه هاي لينوكس روي سرور مجازي شما استفاده شود ، از جمله:
⦁ Wine ، يك لايه سازگاري براي اجراي برنامه هاي ويندوز در لينوكس.
⦁ GIMP ، ويرايشگر تصوير منبع باز.
⦁ Cutter ، پلتفرم مهندسي معكوس منبع باز.
اين گزينه آخر پتانسيل بسيار مهمي را براي كانتينرايز و دسترسي از راه دور به برنامه هاي GUI ارائه مي دهد. با استفاده از اين ستاپ ، اكنون مي توانيد از سرور مجازي  با توان محاسباتي بسيار بيشتر از آنچه به صورت محلي در دسترس داريد براي اجراي ابزارهاي منبع فشرده مانند Cutter استفاده كنيد.

 

برچسب‌ها:


برچسب: ،
ادامه مطلب
امتیاز:
 
بازدید:
+ نوشته شده: ۸ تير ۱۳۹۹ساعت: ۱۲:۱۸:۵۰ توسط:sima موضوع:

چگونه مي توان پلتفرم Cloud IDE كد سرور را روي CentOS 7 تنظيم كرد

با حركت ابزارهاي گسترش دهنده به سمت cloud ، ايجاد و تطابق پذيري پلتفرم cloud IDE (محيط پيشرفت ادغام شده) در حال رشد است. Cloud IDE ها امكان همكاري زمان واقعي (real-time) بين تيم هاي توسعه دهنده را فراهم مي كنند تا در يك محيط توسعه يكپارچه كار كنند و ناسازگاري ها را به حداقل مي رساند اما توليد را افزايش ميدهد. چون از طريق مرورگرهاي وب قابل دسترسي اند ، Cloud IDE ها در هر نوع دستگاه مدرن موجود هستند.
code-server يك كد مايكروسافت ويژوال استوديو است كه روي يك سرور مجازي از راه دور اجرا مي شود و مستقيماً از مرورگر شما قابل دسترسي است. ويژوال استوديو كد يك ويرايشگر كد مدرن با پشتيباني Git ادغام شده، يك اشكال زدا براي كد، داراي تكميل خودكار هوشمند و ويژگي هاي قابل سفارشي سازي و قابل بسط ميباشد. بدان معني كه مي توانيد از دستگاه هاي مختلف با سيستم عامل هاي مختلف استفاده كنيد و هميشه يك محيط توسعه مداوم داشته باشيد.
در اين آموزش ، پلتفرم cloud IDE كد سرور مجازي را بر روي دستگاه CentOS 7 خود تنظيم كرده و آن را در دامنه قرار مي دهيد ، كه با گواهي TLS در Let’s Encrypt ايمن شده است. در آخر، كد ويژوال استوديو را روي سرور مجازي CentOS 7 خود راه اندازي ميكنيد كه در دامنه شما در دسترس است و با پسورد محافظت ميشود.
پيش نيازها
⦁ سرور مجازي كه CentOS 7 را اجرا ميكند با حداقل 2 گيگابايت رم ، دسترسي به ريشه و يك حساب sudo و غير ريشه. مي توانيد اين كار را با دنبال كردن راهنماي اوليه تنظيم سرور CentOS 7 انجام دهيد.
⦁ Nginx كه روي سرور مجازي شما نصب شده باشد. براي راهنمايي در مورد نحوه انجام اين كار ، مراحل 1 تا 4 نحوه نصب Nginx را در CentOS 7 مطالعه كنيد.
⦁ يك نام دامنه كاملا ثبت شده براي ميزباني كد سرور مجازي ، كه به سرور مجازي شما اشاره ميكند. در اين آموزش از code-server.your-domain استفاده مي شود. مي توانيد نام دامنه را در Namecheap خريداري كنيد ، به صورت رايگان در Freenom دريافت كنيد ، يا از ثبت دامنه مورد نظر خود استفاده كنيد.
مرحله 1 – نصب كد- سرور مجازي
در اين بخش كد-سرور مجازي را روي سرور مجازي خود تنظيم مي كنيد. اين مستلزم دانلود آخرين نسخه و ايجاد سرويس سيستمي است كه كد-سرور مجازي را هميشه در پس زمينه اجرا مي كند. همچنين رويكرد ريستارت را براي سرويس تعيين خواهيد كرد ، به اين ترتيب كد-سرور پس از خرابي يا ريبوت احتمالي در دسترس خواهد بود.
همه داده هاي مربوط به كد-سرور مجازي را در پوشه اي به نام ~ / code-server ذخيره مي كنيد. با اجراي دستور زير آن را ايجاد كنيد:
⦁ $ mkdir ~/code-server
به آن پوشه برويد:
⦁ $ cd ~/code-server

بايد به صفحه نسخه هاي كد-سرور مجازي Github برويد و آخرين لينوكس را انتخاب كنيد (نام فايل شامل “linux” خواهد بود). در زمان نوشتن ، آخرين نسخه 3.2.0 بوده است. با اجراي دستور زير آن را با استفاده از curl دانلود كنيد:
⦁ $ curl -LO https://github.com/cdr/code-server/releases/download/3.2.0/code-server-3.2.0-linux-x86_64.tar.gz
سپس با اجراي اين دستور، آرشيو را باز كنيد:
⦁ $ tar -xzvf code-server-3.2.0-linux-x86_64.tar.gz

پوشه اي دقيقاً به نام فايل اصلي كه دانلود كرده ايد ، دريافت ميكنيد كه شامل كد منبع كد-سرور مجازي است. آن را در / usr / lib / code-server كپي كنيد تا با اجراي دستور زير بتوانيد به صورت گسترده به آن دسترسي پيدا كنيد:
⦁ $ sudo cp -r code-server-3.2.0-linux-x86_64 /usr/lib/code-server

سپس ، يك لينك نمادين را در / usr / bin / code-server ايجاد كنيد ، كه به عملكرد كد-سرور مجازي اشاره كند:
⦁ $ sudo ln -s /usr/lib/code-server/code-server /usr/bin/code-server

در مرحله بعد ، يك پوشه براي كد-سرور مجازي ايجاد كنيد ، كه در آن داده هاي كاربر را ذخيره مي كند:
⦁ $ sudo mkdir /var/lib/code-server

اكنون كه كد-سرور مجازي را دانلود كرده ايد و آن را در سراسر سيستم در دسترس قرار داده ايد ، يك سرويس سيستمي ايجاد خواهيد كرد تا كد-سرور مجازي را هميشه در پس زمينه اجرا كنيد.
پيكربندي سرويس را در فايلي به نام code-server.service ، در ديركتوريuser / lib / systemd / system ذخيره خواهيد كرد ، جايي كه سيستم عامل سرويس هاي خود را ذخيره مي كند. آن را با استفاده از ويرايشگر متن خود ايجاد كنيد:
⦁ $ sudo nano /lib/systemd/system/code-server.service

خطوط زير را اضافه كنيد:
/lib/systemd/system/code-server.service
[Unit]
Description=code-server
After=nginx.service

[Service]
Type=simple
Environment=PASSWORD=your_password
ExecStart=/usr/bin/code-server –bind-addr 127.0.0.1:8080 –user-data-dir /var/lib/code-server –auth password
Restart=always

[Install]
WantedBy=multi-user.target

در اينجا ابتدا شرح سرويس را مشخص مي كنيد. سپس ، اعلام مي كنيد كه سرويس nginx قبل از اين بايد شروع شود. بعد از بخش [Unit] نوع سرويس را تعريف مي كنيد (simple بدان معني است كه فرايند بايد به سادگي اجرا شود) و فرماني را كه اجرا مي شود ارائه مي دهد.
همچنين مشخص مي كنيد كه اجراي كد-سرور مجازي جهاني بايد با چند آرگومان خاص براي كد-سرور مجازي آغاز شود. –bind-addr 127.0.0.1:8080 آن را به localhost  در پورت 8080 متصل مي كند ، بنابراين فقط از داخل سرور مجازي شما قابل دسترسي است. –user-data-dir /var/lib/code-server دايركتوري داده هاي كاربر خود را تنظيم مي كند ، و –auth password مشخص مي كند كه بايد بازديد كنندگان را با يك رمزعبور ، مشخص شده در متغير محيط PASSWORD كه در خط بالاي آن مشخص شده است ، تأييد كند.
به ياد داشته باشيد كه your_password را با رمز عبور دلخواه خود جايگزين كنيد ، سپس فايل را ذخيره كنيد و ببنديد.
خط بعدي به systemd مي گويد تا كد-سرور مجازي را در تمام مواقع عدم كاركرد ريستارت كند (براي مثال ، هنگام خرابي يا قطع فرايند). بخش [Install] به سيستم دستور مي دهد تا در صورت امكان ورود به سرور مجازي شما ، اين سرويس را شروع كند.
با اجراي دستور زير سرويس كد-سرور مجازي را شروع كنيد:
⦁ $ sudo systemctl start code-server

با مشاهده وضعيت آن بررسي كنيد كه درست شروع شده است:
⦁ $ sudo systemctl status code-server

خروجي مشابه اين مشاهده خواهيد كرد:
Output
● code-server.service – code-server
Loaded: loaded (/usr/lib/systemd/system/code-server.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2020-05-13 19:57:27 UTC; 5s ago
Main PID: 10608 (node)
CGroup: /system.slice/code-server.service
├─10608 /usr/lib/code-server/node /usr/lib/code-server/out/node/entry.js –bind-addr 127.0.0.1:8080 –user-data-dir /var/lib/code-server –auth…
└─10622 /usr/lib/code-server/node /usr/lib/code-server/out/node/entry.js –bind-addr 127.0.0.1:8080 –user-data-dir /var/lib/code-server –auth…

May 13 19:57:27 code-server-update-centos systemd[1]: Started code-server.
May 13 19:57:27 code-server-update-centos code-server[10608]: info code-server 3.2.0 fd36a99a4c78669970ebc4eb05768293b657716f
May 13 19:57:27 code-server-update-centos code-server[10608]: info HTTP server listening on http://127.0.0.1:8080
May 13 19:57:27 code-server-update-centos code-server[10608]: info – Using custom password for authentication
May 13 19:57:27 code-server-update-centos code-server[10608]: info – Not serving HTTPS
May 13 19:57:27 code-server-update-centos code-server[10608]: info Automatic updates are enabled

براي شروع خودكار كد-سرور مجازي پس از راه اندازي مجدد سرور مجازي ، سرويس خود را با اجراي دستور زير فعال كنيد:
⦁ $ sudo systemctl enable code-server

در اين مرحله ، كد-سرور مجازي را دانلود كرده و آن را در سطح جهاني در دسترس قرار داده ايد. سپس ، يك سرويس سيستمي براي آن ايجاد كرده ايد و آن را فعال كرده ايد ، بنابراين كد-سرور از هر بوت سرور مجازي شروع مي شود. سپس ، با پيكربندي Nginx به عنوان يك پروكسي معكوس بين بازديد كننده و كد-سرور آن را در معرض نمايش دامنه خود قرار مي دهيد.
مرحله 2 – قرار دادن كد-سرور مجازي در معرض دامنه
در اين بخش ، Nginx را به عنوان يك پروكسي معكوس براي كد-سرور مجازي پيكربندي مي كنيد.
همانطور كه در مرحله پيش نياز Nginx آموخته ايد ، فايل هاي پيكربندي سايت آن تحت /etc/nginx/conf.d ذخيره مي شوند و بعداً بايد با فعال شدن Nginx ، به صورت خودكار لود ميشوند.
پيكربندي را براي قرار دادن كد-سرور مجازي در دامنه خود در فايلي به نام code-server.conf ، تحت /etc/nginx/conf.d ذخيره مي كنيد. با ايجاد ويرايشگر خود را شروع به كار كنيد:
⦁ $ sudo vi /etc/nginx/conf.d/code-server.conf

خطوط زير را اضافه كنيد:
/etc/nginx/conf.d/code-server.conf
server {
listen 80;
listen [::]:80;

server_name code-server.your-domain;

location / {
غير مجاز مي باشد_pass http://localhost:8080/;
غير مجاز مي باشد_set_header Upgrade $http_upgrade;
غير مجاز مي باشد_set_header Connection upgrade;
غير مجاز مي باشد_set_header Accept-Encoding gzip;
}
}

code-server.your-domain را با دامنه مورد نظر خود جايگزين كنيد ، سپس فايل را ذخيره كنيد و ببنديد.
در اين فايل ، تعريف مي كنيد كه Nginx بايد به پورت HTTP 80 گوش كند. سپس ، يك server_name را تعيين مي كنيد كه به Nginx مي گويد براي كدام دامنه درخواست ها را بپذيرد و اين پيكربندي خاص را اعمال كند.
در بلوك بعدي ، براي مكان ريشه (/) ، مشخص مي كنيد كه درخواست ها بايد به كد-سرور مجازي در حال اجرا در localhost:8080 به جلو و عقب منتقل شوند. سه خط بعدي (كه با غير مجاز مي باشد_set_header شروع ميشود) به Nginx دستور مي دهد تا برخي از هدرهاي درخواست HTTP را كه براي عملكرد صحيح WebSockets مورد نياز هستند ، استفاده كند.
براي آزمايش اعتبار پيكربندي ، دستور زير را اجرا كنيد:
⦁ $ sudo nginx -t

خروجي زير را مشاهده خواهيد كرد:
Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

براي اينكه پيكربندي عملي شود ، بايد Nginx را مجدداً راه اندازي كنيد:
⦁ $ sudo systemctl restart nginx

CentOS 7 مجهز به SELinux است ، با يك آيين نامه سختگيرانه ، كه به طور پيش فرض اجازه اتصال Nginx به سوكت هاي محلي TCP را نمي دهد. Nginx براي خدمت به عنوان يك پروكسي معكوس براي سرور مجازي كد ، بايد اين كار را انجام دهد. دستور زير را اجرا كنيد تا اين قانون را به صورت دائم منحل كنيد:
$ sudo setsebool httpd_can_network_connect 1 -P

سپس در مرورگر خود به دامنه مورد استفاده براي سرور مجازي كد برويد. اعلان ورود به سرور مجازي كد را مشاهده خواهيد كرد.

سرور مجازي كد از شما مي خواهد رمز عبور خود را وارد كنيد. رمز عبوري كه در مرحله قبل تنظيم كرديد وارد كنيد و Enter IDE را بزنيد. اكنون سرور مجازي كد را وارد كرده و فوراً رابط كاربري گرافيكي آن را مشاهده مي كنيد.

اكنون نصب سرور مجازي كد شما در دامنه شما قابل دسترسي است. در مرحله بعد ، با استفاده از يك گواهي نامه Let’s Encrypt TLS رايگان ، آن را ايمن خواهيد كرد.

مرحله 3 – امنيت بخشيدن به دامنه
در اين بخش دامنه خود را با استفاده از گواهي نامه Let’s Encrypt TLS كه با استفاده از Certbot تهيه مي نماييد، ايمن مي كنيد.
براي نصب آخرين نسخه Certbot ، دستور زير را اجرا كنيد:
⦁ $ sudo yum install certbot python2-certbot-nginx -y

براي درخواست گواهي نامه براي دامنه خود ، دستور زير را اجرا كنيد:
⦁ $ sudo certbot –nginx -d code-server.your-domain

در اين دستور ، شما certbot را براي درخواست گواهينامه ها براي دامنه خود اجرا مي كنيد – نام دامنه را با پارامتر -d وارد ميكنيد. پرچم –nginx به آن مي گويد براي پشتيباني از HTTPS ، پيكربندي سايت Nginx را به طور خودكار تغيير دهيد. به ياد داشته باشيد كه دامنه code-server.your خود را با نام دامنه خود جايگزين كنيد.
اگر اولين بار است كه Certbot را اجرا مي كنيد ، از شما خواسته مي شود كه يك آدرس ايميل براي اخطارهاي ضروري وارد كنيد و شرايط خدمات EFF را بپذيريد. سپس Certbot درخواست Let’s Encrypt براي گواهي دامنه شما را ميدهد. سپس از شما سؤال مي كند كه آيا مايليد همه ترافيك HTTP را به HTTPS هدايت كنيد:
Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
1: No redirect – Make no further changes to the webserver configuration.
2: Redirect – Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you’re confident your site works on HTTPS. You can undo this
change by editing your web server’s configuration.
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Select the appropriate number [1-2] then [enter] (press ‘c’ to cancel):

توصيه مي شود براي به حداكثر رساندن امنيت گزينه دوم را انتخاب كنيد. پس از وارد كردن انتخاب خود ، ENTER را فشار دهيد.
خروجي مشابه اين خواهد بود:
Output
IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/code-server.your-domain/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/code-server.your-domain/privkey.pem
Your cert will expire on … To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the “certonly” option. To non-interactively renew *all* of
your certificates, run “certbot renew”
– Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
– If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

اين بدان معني است كه Certbot موفق به توليد گواهينامه هاي TLS شده و آنها را در پيكربندي Nginx براي دامنه شما به كار مي برد. اكنون مي توانيد دامنه كد سرور مجازي خود را در مرورگر خود مجدد لود كنيد و يك پدلاك (قفل) در سمت چپ آدرس سايت مشاهده كنيد ، اين بدان معني است كه اتصال شما به درستي ايمن است.
اكنون شما Certbot را روي تمديد خودكار گواهينامه ها قبل از منقضي شدن تنظيم مي كنيد. براي اجراي بررسي تمديد به صورت روزانه ، از cron ، يك سرويس سيستمي استاندارد براي انجام كارهاي دوره اي استفاده خواهيد كرد. با باز كردن و ويرايش فايلي به نام crontab ، corn را هدايت مي كنيد:
$ sudo crontab –e

اين دستور crontab پيش فرض را كه در حال حاضر يك فايل متني خالي است ، باز مي كند. خط زير را اضافه كنيد ، سپس آن را ذخيره كرده و ببنديد:
crontab
. . .
15 3 * * * /usr/bin/certbot renew –quiet

15 3 * * * دستور زير را هر روز ساعت 3:15 صبح اجرا مي كند – مي توانيد اين كار را روي هر زمان تطبيق دهيد.
دستور تمديد براي Certbot تمام گواهينامه هاي نصب شده روي سيستم را بررسي كرده و مواردي را كه در كمتر از سي روز به پايان رسيده اند ، به روز مي كند. –quiet به Certbot مي گويد كه اطلاعات را به خروجي نفرستد يا منتظر ورود كاربر باشد.
cron اكنون اين دستور را روزانه اجرا مي كند. تمام گواهينامه هاي نصب شده هنگامي كه سي روز يا كمتر از انقضاي انها باقي مانده باشد به طور خودكار تمديد و مجدد لود مي شوند.
اكنون كه كد-سرور مجازي را از طريق يك پروكسي معكوس Nginx در دامنه خود داريد ، آماده استفاده از واسط كاربري كد-سرور مجازي هستيد.
مرحله 4 – استفاده از رابط كد-سرور مجازي
در اين بخش از برخي از ويژگي هاي رابط كد-سرور مجازي استفاده خواهيد كرد. از آنجا كه كدسرور مجازي ويژوال استوديو كد در حال اجرا در cloud است ، همان رابط كاربري نسخه دسكتاپ مستقل را دارد.
در سمت چپ IDE ، يك رديف عمودي از شش دكمه وجود دارد كه بيشترين ويژگي هاي مورد استفاده را در يك صفحه جانبي كه با عنوان Activity Bar شناخته مي شود باز مي كند.

اين نوار قابل تنظيم است بنابراين مي توانيد اين نماها را به ترتيب ديگري جابجا كنيد يا آنها را از نوار حذف كنيد. به طور پيش فرض ، اولين دكمه منوي كلي را به صورت كشويي باز مي كند ، در حالي كه نماي دوم پنل اكسپلورر را باز مي كند كه پيمايش درخت مانند از ساختار پروژه را فراهم مي كند. مي توانيد پوشه ها و فايل هاي خود را در اينجا مديريت كنيد – ايجاد ، حذف ، جابجايي و تغيير نام آنها در صورت لزوم. نماي بعدي دسترسي به عملكرد جستجو و جايگزيني را فراهم مي كند
به دنبال اين ، به ترتيب پيش فرض ، نماي شما از سيستم هاي كنترل منبع مانند Git قرار ميگيرد. كد ويژوال استوديو همچنين از ساير ارائه دهندگان كنترل منبع پشتيباني مي كند و مي توانيد در اين مستندات دستورالعمل هاي بيشتري را براي جريان كاري كنترل منبع با ويرايشگر بيابيد.

گزينه اشكال زدايي در نوار فعاليت ، كليه اقدامات معمول را براي اشكال زدايي در پنل ارائه مي دهد. ويژوال استوديو كد با پشتيباني داخلي براي اشكال زدايي زمان اجراي Node.js و هر زباني كه به Javascript تبديل شود همراه است. براي ساير زبانها مي توانيد افزونه هايي را براي اشكال زدايي مورد نياز نصب كنيد. مي توانيد پيكربندي هاي اشكال زدايي را در فايل launch.jsonذخيره كنيد.

نماي نهايي در نوار فعاليت ، منويي را براي دسترسي به افزونه هاي موجود در Marketplace فراهم مي كند.
قسمت اصلي GUI ويرايشگر شماست كه مي توانيد آن ها را با استفاده از زبانه ها براي ويرايش كد خود جدا كنيد. مي توانيد نماي ويرايش خود را به يك سيستم شبكه يا به فايل هاي جانبي تغيير دهيد.

پس از ايجاد فايل جديد از طريق منوي File ، يك فايل خالي در يك تب جديد باز مي شود و پس از ذخيره سازي ، نام فايل در پنل جانبي Explorer قابل مشاهده خواهد بود. ايجاد پوشه ها را مي توان با كليك راست بر روي نوار كناري Explorer و كليك بر روي New Folder انجام داد. مي توانيد پوشه اي را با كليك بر روي نام آن و همچنين drag و drop فايل ها و پوشه ها به قسمتهاي بالايي بسط دهيد تا آنها را به يك مكان جديد منتقل كنيد.

مي توانيد با وارد كردن CTRL + SHIFT + `، يا با كليك كردن بر روي ترمينال در منوي كشويي بالاي منو ، و انتخاب New Terminal ، به ترمينال دسترسي پيدا كنيد. ترمينال در يك پنل پايين تر باز خواهد شد و ديركتوري كار آن روي فضاي كاري پروژه تنظيم مي شود ، كه شامل فايل ها و پوشه هاي نمايش داده شده در پنل سمت Explorer است.
شما يك نماي كلي سطح بالا از رابط كد سرور مجازي را جستجو كرده ايد و برخي از متداول ترين ويژگي ها را مشاهده كرده ايد.
نتيجه
اكنون كد-سرور مجازي ، يك IDE همه كاره cloud را در اختيار داريد كه بر روي سرور مجازي CentOS 7 شما نصب شده است ، در دامنه شما قرار گرفته و با استفاده از گواهي Let’s Encrypt ايمن شده است. هم اكنون مي توانيد بر روي پروژه ها بصورت جداگانه و همچنين در يك مجموعه همكاري تيمي كار كنيد. اجراي IDE cloud منابع موجود در دستگاه محلي شما را آزاد مي كند و به شما امكان مي دهد منابع را در صورت لزوم مقياس كنيد. براي اطلاعات بيشتر در مورد ويژگي هاي ديگر و دستورالعمل هاي دقيق در مورد ساير مؤلفه هاي كد-سرور ، به مطالب كد ويژوال استوديو مراجعه كنيد.

 

برچسب‌ها:


برچسب: ،
ادامه مطلب
امتیاز:
 
بازدید:
+ نوشته شده: ۸ تير ۱۳۹۹ساعت: ۱۲:۱۳:۱۱ توسط:sima موضوع:

نحوه دسترسي از راه دور به برنامه هاي GUI با استفاده از Docker و Caddy در اوبونتو 20.04

حتي با محبوبيت روزافزون خدمات ابري ، نياز به اجراي برنامه هاي بومي هنوز وجود دارد.
با استفاده از noVNC و TigerVNC ، مي توانيد برنامه هاي بومي را درون يك كانتينر Docker اجرا كنيد و از راه دور با استفاده از يك مرورگر وب به آنها دسترسي پيدا كنيد. علاوه بر اين ، مي توانيد برنامه خود را بر روي سرور مجازي با منابع سيستم بيشتر از آنچه به صورت محلي موجود داريد اجرا كنيد ، كه مي تواند در هنگام اجراي برنامه هاي بزرگ ، انعطاف پذيري بيشتري را ارائه دهد.
در اين آموزش ، Mozilla Thunderbird ، كلاينت ايميل را با استفاده از Docker كانتينرايز مي كنيد. پس از آن ، آن را ايمن كرده و با استفاده از سرور مجازي وب Caddy امكان دسترسي از راه دور را فراهم خواهيد كرد.
پس از اتمام كار ، فقط با يك مرورگر وب مي توانيد از هر وسيله اي به Thunderbird دسترسي پيدا كنيد. همچنين به صورت اختياري مي توانيد با استفاده از WebDAV به طور محلي به فايل هاي موجود در آن دسترسي پيدا كنيد. همچنين يك تصوير كاملاً خود شمول از Docker خواهيد داشت كه مي توانيد در هر مكاني اجرا كنيد.
پيش نيازها
قبل از شروع اين راهنما ، به موارد زير نياز خواهيد داشت:
⦁ يك سرور مجازي اوبونتو 20.04 با حداقل 2 گيگابايت رم و فضاي ديسك 4 گيگابايتي.
⦁ يك كاربر غير ريشه با امتيازات sudo.
⦁ Docker كه روي سرور مجازي شما تنظيم شده باشد. مي توانيد نحوه نصب و استفاده از Docker در Ubuntu 20.04 را در اين لينك دنبال كنيد.
مرحله 1 – ايجاد پيكربندي supervisord
اكنون كه سرور مجازي شما در حال اجرا است و Docker نصب شده است ، آماده هستيد تا پيكربندي كانتينر برنامه خود را شروع كنيد. از آنجا كه كانتينر شما از چندين مؤلفه تشكيل شده است ، براي راه اندازي و نظارت بر آنها بايد از يك مدير فرآيند استفاده كنيد. در اينجا ، از supervisord استفاده خواهيد كرد. supervisord يك مدير فرآيند است كه در پايتون نوشته شده و اغلب براي موزون كردن كانتينرهاي پيچيده استفاده مي شود.
ابتدا دايركتوري به نام thunderbird براي كانتينر خود ايجاد كنيد و وارد شويد:
⦁ $ mkdir ~/thunderbird

⦁ $ cd ~/thunderbird

اكنون با استفاده از nano يا ويرايشگر مورد نظر خود ، فايلي به نام supervisord.conf ايجاد و باز كنيد:
⦁ $ nano ~/thunderbird/supervisord.conf

اكنون اين اولين بلوك كد را به supraord.conf اضافه كنيد ، كه گزينه هاي جهاني براي supervisord را تعريف مي كند:
~/thunderbird/supervisord.conf
[supervisord]
nodaemon=true
pidfile=/tmp/supervisord.pid
logfile=/dev/fd/1
logfile_maxbytes=0

در اين بخش ، شما خود supervisord را پيكربندي مي كنيد. بايد nodaemon را روي true تنظيم كنيد زيرا درون يك كانتينر Docker به عنوان ورودي وارد مي شود. بنابراين ، مي خواهيد كه در پيش زمينه اجرا شود. همچنين pidfile را روي مسيري كه توسط يك كاربر غير ريشه قابل دسترسي است و logfile را روي stdout تنظيم ميكنيد تا بتوانيد ورودها را مشاهده كنيد.
در مرحله بعد ، يك بلوك كد كوچك ديگر را به supervisord.conf اضافه كنيد. اين بلوك TigerVNC را كه يك سرور مجازي تركيبي VNC / X11 است شروع مي كند:
~/thunderbird/supervisord.conf

[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

در اين بلوك ، سرور مجازي X11 را تنظيم مي كنيد. X11 يك پروتكل سرور مجازي نمايشگر است ، همان چيزي است كه به برنامه هاي GUI اجازه اجرا مي دهد. توجه داشته باشيد كه در آينده باWayland جايگزين خواهد شد ، اما دسترسي از راه دور هنوز در دست توسعه است.
براي اين كانتينر ، شما از TigerVNC و سرور مجازي داخلي VNC استفاده مي كنيد. كه داراي چندين مزيت نسبت به استفاده از يك سرور مجازي جداگانه X11 و VNC است:
• زمان پاسخ سريعتر ، زيرا كشيدن GUI مستقيماً روي سرور مجازي VNC انجام مي شود به جاي اينكه روي يك بافر چارچوب واسطه (حافظه اي كه محتويات صفحه را ذخيره مي كند) انجام شود.
• تغيير اندازه خودكار صفحه ، كه به برنامه ريموت اجازه مي دهد تا به طور خودكار تغيير اندازه دهد تا با كلاينت (در اين حالت ، پنجره مرورگر وب شما) متناسب باشد.
در صورت تمايل ، مي توانيد آرگومان را براي گزينه -desktop از Thunderbird به چيز ديگري كه انتخاب كرده ايد تغيير دهيد. سرور مجازي انتخاب شما را به عنوان تيتر صفحه وب مورد استفاده براي دسترسي به برنامه شما نمايش مي دهد.
اكنون ، بياييد يك بلوك سوم از كد را به supervisord.conf اضافه كنيم تا easy-novnc را شروع كنيم:
~/thunderbird/supervisord.conf

[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

در اين بلوك ، يك easy-novnc را راه اندازي مي كنيد ، يك سرور مجازي مستقل كه يك پوشش حول noVNC فراهم مي كند. اين سرور مجازي دو نقش را انجام مي دهد. ابتدا يك صفحه اتصال ساده فراهم مي كند كه به شما امكان مي دهد گزينه هاي اتصال را پيكربندي كنيد و به شما امكان مي دهد موارد پيش فرض را تنظيم كنيد. دوم ، VNC را روي WebSocket پروكسي ميكند ، كه به آن امكان دسترسي از طريق يك مرورگر وب معمولي را مي دهد.
معمولاً تغيير اندازه در سمت كلاينت انجام مي شود (يعني مقياس بندي تصوير) ، اما شما از گزينه resize=remote استفاده مي كنيد تا از تنظيمات وضوح تصويري از راه دور TigerVNC استفاده كامل كنيد. اين گزينه همچنين تأخير كمتري را در دستگاه هاي كندتر مانند Chromebooks رده پايين ايجاد مي كند:
توجه: در اين آموزش از easy-novnc استفاده شده است. در صورت تمايل مي توانيد به جاي آن از websockify و يك وب سرور مجازي جداگانه استفاده كنيد. مزيت easy-novnc اين است كه ميزان حافظه و زمان راه اندازي آن به ميزان قابل توجهي پايين است و خود شمول به حساب مي آيد. easy-novnc همچنين يك صفحه اتصال تميزتر نسبت به noVNC پيش فرض ارائه مي دهد و تنظيم گزينه هاي پيش فرض مفيد براي اين ستاپ (مانند resize=remote) را ممكن مي سازد.

براي شروع OpenBox ، يعني مدير پنجره ، بلوك زير را به پيكربندي خود اضافه كنيد:
~/thunderbird/supervisord.conf

[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

در اين بلوك ، شما در حال راه اندازي OpenBox ، مدير پنجره سبك X11 هستيد. مي توانيد از اين مرحله بگذريد ، اما بدون آن ، نمودارهاي ميله اي عنوان را نداريد يا نمي توانيد اندازه ويندوز را تغيير دهيد.
در آخر ، بياييد آخرين بلوك را به supervisord.conf اضافه كنيم ، كه برنامه اصلي را شروع مي كند:
~/thunderbird/supervisord.conf

[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

در اين بلوك آخر ، براي اطمينان از اجراي Thunderbird بعد از TigerVNC ، اولويت را روي 1 تنظيم كنيد در غير اين صورت با يك شرايط مسابقه روبرو مي شويد و به طور تصادفي در شروع كار ناكام خواهيد ماند. بنابراين autorestart = true قرار دهيد تا اگر برنامه به اشتباه بسته شد ، برنامه را مجدداً باز كنيد. متغير محيط DISPLAY به برنامه مي گويد تا روي سرور مجازي VNC كه قبلاً تنظيم كرده ايد نمايش داده شود.
در اينجا ظاهر نهايي supervisord.conf شما نمايش داده شده است:
~/thunderbird/supervisord.conf
[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

اگر مي خواهيد برنامه ديگري را كانتينرايز كنيد ، /usr/bin/thunderbird را با مسير قابل اجراي برنامه خود جايگزين كنيد. در غير اين صورت ، اكنون آماده پيكربندي منوي اصلي GUI خود هستيد.
مرحله 2 – تنظيم منوي OpenBox
اكنون كه مدير پروسه شما پيكربندي شده است ، بياييد منوي OpenBox را تنظيم كنيم. اين منو به ما امكان مي دهد تا برنامه ها را درون كانتينر راه اندازي كنيم. همچنين يك ترمينال و مانيتور پردازش براي اشكال زدايي در صورت لزوم را در اختيار خواهيم داشت.
در داخل ديركتوري برنامه خود ، از nano يا ويرايشگر متن مورد علاقه خود استفاده كنيد تا فايل جديدي به نام menu.xml ايجاد و باز كنيد:
⦁ $ nano ~/thunderbird/menu.xml

اكنون كد زير را به menu.xml اضافه كنيد:
~/thunderbird/menu.xml





/usr/bin/thunderbird




/usr/bin/x-terminal-emulator




/usr/bin/x-terminal-emulator -e htop



اين فايل XML شامل آيتم هاي منو است كه با كليك راست بر روي دسكتاپ ظاهر مي شود. هر مورد از يك ليبل و يك عمل تشكيل شده است.
اگر مي خواهيد برنامه ديگري را كانتينرايز كنيد ، / usr / bin / thunderbird را با مسير اجرايي برنامه خود جايگزين كنيد و ليبل مورد را تغيير دهيد.
مرحله 3 – ايجاد Dockerfile
اكنون كه OpenBox پيكربندي شده است ، Dockerfile را ايجاد خواهيد كرد ، كه همه چيز را به هم پيوند مي دهد.
يك Dockerfile در ديركتوري كانتينر خود ايجاد كنيد:
⦁ $nano ~/thunderbird/Dockerfile

براي شروع ، بياييد براي ساختن easy-novnc كد ديگري اضافه كنيم:
~/thunderbird/Dockerfile
FROM golang:1.14-buster 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

در مرحله اول ، شما در حال ساختن easy-novnc هستيد. براي سادگي و صرفه جويي در فضا اين كار در يك مرحله جداگانه انجام مي شود – به زنجيره ابزار كليGo در تصوير نهايي خود نيازي نداريد. به@ v1.1.0 در دستور build توجه داشته باشيد. اين تضمين مي كند كه نتيجه تعيين كننده است ، و از آن جهت مهم است كه Docker نتيجه هر مرحله را ذخيره مي كند. اگر نسخه صريح را مشخص نكرده ايد ، Docker در زمان ساخت اولين تصوير، آخرين نسخه هاي easy-novnc را ارجاع مي دهد. علاوه بر اين ، بهتر است اطمينان حاصل كنيد كه يك نسخه خاص از easy-novnc را دانلود مي كنيد تا در صورت ايجاد تغييرات در رابط CLI آن را داشته باشيد.
اكنون بياييد مرحله دوم را ايجاد كنيم كه به تصوير نهايي تبديل مي شود. در اينجا از Debian 10 (Buster) به عنوان تصوير پايه استفاده خواهيد كرد. توجه داشته باشيد كه از آنجا كه اين كار در يك كانتينر در حال اجرا است ، صرف نظر از توزيع شما در سرور مجازي خود ، كار خواهد كرد.
سپس ، بلوك زير را به Dockerfile خود اضافه كنيد:
~/thunderbird/Dockerfile

FROM debian:buster
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

در اين دستورالعمل ، شما Debian 10 را به عنوان تصوير پايه خود نصب مي كنيد و سپس حداقل مورد نياز براي اجراي برنامه هاي GUI را در كانتينر خود نصب مي كنيد. توجه داشته باشيد كه apt-get update را به عنوان بخشي از همان دستورالعمل ها براي جلوگيري از مشكلات ذخيره سازي در Docker ، اجرا كنيد. براي صرفه جويي در فضا ، همچنين ليست هاي بسته را كه بعد از آن دانلود شده است حذف مي كنيد (بسته هاي ذخيره شده به صورت پيش فرض حذف مي شوند). همچنين /usr/share/desktop-directories را ايجاد مي كنيد زيرا برخي برنامه ها به دايركتوري موجود بستگي دارند.
بياييد يك بلوك كد كوچك ديگر اضافه كنيم:
~/thunderbird/Dockerfile

RUN apt-get update -y &&
apt-get install -y –no-install-recommends lxterminal nano wget openssh-client rsync ca-certificates xdg-utils htop tar xzip gzip bzip2 zip unzip &&
rm -rf /var/lib/apt/lists

در اين دستورالعمل ، شما در حال نصب برخي از نرم افزارها و بسته هاي عمومي مفيد هستيد. موارد قابل توجه در اينجا xd-utils (كه دستورات پايه مورد استفاده برنامه هاي دسكتاپ را در لينوكس فراهم مي كند) و ca-certificates (كه گواهي هاي ريشه را نصب مي كند تا به ما امكان دسترسي به سايت هاي HTTPS را بدهد) هستند.
اكنون مي توانيم دستورالعمل برنامه اصلي را اضافه كنيم:
~/thunderbird/Dockerfile

RUN apt-get update -y &&
apt-get install -y –no-install-recommends thunderbird &&
rm -rf /var/lib/apt/lists

مانند قبل ، در اين قسمت در حال نصب برنامه هستيم. اگر برنامه كاربردي ديگري را كانتينرايز ميكنيد ، مي توانيد اين دستورات را با دستورالعمل هاي لازم براي نصب برنامه خاص خود جايگزين كنيد. برخي از برنامه ها براي اجراي داخل Docker به كار كمي بيشتر نياز دارند. به عنوان مثال ، اگر برنامه اي را نصب مي كنيد كه از Chrome ،Chromium يا QtWebEngine استفاده مي كند ، بايد از آرگومان خط فرمان –no-sandbox استفاده كنيد ، زيرا در Docker پشتيباني نمي شود.
در مرحله بعد ، بياييد دستورالعمل هايي را اضافه كنيم تا چند فايل آخر به كانتينر اضافه شود:
~/thunderbird/Dockerfile

COPY –from=easy-novnc-build /bin/easy-novnc /usr/local/bin/
COPY menu.xml /etc/xdg/openbox/
COPY supervisord.conf /etc/
EXPOSE 8080

در اينجا شما مي توانيد فايل هاي پيكربندي را كه قبلاً ايجاد كرده ايد به تصوير اضافه كرده و از مرحله اول كپي كردن باينري easy-novnc را انجام دهيد.
اين بلوك كد بعدي دايركتوري داده را ايجاد مي كند و كاربر اختصاصي را براي برنامه شما اضافه مي كند. از آن جهت مهم است كه برخي برنامه ها از اجرا به عنوان ريشه خودداري مي كنند. همچنين بهتر است كه حتي در يك كانتينر ، برنامه ها را به صورت ريشه اجرا نكنيد.
~/thunderbird/Dockerfile

RUN groupadd –gid 1000 app &&
useradd –home-dir /data –shell /bin/bash –uid 1000 –gid 1000 app &&
mkdir -p /data
VOLUME /data

براي اطمينان از يك UID / GID سازگار براي فايل ها ، صريحاً هر دو را روي 1000 تنظيم مي كنيد. همچنين مي توانيد يك حجم را در دايركتوري داده قرار دهيد تا اطمينان حاصل شود كه بين راه ريستارت ها همچنان ادامه دارد.
در آخر ، دستورالعمل هايي را براي راه اندازي همه موارد اضافه مي كنيم:
~/thunderbird/Dockerfile

CMD [“sh”, “-c”, “chown app:app /data /dev/stdout && exec gosu app supervisord”]

با تنظيم دستور پيش فرض روي supervisord ، مدير فرآيندهاي مورد نياز براي اجراي برنامه شما را راه اندازي مي كند. در اين حالت ، به جاي ENTRYPOINT از CMD استفاده مي كنيد. در بيشتر موارد ، تفاوتي ايجاد نمي كند ، اما استفاده از CMD براي اين منظور به چند دليل مناسب تر است. اولا ، supervisord هيچ آرگوماني مربوط به ما را دريافت نميكند ، و اگر آرگومان هايي را به كانتينر ارائه مي دهيد ، آنها CMD را جايگزين مي كنند و به ENTRYPOINT اضافه مي شوند. دوما ، استفاده از CMD به ما امكان مي دهد هنگام ارسال آرگومان ها به داخل كانتينر ، يك دستور كاملاً متفاوت (كه توسط / bin / sh -c اجرا خواهد شد) ارائه دهيم ، كه اشكال زدايي را آسان تر مي كند.
و در آخر ، لازم است قبل از شروع supervisord ، chown را به عنوان ريشه اجرا كنيد تا از مشكلات مجوز در حجم داده جلوگيري كنيد و به فرآيند كودك (child) اجازه دهيد stdout را باز كند. اين همچنين بدان معني است كه شما بايد به جاي دستورالعمل USER براي تعويض كاربر از gosu استفاده كنيد.
در اينجا ظاهر Dockerfile تكميل شده شما به شرح زير است:
~/thunderbird/Dockerfile
FROM golang:1.14-buster 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:buster

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 xzip 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”]

Dockerfile خود را ذخيره كرده و ببنديد. اكنون آماده ساخت و اجراي كانتينر خود هستيم و سپس به Thunderbird – كه يك برنامه GUI است، دسترسي پيدا خواهيم كرد.
مرحله 4 – ساخت و اجراي كانتينر
مرحله بعدي ساخت كانتينر شما و تنظيم آن در زمان راه اندازي است. همچنين مي توانيد يك حجم براي حفظ داده هاي برنامه بين ريستارت ها و به روز رساني تنظيم كنيد.
ابتدا كانتينر خود را بسازيد. حتماً اين دستورات را در ديركتوري ~ / thunderbird اجرا كنيد:
⦁ $ 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

توجه داشته باشيد كه در صورت تمايل ، مي توانيد thunderbird-app را بعد از گزينه –name با نام ديگري جايگزين كنيد. هرچه انتخاب كرديد ، اكنون برنامه شما كانتينرايز شده و در حال اجرا است. اكنون بياييد از سرور مجازي وب Caddy براي امنيت آن استفاده كنيم و از راه دور به آن متصل شويم.
مرحله 5 – راه اندازي Caddy
در اين مرحله ، وب سرور مجازي Caddy را تنظيم مي كنيد تا تأييد هويت انجام شود و به صورت اختياري ، دسترسي از راه دور فايل از طريق WebDAV را انجام دهد. براي سادگي و اينكه به شما امكان استفاده از پروكسي معكوس موجود خود را بدهد ، آن را در يك كانتينر ديگر اجرا كنيد.
يك ديركتوري جديد ايجاد كنيد و سپس به داخل آن برويد:
⦁ $ mkdir ~/caddy

⦁ $ cd ~/caddy

اكنون با استفاده از nano يا ويرايشگر مورد نظر خود ، يك Dockerfile جديد ايجاد كنيد:
⦁ $ nano ~/caddy/Dockerfile

سپس بخش هاي زير را اضافه كنيد:
~/caddy/Dockerfile
FROM golang:1.14-buster AS caddy-build
WORKDIR /src
RUN echo ‘module caddy’ > go.mod &&
echo ‘require github.com/caddyserver/caddy/v2 v2.0.0’ >> go.mod &&
echo ‘require github.com/mholt/caddy-webdav v0.0.0-20200523051447-bc5d19941ac3’ >> 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:buster

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

اين Dockerfile با فعال كردن افزونه WebDAV ، Caddy را ايجاد مي كند ، و سپس آن را در پورت 8080 با Caddyfile در / etc / Caddyfile راه اندازي مي كند. فايل را ذخيره كنيد و ببنديد.
سپس سرور مجازي وب Caddy را پيكربندي مي كنيد. فايلي به نام Caddyfile را در دايركتوري كه تازه ايجاد كرده ايد ايجاد كنيد:
⦁ $ nano ~/caddy/Caddyfile

اكنون بلوك كد زير را به Caddyfile خود اضافه كنيد:
~/caddy/Caddyfile
{
order webdav last
}
:8080 {
log
root * /data
reverse_غير مجاز مي باشد thunderbird-app:8080

handle /files/* {
uri strip_prefix /files
file_server browse
}
redir /files /files/

handle /webdav/* {
uri strip_prefix /webdav
webdav
}
redir /webdav /webdav/

basicauth /* {
{env.APP_USERNAME} {env.APP_PASSWORD_HASH}
}
}

اين Caddyfile ديركتوري اصلي را به كانتينر thunderbird-app كه در مرحله 4 ايجاد كرده ايد پروكسي ميكند ( Docker آن را در IP صحيح تجزيه مي كند). همچنين يك مرورگر فايل مبتني بر وب فقط قابل خواندن در /files ارائه مي كند و يك سرور مجازي WebDAV را روي / webdav اجرا مي كند كه مي توانيد براي دسترسي به فايل هاي خود به صورت محلي قرار دهيد. نام كاربري و رمز عبور از متغيرهاي محيط APP_USERNAME و APP_PASSWORD_HASH خوانده مي شود.
اكنون كانتينر را بسازيد:
⦁ $ docker build -t thunderbird-caddy .

Caddy v2 نياز دارد كه شما پسورد موردنظر خود را hash كنيد. دستور زير را اجرا كنيد و به ياد داشته باشيد كه mypass را با يك رمز عبور قوي به انتخاب خود جايگزين كنيد:
⦁ $ docker run –rm -it thunderbird-caddy caddy hash-password -plaintext ‘mypass’

اين دستور يك رشته كاراكتر را توليد مي كند. آن را براي تهيه دستور بعدي در كليپ بورد خود كپي كنيد.
اكنون آماده اجراي كانتينر هستيد. اطمينان حاصل كنيد كه myuser را با نام كاربري مورد نظر خود جايگزين كنيد و mypass-hash را با همان دستوري كه در مرحله قبل اجرا كرديد جايگزين نماييد. همچنين مي توانيد پورت (8080 در اينجا) را براي دسترسي به سرور مجازي خود در پورت ديگري تغيير دهيد:
⦁ $ 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

اكنون آماده دسترسي و آزمايش برنامه خود هستيم.
مرحله 6 – تست و مديريت برنامه
بياييد به برنامه دسترسي پيدا كنيم و از عملكرد آن اطمينان حاصل نماييم.
ابتدا http: // your_server_ip: 8080 را در يك مرورگر وب باز كنيد ، با اعتباراتي كه قبلاً انتخاب كرده ايد وارد شويد و روي connect كليك كنيد.

اكنون مي توانيد با برنامه تعامل برقرار كنيد ، و براي تنظيم مناسب پنجره مرورگر ، بايد به طور خودكار تغيير اندازه دهد.

اگر بر روي دسكتاپ سياه رنگ كليك راست كنيد، بايد منويي را مشاهده كنيد كه به شما امكان دسترسي به يك ترمينال را مي دهد. اگر كليك وسط كنيد ​​، بايد ليستي از پنجره ها را ببينيد.

اكنون http://your_server_ip:8080/files/ را در يك مرورگر وب باز كنيد. بايد بتوانيد به فايل هاي خود دسترسي پيدا كنيد.

به صورت اختياري ، مي توانيد http: // your_server_ip: 8080 / webdav / خود را در يك كلاينت WebDAV نصب كنيد. بايد بتوانيد مستقيماً به فايل هاي خود دسترسي پيدا كرده و آن ها را تغيير دهيد. اگر از گزينه Map network drive در ويندوز اكسپلورر استفاده مي كنيد ، بايد براي اضافه كردنHTTPS از يك پروكسي معكوس استفاده كنيد يا HKLMSYSTEMCurrentControlSetServicesWebClientParametersBasicAuthLevel را روي DWORD:2 تنظيم كنيد.
در هر صورت ، برنامه GUI بومي شما اكنون براي استفاده از راه دور آماده است.
نتيجه
اكنون با موفقيت يك كانتينر Docker را براي Thunderbird تنظيم كرده ايد و سپس با استفاده از Caddy ، دسترسي به آن را از طريق يك مرورگر وب پيكربندي كرده ايد. در صورت نياز به بروزرساني برنامه خود ، كانتينرها را متوقف كنيد ، docker rm thunderbird-app thunderbird-web را اجراي كنيد، تصاوير را مجدد بسازيد و سپس دستورات docker را از مراحل قبلي بالا مجدداً اجرا كنيد. از آنجا كه در يك حجم ذخيره مي شود ، داده هاي شما همچنان حفظ مي شوند.
اگر مي خواهيد در مورد دستورات اساسي Docker اطلاعات بيشتري كسب كنيد ، مي توانيد اين لينك آموزش يا اين صفحه را بخوانيد. براي استفاده طولاني مدت تر ، ميتوانيد HTTPS را براي امنيت بيشتر فعال كنيد (براي اين كار به دامنه اي نياز داريد).
علاوه بر اين ، اگر بيش از يك برنامه نصب كرده ايد ، مي توانيد به جاي شروع هر كانتينر به صورت دستي ، از Docker Compose يا Kubernetes استفاده كنيد. و به ياد داشته باشيد ، اين آموزش مي تواند به عنوان پايه اي براي اجراي ساير برنامه هاي لينوكس روي سرور مجازي شما استفاده شود ، از جمله:
⦁ Wine ، يك لايه سازگاري براي اجراي برنامه هاي ويندوز در لينوكس.
⦁ GIMP ، ويرايشگر تصوير منبع باز.
⦁ Cutter ، پلتفرم مهندسي معكوس منبع باز.
اين گزينه آخر پتانسيل بسيار مهمي را براي كانتينرايز و دسترسي از راه دور به برنامه هاي GUI ارائه مي دهد. با استفاده از اين ستاپ ، اكنون مي توانيد از سرور مجازي  با توان محاسباتي بسيار بيشتر از آنچه به صورت محلي در دسترس داريد براي اجراي ابزارهاي منبع فشرده مانند Cutter استفاده كنيد.

 

برچسب‌ها:


برچسب: ،
ادامه مطلب
امتیاز:
 
بازدید:
+ نوشته شده: ۸ تير ۱۳۹۹ساعت: ۱۲:۰۷:۳۸ توسط:sima موضوع:

نحوه دسترسي از راه دور به برنامه هاي GUI با استفاده از Docker و Caddy در Debian 9

حتي با محبوبيت روزافزون خدمات ابري ، نياز به اجراي برنامه هاي بومي هنوز وجود دارد.
با استفاده از noVNC و TigerVNC ، مي توانيد برنامه هاي بومي را درون يك كانتينر Docker اجرا كنيد و از راه دور با استفاده از يك مرورگر وب به آنها دسترسي پيدا كنيد. علاوه بر اين ، مي توانيد برنامه خود را بر روي سرور مجازي با منابع سيستم بيشتر از آنچه به صورت محلي موجود داريد اجرا كنيد ، كه مي تواند در هنگام اجراي برنامه هاي بزرگ ، انعطاف پذيري بيشتري را ارائه دهد.
در اين آموزش ، Mozilla Thunderbird ، كلاينت ايميل را با استفاده از Docker كانتينرايز مي كنيد. پس از آن ، آن را ايمن كرده و با استفاده از سرور مجازي وب Caddy امكان دسترسي از راه دور را فراهم خواهيد كرد.
پس از اتمام كار ، فقط با يك مرورگر وب مي توانيد از هر وسيله اي به Thunderbird دسترسي پيدا كنيد. همچنين به صورت اختياري مي توانيد با استفاده از WebDAV به طور محلي به فايل هاي موجود در آن دسترسي پيدا كنيد. همچنين يك تصوير كاملاً خود شمول از Docker خواهيد داشت كه مي توانيد در هر مكاني اجرا كنيد.
پيش نيازها
قبل از شروع اين راهنما ، به موارد زير نياز خواهيد داشت:
⦁ يك سرور مجازي Debian 9 با حداقل 2 گيگابايت رم و فضاي ديسك 4 گيگابايتي.
⦁ يك كاربر غير ريشه با امتيازات sudo.
⦁ Docker كه روي سرور مجازي شما تنظيم شده باشد. مي توانيد نحوه نصب و استفاده از Docker در Debian 9 را در اين لينك دنبال كنيد.
مرحله 1 – ايجاد پيكربندي supervisord
اكنون كه سرور مجازي شما در حال اجرا است و Docker نصب شده است ، آماده هستيد تا پيكربندي كانتينر برنامه خود را شروع كنيد. از آنجا كه كانتينر شما از چندين مؤلفه تشكيل شده است ، براي راه اندازي و نظارت بر آنها بايد از يك مدير فرآيند استفاده كنيد. در اينجا ، از supervisord استفاده خواهيد كرد. supervisord يك مدير فرآيند است كه در پايتون نوشته شده و اغلب براي موزون كردن كانتينرهاي پيچيده استفاده مي شود.
ابتدا دايركتوري به نام thunderbird براي كانتينر خود ايجاد كنيد و وارد شويد:
⦁ $ mkdir ~/thunderbird

⦁ $ cd ~/thunderbird

اكنون با استفاده از nano يا ويرايشگر مورد نظر خود ، فايلي به نام supervisord.conf ايجاد و باز كنيد:
⦁ $ nano ~/thunderbird/supervisord.conf

اكنون اين اولين بلوك كد را به supervisord.conf اضافه كنيد ، كه گزينه هاي جهاني براي supervisord را تعريف مي كند:
~/thunderbird/supervisord.conf
[supervisord]
nodaemon=true
pidfile=/tmp/supervisord.pid
logfile=/dev/fd/1
logfile_maxbytes=0

در اين بخش ، شما خود supervisord را پيكربندي مي كنيد. بايد nodaemon را روي true تنظيم كنيد زيرا درون يك كانتينر Docker به عنوان ورودي وارد مي شود. بنابراين ، مي خواهيد كه در پيش زمينه اجرا شود. همچنين pidfile را روي مسيري كه توسط يك كاربر غير ريشه قابل دسترسي است و logfile را روي stdout تنظيم ميكنيد تا بتوانيد ورودها را مشاهده كنيد.
در مرحله بعد ، يك بلوك كد كوچك ديگر را به supervisord.conf اضافه كنيد. اين بلوك TigerVNC را كه يك سرور مجازي تركيبي VNC / X11 است شروع مي كند:
~/thunderbird/supervisord.conf

[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

در اين بلوك ، سرور مجازي X11 را تنظيم مي كنيد. X11 يك پروتكل سرور مجازي نمايشگر است ، همان چيزي است كه به برنامه هاي GUI اجازه اجرا مي دهد. توجه داشته باشيد كه در آينده باWayland جايگزين خواهد شد ، اما دسترسي از راه دور هنوز در دست توسعه است.
براي اين كانتينر ، شما از TigerVNC و سرور مجازي داخلي VNC استفاده مي كنيد. كه داراي چندين مزيت نسبت به استفاده از يك سرور مجازي جداگانه X11 و VNC است:
• زمان پاسخ سريعتر ، زيرا كشيدن GUI مستقيماً روي سرور مجازي VNC انجام مي شود به جاي اينكه روي يك بافر چارچوب واسطه (حافظه اي كه محتويات صفحه را ذخيره مي كند) انجام شود.
• تغيير اندازه خودكار صفحه ، كه به برنامه ريموت اجازه مي دهد تا به طور خودكار تغيير اندازه دهد تا با كلاينت (در اين حالت ، پنجره مرورگر وب شما) متناسب باشد.
در صورت تمايل ، مي توانيد آرگومان را براي گزينه -desktop از Thunderbird به چيز ديگري كه انتخاب كرده ايد تغيير دهيد. سرور مجازي انتخاب شما را به عنوان تيتر صفحه وب مورد استفاده براي دسترسي به برنامه شما نمايش مي دهد.
اكنون ، بياييد يك بلوك سوم از كد را به supervisord.conf اضافه كنيم تا easy-novnc را شروع كنيم:
~/thunderbird/supervisord.conf

[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

در اين بلوك ، يك easy-novnc را راه اندازي مي كنيد ، يك سرور مجازي مستقل كه يك پوشش حول noVNC فراهم مي كند. اين سرور مجازي دو نقش را انجام مي دهد. ابتدا يك صفحه اتصال ساده فراهم مي كند كه به شما امكان مي دهد گزينه هاي اتصال را پيكربندي كنيد و به شما امكان مي دهد موارد پيش فرض را تنظيم كنيد. دوم ، VNC را روي WebSocket پروكسي ميكند ، كه به آن امكان دسترسي از طريق يك مرورگر وب معمولي را مي دهد.
معمولاً تغيير اندازه در سمت كلاينت انجام مي شود (يعني مقياس بندي تصوير) ، اما شما از گزينه resize=remote استفاده مي كنيد تا از تنظيمات وضوح تصويري از راه دور TigerVNC استفاده كامل كنيد. اين گزينه همچنين تأخير كمتري را در دستگاه هاي كندتر مانند Chromebooks رده پايين ايجاد مي كند:
توجه: در اين آموزش از easy-novnc استفاده شده است. در صورت تمايل مي توانيد به جاي آن از websockify و يك وب سرور مجازي جداگانه استفاده كنيد. مزيت easy-novnc اين است كه ميزان حافظه و زمان راه اندازي آن به ميزان قابل توجهي پايين است و خود شمول به حساب مي آيد. easy-novnc همچنين يك صفحه اتصال تميزتر نسبت به noVNC پيش فرض ارائه مي دهد و تنظيم گزينه هاي پيش فرض مفيد براي اين ستاپ (مانند resize=remote) را ممكن مي سازد.

براي شروع OpenBox ، يعني مدير پنجره ، بلوك زير را به پيكربندي خود اضافه كنيد:
~/thunderbird/supervisord.conf

[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

در اين بلوك ، شما در حال راه اندازي OpenBox ، مدير پنجره سبك X11 هستيد. مي توانيد از اين مرحله بگذريد ، اما بدون آن ، نمودارهاي ميله اي عنوان را نداريد يا نمي توانيد اندازه ويندوز را تغيير دهيد.
در آخر ، بياييد آخرين بلوك را به supervisord.conf اضافه كنيم ، كه برنامه اصلي را شروع مي كند:
~/thunderbird/supervisord.conf

[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

در اين بلوك آخر ، براي اطمينان از اجراي Thunderbird بعد از TigerVNC ، اولويت را روي 1 تنظيم كنيد در غير اين صورت با يك شرايط مسابقه روبرو مي شويد و به طور تصادفي در شروع كار ناكام خواهيد ماند. بنابراين autorestart = true قرار دهيد تا اگر برنامه به اشتباه بسته شد ، برنامه را مجدداً باز كنيد. متغير محيط DISPLAY به برنامه مي گويد تا روي سرور مجازي VNC كه قبلاً تنظيم كرده ايد نمايش داده شود.
در اينجا ظاهر نهايي supervisord.conf نمايش داده شده است:
~/thunderbird/supervisord.conf
[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

اگر مي خواهيد برنامه ديگري را كانتينرايز كنيد ، /usr/bin/thunderbird را با مسير قابل اجراي برنامه خود جايگزين كنيد. در غير اين صورت ، اكنون آماده پيكربندي منوي اصلي GUI خود هستيد.
مرحله 2 – تنظيم منوي OpenBox
اكنون كه مدير پروسه شما پيكربندي شده است ، بياييد منوي OpenBox را تنظيم كنيم. اين منو به ما امكان مي دهد تا برنامه ها را درون كانتينر راه اندازي كنيم. همچنين يك ترمينال و مانيتور پردازش براي اشكال زدايي در صورت لزوم را در اختيار خواهيم داشت.
در داخل ديركتوري برنامه خود ، از nano يا ويرايشگر متن مورد علاقه خود استفاده كنيد تا فايل جديدي به نام menu.xml ايجاد و باز كنيد:
⦁ $ nano ~/thunderbird/menu.xml

اكنون كد زير را به menu.xml اضافه كنيد:
~/thunderbird/menu.xml





/usr/bin/thunderbird




/usr/bin/x-terminal-emulator




/usr/bin/x-terminal-emulator -e htop


اين فايل XML شامل آيتم هاي منو است كه با كليك راست بر روي دسكتاپ ظاهر مي شود. هر مورد از يك ليبل و يك عمل تشكيل شده است.
اگر مي خواهيد برنامه ديگري را كانتينرايز كنيد ، / usr / bin / thunderbird را با مسير اجرايي برنامه خود جايگزين كنيد و ليبل مورد را تغيير دهيد.
مرحله 3 – ايجاد Dockerfile
اكنون كه OpenBox پيكربندي شده است ، Dockerfile را ايجاد خواهيد كرد ، كه همه چيز را به هم پيوند مي دهد.
يك Dockerfile در ديركتوري كانتينر خود ايجاد كنيد:
⦁ $nano ~/thunderbird/Dockerfile

براي شروع ، بياييد براي ساختن easy-novnc كد ديگري اضافه كنيم:
~/thunderbird/Dockerfile
FROM golang:1.14-buster AS easy-novnc-build
WORKDIR /src
RUN go mod init build &&
go get github.com/geek911/easy-novnc@v1.1.0 &&
go build -o /bin/easy-novnc github.com/geek911/easy-novnc

در مرحله اول ، شما در حال ساختن easy-novnc هستيد. براي سادگي و صرفه جويي در فضا اين كار در يك مرحله جداگانه انجام مي شود – به زنجيره ابزار كليGo در تصوير نهايي خود نيازي نداريد. به@ v1.1.0 در دستور build توجه داشته باشيد. اين تضمين مي كند كه نتيجه تعيين كننده است ، و از آن جهت مهم است كه Docker نتيجه هر مرحله را ذخيره مي كند. اگر نسخه صريح را مشخص نكرده ايد ، Docker در زمان ساخت اولين تصوير، آخرين نسخه هاي easy-novnc را ارجاع مي دهد. علاوه بر اين ، بهتر است اطمينان حاصل كنيد كه يك نسخه خاص از easy-novnc را دانلود مي كنيد تا در صورت ايجاد تغييرات در رابط CLI آن را داشته باشيد.
حالا بياييد مرحله دوم را ايجاد كنيم كه به تصوير نهايي تبديل مي شود. در اينجا از Debian 9 (Buster) به عنوان تصوير پايه استفاده خواهيد كرد. توجه داشته باشيد كه از آنجا كه اين كار در يك كانتينر در حال اجرا است ، صرف نظر از توزيع شما در سرور مجازي خود ، كار خواهد كرد.
سپس ، بلوك زير را به Dockerfile خود اضافه كنيد:
~/thunderbird/Dockerfile

FROM debian:buster
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

در اين دستورالعمل ، شما Debian 9 را به عنوان تصوير پايه خود نصب مي كنيد و سپس حداقل مورد نياز براي اجراي برنامه هاي GUI را در كانتينر خود نصب مي كنيد. توجه داشته باشيد كه apt-get update را به عنوان بخشي از همان دستورالعمل ها براي جلوگيري از مشكلات ذخيره سازي در Docker ، اجرا كنيد. براي صرفه جويي در فضا ، همچنين ليست هاي بسته را كه بعد از آن دانلود شده است حذف مي كنيد (بسته هاي ذخيره شده به صورت پيش فرض حذف مي شوند). همچنين /usr/share/desktop-directories را ايجاد مي كنيد زيرا برخي برنامه ها به دايركتوري موجود بستگي دارند.
بياييد يك بلوك كد كوچك ديگر اضافه كنيم:
~/thunderbird/Dockerfile

RUN apt-get update -y &&
apt-get install -y –no-install-recommends lxterminal nano wget openssh-client rsync ca-certificates xdg-utils htop tar xzip gzip bzip2 zip unzip &&
rm -rf /var/lib/apt/lists

در اين دستورالعمل ، شما در حال نصب برخي از نرم افزارها و بسته هاي عمومي مفيد هستيد. موارد قابل توجه در اينجا xd-utils (كه دستورات پايه مورد استفاده برنامه هاي دسكتاپ را در لينوكس فراهم مي كند) و ca-certificates (كه گواهي هاي ريشه را نصب مي كند تا به ما امكان دسترسي به سايت هاي HTTPS را بدهد) هستند.
اكنون مي توانيم دستورالعمل برنامه اصلي را اضافه كنيم:
~/thunderbird/Dockerfile

RUN apt-get update -y &&
apt-get install -y –no-install-recommends thunderbird &&
rm -rf /var/lib/apt/lists

مانند گذشته ، در اينجا ما در حال نصب برنامه هستيم. اگر برنامه كاربردي ديگري را كانتينرايز ميكنيد ، مي توانيد اين دستورات را با دستورالعمل هاي لازم براي نصب برنامه خاص خود جايگزين كنيد. برخي از برنامه ها براي اجراي داخل Docker به كار كمي بيشتر نياز دارند. به عنوان مثال ، اگر برنامه اي را نصب مي كنيد كه از Chrome ،Chromium يا QtWebEngine استفاده مي كند ، بايد از آرگومان خط فرمان –no-sandbox استفاده كنيد ، زيرا در Docker پشتيباني نمي شود.
در مرحله بعد ، بياييد دستورالعمل هايي را اضافه كنيم تا چند فايل آخر به كانتينر اضافه شود:
~/thunderbird/Dockerfile

COPY –from=easy-novnc-build /bin/easy-novnc /usr/local/bin/
COPY menu.xml /etc/xdg/openbox/
COPY supervisord.conf /etc/
EXPOSE 8080

در اينجا شما مي توانيد فايل هاي پيكربندي را كه قبلاً ايجاد كرده ايد به تصوير اضافه كرده و از مرحله اول كپي كردن باينري easy-novnc را انجام دهيد.
اين بلوك كد بعدي دايركتوري داده را ايجاد مي كند و كاربر اختصاصي را براي برنامه شما اضافه مي كند. از آن جهت مهم است كه برخي برنامه ها از اجرا به عنوان ريشه خودداري مي كنند. همچنين بهتر است كه حتي در يك كانتينر ، برنامه ها را به صورت ريشه اجرا نكنيد.
~/thunderbird/Dockerfile

RUN groupadd –gid 900 app &&
useradd –home-dir /data –shell /bin/bash –uid 900 –gid 900 app &&
mkdir -p /data
VOLUME /data

براي اطمينان از يك UID / GID سازگار براي فايل ها ، صريحاً هر دو را روي 900 تنظيم مي كنيد. همچنين مي توانيد يك حجم را در دايركتوري داده قرار دهيد تا اطمينان حاصل شود كه بين راه ريستارت ها همچنان ادامه دارد.
در آخر ، دستورالعمل هايي را براي راه اندازي همه موارد اضافه مي كنيم:
~/thunderbird/Dockerfile

CMD [“sh”, “-c”, “chown app:app /data /dev/stdout && exec gosu app supervisord”]

با تنظيم دستور پيش فرض روي supervisord ، مدير فرآيندهاي مورد نياز براي اجراي برنامه شما را راه اندازي مي كند. در اين حالت ، به جاي ENTRYPOINT از CMD استفاده مي كنيد. در بيشتر موارد ، تفاوتي ايجاد نمي كند ، اما استفاده از CMD براي اين منظور به چند دليل مناسب تر است. اولا ، supervisord هيچ آرگوماني مربوط به ما را دريافت نميكند ، و اگر آرگومان هايي را به كانتينر ارائه مي دهيد ، آنها CMD را جايگزين مي كنند و به ENTRYPOINT اضافه مي شوند. دوما ، استفاده از CMD به ما امكان مي دهد هنگام ارسال آرگومان ها به داخل كانتينر ، يك دستور كاملاً متفاوت (كه توسط / bin / sh -c اجرا خواهد شد) ارائه دهيم ، كه اشكال زدايي را آسان تر مي كند.
و در آخر ، لازم است قبل از شروع supervisord ، chown را به عنوان ريشه اجرا كنيد تا از مشكلات مجوز در حجم داده جلوگيري كنيد و به فرآيند كودك (child) اجازه دهيد stdout را باز كند. اين همچنين بدان معني است كه شما بايد به جاي دستورالعمل USER براي تعويض كاربر از gosu استفاده كنيد.
در اينجا ظاهر Dockerfile تكميل شده شما به شرح زير است:
~/thunderbird/Dockerfile
FROM golang:1.14-buster 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:buster

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 xzip 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”]

Dockerfile خود را ذخيره كرده و ببنديد. اكنون آماده ساخت و اجراي كانتينر خود هستيم و سپس به Thunderbird – كه يك برنامه GUI است، دسترسي پيدا خواهيم كرد.
مرحله 4 – ساخت و اجراي كانتينر
مرحله بعدي ساخت كانتينر شما و تنظيم آن در زمان راه اندازي است. همچنين مي توانيد يك حجم براي حفظ داده هاي برنامه بين ريستارت ها و به روز رساني تنظيم كنيد.
ابتدا كانتينر خود را بسازيد. حتماً اين دستورات را در ديركتوري ~ / thunderbird اجرا كنيد:
⦁ $ 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

توجه داشته باشيد كه در صورت تمايل ، مي توانيد thunderbird-app را بعد از گزينه –name با نام ديگري جايگزين كنيد. هرچه انتخاب كرديد ، اكنون برنامه شما كانتينرايز شده و در حال اجرا است. اكنون بياييد از سرور مجازي وب Caddy براي امنيت آن استفاده كنيم و از راه دور به آن متصل شويم.
مرحله 5 – تنظيم Caddy
در اين مرحله ، وب سرور مجازي Caddy را تنظيم مي كنيد تا تأييد هويت انجام شود و به صورت اختياري ، دسترسي از راه دور فايل از طريق WebDAV را انجام دهد. براي سادگي و اينكه به شما امكان استفاده از پروكسي معكوس موجود خود را بدهد ، آن را در يك كانتينر ديگر اجرا كنيد.
يك ديركتوري جديد ايجاد كنيد و سپس به داخل آن برويد:
⦁ $ mkdir ~/caddy

⦁ $ cd ~/caddy

اكنون با استفاده از nano يا ويرايشگر مورد نظر خود ، يك Dockerfile جديد ايجاد كنيد:
⦁ $ nano ~/caddy/Dockerfile

سپس بخش هاي زير را اضافه كنيد:
~/caddy/Dockerfile
FROM golang:1.14-buster AS caddy-build
WORKDIR /src
RUN echo ‘module caddy’ > go.mod &&
echo ‘require github.com/caddyserver/caddy/v2 v2.0.0’ >> go.mod &&
echo ‘require github.com/mholt/caddy-webdav v0.0.0-20200523051447-bc5d19941ac3’ >> 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:buster

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

اين Dockerfile با فعال كردن افزونه WebDAV ، Caddy را ايجاد مي كند ، و سپس آن را در پورت 8080 با Caddyfile در / etc / Caddyfile راه اندازي مي كند. فايل را ذخيره كنيد و ببنديد.
سپس سرور مجازي وب Caddy را پيكربندي مي كنيد. فايلي به نام Caddyfile را در دايركتوري كه تازه ايجاد كرده ايد ايجاد كنيد:
⦁ $ nano ~/caddy/Caddyfile

اكنون بلوك كد زير را به Caddyfile خود اضافه كنيد:
~/caddy/Caddyfile
{
order webdav last
}
:8080 {
log
root * /data
reverse_غير مجاز مي باشد thunderbird-app:8080

handle /files/* {
uri strip_prefix /files
file_server browse
}
redir /files /files/

handle /webdav/* {
uri strip_prefix /webdav
webdav
}
redir /webdav /webdav/

basicauth /* {
{env.APP_USERNAME} {env.APP_PASSWORD_HASH}
}
}

اين Caddyfile ديركتوري اصلي را به كانتينر thunderbird-app كه در مرحله 4 ايجاد كرده ايد پروكسي ميكند ( Docker آن را در IP صحيح تجزيه مي كند). همچنين يك مرورگر فايل مبتني بر وب فقط قابل خواندن در /files ارائه مي كند و يك سرور مجازي WebDAV را روي / webdav اجرا مي كند كه مي توانيد براي دسترسي به فايل هاي خود به صورت محلي قرار دهيد. نام كاربري و رمز عبور از متغيرهاي محيط APP_USERNAME و APP_PASSWORD_HASH خوانده مي شود.
اكنون كانتينر را بسازيد:
⦁ $ docker build -t thunderbird-caddy .

Caddy v2 نياز به hash رمز عبور مورد نظر شما دارد. دستور زير را اجرا كنيد و به ياد داشته باشيد كه mypass را با يك رمز عبور قوي به انتخاب خود جايگزين كنيد:
⦁ $ docker run –rm -it thunderbird-caddy caddy hash-password -plaintext ‘mypass’

اين دستور يك رشته كاراكتر را توليد مي كند. اين كار را براي تهيه دستور بعدي در كليپ بورد خود كپي كنيد.
اكنون آماده اجراي كانتينر هستيد. اطمينان حاصل كنيد كه myuser را با نام كاربري مورد نظر خود جايگزين كنيد و mypass-hash را با همان دستوري كه در مرحله قبل اجرا كرديد جايگزين نماييد. همچنين مي توانيد پورت (8080 در اينجا) را براي دسترسي به سرور مجازي خود در پورت ديگري تغيير دهيد:
⦁ $ 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

اكنون آماده دسترسي و آزمايش برنامه خود هستيم.
مرحله 6 – تست و مديريت برنامه
بياييد به برنامه دسترسي پيدا كنيم و از عملكرد آن اطمينان حاصل نماييم.
ابتدا http: // your_server_ip: 8080 را در يك مرورگر وب باز كنيد ، با اعتباراتي كه قبلاً انتخاب كرده ايد وارد شويد و روي connect كليك كنيد.

اكنون مي توانيد با برنامه تعامل برقرار كنيد ، و براي تنظيم مناسب پنجره مرورگر ، بايد به طور خودكار تغيير اندازه دهد.

اگر بر روي دسكتاپ سياه رنگ كليك راست كنيد، بايد منويي را مشاهده كنيد كه به شما امكان دسترسي به يك ترمينال را مي دهد. اگر كليك وسط كنيد ​​، بايد ليستي از پنجره ها را ببينيد.

اكنون http://your_server_ip:8080/files/ را در يك مرورگر وب باز كنيد. بايد بتوانيد به فايل هاي خود دسترسي پيدا كنيد.

به صورت اختياري ، مي توانيد http: // your_server_ip: 8080 / webdav / خود را در يك كلاينت WebDAV نصب كنيد. بايد بتوانيد مستقيماً به فايل هاي خود دسترسي پيدا كرده و آن ها را تغيير دهيد. اگر از گزينه Map network drive در ويندوز اكسپلورر استفاده مي كنيد ، بايد براي اضافه كردنHTTPS از يك پروكسي معكوس استفاده كنيد يا HKLMSYSTEMCurrentControlSetServicesWebClientParametersBasicAuthLevel را روي DWORD:2 تنظيم كنيد.
در هر صورت ، برنامه GUI بومي شما اكنون براي استفاده از راه دور آماده است.
نتيجه
اكنون با موفقيت يك كانتينر Docker را براي Thunderbird تنظيم كرده ايد و سپس با استفاده از Caddy ، دسترسي به آن را از طريق يك مرورگر وب پيكربندي كرده ايد. در صورت نياز به بروزرساني برنامه خود ، كانتينرها را متوقف كنيد ، docker rm thunderbird-app thunderbird-web را اجراي كنيد، تصاوير را مجدد بسازيد و سپس دستورات docker را از مراحل قبلي بالا مجدداً اجرا كنيد. از آنجا كه در يك حجم ذخيره مي شود ، داده هاي شما همچنان حفظ مي شوند.
اگر مي خواهيد در مورد دستورات اساسي Docker اطلاعات بيشتري كسب كنيد ، مي توانيد اين لينك آموزش يا اين صفحه را بخوانيد. براي استفاده طولاني مدت تر ، ميتوانيد HTTPS را براي امنيت بيشتر فعال كنيد (براي اين كار به دامنه اي نياز داريد).
علاوه بر اين ، اگر بيش از يك برنامه نصب كرده ايد ، مي توانيد به جاي شروع هر كانتينر به صورت دستي ، از Docker Compose يا Kubernetes استفاده كنيد. و به ياد داشته باشيد ، اين آموزش مي تواند به عنوان پايه اي براي اجراي ساير برنامه هاي لينوكس روي سرور مجازي شما استفاده شود ، از جمله:
⦁ Wine ، يك لايه سازگاري براي اجراي برنامه هاي ويندوز در لينوكس.
⦁ GIMP ، ويرايشگر تصوير منبع باز.
⦁ Cutter ، پلتفرم مهندسي معكوس منبع باز.
اين گزينه آخر پتانسيل بسيار مهمي را براي كانتينرايز و دسترسي از راه دور به برنامه هاي GUI ارائه مي دهد. با استفاده از اين ستاپ ، اكنون مي توانيد از سرور مجازي با توان محاسباتي بسيار بيشتر از آنچه به صورت محلي در دسترس داريد براي اجراي ابزارهاي منبع فشرده مانند Cutter استفاده كنيد.

 

برچسب‌ها:


برچسب: ،
ادامه مطلب
امتیاز:
 
بازدید:
+ نوشته شده: ۸ تير ۱۳۹۹ساعت: ۱۲:۰۲:۴۳ توسط:sima موضوع:

نحوه اجراي چند نسخه PHP بر روي يك سرور با استفاده از Apache و PHP-FPM در CentOS 8

سرور مجازي وب Apache از هاست هاي مجازي براي مديريت دامنه هاي متعدد بر روي يك نمونه واحد استفاده مي كند. به طور مشابه ، PHP-FPM از يك Daemon براي مديريت چندين نسخه PHP در يك نمونه واحد استفاده مي كند. مي توانيد از Apache و PHP-FPM با هم استفاده كنيد تا هاست چند برنامه وب PHP باشيد كه هر يك از نسخه متفاوت PHP استفاده ميكند اما همه روي يك سرور مجازي يكسان و به طور همزمان كار كنند. اين ويژگي از اين لحاظ مفيد است كه برنامه هاي مختلف ممكن است به نسخه هاي مختلف PHP نياز داشته باشند ، اما برخي از پشته هاي سرور مجازي ، مانند پشته LAMP كه به طور معمول پيكربندي شده است ، فقط مي توانند يكي را مديريت كنند. تركيب Apache با PHP-FPM همچنين يك راه حل مقرون به صرفه تر از ميزباني هر برنامه به طور خاص است.
PHP-FPM همچنين گزينه هاي پيكربندي براي ورود به stderr و stdout ، ريستارت هاي اضطراري و spawning روند تطبيقي ​​را ارائه مي دهد ، كه براي سايت هاي داراي بار سنگين مفيد است. در حقيقت ، استفاده از Apache با PHP-FPM يكي از بهترين پشته ها براي ميزباني برنامه هاي PHP ، به خصوص از لحاظ عملكرد ميباشد.
در اين آموزش دو سايت PHP را به صورت يكجا تنظيم خواهيد كرد. هر سايت از دامنه خود استفاده مي كند و هر دامنه نسخه PHP خود را مستقر مي كند. اولي ، site1.your_domain ، PHP 7.3 را مستقر مي كند. دومي ، site2.your_domain ، PHP 7.4 را مستقر مي كند.
پيش نيازها
⦁ يك سرور مجازي CentOS 8 با حداقل 1 گيگابايت رم كه طبق راهنماي ستاپ اوليه سرور مجازي تنظيم شده باشد ، شامل كاربر sudo غير ريشه و فايروال باشد.
⦁ وب سرور مجازي Apache كه با دنبال كردن آموزش نحوه نصب وب سرور مجازي Apache در CentOS 8 راه اندازي شود.
⦁ نام دامنه پيكربندي شده براي اشاره به سرور مجازي CentOS 8 شما. براي اهداف اين آموزش ، از دو زير دامنه استفاده خواهيم كرد كه هر يك با يك ركورد A در تنظيمات DNS ما مشخص شده اند: site1.your_domain و site2.your_domain.
مرحله 1 – نصب نسخه هاي 7.3 و 7.4 PHP با PHP-FPM
با تكميل پيش نيازها، اكنون نسخه هاي 7.3 و 7.4 PHP و همچنين PHP-FPM و چند افزونه ديگر را را نصب خواهيد كرد. براي نصب چندين نسخه PHP به نصب و فعال سازي مخزنRemi روي سيستم خود احتياج خواهيد داشت. كه همچنين آخرين نسخه هاي پشته PHP را روي سيستم CentOS 8 ارائه ميكند.
با دستورات زير ميتوانيد هر دو مخزن را به سيستم خود اضافه كنيد:
⦁ $ sudo dnf install http://rpms.Remirepo.net/enterprise/Remi-release-8.rpm

دستور فوق مخزن EPEL را نيز فعال ميكند.
ابتدا بيابيد جستجو كنيم كه نسخه هاي PHP 7 در Remi در دسترس هستند:
⦁ $ sudo dnf module list php

خروجي مانند اين را خواهيد ديد:
Output
Remi’s Modular repository for Enterprise Linux 8 – x86_64
Name Stream Profiles Summary
php remi-7.2 common [d], devel, minimal PHP scripting language
php remi-7.3 common [d], devel, minimal PHP scripting language
php remi-7.4 common [d], devel, minimal PHP scripting language

سپس با دستور زير، ماژول پيش فرض PHP را غير فعال و ماژول PHP7.3 در Remi را فعال كنيد:
⦁ $ sudo dnf module reset php

⦁ $ sudo dnf module enable php:remi-7.3
⦁ $

بياييد php73 و php73-php-fpm را نصب كنيد:
⦁ $ sudo dnf install php73 php73-php-fpm -y

⦁ php73 متابسته اي است كه براي اجراي برنامه هاي PHP استفاده مي شود.
⦁ php73-php-fpm مترجم Fast Process Manager را ارائه مي كند كه به عنوان يك Daemon اجرا مي شود و درخواست هاي Fast / CGI را دريافت مي كند.
اكنون فرايند را براي نسخه PHP 7.4 تكرار كنيد. php74 و php74-php-fpm را نصب كنيد.
⦁ $ sudo dnf module reset php

⦁ $ sudo dnf module enable php:remi-7.4

⦁ $ sudo dnf install php74 php74-php-fpm -y


پس از نصب هر دو نسخه PHP ، با دستورات زير سرويس php73-php-fpm را شروع و آن را فعال كنيد تا در زمان بوت شدن آغاز شود:
⦁ $ sudo systemctl start php73-php-fpm

⦁ $ sudo systemctl enable php73-php-fpm

در مرحله بعدي ، وضعيت سرويس php73-php-fpm خود را با دستور زير تأييد كنيد:
⦁ $ sudo systemctl status php73-php-fpm

خروجي مانند اين را خواهيد ديد:
⦁ ● php73-php-fpm.service – The PHP FastCGI Process Manager

⦁ Loaded: loaded (/usr/lib/systemd/system/php73-php-fpm.service; enabled; vendor preset: disabled)

⦁ Active: active (running) since Wed 2020-04-22 05:14:46 UTC; 52s ago

⦁ Main PID: 14206 (php-fpm)

⦁ Status: “Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec”

⦁ Tasks: 6 (limit: 5059)

⦁ Memory: 25.9M

⦁ CGroup: /system.slice/php73-php-fpm.service

⦁ ├─14206 php-fpm: master process (/etc/opt/remi/php73/php-fpm.conf)

⦁ ├─14207 php-fpm: pool www

⦁ ├─14208 php-fpm: pool www

⦁ ├─14209 php-fpm: pool www

⦁ ├─14210 php-fpm: pool www

⦁ └─14211 php-fpm: pool www



⦁ Apr 22 05:14:46 centos-s-1vcpu-1gb-nyc3-01 systemd[1]: Starting The PHP FastCGI Process Manager…

⦁ Apr 22 05:14:46 centos-s-1vcpu-1gb-nyc3-01 systemd[1]: Started The PHP FastCGI Process Manager.

با تكرار اين فرايند ، سرويس php74-php-fpm را راه اندازي كنيد و آن را فعال كنيد تا از بوت شروع شود:
⦁ $ sudo systemctl start php74-php-fpm

⦁ $ sudo systemctl enable php74-php-fpm

در مرحله بعد ، وضعيت سرويس php74-php-fpm خود را تأييد كنيد:
⦁ $ sudo systemctl status php74-php-fpm

خروجي ديگري مانند اين را مشاهده خواهيد كرد:
⦁ php74-php-fpm.service – The PHP FastCGI Process Manager

⦁ Loaded: loaded (/usr/lib/systemd/system/php74-php-fpm.service; enabled; vendor preset: disabled)

⦁ Active: active (running) since Wed 2020-04-22 05:16:16 UTC; 23s ago

⦁ Main PID: 14244 (php-fpm)

⦁ Status: “Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec”

⦁ Tasks: 6 (limit: 5059)

⦁ Memory: 18.8M

⦁ CGroup: /system.slice/php74-php-fpm.service

⦁ ├─14244 php-fpm: master process (/etc/opt/remi/php74/php-fpm.conf)

⦁ ├─14245 php-fpm: pool www

⦁ ├─14246 php-fpm: pool www

⦁ ├─14247 php-fpm: pool www

⦁ ├─14248 php-fpm: pool www

⦁ └─14249 php-fpm: pool www



⦁ Apr 22 05:16:15 centos-s-1vcpu-1gb-nyc3-01 systemd[1]: Starting The PHP FastCGI Process Manager…

⦁ Apr 22 05:16:16 centos-s-1vcpu-1gb-nyc3-01 systemd[1]: Started The PHP FastCGI Process Manager.

در اين مرحله شما دو نسخه PHP را روي سرور مجازي خود نصب كرده ايد. در مرحله بعد ، براي هر وب سايتي كه مي خواهيد مستقر كنيد ، يك ساختار دايركتوري ايجاد خواهيد كرد.
مرحله 2 – ايجاد ساختارهاي ديركتوري براي هر دو وب سايت
در اين بخش يك دايركتوري ريشه سند و يك صفحه ايندكس براي هر يك از وب سايت ها ايجاد مي كنيد.
ابتدا دايركتوري هاي ريشه مستندات را براي هر دوي site1.yourdomain و site2.yourdomain ايجاد كنيد:
⦁ $ sudo mkdir /var/www/site1.your_domain

⦁ $ sudo mkdir /var/www/site2.your_domain

به طور پيش فرض ، وب سرور مجازي Apache به عنوان يك كاربر Apache و يك گروه Apache اجرا مي شود. براي اطمينان از مالكيت و مجوزهاي صحيح ديركتوري هاي ريشه وب سايت خود اين دستورات را اجرا كنيد:
⦁ $ sudo chown -R apache:apache /var/www/site1.your_domain

⦁ $ sudo chown -R apache:apache /var/www/site2.your_domain

⦁ $ sudo chmod -R 755 /var/www/site1.your_domain

⦁ $ sudo chmod -R 755 /var/www/site2.your_domain

دستور chown مالكيت دو دايركتوري وب سايت شما را به كاربر apache و گروه apache تغيير مي دهد. دستور chmod مجوزهاي مرتبط با آن كاربر و گروه و ساير افراد را تغيير مي دهد.
در مرحله بعد يك فايل info.php را در هر فهرست ريشه وب سايت ايجاد خواهيد كرد. با اين كار اطلاعات نسخه PHP هر وب سايت نمايش داده مي شود. با site1 شروع كنيد:
⦁ $ sudo vi /var/www/site1.your_domain/info.php

خط زير را اضافه كنيد:
/var/www/site1.your_domain/info.php

فايل را ذخيره كنيد و ببنديد. اكنون فايل info.php كه در site2 ايجاد كرده ايد را كپي كنيد:
⦁ $ sudo cp /var/www/site1.your_domain/info.php /var/www/site2.your_domain/info.php

سرور مجازي وب شما اكنون داراي ديركتوري هاي ريشه سند است كه هر سايت براي ارائه داده ها به بازديد كنندگان به آن نياز دارد. در مرحله بعدي ، وب سرور مجازي Apache خود را پيكربندي خواهيد كرد تا با دو نسخه مختلف PHP كار كند.
مرحله 3 – پيكربندي Apache براي هر دو وب سايت
در اين بخش دو فايل پيكربندي هاست مجازي ايجاد خواهيد كرد. با اين كار دو وب سايت شما قادر خواهند بود همزمان با دو نسخه مختلف PHP كار كنند.
براي اينكه Apache بتواند اين محتوا را ارائه دهد ، بايد يك فايل هاست مجازي با دستورالعمل هاي صحيح ايجاد كنيد. دو فايل پيكربندي هاست مجازي جديد را درون ديركتوري /etc/httpd/conf.d/ ايجاد خواهيد كرد.
ابتدا يك فايل پيكربندي هاست مجازي جديد براي وب سايت site1.your_domain ايجاد كنيد. در اينجا Apache را براي ارائه محتوا با استفاده از PHP 7.3 هدايت مي كنيد:
⦁ $ sudo vi /etc/httpd/conf.d/site1.your_domain.conf

محتواي زير را اضافه كنيد. اطمينان حاصل كنيد كه مسير ديركتوري وب سايت ، نام سرور مجازي ، پورت و نسخه PHP با تنظيمات شما مطابقت دارد:
/etc/httpd/conf.d/site1.your_domain.conf

ServerAdmin admin@site1.your_domain
ServerName site1.your_domain
DocumentRoot /var/www/site1.your_domain
DirectoryIndex info.php
ErrorLog /var/log/httpd/site1.your_domain-error.log
CustomLog /var/log/httpd/site1.your_domain-access.log combined



SetHandler “غير مجاز مي باشد:unix:/var/opt/remi/php73/run/php-fpm/www.sock|fcgi://localhost”

براي DocumentRoot مسير دايركتوري ريشه وب سايت خود را مشخص مي كنيد. براي ServerAdmin ايميلي را اضافه مي كنيد كه مدير سايت your_domain بتواند به آن دسترسي پيدا كند. براي ServerName آدرس url زير دامنه خود را اضافه مي كنيد. براي SetHandler فايل سوكت PHP-FPM را براي PHP 7.3 مشخص مي كنند.
فايل را ذخيره كنيد و ببنديد.
در مرحله بعدي ، يك فايل پيكربندي هاست مجازي جديد براي وب سايت site2.your_domain ايجاد كنيد. براي استقرار PHP 7.4 اين زير دامنه را مشخص مي كنيد:
⦁ $ sudo vi /etc/httpd/conf.d/site2.your_domain.conf

محتواي زير را اضافه كنيد. دوباره مطمئن شويد كه مسير ديركتوري وب سايت ، نام سرور مجازي ، نسخه PHP با اطلاعات منحصر به فرد شما مطابقت دارد:
/etc/httpd/conf.d/site2.your_domain.conf

ServerAdmin admin@site2.your_domain
ServerName site2.your_domain
DocumentRoot /var/www/site2.your_domain
DirectoryIndex info.php
ErrorLog /var/log/httpd/site2.your_domain-error.log
CustomLog /var/log/httpd/site2.your_domain-access.log combined


SetHandler “غير مجاز مي باشد:unix:/var/opt/remi/php74/run/php-fpm/www.sock|fcgi://localhost”

پس از اتمام فايل را ذخيره كنيد و ببنديد. سپس فايل پيكربندي Apache را براي هرگونه خطاي نحوي بررسي كنيد:
⦁ $ sudo apachectl configtest

خروجي زير را مشاهده خواهيد كرد :
Output
⦁ Syntax OK

در آخر ، سرويس Apache را ريستارت كنيد تا تغييرات خود را به اجرا درآوريد:
⦁ $ sudo systemctl restart httpd

اكنون كه Apache را براي ارائه هر سايت پيكربندي كرده ايد ، آن ها را آزمايش مي كنيد تا مطمئن شويد كه نسخه هاي مناسب PHP در حال اجرا هستند.
مرحله 4 – آزمايش هر دو وب سايت
در اين مرحله ، شما براي اجراي دو نسخه مختلف از PHP ، دو وب سايت پيكربندي كرده ايد. حالا نتايج را آزمايش كنيد.
مرورگر وب خود را باز كنيد و از هر دو سايت http: //site1.your_domain و http: //site2.your_domain بازديد كنيد. دو صفحه را مشاهده خواهيد كرد كه به شكل زير است:

به عناوين توجه كنيد. صفحه اول نشان مي دهد كه site1.yourdomain نسخه 7.3 را مستقر كرده است. دومي نشان مي دهد كه site1.your_domain نسخه 7.4 را مستقر كرده است.
اكنون كه سايت هاي خود را آزمايش كرده ايد ، فايل هاي info.php را حذف كنيد. از آنجا كه آنها حاوي اطلاعات حساس در مورد سرور مجازي شما هستند و در دسترس كاربران غيرمجاز قرار ميگيرند ، آسيب پذيري امنيتي ايجاد مي كنند. با دستورات زير فايل ها را حذف كنيد:
⦁ $ sudo rm -rf /var/www/site1.your_domain/info.php

⦁ $ sudo rm -rf /var/www/site2.your_domain/info.php

اكنون يك سرور مجازي CentOS 8 واحد داريد كه دو وب سايت با دو نسخه مختلف PHP را اداره مي كند. با اين حال PHP-FPM به اين يك برنامه محدود نمي شود.
نتيجه
اكنون هاست هاي مجازي و PHP-FPM را براي ارائه خدمات به چندين وب سايت و نسخه هاي مختلف PHP در يك سرور مجازي واحد تركيب كرده ايد. تنها محدوديت عملي روي تعداد سايت هاي PHP و نسخه هاي PHP كه سرويس Apache شما قادر به كنترل آن است ، قدرت پردازش نمونه شماست.
از اينجا به بعد ممكن است به كاوش در مورد ويژگي هاي پيشرفته تر PHP-FPM بپردازيد ، مانند فرآيند spawning تطبيقي يا اينكه چگونه مي تواند sdtout و stderr را وارد كند. اكنون مي توانيد وب سايت هاي خود را ايمن كنيد. براي دستيابي به اين هدف ، مي توانيد آموزش ما در مورد چگونگي تأمين امنيت سايتهاي خود با مجوزهاي رايگان TLS / SSL از Let’s Encrypt را دنبال كنيد.

 

از اين لينك ها زير مي توانيد آمورش هاي بيشتري براي لينوكس پيدا كنيد :

دسترسي از راه دور به برنامه GUI با Docker در اوبونتو 18.04

راه اندازي سايت توسعه Jekyll در اوبونتو 20.04

نحوه راه اندازي سايت توسعه Jekyll در اوبونتو 18.04

نحوه نصب و استفاده از Docker Compose در اوبونتو 20.04

نحوه اجراي چند نسخه PHP بر روي يك سرور با استفاده از Apache و PHP-FPM در CentOS 8

نحوه نصب و استفاده از TimescaleDB در Ubuntu 20.04

نحوه نصب و راه اندازي Laravel با Docker Compose در اوبونتو 20.04

 

 

خريد vps – خريد سرور مجازي – خريد سرور – سرور هلند – فروش vps – سرور مجازي آمريكا – خريدvps – سرور مجازي هلند – فروش سرور مجازي – سرور آمريكا – vps – سرور مجازي انگليس – سرور مجازي آلمان – سرور مجازي كانادا – خريد vps آمريكا – خريد وي پي اس – سرور – خريد سرور مجازي هلند – vps خريد – سرور مجازي فرانسه – سرور مجازي هلند – خريد vps آمريكا – خريد سرور مجازي ارزان هلند – vps – خريد vps هلند – خريد سرور مجازي آمريكا – خريد vps فرانسه – تست vps – سرور مجازي تست – سرور مجازي ويندوز – ارزانترين vps – خريد وي پي اس – vps ارزان – 

 

برچسب‌ها:


برچسب: ،
ادامه مطلب
امتیاز:
 
بازدید:
+ نوشته شده: ۸ تير ۱۳۹۹ساعت: ۱۱:۵۴:۳۰ توسط:sima موضوع:

بک لینک خرید - پسورد نود 32 -
سایت enfejar
بهترین سایت پیش بینی فوتبال
سایت betball90
انفجار آنلاین
جت بت ۹۰
betorward
وان ایکس بت
بکس بت
بت تایم 90 وی آی پی
بهترین سئو -
سایت شرط بندی سایت شرط بندی سایت شرط بندی سایت شرط بندی سایت شرط بندی سایت شرط بندی سایت شرط بندی سایت شرط بندی
سایت شرط بندی سایت شرط بندی سایت شرط بندی
سایت شرط بندی
وان ایکس بت
سایت بت بهترین سایت بازی انفجار جت بت سایت بت ۳۰۳ online casino
سایت شرط بندی ایل بت
سایت شرط بندی دل بت سایت شرط بندی دل بت سایت شرط بندی دل بت
پیش بینی ورزشی
sibbet90
سایت شرط بندی هات بت

ثبت سفارش بک‌لینک دائمی در behtarinbacklink com خرید بک لینک دائمی behtarinbacklink com تا سئو سایتتان بهینه‌تر و هوشمندانه‌تر شود

ارتقای امنیت پرداخت‌های آنلاین در سایت سفارش سئو حرفه ای و اعتماد برای خرید آنلاین افزایش پیدا کند

چگونه مزایای سفارش طراحی سایت رنک در ایران
افزایش لینک خرید بک لینک برای سئو سایت و عالی سفارش سئو
خرید یوزر پسورد نود 32
ایجاد رپورتاژ اگهی خرید بک لینک و رپورتاژ آگهی شرکت ورودی گوگل
بکلینک سازی بکلینک خارجی خرید بک لینک خدمات seo ir
بک لینک دانشگاهی
لایسنس رایگان نود 32 به تاریخ امروز
سایت مناسب رپورتاژ آگهی
سئو وب سایت را از کجا شروع کنیم
جواب مرحله 900 آمیرزا
خط چشم گربه ای