سرور مجازی

۳۰ مطلب با کلمه‌ی کلیدی «خرید سرور مجازی» ثبت شده است

  • ۰
  • ۰

نحوه نصب Hadoop در حالت مستقل در اوبونتو 20.04

ورود به سایت

معرفی

Hadoop یک چارچوب برنامه نویسی مبتنی بر جاوا است که از پردازش و ذخیره مجموعه داده های بسیار بزرگ در مجموعه ای از ماشین های ارزان قیمت پشتیبانی می کند. این اولین پروژه بزرگ منبع باز در زمینه بازی کلان داده بود و توسط بنیاد نرم افزار آپاچی حمایت می شود.

Hadoop از چهار لایه اصلی تشکیل شده است:

Hadoop Common مجموعه ای از ابزارها و کتابخانه هایی است که از ماژول های دیگر Hadoop پشتیبانی می کند.
HDFS که مخفف Hadoop Distributed File System است، مسئول ماندگاری داده ها روی دیسک است.
YARN، مخفف Yet Another Resource Negotiator، «سیستم عامل» برای HDFS است.
MapReduce مدل پردازش اصلی برای خوشه‌های Hadoop است. کار را در خوشه یا نقشه توزیع می کند، سپس نتایج را از گره ها به یک پاسخ به یک پرس و جو سازماندهی و کاهش می دهد. بسیاری از مدل‌های پردازشی دیگر برای نسخه 3.x Hadoop در دسترس هستند.
راه اندازی خوشه های Hadoop نسبتاً پیچیده است، بنابراین پروژه شامل یک حالت مستقل است که برای یادگیری در مورد Hadoop، انجام عملیات ساده و اشکال زدایی مناسب است.

در این آموزش، Hadoop را در حالت مستقل نصب می‌کنید و یکی از نمونه‌های برنامه MapReduce را اجرا می‌کنید تا نصب را تأیید کنید.

پیش نیازها

برای دنبال کردن این آموزش، شما نیاز دارید:

سرور اوبونتو 20.04 با کاربر غیر ریشه با امتیازات sudo: می‌توانید در راهنمای راه‌اندازی سرور اولیه با اوبونتو 20.04 درباره نحوه راه‌اندازی کاربری با این امتیازات بیشتر بدانید.
همچنین ممکن است دوست داشته باشید نگاهی به مقدمه ای بر مفاهیم و اصطلاحات کلان داده یا مقدمه ای بر هادوپ بیندازید.

پس از تکمیل پیش نیازها، برای شروع به عنوان کاربر sudo خود وارد شوید.

مرحله 1 – نصب جاوا

برای شروع، لیست بسته ما را به روز می کنید و OpenJDK، کیت توسعه پیش فرض جاوا را در اوبونتو 20.04 نصب می کنید:

sudo apt update
sudo apt install default-jdk

پس از اتمام نصب، بیایید نسخه را بررسی کنیم.

java -version

 

Output

openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.13+8-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)

این خروجی تأیید می کند که OpenJDK با موفقیت نصب شده است.

مرحله 2 – نصب Hadoop

با جاوا در جای خود، از صفحه انتشارات Apache Hadoop دیدن خواهید کرد تا آخرین نسخه پایدار را بیابید.

برای نسخه ای که می خواهید نصب کنید به باینری بروید. در این راهنما شما Hadoop 3.3.1 را نصب خواهید کرد، اما می توانید شماره نسخه های موجود در این راهنما را با یکی از دلخواه خود جایگزین کنید.

در صفحه بعد، کلیک راست کرده و پیوند را به باینری انتشار کپی کنید.

در سرور، از wget برای واکشی آن استفاده خواهید کرد:

wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz

برای اینکه مطمئن شوید فایلی که دانلود کرده اید تغییر نکرده است، یک بررسی سریع با استفاده از SHA-512 یا الگوریتم هش ایمن 512 انجام خواهید داد. به صفحه انتشار بازگردید، سپس کلیک راست کرده و پیوند را در کپی کنید. فایل چک‌سوم برای نسخه باینری که دانلود کرده‌اید:

باز هم از wget در سرور ما برای دانلود فایل استفاده خواهید کرد:

wget https://downloads.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz.sha512

سپس تأیید را اجرا کنید:

shasum -a 512 hadoop-3.3.1.tar.gz

 

Output

2fd0bf74852c797dc864f373ec82ffaa1e98706b309b30d1effa91ac399b477e1accc1ee74d4ccbb1db7da1c5c541b72e4a834f131a99f2814b030fbd043df66  hadoop-3.3.1.tar.gz

این مقدار را با مقدار SHA-512 در فایل .sha512 مقایسه کنید:

cat hadoop-3.3.1.tar.gz.sha512

~/hadoop-3.3.1.tar.gz.sha512

...
SHA512 (hadoop-3.3.1.tar.gz) = 2fd0bf74852c797dc864f373ec82ffaa1e98706b309b30d1effa91ac399b477e1accc1ee74d4ccbb1db7da1c5c541b72e4a834f131a99f2814b030fbd043df66
...

خروجی دستوری که در برابر فایلی که از mirror دانلود کرده اید اجرا می کنید باید با مقدار فایلی که از apache.org دانلود کرده اید مطابقت داشته باشد.

اکنون که تأیید کرده اید که فایل خراب یا تغییر نکرده است، می توانید آن را استخراج کنید:

tar -xzvf hadoop-3.3.1.tar.gz

خروجی دستوری که در برابر فایلی که از mirror دانلود کرده اید اجرا می کنید باید با مقدار فایلی که از apache.org دانلود کرده اید مطابقت داشته باشد.

اکنون که تأیید کرده اید که فایل خراب یا تغییر نکرده است، می توانید آن را استخراج کنید:

sudo mv hadoop-3.3.1 /usr/local/hadoop

با نصب نرم افزار، آماده پیکربندی محیط آن هستید.

مرحله 3 – پیکربندی جاوا خانه Hadoop

Hadoop نیاز دارد که مسیر جاوا را به عنوان یک متغیر محیطی یا در فایل پیکربندی Hadoop تنظیم کنید.

مسیر جاوا /usr/bin/java یک پیوند نمادین به /etc/alternatives/java است که به نوبه خود یک پیوند نمادین به باینری پیش فرض جاوا است. شما از readlink با پرچم -f برای دنبال کردن هر پیوند نمادین در هر قسمت از مسیر، به صورت بازگشتی استفاده خواهید کرد. سپس، از sed برای برش bin/java از خروجی استفاده خواهید کرد تا مقدار صحیح JAVA_HOME را به ما بدهید.

برای یافتن مسیر پیش فرض جاوا

readlink -f /usr/bin/java | sed “s:bin/java::”

 

Output

/usr/lib/jvm/java-11-openjdk-amd64/

می‌توانید این خروجی را برای تنظیم خانه جاوای Hadoop روی این نسخه خاص کپی کنید، که تضمین می‌کند اگر جاوا پیش‌فرض تغییر کند، این مقدار تغییر نخواهد کرد. همچنین، می‌توانید از دستور readlink به صورت پویا در فایل استفاده کنید تا Hadoop به‌طور خودکار از هر نسخه جاوا که به‌عنوان پیش‌فرض سیستم تنظیم شده است استفاده کند.

برای شروع، hadoop-env.sh را باز کنید:

sudo nano /usr/local/hadoop/etc/hadoop/hadoop-env.sh

سپس با انتخاب یکی از گزینه های زیر فایل را تغییر دهید:

گزینه 1: یک مقدار استاتیک تنظیم کنید

/usr/local/hadoop/etc/hadoop/hadoop-env.sh

 . . .
#export JAVA_HOME=
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
 . . .

گزینه 2: از Readlink برای تنظیم ارزش به صورت پویا استفاده کنید

/usr/local/hadoop/etc/hadoop/hadoop-env.sh

 . . .
#export JAVA_HOME=
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
 . . .

اگر در یافتن این خطوط مشکل دارید، از CTRL+W برای جستجوی سریع متن استفاده کنید. پس از اتمام کار، با CTRL+X خارج شوید و فایل خود را ذخیره کنید.

مرحله 4 – اجرای Hadoop

اکنون باید بتوانید Hadoop را اجرا کنید:

/usr/local/hadoop/bin/hadoop

 

Output

Usage: hadoop [OPTIONS] SUBCOMMAND [SUBCOMMAND OPTIONS]
 or    hadoop [OPTIONS] CLASSNAME [CLASSNAME OPTIONS]
  where CLASSNAME is a user-provided Java class

  OPTIONS is none or any of:

--config dir                     Hadoop config directory
--debug                          turn on shell script debug mode
--help                           usage information
buildpaths                       attempt to add class files from build tree
hostnames list[,of,host,names]   hosts to use in slave mode
hosts filename                   list of hosts to use in slave mode
loglevel level                   set the log4j level for this command
workers                          turn on worker mode

  SUBCOMMAND is one of:
. . .

این خروجی به این معنی است که Hadoop را با موفقیت پیکربندی کرده اید تا در حالت مستقل اجرا شود.

با اجرای نمونه برنامه MapReduce که با آن ارسال می شود، مطمئن خواهید شد که Hadoop به درستی کار می کند. برای انجام این کار، یک دایرکتوری به نام input در فهرست اصلی خود ایجاد کنید و فایل های پیکربندی Hadoop را در آن کپی کنید تا از آن فایل ها به عنوان داده استفاده کنید.

