<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های mina goli</title><link>https://virgool.ir/feed/@goli54479</link><description></description><language>fa</language><pubDate>2026-11-11 02:16:27</pubDate><image><url>https://files.virgool.ir/upload/users/215916/avatar/avatar.png</url><title>mina goli</title><link>https://virgool.ir/@goli54479</link></image><item><title>نحوه نصب و استفاده از TimescaleDB در Ubuntu 20.04</title><link>https://virgool.ir/@goli54479/نحوه-نصب-و-استفاده-از-timescaledb-در-ubuntu-2004-c3cehyfswtse</link><description>بسیاری از برنامه ها ، مانند سیستم های مانیتورینگ و سیستم های جمع آوری داده، اطلاعات را برای تحلیل بیشتر جمع می کنند. این تجزیه و تحلیل ها اغلب به نحوه تغییر یک بخش از داده یا یک سیستم با زمان نگاه می کنند. در این موارد ، داده ها به عنوان یک سری زمان نمایش داده می شوند ، و هر نقطه داده همراه با یک timestamp همراه است. نمونه ای از آن ها به این صورت است:2020-06-01 09:00:00 server.cpu.1 0.92020-06-01 09:00:00 server.cpu.15 0.82020-06-01 09:01:00 server.cpu.1 0.92020-06-01 09:01:00 server.cpu.15 0.8…اخیراً به لطف اینترنت اشیاء (IoT) و اینترنت صنعتی اشیاء، ارتباط داده های مجموعه زمانی افزایش یافته است. اکنون تعداد بیشتر و بیشتری دستگاه وجود دارد که اطلاعات مجموعه های مختلفی را جمع آوری می کنند: از جمله ثبت کننده های عملکرد ورزشی ، ساعت های هوشمند ، ایستگاه های خانگی آب و هوا و سنسورهای مختلف. این دستگاه ها اطلاعات زیادی را جمع می کنند و تمام این داده ها باید در جایی ذخیره شوند.بانک های اطلاعاتی کلاسیک رابطه ای اغلب برای ذخیره داده ها استفاده می شود ، اما وقتی صحبت از حجم عظیم داده های سری زمانی است ، دیگر مناسب نخواهند بود. هنگامی که نیاز به پردازش میزان زیادی داده های مجموعه زمانی دارید ، دیتابیس رابطه ای می تواند خیلی کند باشد. به همین دلیل ، بانکهای اطلاعاتی بهینه سازی شده ای به نام پایگاه داده های NoSQL ایجاد شده اند تا از مشکلات پایگاه های داده رابطه ای جلوگیری شود.TimescaleDB یک پایگاه داده منبع باز است که برای ذخیره داده های سری زمانی بهینه شده است. این برنامه به عنوان پسوند PostgreSQL پیاده سازی شده است و سهولت استفاده از پایگاه های داده رابطه ای و سرعت پایگاه داده های NoSQL را ترکیب می کند. در نتیجه ، به شما امکان می دهد تا از PostgreSQL برای ذخیره داده های کاری و داده های سری های زمانی به صورت همزمان استفاده کنید.با دنبال کردن این آموزش ، TimescaleDB را روی Ubuntu 20.04 تنظیم میکنید ، آن را پیکربندی کرده و یاد می گیرید که چگونه با آن کار کنید. با ایجاد پایگاه داده های سری زمانی و ایجاد درخواست های ساده این کار را انجام خواهید داد. در آخر ، خواهید دید که چگونه داده های غیر ضروری را حذف کنید.پیش نیازهابرای دنبال کردن این آموزش ، به موارد زیر نیاز دارید:یک سرور مجازی Ubuntu 20.04 که با دنبال کردن راهنمای اولیه راه اندازی سرور مجازی با Ubuntu 20.04 نصب شده باشد، و شامل یک کاربر غیر ریشه با امتیازات sudo و فایروال تنظیم شده باشدPostgreSQL که بر روی سرور مجازی شما نصب شده باشد. برای نصب و پیکربندی آن ، راهنمای نصب و استفاده از PostgreSQL در Ubuntu 20.04 را دنبال کنید.مرحله 1 – نصب TimescaleDBTimescaleDB در منابع پکیجی پیش فرض Ubuntu در دسترس نیست ، بنابراین در این مرحله شما آن را از منبع شخص ثالث TimescaleDB نصب خواهید کرد.ابتدا یک فایل منبع جدید ایجاد کنید:$ sudo add-apt-repository ppa:timescale/timescaledb-ppaبا زدن enter این عمل را تایید کنید:$ sudo apt updateاکنون می توانید مراحل نصب را ادامه دهید. در این آموزش از PostgreSQL نسخه 12 استفاده شده است. اگر از نسخه دیگری از PostgreSQL استفاده می کنید (به عنوان مثال 11 یا 10) ، مقدار مورد نظر را در دستور زیر جایگزین کرده و آن را اجرا کنید:$ sudo apt install timescaledb-postgresql-12توجه: در نسخه بعدی پشتیبانی نسخه های 9.6.3+ و 10.9+ حذف خواهد شد.TimescaleDB اکنون نصب شده و آماده استفاده است. در مرحله بعد ، آن را روشن کرده و برخی از تنظیمات مرتبط با آن را در فایل پیکربندی PostgreSQL برای بهینه سازی بانک اطلاعات تنظیم خواهید کرد.مرحله 2 – پیکربندی TimescaleDBماژول TimescaleDB با تنظیمات پیش فرض پیکربندی PostgreSQL خوب کار می کند ، اما برای بهبود عملکرد و استفاده بهتر از منابع پردازنده ، حافظه و منابع دیسک ، توسعه دهندگان TimescaleDB پیکربندی برخی پارامترهای فردی را پیشنهاد می کنند. این کار می تواند به صورت خودکار با ابزار timescaledb-tune یا با ویرایش دستی فایل postgresql.conf سرور مجازی شما انجام شود.در این آموزش از ابزار timescaledb-tune استفاده خواهید کرد. این ابزار، فایل postgresql.conf را می خواند و به صورت تعاملی پیشنهاد ایجاد تغییرات را می دهد.برای شروع wizard پیکربندی دستور زیر را اجرا کنید:$ sudo timescaledb-tuneابتدا از شما خواسته می شود مسیر فایل پیکربندی PostgreSQL را تأیید کنید:OutputUsing postgresql.conf at this path:/etc/postgresql/12/main/postgresql.confIs this correct? [(y)es/(n)o]:ابزار به طور خودکار مسیر فایل پیکربندی را تشخیص می دهد ، بنابراین با وارد کردن y این کار را تأیید کنید:Output…Is this correct? [(y)es/(n)o]: yWriting backup to:/tmp/timescaledb_tune.backup202005300523در مرحله بعد از شما خواسته می شود متغیر shared_preload_libraries را تغییر دهید تا قبل از شروع سرور مجازی PostgreSQL ، ماژول TimescaleDB را دانلود کنید:Outputshared_preload_libraries needs to be updatedCurrent:#shared_preload_libraries = ”Recommended:shared_preload_libraries = ‘timescaledb’Is this okay? [(y)es/(n)o]:shared_preload_libraries لیستی از ماژول های جدا شده با کاما را به عنوان یک مقدار میپذیرد و مشخص میکند که PostgreSQL باید قبل از شروع سرور مجازی پایگاه داده کدام ماژول ها را لود کند. با ایجاد این تغییر ، ماژول timescaledb به آن لیست اضافه می شود.سپس ، ماژول TimescaleDB را با تایپ y در اعلان بعدی و فشار دادن ENTER فعال کنید:Output…Is this okay? [(y)es/(n)o]: ysuccess: shared_preload_libraries will be updatedبر اساس ویژگی های سرور مجازی خود و نسخه PostgreSQL ، به شما پیشنهاد می شود تنظیمات خود را انجام دهید. برای شروع فرآیند تنظیم ، y را فشار دهید:OutputTune memory/parallelism/WAL and other settings? [(y)es/(n)o]: yRecommendations based on 7.79 GB of available memory and 4 CPUs for PostgreSQL 12Memory settings recommendationsCurrent:shared_buffers = 128MB#effective_cache_size = 4GB#maintenance_work_mem = 64MB#work_mem = 4MBRecommended:shared_buffers = 1990MBeffective_cache_size = 5971MBmaintenance_work_mem = 1019114kBwork_mem = 5095kBIs this okay? [(y)es/(s)kip/(q)uit]:timescaledb-tune به طور خودکار حافظه موجود سرور مجازی را تشخیص داده و مقادیر توصیه شده را برای تنظیمات shared_buffers ، effective_cache_size ، maintenance_work_mem و work_mem محاسبه می کند.برای مثال shared_buffers مقدار حافظه اختصاص داده شده برای ذخیره داده ها را تعیین می کند. به طور پیش فرض ، این تنظیمات برای طیف وسیع تری از پلتفرم ها نسبتاً کم است ، بنابراین timescaledb-tune ایجاد فضای بیشتر برای ذخیره اطلاعات مانند جستارهای مکرر ، افزایش مقدار را پیشنهاد داده است که استفاده بهتر از منابع را منجر میشود. متغیر work_mem نیز افزایش یافته است تا امکان انواع پیچیده تری را نیز فراهم کند.اگر می خواهید در مورد چگونگی انجام این کار اطلاعات بیشتری کسب کنید ، صفحه GitHub را برای دیدن timescaledb-tune چک کنید.برای پذیرش مقادیر ، y را وارد کنید:Output…Is this okay? [(y)es/(s)kip/(q)uit]: ysuccess: memory settings will be updatedدر این مرحله ، اگر سرور مجازی شما دارای چندین CPU باشد ، توصیه های مربوط به تنظیمات موازی سازی را پیدا خواهید کرد. در حالی که اگر یک CPU داشته باشید ، timescaledb-tune با استفاده از جدول زمانی شما را مستقیماً به تنظیمات WAL هدایت میکند.سرور مجازی هایی که دارای چندین CPU هستند ، با توصیه هایی مانند این روبرو می شوند:OutputParallelism settings recommendationsCurrent:missing: timescaledb.max_background_workers#max_worker_processes = 8#max_parallel_workers_per_gather = 2#max_parallel_workers = 8Recommended:timescaledb.max_background_workers = 8max_worker_processes = 15max_parallel_workers_per_gather = 2max_parallel_workers = 4Is this okay? [(y)es/(s)kip/(q)uit]:این تنظیمات تعداد نیروهایی که درخواست ها و کارهای پس زمینه را پردازش می کنند را تنظیم می کند. می توانید اطلاعات بیشتری در مورد این تنظیمات را از مطالب TimescaleDB و PostgreSQL کسب کنید.y را وارد کنید و برای پذیرش این تنظیمات enter بزنید:Output…Is this okay? [(y)es/(s)kip/(q)uit]: ysuccess: parallelism settings will be updatedدر مرحله بعد ، توصیه هایی برای Write Ahead Log (WAL) پیدا خواهید کرد:OutputWAL settings recommendationsCurrent:#wal_buffers = -1#min_wal_size = 80MBRecommended:wal_buffers = 16MBmin_wal_size = 512MBIs this okay? [(y)es/(s)kip/(q)uit]:WAL یکپارچگی داده ها را حفظ می کند ، اما تنظیمات پیش فرض می تواند باعث عدم کارآیی I / O شود که عملکرد نوشتن را کند می کند. برای بهینه سازی این تنظیمات y را تایپ و وارد کنید:Output…Is this okay? [(y)es/(s)kip/(q)uit]: ysuccess: WAL settings will be updatedاکنون چند توصیه متفرقه خواهید دید:OutputMiscellaneous settings recommendationsCurrent:#default_statistics_target = 100#random_page_cost = 4.0#checkpoint_completion_target = 0.5#max_locks_per_transaction = 64#autovacuum_max_workers = 3#autovacuum_naptime = 1min#effective_io_concurrency = 1Recommended:default_statistics_target = 500random_page_cost = 1.1checkpoint_completion_target = 0.9max_locks_per_transaction = 64autovacuum_max_workers = 10autovacuum_naptime = 10effective_io_concurrency = 200Is this okay? [(y)es/(s)kip/(q)uit]:تمام این پارامترهای مختلف با هدف افزایش کارایی هستند. به عنوان مثال ، SSD ها می توانند بسیاری از درخواست های همزمان را پردازش کنند ، بنابراین بهترین مقدار برای effective_io_concurrency ممکن است در بین صدها مورد باشد. می توانید اطلاعات بیشتری در مورد این گزینه ها را در مستندات PostgreSQL بیابید.برای ادامه ، y را وارد کنید و enter بزنید.Output…Is this okay? [(y)es/(s)kip/(q)uit]: ysuccess: miscellaneous settings will be updatedSaving changes to: /etc/postgresql/12/main/postgresql.confدر نتیجه ، یک فایل پیکربندی آماده را در /var/lib/pgsql/12/data/postgresql.conf دریافت خواهید کرد.توجه: اگر نصب را از ابتدا انجام می دهید ، می توانید فرمان اولیه را نیز با فلگ های –quiet و –yes اجرا کنید ، که به طور خودکار تمام توصیه ها را اعمال می کند و تغییراتی در فایل پیکربندی postgresql.conf ایجاد می کند:$ sudo timescaledb-tune –quiet –yesبرای اینکه تغییرات پیکربندی عملی شوند ، باید سرویس PostgreSQL را مجدداً راه اندازی کنید:$ sudo systemctl restart postgresql.serviceاکنون دیتابیس با پارامترهای بهینه در حال اجرا است و آماده همکاری با داده های سری زمانی میباشد. در مراحل بعدی ، کار با این داده ها را امتحان میکنید: ایجاد بانک اطلاعاتی جدید و هایپرجداول و انجام عملیات.مرحله 3 – ایجاد یک بانک اطلاعاتی جدید و Hypertableبا بهینه سازی تنظیم TimescaleDB ، آماده کار با داده های سری زمانی هستید. TimescaleDB به عنوان پسوند PostgreSQL پیاده سازی می شود ، بنابراین عملیات با داده های سری زمانی تفاوت چندانی با عملیات داده های رابطه ای ندارند. در عین حال ، بانک اطلاعاتی به شما امکان می دهد تا در آینده داده های سری زمانی و جداول رابطه ای را آزادانه ترکیب کنید.ابتدا یک پایگاه داده جدید ایجاد می کنید و پسوند TimescaleDB را برای آن فعال می کنید. به پایگاه داده PostgreSQL وارد شوید:$ sudo -u postgres psqlاکنون یک دیتابیس جدید ایجاد کرده و به آن متصل شوید. این آموزش پایگاه داده را timeseries نامگذاری می کند:Postgres=# CREATE DATABASE timeseries;Postgres=# \c timeseriesمی توانید اطلاعات دیگری در مورد کار با بانک اطلاعاتی PostgreSQL را در نحوه ایجاد ، حذف و مدیریت جداول در PostgreSQL در یک آموزش Cloud Server دریافت کنید.در آخر ، پسوند TimescaleDB را فعال کنید:Timeseries=# CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;خروجی زیر را مشاهده خواهید کرد:OutputWARNING:WELCOME TO_____ _ _ ____________|_ _(_) | | | _ \ ___ \| | _ _ __ ___ ___ ___ ___ __ _| | ___| | | | |_/ /| | | | _ ` _ \ / _ \/ __|/ __/ _` | |/ _ \ | | | ___ \| | | | | | | | | __/\__ \ (_| (_| | | __/ |/ /| |_/ /|_| |_|_| |_| |_|\___||___/\___\__,_|_|\___|___/ \____/Running version 1.7.1For more information on TimescaleDB, please visit the following links:1. Getting started: https://docs.timescale.com/getting-started2. API reference documentation: https://docs.timescale.com/api3. How TimescaleDB is designed: https://docs.timescale.com/introduction/architectureNote: TimescaleDB collects anonymous reports to better understand and assist our users.For more information and how to disable, please see our docs https://docs.timescaledb.com/using-timescaledb/telemetry.CREATE EXTENSIONنکته اولیه تعامل با داده های سری زمانی، hypertable ها هستند ، مفهوم انتزاعی بسیاری از جداول جداگانه که داده ها را نگه می دارند ، به نام chunks.برای ایجاد یک hypertable ، با یک جدول SQL معمولی شروع کنید و سپس از طریق تابع create_hypertable آن را به hypertable تبدیل کنید.یک جدول تهیه کنید که داده ها را برای ردیابی دما و رطوبت در کل دستگاه ها در طول زمان ذخیره کند:Timeseries=# CREATE TABLE conditions (Timeseries=# time TIMESTAMP WITH TIME ZONE NOT NULL,Timeseries=# device_id TEXT,Timeseries=# temperature NUMERIC,Timeseries=# humidity NUMERICTimeseries=# );این دستور یک جدول با نام conditions شامل چهار ستون ایجاد می کند. ستون اول timestamp را ذخیره می کند که شامل منطقه زمانی است و نمی تواند خالی باشد. در مرحله بعد ، از ستون زمان برای تبدیل جدول خود به یک Hypertable استفاده می کنید که در زمان تقسیم می شود:Timeseries=# SELECT create_hypertable(‘conditions’, ‘time’);این دستور تابع create_hypertable() را فرامیخواند، که یک هایپرجدول TimescaleDB را از جدول PostgreSQL ایجاد می کند ، و جایگزین دومی می نماید.خروجی زیر را دریافت خواهید کرد:Outputcreate_hypertable————————-(1,public,conditions,t)(1 row)در این مرحله ، یک Hypertable جدید برای ذخیره داده های سری زمانی ایجاد کرده اید. اکنون می توانید با نوشتن hypertable ، آن را با داده ها پر کنید و سپس فرایند حذف آن را اجرا کنید.مرحله 4 – نوشتن و حذف داده هادر این مرحله داده ها را با استفاده از دستورات استاندارد SQL وارد می کنید و مجموعه های زیادی از داده ها را از منابع خارجی وارد می کنید. این به شما جنبه های پایگاه داده رابطه ای TimescaleDB را نشان می دهد.ابتدا دستورات ساده را امتحان کنید. با استفاده از دستور استاندارد INSERT SQL می توانید داده ها را به hypertable وارد کنید. برخی از داده های دما و رطوبت نمونه را برای دستگاه تئوری weather-pro-000000 با استفاده از دستور زیر وارد کنید:Timeseries=# INSERT INTO conditions(time, device_id, temperature, humidity)Timeseries=# VALUES (NOW(), ‘weather-pro-000000’, 84.1, 84.1);خروجی زیر را دریافت خواهید کرد:OutputINSERT 0 1همچنین می توانید چندین ردیف داده به طور همزمان وارد کنید. موارد زیر را امتحان کنید:Timeseries=# INSERT INTO conditionsTimeseries=# VALUESTimeseries=# (NOW(), ‘weather-pro-000002’, 71.0, 51.0),Timeseries=# (NOW(), ‘weather-pro-000003’, 70.5, 50.5),Timeseries=# (NOW(), ‘weather-pro-000004’, 70.0, 50.2);خروجی زیر را دریافت خواهید کرد:OutputINSERT 0 3همچنین می توانید مشخص کنید که دستور INSERT با استفاده از عبارت RETURNING برخی یا تمام داده های درج شده را باز گرداند:Timeseries=# INSERT INTO conditionsTimeseries=# VALUES (NOW(), ‘weather-pro-000002’, 70.1, 50.1) RETURNING *;خروجی زیر را مشاهده خواهید کرد:Outputtime | device_id | temperature | humidity——————————-+——————–+————-+———-2020-05-30 05:31:27.842009+00 | weather-pro-000002 | 70.1 | 50.1(1 row)اگر می خواهید داده ها را از hypertable حذف کنید ، از دستور استاندارد DELETE SQL استفاده کنید. موارد زیر را اجرا کنید تا هرکدام از داده ها که دارای دمای بالاتر از 80 یا رطوبت بالای 50 باشد ، حذف کنید:Timeseries=# DELETE FROM conditions WHERE temperature &gt; 80;Timeseries=# DELETE FROM conditions WHERE humidity &gt; 50;پس از عمل حذف ، توصیه می شود از دستور VACUUM استفاده کنید ، تا فضایی که هنوز توسط داده هایی که حذف شده اند مورد استفاده قرار می گیرد آزاد شود.Timeseries=# VACUUM conditions;می توانید اطلاعات بیشتری در مورد دستور VACUUM در مستندات PostgreSQL بیابید.این فرمان ها برای ورود داده ها در مقیاس کوچک مناسب هستند ، اما از آنجا که داده های سری زمانی اغلب داده های عظیمی را از چندین دستگاه به طور همزمان تولید می کنند ، دانستن چگونگی درج صدها یا هزاران سطر به طور همزمان ضروری است. اگر داده های منابع خارجی را به صورت ساختاری ، به عنوان مثال با فرمت csv تهیه کرده اید ، این کار را می توانید به سرعت انجام دهید.برای آزمایش این مرحله ، از یک مجموعه داده نمونه استفاده می کنید که داده های دما و رطوبت را از مکان های مختلف نشان می دهد. این داده ها توسط توسعه دهندگان TimescaleDB ایجاد شده اند تا به شما امکان دهد پایگاه داده خود را امتحان کنید. در مستندات TimescaleDB می توانید اطلاعات بیشتری در مورد مجموعه داده های نمونه را بررسی کنیدسپس داده ها را از مجموعه داده نمونه weather_smallبه پایگاه داده خود وارد میکنید. اول ، از Postgresql خارج شوید:Timeseries=# \qسپس مجموعه داده را دانلود کرده و آن را اکسترکت کنید:$ wget https://timescaledata.blob.core.windows.net/datasets/weather_small.tar.gz$ tar -xvzf weather_small.tar.gzسپس ، داده های دما و رطوبت را به پایگاه داده خود وارد کنید:$ sudo -u postgres psql -d timeseries -c “\COPY conditions FROM weather_small_conditions.csv CSV”این دیتابیس به بانک اطلاعاتی timeseries  متصل می شود و دستور \ COPY را اجرا میکند که داده ها را از فایل انتخاب شده به قسمت conditions در hypertable کپی کند. چند ثانیه طول میکشد تا اجرا شود.پس از وارد کردن داده ها به جدول خود ، خروجی زیر را دریافت خواهید کرد:OutputCOPY 1000000در این مرحله داده ها را به صورت دستی و در گروه هایی به hypertable اضافه می کنید. در مرحله بعدی ، به اجرای درخواست ها ادامه دهید.مرحله 5 – جستجوی داده هااکنون که جدول شما حاوی داده است ، می توانید درخواست های مختلفی را برای تجزیه و تحلیل آن انجام دهید.برای شروع ، وارد پایگاه داده شوید:$ sudo -u postgres psql -d timeseriesهمانطور که قبلاً ذکر شد ، برای کار با hypertables می توانید از دستورات استاندارد SQL استفاده کنید. به عنوان مثال ، برای نشان دادن 10 ورودی گذشته از بخش conditions ، دستور زیر را اجرا کنید:Timeseries=# SELECT * FROM conditions LIMIT 10;خروجی زیر را مشاهده خواهید کرد:Outputtime | device_id | temperature | humidity————————+——————–+——————–+———-2016-11-15 12:00:00+00 | weather-pro-000000 | 39.9 | 49.92016-11-15 12:00:00+00 | weather-pro-000001 | 32.4 | 49.82016-11-15 12:00:00+00 | weather-pro-000002 | 39.800000000000004 | 50.22016-11-15 12:00:00+00 | weather-pro-000003 | 36.800000000000004 | 49.82016-11-15 12:00:00+00 | weather-pro-000004 | 71.8 | 50.12016-11-15 12:00:00+00 | weather-pro-000005 | 71.8 | 49.92016-11-15 12:00:00+00 | weather-pro-000006 | 37 | 49.82016-11-15 12:00:00+00 | weather-pro-000007 | 72 | 502016-11-15 12:00:00+00 | weather-pro-000008 | 31.3 | 502016-11-15 12:00:00+00 | weather-pro-000009 | 84.4 | 87.8(10 rows)این دستور به شما امکان می دهد ببیند چه داده ای در پایگاه داده است. از آنجا که دیتابیس حاوی یک میلیون رکورد است ، شما از LIMIT 10 برای محدود کردن خروجی به 10 ورودی استفاده کردید.برای دیدن جدیدترین ورودی ها ، آرایه داده ها را بر اساس زمانی و به صورت نزولی مرتب کنید:Timeseries=# SELECT * FROM conditions ORDER BY time DESC LIMIT 20;با این کار 20 ورودی اخیر به خروجی فرستاده می شود.همچنین می توانید یک فیلتر اضافه کنید. به عنوان مثال ، برای دیدن ورودی های دستگاه Weather-Pro-000000 ، فرمان های زیر را اجرا کنید:Timeseries=# SELECT * FROM conditions WHERE device_id = ‘weather-pro-000000’ ORDER BY time DESC LIMIT 10;در این حالت ، 10 مورد از آخرین داده های دما و رطوبت ثبت شده توسط دستگاه weather-pro-000000 را مشاهده خواهید کرد.علاوه بر دستورات استاندارد SQL ، TimescaleDB همچنین تعدادی کاركرد ویژه را ارائه می دهد كه برای تجزیه و تحلیل داده های سری زمانی مفید هستند. به عنوان مثال ، برای یافتن میانه مقادیر درجه حرارت ، می توانید از query زیر با عملکرد percentile_cont استفاده کنید:Timeseries=# SELECT percentile_cont(0.5)Timeseries=# WITHIN GROUP (ORDER BY temperature)Timeseries=# FROM conditionsTimeseries=# WHERE device_id = ‘weather-pro-000000’;خروجی زیر را مشاهده خواهید کرد:Outputpercentile_cont——————-40.49999999999998(1 row)به این ترتیب ، دمای متوسط ​​را برای کل دوره مشاهده میکنید که در آن سنسور weather-pro-00000 قرار دارد.برای نمایش آخرین مقادیر از هر یک از سنسورها ، می توانید از آخرین تابع استفاده کنید:Timeseries=# select device_id, last(temperature, time)Timeseries=# FROM conditionsTimeseries=# GROUP BY device_id;در خروجی لیستی از تمام سنسورها و آخرین مقادیر مربوط را مشاهده خواهید کرد.برای بدست آوردن مقادیر اولیه از تابع first استفاده کنید.مثال زیر پیچیده تر است. میانگین دما ، حداقل و حداکثر دما برای سنسور انتخاب شده در 24 ساعت گذشته را نشان می دهد:Timeseries=# SELECT time_bucket(‘1 hour’, time) “hour”,Timeseries=# trunc(avg(temperature), 2) avg_temp,Timeseries=# trunc(min(temperature), 2) min_temp,Timeseries=# trunc(max(temperature), 2) max_tempTimeseries=# FROM conditionsTimeseries=# WHERE device_id = ‘weather-pro-000000’Timeseries=# GROUP BY “hour” ORDER BY “hour” DESC LIMIT 24;در اینجا شما از تابع time_bucket استفاده کرده اید که به عنوان نسخه قدرتمند تابع PostgreSQL date_trunc عمل می کند. در نتیجه خواهید دید که در کدام دوره از روز دمای هوا افزایش یا کاهش می یابد:Outputhour | avg_temp | min_temp | max_temp————————+———-+———-+———-2016-11-16 21:00:00+00 | 42.00 | 42.00 | 42.002016-11-16 20:00:00+00 | 41.92 | 41.69 | 42.002016-11-16 19:00:00+00 | 41.07 | 40.59 | 41.592016-11-16 18:00:00+00 | 40.11 | 39.79 | 40.592016-11-16 17:00:00+00 | 39.46 | 38.99 | 39.792016-11-16 16:00:00+00 | 38.54 | 38.19 | 38.992016-11-16 15:00:00+00 | 37.56 | 37.09 | 38.092016-11-16 14:00:00+00 | 36.62 | 36.39 | 37.092016-11-16 13:00:00+00 | 35.59 | 34.79 | 36.292016-11-16 12:00:00+00 | 34.59 | 34.19 | 34.792016-11-16 11:00:00+00 | 33.94 | 33.49 | 34.192016-11-16 10:00:00+00 | 33.27 | 32.79 | 33.392016-11-16 09:00:00+00 | 33.37 | 32.69 | 34.092016-11-16 08:00:00+00 | 34.94 | 34.19 | 35.492016-11-16 07:00:00+00 | 36.12 | 35.49 | 36.692016-11-16 06:00:00+00 | 37.02 | 36.69 | 37.492016-11-16 05:00:00+00 | 38.05 | 37.49 | 38.392016-11-16 04:00:00+00 | 38.71 | 38.39 | 39.192016-11-16 03:00:00+00 | 39.72 | 39.19 | 40.192016-11-16 02:00:00+00 | 40.67 | 40.29 | 40.992016-11-16 01:00:00+00 | 41.63 | 40.99 | 42.002016-11-16 00:00:00+00 | 42.00 | 42.00 | 42.002016-11-15 23:00:00+00 | 42.00 | 42.00 | 42.002016-11-15 22:00:00+00 | 42.00 | 42.00 | 42.00(24 rows)می توانید توابع مفیدی را در مستندات TimescaleDB بیابید.اکنون می دانید که چگونه می توانید داده های خود را مدیریت کنید. در مرحله بعدی ، نحوه حذف داده های غیر ضروری و نحوه فشرده سازی داده ها را مرور خواهید کرد.مرحله 6 – پیکربندی فشرده سازی و حذف داده هابا تجمع داده ها ، فضای بیشتری در هارد دیسک شما جای می گیرد. برای صرفه جویی در فضا ، آخرین نسخه TimescaleDB یک ویژگی فشرده سازی داده را ارائه می دهد. این ویژگی به هیچ وجه نیازی به تنظیمات فایل سیستم نخواهد داشت و می توان از آن برای کارآمد ساختن سریعتر پایگاه داده استفاده کرد. برای اطلاعات بیشتر در مورد نحوه عملکرد این فشرده سازی ، به مقاله فشرده سازی از TimescaleDB نگاهی بیندازید.ابتدا فشرده سازی hypertable خود را فعال کنید:Timeseries=# ALTER TABLE conditions SET (Timeseries=# timescaledb.compress,Timeseries=# timescaledb.compress_segmentby = ‘device_id’Timeseries=# );خروجی زیر را دریافت خواهید کرد:OutputNOTICE: adding index _compressed_hypertable_2_device_id__ts_meta_sequence_num_idx ON _timescaledb_internal._compressed_hypertable_2 USING BTREE(device_id, _ts_meta_sequence_num)ALTER TABLEتوجه: همچنین می توانید TimescaleDB را برای فشرده سازی داده ها در مدت زمانی مشخص تنظیم کنید. به عنوان مثال ، می توانید دستور زیر را اجرا کنید:Timeseries=# SELECT add_compress_chunks_policy(‘conditions’, INTERVAL ‘7 days’);در این مثال ، داده ها بعد از یک هفته به طور خودکار فشرده می شوند.می توانید آمار مربوط به داده های فشرده شده را با این دستور مشاهده کنید:Timeseries=# SELECT * FROM timescaledb_information.compressed_chunk_stats;سپس لیستی از chunk ها را با وضعیت آنها مشاهده خواهید کرد: وضعیت فشرده سازی و میزان فضای داده های فشرده نشده و فشرده شده در بایت ها.اگر به مدت طولانی نیازی به ذخیره داده ندارید ، می توانید داده های قدیمی را حذف کنید تا حتی فضای بیشتری آزاد شود. برای این کار یک تابع ویژه drop_chunks وجود دارد. به شما امکان می دهد بخش هایی با داده های قدیمی تر از زمان مشخص شده را حذف کنید:Timeseries=# SELECT drop_chunks(interval ’24 hours’, ‘conditions’);این درخواست تمام قسمت ها را از بخش conditions در hypertable که فقط شامل داده های قدیمی تر از روز قبل است ، خالی می کند.خروجی زیر را دریافت خواهید کرد:Outputdrop_chunks—————————————-_timescaledb_internal._hyper_1_2_chunk(1 row)برای حذف خودکار داده های قدیمی ، می توانید یک کار cron پیکربندی کنید. برای کسب اطلاعات بیشتر در مورد نحوه استفاده از cron برای اتوماسیون کارهای مختلف سیستم ، به آموزش ما در این مورد مراجعه کنید.از پایگاه داده خارج شوید:Timeseries=# /qسپس ، crontab خود را با دستور زیر ویرایش کنید ، که باید از پوسته اجرا شود:$ sudo crontab -eاکنون خط زیر را به انتهای فایل اضافه کنید:crontab…0 1 * * * /usr/bin/psql -h localhost -p 5432 -U postgres -d postgres -c “SELECT drop_chunks(intervaاین کار داده های منسوخ را که قدیمی تر از یک روز هستند را ساعت 1 صبح هر روز حذف می کند.نتیجهاکنون TimescaleDB را روی سرور مجازی Ubuntu 20.04 خود تنظیم کرده اید. همچنین ایجاد Hypertables ، قرار دادن داده ها در آن ، جستجوی داده ها ، فشرده سازی و حذف سوابق غیر ضروری را امتحان کردید. با استفاده از این مثالها ، می توانید از مزایای کلیدی TimescaleDB نسبت به سیستم های معمول مدیریت پایگاه داده رابطه ای برای ذخیره داده های سری زمانی استفاده کنید ، از جمله:• نرخ پذیرش بیشتر داده ها• عملکرد سریعتر درخواست ها• ویژگی های زمان گرااکنون که می دانید چگونه داده های سری زمانی را ذخیره کنید ، می توانید از داده ها برای ایجاد نمودار استفاده کنید. TimescaleDB با ابزارهای تجسم مناسب برای PostgreSQL مانند Grafana سازگار است. برای کسب اطلاعات بیشتر در مورد این ابزار محبوب تجسم سازی، می توانید از آموزش نحوه نصب و ایمن کردن Grafana در اوبونتو 20.04 استفاده کنید. اگر مایل به کسب اطلاعات بیشتر در مورد بانکهای اطلاعاتی هستید ، به صفحه مبحث بانک اطلاعات ما نگاهی بیندازید.</description><category>mina goli</category><author>mina goli</author><pubDate>Sun, 21 Jun 2020 15:04:03 +0430</pubDate></item><item><title>نحوه نصب و راه اندازی Laravel با Docker Compose در اوبونتو 20.04</title><link>https://virgool.ir/@goli54479/نحوه-نصب-و-راه-اندازی-laravel-با-docker-compose-در-اوبونتو-2004-w5iak9rct9f2</link><description>کانتینرایز کردن یک برنامه به فرآیند سازگاری یک برنامه و اجزای آن گفته میشود برای اینکه بتوان آن را در محیط های سبک که به کانتینر شناخته می شود اجرا کنید. چنین محیط هایی منزوی و یکبار مصرف هستند و می توانند برای توسعه ، آزمایش و بکارگیری برنامه های کاربردی برای تولید ، از آن استفاده کرد.در این راهنما ، ما از Docker Compose برای کانتینرایز کردن برنامه Laravel برای توسعه استفاده خواهیم کرد. پس از اتمام ، یک برنامه نمایشی Laravel در سه کانتینرها سرویس جداگانه اجرا می شود:• یک سرویس app که PHP7.4-FPM را اجرا میکند.• سرویس db که MySQL 5.7 را اجرا می کند.• سرویس nginx که قبل از ارائه برنامه Laravel به کاربر نهایی از سرویس برنامه برای تجزیه کد PHP استفاده می کند.برای ایجاد یک روند توسعه ساده و تسهیل اشکال زدایی برنامه ، فایل های برنامه را با استفاده از حجم های مشترک همگام سازی خواهیم کرد. همچنین خواهیم دید که چگونه می توان از دستورات docker-compose exec برای اجرای Composer و Artisan در کانتینر برنامه استفاده کرد.پیش نیازها⦁ دسترسی به یک دستگاه محلی یا سرور مجازی توسعه Ubuntu 20.04 به عنوان یک کاربر غیر ریشه و دارای امتیازات sudo. اگر از سرور مجازی راه دور استفاده می کنید ، توصیه می شود یک فایروال فعال نصب شود. برای تنظیم این موارد ، لطفاً به راهنمای راه اندازی سرور مجازی اولیه ما برای اوبونتو 20.04 مراجعه کنید.⦁ Docker نصب شده بر روی سرور مجازی تان، مراحل 1 و 2 نحوه نصب و استفاده از Docker را در اوبونتو 20.04 دنبال کنید.⦁ Docker Compose نصب شده بر روی سرور مجازی تان. مرحله 1 نحوه نصب Docker Compose را در اوبونتو 20.04 را دنبال کنید.مرحله 1 – به دست آوردن برنامه نسخه ی نمایشیبرای شروع ، برنامه نسخه ی نمایشی Laravel را از منبع Github آن دریافت خواهیم کرد. ما علاقه مند به شاخه tutorial-01 هستیم که شامل برنامه اصلی Laravel است که در اولین راهنمای این مجموعه ایجاد کرده ایم.برای به دست آوردن کد برنامه ای که با این آموزش سازگار است ، با دستور زیر آموزش نسخه-1.0.1 را روی دیرکتوری هوم خود دانلود کنید:⦁ $ cd ~⦁ $ curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zip⦁برای باز کردن کد برنامه به دستور unzip نیاز خواهیم داشت. اگر قبلاً این بسته را نصب نکرده اید ، اکنون این کار را انجام دهید:⦁ $ sudo apt update⦁⦁ $ sudo apt install unzipاکنون محتویات برنامه را از حالت فشرده خارج کرده و برای دسترسی آسانتر نام دیرکتوری باز شده را تغییر دهید:⦁ $ unzip travellist.zip⦁⦁ $ mv travellist-laravel-demo-tutorial-1.0.1 travellist-demoبه دیرکتوری travellist-demo بروید:⦁ $ cd travellist-demoدر مرحله بعدی ، یک فایل پیکربندی .env برای تنظیم برنامه ایجاد خواهیم کرد.مرحله 2 – تنظیم فایل .env برنامهفایل های پیکربندی Laravel در پوشه ای به نام config ، در دیرکتوری اصلی برنامه قرار دارند. علاوه بر این ، از یک فایل .env برای تنظیم پیکربندی وابسته به محیط ، مانند اعتبارات و اطلاعاتی که ممکن است بین استقرارها متفاوت باشد ، استفاده می شود. این فایل در revision control گنجانده نشده است.هشدار: فایل تنظیمات محیط شامل اطلاعات حساس در مورد سرور مجازی شما ، از جمله اطلاعات پایگاه داده و کلیدهای امنیتی است. به همین دلیل ، شما هرگز نباید این فایل را به صورت عمومی به اشتراک بگذارید.مقادیر موجود در فایل .env بر مقادیر تعیین شده در فایل های پیکربندی معمولی واقع در دیرکتوری config  ارجحیت دارند. هر نصب بر روی یک محیط جدید نیاز به یک فایل متناسب با محیط دارد تا مواردی از قبیل تنظیمات اتصال بانک اطلاعاتی ، گزینه های اشکال زدایی ، URL برنامه را از موارد دیگری که بسته به نوع محیطی که برنامه در آن اجرا میشود تغییر میکنند، متمایز نماید.اکنون ما یک فایل .env جدید را برای سفارشی کردن گزینه های پیکربندی برای محیط توسعه ای که تنظیم می کنیم ایجاد خواهیم کرد. Laravel با یک فایل.env مثال همراه است که می توانیم آن را کپی کنیم تا نمونه خودمان را ایجاد کنیم:⦁ $ cp .env.example .env⦁این فایل را با استفاده از nano یا ویرایشگر متن مورد نظر خود باز کنید:⦁ $ nano .env⦁فایل .env کنونی از برنامه نمایشی Travellist شامل تنظیماتی برای استفاده از یک پایگاه داده محلی MySQL ، با 127.0.0.1 به عنوان میزبان پایگاه داده است. ما باید متغیر DB_HOST را به روز کنیم تا به سرویس دیتابیس که در محیط Docker خود ایجاد خواهیم کرد اشاره کند. در این راهنما ، ما سرویس دیتابیس خود را db می نامیم. پیش بروید و مقدار ذکر شده DB_HOST را با نام سرویس بانک اطلاعات جایگزین کنید:.envAPP_NAME=TravellistAPP_ENV=devAPP_KEY=APP_DEBUG=trueAPP_URL=http://localhost:8000LOG_CHANNEL=stackDB_CONNECTION=mysqlDB_HOST=dbDB_PORT=3306DB_DATABASE=travellistDB_USERNAME=travellist_userDB_PASSWORD=password…در صورت تمایل می توانید نام بانک اطلاعاتی ، نام کاربری و رمزعبور را نیز تغییر دهید. این متغیرها در مرحله بعدی استفاده می شود که در آن فایل docker-compose.yml را برای پیکربندی خدمات خود تنظیم خواهیم کرد.پس از پایان ویرایش ، فایل را ذخیره کنید. اگر از nano استفاده کرده اید ، می توانید با فشار دادن Ctrl + x این کار را انجام دهید، سپس Y و Enter را برای تأیید فشار دهید.مرحله 3 – تنظیم Dockerfile برنامهاگرچه هر دو سرویس MySQL و Nginx ما مبتنی بر تصاویر پیش فرض به دست آمده از Docker Hub خواهد بود ، اما ما هنوز نیاز به ساختن یک تصویر دلخواه برای کانتینر برنامه داریم. برای آن یک Dockerfile جدید ایجاد خواهیم کرد.تصویر travellist  ما بر اساس PHP: 7.4-fpm تصویر رسمی PHP از Docker Hub خواهد بود. در بالای آن محیط اصلی PHP-FPM ، چند ماژول PHP اضافی و ابزار مدیریت متعلقات Composer را نصب خواهیم کرد.همچنین یک کاربر جدید برای سیستم ایجاد خواهیم کرد. این کار برای اجرای دستورات artisan  و composer  هنگام تهیه برنامه ضروری است. تنظیم uid تضمین می کند که کاربر درون کانتینر دارای همان کاربری است که کاربر سیستم شما در دستگاه میزبان شما دارد ، جایی که running Docker را اجرا میکنید. به این ترتیب ، هر فایل ایجاد شده توسط این دستورات با مجوزهای صحیح در هاست تکرار می شود. این نکته همچنین بدان معنی است که شما می توانید از ویرایشگر کد مورد نظر خود در دستگاه میزبان استفاده کنید تا برنامه ای را که درون کانتینرها اجرا می شود توسعه دهید.یک Dockerfile جدید ایجاد کنید:⦁ $ nano Dockerfileمحتوای زیر را در Dockerfile خود کپی کنید:DockerfileFROM php:7.4-fpm# Arguments defined in docker-compose.ymlARG userARG uid# Install system dependenciesRUN apt-get update &amp;&amp; apt-get install -y \git \curl \libpng-dev \libonig-dev \libxml2-dev \zip \unzip# Clear cacheRUN apt-get clean &amp;&amp; rm -rf /var/lib/apt/lists/*# Install PHP extensionsRUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd# Get latest ComposerCOPY –from=composer:latest /usr/bin/composer /usr/bin/composer# Create system user to run Composer and Artisan CommandsRUN useradd -G www-data,root -u $uid -d /home/$user $userRUN mkdir -p /home/$user/.composer &amp;&amp; \chown -R $user:$user /home/$user# Set working directoryWORKDIR /var/wwwUSER $userفراموش نکنید که فایل را پس از اتمام کار ذخیره کنید.Dockerfile ما با تعریف تصویر پایه ای که ما استفاده می کنیم شروع می شود: php: 7.4-fpm.پس از نصب بسته های سیستم و پسوندهای PHP ، با کپی کردن composer  قابل اجرا از آخرین تصویر رسمی آن روی تصویر برنامه کاربردی خود ، Composer را نصب می کنیم.سپس کاربر جدید سیستم با استفاده از آرگومانهای user و uid که در ابتدای Dockerfile اعلام شد ، ایجاد و تنظیم می شود. این مقادیر توسط Docker Compose در زمان ساخت وارد می شوند.در آخر ، دیرکتوری پیش فرض در حال کار را به عنوان / var / www تنظیم کرده و به کاربر تازه ایجاد شده سوییچ می کنیم. این کار اطمینان حاصل می کند که شما به عنوان یک کاربر معمولی متصل میشوید ، و هنگام اجرای دستورات composer و artisan در کانتینر برنامه ، در کانتینر صحیح قرار دارید.مرحله چهارم – تنظیم پیکربندی Nginx و فایلهای رونوشت دیتابیسهنگام ایجاد محیط های توسعه با Docker Compose ، اغلب لازم است فایل های پیکربندی یا شروع را با کانتینرهای سرویس به اشتراک بگذارید تا این سرویس ها را تنظیم یا به صورت خودکار راه اندازی کنید. این روش ایجاد تغییر در فایل های پیکربندی را برای تنظیم دقیق محیط خود در هنگام تهیه برنامه ، تسهیل می کند.اکنون پوشه ای را با فایل هایی تنظیم خواهیم کرد که برای پیکربندی و شروع کانتینرهای سرویس ما استفاده می شود.برای راه‌اندازی Nginx ، یک فایل travellist.conf را به اشتراک خواهیم گذاشت که نحوه ارائه برنامه را پیکربندی خواهد کرد. پوشه docker-compose / nginx را با دستور زیر ایجاد کنید:⦁ $ mkdir -p docker-compose/nginx⦁فایل جدیدی به نام travellist.conf را در آن دیرکتوری باز کنید:⦁ $ nano docker-compose/nginx/travellist.conf⦁پیکربندی Nginx زیر را در آن فایل کپی کنید:docker-compose/nginx/travellist.confserver {listen 80;index index.php index.html;error_log /var/log/nginx/error.log;access_log /var/log/nginx/access.log;root /var/www/public;location ~ \.php$ {try_files $uri =404;fastcgi_split_path_info ^(.+\.php)(/.+)$;fastcgi_pass app:9000;fastcgi_index index.php;include fastcgi_params;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param PATH_INFO $fastcgi_path_info;}location / {try_files $uri $uri/ /index.php?$query_string;gzip_static on;}}این فایل، Nginx را برای گوش دادن به پورت 80 و استفاده از index.php به عنوان صفحه ایندکس پیش فرض پیکربندی می کند. وroot مطالب را بر روی /var/www/public تنظیم می کند ، و سپس Nginx را برای استفاده از سرویس برنامه در پورت 9000 تنظیم می کند تا فایل های * .php را پردازش کند.پس از پایان ویرایش ، فایل را ذخیره کنید و ببندید.برای راه اندازی بانک اطلاعاتی MySQL ، یک رونوشت پایگاه داده را به اشتراک می گذاریم که هنگام شروع کانتینر ، وارد می شود. این ویژگی ارائه شده توسط تصویر MySQL 5.7 است که ما از آن کانتینرها استفاده خواهیم کرد.یک پوشه جدید برای فایل های شروع MySQL خود در داخل پوشه docker-compose ایجاد کنید:⦁ $ mkdir docker-compose/mysqlیک فایل .sll جدید را باز کنید:⦁ $ nano docker-compose/mysql/init_db.sql⦁رونوشت MySQL زیر بر اساس پایگاه داده ای است که ما در Laravel روی راهنمای LEMP خود تنظیم کرده ایم. و یک جدول جدید به نام places ایجاد می کند. سپس ، جدول را با مجموعه ای از مکان های نمونه پر می کند.کد زیر را به فایل اضافه کنید:docker-compose/mysql/db_init.sqlDROP TABLE IF EXISTS `places`;CREATE TABLE `places` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,`visited` tinyint(1) NOT NULL DEFAULT ‘0’,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;INSERT INTO `places` (name, visited) VALUES (‘Berlin’,0),(‘Budapest’,0),(‘Cincinnati’,1),(‘Denver’,0),(‘Helsinki’,0),(‘Lisbon’,0),(‘Moscow’,1),(‘Nairobi’,0),(‘Oslo’,1),(‘Rio’,0),(‘Tokyo’,0);جدول places  شامل سه فیلد است: id ، name و visited. قسمت visited ، فلگی است که برای شناسایی مکانهایی که هنوز در حالت to go هستند، استفاده می شود. در تغییر مکان های نمونه یا مکان های جدید آزادانه عمل کنید. پس از اتمام کار ، فایل را ذخیره کنید و ببندید.ما تنظیمات Dockerfile برنامه و فایل های پیکربندی سرویس را به پایان رساندیم. در مرحله بعدی ، Docker Compose را تنظیم خواهیم کرد تا هنگام ایجاد خدمات ، از این فایل ها استفاده کنیم.مرحله 5 – ایجاد یک محیط چند کانتینری با Docker ComposeDocker Compose به شما امکان می دهد محیطهای چند کانتینری را برای برنامه های در حال اجرا در Docker ایجاد کنید. با استفاده از تعاریف سرویس ، محیط های کاملاً قابل تنظیم با چندین کانتینر را ایجاد می کند که می توانند شبکه ها و حجم داده ها را به اشتراک بگذارند. این امر امکان ادغام یکپارچه بین اجزای برنامه را فراهم می آورد.برای تنظیم تعاریف سرویس ، یک فایل جدید با نام docker-compose.yml ایجاد خواهیم کرد. به طور معمول ، این فایل در ریشه پوشه برنامه قرار دارد و محیط کانتینر شده شما ، از جمله تصاویر پایه ای که برای ساخت کانتینرهای خود استفاده خواهید کرد ، و نحوه تعامل سرویس های شما را تعریف می کند.ما سه سرویس مختلف را در فایل docker-compose.yml خود تعریف خواهیم کرد: app ،db و nginx.سرویس app براساس Dockerfile که قبلاً ایجاد کرده ایم ، تصویری به نام travellist ایجاد می کند. کانتینر تعریف شده توسط این سرویس ، سرور مجازی php-fpm را برای تجزیه کد PHP اجرا می کند و نتایج را به سرویس nginx ارسال می کند ، که روی یک کانتینر جداگانه اجرا می شود. سرویس mysql یک کانتینر تعریف می کند که سرور مجازی MySQL 5.7 را راه اندازی می کند. سرویس های ما شبکه پل مانندی با نام travellist را به اشتراک می گذارند.فایل های برنامه هم در app و هم سوریس های nginx از طریق bind mounts (نصب های اتصالی) همگام می شوند. bind mounts در محیط های توسعه مفید هستند زیرا امکان همگام سازی دو طرفه بین دستگاه میزبان و کانتینرها را فراهم می کنند.یک فایل docker-compose.yml جدید در ریشه پوشه برنامه ایجاد کنید:⦁ $ nano docker-compose.yml⦁یک فایل معمولی docker-compose.yml با تعریف نسخه شروع می شود و به دنبال آن یک گره services  قرار می گیرد که تحت آن همه سرویس ها تعریف می شوند. شبکه های اشتراکی معمولاً در پایین آن فایل تعریف می شوند.برای شروع ، این کد boilerplate را در فایل docker-compose.yml خود کپی کنید:docker-compose.ymlversion: “3.7”services:networks:travellist:driver: bridgeاکنون گره services  را ویرایش خواهیم کرد تا خدمات app ، db و nginx را شامل شود.سرویس appسرویس app کانتینری به نام travellist-app را تنظیم میکند. این تصویر جدید Docker را بر اساس Dockerfile که در همان مسیر فایل docker-compose.yml قرار دارد ، می سازد. تصویر جدید به صورت محلی تحت عنوان travellist ذخیره می شود.حتی اگر ریشه سند به عنوان برنامه در کانتینر nginx قرار داشته باشد ، ما به فایل های برنامه نیز در جایی داخل کانتینر برنامه نیاز داریم ، بنابراین می توانیم وظایف خط فرمان را با ابزار Laravel Artisan اجرا کنیم.تعریف خدمات زیر را در زیر گره خدمات خود ، درون فایل docker-compose.yml کپی کنید:docker-compose.ymlapp:build:args:user: sammyuid: 1000context: ./dockerfile: Dockerfileimage: travellistcontainer_name: travellist-apprestart: unless-stoppedworking_dir: /var/www/volumes:– ./:/var/wwwnetworks:– travellistاین تنظیمات موارد زیر را انجام می دهد:⦁ Build: این پیکربندی به Docker Compose می گوید یک تصویر محلی برای سرویس app ، با استفاده از مسیر مشخص شده (محتوا) و Dockerfile برای دستورالعمل ها بسازد. آرگومان های user و uid برای سفارشی سازی دستورات ایجاد کاربر در زمان ساخت به Dockerfile تزریق می شوند.⦁ Image: نامی که برای تصویر استفاده خواهد شد ساخته میشود.⦁ container_name: نام کانتینر را برای این سرویس تنظیم می کند.⦁ Restart: همیشه ریستارت میکند ، مگر اینکه سرویس متوقف شود.⦁ working_dir: دایرکتوری پیش فرض برای این سرویس را به عنوان / var / www تنظیم می کند.⦁ Volumes: یک والیوم مشترک ایجاد می کند که محتویات موجود از دایرکتوری فعلی را به / var / www داخل کانتینر همگام سازی می کند. توجه کنید که این، ریشه سند شما نیست ، زیرا در کانتینر nginx قرار دارد.⦁ networks: برای استفاده از شبکه ای به نام Travellist ، این سرویس را تنظیم میکند.سرویس dbسرویس db از تصویر پیش ساخته MySQL 5.7 از Docker Hub استفاده می کند. از آنجا که Docker Compose به طور خودکار فایلهای متغیر .env را که در همان دیرکتوری فایل docker-compose.yml قرار دارد لود می کند ، می توانیم تنظیمات پایگاه داده خود را از فایل Laravel .env که در مرحله قبلی ایجاد کردیم ، بدست آوریم.تعریف سرویس زیر را درست بعد از سرویس app در گره services  خود وارد کنید:docker-compose.ymldb:image: mysql:5.7container_name: travellist-dbrestart: unless-stoppedenvironment:MYSQL_DATABASE: ${DB_DATABASE}MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}MYSQL_PASSWORD: ${DB_PASSWORD}MYSQL_USER: ${DB_USERNAME}SERVICE_TAGS: devSERVICE_NAME: mysqlvolumes:– ./docker-compose/mysql:/docker-entrypoint-initdb.dnetworks:– travellistاین تنظیمات موارد زیر را انجام می دهد:⦁ Image: تصویر Docker را که باید برای این کانتینر استفاده شود ، تعریف می کند. در این حالت ، ما از تصویر MySQL 5.7 Docker Hub استفاده می کنیم.⦁ container_name:نام کانتینر را برای این سرویس تنظیم می کند: travellist-db.⦁ restart: همیشه این سرویس را ریستارت کنید ، مگر اینکه صریحاً متوقف شده باشد.⦁ environment: متغیرهای محیط را در کانتینر جدید تعریف می کند. ما برای تنظیم سرویس MySQL از مقادیر به دست آمده از فایل Laravel .env استفاده می کنیم که به طور خودکار یک پایگاه داده جدید و کاربر را بر اساس متغیرهای محیط ارائه شده ایجاد می کند.⦁ Volumes:یک حجم برای به اشتراک گذاشتن یک پایگاه داده dsql ایجاد می کند که برای شروع بانک اطلاعاتی برنامه کاربردی خواهد بود. تصویر MySQL به طور خودکار فایل های .ql قرار داده شده در دیرکتوری /docker-entrypoint-initdb.d را درون کانتینر وارد می کند.⦁ networks: برای استفاده از شبکه ای به نام Travellist ، این سرویس را تنظیم میکند.سرویس nginxسرویس nginx از یک تصویر پیش ساخته Nginx در بالای Alpine ، توزیع لینوکس سبک استفاده می کند. کانتینری به نام travellist-nginx ایجاد می کند و از تعریف پورت ها برای ایجاد تغییر مسیر از پورت 8000 روی سیستم میزبان برای پورت 80 درون کانتینر استفاده می کند.تعریف خدمات زیر را در گره خدمات خود ، درست بعد از سرویس db وارد کنید:این تنظیمات موارد زیر را انجام می دهد:docker-compose.ymlnginx:image: nginx:1.17-alpinecontainer_name: travellist-nginxrestart: unless-stoppedports:– 8000:80volumes:– ./:/var/www– ./docker-compose/nginx:/etc/nginx/conf.dnetworks:– travellist⦁ Image: تصویر Docker را که باید برای این کانتینر استفاده شود ، تعریف می کند. در این حالت ، ما از تصویر Alpine Nginx 1.17 استفاده می کنیم.⦁ container_name: نام کانتینر را برای این سرویس تنظیم می کند: travellist-nginx⦁ restart: همیشه این سرویس را ریستارت کنید ، مگر اینکه صریحاً متوقف شده باشد.⦁ ports: تغییر مسیر پورت را تنظیم می کند که امکان دسترسی خارجی از طریق پورت 8000 به سرور مجازی وب را که پورت 80 در داخل کانتینر کار می کند ، فراهم می کند.⦁ volumes: دو والیوم مشترک ایجاد می کند. اولی همگام سازی محتوا از دیرکتوری فعلی با / var / www داخل کانتینر را انجام میدهد. به این ترتیب ، وقتی تغییرات محلی را در فایل های برنامه اعمال می کنید ، به سرعت در برنامه ارائه شده توسط Nginx در داخل کانتینر منعکس می شوند. دومی اطمینان حاصل خواهد کرد که فایل پیکربندی Nginx ، واقع در docker-compose / nginx / travellist.conf ، در پوشه تنظیمات Nginx کانتینر کپی شده است.⦁ networks: برای استفاده از شبکه ای به نام Travellist ، این سرویس را تنظیم کنید.فایل docker-compose.yml پایانیفایل docker-compose.yml نهایی این گونه خواهد بود:docker-compose.ymlversion: “3.7”services:app:build:args:user: sammyuid: 1000context: ./dockerfile: Dockerfileimage: travellistcontainer_name: travellist-apprestart: unless-stoppedworking_dir: /var/www/volumes:– ./:/var/wwwnetworks:– travellistdb:image: mysql:5.7container_name: travellist-dbrestart: unless-stoppedenvironment:MYSQL_DATABASE: ${DB_DATABASE}MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}MYSQL_PASSWORD: ${DB_PASSWORD}MYSQL_USER: ${DB_USERNAME}SERVICE_TAGS: devSERVICE_NAME: mysqlvolumes:– ./docker-compose/mysql:/docker-entrypoint-initdb.dnetworks:– travellistnginx:image: nginx:alpinecontainer_name: travellist-nginxrestart: unless-stoppedports:– 8000:80volumes:– ./:/var/www– ./docker-compose/nginx:/etc/nginx/conf.d/networks:– travellistnetworks:travellist:driver: bridgeاطمینان حاصل کنید که فایل را پس از پایان کار ذخیره کنید.مرحله 6 – اجرای برنامه با Docker Composeاکنون برای ایجاد تصویر برنامه و اجرای سرویس هایی که در مجموعه خود مشخص کرده ایم ، از دستورات docker-compose استفاده خواهیم کرد.تصویر app را با دستور زیر بسازید:⦁ $ docker-compose build app⦁این دستور ممکن است چند دقیقه طول بکشد تا تکمیل شود. خروجی مشابه این را مشاهده خواهید کرد:OutputBuilding appStep 1/11 : FROM php:7.4-fpm—&gt; fa37bd6db22aStep 2/11 : ARG user—&gt; Running in f71eb33b7459Removing intermediate container f71eb33b7459—&gt; 533c30216f34Step 3/11 : ARG uid—&gt; Running in 60d2d2a84cdaRemoving intermediate container 60d2d2a84cda—&gt; 497fbf904605Step 4/11 : RUN apt-get update &amp;&amp; apt-get install -y git curl libpng-dev libonig-dev …Step 7/11 : COPY –from=composer:latest /usr/bin/composer /usr/bin/composer—&gt; e499f74896e3Step 8/11 : RUN useradd -G www-data,root -u $uid -d /home/$user $user—&gt; Running in 232ef9c7dbd1Removing intermediate container 232ef9c7dbd1—&gt; 870fa3220ffaStep 9/11 : RUN mkdir -p /home/$user/.composer &amp;&amp; chown -R $user:$user /home/$user—&gt; Running in 7ca8c0cb7f09Removing intermediate container 7ca8c0cb7f09—&gt; 3d2ef9519a8eStep 10/11 : WORKDIR /var/www—&gt; Running in 4a964f91edfaRemoving intermediate container 4a964f91edfa—&gt; 00ada639da21Step 11/11 : USER $user—&gt; Running in 9f8e874fede9Removing intermediate container 9f8e874fede9—&gt; fe176ff4702bSuccessfully built fe176ff4702bSuccessfully tagged travellist:latestپس از اتمام ساخت ، می توانید محیط را در حالت پس زمینه اجرا کنید:⦁ $ docker-compose up -d⦁ Output⦁ Creating travellist-db … done⦁ Creating travellist-app … done⦁ Creating travellist-nginx … done⦁این کار کانتینرهای شما را در پس زمینه اجرا می کند. برای نشان دادن اطلاعات در مورد وضعیت خدمات فعال خود ، این دستور را اجرا کنید:⦁ $ docker-compose psخروجی مانند این را خواهید دید:OutputName Command State Ports——————————————————————————–travellist-app docker-php-entrypoint php-fpm Up 9000/tcptravellist-db docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcptravellist-nginx /docker-entrypoint.sh ngin … Up 0.0.0.0:8000-&gt;80/tcpاکنون محیط شما در حال اجرا است ، اما ما هنوز باید چند دستور را اجرا کنیم تا تنظیمات برنامه به پایان برسد. برای اجرای دستورات موجود در کانتینرهای سرویس مانند ls-l می توانید از دستور docker-compose برای نمایش اطلاعات در مورد فایل ها در دیرکتوری برنامه استفاده کنید:⦁ $ docker-compose exec app ls -l⦁ Outputtotal 260-rw-rw-r– 1 sammy sammy 737 Jun 9 11:19 Dockerfile-rw-rw-r– 1 sammy sammy 101 Jan 7 08:05 README.mddrwxrwxr-x 6 sammy sammy 4096 Jan 7 08:05 app-rwxr-xr-x 1 sammy sammy 1686 Jan 7 08:05 artisandrwxrwxr-x 3 sammy sammy 4096 Jan 7 08:05 bootstrap-rw-rw-r– 1 sammy sammy 1501 Jan 7 08:05 composer.json-rw-rw-r– 1 sammy sammy 179071 Jan 7 08:05 composer.lockdrwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 configdrwxrwxr-x 5 sammy sammy 4096 Jan 7 08:05 databasedrwxrwxr-x 4 sammy sammy 4096 Jun 9 11:19 docker-compose-rw-rw-r– 1 sammy sammy 965 Jun 9 11:27 docker-compose.yml-rw-rw-r– 1 sammy sammy 1013 Jan 7 08:05 package.json-rw-rw-r– 1 sammy sammy 1405 Jan 7 08:05 phpunit.xmldrwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 public-rw-rw-r– 1 sammy sammy 273 Jan 7 08:05 readme.mddrwxrwxr-x 6 sammy sammy 4096 Jan 7 08:05 resourcesdrwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 routes-rw-rw-r– 1 sammy sammy 563 Jan 7 08:05 server.phpdrwxrwxr-x 5 sammy sammy 4096 Jan 7 08:05 storagedrwxrwxr-x 4 sammy sammy 4096 Jan 7 08:05 testsdrwxrwxr-x 41 sammy sammy 4096 Jun 9 11:32 vendor-rw-rw-r– 1 sammy sammy 538 Jan 7 08:05 webpack.mix.jsاکنون composer install را برای نصب متعلقات برنامه اجرا میکنیم:⦁ $ docker-compose exec app composer install⦁خروجی مانند این را خواهید دید:OutputLoading composer repositories with package informationInstalling dependencies (including require-dev) from lock filePackage operations: 85 installs, 0 updates, 0 removals– Installing doctrine/inflector (1.3.1): Downloading (100%)– Installing doctrine/lexer (1.2.0): Downloading (100%)– Installing dragonmantank/cron-v2.3.0): Downloading (100%)– Installing erusev/parsedown (1.7.4): Downloading (100%)– Installing symfony/polyfill-ctype (v1.13.1): Downloading (100%)– Installing phpoption/phpoption (1.7.2): Downloading (100%)– Installing vlucas/phpdotenv (v3.6.0): Downloading (100%)– Installing symfony/css-selector (v5.0.2): Downloading (100%)…Generating optimized autoload files&gt; Illuminate\Foundation\ComposerScripts::postAutoloadDump&gt; @php artisan package:discover –ansiDiscovered Package: facade/ignitionDiscovered Package: fideloper/proxyDiscovered Package: laravel/tinkerDiscovered Package: nesbot/carbonDiscovered Package: nunomaduro/collisionPackage manifest generated successfully.آخرین کاری که قبل از تست برنامه باید انجام دهیم تولید یک کلید برنامه منحصر به فرد با ابزار خط فرمان artisan Laravel است. این کلید برای رمزگذاری بخش های کاربر و سایر داده های حساس استفاده می شود:⦁ $ docker-compose exec app php artisan key:generate⦁OutputApplication key set successfully.اکنون به مرورگر خود بروید و به نام دامنه یا آدرس IP سرور مجازی خود در پورت 8000 دسترسی پیدا کنید:http://server_domain_or_IP:8000توجه:در این حالت این دمو را در دستکاه محلی خود اجرا میکنید، از http://localhost:8000 برای دسترسی به برنامه از مرورگر خود استفاده کنید.صفحه ای را به این شکل مشاهده خواهید کرد:می توانید از دستور logs برای بررسی ورود های ایجاد شده توسط سرویس های خود استفاده کنید:⦁ $ docker-compose logs nginx⦁Attaching to travellist-nginx…travellist-nginx | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.shtravellist-nginx | /docker-entrypoint.sh: Configuration complete; ready for start uptravellist-nginx | 192.168.0.1 – – [09/Jun/2020:11:46:34 +0000] “GET / HTTP/1.1” 200 627 “-” “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36”travellist-nginx | 192.168.0.1 – – [09/Jun/2020:11:46:35 +0000] “GET / HTTP/1.1” 200 627 “-” “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36”اگر می خواهید در هنگام حفظ وضعیت کلیه سرویس های آن ، محیط Docker Compose را متوقف کنید ، این دستور را اجرا کنید:⦁ $ docker-compose pauseOutputPausing travellist-db … donePausing travellist-nginx … donePausing travellist-app … doneبرای ادامه دوباره برنامه:⦁ $ docker-compose unpauseOutputUnpausing travellist-app … doneUnpausing travellist-nginx … doneUnpausing travellist-db … doneبرای خاموش کردن محیط Docker Compose و حذف همه کانتینرها ، شبکه ها و والیوم های آن ، این دستور را اجرا کنید:⦁ $ docker-compose downOutputStopping travellist-nginx … doneStopping travellist-db … doneStopping travellist-app … doneRemoving travellist-nginx … doneRemoving travellist-db … doneRemoving travellist-app … doneRemoving network travellist-laravel-demo_travellistبرای مشاهده کلیه دستورات Docker Compose ، لطفاً مرجع خط فرمان Docker Compose را بررسی کنید.نتیجهدر این راهنما ، ما یک محیط Docker با سه کانتینر را با استفاده از Docker Compose تنظیم کرده ایم تا زیرساخت های خود را در یک فایل YAML تعریف کنیم.از این مرحله به بعد ، می توانید بدون نیاز به نصب و راه اندازی یک سرور مجازی وب محلی برای توسعه و آزمایش بر روی برنامه Laravel خود کار کنید. علاوه بر این ، با یک محیط یکبار مصرف که می تواند به راحتی تکثیر و توزیع شود ، کار می کنید ، که می تواند در هنگام تهیه برنامه شما و همچنین هنگام حرکت به سمت یک محیط تولید ، مفید باشد.</description><category>mina goli</category><author>mina goli</author><pubDate>Sun, 21 Jun 2020 15:03:12 +0430</pubDate></item></channel></rss>