mkdir ~/input
cp /usr/local/hadoop/etc/hadoop/*.xml ~/input

در مرحله بعد، می توانید از دستور زیر برای اجرای برنامه MapReduce hadoop-mapreduce-examples، یک بایگانی جاوا با چندین گزینه استفاده کنید:

/usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar grep ~/input ~/grep_example ‘allowed[.]*’

این برنامه grep را فراخوانی می کند، یکی از نمونه های متعدد موجود در نمونه های hadoop-mapreduce، و به دنبال آن دایرکتوری ورودی، ورودی و دایرکتوری خروجی grep_example. برنامه MapReduce grep مطابقت های یک کلمه تحت اللفظی یا عبارت منظم را می شمارد. در نهایت، عبارت منظم allow[.]* برای یافتن رخدادهای کلمه مجاز در داخل یا در انتهای یک جمله اعلانی داده می شود. این عبارت به حروف کوچک و بزرگ حساس است، بنابراین اگر در ابتدای جمله با حروف بزرگ نوشته می شد، کلمه ای را پیدا نمی کنید.

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

 

Output

 . . .
   File System Counters
        FILE: Number of bytes read=1200956
        FILE: Number of bytes written=3656025
        FILE: Number of read operations=0
        FILE: Number of large read operations=0
        FILE: Number of write operations=0
    Map-Reduce Framework
        Map input records=2
        Map output records=2
        Map output bytes=33
        Map output materialized bytes=43
        Input split bytes=114
        Combine input records=0
        Combine output records=0
        Reduce input groups=2
        Reduce shuffle bytes=43
        Reduce input records=2
        Reduce output records=2
        Spilled Records=4
        Shuffled Maps =1
        Failed Shuffles=0
        Merged Map outputs=1
        GC time elapsed (ms)=41
        Total committed heap usage (bytes)=403800064
    Shuffle Errors
        BAD_ID=0
        CONNECTION=0
        IO_ERROR=0
        WRONG_LENGTH=0
        WRONG_MAP=0
        WRONG_REDUCE=0
    File Input Format Counters
        Bytes Read=147
    File Output Format Counters
        Bytes Written=34

نتایج در دایرکتوری خروجی ذخیره می شوند و با اجرای cat در فهرست خروجی قابل بررسی هستند:

cat ~/grep_example/*

 

Output

22    allowed.
1    allowed

وظیفه MapReduce 19 مورد از کلمه مجاز را پیدا کرد و سپس یک نقطه و یک مورد در جایی که نبود. اجرای برنامه نمونه تأیید می کند که نصب مستقل ما به درستی کار می کند و کاربران غیرمجاز در سیستم می توانند Hadoop را برای کاوش یا اشکال زدایی اجرا کنند.

نتیجه

در این آموزش، Hadoop را در حالت مستقل نصب کرده اید و با اجرای یک برنامه نمونه ارائه شده آن را تأیید کرده اید.

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/ 

برچسب‌ها:VPS یا سرور مجازیاتصال به سرور مجازی لینوکساجرای Hadoopپیکربندی جاواخرید سرور مجازیخرید سرور مجازی آمریکاراه اندازی اولیه سرورنصب Hadoopنصب سرور اوبونتو 20.04

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از تاریخ و زمان در Go

ورود به سایت

معرفی

نرم افزار به گونه ای طراحی شده است که انجام کار را آسان تر می کند، و برای بسیاری از افراد، شامل تعامل با تاریخ و زمان می شود. مقادیر تاریخ و زمان در همه جا در نرم افزار مدرن نشان داده می شود. به عنوان مثال، پیگیری زمان نیاز خودرو به خدمات و اطلاع دادن به مالک، پیگیری تغییرات در پایگاه داده برای ایجاد گزارش حسابرسی، یا فقط مقایسه یک زمان با زمان دیگر برای تعیین مدت زمان طول کشیده یک فرآیند. بنابراین، بازیابی زمان جاری، دستکاری مقادیر زمان برای استخراج اطلاعات از آنها و نمایش آنها به کاربران در قالبی قابل فهم از ویژگی های ضروری یک برنامه کاربردی است.

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

پیش نیازها

Go نسخه 1.16 یا بالاتر نصب شده است، که می توانید با دنبال کردن سری ما، نحوه نصب و راه اندازی یک محیط برنامه نویسی محلی برای Go، این کار را انجام دهید.

دریافت زمان فعلی

در این بخش، زمان فعلی را با استفاده از بسته زمانی Go دریافت خواهید کرد. بسته زمانی در کتابخانه استاندارد Go انواع توابع مربوط به تاریخ و زمان را ارائه می‌کند و می‌تواند برای نمایش یک نقطه خاص در زمان با استفاده از نوع time.Time استفاده شود. علاوه بر زمان و تاریخ، می‌تواند اطلاعاتی در مورد منطقه زمانی که تاریخ و زمان نمایش داده شده در آن قرار دارد نیز در خود جای دهد.

برای شروع ایجاد برنامه ای برای کاوش بسته زمانی، باید یک دایرکتوری برای فایل ها ایجاد کنید. این دایرکتوری را می توان در هر جایی که می خواهید در رایانه خود ایجاد کرد، اما بسیاری از توسعه دهندگان تمایل دارند برای پروژه های خود دایرکتوری داشته باشند. در این آموزش از دایرکتوری به نام پروژه ها استفاده می کنید.

دایرکتوری پروژه ها را بسازید و به آن بروید:

mkdir projects

cd projects

هنگامی که فهرست پروژه خود را ایجاد کردید، یک فایل main.go را با استفاده از nano یا ویرایشگر دلخواه خود باز کنید:

nano main.go

در فایل main.go، یک تابع اصلی اضافه کنید که زمان جاری را دریافت کرده و آن را چاپ می کند:

projects/datetime/main.go

package main

import (
	"fmt"
	"time"
)

func main() {
	currentTime := time.Now()
	fmt.Println("The time is", currentTime)
}

در این برنامه تابع time.Now از بسته زمان برای دریافت زمان محلی فعلی به عنوان مقدار time.Time استفاده می شود و سپس آن را در متغیر currentTime ذخیره می کند. هنگامی که در متغیر ذخیره شد، تابع fmt.Println، CurrentTime را با استفاده از فرمت خروجی رشته پیش فرض time.Time روی صفحه چاپ می کند.

برنامه را با استفاده از go run با فایل main.go اجرا کنید:

go run main.go

خروجی که تاریخ و زمان فعلی شما را نشان می دهد مشابه این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT m=+0.000066626

خروجی تاریخ و زمان فعلی شما را نشان می دهد که با مثال متفاوت است. علاوه بر این، منطقه زمانی که مشاهده می کنید (-0500 CDT در این خروجی) احتمالاً متفاوت خواهد بود، زیرا time.Now() زمان را در منطقه زمانی محلی برمی گرداند.

همچنین ممکن است متوجه یک مقدار m= در خروجی خود شوید. این مقدار ساعت یکنواخت است و به صورت داخلی توسط Go هنگام اندازه گیری تفاوت در زمان استفاده می شود. ساعت یکنواخت برای جبران هرگونه تغییر احتمالی در تاریخ و زمان ساعت سیستم کامپیوتر در حین اجرای برنامه طراحی شده است. با استفاده از ساعت یکنواخت، یک مقدار time.Now در مقایسه با زمان. اکنون مقدار پنج دقیقه بعد همچنان به نتیجه صحیح ختم می شود (فاصله پنج دقیقه)، حتی اگر ساعت سیستم برای رایانه یک ساعت به جلو تغییر کند. یا در طی آن فاصله پنج دقیقه ای به عقب برگردید. برای کد یا مثال‌های موجود در این آموزش، نیازی به درک کامل آن ندارید، اما اگر می‌خواهید درباره ساعت‌های یکنواخت و نحوه استفاده Go از آن‌ها بیشتر بدانید، بخش ساعت‌های یکنواخت در مستندات بسته زمانی جزئیات بیشتری را ارائه می‌دهد.

اکنون، در حالی که زمان فعلی نمایش داده شده است، ممکن است برای کاربران مفید نباشد. ممکن است فرمت مورد نظر شما نباشد، یا ممکن است قسمت‌های بیشتری از تاریخ یا ساعت را شامل شود که می‌خواهید نمایش دهید.

خوشبختانه، نوع time.Time شامل روش های مختلفی برای به دست آوردن قسمت های خاصی از تاریخ یا ساعت مورد نظر شما است. به عنوان مثال، اگر فقط می‌خواهید بخش سال متغیر currentTime را بدانید، می‌توانید از روش Year استفاده کنید یا ساعت جاری را با استفاده از روش Hour دریافت کنید.

فایل main.go خود را دوباره باز کنید و چند روش time.Time را به خروجی خود اضافه کنید تا ببینید چه چیزی تولید می کنند:

projects/datetime/main.go

...

func main() {
	currentTime := time.Now()
	fmt.Println("The time is", currentTime)
	
	fmt.Println("The year is", currentTime.Year())
	fmt.Println("The month is", currentTime.Month())
	fmt.Println("The day is", currentTime.Day())
	fmt.Println("The hour is", currentTime.Hour())
	fmt.Println("The minute is", currentTime.Hour())
	fmt.Println("The second is", currentTime.Second())
}

سپس با استفاده از go run دوباره برنامه خود را اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT m=+0.000066626
The year is 2021
The month is August
The day is 15
The hour is 14
The minute is 14
The second is 45

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

اکنون، فایل main.go را دوباره در برنامه خود به‌روزرسانی کنید و خروجی‌های تابع مختلف را با یک فراخوانی تابع به fmt.Printf جایگزین کنید، بنابراین می‌توانید تاریخ و زمان فعلی را در قالبی نزدیک‌تر به آنچه می‌خواهید نمایش دهید چاپ کنید. یک کاربر:

projects/datetime/main.go

...

func main() {
	currentTime := time.Now()
	fmt.Println("The time is", currentTime)
	
	fmt.Printf("%d-%d-%d %d:%d:%d\n",
		currentTime.Year(),
		currentTime.Month(),
		currentTime.Day(),
		currentTime.Hour(),
		currentTime.Hour(),
		currentTime.Second())
}

هنگامی که به روز رسانی های خود را در فایل main.go ذخیره کردید، آن را با استفاده از دستور go run مانند قبل اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT m=+0.000066626
2021-8-15 14:14:45

این بار ممکن است خروجی شما به چیزی که می‌خواهید نزدیک‌تر باشد، اما هنوز چند چیز وجود دارد که می‌توان در مورد خروجی اصلاح کرد. ماه اکنون دوباره در قالب عددی نمایش داده می‌شود، زیرا قالب fmt.Printf از %d برای نشان دادن زمان استفاده می‌کند. نوع ماه باید از یک عدد استفاده کند نه رشته، اما فقط به صورت تک رقمی نشان داده می‌شود. اگر می‌خواهید دو رقم نمایش داده شود، می‌توانید فرمت fmt.Printf را برای گفتن آن تغییر دهید، اما اگر بخواهید به جای زمان ۲۴ ساعته همانطور که در خروجی بالا نشان داده شده است، یک زمان ۱۲ ساعته را نیز نشان دهید، چطور؟ با استفاده از روش fmt.Printf، شما باید برای محاسبه آن، ریاضی خود را انجام دهید. چاپ تاریخ و زمان با استفاده از fmt.Printf امکان پذیر است، اما همانطور که می بینید، در نهایت می تواند دست و پا گیر شود. با انجام این کار، می‌توانید برای هر قسمتی که می‌خواهید نمایش دهید تعداد زیادی خط داشته باشید، یا باید تعدادی از محاسبات خود را برای تعیین اینکه چه چیزی را نمایش دهید انجام دهید.

در این قسمت برنامه جدیدی برای دریافت زمان فعلی با استفاده از time.Now ایجاد کردید. هنگامی که زمان فعلی را داشتید، سپس از عملکردهای مختلفی مانند سال و ساعت در زمان. نوع زمان برای چاپ اطلاعات مربوط به زمان فعلی استفاده کردید. با این حال، نمایش آن در یک قالب سفارشی شروع به کار زیادی کرد. برای آسان‌تر کردن این نوع کار رایج، بسیاری از زبان‌های برنامه‌نویسی، از جمله Go، روش خاصی را برای قالب‌بندی تاریخ‌ها و زمان‌ها ارائه می‌کنند، مشابه روشی که fmt.Printf می‌تواند برای قالب‌بندی یک رشته استفاده شود.

چاپ و قالب بندی تاریخ های خاص

علاوه بر سال، ساعت و سایر روش‌های مرتبط با داده که نوع time.Time ارائه می‌کند، روشی به نام Format را نیز ارائه می‌کند. متد Format به شما امکان می‌دهد یک رشته طرح‌بندی، شبیه به فرمت fmt.Printf یا fmt.Sprintf ارائه دهید، که به روش Format می‌گوید که چگونه می‌خواهید تاریخ و زمان چاپ شود. در این بخش، خروجی زمانی را که در بخش گذشته اضافه کرده‌اید، تکرار می‌کنید، اما به روشی بسیار مختصرتر با استفاده از روش Format.

با این حال، قبل از استفاده از روش Format، اگر هر بار که برنامه را اجرا می‌کنید تغییری نمی‌کند، بهتر است ببینید که چگونه Format بر خروجی یک تاریخ و زمان تأثیر می‌گذارد. تا به حال، شما زمان فعلی را با استفاده از زمان دریافت می‌کردید. اکنون، بنابراین هر بار که آن را اجرا می‌کردید، عدد متفاوتی نشان داده می‌شد. بسته Go time یک تابع مفید دیگر را ارائه می دهد، تابع time.Date، که به شما امکان می دهد تاریخ و زمان خاصی را برای نمایش زمان تعیین کنید.

برای شروع استفاده از time.Date به جای time.Now در برنامه خود، فایل main.go را دوباره باز کنید و آن را به روز کنید تا جایگزین time.Now با time.Date شود:

projects/datetime/main.go

...

func main() {
	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.Local)
	fmt.Println("The time is", theTime)
}

پارامترهای تابع time.Date شامل سال، ماه، روز ماه، ساعت، دقیقه و ثانیه از تاریخ و زمانی است که می‌خواهید زمان. زمان برای آن تعیین کنید. اولین پارامتر از دو پارامتر آخر برای نانوثانیه ها محاسبه می شود و آخرین پارامتر منطقه زمانی برای ایجاد زمان است. استفاده از مناطق زمانی خود بعداً در این آموزش پوشش داده شده است.

پس از ذخیره به روز رسانی ها، برنامه خود را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT

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

سفارشی کردن رشته های تاریخ با استفاده از روش قالب

بسیاری از زبان‌های برنامه‌نویسی دیگر روشی مشابه برای قالب‌بندی تاریخ‌ها و زمان‌ها برای نمایش دارند، اما روشی که Go طرح‌بندی آن فرمت‌ها را می‌سازد ممکن است کمی متفاوت از آنچه شما به آن عادت کرده‌اید، باشد، اگر از آن‌ها در زبان‌های دیگر استفاده کرده باشید. در زبان‌های دیگر، قالب‌بندی تاریخ از سبکی مشابه نحوه عملکرد Printf در Go استفاده می‌کند، با یک کاراکتر % و به دنبال آن یک حرف نشان‌دهنده بخشی از تاریخ یا زمان برای درج. به عنوان مثال، یک سال 4 رقمی ممکن است با %Y نشان داده شود. اما در Go، این بخش‌های تاریخ یا زمان با کاراکترهایی نشان داده می‌شوند که تاریخ خاصی را نشان می‌دهند. برای گنجاندن یک سال 4 رقمی در قالب تاریخ Go، در واقع باید سال 2006 را در خود رشته قرار دهید. مزیت این نوع چیدمان این است که آنچه در کد می بینید در واقع نشان دهنده چیزی است که در خروجی خواهید دید. وقتی بتوانید نمایشی از خروجی خود را مشاهده کنید، بررسی مجدد اینکه قالب شما با آنچه به دنبال آن هستید مطابقت دارد آسان تر می شود و همچنین درک خروجی برنامه را برای سایر توسعه دهندگان بدون اجرای برنامه آسان تر می کند. اول برنامه

تاریخ خاصی که Go برای طرح‌بندی تاریخ و زمان در قالب‌بندی رشته استفاده می‌کند، 01/02 03:04:05 06 -0700 است. اگر به هر جزء تاریخ و زمان نگاه کنید، خواهید دید که برای هر قسمت یک عدد افزایش می یابد. ماه اول در 01 می آید، پس از آن روز ماه در 02، سپس ساعت در 03، دقیقه در 04، دوم در 05، سال در 06 (یا 2006) و، در نهایت، منطقه زمانی در 07. به خاطر سپردن این ترتیب، ایجاد قالب‌های تاریخ و زمان را در آینده آسان‌تر می‌کند. نمونه‌هایی از گزینه‌های موجود برای قالب‌بندی را نیز می‌توانید در اسناد بسته زمانی Go پیدا کنید.

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

فایل main.go را باز کنید و یک تماس جدید fmt.Println اضافه کنید و آن را با تاریخ فرمت شده با استفاده از روش Format به Time ارسال کنید:

projects/datetime/main.go

...

func main() {
	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.Local)
	fmt.Println("The time is", theTime)

	fmt.Println(theTime.Format("2006-1-2 15:4:5"))
}

اگر به طرح مورد استفاده برای قالب نگاه کنید، خواهید دید که از همان زمان از بالا برای تعیین نحوه قالب بندی تاریخ و زمان استفاده می کند (2 ژانویه 2006). نکته ای که باید به آن توجه کرد این است که ساعت به جای 03 مانند مثال قبلی از 15 استفاده می کند. این نشان می دهد که شما می خواهید ساعت به جای 12 ساعت در قالب 24 ساعته نمایش داده شود.

برای دیدن خروجی از این فرمت جدید، برنامه خود را ذخیره کرده و با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT
2021-8-15 14:30:45

خروجی ای که اکنون می بینید مشابه خروجی انتهای بخش قبلی خواهد بود، اما انجام آن بسیار ساده تر بود. تنها چیزی که نیاز داشتید یک خط کد و یک رشته طرح بندی بود. تابع Format بقیه کارها را برای شما انجام می دهد.

بسته به تاریخ یا زمانی که نمایش می‌دهید، استفاده از قالبی با طول متغیر مانند فرمتی که هنگام چاپ مستقیم اعداد با آن به پایان رسید، ممکن است برای خود، کاربران یا سایر کدهایی که سعی در خواندن مقدار دارند، خواندن آن دشوار باشد. استفاده از 1 برای قالب ماه باعث می شود که مارس به صورت 3 نمایش داده شود، در حالی که اکتبر از دو کاراکتر استفاده می کند و به صورت 10 نشان داده می شود. اکنون main.go را باز کنید و با طرح بندی ساختارمندتر، یک خط اضافی به برنامه خود اضافه کنید. در این چیدمان، یک پیشوند 0 روی کامپوننت ها قرار دهید و ساعت را برای استفاده از قالب 12 ساعته به روز کنید:

projects/datetime/main.go

...

func main() {
	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.Local)
	fmt.Println("The time is", theTime)

	fmt.Println(theTime.Format("2006-1-2 15:4:5"))
	fmt.Println(theTime.Format("2006-01-02 03:04:05 pm"))
}

پس از ذخیره کد خود، دوباره برنامه را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT
2021-8-15 14:30:45
2021-08-15 02:30:45 pm

خواهید دید که با افزودن یک پیشوند 0 به اعداد در رشته طرح بندی، 8 ماه در خروجی جدید به 08 تبدیل می شود تا با چیدمان مطابقت داشته باشد. ساعت که اکنون در قالب 12 ساعته است، پیشوند 0 خود را نیز دارد. با این حال، در پایان، آنچه در خروجی مشاهده می کنید، فرمتی را که در کد می بینید منعکس می کند، بنابراین در صورت نیاز، تغییر قالب آسان تر است.

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

با استفاده از فرمت از پیش تعریف شده

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

یکی از قالب‌های موجود و اغلب مورد استفاده، فرمت تعریف‌شده در RFC 3339 است. RFC سندی است که برای تعریف نحوه عملکرد استانداردها در اینترنت استفاده می‌شود و RFC‌های دیگر می‌توانند بر روی یکدیگر ایجاد کنند. یک RFC وجود دارد که نحوه عملکرد HTTP را تعریف می کند (RFC 2616)، برای مثال، و دیگرانی که در بالای آن برای تعریف بیشتر HTTP ساخته می شوند. بنابراین، در مورد RFC 3339، RFC یک قالب استاندارد برای استفاده برای مهرهای زمانی در اینترنت تعریف می‌کند. این قالب در سراسر اینترنت شناخته شده و به خوبی پشتیبانی می شود، بنابراین شانس دیدن آن در جای دیگر زیاد است.

هر یک از قالب‌های زمانی از پیش تعریف‌شده در بسته زمانی با یک رشته const به نام قالبی که نشان می‌دهند نشان داده می‌شوند. فرمت RFC 3339 دو فرمت در دسترس دارد، یکی به نام time.RFC3339 و دیگری به نام time.RFC3339Nano. تفاوت فرمت ها در این است که نسخه time.RFC3339Nano شامل نانوثانیه در فرمت است.

اکنون فایل main.go خود را دوباره باز کنید و برنامه خود را به روز کنید تا از فرمت time.RFC3339Nano برای خروجی آن استفاده کنید:

projects/datetime/main.go

...

func main() {
	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.Local)
	fmt.Println("The time is", theTime)
	
	fmt.Println(theTime.Format(time.RFC3339Nano))
}

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

برای دیدن خروجی، برنامه خود را با go run دوباره اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT
2021-08-15T14:30:45.0000001-05:00

اگر بخواهید مقدار زمانی را به عنوان رشته در جایی ذخیره کنید، از فرمت RFC 3339 استفاده می شود. این می تواند توسط بسیاری از زبان های برنامه نویسی و برنامه های کاربردی دیگر خوانده شود، و به همان اندازه فشرده است که تاریخ و زمان می تواند در قالب رشته ای انعطاف پذیر باشد.

در این بخش، برنامه خود را به روز کردید تا از روش Format برای چاپ تاریخ و زمان استفاده کنید. استفاده از این طرح‌بندی انعطاف‌پذیر به کد شما اجازه می‌دهد شبیه به خروجی نهایی باشد. در نهایت، شما از یکی از رشته های چیدمان از پیش تعریف شده برای چاپ تاریخ و زمان با استفاده از قالبی که به خوبی پشتیبانی می شود استفاده کردید. در بخش بعدی، برنامه خود را به‌روزرسانی می‌کنید تا همان مقدار رشته را به یک مقدار time.Time تبدیل کنید که می‌توانید با آن کار کنید.

تجزیه تاریخ و زمان در رشته ها

اغلب هنگام توسعه برنامه‌ها، با تاریخ‌هایی مواجه می‌شوید که به‌عنوان مقادیر رشته‌ای نشان داده می‌شوند که باید به نحوی آن‌ها را تفسیر کنید. گاهی اوقات، شما باید قسمت تاریخ مقدار را بدانید، گاهی اوقات ممکن است نیاز به دانستن بخش زمانی داشته باشید، و برخی دیگر ممکن است به کل مقدار نیاز داشته باشید. بسته Go time علاوه بر استفاده از روش Format برای ایجاد مقادیر رشته ای از مقادیر time.Time، تابع time.Parse را برای تبدیل یک رشته به مقدار time.Time ارائه می دهد. تابع time.Parse شبیه به روش Format عمل می کند، به این صورت که طرح تاریخ و زمان مورد انتظار و همچنین مقدار رشته را به عنوان پارامتر می گیرد.

اکنون فایل main.go را در برنامه خود باز کنید و آن را به روز کنید تا از تابع time.Parse برای تجزیه یک timeString به متغیر time.Time استفاده کنید:

projects/datetime/main.go

...

func main() {
	timeString := "2021-08-15 02:30:45"
	theTime, err := time.Parse("2006-01-02 03:04:05", timeString)
	if err != nil {
		fmt.Println("Could not parse time:", err)
	}
	fmt.Println("The time is", theTime)
	
	fmt.Println(theTime.Format(time.RFC3339Nano))
}

برخلاف روش Format، متد time.Parse همچنین در صورتی که مقدار رشته ارسال شده با طرح ارائه شده به عنوان پارامتر اول مطابقت نداشته باشد، مقدار خطای احتمالی را برمی گرداند. اگر به چیدمان استفاده شده نگاه کنید، می بینید که چیدمان داده شده به time.Parse از همان 1 برای ماه، 2 برای روز ماه و غیره استفاده می کند که در متد Format استفاده می شود.

پس از ذخیره به روز رسانی های خود، می توانید برنامه به روز شده خود را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 02:30:45 +0000 UTC
2021-08-15T02:30:45Z

در این خروجی باید به چند نکته توجه کرد. یکی این که منطقه زمانی که از timeString تجزیه می‌شود از منطقه زمانی پیش‌فرض استفاده می‌کند که یک افست +0 است و به عنوان زمان جهانی هماهنگ (UTC) شناخته می‌شود. از آنجایی که نه مقدار زمان و نه چیدمان شامل منطقه زمانی نمی شود، تابع time.Parse نمی داند که با کدام منطقه زمانی مرتبط شود. اگر زمانی به آن نیاز داشتید، بسته زمانی شامل یک تابع time.ParseInLocation می‌شود تا بتوانید مکان مورد استفاده را ارائه دهید. بخش دیگری که باید به آن توجه کرد در خروجی RFC 3339 است. خروجی از طرح‌بندی نانو RFC3339 استفاده می‌کند، اما خروجی شامل هیچ نانوثانیه‌ای نمی‌شود. این به این دلیل است که تابع time.Parse هیچ نانوثانیه‌ای را تجزیه نمی‌کند، بنابراین مقدار روی پیش‌فرض 0 تنظیم می‌شود. وقتی نانوثانیه‌ها 0 هستند، فرمت time.RFC3339Nano شامل نانوثانیه‌ها در خروجی نمی‌شود.

متد time.Parse همچنین می‌تواند از هر یک از طرح‌بندی‌های زمانی از پیش تعریف‌شده ارائه شده در بسته زمان هنگام تجزیه یک مقدار رشته استفاده کند. برای مشاهده این موضوع در عمل، فایل main.go خود را باز کنید و مقدار timeString را به روز کنید تا با خروجی time.RFC3339Nano قبل از آن مطابقت داشته باشد و پارامتر time.Parse را برای مطابقت به روز کنید:

projects/datetime/main.go

...

func main() {
	timeString := "2021-08-15T14:30:45.0000001-05:00"
	theTime, err := time.Parse(time.RFC3339Nano, timeString)
	if err != nil {
		fmt.Println("Could not parse time:", err)
	}
	fmt.Println("The time is", theTime)
	
	fmt.Println(theTime.Format(time.RFC3339Nano))
}

هنگامی که کد را به روز کردید، می توانید برنامه خود را ذخیره کرده و با استفاده از go run دوباره اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT
2021-08-15T14:30:45.0000001-05:00

این بار، خروجی از روش Format نشان می دهد که time.Parse توانست هم منطقه زمانی و هم نانوثانیه های timeString را تجزیه کند.

در این بخش، از تابع time.Parse برای تجزیه یک مقدار رشته تاریخ و زمان فرمت شده دلخواه و همچنین یک طرح از پیش تعریف شده استفاده کردید. با این حال، تا کنون، با مناطق زمانی مختلفی که دیده‌اید تعاملی نداشته‌اید. مجموعه دیگری از ویژگی‌هایی که Go برای زمان ارائه می‌کند. نوع زمان، امکان تبدیل بین مناطق زمانی مختلف است، همانطور که در بخش بعدی خواهید دید.

کار با مناطق زمانی

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

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

اکنون، فایل main.go خود را باز کنید تا برنامه خود را به روز کنید تا از روش UTC در theTime برای برگرداندن نسخه UTC زمان استفاده کنید:

projects/datetime/main.go

...

func main() {
	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.Local)
	fmt.Println("The time is", theTime)
	fmt.Println(theTime.Format(time.RFC3339Nano))
	
	utcTime := theTime.UTC()
	fmt.Println("The UTC time is", utcTime)
	fmt.Println(utcTime.Format(time.RFC3339Nano))
}

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

برای دیدن خروجی برنامه، می توانید آن را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT
2021-08-15T14:30:45.0000001-05:00
The UTC time is 2021-08-15 19:30:45.0000001 +0000 UTC
2021-08-15T19:30:45.0000001Z

خروجی شما بسته به منطقه زمانی محلی شما متفاوت خواهد بود، اما در خروجی بالا، خواهید دید که اولین باری که چاپ می شود در CDT (زمان نوری مرکزی آمریکای شمالی) است که 5- ساعت از UTC فاصله دارد. هنگامی که متد UTC فراخوانی شد و زمان UTC چاپ شد، می توانید ببینید که ساعت در زمان از 14 به 19 می رسد، زیرا تبدیل زمان به UTC پنج ساعت اضافه می کند.

همچنین می‌توان یک زمان UTC را به زمان محلی با استفاده از روش محلی در یک زمان. زمان به همان روش تبدیل کرد. فایل main.go خود را دوباره باز کنید و آن را به روز کنید تا یک تماس به روش محلی در utcTime اضافه کنید تا آن را به منطقه زمانی محلی خود تبدیل کنید:

projects/datetime/main.go

...

func main() {
	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.Local)
	fmt.Println("The time is", theTime)
	fmt.Println(theTime.Format(time.RFC3339Nano))
	
	utcTime := theTime.UTC()
	fmt.Println("The UTC time is", utcTime)
	fmt.Println(utcTime.Format(time.RFC3339Nano))

	localTime := utcTime.Local()
	fmt.Println("The Local time is", localTime)
	fmt.Println(localTime.Format(time.RFC3339Nano))
}

هنگامی که فایل شما ذخیره شد، برنامه خود را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 -0500 CDT
2021-08-15T14:30:45.0000001-05:00
The UTC time is 2021-08-15 19:30:45.0000001 +0000 UTC
2021-08-15T19:30:45.0000001Z
The Local time is 2021-08-15 14:30:45.0000001 -0500 CDT
2021-08-15T14:30:45.0000001-05:00

خواهید دید که زمان UTC دوباره به منطقه زمانی محلی شما تبدیل شده است. در خروجی بالا، تبدیل UTC به CDT به این معنی است که پنج ساعت از UTC کم شده است و ساعت را از 19 به 14 تغییر می دهد.

در این بخش، شما برنامه خود را برای تبدیل تاریخ و زمان بین منطقه زمانی محلی خود و منطقه زمانی استاندارد UTC با استفاده از روش UTC به روز کردید، سپس دوباره با استفاده از روش محلی برگشتید.

هنگامی که مقادیر تاریخ و زمان خود را در دسترس قرار دادید، تعدادی ویژگی اضافی وجود دارد که بسته Go time ارائه می دهد که می تواند در برنامه های شما مفید باشد. یکی از این ویژگی ها تعیین این است که آیا زمان معین قبل یا بعد از دیگری است.

مقایسه دو بار

مقایسه دو تاریخ با یکدیگر، به دلیل همه متغیرهایی که باید در هنگام مقایسه آنها در نظر گرفته شوند، گاهی اوقات به طرز فریبنده ای دشوار است. به عنوان مثال، نیاز به در نظر گرفتن مناطق زمانی، یا این واقعیت که ماه ها تعداد روزهای متفاوتی از یکدیگر دارند. بسته زمان چند روش را برای آسان تر کردن این کار ارائه می دهد.

بسته زمان دو روش برای آسان‌تر کردن این مقایسه‌ها ارائه می‌کند: روش‌های قبل و بعد، که در نوع time.Time در دسترس هستند. این روش‌ها هر دو یک مقدار زمانی واحد را می‌پذیرند و بسته به اینکه زمانی که فراخوانی می‌شوند قبل یا بعد از زمان ارائه شده باشد، true یا false را برمی‌گردانند.

برای مشاهده نمونه ای از این توابع در عمل، فایل main.go خود را باز کنید و آن را به روز کنید تا شامل دو تاریخ مختلف باشد، سپس از قبل و بعد برای مقایسه آن تاریخ ها برای دیدن خروجی استفاده کنید:

projects/datetime/main.go

...

func main() {
	firstTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.UTC)
	fmt.Println("The first time is", firstTime)

	secondTime := time.Date(2021, 12, 25, 16, 40, 55, 200, time.UTC)
	fmt.Println("The second time is", secondTime)

	fmt.Println("First time before second?", firstTime.Before(secondTime))
	fmt.Println("First time after second?", firstTime.After(secondTime))

	fmt.Println("Second time before first?", secondTime.Before(firstTime))
	fmt.Println("Second time after first?", secondTime.After(firstTime))
}

هنگامی که فایل خود را به روز کردید، آن را ذخیره کرده و با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The first time is 2021-08-15 14:30:45.0000001 +0000 UTC
The second time is 2021-12-25 16:40:55.0000002 +0000 UTC
First time before second? true
First time after second? false
Second time before first? false
Second time after first? true

از آنجایی که کد از تاریخ های صریح در منطقه زمانی UTC استفاده می کند، خروجی شما باید با خروجی بالا مطابقت داشته باشد. خواهید دید که هنگام استفاده از روش Before در firstTime و ارائه آن secondTime برای مقایسه، این درست است که 2021-08-15 قبل از 2021-12-25 است. هنگام استفاده از روش After از firstTime و ارائه secondTime، اشتباه است که 2021-08-15 بعد از 2021-12-25 باشد. تغییر ترتیب فراخوانی متدها در secondTime، همانطور که انتظار می رود، نتایج مخالف را نشان می دهد.

روش دیگر برای مقایسه دو تاریخ و زمان با بسته زمانی، روش Sub است. متد Sub یک تاریخ را از تاریخ دیگر کم می کند و با استفاده از نوع جدیدی به نام time.Duration مقداری را برمی گرداند. بر خلاف یک مقدار time.Time، که یک نقطه مطلق در زمان را نشان می دهد، یک مقدار time.Duration نشان دهنده تفاوت در زمان است. به عنوان مثال، “در یک ساعت” مدت زمان خواهد بود زیرا به معنای چیزی متفاوت بر اساس زمان فعلی روز است، اما “در ظهر” یک زمان خاص و مطلق را نشان می دهد. Go از زمان استفاده می‌کند. نوع مدت زمان در تعدادی مکان، مانند زمانی که می‌خواهید مشخص کنید که یک تابع چه مدت باید قبل از بازگشت خطا منتظر بماند یا در اینجا، جایی که باید بدانید بین یک زمان و زمان دیگر چقدر زمان وجود دارد، استفاده می‌کند.

اکنون فایل main.go خود را به روز کنید تا از روش Sub در مقادیر firstTime و secondTime استفاده کنید و نتایج را چاپ کنید:

projects/datetime/main.go

...

func main() {
	firstTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.UTC)
	fmt.Println("The first time is", firstTime)

	secondTime := time.Date(2021, 12, 25, 16, 40, 55, 200, time.UTC)
	fmt.Println("The second time is", secondTime)

	fmt.Println("Duration between first and second time is", firstTime.Sub(secondTime))
	fmt.Println("Duration between second and first time is", secondTime.Sub(firstTime))

فایل خود را ذخیره کنید و سپس با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The first time is 2021-08-15 14:30:45.0000001 +0000 UTC
The second time is 2021-12-25 16:40:55.0000002 +0000 UTC
Duration between first and second time is -3170h10m10.0000001s
Duration between second and first time is 3170h10m10.0000001s

خروجی بالا می گوید 3170 ساعت، 10 دقیقه، 10 ثانیه و 100 نانوثانیه بین این دو تاریخ وجود دارد و چند نکته در مورد خروجی وجود دارد. اولین مورد این است که مدت زمان بین بار اول و دوم یک مقدار منفی است. این می‌گوید که زمان دوم بعد از زمان اول است و شبیه به زمانی خواهد بود که 5 را از 0 کم کنید و 5- را دریافت کنید. دومین موردی که باید به آن توجه کرد این است که بزرگترین واحد اندازه گیری مدت زمان یک ساعت است، بنابراین آن را به روز یا ماه تقسیم نمی کند. از آنجایی که تعداد روزهای یک ماه یکسان نیست و یک “روز” می تواند در طول سوئیچ برای ساعت تابستانی معنای متفاوتی داشته باشد، یک ساعت دقیق ترین اندازه گیری است که نوسان ندارد.

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

اضافه یا تفریق زمان

هنگام نوشتن یک برنامه، یک عملیات رایج با استفاده از تاریخ و زمان، تعیین زمان گذشته یا آینده بر اساس زمان دیگر است. می‌توان از آن برای عملکرد استفاده کرد، مانند تعیین زمان تمدید اشتراک بعدی، یا اینکه مدت زمان مشخصی از بررسی مقداری گذشته است. در هر صورت، بسته Go time راهی برای مدیریت آن ارائه می دهد. برای پیدا کردن تاریخ دیگری بر اساس تاریخی که قبلاً می‌دانید، باید بتوانید زمان خود را تعیین کنید. مقادیر مدت زمان.

ایجاد یک مقدار time.Duration شبیه نحوه نوشتن مدت زمان روی کاغذ است، فقط با ضرب واحد زمان. به عنوان مثال، برای ایجاد زمان. مدت زمان برای نشان دادن یک ساعت، باید آن را با استفاده از مقدار time.Hour ضرب در تعداد ساعت‌هایی که می‌خواهید زمان را نشان دهید، تعریف کنید.

oneHour := 1 * time.Hour
twoHours := 2 * time.Hour
tenHours := 10 * time.Hour

اعلان واحدهای زمانی کوچکتر به روشی مشابه انجام می شود، به جز استفاده از time.minute، time.second و غیره:

tenMinutes := 10 * time.Minute
fiveSeconds := 5 * time.Second

همچنین می توان یک مدت زمان را به مدت زمان دیگر اضافه کرد تا مجموع مدت زمان ها بدست آید. برای اینکه این را در عمل ببینید، فایل main.go خود را باز کنید و آن را به روز کنید تا یک متغیر toAdd duration را اعلام کنید و مدت زمان های مختلف را به آن اضافه کنید:

projects/datetime/main.go

...

func main() {
	toAdd := 1 * time.Hour
	fmt.Println("1:", toAdd)

	toAdd += 1 * time.Minute
	fmt.Println("2:", toAdd)

	toAdd += 1 * time.Second
	fmt.Println("3:", toAdd)
}

پس از اتمام به روز رسانی، فایل را ذخیره کنید و برنامه خود را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

1: 1h0m0s
2: 1h1m0s
3: 1h1m1s

هنگامی که به خروجی نگاه می کنید، خواهید دید که اولین مدت چاپ یک ساعت است که مطابق با زمان 1 * ساعت در کد شما است. در مرحله بعد، 1 * time.Minute را به مقدار toAdd اضافه کردید، که به عنوان مقدار یک ساعت، یک دقیقه نشان داده می شود. در نهایت، 1 * time.Second را به toAdd اضافه کردید، که منجر به مقدار زمان. مدت زمان یک ساعت، یک دقیقه و یک ثانیه شد.

همچنین می توان با اضافه کردن مدت زمان ها در یک عبارت، یا کم کردن مدت زمان از دیگری را ترکیب کرد:

oneHourOneMinute := 1 * time.Hour + 1 * time.Minute
tenMinutes := 1 * time.Hour - 50 * time.Minute

بعد، فایل main.go خود را باز کنید و برنامه خود را به روز کنید تا از ترکیبی مانند این برای کم کردن یک دقیقه و یک ثانیه از toAdd استفاده کنید:

projects/datetime/main.go

...

func main() {
	
	...
	
	toAdd += 1 * time.Second
	fmt.Println("3:", toAdd)
	
	toAdd -= 1*time.Minute + 1*time.Second
	fmt.Println("4:", toAdd)
}

پس از ذخیره کد خود، می توانید برنامه را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

1: 1h0m0s
2: 1h1m0s
3: 1h1m1s
4: 1h0m0s

خط چهارم جدید اضافه شده به خروجی کد جدیدی را که برای تفریق مجموع 1 * time.Minute و 1 * time اضافه کرده اید نشان می دهد.

استفاده از این مدت زمان‌ها که با متد Add of the time.Time جفت شده‌اند، به شما این امکان را می‌دهد که یک مقدار زمانی را که قبلاً دارید انتخاب کنید و زمان را در نقطه دلخواه دیگری قبل یا بعد از آن زمان تعیین کنید. برای مشاهده نمونه ای از این در حال اجرا، فایل main.go خود را باز کنید و آن را به روز کنید تا مقدار toAdd را روی 24 ساعت یا 24 * time.Hour تنظیم کنید. سپس، از روش افزودن روی مقدار time.Time استفاده کنید تا ببینید 24 ساعت پس از آن نقطه چه زمانی خواهد بود:

projects/datetime/main.go

...

func main() {
	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.UTC)
	fmt.Println("The time is", theTime)

	toAdd := 24 * time.Hour
	fmt.Println("Adding", toAdd)

	newTime := theTime.Add(toAdd)
	fmt.Println("The new time is", newTime)
}

پس از ذخیره فایل خود، برنامه خود را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 +0000 UTC
Adding 24h0m0s
The new time is 2021-08-16 14:30:45.0000001 +0000 UTC

با نگاهی به خروجی، خواهید دید که افزودن 24 ساعت به 2021-08-15 منجر به تاریخ جدید 2021-08-16 می شود.

برای کم کردن زمان، از روش افزودن نیز استفاده می‌کنید که کمی غیرمعمول است. از آنجایی که از روش Sub برای بدست آوردن اختلاف زمان بین دو تاریخ استفاده می شود، با استفاده از Add با مقدار منفی، زمان را از مقدار time.Time کم می کنید.

یک بار دیگر، برای مشاهده این مورد در برنامه خود، فایل main.go خود را باز کرده و آن را به روز کنید تا مقدار 24 ساعته toAdd را به مقدار منفی تغییر دهید:

projects/datetime/main.go

...

func main() {
	theTime := time.Date(2021, 8, 15, 14, 30, 45, 100, time.UTC)
	fmt.Println("The time is", theTime)

	toAdd := -24 * time.Hour
	fmt.Println("Adding", toAdd)

	newTime := theTime.Add(toAdd)
	fmt.Println("The new time is", newTime)
}

پس از ذخیره فایل خود، یک بار دیگر برنامه خود را با استفاده از go run اجرا کنید:

go run main.go

خروجی شبیه به این خواهد بود:

 

Output

The time is 2021-08-15 14:30:45.0000001 +0000 UTC
Adding -24h0m0s
The new time is 2021-08-14 14:30:45.0000001 +0000 UTC

این بار در خروجی خواهید دید که به جای اضافه کردن 24 ساعت به زمان اصلی، تاریخ جدید 24 ساعت قبل از زمان اصلی است.

در این بخش از time.Hour، time.Minute و time.Second برای ایجاد مقادیر time.Duration در درجات مختلف استفاده کردید. شما همچنین از مقادیر time.Duration با متد Add استفاده کردید تا یک مقدار time.Time جدید قبل و بعد از مقدار اصلی بدست آورید. با ترکیب زمان. اکنون، روش افزودن، و روش های قبل یا بعد، به عملکرد قدرتمند تاریخ و زمان برای برنامه های خود دسترسی خواهید داشت.

نتیجه

در این آموزش، شما از time.Now برای بازیابی یک مقدار time.Time برای زمان محلی فعلی در رایانه خود استفاده کردید، سپس از سال، ماه، ساعت و روش های دیگر برای دسترسی به اطلاعات خاصی در مورد آن زمان استفاده کردید. سپس، از روش Format برای چاپ زمان با استفاده از یک قالب سفارشی و یک قالب از پیش تعریف شده استفاده کردید. در مرحله بعد، از تابع time.Parse برای تفسیر مقدار رشته با زمان در آن و استخراج مقدار زمان از آن استفاده کردید. هنگامی که مقدار زمان را داشتید، از روش های UTC و Local برای ترجمه زمان بین UTC و منطقه زمانی محلی خود استفاده کردید. پس از آن، قبل از استفاده از روش افزودن برای یافتن زمان نسبت به مقدار زمانی متفاوت، از روش Sub برای بدست آوردن مدت زمان بین دو زمان مختلف استفاده کردید.

استفاده از توابع و روش‌های مختلفی که در این آموزش توضیح داده شده است، کمک زیادی به برنامه‌های شما می‌کند، اما بسته Go time در صورت علاقه، تعدادی ویژگی دیگر را نیز شامل می‌شود.

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:VPS یا سرور مجازیآموزش برنامه GOاتصال به سرور مجازی ویندوزبرنامه Goخرید سرور مجازیراه اندازی اولیه سرورسرور مجازیسفارشی کردن رشته های تاریخ

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه راه اندازی پلتفرم Eclipse Theia Cloud IDE در vpsgol Kubernetes

ورود به سایت

معرفی

با حرکت ابزارهای توسعه‌دهنده به سمت ابر، ایجاد و پذیرش پلت‌فرم‌های Cloud IDE (محیط توسعه یکپارچه) در حال رشد است. Cloud IDE ها از هر نوع دستگاه مدرن از طریق مرورگرهای وب قابل دسترسی هستند و مزایای متعددی را برای سناریوهای همکاری بلادرنگ ارائه می دهند. کار در یک IDE ابری یک محیط توسعه و آزمایش یکپارچه را برای شما و تیمتان فراهم می کند، در حالی که ناسازگاری های پلت فرم را به حداقل می رساند. از آنجایی که آنها به طور بومی مبتنی بر فناوری‌های ابری هستند، می‌توانند از خوشه برای دستیابی به وظایفی استفاده کنند که می‌تواند تا حد زیادی از قدرت و قابلیت اطمینان یک کامپیوتر توسعه‌دهنده فراتر رود.

Eclipse Theia یک IDE ابری توسعه پذیر است که روی یک سرور راه دور اجرا می شود و از یک مرورگر وب قابل دسترسی است. از نظر بصری، به گونه‌ای طراحی شده است که شبیه به Microsoft Visual Studio Code به نظر برسد و رفتاری مشابه داشته باشد، به این معنی که از بسیاری از زبان‌های برنامه‌نویسی پشتیبانی می‌کند، طرح‌بندی انعطاف‌پذیری دارد و ترمینال یکپارچه دارد. آنچه Eclipse Theia را از سایر نرم افزارهای Cloud IDE جدا می کند، توسعه پذیری آن است. می توان آن را با استفاده از پسوندهای سفارشی تغییر داد، که به شما امکان می دهد یک IDE ابری متناسب با نیازهای خود ایجاد کنید.

در این آموزش، شما نسخه پیش‌فرض پلت‌فرم Eclipse Theia ابری IDE را در خوشه vpsgol Kubernetes خود راه‌اندازی می‌کنید و آن را در دامنه خود، با گواهی‌های Let’s Encrypt ایمن می‌کنید و از بازدیدکننده برای احراز هویت می‌خواهد. در پایان، Eclipse Theia را خواهید داشت که روی خوشه Kubernetes شما از طریق HTTPS در دسترس است و بازدیدکننده را ملزم به ورود به سیستم می‌کند.

پیش نیازها

  • یک خوشه vpsgol Kubernetes با اتصال شما به عنوان پیش فرض kubectl پیکربندی شده است. دستورالعمل های مربوط به نحوه پیکربندی kubectl در مرحله اتصال به خوشه خود هنگام ایجاد خوشه نشان داده می شود.
  • مدیریت بسته Helm 3 بر روی دستگاه محلی شما نصب شده است.
  • Nginx Ingress Controller با استفاده از Helm برای استفاده از ExternalDNS با منابع Ingress بر روی خوشه شما نصب شده است.
  • یک نام دامنه کاملاً ثبت شده این آموزش از theia.your_domain در سرتاسر استفاده خواهد کرد. می توانید یک نام دامنه را در Namecheap خریداری کنید، یک نام دامنه را به صورت رایگان در Freenom دریافت کنید، یا از ثبت کننده دامنه انتخابی خود استفاده کنید.

مرحله 1 – نصب و نمایش Eclipse Theia

برای شروع، Eclipse Theia را در خوشه vpsgol Kubernetes خود نصب خواهید کرد. سپس با استفاده از Nginx Ingress آن را در دامنه مورد نظر خود در معرض دید قرار خواهید داد.

از آنجایی که شما دو نمونه استقرار و یک منبع را به عنوان بخشی از پیش نیازها ایجاد کردید، می توانید آزادانه آنها را با اجرای دستورات زیر حذف کنید:

kubectl delete -f hello-kubernetes-ingress.yaml

kubectl delete -f hello-kubernetes-first.yaml

kubectl delete -f hello-kubernetes-second.yaml

برای این آموزش، پیکربندی استقرار را در دستگاه محلی خود در فایلی به نام eclipse-theia.yaml ذخیره خواهید کرد. با استفاده از دستور زیر آن را ایجاد کنید:

nano eclipse-theia.yaml

خطوط زیر را به فایل اضافه کنید:

eclipse-theia.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: theia
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: theia-next
  namespace: theia
spec:
  ingressClassName: nginx
  rules:
  - host: theia.your_domain
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: theia-next
            port:
              number: 80
---
apiVersion: v1
kind: Service
metadata:
 name: theia-next
 namespace: theia
spec:
 ports:
 - port: 80
   targetPort: 3000
 selector:
   app: theia-next
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: theia-next
  name: theia-next
  namespace: theia
spec:
  selector:
    matchLabels:
      app: theia-next
  replicas: 1
  template:
    metadata:
      labels:
        app: theia-next
    spec:
      containers:
      - image: francoisvans/theia-docker-test
        imagePullPolicy: Always
        name: theia-next
        ports:
        - containerPort: 3000

این پیکربندی یک فضای نام، یک استقرار، یک سرویس و یک ورودی را تعریف می کند. فضای نام تیا نامیده می شود و شامل تمام اشیای Kubernetes مربوط به Eclipse Theia است که از بقیه خوشه جدا شده اند. استقرار شامل یک نمونه از تصویر Theia Docker است که پورت 3000 روی کانتینر قرار دارد. این سرویس به دنبال Deployment می‌گردد و پورت کانتینر را به پورت HTTP معمولی 80 تغییر می‌دهد و به Eclipse Theia اجازه دسترسی درون خوشه‌ای را می‌دهد.

Ingress حاوی قانونی برای ارائه سرویس در پورت 80 به صورت خارجی در دامنه مورد نظر شما است. در حاشیه نویسی آن، شما مشخص می کنید که Nginx Ingress Controller باید برای پردازش درخواست استفاده شود. به یاد داشته باشید که دامنه مورد نظر خود را که به Load Balancer کلاستر خود اشاره کرده اید جایگزین theia.your_domain کنید، سپس فایل را ذخیره کرده و ببندید.

فایل را ذخیره کرده و از آن خارج شوید.

سپس با اجرای دستور زیر پیکربندی را در Kubernetes ایجاد کنید:

kubectl apply -f eclipse-theia.yaml

خروجی شبیه به این خواهد بود:

 

Output

namespace/theia created
ingress.networking.k8s.io/theia-next created
service/theia-next created
deployment.apps/theia-next created

می‌توانید با اجرای زیر، ایجاد غلاف Eclipse Theia را تماشا کنید:

kubectl get pods -w -n theia

خروجی به شکل زیر خواهد بود:

 

Output

NAME                          READY   STATUS    RESTARTS   AGE
theia-next-6f6b98dd4f-qknhb   1/1     Running   0          2m30s

پس از مدتی، وضعیت به RUNNING تبدیل می‌شود، به این معنی که Eclipse Theia را با موفقیت در کلاستر خود نصب کرده‌اید.

در مرورگر خود به دامنه خود بروید. رابط کاربری گرافیکی ویرایشگر Eclipse Theia پیش‌فرض را خواهید دید:

 

شما Eclipse Theia را در خوشه vpsgol Kubernetes خود مستقر کرده اید و با یک Ingress آن را در دامنه مورد نظر خود قرار داده اید. در مرحله بعد، با فعال کردن احراز هویت ورود، دسترسی به استقرار Eclipse Theia خود را ایمن خواهید کرد.

مرحله 2 – فعال کردن احراز هویت ورود به سیستم برای دامنه شما

در این مرحله، احراز هویت نام کاربری و رمز عبور را برای استقرار Eclipse Theia خود فعال می‌کنید. ابتدا با تنظیم لیستی از ترکیبات ورود معتبر با استفاده از ابزار htpasswd به این مهم دست خواهید یافت. سپس، یک راز Kubernetes حاوی آن لیست ایجاد می‌کنید و Ingress را برای احراز هویت بازدیدکنندگان بر اساس آن پیکربندی می‌کنید. در پایان، دامنه شما تنها زمانی قابل دسترسی خواهد بود که بازدیدکننده یک ترکیب نام کاربری و رمز عبور معتبر وارد کند. این امر از دسترسی مهمانان و سایر بازدیدکنندگان ناخواسته به Eclipse Theia جلوگیری می کند.

ابزار htpasswd از وب سرور آپاچی می آید و برای ایجاد فایل هایی استفاده می شود که لیست هایی از ترکیبات ورود را ذخیره می کنند. فرمت فایل‌های htpasswd یک نام کاربری: ترکیب hashed_password در هر خط است، که فرمتی است که Nginx Ingress Controller انتظار دارد لیست با آن مطابقت داشته باشد.

ابتدا حافظه پنهان بسته منیجر را به روز کنید:

sudo apt update

سپس htpasswd را با اجرای دستور زیر بر روی سیستم خود نصب کنید:

sudo apt install apache2-utils -y

شما لیست را در فایلی به نام auth ذخیره خواهید کرد. آن را با اجرا ایجاد کنید:

touch auth

این فایل باید auth نامیده شود زیرا کنترلر ورودی Nginx انتظار دارد که رمز حاوی کلیدی به نام data.auth باشد. اگر از دست رفته باشد، کنترل‌کننده وضعیت HTTP 503 Service Unavailable را برمی‌گرداند.

با اجرای دستور زیر یک ترکیب نام کاربری و رمز عبور به aut اضافه کنید:

htpasswd auth username

به یاد داشته باشید که نام کاربری مورد نظر خود را جایگزین نام کاربری کنید. از شما یک رمز عبور درخواست می شود و این ترکیب به فایل auth اضافه می شود. می توانید این دستور را برای هر تعداد کاربر که می خواهید اضافه کنید تکرار کنید.

پس از اتمام کار، با اجرای دستور زیر یک راز جدید در Kubernetes با محتویات فایل ایجاد کنید:

kubectl create secret generic theia-basic-auth –from-file=auth -n theia

شما می توانید راز را با:

kubectl get secret theia-basic-auth -o yaml -n theia

خروجی به صورت زیر خواهد بود:

 

Output

apiVersion: v1
data:
  auth: ...
kind: Secret
metadata:
  creationTimestamp: "2021-12-31T17:16:29Z"
  name: theia-basic-auth
  namespace: theia
  resourceVersion: "32437"
  uid: 47461e23-e281-411b-acfd-cea82fcde41b
type: Opaque

در مرحله بعد، باید Ingress را ویرایش کنید تا از راز استفاده کند. پیکربندی استقرار را برای ویرایش باز کنید:

nano eclipse-theia.yaml

خطوط هایلایت شده را به فایل خود اضافه کنید:

eclipse-theia.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: theia
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: theia-next
  namespace: theia
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: theia-basic-auth
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - Eclipse Theia'
spec:
  ingressClassName: nginx
  rules:
  - host: theia.your_domain
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: theia-next
            port:
              number: 80
...

ابتدا در حاشیه نویسی auth-type مشخص می کنید که نوع احراز هویت اولیه است. این بدان معنی است که Nginx از کاربر می خواهد که نام کاربری و رمز عبور را وارد کند. سپس، در auth-secret، مشخص می‌کنید که راز حاوی لیست ترکیبات معتبر theia-basic-auth است که به تازگی ایجاد کرده‌اید. حاشیه نویسی قلمرو اعتبار باقی مانده پیامی را مشخص می کند که به عنوان توضیحی در مورد اینکه چرا احراز هویت لازم است به کاربر نشان داده می شود. می توانید پیام موجود در این قسمت را به دلخواه تغییر دهید.

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

برای انتشار تغییرات در کلاستر خود، دستور زیر را اجرا کنید:

kubectl apply -f eclipse-theia.yaml

خروجی را خواهید دید:

 

Output

namespace/theia unchanged
ingress.networking.k8s.io/theia-next configured
service/theia-next unchanged
deployment.apps/theia-next unchanged

در مرورگر خود به دامنه خود بروید، جایی که اکنون از شما خواسته می شود وارد شوید.

شما احراز هویت اولیه ورود به سیستم را در Ingress خود با پیکربندی آن برای استفاده از رمز حاوی ترکیب نام کاربری و رمز عبور هش شده فعال کرده اید. در مرحله بعدی، با افزودن گواهی‌های TLS، دسترسی بیشتری را ایمن می‌کنید تا ترافیک بین شما و استقرار Eclipse Theia رمزگذاری شده باقی بماند.

مرحله 3 – اعمال مجوزهای HTTPS Let’s Encrypt

در مرحله بعد، نصب Eclipse Theia خود را با اعمال گواهینامه های Let’s Encrypt در Ingress خود، که Cert-Manager به طور خودکار ارائه می کند، ایمن می کنید. پس از تکمیل این مرحله، نصب Eclipse Theia شما از طریق HTTPS قابل دسترسی خواهد بود.

برای ویرایش eclipse-theia.yaml را باز کنید:

nano eclipse-theia.yaml

خطوط هایلایت شده را به فایل خود اضافه کنید، مطمئن شوید که دامنه جای جای خود را جایگزین کنید:

eclipse-theia.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: theia
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: theia-next
  namespace: theia
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: theia-basic-auth
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - Eclipse Theia'
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
  - hosts:
    - theia.your_domain
    secretName: theia-prod
  ingressClassName: nginx
  rules:
  - host: theia.your_domain
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: theia-next
            port:
              number: 80
...

ابتدا، letsencrypt-prod ClusterIssuer را که ایجاد کرده اید به عنوان بخشی از پیش نیازها به عنوان صادرکننده مشخص می کنید که برای ارائه گواهینامه برای این ورود استفاده می شود. سپس، در بخش tls، دامنه دقیقی را که باید ایمن شود، و همچنین نامی برای رازی که این گواهینامه ها را نگه می دارد، مشخص می کنید.

فایل را ذخیره کرده و از آن خارج شوید.

با اجرای دستور زیر تغییرات را در کلاستر خود اعمال کنید:

kubectl apply -f eclipse-theia.yaml

خروجی به صورت زیر خواهد بود:

 

Output

namespace/theia unchanged
ingress.networking.k8s.io/theia-next configured
service/theia-next unchanged
deployment.apps/theia-next unchanged

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

kubectl describe certificate theia-prod -n theia

وقتی تمام شد، انتهای خروجی شبیه به این خواهد بود:

 

Output

...
Events:
  Type    Reason        Age   From          Message
  ----    ------        ----  ----          -------
  Normal  GeneratedKey  42m   cert-manager  Generated a new private key
  Normal  Requested     42m   cert-manager  Created new CertificateRequest resource "theia-prod-3785736528"
  Normal  Issued        42m   cert-manager  Certificate issued successfully

دامنه خود را در مرورگر خود به روز کنید. قفل سبز رنگی را در سمت چپ نوار آدرس مشاهده خواهید کرد که به معنای ایمن بودن اتصال است.

شما Ingress را برای استفاده از گواهی‌های Let’s Encrypt پیکربندی کرده‌اید، بنابراین استقرار Eclipse Theia را ایمن‌تر می‌کنید. اکنون می توانید رابط کاربری پیش فرض Eclipse Theia را بررسی کنید.

مرحله 4 – استفاده از رابط Eclipse Theia

در این بخش، برخی از ویژگی های رابط Eclipse Theia را بررسی خواهید کرد.

در سمت چپ IDE، یک ردیف عمودی از چهار دکمه وجود دارد که متداول‌ترین ویژگی‌های مورد استفاده را در یک پانل کناری باز می‌کند.

این نوار قابل تنظیم است، بنابراین می توانید این نماها را به ترتیب دیگری منتقل کنید یا آنها را از نوار حذف کنید. به طور پیش فرض، اولین نمای پانل Explorer را باز می کند که ناوبری درخت مانند ساختار پروژه را ارائه می دهد. می‌توانید پوشه‌ها و فایل‌های خود را در اینجا مدیریت کنید—در صورت لزوم آنها را ایجاد، حذف، جابجا کنید و نام آنها را تغییر دهید.

پس از ایجاد یک فایل جدید از طریق منوی File، یک فایل خالی را خواهید دید که در یک تب جدید باز می شود. پس از ذخیره، می توانید نام فایل را در پانل کناری Explorer مشاهده کنید. برای ایجاد پوشه، روی نوار کناری Explorer راست کلیک کرده و روی New Folder کلیک کنید. می‌توانید یک پوشه را با کلیک کردن روی نام آن و همچنین کشیدن و رها کردن فایل‌ها و پوشه‌ها به قسمت‌های بالای سلسله مراتب گسترش دهید تا آنها را به مکان جدیدی منتقل کنید.

گزینه بعدی دسترسی به قابلیت جستجو و جایگزینی را فراهم می کند. به دنبال آن، مورد بعدی نمایی از سیستم های کنترل منبعی را که ممکن است از آنها استفاده می کنید، مانند Git ارائه می دهد.

نمای بعدی گزینه debugger است که تمام اقدامات رایج برای رفع اشکال در پنل را ارائه می دهد. می توانید پیکربندی های اشکال زدایی را در فایل launch.json ذخیره کنید.

گزینه نهایی به شما امکان می دهد برنامه های افزودنی را مشاهده و نصب کنید:

بخش مرکزی رابط کاربری گرافیکی ویرایشگر شما است که می توانید آن را با برگه هایی برای ویرایش کد خود جدا کنید. می توانید نمای ویرایش خود را به یک سیستم شبکه ای یا به فایل های کنار هم تغییر دهید. مانند همه IDE های مدرن، Eclipse Theia از برجسته سازی نحو برای کد شما پشتیبانی می کند.

بخش مرکزی رابط کاربری گرافیکی ویرایشگر شما است که می توانید آن را با برگه هایی برای ویرایش کد خود جدا کنید. می توانید نمای ویرایش خود را به یک سیستم شبکه ای یا به فایل های کنار هم تغییر دهید. مانند همه IDE های مدرن، Eclipse Theia از برجسته سازی نحو برای کد شما پشتیبانی می کند.

اگر می خواهید استقرار Eclipse Theia را در کلاستر خود از بین ببرید، دستور زیر را اجرا کنید:

kubectl delete -f eclipse-theia.yaml

شما یک نمای کلی سطح بالا از رابط Eclipse Theia را بررسی کرده اید و برخی از متداول ترین ویژگی های مورد استفاده را مرور کرده اید.

نتیجه

اکنون Eclipse Theia، یک IDE ابری همه کاره، را روی خوشه vpsgol Kubernetes خود نصب کرده اید. شما آن را با یک گواهی رایگان Let’s Encrypt TLS ایمن کرده اید و نمونه ای را برای نیاز به ورود از بازدیدکننده تنظیم کرده اید. می توانید روی کد منبع و اسناد خود به صورت جداگانه کار کنید یا با تیم خود همکاری کنید.

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:ایجاد سرور مجازیخرید سرور مجازیخرید سرور مجازی فرانسهراه اندازی سرور مجازیسرور مجازینحوه راه اندازی پلتفرم Eclipse Theia Cloud IDEنصب Eclipse Theia

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه ایجاد یک سرور Minecraft در اوبونتو 18.04

ورود به سایت

معرفی

Minecraft یک بازی ویدیویی محبوب sandbox است. این برنامه که در ابتدا در سال 2009 منتشر شد، به بازیکنان اجازه می‌دهد در دنیایی سه بعدی بسازند، بسازند، بسازند و زنده بمانند. از اوایل سال 2022، این بازی پرفروش ترین بازی ویدیویی تمام دوران بود. در این آموزش شما سرور Minecraft خود را ایجاد می کنید تا شما و دوستانتان با هم بازی کنید. به طور خاص، شما بسته های نرم افزاری لازم را برای اجرای Minecraft نصب می کنید، سرور را برای اجرا پیکربندی می کنید و سپس بازی را اجرا می کنید.

متناوبا، می‌توانید سرور DigitalOcean’s One-Click Minecraft: Java Edition را به‌عنوان مسیر نصب دیگری بررسی کنید.

پیش نیازها

برای پیروی از این راهنما، شما نیاز دارید:

  • یک سرور با نصب جدید اوبونتو 18.04، یک کاربر غیر ریشه با امتیازات sudo و SSH فعال. شما می توانید این راهنما را برای مقداردهی اولیه سرور خود دنبال کنید و این مراحل را کامل کنید. Minecraft می تواند منابع فشرده ای داشته باشد، بنابراین هنگام انتخاب اندازه سرور خود این را در نظر داشته باشید. اگر از DigitalOcean استفاده می کنید و به منابع بیشتری نیاز دارید، همیشه می توانید اندازه Droplet خود را تغییر دهید تا CPU و RAM بیشتری اضافه کنید.
  • یک کپی از Minecraft Java Edition که روی یک دستگاه Mac، Windows یا Linux محلی نصب شده است.

مرحله 1 – بسته های نرم افزاری لازم را نصب کرده و فایروال را پیکربندی کنید

با شروع اولیه سرور، اولین قدم شما نصب جاوا است. برای اجرای Minecraft به آن نیاز دارید. به طور پیش‌فرض، اوبونتو 18.04 نسخه جدید جاوا را برای اجرای جدیدترین نسخه‌های Minecraft ارائه نمی‌کند. خوشبختانه، نگهبانان شخص ثالثی وجود دارند که به ساخت بسته‌های جاوای جدیدتر برای نسخه‌های قدیمی‌تر اوبونتو ادامه می‌دهند و می‌توانید با افزودن PPA یا آرشیو بسته‌های شخصی آن‌ها به فهرست منابع بسته خود، آن‌ها را نصب کنید. با دستور زیر می توانید این کار را انجام دهید:

sudo add-apt-repository ppa:openjdk-r/ppa

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

sudo apt update

در نهایت، OpenJDK نسخه 17 جاوا، به طور خاص JRE هدلس را نصب کنید. این نسخه حداقلی از جاوا است که پشتیبانی از برنامه های رابط کاربری گرافیکی را حذف می کند. این آن را برای اجرای برنامه های جاوا بر روی سرور ایده آل می کند:

sudo apt install openjdk-17-jre-headless

همچنین باید از نرم افزاری به نام screen برای ایجاد جلسات سرور جداشونده استفاده کنید. صفحه نمایش به شما امکان می دهد یک جلسه ترمینال ایجاد کنید و از آن جدا شوید و روند شروع شده روی آن را اجرا کنید. این مهم است زیرا اگر بخواهید سرور خود را راه اندازی کنید و سپس ترمینال خود را ببندید، این جلسه را از بین می برد و سرور شما را متوقف می کند. اکنون صفحه نمایش را نصب کنید:

sudo apt install screen

اکنون که بسته‌ها را نصب کرده‌اید، باید فایروال را فعال کنیم تا ترافیک به سرور Minecraft ما وارد شود. در راه اندازی اولیه سرور که انجام دادید، فقط به ترافیک ssh اجازه دادید. اکنون باید اجازه دهید که ترافیک از طریق پورت 25565 وارد شود، که پورت پیش فرضی است که Minecraft برای اجازه دادن به اتصالات استفاده می کند. در برخی موارد ufw از قوانین ترافیکی نام‌گذاری شده استفاده می‌کند، مانند ssh، که همیشه به طور پیش‌فرض از پورت 22 استفاده می‌کند، اما در موارد کمتر رایج مانند این، شماره پورت را به صورت دستی مشخص می‌کنیم. با اجرای دستور زیر قانون فایروال لازم را اضافه کنید:

sudo ufw allow 25565

اکنون که جاوا را نصب کرده اید و فایروال خود را به درستی پیکربندی کرده اید، برنامه سرور Minecraft را از وب سایت Minecraft دانلود خواهید کرد.

مرحله 2 – دانلود آخرین نسخه Minecraft

اکنون باید نسخه فعلی سرور Minecraft را دانلود کنید. می‌توانید این کار را با رفتن به وب‌سایت Minecraft و کپی کردن پیوندی که می‌گوید دانلود minecraft_server.X.X.X.jar انجام دهید، جایی که Xها آخرین نسخه سرور هستند.

اکنون می توانید از wget و پیوند کپی شده برای دانلود برنامه سرور در سرور خود استفاده کنید:

wget https://launcher.mojang.com/v1/objects/125e5adf40c659fd3bce3e66e67a16bb49ecc1b9/server.jar

برنامه سرور به عنوان server.jar دانلود می شود. اگر نیاز به مدیریت نسخه‌های Minecraft دارید، یا اگر می‌خواهید سرور Minecraft خود را ارتقا دهید، ممکن است مفید باشد که server.jar دانلود شده را به minecraft_server_1.18.1.jar تغییر نام دهید و اعداد نسخه برجسته شده را با نسخه‌ای که تازه دانلود کرده‌اید مطابقت دهید:

mv server.jar minecraft_server_1.18.1.jar

اگر می‌خواهید نسخه قدیمی‌تر Minecraft را دانلود کنید، می‌توانید آن‌ها را در mcversions.net بایگانی کنید. اما این آموزش بر آخرین نسخه فعلی تمرکز خواهد کرد. اکنون که دانلود خود را دارید، بیایید پیکربندی سرور Minecraft خود را شروع کنیم.

مرحله 3 – پیکربندی و اجرای سرور Minecraft

اکنون که jar Minecraft را دانلود کرده اید، آماده اجرای آن هستید.

ابتدا یک جلسه صفحه نمایش را با اجرای دستور screen شروع کنید:

screen

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

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

java -Xms1024M -Xmx1024M -jar minecraft_server_1.18.1.jar nogui

قبل از بررسی خروجی این دستور، بیایید نگاهی دقیق‌تر به همه این آرگومان‌های خط فرمان که سرور شما را تنظیم می‌کنند بیاندازیم:

  • Xms1024M – این سرور را به گونه ای پیکربندی می کند که با 1024 مگابایت یا 1 گیگابایت رم در حال اجرا باشد. اگر می خواهید سرور شما با رم بیشتری شروع به کار کند، می توانید این محدودیت را افزایش دهید. هر دو M برای مگابایت و G برای گیگابایت گزینه های پشتیبانی می شوند. به عنوان مثال: Xms2G سرور را با 2 گیگابایت رم راه اندازی می کند.
  • Xmx1024M – این سرور را برای استفاده حداکثر از 1024M رم پیکربندی می کند. اگر می‌خواهید سرورتان در اندازه بزرگ‌تری اجرا شود، بازیکنان بیشتری را مجاز کنید، یا اگر احساس می‌کنید که سرورتان کند کار می‌کند، می‌توانید این محدودیت را افزایش دهید. برنامه های جاوا از این جهت منحصر به فرد هستند که همیشه از شما می خواهند حداکثر مقدار حافظه ای که می توانند استفاده کنند را مشخص کنید.
  • jar – این پرچم مشخص می کند که کدام فایل jar سرور اجرا شود.
  • nogui – این به سرور می گوید که رابط کاربری گرافیکی را راه اندازی نکند زیرا این یک سرور است و شما یک رابط کاربری گرافیکی ندارید.

اولین باری که این دستور را اجرا می کنید که معمولاً سرور شما را راه اندازی می کند، این خروجی را دریافت خواهید کرد:

 

Output

[22:05:31] [22:05:31] [main/ERROR]: Failed to load properties from file: server.properties
[22:05:31] [main/WARN]: Failed to load eula.txt
[22:05:31] [main/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

این خطاها به این دلیل ایجاد شده‌اند که سرور نمی‌تواند دو فایل لازم برای اجرا را پیدا کند: EULA (توافقنامه مجوز کاربر نهایی) که در eula.txt یافت می‌شود و فایل پیکربندی server.properties. از آنجایی که سرور قادر به یافتن این فایل ها نبود، آنها را در فهرست کاری فعلی شما ایجاد کرد. Minecraft این کار را عمدا انجام می دهد تا مطمئن شود که EULA آن را خوانده اید و با آن موافقت کرده اید.

eula.txt را در nano یا ویرایشگر متن مورد علاقه خود باز کنید:

nano eula.txt

در داخل این فایل، پیوندی به EULA Minecraft مشاهده خواهید کرد. URL را کپی کنید:

~/eula.txt

#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
#Tue Mar 24 22:05:31 UTC 2020
eula=false

URL را در مرورگر وب خود باز کنید و توافق نامه را بخوانید. سپس به ویرایشگر متن خود برگردید و آخرین خط را در eula.txt پیدا کنید. در اینجا eula=false را به eula=true تغییر دهید. سپس فایل را ذخیره کرده و ببندید. در نانو، این به این معنی است که Ctrl+X را برای خروج فشار دهید، سپس وقتی از شما خواسته شد ذخیره کنید، Y و سپس Enter کنید.

اکنون که EULA را پذیرفته اید، می توانید سرور را مطابق با مشخصات خود پیکربندی کنید.

در دایرکتوری فعلی خود، فایل server.properties ایجاد شده جدید را نیز خواهید یافت. این فایل شامل تمامی گزینه های پیکربندی سرور Minecraft شما می باشد. می‌توانید فهرست دقیقی از تمام ویژگی‌های سرور را در ویکی رسمی Minecraft پیدا کنید. قبل از راه اندازی سرور باید این فایل را با تنظیمات دلخواه خود تغییر دهید. این آموزش برخی از تنظیمات اساسی را پوشش می دهد:

nano server.properties

فایل شما به شکل زیر ظاهر می شود:

~/server.properties

#Minecraft server properties
#Thu Apr 30 23:42:29 UTC 2020
spawn-protection=16
max-tick-time=60000
query.port=25565
generator-settings=
force-gamemode=false
allow-nether=true
enforce-whitelist=false
gamemode=survival
broadcast-console-to-ops=true
enable-query=false
player-idle-timeout=0
difficulty=easy
spawn-monsters=true
broadcast-rcon-to-ops=true
op-permission-level=4
pvp=true
snooper-enabled=true
level-type=default
hardcore=false
enable-command-block=false
max-players=20
network-compression-threshold=256
resource-pack-sha1=
max-world-size=29999984
function-permission-level=2
rcon.port=25575
server-port=25565
server-ip=
spawn-npcs=true
allow-flight=false
level-name=world
view-distance=10
resource-pack=
spawn-animals=true
white-list=false
rcon.password=
generate-structures=true
online-mode=true
max-build-height=256
level-seed=
prevent-proxy-connections=false
use-native-transport=true
motd=A Minecraft Server
enable-rcon=false

بیایید نگاهی دقیق تر به برخی از مهم ترین ویژگی های این لیست بیندازیم:

دشواری (پیش‌فرض آسان) – این میزان سختی بازی را تعیین می‌کند، مانند میزان آسیب وارد شده و چگونگی تأثیر عناصر بر بازیکن شما. گزینه ها صلح آمیز، آسان، عادی و سخت هستند.
حالت بازی (بقای پیش فرض) – این حالت گیم پلی را تنظیم می کند. گزینه ها بقا، خلاقیت، ماجراجویی و تماشاگر هستند.
level-name (دنیای پیش فرض) – این نام سرور شما را تعیین می کند که در مشتری ظاهر می شود. ممکن است لازم باشد قبل از کاراکترهای خاص مانند آپوستروف، علامت معکوس وجود داشته باشد. شناخته شده است که این کاراکترهای فرار است، و زمانی که کاراکترهای خاص ممکن است به درستی در زمینه تجزیه و تحلیل نشوند، معمول است.
motd (سرور پیش فرض یک Minecraft) – پیامی که در لیست سرور مشتری Minecraft نمایش داده می شود.
pvp (پیش‌فرض درست) – نبرد بازیکن در مقابل بازیکن را فعال می‌کند. اگر روی true تنظیم شود، بازیکنان می‌توانند وارد جنگ شوند و به یکدیگر آسیب برسانند.
پس از تنظیم گزینه های مورد نظر، فایل را ذخیره کرده و ببندید.

اکنون می توانید سرور خود را با موفقیت راه اندازی کنید.

مانند دفعه قبل، بیایید سرور خود را با 1024M RAM راه اندازی کنیم. این بار، همچنین باید به Minecraft این امکان را بدهید که در صورت لزوم تا 4G از رم استفاده کند. به یاد داشته باشید که می توانید این شماره را متناسب با محدودیت های سرور یا نیازهای کاربر خود تنظیم کنید:

java -Xms1024M -Xmx4G -jar minecraft_server_1.18.1.jar nogui

چند لحظه به مقدار دهی اولیه بدهید. به زودی سرور Minecraft جدید شما شروع به تولید خروجی مشابه این خواهد کرد:

 

Output

[21:08:14] [Server thread/INFO]: Starting minecraft server version 1.15.2
[21:08:14] [Server thread/INFO]: Loading properties
[21:08:14] [Server thread/INFO]: Default game type: SURVIVAL
[21:08:14] [Server thread/INFO]: Generating keypair
[21:08:15] [Server thread/INFO]: Starting minecraft server on *:25565

پس از راه اندازی سرور، خروجی زیر را مشاهده خواهید کرد:

 

Output

[21:15:37] [Server thread/INFO]: Done (30.762s)! For help, type "help"

سرور شما اکنون در حال اجرا است و کنترل پنل مدیر سرور به شما نمایش داده شده است. راهنمای تایپ کردن را امتحان کنید:

help

خروجی به شکل زیر ظاهر می شود:

 

Output

[21:15:37] [Server thread/INFO]: /advancement (grant|revoke)
[21:15:37] [Server thread/INFO]: /ban <targets> [<reason>]
[21:15:37] [Server thread/INFO]: /ban-ip <target> [<reason>]
[21:15:37] [Server thread/INFO]: /banlist [ips|players]
...

از این ترمینال می توانید دستورات مدیر را اجرا کرده و سرور Minecraft خود را کنترل کنید. اکنون یاد خواهید گرفت که از صفحه نمایش برای فعال نگه داشتن سرور Minecraft خود پس از خروج از ترمینال استفاده کنید. سپس می توانید به مشتری Minecraft خود متصل شوید و یک بازی جدید را شروع کنید.

مرحله 4 – نگه داشتن سرور در حال اجرا

اکنون که سرور خود را روشن کرده اید، می خواهید حتی پس از قطع اتصال از جلسه SSH، همچنان در حال اجرا باشد. از آنجایی که قبلاً از صفحه استفاده کرده اید، می توانید با فشار دادن Ctrl + A + D از این جلسه جدا شوید. باید ببینید که به پوسته اصلی خود برگشته اید:

 

Output

​​ubuntu@minecraft-1804:~$ screen
[detached from 3626.pts-0.minecraft-1804]
$

این دستور را اجرا کنید تا تمام جلسات صفحه نمایش خود را ببینید:

screen -list

یک خروجی با شناسه جلسه خود دریافت خواهید کرد که برای از سرگیری آن جلسه باید آن را از سر بگیرید:

 

Output

There is a screen on:
        3626.pts-0.minecraft-1804 (11/16/21 22:56:33) (Detached)
1 Socket in /run/screen/S-root.

برای از سرگیری جلسه خود، پرچم -r را به فرمان صفحه ارسال کنید و سپس شناسه جلسه خود را وارد کنید:

screen -r 3626

وقتی دوباره آماده خروج از ترمینال شدید، حتما با Ctrl + A + D از جلسه جدا شده و سپس از سیستم خارج شوید.

مرحله 5 – اتصال به سرور خود از مشتری Minecraft

اکنون که سرور شما راه اندازی شده است، بیایید از طریق مشتری Minecraft به آن متصل شویم. سپس می توانید بازی کنید!

نسخه Minecraft Java Edition خود را اجرا کنید و Multiplayer را در منو انتخاب کنید.

در مرحله بعد، باید یک سرور برای اتصال به آن اضافه کنید، بنابراین روی دکمه افزودن سرور کلیک کنید.

در صفحه ویرایش اطلاعات سرور که نشان داده می شود، یک نام به سرور خود بدهید و آدرس IP سرور خود را تایپ کنید. این همان آدرس IP است که برای اتصال از طریق SSH استفاده کردید.

هنگامی که نام سرور و آدرس IP خود را وارد کردید، به صفحه Multiplayer بازگردانده می شوید، جایی که سرور شما اکنون لیست می شود.

از این پس سرور شما همیشه در این لیست ظاهر می شود. آن را انتخاب کرده و روی Join Server کلیک کنید.

شما در سرور خود هستید و آماده بازی هستید!

نتیجه

شما اکنون یک سرور Minecraft دارید که روی اوبونتو 18.04 اجرا می شود تا شما و همه دوستانتان با آن بازی کنید! از کاوش، کاردستی و زنده ماندن در یک دنیای خام سه بعدی لذت ببرید.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

برچسب‌ها:Minecraft نصباتصال به سرور مجازیاوبونتو 18.04ایجاد یک سرور Minecraftخرید سرور مجازیسرور Minecraftسرور مجازیسرور مجازی آمریکاسرور مجازی لهستان

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه راه اندازی یک سرور پخش ویدئو با استفاده از Nginx-RTMP در اوبونتو 20.04

ورود به سایت

معرفی

موارد استفاده زیادی برای پخش ویدیو وجود دارد. ارائه دهندگان خدمات مانند Twitch برای مدیریت جنبه های اکتشاف وب و مدیریت جامعه جریان بسیار محبوب هستند و نرم افزار رایگان مانند OBS Studio به طور گسترده برای ترکیب همپوشانی های ویدئویی از چندین منبع جریان مختلف در زمان واقعی استفاده می شود. در حالی که این پلتفرم ها بسیار قدرتمند هستند، در برخی موارد ممکن است بخواهید بتوانید جریانی را میزبانی کنید که به سایر ارائه دهندگان خدمات متکی نیست.

در این آموزش، نحوه پیکربندی وب سرور Nginx را برای میزبانی یک جریان ویدیوی RTMP مستقل که می‌تواند در برنامه‌های مختلف لینک و مشاهده شود، پیکربندی کنید. RTMP، پروتکل پیام‌رسانی بلادرنگ، اصول اکثر جریان‌های ویدئویی اینترنتی را تعریف می‌کند. همچنین یاد خواهید گرفت که چگونه جریان های HLS و DASH را میزبانی کنید که از پلتفرم های مدرن تری با استفاده از همین فناوری پشتیبانی می کنند.

پیش نیازها

برای تکمیل این راهنما، شما نیاز دارید:

  • یک سرور اوبونتو 20.04 و یک کاربر غیر ریشه با امتیازات sudo.
  • Nginx نصب شده است، به دنبال نحوه نصب Nginx در اوبونتو 20.04.

این آموزش از نام دامنه نگهدارنده your_domain برای URL ها و نام هاست استفاده می کند. در حین کار با آموزش، نام دامنه یا آدرس IP خود را جایگزین کنید.

مرحله 1 – نصب و پیکربندی Nginx-RTMP

اکثر ابزارهای مدرن جریان از پروتکل RTMP پشتیبانی می کنند، که پارامترهای اساسی یک جریان ویدئوی اینترنتی را تعریف می کند. وب سرور Nginx شامل ماژولی است که به شما امکان می دهد یک جریان RTMP با حداقل پیکربندی از یک URL اختصاصی ارائه دهید، درست مانند دسترسی HTTP به صفحات وب به طور پیش فرض. ماژول Nginx RTMP به طور خودکار در Nginx گنجانده نشده است، اما در Ubuntu 20.04 و اکثر توزیع‌های لینوکس دیگر می‌توانید آن را به عنوان یک بسته اضافی نصب کنید.

با اجرای دستورات زیر به عنوان یک کاربر غیر ریشه برای به روز رسانی لیست بسته های خود و نصب ماژول Nginx شروع کنید:

sudo apt update
sudo apt install libnginx-mod-rtmp

نصب ماژول به طور خودکار شروع به ارائه یک جریان نمی کند. شما باید یک بلوک پیکربندی را به فایل پیکربندی Nginx خود اضافه کنید که مکان و نحوه در دسترس بودن جریان را مشخص کند.

با استفاده از nano یا ویرایشگر متن مورد علاقه خود، فایل پیکربندی اصلی Nginx، /etc/nginx/nginx.conf را باز کنید و این بلوک پیکربندی را به انتهای فایل اضافه کنید:

sudo nano /etc/nginx/nginx.conf

/etc/nginx/nginx.conf

. . .
rtmp {
        server {
                listen 1935;
                chunk_size 4096;
                allow publish 127.0.0.1;
                deny publish all;

                application live {
                        live on;
                        record off;
                }
        }
}
  • listen 1935 به این معنی است که RTMP برای اتصالات در پورت 1935 که استاندارد است گوش می دهد.
  • chunk_size 4096 به این معنی است که RTMP داده ها را در بلوک های 4 کیلوبایتی ارسال می کند که این نیز استاندارد است.
  • اجازه انتشار 127.0.0.1 و انکار انتشار همه به این معنی است که سرور فقط اجازه می دهد ویدیو از همان سرور منتشر شود تا دیگر کاربران جریان های خود را تحت فشار قرار ندهند.
  • application live یک بلوک برنامه را تعریف می کند که در مسیر /live URL در دسترس خواهد بود.
  • live on حالت زنده را فعال می‌کند تا چندین کاربر بتوانند به طور همزمان به جریان شما متصل شوند، یک فرض اولیه پخش ویدیو.
  • ضبط کردن عملکرد ضبط Nginx-RTMP را غیرفعال می کند، به طوری که تمام جریان ها به طور پیش فرض به طور جداگانه در دیسک ذخیره نمی شوند.

ذخیره کنید و فایل را ببندید. اگر از nano استفاده می کنید، Ctrl+X را فشار دهید، سپس وقتی از شما خواسته شد، Y و Enter را فشار دهید.

این شروع پیکربندی RTMP شما را فراهم می کند. به طور پیش فرض، به پورت 1935 گوش می دهد، به این معنی که باید آن پورت را در فایروال خود باز کنید. اگر ufw را به عنوان بخشی از تنظیمات اولیه سرور خود پیکربندی کرده اید، دستور زیر را اجرا کنید.

sudo ufw allow 1935/tcp

اکنون می توانید Nginx را با تغییرات خود بارگیری مجدد کنید:

sudo systemctl reload nginx.service

اکنون باید یک سرور RTMP در حال کار داشته باشید. در بخش بعدی، پخش ویدیو را از منابع محلی و راه دور به سرور RTMP شما پوشش خواهیم داد.

مرحله 2 – ارسال ویدیو به سرور RTMP شما

راه های مختلفی برای ارسال ویدیو به سرور RTMP وجود دارد. یکی از گزینه‌ها استفاده از ffmpeg، یک ابزار محبوب صوتی و تصویری خط فرمان، برای پخش مستقیم یک فایل ویدیویی بر روی سرور است. اگر قبلاً یک فایل ویدیویی روی سرور ندارید، می‌توانید با استفاده از youtube-dl، یک ابزار خط فرمان برای ضبط ویدیو از پلتفرم‌های پخش جریانی مانند YouTube، آن را دانلود کنید. برای استفاده از youtube-dl، به نصب پایتون به روز روی سرور خود نیز نیاز دارید.

ابتدا پایتون و مدیریت بسته آن یعنی pip را نصب کنید:

sudo apt install python3-pip

در مرحله بعد، از pip برای نصب youtube-dl استفاده کنید:

pip install youtube-dl

اکنون می توانید از youtube-dl برای دانلود یک ویدیو از یوتیوب استفاده کنید. اگر موردی را در ذهن ندارید، این ویدیو را با معرفی پلتفرم اپلیکیشن DigitalOcean امتحان کنید:

youtube-dl https://www.youtube.com/watch?v=iom_nhYQIYk

زمانی که youtube-dl جریان‌های ویدیویی و صوتی را که بارگیری می‌کند در یک فایل واحد ترکیب می‌کند، مقداری خروجی را مشاهده خواهید کرد – این طبیعی است.

 

Output

[youtube] iom_nhYQIYk: Downloading webpage
WARNING: Requested formats are incompatible for merge and will be merged into mkv.
[download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.f137.mp4
[download] 100% of 32.82MiB in 08:40
[download] Destination: Introducing App Platform by DigitalOcean-iom_nhYQIYk.f251.webm
[download] 100% of 1.94MiB in 00:38
[ffmpeg] Merging formats into "Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv"
Deleting original file Introducing App Platform by DigitalOcean-iom_nhYQIYk.f137.mp4 (pass -k to keep)
Deleting original file Introducing App Platform by DigitalOcean-iom_nhYQIYk.f251.webm (pass -k to keep)

اکنون باید یک فایل ویدیویی در فهرست فعلی خود با عنوانی مانند معرفی پلتفرم برنامه توسط DigitalOcean-iom_nhYQIYk.mkv داشته باشید. برای استریم کردن آن، باید ffmpeg را نصب کنید:

sudo apt install ffmpeg

و از ffmpeg برای ارسال آن به سرور RTMP خود استفاده کنید:

ffmpeg -re -i “Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv” -c:v copy -c:a aac -ar 44100 -ac 1 -f flv rtmp://localhost/live/stream

این دستور ffmpeg چند کار را انجام می دهد تا ویدیو را برای یک قالب مناسب پخش آماده کند. این یک آموزش ffmpeg نیست، بنابراین نیازی به بررسی دقیق آن ندارید، اما می توانید گزینه های مختلف را به صورت زیر درک کنید:

  • -re مشخص می کند که ورودی با نرخ فریم اصلی خود خوانده می شود.
  • -i “Introducing App Platform by DigitalOcean-iom_nhYQIYk.mkv” مسیر فایل ورودی ما را مشخص می کند.
  • -c:v روی کپی تنظیم شده است، به این معنی که شما در حال کپی کردن فرمت ویدیویی هستید که از YouTube به صورت بومی دریافت کرده اید.
  • -c:a پارامترهای دیگری دارد، یعنی aac -ar 44100 -ac 1، زیرا باید صدا را به یک فرمت مناسب RTMP نمونه برداری کنید. aac یک کدک صوتی با پشتیبانی گسترده است، 44100 هرتز یک فرکانس رایج است، و -ac 1 اولین نسخه از مشخصات AAC را برای اهداف سازگاری مشخص می کند.
  • -f flv برای حداکثر سازگاری با RTMP، ویدیو را در یک ظرف با فرمت flv می پیچد.

این ویدیو به rtmp://localhost/live/stream ارسال می‌شود، زیرا شما بلوک پیکربندی زنده را در مرحله 1 تعریف کرده‌اید، و پخش یک URL دلخواه برای این ویدیو است.

در حالی که ffmpeg در حال پخش ویدیو است، کدهای زمانی را چاپ می کند:

 

Output

frame=  127 fps= 25 q=-1.0 size=     405kB time=00:00:05.00 bitrate= 662.2kbits/s speed=frame=  140 fps= 25 q=-1.0 size=     628kB time=00:00:05.52 bitrate= 931.0kbits/s speed=frame=  153 fps= 25 q=-1.0 size=     866kB time=00:00:06.04 bitrate=1173.1kbits/s speed=

این خروجی استاندارد ffmpeg است. اگر ویدیو را به فرمت دیگری تبدیل می‌کردید، اینها ممکن است برای درک میزان کارآمدی نمونه‌گیری مجدد ویدیو مفید باشند، اما در این مورد، فقط می‌خواهید ببینید که به طور مداوم پخش می‌شود. با استفاده از این ویدئوی نمونه، باید fps دقیق = 25 افزایش دریافت کنید.

در حالی که ffmpeg در حال اجرا است، می توانید از پخش کننده ویدیو به جریان RTMP خود متصل شوید. اگر VLC، mpv، یا پخش کننده رسانه دیگری را به صورت محلی نصب کرده اید، باید بتوانید جریان خود را با باز کردن URL rtmp://your_domain/live/stream در پخش کننده رسانه خود مشاهده کنید. پس از اتمام پخش ویدیو توسط ffmpeg، پخش جریانی شما پایان می یابد. اگر می‌خواهید به طور نامحدود به چرخش ادامه دهد، می‌توانید -stream_loop -1 را به ابتدای دستور ffmpeg خود اضافه کنید.

اکنون که یاد گرفتید منابع ویدئویی استاتیک را از خط فرمان استریم کنید، نحوه پخش ویدئو از منابع پویا را با استفاده از OBS روی دسکتاپ یاد خواهید گرفت.

مرحله 3 – پخش ویدیو به سرور خود از طریق OBS (اختیاری)

پخش جریانی از طریق ffmpeg زمانی راحت است که یک ویدیو آماده دارید که می‌خواهید پخش کنید، اما پخش زنده می‌تواند بسیار پویاتر باشد. محبوب ترین نرم افزار برای پخش زنده OBS یا Open Broadcaster Software است – این نرم افزار رایگان، منبع باز و بسیار قدرتمند است.

OBS یک برنامه دسکتاپ است و از رایانه محلی شما به سرور شما متصل می شود.

پس از نصب OBS، پیکربندی آن به معنای شخصی‌سازی پنجره‌های دسکتاپ و منابع صوتی است که می‌خواهید به جریان خود اضافه کنید، و سپس اعتبارنامه‌ها را برای یک سرویس پخش اضافه کنید. این آموزش پیکربندی استریم شما را پوشش نمی‌دهد، زیرا در اولویت قرار دارد، و به طور پیش‌فرض، می‌توانید تنها با پخش جریانی کل دسک‌تاپ خود، یک نسخه نمایشی فعال داشته باشید. برای تنظیم اعتبار سرویس پخش خود، منوی تنظیمات OBS را باز کنید، به گزینه Stream بروید و گزینه های زیر را وارد کنید:

Streaming Service: Custom
Server: rtmp://your_domain/live
Play Path/Stream Key: obs_stream

obs_stream مسیری است که خودسرانه انتخاب شده است – در این مورد، ویدیوی شما در rtmp://your_domain/live/obs_stream در دسترس خواهد بود. شما نیازی به فعال کردن احراز هویت ندارید، اما باید یک ورودی اضافی به لیست سفید IP که در مرحله 1 پیکربندی کرده اید اضافه کنید.

بر روی سرور، فایل پیکربندی اصلی Nginx، /etc/nginx/nginx.conf را باز کنید و یک ورودی اجازه انتشار اضافی برای آدرس IP محلی خود اضافه کنید. اگر آدرس IP محلی خود را نمی دانید، بهتر است فقط به سایتی مانند What’s my IP بروید که می تواند به شما بگوید از کجا به آن دسترسی داشته اید:

sudo nano /etc/nginx/nginx.conf

/etc/nginx/nginx.conf

. . .
                allow publish 127.0.0.1;
                allow publish your_local_ip_address;
                deny publish all;
. . .

فایل را ذخیره کرده و ببندید، سپس Nginx را دوباره بارگیری کنید:

sudo systemctl reload nginx.service

اکنون باید بتوانید منوی تنظیمات OBS را ببندید و روی Start Streaming از رابط اصلی کلیک کنید! سعی کنید جریان خود را مانند قبل در پخش کننده رسانه مشاهده کنید. اکنون که اصول پخش ویدئو را در عمل مشاهده کرده اید، می توانید چند ویژگی دیگر را به سرور خود اضافه کنید تا آن را برای تولید آماده تر کنید.

مرحله 4 – افزودن مانیتورینگ به پیکربندی (اختیاری)

اکنون که Nginx را برای پخش جریانی ویدیو با استفاده از ماژول Nginx-RTMP پیکربندی کرده اید، گام بعدی رایج این است که صفحه آمار RTMP را فعال کنید. به جای افزودن جزئیات بیشتر و بیشتر پیکربندی به فایل اصلی nginx.conf، Nginx به شما امکان می دهد پیکربندی های هر سایت را به فایل های جداگانه در یک زیر شاخه به نام sites-available/ اضافه کنید. در این مورد، یکی به نام rtmp ایجاد خواهید کرد:

sudo nano /etc/nginx/sites-available/rtmp

مطالب زیر را اضافه کنید:

/etc/nginx/sites-available/rtmp

server {
    listen 8080;
    server_name  localhost;

    # rtmp stat
    location /stat {
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;
    }
    location /stat.xsl {
        root /var/www/html/rtmp;
    }

    # rtmp control
    location /control {
        rtmp_control all;
    }
}

ذخیره کنید و فایل را ببندید. فایل stat.xsl از این بلوک پیکربندی برای استایل دادن و نمایش یک صفحه آمار RTMP در مرورگر شما استفاده می شود. توسط کتابخانه libnginx-mod-rtmp که قبلا نصب کرده اید ارائه می شود، اما به طور پیش فرض فشرده می شود، بنابراین باید آن را از حالت فشرده خارج کنید و در پوشه /var/www/html/rtmp قرار دهید تا با پیکربندی بالا مطابقت داشته باشد. . توجه داشته باشید که می توانید اطلاعات اضافی درباره هر یک از این گزینه ها را در اسناد Nginx-RTMP بیابید.

پوشه /var/www/html/rtmp را ایجاد کنید و سپس فایل stat.xsl.gz را با دستورات زیر از حالت فشرده خارج کنید:

sudo mkdir /var/www/html/rtmp
sudo gunzip -c /usr/share/doc/libnginx-mod-rtmp/examples/stat.xsl.gz > /var/www/html/rtmp/stat.xsl`

در نهایت، برای دسترسی به صفحه آماری که اضافه کردید، باید پورت دیگری را در فایروال خود باز کنید. به طور خاص، دستورالعمل listen با پورت 8080 پیکربندی شده است، بنابراین باید یک قانون برای دسترسی به Nginx در آن پورت اضافه کنید. با این حال، احتمالاً نمی‌خواهید دیگران بتوانند به صفحه آمار شما دسترسی داشته باشند، بنابراین بهتر است فقط به آدرس IP خود اجازه دهید. دستور زیر را اجرا کنید:

sudo ufw allow from your_ip_address to any port http-alt

در مرحله بعد، باید این پیکربندی جدید را فعال کنید. قرارداد Nginx ایجاد پیوندهای نمادین (مانند میانبرها) از فایل‌های موجود در سایت‌های موجود/به پوشه دیگری به نام sites-enabled/هنگامی که تصمیم به فعال یا غیرفعال کردن آن‌ها دارید، است. با استفاده از مسیرهای کامل برای وضوح، این پیوند را ایجاد کنید:

sudo ln -s /etc/nginx/sites-available/rtmp /etc/nginx/sites-enabled/rtmp

اکنون می توانید دوباره Nginx را برای پردازش تغییرات خود بارگیری مجدد کنید:

sudo systemctl reload nginx.service

اکنون باید بتوانید در مرورگر به http://your_domain:8080/stat بروید تا صفحه آمار RTMP را ببینید. در حین پخش ویدیو از صفحه بازدید کرده و آن را بازخوانی کنید و مشاهده کنید که آمار جریان تغییر می کند.

اکنون مشاهده کرده اید که چگونه می توانید جریان ویدیوی خود را نظارت کنید و آن را به ارائه دهندگان شخص ثالث ارسال کنید. در بخش آخر، یاد خواهید گرفت که چگونه آن را مستقیماً در یک مرورگر بدون استفاده از پلتفرم‌های پخش جریانی شخص ثالث یا برنامه‌های پخش کننده رسانه مستقل ارائه کنید.

مرحله 5 – ایجاد جریان های مدرن برای مرورگرها (اختیاری)

به عنوان آخرین مرحله، ممکن است بخواهید از پروتکل های جریان جدیدتر پشتیبانی اضافه کنید تا کاربران بتوانند مستقیماً با استفاده از یک مرورگر وب، ویدیو را از سرور شما پخش کنند. دو پروتکل وجود دارد که می توانید برای ایجاد جریان های ویدئویی مبتنی بر HTTP از آنها استفاده کنید: HLS اپل و MPEG DASH. هر دو مزایا و معایبی دارند، بنابراین احتمالاً می خواهید از هر دو پشتیبانی کنید.

ماژول Nginx-RTMP از هر دو استاندارد پشتیبانی می کند. برای افزودن پشتیبانی HLS و DASH به سرور خود، باید بلوک rtmp را در فایل nginx.conf خود تغییر دهید. /etc/nginx/nginx.conf را با استفاده از nano یا ویرایشگر دلخواه خود باز کنید، سپس دستورالعمل های هایلایت شده زیر را اضافه کنید:

sudo nano /etc/nginx/nginx.conf

/etc/nginx/nginx.conf

. . .
rtmp {
        server {
. . .
                application live {
                        live on;
                        record off;
                        hls on;
                        hls_path /var/www/html/stream/hls;
                        hls_fragment 3;
                        hls_playlist_length 60;

                        dash on;
                        dash_path /var/www/html/stream/dash;
                }
        }
}
. . .

ذخیره کنید و فایل را ببندید. بعد، این را به پایین سایت های خود اضافه کنید-available/rtmp:

sudo nano /etc/nginx/sites-available/rtmp

/etc/nginx/sites-available/rtmp

. . .
server {
    listen 8088;

    location / {
        add_header Access-Control-Allow-Origin *;
        root /var/www/html/stream;
    }
}

types {
    application/dash+xml mpd;
}

ذخیره کنید و فایل را ببندید. توجه داشته باشید که در اینجا از پورت 8088 استفاده کنید، که یکی دیگر از انتخاب‌های دلخواه برای این آموزش برای جلوگیری از تضاد با سرویس‌هایی است که ممکن است در پورت 80 یا 443 اجرا شود.

sudo ufw allow 8088/tcp

در نهایت، یک دایرکتوری جریان در ریشه وب خود ایجاد کنید تا با بلوک پیکربندی مطابقت داشته باشد تا Nginx بتواند فایل های لازم برای HLS و DASH را ایجاد کند:

sudo mkdir /var/www/html/stream

بارگیری مجدد Nginx:

sudo systemctl reload nginx

اکنون باید یک جریان HLS در http://your_domain:8088/hls/stream.m3u8 و یک جریان DASH در http://your_domain:8088/dash/stream.mpd موجود باشد. این نقاط پایانی هر ابرداده لازم را در بالای فید ویدیوی RTMP شما به منظور پشتیبانی از APIهای مدرن تولید می کنند.

نتیجه

گزینه های پیکربندی که در این آموزش استفاده کردید همگی در صفحه ویکی Nginx RTMP مستند شده اند. ماژول‌های Nginx معمولاً نحو مشترکی را به اشتراک می‌گذارند و مجموعه بسیار وسیعی از گزینه‌های پیکربندی را در معرض دید قرار می‌دهند، و شما می‌توانید اسناد آنها را برای تغییر هر یک از تنظیمات خود از اینجا مرور کنید.

تقریباً تمام پخش ویدیوی اینترنتی در بالای RTMP، HLS و DASH پیاده‌سازی می‌شود و با استفاده از رویکردی که در این آموزش بررسی کرده‌اید، می‌توانید جریان خود را از طریق سایر سرویس‌های پخش ارائه کنید یا به هر طریق دیگری که می‌خواهید آن را در معرض دید قرار دهید. در مرحله بعد، می توانید به پیکربندی Nginx به عنوان یک پروکسی معکوس توجه کنید تا برخی از این نقاط پایانی مختلف ویدیو را به عنوان زیر دامنه در دسترس قرار دهید.

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

برچسب‌ها:Nginx-RTMPVPS یا سرور مجازیاتصال به سرور مجازی لینوکسانواع سرور مجازیخرید سرور مجازیراه اندازی سرورراه اندازی یک سرور پخش ویدئوسرور RTMPسرور مجازی آمریکانصب و پیکربندی Nginx-RTMPوب سرور Nginx

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه ایجاد یک سرور Minecraft در اوبونتو 18.04

  ورود به سایت

معرفی

Minecraft یک بازی ویدیویی محبوب sandbox است. این برنامه که در ابتدا در سال 2009 منتشر شد، به بازیکنان اجازه می‌دهد در دنیایی سه بعدی بسازند، بسازند، بسازند و زنده بمانند. از اوایل سال 2022، این بازی پرفروش ترین بازی ویدیویی تمام دوران بود. در این آموزش شما سرور Minecraft خود را ایجاد می کنید تا شما و دوستانتان با هم بازی کنید. به طور خاص، شما بسته های نرم افزاری لازم را برای اجرای Minecraft نصب می کنید، سرور را برای اجرا پیکربندی می کنید و سپس بازی را اجرا می کنید.

همچنین، می‌توانید سرور DigitalOcean’s One-Click Minecraft: Java Edition را به‌عنوان مسیر نصب دیگری کاوش کنید.

پیش نیازها

برای پیروی از این راهنما، شما نیاز دارید:

  • یک سرور با نصب جدید اوبونتو 18.04، یک کاربر غیر ریشه با امتیازات sudo و SSH فعال.
  • یک کپی از Minecraft Java Edition که بر روی یک ماشین محلی Mac، Windows یا Linux نصب شده است.

مرحله 1 – بسته های نرم افزاری لازم را نصب کرده و فایروال را پیکربندی کنید

با شروع اولیه سرور، اولین قدم شما نصب جاوا است. برای اجرای Minecraft به آن نیاز دارید. به‌طور پیش‌فرض، اوبونتو 18.04 نسخه جدید جاوا را برای اجرای جدیدترین نسخه‌های Minecraft ارائه نمی‌کند. خوشبختانه، نگهبانان شخص ثالثی وجود دارند که به ساخت بسته‌های جاوای جدیدتر برای نسخه‌های قدیمی‌تر اوبونتو ادامه می‌دهند و می‌توانید با افزودن PPA یا آرشیو بسته‌های شخصی آن‌ها به فهرست منابع بسته خود، آن‌ها را نصب کنید. با دستور زیر می توانید این کار را انجام دهید:

sudo add-apt-repository ppa:openjdk-r/ppa

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

sudo apt update

در نهایت، OpenJDK نسخه 17 جاوا، به طور خاص JRE بدون هد را نصب کنید. این نسخه حداقلی از جاوا است که پشتیبانی از برنامه های رابط کاربری گرافیکی را حذف می کند. این آن را برای اجرای برنامه های جاوا بر روی سرور ایده آل می کند:

sudo apt install openjdk-17-jre-headless

همچنین باید از نرم افزاری به نام screen برای ایجاد جلسات سرور جداشونده استفاده کنید. صفحه نمایش به شما امکان می دهد یک جلسه ترمینال ایجاد کنید و از آن جدا شوید و روند شروع شده روی آن را اجرا کنید. این مهم است زیرا اگر بخواهید سرور خود را راه اندازی کنید و سپس ترمینال خود را ببندید، این کار باعث از بین رفتن جلسه و توقف سرور شما می شود. اکنون صفحه نمایش را نصب کنید:

sudo apt install screen

اکنون که بسته‌ها را نصب کرده‌اید، باید فایروال را فعال کنیم تا ترافیک به سرور Minecraft ما وارد شود. در راه اندازی اولیه سرور که انجام دادید، فقط به ترافیک ssh اجازه دادید. اکنون باید اجازه دهید که ترافیک از طریق پورت 25565 وارد شود، که پورت پیش فرضی است که Minecraft برای اجازه دادن به اتصالات استفاده می کند. در برخی موارد ufw از قوانین ترافیکی نام‌گذاری شده استفاده می‌کند، مانند ssh، که همیشه به طور پیش‌فرض از پورت 22 استفاده می‌کند، اما در موارد کمتر رایج مانند این، شماره پورت را به صورت دستی مشخص می‌کنیم. با اجرای دستور زیر قانون فایروال لازم را اضافه کنید:

sudo ufw allow 25565

اکنون که جاوا را نصب کرده اید و فایروال خود را به درستی پیکربندی کرده اید، برنامه سرور Minecraft را از وب سایت Minecraft دانلود خواهید کرد.

مرحله 2 – دانلود آخرین نسخه Minecraft

اکنون باید نسخه فعلی سرور Minecraft را دانلود کنید. می‌توانید این کار را با رفتن به وب‌سایت Minecraft و کپی کردن پیوندی که می‌گوید دانلود minecraft_server.X.X.X.jar انجام دهید، جایی که Xها آخرین نسخه سرور هستند.

اکنون می توانید از wget و پیوند کپی شده برای دانلود برنامه سرور در سرور خود استفاده کنید:

wget https://launcher.mojang.com/v1/objects/125e5adf40c659fd3bce3e66e67a16bb49ecc1b9/server.jar

برنامه سرور به عنوان server.jar دانلود می شود. اگر نیاز به مدیریت نسخه‌های Minecraft دارید، یا اگر می‌خواهید سرور Minecraft خود را ارتقا دهید، ممکن است مفید باشد که server.jar دانلود شده را به minecraft_server_1.18.1.jar تغییر نام دهید و اعداد نسخه برجسته شده را با نسخه‌ای که تازه دانلود کرده‌اید مطابقت دهید:

mv server.jar minecraft_server_1.18.1.jar

اگر می‌خواهید نسخه قدیمی‌تر Minecraft را دانلود کنید، می‌توانید آن‌ها را در mcversions.net بایگانی کنید. اما این آموزش بر آخرین نسخه فعلی تمرکز خواهد کرد. اکنون که دانلود خود را دارید، بیایید پیکربندی سرور Minecraft خود را شروع کنیم.

مرحله 3 – پیکربندی و اجرای سرور Minecraft

اکنون که jar Minecraft را دانلود کرده اید، آماده اجرای آن هستید.

ابتدا یک جلسه صفحه نمایش را با اجرای دستور screen شروع کنید:

screen

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

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

java -Xms1024M -Xmx1024M -jar minecraft_server_1.18.1.jar nogui

قبل از بررسی خروجی این دستور، بیایید نگاهی دقیق‌تر به همه این آرگومان‌های خط فرمان که سرور شما را تنظیم می‌کنند بیاندازیم:

  • Xms1024M – این سرور را به گونه ای پیکربندی می کند که با 1024 مگابایت یا 1 گیگابایت رم در حال اجرا باشد. اگر می خواهید سرور شما با رم بیشتری شروع به کار کند، می توانید این محدودیت را افزایش دهید. هر دو M برای مگابایت و G برای گیگابایت گزینه های پشتیبانی می شوند. به عنوان مثال: Xms2G سرور را با 2 گیگابایت رم راه اندازی می کند.
  • Xmx1024M – این سرور را برای استفاده حداکثر از 1024M رم پیکربندی می کند. اگر می‌خواهید سرورتان در اندازه بزرگ‌تری اجرا شود، بازیکنان بیشتری را مجاز کنید، یا اگر احساس می‌کنید که سرورتان کند کار می‌کند، می‌توانید این محدودیت را افزایش دهید. برنامه های جاوا از این جهت منحصر به فرد هستند که همیشه از شما می خواهند حداکثر مقدار حافظه ای که می توانند استفاده کنند را مشخص کنید.
  • jar – این پرچم مشخص می کند که کدام فایل jar سرور اجرا شود.
  • nogui – این به سرور می گوید که رابط کاربری گرافیکی را راه اندازی نکند زیرا این یک سرور است و شما یک رابط کاربری گرافیکی ندارید.

اولین باری که این دستور را اجرا می کنید که معمولاً سرور شما را راه اندازی می کند، این خروجی را دریافت خواهید کرد:

 

Output

[22:05:31] [22:05:31] [main/ERROR]: Failed to load properties from file: server.properties
[22:05:31] [main/WARN]: Failed to load eula.txt
[22:05:31] [main/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

این خطاها به این دلیل ایجاد شده‌اند که سرور نمی‌تواند دو فایل لازم برای اجرا را پیدا کند: EULA (توافقنامه مجوز کاربر نهایی) که در eula.txt یافت می‌شود و فایل پیکربندی server.properties. از آنجایی که سرور قادر به یافتن این فایل ها نبود، آنها را در فهرست کاری فعلی شما ایجاد کرد. Minecraft این کار را عمدا انجام می دهد تا مطمئن شود که EULA آن را خوانده اید و با آن موافقت کرده اید.

eula.txt را در nano یا ویرایشگر متن مورد علاقه خود باز کنید:

nano eula.txt

در داخل این فایل، پیوندی به EULA Minecraft مشاهده خواهید کرد. URL را کپی کنید:

~/eula.txt

#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
#Tue Mar 24 22:05:31 UTC 2020
eula=false

URL را در مرورگر وب خود باز کنید و توافق نامه را بخوانید. سپس به ویرایشگر متن خود برگردید و آخرین خط را در eula.txt پیدا کنید. در اینجا eula=false را به eula=true تغییر دهید. سپس فایل را ذخیره کرده و ببندید. در نانو، این به این معنی است که Ctrl+X را برای خروج فشار دهید، سپس وقتی از شما خواسته شد ذخیره کنید، Y و سپس Enter کنید.

اکنون که EULA را پذیرفته اید، می توانید سرور را مطابق با مشخصات خود پیکربندی کنید.

در دایرکتوری فعلی خود، فایل server.properties ایجاد شده جدید را نیز خواهید یافت. این فایل شامل تمامی گزینه های پیکربندی سرور Minecraft شما می باشد. می‌توانید فهرست دقیقی از تمام ویژگی‌های سرور را در ویکی رسمی Minecraft پیدا کنید. قبل از راه اندازی سرور باید این فایل را با تنظیمات دلخواه خود تغییر دهید. این آموزش برخی از تنظیمات اساسی را پوشش می دهد:

nano server.properties

فایل شما به شکل زیر ظاهر می شود:

~/server.properties

#Minecraft server properties
#Thu Apr 30 23:42:29 UTC 2020
spawn-protection=16
max-tick-time=60000
query.port=25565
generator-settings=
force-gamemode=false
allow-nether=true
enforce-whitelist=false
gamemode=survival
broadcast-console-to-ops=true
enable-query=false
player-idle-timeout=0
difficulty=easy
spawn-monsters=true
broadcast-rcon-to-ops=true
op-permission-level=4
pvp=true
snooper-enabled=true
level-type=default
hardcore=false
enable-command-block=false
max-players=20
network-compression-threshold=256
resource-pack-sha1=
max-world-size=29999984
function-permission-level=2
rcon.port=25575
server-port=25565
server-ip=
spawn-npcs=true
allow-flight=false
level-name=world
view-distance=10
resource-pack=
spawn-animals=true
white-list=false
rcon.password=
generate-structures=true
online-mode=true
max-build-height=256
level-seed=
prevent-proxy-connections=false
use-native-transport=true
motd=A Minecraft Server
enable-rcon=false

بیایید نگاهی دقیق تر به برخی از مهم ترین ویژگی های این لیست بیندازیم:

دشواری (پیش‌فرض آسان) – این میزان سختی بازی را تعیین می‌کند، مانند میزان آسیب وارد شده و چگونگی تأثیر عناصر بر بازیکن شما. گزینه ها صلح آمیز، آسان، عادی و سخت هستند.
حالت بازی (بقای پیش فرض) – این حالت گیم پلی را تنظیم می کند. گزینه ها بقا، خلاقیت، ماجراجویی و تماشاگر هستند.
level-name (دنیای پیش فرض) – این نام سرور شما را تعیین می کند که در مشتری ظاهر می شود. ممکن است لازم باشد قبل از کاراکترهای خاص مانند آپوستروف، علامت معکوس وجود داشته باشد. شناخته شده است که این کاراکترهای فرار است، و زمانی که کاراکترهای خاص ممکن است به درستی در زمینه تجزیه و تحلیل نشوند، معمول است.
motd (سرور پیش فرض یک Minecraft) – پیامی که در لیست سرور مشتری Minecraft نمایش داده می شود.
pvp (پیش‌فرض درست) – نبرد بازیکن در مقابل بازیکن را فعال می‌کند. اگر روی true تنظیم شود، بازیکنان می‌توانند وارد جنگ شوند و به یکدیگر آسیب برسانند.
پس از تنظیم گزینه های مورد نظر، فایل را ذخیره کرده و ببندید.

اکنون می توانید سرور خود را با موفقیت راه اندازی کنید.

مانند دفعه قبل، بیایید سرور خود را با 1024M RAM راه اندازی کنیم. این بار، همچنین باید به Minecraft این امکان را بدهید که در صورت لزوم تا 4G از رم استفاده کند. به یاد داشته باشید که می توانید این شماره را متناسب با محدودیت های سرور یا نیازهای کاربر خود تنظیم کنید:

java -Xms1024M -Xmx4G -jar minecraft_server_1.18.1.jar nogui

چند لحظه به مقدار دهی اولیه بدهید. به زودی سرور Minecraft جدید شما شروع به تولید خروجی مشابه این خواهد کرد:

 

Output

[21:08:14] [Server thread/INFO]: Starting minecraft server version 1.15.2
[21:08:14] [Server thread/INFO]: Loading properties
[21:08:14] [Server thread/INFO]: Default game type: SURVIVAL
[21:08:14] [Server thread/INFO]: Generating keypair
[21:08:15] [Server thread/INFO]: Starting minecraft server on *:25565

پس از راه اندازی سرور، خروجی زیر را مشاهده خواهید کرد:

 

Output

[21:15:37] [Server thread/INFO]: Done (30.762s)! For help, type "help"

سرور شما اکنون در حال اجرا است و کنترل پنل مدیر سرور به شما نمایش داده شده است. راهنمای تایپ کردن را امتحان کنید:

help

خروجی به شکل زیر ظاهر می شود:

 

Output

[21:15:37] [Server thread/INFO]: /advancement (grant|revoke)
[21:15:37] [Server thread/INFO]: /ban <targets> [<reason>]
[21:15:37] [Server thread/INFO]: /ban-ip <target> [<reason>]
[21:15:37] [Server thread/INFO]: /banlist [ips|players]
...

از این ترمینال می توانید دستورات مدیر را اجرا کرده و سرور Minecraft خود را کنترل کنید. اکنون یاد خواهید گرفت که از صفحه نمایش برای فعال نگه داشتن سرور Minecraft خود پس از خروج از ترمینال استفاده کنید. سپس می توانید به مشتری Minecraft خود متصل شوید و یک بازی جدید را شروع کنید.

مرحله 4 – نگه داشتن سرور در حال اجرا

اکنون که سرور خود را روشن کرده اید، می خواهید حتی پس از قطع اتصال از جلسه SSH، همچنان در حال اجرا باشد. از آنجایی که قبلاً از صفحه استفاده کرده اید، می توانید با فشار دادن Ctrl + A + D از این جلسه جدا شوید. باید ببینید که به پوسته اصلی خود برگشته اید:

 

Output

​​ubuntu@minecraft-1804:~$ screen
[detached from 3626.pts-0.minecraft-1804]
$

این دستور را اجرا کنید تا تمام جلسات صفحه نمایش خود را ببینید:

screen -list

خروجی با شناسه جلسه خود دریافت خواهید کرد که برای از سرگیری آن جلسه باید آن را از سر بگیرید:

 

Output

There is a screen on:
        3626.pts-0.minecraft-1804 (11/16/21 22:56:33) (Detached)
1 Socket in /run/screen/S-root.

برای از سرگیری جلسه خود، پرچم -r را به فرمان صفحه ارسال کنید و سپس شناسه جلسه خود را وارد کنید:

screen -r 3626

وقتی دوباره آماده خروج از ترمینال شدید، حتما با Ctrl + A + D از جلسه جدا شده و سپس از سیستم خارج شوید.

مرحله 5 – اتصال به سرور خود از مشتری Minecraft

اکنون که سرور شما راه‌اندازی شده است، بیایید از طریق مشتری Minecraft به آن متصل شویم. سپس می توانید بازی کنید!

نسخه Minecraft Java Edition خود را اجرا کنید و Multiplayer را در منو انتخاب کنید.

 

در مرحله بعد، باید یک سرور برای اتصال به آن اضافه کنید، بنابراین روی دکمه افزودن سرور کلیک کنید.

در صفحه ویرایش اطلاعات سرور که نشان داده می شود، یک نام به سرور خود بدهید و آدرس IP سرور خود را تایپ کنید. این همان آدرس IP است که برای اتصال از طریق SSH استفاده کردید.

 

هنگامی که نام سرور و آدرس IP خود را وارد کردید، به صفحه Multiplayer بازگردانده می شوید، جایی که سرور شما اکنون لیست می شود.

از این پس سرور شما همیشه در این لیست ظاهر می شود. آن را انتخاب کرده و روی Join Server کلیک کنید.

شما در سرور خود هستید و آماده بازی هستید!

نتیجه

شما اکنون یک سرور Minecraft دارید که روی اوبونتو 18.04 اجرا می شود تا شما و همه دوستانتان با آن بازی کنید! از کاوش، کاردستی و زنده ماندن در یک دنیای خام سه بعدی لذت ببرید.

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

برچسب‌ها:Jenkinsاتصال به سرور مجازیاتصال به سرور مجازی لینوکسانواع سرور مجازیپیکربندی Webhooksخرید سرور مجازیدسترسی Jenkins به GitHubسرور اتوماسیون متن بازسرور اوبونتو 20.04

  • behnam gol mohamadi
  • ۰
  • ۰

 

نحوه راه اندازی خطوط لوله یکپارچه سازی مداوم در Jenkins در اوبونتو 20.04

 

ورود به سرور

 

 

 

معرفی

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

در راهنماهای قبلی، ما جنکینز را روی سرور اوبونتو 20.04 نصب کردیم و جنکینز را با SSL با استفاده از یک پراکسی معکوس Nginx پیکربندی کردیم. در این راهنما، نحوه راه‌اندازی Jenkins را برای آزمایش خودکار یک برنامه زمانی که تغییرات به یک مخزن منتقل می‌شوند، نشان خواهیم داد.

برای این آموزش، ما Jenkins را با GitHub ادغام خواهیم کرد تا زمانی که کد جدید به مخزن فرستاده می شود، جنکینز مطلع شود. وقتی جنکینز مطلع شد، کد را بررسی می‌کند و سپس آن را در کانتینرهای Docker آزمایش می‌کند تا محیط آزمایشی را از دستگاه میزبان جنکینز جدا کند. ما از یک نمونه برنامه Node.js برای نشان دادن نحوه تعریف فرآیند CI/CD برای یک پروژه استفاده خواهیم کرد.

پیش نیازها

برای پیروی از این راهنما، به یک سرور اوبونتو 20.04 با حداقل 1G RAM که با نصب ایمن جنکینز پیکربندی شده باشد، نیاز دارید. برای ایمن سازی مناسب رابط وب، باید یک نام دامنه به سرور جنکینز اختصاص دهید. برای یادگیری نحوه تنظیم Jenkins در قالب مورد انتظار، این راهنماها را دنبال کنید:

  • نحوه نصب جنکینز در اوبونتو 20.04
  • نحوه نصب Nginx در اوبونتو 20.04
  • چگونه Nginx را با Let’s Encrypt در اوبونتو 20.04 ایمن کنیم
  • نحوه پیکربندی جنکینز با SSL با استفاده از پروکسی معکوس Nginx

برای کنترل بهتر محیط آزمایش خود، آزمایش های برنامه خود را در کانتینرهای Docker اجرا می کنیم. پس از راه‌اندازی Jenkins، Docker را با انجام مراحل یک و دو این راهنما بر روی سرور نصب کنید:

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

هنگامی که راهنماهای فوق را کامل کردید، می توانید با این مقاله ادامه دهید.

 

کاربر Jenkins را به گروه Docker اضافه کنید

پس از رعایت پیش نیازها، هر دو جنکینز و داکر بر روی سرور شما نصب می شوند. با این حال، به طور پیش فرض، کاربر لینوکس مسئول اجرای فرآیند جنکینز نمی تواند به Docker دسترسی داشته باشد.

برای رفع این مشکل، باید کاربر jenkins را با استفاده از دستور usermod به گروه docker اضافه کنیم:

sudo usermod -aG docker jenkins

می‌توانید اعضای گروه docker را فهرست کنید تا تأیید کنید که کاربر jenkins با موفقیت اضافه شده است:

grep docker /etc/group

 

Output

docker:x:999:sammy,jenkins

برای اینکه جنکینز از عضویت جدید خود استفاده کند، باید فرآیند را مجدداً راه اندازی کنید:

sudo systemctl restart jenkins

اگر جنکینز را با افزونه‌های پیش‌فرض نصب کرده‌اید، ممکن است لازم باشد بررسی کنید که افزونه‌های docker و docker-pipeline نیز فعال هستند. برای انجام این کار، روی Manage Jenkins از نوار کناری و سپس Manage Plugins از منوی بعدی کلیک کنید. برای جستجوی افزونه های جدید، روی تب Available از منوی افزونه کلیک کنید و docker را در نوار جستجو تایپ کنید. اگر هر دو افزونه Docker Pipeline و Docker به عنوان گزینه برگردانده شدند، و انتخاب نشدند، هر دو را انتخاب کنید، و هنگامی که از شما خواسته شد، به Jenkins اجازه راه اندازی مجدد با فعال بودن افزونه های جدید را بدهید.

این باید تقریباً یک دقیقه طول بکشد و صفحه پس از آن بازخوانی می شود.

یک رمز دسترسی شخصی در GitHub ایجاد کنید

برای اینکه جنکینز پروژه های GitHub شما را تماشا کند، باید یک رمز دسترسی شخصی در حساب GitHub ما ایجاد کنید.

اگر قبلاً این کار را نکرده اید، با بازدید از GitHub و وارد شدن به حساب خود شروع کنید. پس از آن، روی نماد کاربر خود در گوشه سمت راست بالا کلیک کنید و تنظیمات را از منوی کشویی انتخاب کنید:

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

در صفحه بعد روی دکمه Generate new token کلیک کنید:

شما به صفحه ای هدایت می شوید که در آن می توانید محدوده توکن جدید خود را مشخص کنید.

در کادر توضیحات Token، توضیحی اضافه کنید که به شما امکان می دهد بعداً آن را تشخیص دهید:

در بخش Select scopes، کادرهای repo:status، repo:public_repo و admin:org_hook را بررسی کنید. اینها به جنکینز اجازه می‌دهد تا وضعیت‌های commit را به‌روزرسانی کند و برای پروژه وب هوک ایجاد کند. اگر از یک مخزن خصوصی استفاده می کنید، باید مجوز عمومی مخزن را به جای موارد فرعی مخزن انتخاب کنید:

 

وقتی کارتان تمام شد، روی Generate token در پایین کلیک کنید.

شما به صفحه فهرست نشانه های دسترسی شخصی هدایت می شوید و رمز جدید شما نمایش داده می شود:

 

اکنون توکن را کپی کنید تا بعداً بتوانیم به آن ارجاع دهیم. همانطور که پیام نشان می دهد، پس از خروج از این صفحه، راهی برای بازیابی رمز وجود ندارد.

اکنون که یک نشانه دسترسی شخصی برای حساب GitHub خود دارید، می‌توانیم جنکینز را برای تماشای مخزن پروژه شما پیکربندی کنیم.

رمز دسترسی شخصی GitHub را به جنکینز اضافه کنید

اکنون که یک توکن داریم، باید آن را به سرور جنکینز خود اضافه کنیم تا بتواند به طور خودکار وب هوک ها را راه اندازی کند. با استفاده از حساب مدیریتی که در حین نصب پیکربندی کرده اید، وارد رابط وب جنکینز خود شوید.

روی نام کاربری خود در گوشه سمت راست بالا کلیک کنید تا به تنظیمات کاربری خود دسترسی پیدا کنید و از آنجا روی Credentials در منوی سمت چپ کلیک کنید. :

در صفحه بعد، روی فلش کنار (جهانی) در محدوده جنکینز کلیک کنید. در کادری که ظاهر می‌شود، روی Add credentials کلیک کنید:

برای افزودن اعتبارنامه جدید به فرمی هدایت خواهید شد.

در زیر منوی کشویی Kind، Secret text را انتخاب کنید. در قسمت Secret، رمز دسترسی شخصی GitHub خود را جایگذاری کنید. قسمت توضیحات را پر کنید تا بتوانید بعداً این ورودی را شناسایی کنید. می توانید Scope را به صورت Global و قسمت ID را خالی بگذارید:

وقتی کارتان تمام شد روی دکمه OK کلیک کنید.

اکنون می‌توانید برای کمک به پیکربندی، به این اعتبارنامه‌ها از سایر بخش‌های Jenkins مراجعه کنید.

دسترسی Jenkins به GitHub را تنظیم کنید

در داشبورد اصلی جنکینز، روی Manage Jenkins در منوی سمت چپ کلیک کنید:

در لیست پیوندها در صفحه زیر، روی Configure System کلیک کنید:

در میان گزینه های صفحه بعد حرکت کنید تا قسمت GitHub را پیدا کنید. روی دکمه Add GitHub Server کلیک کنید و سپس GitHub Server را انتخاب کنید:

بخش برای درخواست برخی اطلاعات بیشتر گسترش می یابد. در منوی کشویی Credentials، رمز دسترسی شخصی GitHub خود را که در بخش آخر اضافه کردید انتخاب کنید:

روی دکمه اتصال تست کلیک کنید. جنکینز یک تماس آزمایشی API با حساب شما برقرار می کند و اتصال را تأیید می کند:

پس از اتمام کار، روی دکمه ذخیره کلیک کنید تا تغییرات خود را اعمال کنید.

برنامه نمایش را در حساب GitHub خود تنظیم کنید

برای نشان دادن نحوه استفاده از جنکینز برای آزمایش یک برنامه، از یک برنامه “Hello world” ایجاد شده با Hapi.js استفاده خواهیم کرد. از آنجایی که ما Jenkins را برای واکنش به فشارهای مخزن تنظیم می کنیم، باید کپی خود را از کد نمایشی داشته باشید.

از مخزن پروژه دیدن کنید و روی دکمه Fork در گوشه سمت راست بالا کلیک کنید تا یک کپی از مخزن در حساب خود ایجاد کنید:

یک کپی از مخزن به حساب شما اضافه می شود.

مخزن حاوی یک فایل package.json است که وابستگی های زمان اجرا و توسعه و همچنین نحوه اجرای مجموعه آزمایشی ارائه شده را تعریف می کند. وابستگی ها را می توان با اجرای npm install نصب کرد و تست ها را می توان با استفاده از تست npm اجرا کرد.

ما یک Jenkinsfile را نیز به مخزن اضافه کرده ایم. جنکینز این فایل را می‌خواند تا اقداماتی را که باید در مقابل مخزن برای ساخت، آزمایش یا استقرار اجرا شود، تعیین کند. با استفاده از نسخه اعلانی Jenkins Pipeline DSL نوشته شده است.

Jenkinsfile موجود در مخزن hello-hapi به شکل زیر است:

Jenkinsfile

#!/usr/bin/env groovy

pipeline {

    agent {
        docker {
            image 'node'
            args '-u root'
        }
    }

    stages {
        stage('Build') {
            steps {
                echo 'Building...'
                sh 'npm install'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
                sh 'npm test'
            }
        }
    }
}

خط لوله شامل کل تعریفی است که جنکینز ارزیابی خواهد کرد. در داخل، ما یک بخش agent داریم که مشخص می کند اقدامات در خط لوله کجا اجرا می شوند. برای جداسازی محیط‌هایمان از سیستم میزبان، در کانتینرهای Docker که توسط عامل docker مشخص شده است آزمایش خواهیم کرد.

از آنجایی که Hapi.js یک چارچوب برای Node.js است، از تصویر گره Docker به عنوان پایه خود استفاده خواهیم کرد. کاربر ریشه را در ظرف مشخص می‌کنیم تا کاربر بتواند هم‌زمان در جلد ضمیمه شده حاوی کد بررسی‌شده و هم در حجمی که اسکریپت خروجی خود را روی آن می‌نویسد بنویسد.

در مرحله بعد، فایل دو مرحله، یعنی تقسیمات منطقی کار را تعریف می کند. ما نام اولی را «ساخت» و دومی را «تست» گذاشته‌ایم. مرحله ساخت یک پیام تشخیصی را چاپ می کند و سپس npm install را برای به دست آوردن وابستگی های مورد نیاز اجرا می کند. مرحله تست پیام دیگری را چاپ می کند و سپس تست ها را همانطور که در فایل package.json تعریف شده است اجرا می کند.

اکنون که یک مخزن با یک Jenkinsfile معتبر دارید، می‌توانیم Jenkins را برای تماشای این مخزن راه‌اندازی کنیم و پس از ایجاد تغییرات، فایل را اجرا کنیم.

یک خط لوله جدید در جنکینز ایجاد کنید

در مرحله بعد، می‌توانیم جنکینز را برای استفاده از نشانه دسترسی شخصی GitHub برای تماشای مخزن خود تنظیم کنیم.

در داشبورد اصلی جنکینز، روی آیتم جدید در منوی سمت چپ کلیک کنید:

در قسمت Enter an item name نامی را برای خط لوله جدید خود وارد کنید. پس از آن، Pipeline را به عنوان نوع مورد انتخاب کنید:

برای ادامه روی دکمه OK در پایین کلیک کنید.

در صفحه بعدی، کادر پروژه GitHub را علامت بزنید. در قسمت Project url که ظاهر می شود، URL مخزن GitHub پروژه خود را وارد کنید.

سپس، در بخش Build Triggers، محرک قلاب GitHub را برای کادر نظرسنجی GITScm بررسی کنید:

در قسمت Pipeline، باید به Jenkins بگوییم که خط لوله تعریف شده در Jenkinsfile را در مخزن ما اجرا کند. نوع Definition را از SCM به Pipeline script تغییر دهید.

در بخش جدیدی که ظاهر می شود، Git را در منوی SCM انتخاب کنید. در فیلد URL مخزن که ظاهر می‌شود، دوباره URL را به فورک مخزن وارد کنید:

وقتی کارتان تمام شد، روی دکمه ذخیره در پایین صفحه کلیک کنید.

انجام ساخت اولیه و پیکربندی Webhooks

هنگامی که خط لوله را برای مخزن در رابط تعریف می کنید، جنکینز به طور خودکار وب هوک ها را پیکربندی نمی کند. برای اینکه جنکینز را تحریک کنیم تا هوک های مناسب را تنظیم کند، باید اولین بار یک ساخت دستی انجام دهیم.

در صفحه اصلی خط لوله خود، روی Build Now در منوی سمت چپ کلیک کنید:

ساخت جدید برنامه ریزی خواهد شد. در کادر Build History در گوشه سمت چپ پایین، یک ساخت جدید باید در یک لحظه ظاهر شود. علاوه بر این، نمای مرحله ای در ناحیه اصلی رابط شروع به ترسیم می کند. با تکمیل مراحل مختلف، این پیشرفت اجرای آزمایشی شما را ردیابی می کند:

در کادر Build History، روی عدد مرتبط با ساخت کلیک کنید تا به صفحه جزئیات ساخت بروید. از اینجا، می‌توانید روی دکمه خروجی کنسول در منوی سمت چپ کلیک کنید تا جزئیات مراحل اجرا شده را ببینید:

پس از اتمام کار، روی آیتم بازگشت به پروژه در منوی سمت چپ کلیک کنید تا به نمای خط لوله اصلی بازگردید.

اکنون که یک بار پروژه را ساخته‌ایم، می‌توانیم از جنکینز بخواهیم که وب هوک‌ها را برای پروژه ما ایجاد کند. روی Configure در منوی سمت چپ خط لوله کلیک کنید:

هیچ تغییری در این صفحه لازم نیست، فقط روی دکمه ذخیره در پایین کلیک کنید. اکنون که جنکینز از فرآیند ساخت اولیه اطلاعاتی در مورد پروژه دارد، هنگامی که صفحه را ذخیره می کنید، یک هوک در پروژه GitHub ما ثبت می کند.

می‌توانید با رفتن به مخزن GitHub خود و کلیک کردن روی دکمه تنظیمات، این موضوع را تأیید کنید. در صفحه بعد از منوی کناری روی Webhooks کلیک کنید. شما باید وب هوک سرور جنکینز خود را در رابط اصلی ببینید:

 

اگر به هر دلیلی Jenkins نتوانست قلاب را ثبت کند (مثلاً به دلیل تغییرات API بالادست یا قطعی بین Jenkins و Github)، می‌توانید به سرعت خودتان یکی را با کلیک کردن روی Add webhook و اطمینان از اینکه URL Payload روی https:// تنظیم شده است اضافه کنید. my-jenkins-server:8080/github-webhook و نوع محتوا روی application/json تنظیم شده است، سپس دوباره روی Add webhook در پایین دستور کلیک کنید.

 

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

برای تقریبی این، در صفحه مخزن ما در GitHub، می توانید روی دکمه ایجاد فایل جدید در سمت چپ دکمه سبز رنگ Clone یا دانلود کلیک کنید:

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

وقتی کارتان تمام شد، روی دکمه Commit new file در پایین کلیک کنید.

اگر به رابط Jenkins خود بازگردید، خواهید دید که یک ساخت جدید به طور خودکار شروع شده است:

می‌توانید با ایجاد تعهد به یک کپی محلی از مخزن و بازگرداندن آن به GitHub، ساخت‌های اضافی را شروع کنید.

نتیجه

در این راهنما، ما جنکینز را برای تماشای یک پروژه GitHub پیکربندی کرده ایم و به طور خودکار هر تغییر جدیدی را که انجام می شود آزمایش می کنیم. جنکینز کد را از مخزن می کشد و سپس مراحل ساخت و آزمایش را از داخل کانتینرهای Docker ایزوله اجرا می کند. کد به دست آمده را می توان با افزودن دستورالعمل های اضافی به همان Jenkinsfile مستقر یا ذخیره کرد.

 

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

Jenkinsاتصال به سرور مجازیاتصال به سرور مجازی لینوکسانواع سرور مجازیپیکربندی Webhooksخرید سرور مجازیدسترسی Jenkins به GitHubسرور اتوماسیون متن بازسرور اوبونتو 20.04

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه انجام جستجوی تمام متن در MongoDB

ورود به سایت

معرفی

پرس‌و‌جوهای MongoDB که داده‌ها را با جستجوی تطابق دقیق، استفاده از مقایسه‌های بیشتر یا کمتر یا با استفاده از عبارات منظم فیلتر می‌کنند، در بسیاری از موقعیت‌ها به اندازه کافی خوب کار می‌کنند. با این حال، وقتی صحبت از فیلتر کردن فیلدهای حاوی داده های متنی غنی می شود، این روش ها کوتاهی می کنند.

تصور کنید “دستور پخت قهوه” را در یک موتور جستجوی وب تایپ کرده اید، اما فقط صفحاتی را که حاوی همان عبارت هستند، باز می گرداند. در این مورد، ممکن است دقیقاً چیزی را که به دنبال آن بودید پیدا نکنید، زیرا اکثر وب سایت های محبوب با دستور پخت قهوه ممکن است عبارت دقیق «دستور پخت قهوه» را نداشته باشند. اگر بخواهید این عبارت را در یک موتور جستجوی واقعی وارد کنید، ممکن است صفحاتی با عناوینی مانند «نوشیدنی های قهوه عالی (با دستور پخت!)» یا «نوشیدنی ها و خوراکی های کافی شاپ که می توانید در خانه درست کنید» پیدا کنید. در این مثال‌ها، کلمه «قهوه» وجود دارد، اما عناوین حاوی شکل دیگری از کلمه «رسپی» هستند یا آن را به طور کامل حذف می‌کنند.

این سطح از انعطاف در تطبیق متن با یک عبارت جستجو برای موتورهای جستجوی متن کامل که در جستجوی داده های متنی تخصص دارند، معمول است. چندین ابزار منبع باز تخصصی برای چنین برنامه هایی در حال استفاده وجود دارد که ElasticSearch یک انتخاب بسیار محبوب است. با این حال، برای سناریوهایی که به ویژگی های جستجوی قوی موجود در موتورهای جستجوی اختصاصی نیاز ندارند، برخی از سیستم های مدیریت پایگاه داده همه منظوره قابلیت های جستجوی متن کامل خود را ارائه می دهند.

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

پیش نیازها

برای دنبال کردن این آموزش، شما نیاز دارید:

  • سروری با کاربر معمولی و غیر روت با امتیازات sudo و فایروال پیکربندی شده با UFW. این آموزش با استفاده از سروری که اوبونتو 20.04 را اجرا می کند تأیید شده است، و شما می توانید با دنبال کردن این آموزش اولیه راه اندازی سرور برای اوبونتو 20.04 سرور خود را آماده کنید.
  • MongoDB روی سرور شما نصب شده است.
  • نمونه MongoDB سرور شما با فعال کردن احراز هویت و ایجاد یک کاربر مدیریتی ایمن می شود
  • آشنایی با پرس و جو مجموعه های MongoDB و فیلتر کردن نتایج.

مرحله 1 – آماده سازی داده های تست

برای کمک به یادگیری نحوه انجام جستجوی متن کامل در MongoDB، این مرحله نحوه باز کردن پوسته MongoDB برای اتصال به نمونه MongoDB نصب شده محلی خود را شرح می دهد. همچنین نحوه ایجاد یک مجموعه نمونه و درج چند سند نمونه در آن را توضیح می دهد. این نمونه داده در دستورات و مثال‌هایی در سراسر این راهنما استفاده می‌شود تا به توضیح نحوه استفاده از MongoDB برای جستجوی داده‌های متنی کمک کند.

برای ایجاد این مجموعه نمونه، به عنوان کاربر مدیریتی خود به پوسته MongoDB متصل شوید. این آموزش از قراردادهای آموزش امنیتی MongoDB پیش نیاز پیروی می کند و فرض می کند که نام این کاربر مدیریتی AdminSammy و پایگاه داده احراز هویت آن admin است. مطمئن شوید که این جزئیات را در دستور زیر تغییر دهید تا تنظیمات خود را نشان دهد، اگر متفاوت است:

mongo -u AdminSammy -p –authenticationDatabase admin

رمز عبوری را که در حین نصب تنظیم کرده اید وارد کنید تا به پوسته دسترسی پیدا کنید. پس از ارائه رمز عبور، درخواست شما به علامت بزرگتر از تغییر خواهد کرد:

>

برای درک اینکه چگونه جستجوی متن کامل را می توان برای اسناد در MongoDB اعمال کرد، به مجموعه ای از اسناد نیاز دارید که بتوانید آنها را فیلتر کنید. این راهنما از مجموعه ای از اسناد نمونه استفاده می کند که شامل نام و توضیحات چندین نوع مختلف نوشیدنی قهوه است. این اسناد همان فرمت سند نمونه زیر را دارند که نوشیدنی قهوه کوبایی را توصیف می کند:

Example Cafecito document

{
    "name": "Cafecito",
    "description": "A sweet and rich Cuban hot coffee made by topping an espresso shot with a thick sugar cream foam."
}

این سند شامل دو فیلد است: نام نوشیدنی قهوه و توضیحات طولانی تر که اطلاعات پس زمینه ای در مورد نوشیدنی و مواد تشکیل دهنده آن ارائه می دهد.

متد insertMany() زیر را در پوسته MongoDB اجرا کنید تا مجموعه‌ای به نام recipes ایجاد کنید و در همان زمان، پنج سند نمونه را در آن قرار دهید:

db.recipes.insertMany([
{“name”: “Cafecito”, “description”: “A sweet and rich Cuban hot coffee made by topping an espresso shot with a thick sugar cream foam.”},
{“name”: “New Orleans Coffee”, “description”: “Cafe Noir from New Orleans is a spiced, nutty coffee made with chicory.”},
{“name”: “Affogato”, “description”: “An Italian sweet dessert coffee made with fresh-brewed espresso and vanilla ice cream.”},
{“name”: “Maple Latte”, “description”: “A wintertime classic made with espresso and steamed milk and sweetened with some maple syrup.”},
{“name”: “Pumpkin Spice Latte”, “description”: “It wouldn’t be autumn without pumpkin spice lattes made with espresso, steamed milk, cinnamon spices, and pumpkin puree.”}
])

 

این متد لیستی از شناسه‌های شی اختصاص داده شده به اشیاء تازه درج شده را برمی‌گرداند:

 

Output

{
        "acknowledged" : true,
        "insertedIds" : [
            ObjectId("61895d2787f246b334ece911"),
            ObjectId("61895d2787f246b334ece912"),
            ObjectId("61895d2787f246b334ece913"),
            ObjectId("61895d2787f246b334ece914"),
            ObjectId("61895d2787f246b334ece915")
        ]
}

می توانید با اجرای متد find() در مجموعه دستور العمل ها بدون آرگومان بررسی کنید که اسناد به درستی درج شده اند. با این کار تمام اسناد موجود در مجموعه بازیابی می شود:

db.recipes.find()

 

Output

{ "_id" : ObjectId("61895d2787f246b334ece911"), "name" : "Cafecito", "description" : "A sweet and rich Cuban hot coffee made by topping an espresso shot with a thick sugar cream foam." }
. . .

با داده های نمونه در محل، آماده شروع یادگیری نحوه استفاده از ویژگی های جستجوی متن کامل MongoDB هستید.

مرحله 2 – ایجاد یک فهرست متن

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

با این حال، نمایه متنی، نوع خاصی از نمایه است که برای تسهیل بیشتر جستجوی فیلدهای حاوی داده های متنی استفاده می شود. هنگامی که کاربر یک فهرست متنی ایجاد می کند، MongoDB به طور خودکار هر کلمه توقف خاص زبان را از جستجو حذف می کند. این بدان معنی است که MongoDB رایج ترین کلمات برای زبان داده شده (در انگلیسی، کلماتی مانند “a”، “an”، “the” یا “this”) را نادیده می گیرد.

MongoDB همچنین نوعی پسوند stemming را در جستجوها پیاده سازی خواهد کرد. این شامل شناسایی قسمت ریشه عبارت جستجو شده توسط MongoDB و استفاده از سایر اشکال دستور زبان آن ریشه (که با افزودن پسوندهای رایج مانند “-ing”، “-ed” یا شاید “-er” ایجاد شده است) را به عنوان معادل ریشه برای کلمه جستجو می کند.

به لطف این ویژگی‌ها و سایر ویژگی‌ها، MongoDB می‌تواند با انعطاف‌پذیری بیشتری از پرسش‌های نوشته شده به زبان طبیعی پشتیبانی کند و نتایج بهتری ارائه دهد.

شما فقط می توانید یک فهرست متنی برای هر مجموعه MongoDB ایجاد کنید، اما این فهرست را می توان با استفاده از بیش از یک فیلد ایجاد کرد. در مجموعه مثال ما، متن مفیدی در هر دو قسمت نام و توضیحات هر سند ذخیره شده است. ایجاد یک فهرست متنی برای هر دو فیلد می تواند مفید باشد.

متد ()createIndex زیر را اجرا کنید که یک فهرست متنی برای دو فیلد ایجاد می کند:

db.recipes.createIndex({ “name”: “text”, “description”: “text” });

برای هر یک از دو فیلد، نام و توضیحات، نوع فهرست روی متن تنظیم می‌شود و به MongoDB می‌گوید یک فهرست متنی متناسب با جستجوی متن کامل بر اساس این فیلدها ایجاد کند. خروجی ایجاد ایندکس را تایید می کند:

 

Output

{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}

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

مرحله 3 – جستجو برای یک یا چند کلمه جداگانه

شاید رایج ترین مشکل جستجو جستجوی اسنادی باشد که حاوی یک یا چند کلمه جداگانه هستند.

به طور معمول، کاربران انتظار دارند که موتور جستجو در تعیین محل نمایش عبارات جستجوی معین انعطاف پذیر باشد. به عنوان مثال، اگر بخواهید از هر موتور جستجوی وب محبوبی استفاده کنید و عبارت «قهوه شیرین تند» را تایپ کنید، احتمالاً انتظار نتایجی را ندارید که حاوی این سه کلمه به همان ترتیب باشد. احتمال بیشتری وجود دارد که انتظار داشته باشید لیستی از صفحات وب حاوی کلمات “قهوه”، “شیرین” و “ادویه” باشد اما لزوماً بلافاصله در نزدیکی یکدیگر نیستند.

همچنین این روشی است که MongoDB هنگام استفاده از نمایه های متنی به پرس و جوهای جستجوی معمولی نزدیک می شود. در این مرحله توضیح داده می شود که MongoDB چگونه پرس و جوهای جستجو را با چند مثال تفسیر می کند.

برای شروع، بگویید که می‌خواهید نوشیدنی‌های قهوه را با ادویه در دستور غذا جستجو کنید، بنابراین با استفاده از دستور زیر کلمه spiced را به تنهایی جستجو کنید:

db.recipes.find({ $text: { $search: “spiced” } });

توجه داشته باشید که نحو هنگام استفاده از جستجوی تمام متن کمی با پرس و جوهای معمولی متفاوت است. نام فیلدهای فردی – مانند نام یا توضیحات – در سند فیلتر ظاهر نمی شوند. در عوض، کوئری از عملگر $text استفاده می‌کند و به MongoDB می‌گوید که این کوئری قصد دارد از فهرست متنی که قبلا ایجاد کرده‌اید استفاده کند. لازم نیست بیشتر از آن مشخص باشید، زیرا همانطور که به یاد دارید، یک مجموعه ممکن است فقط یک فهرست متنی داشته باشد. در داخل سند جاسازی شده برای این فیلتر، اپراتور $search است که عبارت جستجو را به عنوان مقدار آن در نظر گرفته است. در این مثال، پرس و جو یک کلمه است: spiced.

پس از اجرای این دستور، MongoDB لیستی از اسناد زیر را تولید می کند:

 

Output

{ "_id" : ObjectId("61895d2787f246b334ece915"), "name" : "Pumpkin Spice Latte", "description" : "It wouldn't be autumn without pumpkin spice lattes made with espresso, steamed milk, cinnamon spices, and pumpkin puree." }
{ "_id" : ObjectId("61895d2787f246b334ece912"), "name" : "New Orleans Coffee", "description" : "Cafe Noir from New Orleans is a spiced, nutty coffee made with chicory." }

دو سند در مجموعه نتایج وجود دارد که هر دو حاوی کلماتی شبیه عبارت جستجو هستند. در حالی که سند قهوه نیواورلئان دارای کلمه تند در توضیحات است، سند Pumpkin Spice Late چنین نیست.

صرف نظر از این، به لطف استفاده MongoDB از stemming، همچنان با این کوئری بازگردانده شد. MongoDB کلمه spiced را به صرف ادویه حذف کرد، ادویه را در فهرست جستجو کرد و همچنین آن را ریشه‌یابی کرد. به همین دلیل، کلمات ادویه و ادویه در سند Pumpkin Spice Late با عبارت جستجو با موفقیت مطابقت داشت، حتی اگر هیچ یک از آن کلمات را به طور خاص جستجو نکردید.

حالا، فرض کنید به نوشیدنی های اسپرسو علاقه خاصی دارید. سعی کنید اسناد را با یک پرس و جوی دو کلمه ای، اسپرسوی تند، جستجو کنید تا به دنبال قهوه ای تند و مبتنی بر اسپرسو بگردید.

db.recipes.find({ $text: { $search: “spiced espresso” } });

لیست نتایج این بار طولانی تر از قبل است:

 

Output

{ "_id" : ObjectId("61895d2787f246b334ece914"), "name" : "Maple Latte", "description" : "A wintertime classic made with espresso and steamed milk and sweetened with some maple syrup." }
{ "_id" : ObjectId("61895d2787f246b334ece913"), "name" : "Affogato", "description" : "An Italian sweet dessert coffee made with fresh-brewed espresso and vanilla ice cream." }
{ "_id" : ObjectId("61895d2787f246b334ece911"), "name" : "Cafecito", "description" : "A sweet and rich Cuban hot coffee made by topping an espresso shot with a thick sugar cream foam." }
{ "_id" : ObjectId("61895d2787f246b334ece915"), "name" : "Pumpkin Spice Latte", "description" : "It wouldn't be autumn without pumpkin spice lattes made with espresso, steamed milk, cinnamon spices, and pumpkin puree." }
{ "_id" : ObjectId("61895d2787f246b334ece912"), "name" : "New Orleans Coffee", "description" : "Cafe Noir from New Orleans is a spiced, nutty coffee made with chicory." }

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

در این مرحله، یاد گرفتید که چگونه از یک یا چند کلمه به عنوان جستجوی متنی استفاده کنید، چگونه MongoDB چندین کلمه را با یک عملیات OR منطقی به هم متصل می کند، و چگونه MongoDB stemming را انجام می دهد. در مرحله بعد، از یک عبارت کامل در یک عبارت جستجوی متنی استفاده می‌کنید و شروع به استفاده از استثناها برای محدود کردن بیشتر نتایج جستجو می‌کنید.

مرحله 4 – جستجوی عبارات کامل و استفاده از موارد استثنا

جستجوی کلمات جداگانه ممکن است نتایج بسیار زیادی را به همراه داشته باشد، یا ممکن است نتایج به اندازه کافی دقیق نباشد. در این مرحله، از جستجوی عبارت و حذف برای کنترل دقیق‌تر نتایج جستجو استفاده می‌کنید.

فرض کنید شیرینی دارید، بیرون گرم است، و قهوه ای که روی آن بستنی ریخته شده است، به نظر یک خوراکی خوب است. سعی کنید یک قهوه بستنی را با استفاده از عبارت جستجوی اولیه همانطور که قبلا ذکر شد پیدا کنید:

db.recipes.find({ $text: { $search: “ice cream” } });

پایگاه داده دو دستور پخت قهوه را برمی گرداند:

 

Output

{ "_id" : ObjectId("61895d2787f246b334ece913"), "name" : "Affogato", "description" : "An Italian sweet dessert coffee made with fresh-brewed espresso and vanilla ice cream." }
{ "_id" : ObjectId("61895d2787f246b334ece911"), "name" : "Cafecito", "description" : "A sweet and rich Cuban hot coffee made by topping an espresso shot with a thick sugar cream foam." }

در حالی که سند Affogato با انتظارات شما مطابقت دارد، Cafecito با بستنی درست نمی شود. موتور جستجو با استفاده از عملیات منطقی OR، نتیجه دوم را فقط به این دلیل پذیرفت که کلمه کرم در توضیحات آمده است.

برای اینکه به MongoDB بگویید که به دنبال بستنی به عنوان یک عبارت کامل هستید و نه دو کلمه جداگانه، از عبارت زیر استفاده کنید:

db.recipes.find({ $text: { $search: “\”ice cream\”” } });

به علامت‌های معکوس قبل از هر یک از نقل‌قول‌های دوگانه اطراف عبارت: \”ice cream\” توجه کنید. عبارت جستجویی که اجرا می‌کنید «ice cream» است، با دو نقل قول نشان‌دهنده عبارتی است که باید دقیقاً مطابقت داشته باشد. اسلش‌های معکوس (\) از گیومه‌های دوتایی فرار می‌کنند، بنابراین به عنوان بخشی از نحو JSON در نظر گرفته نمی‌شوند، زیرا می‌توانند در مقدار عملگر $search ظاهر شوند.

این بار، MongoDB یک نتیجه را برمی گرداند:

 

Output

{ "_id" : ObjectId("61895d2787f246b334ece913"), "name" : "Affogato", "description" : "An Italian sweet dessert coffee made with fresh-brewed espresso and vanilla ice cream." }

این سند دقیقاً با عبارت جستجو مطابقت دارد و نه خامه و نه یخ به تنهایی برای به حساب آوردن یک مسابقه کافی نیست.

یکی دیگر از ویژگی های مفید جستجوی متن کامل، اصلاح کننده حذف است. برای نشان دادن نحوه عملکرد، ابتدا پرس و جو زیر را اجرا کنید تا لیستی از تمام نوشیدنی های قهوه موجود در مجموعه بر اساس اسپرسو دریافت کنید:

db.recipes.find({ $text: { $search: “espresso” } });

این پرس و جو چهار سند را برمی گرداند:

 

Output

{ "_id" : ObjectId("61895d2787f246b334ece914"), "name" : "Maple Latte", "description" : "A wintertime classic made with espresso and steamed milk and sweetened with some maple syrup." }
{ "_id" : ObjectId("61895d2787f246b334ece913"), "name" : "Affogato", "description" : "An Italian sweet dessert coffee made with fresh-brewed espresso and vanilla ice cream." }
{ "_id" : ObjectId("61895d2787f246b334ece915"), "name" : "Pumpkin Spice Latte", "description" : "It wouldn't be autumn without pumpkin spice lattes made with espresso, steamed milk, cinnamon spices, and pumpkin puree." }
{ "_id" : ObjectId("61895d2787f246b334ece911"), "name" : "Cafecito", "description" : "A sweet and rich Cuban hot coffee made by topping an espresso shot with a thick sugar cream foam." }

توجه داشته باشید که دو تا از این نوشیدنی ها با شیر سرو می شوند، اما فرض کنید شما یک نوشیدنی بدون شیر می خواهید. این موردی است که در آن محرومیت ها می توانند مفید باشند. در یک جستار، می‌توانید کلماتی را که می‌خواهید در نتایج نشان داده شوند، با کلماتی که می‌خواهید حذف شوند، با اضافه کردن کلمه یا عبارتی که می‌خواهید حذف کنید با علامت منفی (-) بپیوندید.

به عنوان مثال، فرض کنید برای جستجوی قهوه‌های اسپرسو که حاوی شیر نیستند، عبارت زیر را اجرا می‌کنید:

db.recipes.find({ $text: { $search: “espresso -milk” } });

با این پرس و جو، دو سند از نتایج برگشت داده شده قبلی حذف می شوند:

 

Output

{ "_id" : ObjectId("61895d2787f246b334ece913"), "name" : "Affogato", "description" : "An Italian sweet dessert coffee made with fresh-brewed espresso and vanilla ice cream." }
{ "_id" : ObjectId("61895d2787f246b334ece911"), "name" : "Cafecito", "description" : "A sweet and rich Cuban hot coffee made by topping an espresso shot with a thick sugar cream foam." }

شما همچنین می توانید عبارات کامل را حذف کنید. برای جستجوی قهوه های بدون بستنی، می توانید -“ice cream” را در عبارت جستجوی خود قرار دهید. باز هم، باید از نقل قول های دوگانه با اسلش های معکوس فرار کنید، مانند این:

db.recipes.find({ $text: { $search: “espresso -\”ice cream\”” } });

 

Output

{ "_id" : ObjectId("61d48c31a285f8250c8dd5e6"), "name" : "Maple Latte", "description" : "A wintertime classic made with espresso and steamed milk and sweetened with some maple syrup." }
{ "_id" : ObjectId("61d48c31a285f8250c8dd5e7"), "name" : "Pumpkin Spice Latte", "description" : "It wouldn't be autumn without pumpkin spice lattes made with espresso, steamed milk, cinnamon spices, and pumpkin puree." }
{ "_id" : ObjectId("61d48c31a285f8250c8dd5e3"), "name" : "Cafecito", "description" : "A sweet and rich Cuban hot coffee made by topping an espresso shot with a thick sugar cream foam." }

اکنون که یاد گرفتید چگونه اسناد را بر اساس عبارتی متشکل از چند کلمه فیلتر کنید و چگونه کلمات و عبارات خاصی را از نتایج جستجو حذف کنید، می توانید خود را با امتیاز جستجوی تمام متن MongoDB آشنا کنید.

مرحله 5 – امتیاز دادن به نتایج و مرتب سازی بر اساس امتیاز

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

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

یک بار دیگر اسپرسوی تند را جستجو کنید، اما این بار MongoDB امتیاز مربوط به جستجوی هر نتیجه را نیز بازگردانید. برای انجام این کار، می توانید پس از سند فیلتر پرس و جو یک طرح اضافه کنید:

db.recipes.find(
{ $text: { $search: “spiced espresso” } },
{ score: { $meta: “textScore” } }
)

طرح ریزی { score: {$meta: “textScore” } } از عملگر $meta استفاده می کند، نوع خاصی از طرح ریزی که ابرداده خاصی را از اسناد برگشتی برمی گرداند. این مثال ابرداده textScore اسناد را برمی‌گرداند، یکی از ویژگی‌های داخلی موتور جستجوی متن کامل MongoDB که حاوی امتیاز مربوط به جستجو است.

پس از اجرای پرس و جو، اسناد برگشتی شامل یک فیلد جدید به نام score می شود، همانطور که در سند فیلتر مشخص شده است:

 

Output

{ "_id" : ObjectId("61895d2787f246b334ece913"), "name" : "Affogato", "description" : "An Italian sweet dessert coffee made with fresh-brewed espresso and vanilla ice cream.", "score" : 0.5454545454545454 }
{ "_id" : ObjectId("61895d2787f246b334ece911"), "name" : "Cafecito", "description" : "A sweet and rich Cuban hot coffee made by topping an espresso shot with a thick sugar cream foam.", "score" : 0.5384615384615384 }
{ "_id" : ObjectId("61895d2787f246b334ece914"), "name" : "Maple Latte", "description" : "A wintertime classic made with espresso and steamed milk and sweetened with some maple syrup.", "score" : 0.55 }
{ "_id" : ObjectId("61895d2787f246b334ece912"), "name" : "New Orleans Coffee", "description" : "Cafe Noir from New Orleans is a spiced, nutty coffee made with chicory.", "score" : 0.5454545454545454 }
{ "_id" : ObjectId("61895d2787f246b334ece915"), "name" : "Pumpkin Spice Latte", "description" : "It wouldn't be autumn without pumpkin spice lattes made with espresso, steamed milk, cinnamon spices, and pumpkin puree.", "score" : 2.0705128205128203 }

توجه کنید که امتیاز Pumpkin Spice Latte چقدر بالاتر است، تنها نوشیدنی قهوه که حاوی کلمات spiced و اسپرسو است. با توجه به امتیاز مرتبط MongoDB، مرتبط ترین سند برای آن پرس و جو است. با این حال، به طور پیش فرض، نتایج به ترتیب مرتبط بودن برگردانده نمی شوند.

برای تغییر آن، می توانید یک بند sort() به پرس و جو اضافه کنید، مانند این:

db.recipes.find(
{ $text: { $search: “spiced espresso” } },
{ score: { $meta: “textScore” } }
).sort(
{ score: { $meta: “textScore” } }
);

نحو برای سند مرتب‌سازی مانند پروژکشن است. اکنون لیست اسناد یکسان است، اما ترتیب آنها متفاوت است:

 

Output

{ "_id" : ObjectId("61895d2787f246b334ece915"), "name" : "Pumpkin Spice Latte", "description" : "It wouldn't be autumn without pumpkin spice lattes made with espresso, steamed milk, cinnamon spices, and pumpkin puree.", "score" : 2.0705128205128203 }
{ "_id" : ObjectId("61895d2787f246b334ece914"), "name" : "Maple Latte", "description" : "A wintertime classic made with espresso and steamed milk and sweetened with some maple syrup.", "score" : 0.55 }
{ "_id" : ObjectId("61895d2787f246b334ece913"), "name" : "Affogato", "description" : "An Italian sweet dessert coffee made with fresh-brewed espresso and vanilla ice cream.", "score" : 0.5454545454545454 }
{ "_id" : ObjectId("61895d2787f246b334ece912"), "name" : "New Orleans Coffee", "description" : "Cafe Noir from New Orleans is a spiced, nutty coffee made with chicory.", "score" : 0.5454545454545454 }
{ "_id" : ObjectId("61895d2787f246b334ece911"), "name" : "Cafecito", "description" : "A sweet and rich Cuban hot coffee made by topping an espresso shot with a thick sugar cream foam.", "score" : 0.5384615384615384 }

سند Pumpkin Spice Latte به عنوان اولین نتیجه ظاهر می شود زیرا دارای بالاترین امتیاز مرتبط است.

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

نتیجه

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

توجه داشته باشید که اصلاح‌کننده‌های جستجوی بیشتری – مانند حساسیت حروف کوچک و بزرگ و پشتیبانی از زبان‌های مختلف – در یک فهرست متنی واحد وجود دارد.

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از Ansible Vault برای محافظت از داده های حساس Playbook

ورود به سایت

معرفی

Ansible Vault قابلیتی است که به کاربران امکان می دهد مقادیر و ساختارهای داده را در پروژه های Ansible رمزگذاری کنند. این امکان را فراهم می کند تا داده های حساسی را که برای اجرای موفقیت آمیز بازی های Ansible لازم است، اما نباید به صورت عمومی قابل مشاهده باشند، مانند گذرواژه ها یا کلیدهای خصوصی، ایمن کنید. Ansible به طور خودکار محتوای رمزگذاری شده در طاق را در زمان اجرا پس از ارائه کلید رمزگشایی می کند.

در این راهنما، نحوه استفاده از Ansible Vault را نشان خواهیم داد و برخی از روش‌های توصیه شده برای ساده‌سازی استفاده از آن را بررسی خواهیم کرد. ما از سرور اوبونتو 20.04 برای ماشین کنترلی Ansible استفاده خواهیم کرد. به هاست راه دور نیاز نیست.

پیش نیازها

برای پیگیری، به یک سرور اوبونتو 20.04 با یک کاربر غیر ریشه با امتیازات sudo نیاز دارید. شما می توانید راهنمای راه اندازی سرور اولیه Ubuntu 20.04 ما را دنبال کنید تا کاربری با مجوزهای مناسب ایجاد کنید.

در سرور، باید Ansible را نصب و پیکربندی کنید. برای نصب بسته های مناسب می توانید آموزش نصب Ansible در اوبونتو 20.04 را دنبال کنید.

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

Ansible Vault چیست؟

Ansible Vault مکانیزمی است که به محتوای رمزگذاری شده اجازه می دهد تا به طور شفاف در جریان های کاری Ansible گنجانده شود. ابزاری به نام ansible-vault داده‌های محرمانه به نام Secrets را با رمزگذاری روی دیسک ایمن می‌کند. برای ادغام این اسرار با داده‌های معمولی Ansible، هر دو دستور ansible و ansible-playbook، به ترتیب برای اجرای وظایف موقت و playbook ساختاریافته، از رمزگشایی محتوای رمزگذاری‌شده در طاق در زمان اجرا پشتیبانی می‌کنند.

Vault با جزئیات در سطح فایل پیاده سازی می شود، به این معنی که فایل های جداگانه یا رمزگذاری شده یا غیر رمزگذاری شده هستند. از الگوریتم AES256 برای ارائه رمزگذاری متقارن کلید شده به رمز عبور ارائه شده توسط کاربر استفاده می کند. این بدان معنی است که رمز عبور یکسان برای رمزگذاری و رمزگشایی محتوا استفاده می شود، که از نقطه نظر قابلیت استفاده مفید است. Ansible قادر به شناسایی و رمزگشایی هر فایل رمزگذاری شده در طاقچه ای است که در حین اجرای یک کتاب بازی یا کار پیدا می کند.

اکنون که کمی در مورد Vault چیست، می‌توانیم درباره ابزارهایی که Ansible ارائه می‌کند و نحوه استفاده از Vault با گردش‌های کاری موجود بحث کنیم.

تنظیم ویرایشگر Ansible Vault

قبل از استفاده از دستور ansible-vault، ایده خوبی است که ویرایشگر متن مورد نظر خود را مشخص کنید. تعدادی از دستورات Vault شامل باز کردن یک ویرایشگر برای دستکاری محتوای یک فایل رمزگذاری شده است. Ansible به متغیر محیط EDITOR نگاه می کند تا ویرایشگر مورد نظر شما را پیدا کند. اگر این تنظیم نشده باشد، به طور پیش فرض روی vi خواهد بود.

اگر نمی خواهید با ویرایشگر vi ویرایش کنید، باید متغیر EDITOR را در محیط خود تنظیم کنید.

برای تنظیم ویرایشگر برای یک فرمان فردی، دستور را با انتساب متغیر محیطی به صورت زیر اضافه کنید:

EDITOR=nano ansible-vault . . .

برای تداوم این موضوع، فایل ~/.bashrc خود را باز کنید:

nano ~/.bashrc

ویرایشگر مورد نظر خود را با افزودن یک تخصیص EDITOR به انتهای فایل مشخص کنید:

~/.bashrc

export EDITOR=nano

پس از اتمام کار فایل را ذخیره کرده و ببندید.

برای خواندن تغییر در جلسه فعلی، فایل را دوباره منبع کنید:

. ~/.bashrc

برای بررسی اینکه تنظیمات شما اعمال شده است، متغیر EDITOR را نمایش دهید:

echo $EDITOR

 

Output

nano

اکنون که ویرایشگر دلخواه خود را ایجاد کرده اید، می توانیم عملیات های موجود را با دستور ansible-vault مورد بحث قرار دهیم.

نحوه مدیریت فایل های حساس با ansible-vault

دستور ansible-vault رابط اصلی برای مدیریت محتوای رمزگذاری شده در Ansible است. این دستور در ابتدا برای رمزگذاری فایل ها استفاده می شود و سپس برای مشاهده، ویرایش یا رمزگشایی داده ها استفاده می شود.

ایجاد فایل های رمزگذاری شده جدید

برای ایجاد یک فایل جدید رمزگذاری شده با Vault، از دستور ansible-vault create استفاده کنید. نام فایلی را که می خواهید ایجاد کنید ارسال کنید. به عنوان مثال، برای ایجاد یک فایل YAML رمزگذاری شده به نام vault.yml برای ذخیره متغیرهای حساس، می توانید تایپ کنید:

ansible-vault create vault.yml

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

 

Output

New Vault password: 
Confirm New Vault password:

هنگامی که رمز عبور خود را تأیید کردید، Ansible بلافاصله یک پنجره ویرایش باز می کند که در آن می توانید مطالب مورد نظر خود را وارد کنید.

برای آزمایش عملکرد رمزگذاری، متن آزمایشی را وارد کنید:

vault.yml

Secret information

هنگامی که فایل را ببندید، Ansible محتویات را رمزگذاری می کند. اگر فایل را بررسی کنید، به جای دیدن کلماتی که تایپ کرده اید، یک بلوک رمزگذاری شده خواهید دید:

cat vault.yml

 

Output

$ANSIBLE_VAULT;1.1;AES256
65316332393532313030636134643235316439336133363531303838376235376635373430336333
3963353630373161356638376361646338353763363434360a363138376163666265336433633664
30336233323664306434626363643731626536643833336638356661396364313666366231616261
3764656365313263620a383666383233626665376364323062393462373266663066366536306163
31643731343666353761633563633634326139396230313734333034653238303166

ما می‌توانیم برخی از اطلاعات هدر را ببینیم که Ansible برای اطلاع از نحوه مدیریت فایل استفاده می‌کند و به دنبال آن محتویات رمزگذاری‌شده که به صورت اعداد نمایش داده می‌شوند.

رمزگذاری فایل های موجود

اگر از قبل فایلی دارید که می خواهید با Vault رمزگذاری کنید، به جای آن از دستور encrypt ansible-vault استفاده کنید.

برای آزمایش، می‌توانیم با تایپ کردن یک فایل نمونه ایجاد کنیم:

echo ‘unencrypted stuff’ > encrypt_me.txt

اکنون می توانید فایل موجود را با تایپ کردن رمزگذاری کنید:

ansible-vault encrypt encrypt_me.txt

مجدداً از شما خواسته می شود رمز عبور را ارائه و تأیید کنید. پس از آن، یک پیام رمزگذاری را تایید می کند:

 

Output

New Vault password: 
Confirm New Vault password:
Encryption successful

به جای باز کردن یک پنجره ویرایش، ansible-vault محتویات فایل را رمزگذاری می کند و آن را روی دیسک می نویسد و نسخه رمزگذاری نشده را جایگزین می کند.

اگر فایل را بررسی کنیم، باید یک الگوی رمزگذاری شده مشابه را ببینیم:

cat encrypt_me.txt

 

Output

$ANSIBLE_VAULT;1.1;AES256
66633936653834616130346436353865303665396430383430353366616263323161393639393136
3737316539353434666438373035653132383434303338640a396635313062386464306132313834
34313336313338623537333332356231386438666565616537616538653465333431306638643961
3636663633363562320a613661313966376361396336383864656632376134353039663662666437
39393639343966363565636161316339643033393132626639303332373339376664

همانطور که می بینید، Ansible محتوای موجود را به همان روشی که فایل های جدید را رمزگذاری می کند، رمزگذاری می کند.

مشاهده فایل های رمزگذاری شده

گاهی اوقات، ممکن است لازم باشد به محتویات یک فایل رمزگذاری شده بدون نیاز به ویرایش یا نوشتن آن در سیستم فایل بدون رمزگذاری، ارجاع دهید. دستور ansible-vault view محتویات یک فایل را به صورت استاندارد تغذیه می کند. به طور پیش فرض، این بدان معنی است که محتویات در ترمینال نمایش داده می شوند.

فایل رمزگذاری شده vault را به دستور ارسال کنید:

ansible-vault view vault.yml

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

 

Output

Vault password:
Secret information

همانطور که می بینید، درخواست رمز عبور در خروجی محتویات فایل مخلوط می شود. هنگام استفاده از نمای ansible-vault در فرآیندهای خودکار این را در نظر داشته باشید.

ویرایش فایل های رمزگذاری شده

هنگامی که نیاز به ویرایش یک فایل رمزگذاری شده دارید، از دستور ansible-vault edit استفاده کنید:

ansible-vault edit vault.yml

 

از شما رمز عبور فایل خواسته می شود. پس از وارد کردن آن، Ansible فایل را در یک پنجره ویرایش باز می کند، جایی که می توانید تغییرات لازم را انجام دهید.

پس از ذخیره، محتویات جدید با استفاده از رمز رمزگذاری فایل دوباره رمزگذاری شده و روی دیسک نوشته می شود.

رمزگشایی دستی فایل های رمزگذاری شده

برای رمزگشایی یک فایل رمزگذاری شده vault، از دستور ansible-vault decrypt استفاده کنید.

نام فایل رمزگذاری شده را ارسال کنید:

ansible-vault decrypt vault.yml

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

 

Output

Vault password:
Secret information

همانطور که می بینید، درخواست رمز عبور در خروجی محتویات فایل مخلوط می شود. هنگام استفاده از نمای ansible-vault در فرآیندهای خودکار این را در نظر داشته باشید.

ویرایش فایل های رمزگذاری شده

هنگامی که نیاز به ویرایش یک فایل رمزگذاری شده دارید، از دستور ansible-vault edit استفاده کنید:

ansible-vault edit vault.yml

از شما رمز عبور فایل خواسته می شود. پس از وارد کردن آن، Ansible فایل را در یک پنجره ویرایش باز می کند، جایی که می توانید تغییرات لازم را انجام دهید.

پس از ذخیره، محتویات جدید با استفاده از رمز رمزگذاری فایل دوباره رمزگذاری شده و روی دیسک نوشته می شود.

رمزگشایی دستی فایل های رمزگذاری شده

برای رمزگشایی یک فایل رمزگذاری شده vault، از دستور ansible-vault decrypt استفاده کنید.

نام فایل رمزگذاری شده را ارسال کنید:

ansible-vault decrypt vault.yml

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

 

Output

Vault password:
Decryption successful

اگر دوباره فایل را مشاهده کنید، به جای رمزگذاری طاق، باید محتوای واقعی فایل را ببینید:

cat vault.yml

 

Output

Secret information

فایل شما اکنون روی دیسک رمزگذاری نشده است. پس از پایان کار، مطمئن شوید که اطلاعات حساس را حذف کرده یا فایل را دوباره رمزگذاری کنید.

تغییر رمز عبور فایل های رمزگذاری شده

اگر نیاز به تغییر رمز عبور یک فایل رمزگذاری شده دارید، از دستور ansible-vault rekey استفاده کنید:

ansible-vault rekey encrypt_me.txt

هنگامی که دستور را وارد می کنید، ابتدا رمز عبور فعلی فایل از شما خواسته می شود:

 

Output

Vault password:

پس از وارد کردن آن، از شما خواسته می شود رمز عبور جدید صندوق را انتخاب و تأیید کنید:

 

Output

Vault password:
New Vault password:
Confirm New Vault password:

هنگامی که رمز عبور جدید را با موفقیت تأیید کردید، پیامی مبنی بر موفقیت در فرآیند رمزگذاری مجدد دریافت خواهید کرد:

 

Output

Rekey successful

اکنون فایل باید با استفاده از رمز عبور جدید قابل دسترسی باشد. رمز عبور قدیمی دیگر کار نخواهد کرد.

اجرای Ansible با فایل‌های رمزگذاری‌شده Vault

پس از اینکه اطلاعات حساس خود را با Vault رمزگذاری کردید، می توانید از فایل ها با ابزار معمولی Ansible استفاده کنید. دستورهای ansible و ansible-playbook هر دو می‌دانند چگونه فایل‌های محافظت‌شده در صندوق را با در نظر گرفتن رمز عبور صحیح رمزگشایی کنند. بسته به نیاز شما چند راه مختلف برای ارائه رمز عبور برای این دستورات وجود دارد.

برای پیگیری، به یک فایل رمزگذاری شده در طاق نیاز دارید. با تایپ کردن می توانید یکی ایجاد کنید:

ansible-vault create secret_key

رمز عبور را انتخاب و تأیید کنید. هر محتوای ساختگی را که می خواهید پر کنید:

secret_key

confidential data

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

همچنین می توانیم یک فایل میزبان موقت به عنوان موجودی ایجاد کنیم:

nano hosts

ما فقط لوکال هاست Ansible را به آن اضافه می کنیم. برای آماده شدن برای مرحله بعدی، آن را در گروه [پایگاه داده] قرار می دهیم:

hosts

[database]
localhost ansible_connection=local

پس از اتمام کار فایل را ذخیره کرده و ببندید.

در مرحله بعد، یک فایل ansible.cfg در دایرکتوری فعلی ایجاد کنید، اگر قبلاً وجود نداشته باشد:

nano ansible.cfg

در حال حاضر، فقط یک بخش [پیش‌فرض] اضافه کنید و Ansible را به موجودی که ایجاد کردیم اضافه کنید:

ansible.cfg

[defaults]
inventory = ./hosts

وقتی آماده شدید، ادامه دهید.

استفاده از یک اعلان تعاملی

ساده ترین راه برای رمزگشایی محتوا در زمان اجرا این است که Ansible اعتبار مناسب را از شما بخواهد. می توانید این کار را با افزودن –ask-vault-pass به هر دستور ansible یا ansible-playbook انجام دهید. Ansible از شما رمز عبوری می خواهد که از آن برای رمزگشایی هر محتوای محافظت شده در خزانه که پیدا می کند استفاده می کند.

به عنوان مثال، اگر ما نیاز به کپی کردن محتویات یک فایل رمزگذاری شده در طاقچه در یک میزبان داشتیم، می‌توانیم این کار را با ماژول کپی و پرچم –ask-vault-pass انجام دهیم. اگر فایل واقعا حاوی داده های حساس است، به احتمال زیاد می خواهید دسترسی به میزبان راه دور را با محدودیت های مجوز و مالکیت قفل کنید.

ansible –ask-vault-pass -bK -m copy -a ‘src=secret_key dest=/tmp/secret_key mode=0600 owner=root group=root’ localhost

وظیفه ما مشخص می کند که مالکیت فایل باید به روت تغییر کند، بنابراین امتیازات مدیریتی مورد نیاز است. پرچم -bK به Ansible می گوید که رمز عبور sudo را برای میزبان مورد نظر درخواست کند، بنابراین از شما رمز عبور sudo خواسته می شود. سپس از شما رمز عبور Vault خواسته می شود:

 

Output

BECOME password:
Vault password:

هنگامی که رمز عبور ارائه می شود، Ansible تلاش می کند تا با استفاده از رمز عبور Vault برای هر فایل رمزگذاری شده ای که پیدا می کند، کار را اجرا کند. به خاطر داشته باشید که تمام فایل هایی که در حین اجرا به آنها ارجاع داده می شود باید از یک رمز عبور استفاده کنند:

 

Output

localhost | SUCCESS => {
    "changed": true, 
    "checksum": "7a2eb5528c44877da9b0250710cba321bc6dac2d", 
    "dest": "/tmp/secret_key", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "270ac7da333dd1db7d5f7d8307bd6b41", 
    "mode": "0600", 
    "owner": "root", 
    "size": 18, 
    "src": "/home/sammy/.ansible/tmp/ansible-tmp-1480978964.81-196645606972905/source", 
    "state": "file", 
    "uid": 0
}

درخواست رمز عبور امن است، اما می تواند خسته کننده باشد، به خصوص در اجراهای مکرر، و همچنین مانع از اتوماسیون می شود. خوشبختانه، چند جایگزین برای این شرایط وجود دارد.

استفاده از Ansible Vault با یک فایل رمز عبور

اگر نمی‌خواهید هر بار که کاری را انجام می‌دهید رمز عبور Vault را تایپ کنید، می‌توانید رمز عبور Vault خود را به یک فایل اضافه کنید و در حین اجرا به فایل ارجاع دهید.

به عنوان مثال، می توانید رمز عبور خود را در یک فایل .vault_pass مانند این قرار دهید:

echo ‘my_vault_password’ > .vault_pass

اگر از کنترل نسخه استفاده می کنید، مطمئن شوید که فایل رمز عبور را به فایل نادیده گرفتن نرم افزار کنترل نسخه خود اضافه کنید تا از انجام تصادفی آن جلوگیری کنید:

echo ‘.vault_pass’ >> .gitignore

اکنون می توانید به جای آن به فایل ارجاع دهید. پرچم –vault-password-file در خط فرمان موجود است. می‌توانیم همان کار را از قسمت آخر با تایپ کردن کامل کنیم:

ansible –vault-password-file=.vault_pass -bK -m copy -a ‘src=secret_key dest=/tmp/secret_key mode=0600 owner=root group=root’ localhost

این بار رمز عبور Vault از شما خواسته نمی شود.

خواندن خودکار فایل رمز عبور

برای جلوگیری از ارائه پرچم، می توانید متغیر محیطی ANSIBLE_VAULT_PASSWORD_FILE را با مسیر فایل رمز عبور تنظیم کنید:

export ANSIBLE_VAULT_PASSWORD_FILE=./.vault_pass

اکنون باید بتوانید دستور را بدون پرچم –vault-password-file برای جلسه جاری اجرا کنید:

ansible -bK -m copy -a ‘src=secret_key dest=/tmp/secret_key mode=0600 owner=root group=root’ localhost

برای آگاه کردن Ansible از محل فایل رمز عبور در جلسات، می توانید فایل ansible.cfg خود را ویرایش کنید.

فایل ansible.cfg محلی را که قبلا ایجاد کردیم باز کنید:

nano ansible.cfg

در بخش [defaults]، تنظیمات vault_password_file را تنظیم کنید. به محل فایل رمز عبور خود اشاره کنید. این می تواند یک مسیر نسبی یا مطلق باشد، بسته به اینکه کدام یک برای شما مفیدتر است:

ansible.cfg

[defaults]
. . .
vault_password_file = ./.vault_pass

اکنون، وقتی دستوراتی را اجرا می‌کنید که نیاز به رمزگشایی دارند، دیگر از شما خواسته نمی‌شود که پسورد vault را وارد کنید. به عنوان یک امتیاز، ansible-vault نه تنها از رمز عبور موجود در فایل برای رمزگشایی هر فایلی استفاده می کند، بلکه رمز عبور را هنگام ایجاد فایل های جدید با ایجاد ansible-vault و ensible-vault encrypt اعمال می کند.

خواندن رمز عبور از یک متغیر محیطی

ممکن است نگران ارسال تصادفی فایل رمز عبور خود به مخزن خود باشید. در حالی که Ansible یک متغیر محیطی برای اشاره به محل یک فایل رمز عبور دارد، اما متغیری برای تنظیم رمز عبور ندارد.

با این حال، اگر فایل رمز عبور شما قابل اجرا باشد، Ansible آن را به عنوان یک اسکریپت اجرا می کند و از خروجی به عنوان رمز عبور استفاده می کند. در یکی از مشکلات GitHub، برایان شویند پیشنهاد می کند که از اسکریپت زیر می توان برای استخراج رمز عبور از یک متغیر محیطی استفاده کرد.

فایل .vault_pass خود را در ویرایشگر خود باز کنید:

nano .vault_pass

اسکریپت زیر را جایگزین محتویات کنید:

.vault_pass

#!/usr/bin/env python3

import os
print os.environ['VAULT_PASSWORD']

فایل را با تایپ کردن قابل اجرا کنید:

chmod +x .vault_pass

سپس می توانید متغیر محیطی VAULT_PASSWORD را تنظیم و صادر کنید، که برای جلسه فعلی شما در دسترس خواهد بود:

export VAULT_PASSWORD=my_vault_password

شما باید این کار را در ابتدای هر جلسه Ansible انجام دهید، که ممکن است ناخوشایند به نظر برسد. با این حال، این کار به طور موثری از انجام تصادفی رمز عبور رمزگذاری Vault شما محافظت می کند، که می تواند اشکالات جدی داشته باشد.

استفاده از متغیرهای رمزگذاری شده در Vault با متغیرهای منظم

در حالی که Ansible Vault را می توان با فایل های دلخواه استفاده کرد، اغلب برای محافظت از متغیرهای حساس استفاده می شود. ما از طریق یک مثال کار خواهیم کرد تا به شما نشان دهیم که چگونه یک فایل متغیرهای معمولی را به پیکربندی تبدیل کنید که امنیت و قابلیت استفاده را متعادل می کند.

تنظیم مثال

برای این مثال، ما وانمود می کنیم که در حال پیکربندی یک سرور پایگاه داده هستیم، بدون اینکه در واقع نیاز به نصب پایگاه داده به عنوان پیش نیاز داشته باشیم.

زمانی که فایل هاست را زودتر ایجاد کردید، ورودی لوکال هاست را در گروهی به نام پایگاه داده قرار دادید تا برای این مرحله آماده شوید. پایگاه های داده معمولاً به ترکیبی از متغیرهای حساس و غیر حساس نیاز دارند. اینها را می توان در یک پوشه group_vars در فایلی به نام گروه اختصاص داد:

mkdir -p group_vars
nano group_vars/database

در داخل فایل group_vars/database، چند متغیر معمولی اضافه می کنیم. برخی از متغیرها، مانند شماره پورت MySQL، مخفی نیستند و می توانند آزادانه به اشتراک گذاشته شوند. سایر متغیرها، مانند رمز عبور پایگاه داده، محرمانه خواهند بود:

group_vars/database

---
# nonsensitive data
mysql_port: 3306
mysql_host: 10.0.0.3
mysql_user: fred

# sensitive data
mysql_password: supersecretpassword

می‌توانیم آزمایش کنیم که همه متغیرها با ماژول اشکال زدایی Ansible و متغیر hostvars در دسترس میزبان ما هستند:

ansible -m debug -a ‘var=hostvars[inventory_hostname]’ database

 

Output

localhost | SUCCESS => {
    "hostvars[inventory_hostname]": {
        "ansible_check_mode": false, 
        "ansible_version": {
            "full": "2.2.0.0", 
            "major": 2, 
            "minor": 2, 
            "revision": 0, 
            "string": "2.2.0.0"
        }, 
        "group_names": [
            "database"
        ], 
        "groups": {
            "all": [
                "localhost"
            ], 
            "database": [
                "localhost"
            ], 
            "ungrouped": []
        }, 
        "inventory_dir": "/home/sammy", 
        "inventory_file": "hosts", 
        "inventory_hostname": "localhost", 
        "inventory_hostname_short": "localhost", 
        "mysql_host": "10.0.0.3",
        "mysql_password": "supersecretpassword",
        "mysql_port": 3306,
        "mysql_user": "fred",
        "omit": "__omit_place_holder__1c934a5a224ca1d235ff05eb9bda22044a6fb400", 
        "playbook_dir": "."
    }
}

خروجی تأیید می کند که همه متغیرهایی که ما تنظیم کرده ایم روی هاست اعمال می شوند. با این حال، فایل group_vars/database ما در حال حاضر همه متغیرهای ما را در خود جای می دهد. این بدان معناست که ما می‌توانیم آن را رمزگذاری نشده رها کنیم، که به دلیل متغیر رمز پایگاه داده یک نگرانی امنیتی است، یا همه متغیرها را رمزگذاری کنیم، که باعث ایجاد مشکلاتی در قابلیت استفاده و همکاری می‌شود.

انتقال متغیرهای حساس به Ansible Vault

برای حل این موضوع باید بین متغیرهای حساس و غیر حساس تفاوت قائل شویم. ما باید بتوانیم مقادیر محرمانه را رمزگذاری کنیم و در عین حال به راحتی متغیرهای غیر حساس خود را به اشتراک بگذاریم. برای انجام این کار، متغیرهای خود را بین دو فایل تقسیم می کنیم.

به منظور اعمال متغیرهای بیش از یک فایل، می توان از یک فهرست متغیر به جای فایل متغیر Ansible استفاده کرد. ما می توانیم پیکربندی خود را برای استفاده از این توانایی تغییر دهیم. ابتدا نام فایل موجود را از پایگاه داده به vars تغییر دهید. این فایل متغیر رمزگذاری نشده ما خواهد بود:

mv group_vars/database group_vars/vars

بعد، یک دایرکتوری با همان نام فایل متغیر قدیمی ایجاد کنید. فایل vars را به داخل منتقل کنید:

mkdir group_vars/database
mv group_vars/vars group_vars/database/

ما اکنون به جای یک فایل، یک دایرکتوری متغیر برای گروه پایگاه داده داریم و یک فایل متغیر رمزگذاری نشده داریم. از آنجایی که متغیرهای حساس خود را رمزگذاری خواهیم کرد، باید آنها را از فایل رمزگذاری نشده خود حذف کنیم. برای حذف داده های محرمانه، فایل group_vars/database/vars را ویرایش کنید:

nano group_vars/database/vars

در این صورت می خواهیم متغیر mysql_password را حذف کنیم. اکنون فایل باید به شکل زیر باشد:

group_vars/database/vars

---
# nonsensitive data
mysql_port: 3306
mysql_host: 10.0.0.3
mysql_user: fred

سپس، یک فایل رمزگذاری شده با طاق در دایرکتوری ایجاد کنید که در کنار فایل vars رمزگذاری نشده زندگی می کند:

ansible-vault create group_vars/database/vault

در این فایل متغیرهای حساسی که قبلا در فایل vars وجود داشت را تعریف کنید. از نام متغیرهای یکسانی استفاده کنید، اما رشته vault_ را برای نشان دادن اینکه این متغیرها در فایل محافظت شده توسط vault تعریف شده اند، پیشاپیش قرار دهید:

group_vars/database/vault

---
vault_mysql_password: supersecretpassword

پس از اتمام کار فایل را ذخیره کرده و ببندید.

ساختار دایرکتوری حاصل به این صورت است:

.
├── . . .
├── group_vars/
│   └── database/
│       ├── vars
│       └── vault
└── . . .

در این مرحله، متغیرها جدا هستند و فقط داده های محرمانه رمزگذاری می شوند. این امن است، اما اجرای ما بر قابلیت استفاده ما تأثیر گذاشته است. در حالی که هدف ما محافظت از مقادیر حساس بود، همچنین ناخواسته دید را به نام متغیرهای واقعی کاهش دادیم. مشخص نیست که کدام متغیرها بدون ارجاع به بیش از یک فایل اختصاص داده شده اند، و در حالی که ممکن است بخواهید دسترسی به داده های محرمانه را در حین همکاری محدود کنید، هنوز احتمالاً می خواهید نام متغیرها را به اشتراک بگذارید.

برای پرداختن به این موضوع، پروژه Ansible به طور کلی رویکرد کمی متفاوت را توصیه می کند.

ارجاع به متغیرهای Vault از متغیرهای رمزگذاری نشده

هنگامی که ما داده های حساس خود را به فایل محافظت شده در طاق انتقال دادیم، نام متغیرها را با vault_ در پیش گفتیم (mysql_password تبدیل به vault_mysql_password شد). ما می توانیم نام متغیرهای اصلی (mysql_password) را به فایل رمزگذاری نشده اضافه کنیم. به‌جای تنظیم مستقیم این مقادیر روی مقادیر حساس، می‌توانیم از عبارات قالب‌بندی Jinja2 برای ارجاع نام متغیرهای رمزگذاری‌شده از داخل فایل متغیر رمزگذاری نشده خود استفاده کنیم. به این ترتیب، می توانید با ارجاع به یک فایل، همه متغیرهای تعریف شده را مشاهده کنید، اما مقادیر محرمانه در فایل رمزگذاری شده باقی می مانند.

برای نشان دادن، فایل متغیرهای رمزگذاری نشده را دوباره باز کنید:

nano group_vars/database/vars

دوباره متغیر mysql_password را اضافه کنید. این بار، از قالب Jinja2 برای ارجاع به متغیر تعریف شده در فایل محافظت شده از طاق استفاده کنید:

group_vars/database/vars

---
# nonsensitive data
mysql_port: 3306
mysql_host: 10.0.0.3
mysql_user: fred

# sensitive data
mysql_password: "{{ vault_mysql_password }}"

متغیر mysql_password به مقدار متغیر vault_mysql_password که در فایل vault تعریف شده تنظیم می شود.

با این روش می توانید با مشاهده فایل group_vars/database/vars، تمامی متغیرهایی را که بر روی هاست های گروه پایگاه داده اعمال می شود، درک کنید. قسمت های حساس توسط قالب Jinja2 محو می شوند. group_vars/database/vault تنها زمانی باید باز شود که خود مقادیر نیاز به مشاهده یا تغییر داشته باشند.

می توانید بررسی کنید تا مطمئن شوید که همه متغیرهای mysql_* هنوز به درستی با استفاده از همان روش دفعه قبل اعمال می شوند.

ansible -m debug -a ‘var=hostvars[inventory_hostname]’ database

 

Output

localhost | SUCCESS => {
    "hostvars[inventory_hostname]": {
        "ansible_check_mode": false, 
        "ansible_version": {
            "full": "2.2.0.0", 
            "major": 2, 
            "minor": 2, 
            "revision": 0, 
            "string": "2.2.0.0"
        }, 
        "group_names": [
            "database"
        ], 
        "groups": {
            "all": [
                "localhost"
            ], 
            "database": [
                "localhost"
            ], 
            "ungrouped": []
        }, 
        "inventory_dir": "/home/sammy/vault", 
        "inventory_file": "./hosts", 
        "inventory_hostname": "localhost", 
        "inventory_hostname_short": "localhost", 
        "mysql_host": "10.0.0.3",
        "mysql_password": "supersecretpassword",
        "mysql_port": 3306,
        "mysql_user": "fred",
        "omit": "__omit_place_holder__6dd15dda7eddafe98b6226226c7298934f666fc8", 
        "playbook_dir": ".", 
        "vault_mysql_password": "supersecretpassword"
    }
}

هم vault_mysql_password و هم mysql_password قابل دسترسی هستند. این تکرار بی ضرر است و تاثیری در استفاده شما از این سیستم نخواهد داشت.

نتیجه

پروژه های شما باید تمام اطلاعات مورد نیاز برای نصب و پیکربندی موفقیت آمیز سیستم های پیچیده را داشته باشند. با این حال، برخی از داده‌های پیکربندی طبق تعریف حساس هستند و نباید در معرض عموم قرار گیرند. در این راهنما، ما نشان دادیم که چگونه Ansible Vault می تواند اطلاعات محرمانه را رمزگذاری کند تا بتوانید تمام داده های پیکربندی خود را در یک مکان بدون به خطر انداختن امنیت نگه دارید.

Ansible VaultVPS یا سرور مجازیاتصال به لینوکسخرید سرور مجازیسرور اوبونتو 20.04سرور مجازیسرور مجازی آلمانسرور مجازی آمریکامتغیرهای Vault

 

 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه تنظیم نوت بوک Jupyter برای Python 3

ورود به سایت

معرفی

Jupyter Notebook یک پوسته فرمان برای محاسبات تعاملی به عنوان یک برنامه وب ارائه می دهد. این ابزار را می توان با چندین زبان از جمله Python، Julia، R، Haskell و Ruby استفاده کرد. اغلب برای کار با داده ها، مدل سازی آماری و یادگیری ماشین استفاده می شود.

این آموزش شما را در راه اندازی نوت بوک Jupyter برای اجرا به صورت محلی یا از سرور اوبونتو 20.04 راهنمایی می کند و همچنین نحوه اتصال و استفاده از نوت بوک را به شما آموزش می دهد. نوت‌بوک‌های Jupyter (یا به سادگی نوت‌بوک‌ها) اسنادی هستند که توسط برنامه نوت‌بوک Jupyter تولید می‌شوند که حاوی کدهای کامپیوتری و عناصر متن غنی (پاراگراف، معادلات، شکل‌ها، پیوندها و غیره) هستند که به ارائه و به اشتراک‌گذاری تحقیقات قابل تکرار کمک می‌کنند.

در پایان این راهنما، می‌توانید کد پایتون 3 را با استفاده از نوت‌بوک Jupyter که روی یک ماشین محلی یا سرور راه دور اجرا می‌شود، اجرا کنید.

پیش نیازها

برای دنبال کردن این آموزش، به یک محیط برنامه نویسی پایتون 3 نیز نیاز دارید

  • در دستگاه محلی شما، یا
  • روی سرور اوبونتو

تمام دستورات این آموزش باید به صورت یک کاربر غیر روت اجرا شوند. اگر دسترسی root برای دستور مورد نیاز باشد، قبل از دستور sudo قرار می گیرد. راه اندازی اولیه سرور با اوبونتو 20.04 نحوه اضافه کردن کاربران و دادن دسترسی sudo را توضیح می دهد.

مرحله 1 – نصب نوت بوک Jupyter

در این قسمت نوت بوک Jupyter را با pip نصب می کنیم.

محیط برنامه نویسی Python 3 را که می خواهید Jupyter Notebook را در آن نصب کنید، فعال کنید. در مثال خود، آن را در my_env نصب می‌کنیم، بنابراین مطمئن می‌شویم که در دایرکتوری آن محیط هستیم و آن را به این صورت فعال می‌کنیم:

cd ~/environments
. my_env/bin/activate

در مرحله بعد، می توانیم اطمینان حاصل کنیم که پیپ به آخرین نسخه ارتقا یافته است:

pip install –upgrade pip

حالا می توانیم Jupyter Notebook را با دستور زیر نصب کنیم:

pip install jupyter

در این مرحله Jupyter Notebook در محیط برنامه نویسی فعلی نصب می شود.

مرحله اختیاری بعدی برای کسانی است که نصب سرور رابط وب را با استفاده از تونل SSH متصل می کنند.

مرحله 2 (اختیاری) – استفاده از SSH Tunneling برای اتصال به نصب سرور

اگر نوت بوک Jupyter را روی سرور نصب کرده اید، در این بخش نحوه اتصال به رابط وب Jupyter Notebook با استفاده از تونل SSH را یاد می گیریم. از آنجایی که Jupyter Notebook بر روی یک پورت خاص روی سرور اجرا می شود (مانند :8888، :8889 و غیره)، تونل SSH شما را قادر می سازد تا به طور ایمن به پورت سرور متصل شوید.

توجه داشته باشید که این دستورالعمل‌ها طوری طراحی شده‌اند که از یک پنجره ترمینال محلی اجرا شوند، یعنی نه از پنجره‌ای که با آن به سرور متصل شده‌اید.

SSH Tunneling

اگر از ویندوز استفاده می کنید، باید نسخه ای از OpenSSH را نصب کنید تا بتوانید از ترمینال ssh کنید. اگر ترجیح می دهید در PowerShell کار کنید، می توانید اسناد مایکروسافت را برای اضافه کردن OpenSSH به PowerShell دنبال کنید. اگر ترجیح می‌دهید یک محیط لینوکس کامل در دسترس داشته باشید، می‌توانید WSL، زیرسیستم ویندوز برای لینوکس را راه‌اندازی کنید، که به طور پیش‌فرض شامل ssh می‌شود. در نهایت، به عنوان گزینه سوم سبک، می‌توانید Git را برای ویندوز نصب کنید، که یک محیط ترمینال bash ویندوز که شامل دستور ssh می‌شود را فراهم می‌کند. هر کدام از این ها به خوبی پشتیبانی می شوند و هر کدام را که تصمیم به استفاده از آن داشته باشید به اولویت شما بستگی دارد.

اگر از مک یا لینوکس استفاده می کنید، از قبل دستور ssh را در ترمینال خود خواهید داشت.

مراحل ایجاد یک SSH tunneling شبیه نحوه اتصال به قطرات با راهنمای SSH است با این تفاوت که پارامترهای اضافی در دستور ssh اضافه شده است. این زیربخش پارامترهای اضافی مورد نیاز در دستور ssh برای تونل موفقیت آمیز را تشریح می کند.

SSH tunneling را می توان با اجرای دستور SSH زیر در یک پنجره ترمینال محلی جدید انجام داد:

ssh -L 8888:localhost:8888 your_server_username@your_server_ip

دستور ssh یک اتصال SSH را باز می کند، اما -L مشخص می کند که پورت داده شده در میزبان محلی (کلینت) باید به هاست و پورت در سمت راه دور (سرور) ارسال شود. این بدان معناست که هر چیزی که روی شماره پورت دوم (به عنوان مثال 8888) در سرور اجرا می شود، در اولین شماره پورت (مثلاً 8888) در رایانه محلی شما ظاهر می شود.

اگر پیامی دریافت کردید که پورت 8888 در دسترس نیست، می توانید آن را به شماره پورت دلخواه دیگری زیر 65535 تغییر دهید. پورت 8888 معنای مهمی ندارد اما اغلب برای دموهایی مانند این استفاده می شود.

server_username نام کاربری شما (به عنوان مثال sammy) در سروری است که ایجاد کرده اید و your_server_ip آدرس IP سرور شما است.

به عنوان مثال، برای نام کاربری sammy و آدرس سرور 203.0.113.0، دستور به صورت زیر خواهد بود:

ssh -L 8888:localhost:8888 sammy@203.0.113.0

اگر پس از اجرای دستور ssh -L خطایی نشان داده نشد، می توانید به محیط برنامه نویسی خود بروید و Jupyter Notebook را اجرا کنید:

jupyter notebook

خروجی را با URL دریافت خواهید کرد. از یک مرورگر وب در دستگاه محلی خود، رابط وب Jupyter Notebook را با URL که با http://localhost:8888 شروع می شود، باز کنید. اطمینان حاصل کنید که شماره رمز گنجانده شده است یا در صورت درخواست در http://localhost:8888 رشته شماره رمز را وارد کنید.

مرحله 3 – اجرای نوت بوک Jupyter

با نصب نوت بوک Jupyter، می توانید آن را در ترمینال خود اجرا کنید. برای این کار دستور زیر را اجرا کنید:

jupyter notebook

گزارشی از فعالیت های نوت بوک Jupyter در ترمینال چاپ می شود. هنگامی که Jupyter Notebook را اجرا می کنید، روی یک شماره پورت خاص اجرا می شود. اولین نوت‌بوکی که اجرا می‌کنید معمولاً روی پورت 8888 اجرا می‌شود. برای بررسی شماره پورت خاصی که Jupyter Notebook روی آن اجرا می‌شود، به خروجی دستور استفاده شده برای شروع آن مراجعه کنید:

 

Output

[I NotebookApp] Serving notebooks from local directory: /home/sammy
[I NotebookApp] 0 active kernels 
[I NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/
[I NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
...

اگر Jupyter Notebook را روی یک رایانه محلی (نه روی سرور) اجرا می کنید، مرورگر پیش فرض شما باید برنامه وب Jupyter Notebook را باز کرده باشد. اگر نه، یا اگر پنجره را ببندید، می توانید به URL ارائه شده در خروجی بروید یا برای اتصال به localhost:8888 بروید.

هر زمان که می‌خواهید فرآیند Jupyter Notebook را متوقف کنید، Ctrl+C را فشار دهید، زمانی که از شما خواسته شد Y را تایپ کنید و سپس Enter را برای تأیید فشار دهید.

خروجی زیر را دریافت خواهید کرد:

 

Output

[C 12:32:23.792 NotebookApp] Shutdown confirmed
[I 12:32:23.794 NotebookApp] Shutting down kernels

Jupyter Notebook اکنون دیگر کار نمی کند.

مرحله 4 – استفاده از نوت بوک Jupyter

این بخش به اصول استفاده از نوت بوک Jupyter می پردازد. اگر در حال حاضر Jupyter Notebook را در حال اجرا ندارید، آن را با دستور jupyter notebook شروع کنید.

اکنون باید با استفاده از یک مرورگر وب به آن متصل شوید. نوت بوک Jupyter بسیار قدرتمند است و ویژگی های زیادی دارد. در این بخش چند مورد از ویژگی‌های اساسی برای شروع استفاده از نوت‌بوک توضیح داده می‌شود. Jupyter Notebook همه فایل‌ها و پوشه‌ها را در فهرستی که از آن اجرا می‌شود نشان می‌دهد، بنابراین وقتی روی پروژه کار می‌کنید، مطمئن شوید که آن را از فهرست پروژه شروع کنید.

برای ایجاد یک فایل نوت بوک جدید، New > Python 3 را از منوی کشویی بالا سمت راست انتخاب کنید:

با این کار یک نوت بوک باز می شود. اکنون می‌توانیم کد پایتون را در سلول اجرا کنیم یا سلول را به markdown تغییر دهیم. برای مثال، با کلیک روی Cell > Cell Type > Markdown از نوار پیمایش بالا، اولین سلول را برای پذیرش Markdown تغییر دهید. اکنون می‌توانیم یادداشت‌هایی را با استفاده از Markdown بنویسیم و حتی معادلات نوشته‌شده در LaTeX را با قرار دادن آنها بین نمادهای $$ اضافه کنیم. به عنوان مثال، پس از تغییر سلول به علامت گذاری، عبارت زیر را در سلول تایپ کنید:

# Simple Equation

Let us now implement the following equation:
$$ y = x^2$$

where $x = 2$

برای تبدیل علامت گذاری به متن غنی، Ctrl+Enter را فشار دهید و نتایج زیر باید باشد:

می توانید از سلول های علامت گذاری برای یادداشت برداری و مستندسازی کد خود استفاده کنید. بیایید آن معادله ساده را پیاده سازی کنیم و نتیجه را چاپ کنیم. روی سلول بالا کلیک کنید، سپس Alt+Enter را فشار دهید تا یک سلول زیر آن اضافه شود. کد زیر را در سلول جدید وارد کنید.

x = 2
y = x**2
print(y)

برای اجرای کد، Ctrl+Enter را فشار دهید. نتایج زیر را دریافت خواهید کرد:

اکنون می توانید ماژول ها را وارد کنید و از نوت بوک مانند سایر محیط های توسعه پایتون استفاده کنید!

برای خاموش کردن نوت بوک Jupyter سمت سرور، به پنجره ترمینال که آن را از آنجا شروع کرده اید بازگردید و Ctrl+C را فشار دهید. این یک میانبر استاندارد برای پایان دادن به فرآیندهای ترمینال است و Jupyter از شما می خواهد قبل از خروج ذخیره کنید.

نتیجه

تبریک می گویم! اکنون باید بتوانید کدها و یادداشت های قابل تکرار پایتون را با استفاده از Jupyter Notebook در Markdown بنویسید. برای دریافت یک تور سریع از Jupyter Notebook از داخل رابط، Help > User Interface Tour را از منوی پیمایش بالا انتخاب کنید تا بیشتر بدانید.


 

https://vpsgol.net/product/vps-germany/

 

https://vpsgol.net/product/vps-usa/

 

https://vpsgol.net/product/vps-france/

 

https://vpsgol.net/product/vps-canada/

 

https://vpsgol.net/product/vps-poland/

 

https://vpsgol.net/product/vps-netherlands/

 

https://vpsgol.net/product/vps-england/

 

برچسب‌ها:SSH TunnelingUbuntu VPSاتصال به سرور مجازیخرید سرور مجازیسرور اوبونتو 20.04فروش سرور مجازینحوه تنظیم نوت بوک Jupyterنصب سرورنصب نوت بوک Jupyter

  • behnam gol mohamadi