سرور مجازی

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

  • ۰
  • ۰

نحوه نصب متابیس در اوبونتو 20.04 با داکر

ورود به سایت

معرفی

Metabase یک ابزار مبتنی بر جاوا منبع باز هوش تجاری (BI) است. این می تواند به تعدادی پایگاه داده مختلف متصل شود و یک ابزار سازنده سوال دارد که می تواند پیچیدگی پرس و جوهای بزرگ SQL را پنهان کند.

در این آموزش شما Metabase را با استفاده از Docker Compose نصب می‌کنید، سپس Nginx را نصب می‌کنید تا به عنوان یک پروکسی معکوس برای سایت متابیس شما عمل کند. سپس، اتصالات HTTPS ایمن را با استفاده از Certbot برای دانلود و پیکربندی یک گواهی TLS از Let’s Encrypt Certificate Authority فعال می کنید. در نهایت، Metabase را پیکربندی می‌کنید و برخی از داده‌های نمونه را بارگیری می‌کنید تا بتوانید سؤالات و داشبوردهای BI خود را بسازید.

پیش نیازها

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

یک سرور اوبونتو 20.04 با 2 یا بیشتر CPU، یک کاربر غیر ریشه با دسترسی sudo و یک فایروال. برای تنظیم این، آموزش راه اندازی سرور اولیه ما با اوبونتو 20.04 را دنبال کنید.
داکر نصب شده است. مراحل 1 و 2 نحوه نصب و استفاده از Docker در اوبونتو 20.04 را دنبال کنید تا آن را نصب کنید و کاربر غیر روت خود را پیکربندی کنید تا بتواند دستورات docker را اجرا کند.

در نهایت، برای فعال کردن TLS به یک نام دامنه نیاز دارید که به آدرس IP عمومی سرور شما اشاره شده باشد. این باید چیزی شبیه example.com یا metabase.example.com باشد. اگر از DigitalOcean استفاده می کنید، لطفاً برای کسب اطلاعات در مورد ایجاد منابع دامنه در کنترل پنل خود، به Start سریع DNS ما مراجعه کنید.

هنگامی که تمام پیش نیازها را آماده کردید، به مرحله 1 بروید، جایی که بسته docker-compose را نصب خواهید کرد.

مرحله 1 – نصب Docker Compose

برای نصب ابزار خط فرمان docker-compose، ابتدا لیست بسته خود را بازخوانی کنید:

sudo apt update

سپس بسته را با استفاده از apt نصب کنید:

sudo apt install docker-compose

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

docker-compose –version

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

 

Output

docker-compose version 1.25.0, build unknown
docker-py version: 4.1.0
CPython version: 3.8.10

هنگامی که تأیید کردید که Docker Compose روی سرور شما نصب شده است، از آن برای پیکربندی و راه اندازی Metabase در مرحله بعدی این آموزش استفاده خواهید کرد.

مرحله 2 – اجرای Metabase با Docker Compose

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

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

mkdir ~/metabase

سپس در آن حرکت کنید:

cd ~/metabase

اکنون یک فایل YAML خالی جدید به نام docker-compose.yml را با استفاده از nano یا ویرایشگر دلخواه خود باز کنید:

nano docker-compose.yml

شما از این فایل با دستور docker-compose برای راه اندازی ظرف Metabase خود استفاده خواهید کرد. خطوط زیر را به فایل اضافه کنید:

docker-compose.yml

version: '3'
services:
  metabase:
    image: metabase/metabase:latest
    ports:
      - "3000:3000"
    volumes:
      - data:/metabase

volumes:
  data:

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

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

اکنون آماده هستید تا ظرف متابیس را با دستور docker-compose راه اندازی کنید:

docker-compose up -d

فرمان فرعی up به docker-compose می‌گوید که ظرف و حجم(های) و شبکه(های) مرتبط را که در فایل docker-compose.yml شما تعریف شده‌اند، راه اندازی کند. پرچم -d (که مخفف “daemonize” است) به docker-compose می‌گوید که کانتینر را در پس‌زمینه اجرا کند تا فرمان ترمینال شما را نگیرد. docker-compose زمانی که تصویر Docker مورد نیاز را دانلود می‌کند و سپس کانتینر را راه‌اندازی می‌کند، خروجی مختصری را چاپ می‌کند:

 

Output

Creating network "metabase_default" with the default driver
Creating volume "metabase_data" with default driver
Pulling metabase (metabase/metabase:latest)...
latest: Pulling from metabase/metabase
. . .

docker-compose stop

وقتی این کار انجام شد، Metabase باید در حال اجرا باشد. می توانید با واکشی صفحه اصلی با استفاده از دستور curl آزمایش کنید که یک وب سرور در 127.0.0.1:3000 اجرا می شود:

curl –head http://localhost:3000

با این کار فقط سرصفحه های HTTP از پاسخ چاپ می شود:

 

Output

HTTP/1.1 200 OK
Date: Tue, 15 Mar 2022 19:26:22 GMT
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Last-Modified: Tue, 15 Mar 2022 19:26:22 GMT
Strict-Transport-Security: max-age=31536000
Set-Cookie: metabase.DEVICE=3525ed6d-13e0-4ad0-8fdb-f1bc426706dc;HttpOnly;Path=/;Expires=Sat, 15 Mar 2042 19:26:22 GMT;SameSite=Lax
X-Permitted-Cross-Domain-Policies: none
Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'none'; script-src 'self' 'unsafe-eval' https://maps.google.com https://apis.google.com https://*.googleapis.com *.gstatic.com https://www.google-analytics.com   'sha256-lMAh4yjVuDkQ9NqkK4H+YHUga+anpFs5JAuj/uZh0Rs=' 'sha256-ib2/2v5zC6gGM6Ety7iYgBUvpy/caRX9xV/pzzV7hf0=' 'sha256-JJa56hyDfUbgNfq+0nq6Qs866JKgZ/+qCq2pkDJED8k='; child-src 'self' https://accounts.google.com; style-src 'self' 'unsafe-inline'; font-src 'self' ; img-src * 'self' data:; connect-src 'self' metabase.us10.list-manage.com www.google-analytics.com https://sp.metabase.com ; manifest-src 'self';  frame-ancestors 'none';
Content-Type: text/html;charset=utf-8
Expires: Tue, 03 Jul 2001 06:00:00 GMT
Content-Length: 0
Server: Jetty(9.4.43.v20210629)

پاسخ OK 200 به این معنی است که یک برنامه در پورت 3000 پاسخ می دهد. هدرهای Set-Cookie و Server برجسته شده تأیید می کنند که برنامه Metabase در سرور وب Jetty اجرا می شود.

سپس Nginx را برای پراکسی کردن ترافیک عمومی به کانتینر Metabase راه‌اندازی می‌کنیم.

مرحله 3 – نصب و پیکربندی Nginx

قرار دادن یک وب سرور مانند Nginx در مقابل سرور Metabase شما می‌تواند عملکرد را با بارگذاری ذخیره‌سازی، فشرده‌سازی و سرویس فایل استاتیک برای فرآیندی کارآمدتر بهبود بخشد. ما قصد داریم Nginx را نصب کنیم و آن را به گونه ای پیکربندی کنیم که درخواست های پراکسی را به Metabase معکوس کند، به این معنی که از رسیدگی به درخواست های کاربران شما به Metabase و بازگشت مجدد مراقبت می کند. استفاده از فرآیند Nginx غیر کانتینری اضافه کردن گواهینامه‌های Let’s Encrypt TLS را در مرحله بعدی آسان‌تر می‌کند.

ابتدا لیست بسته خود را بازخوانی کنید، سپس Nginx را با استفاده از apt نصب کنید:

sudo apt install nginx

با استفاده از نمایه برنامه Nginx Full UFW، ترافیک عمومی به پورت های 80 و 443 (HTTP و HTTPS) را مجاز کنید:

sudo ufw allow “Nginx Full”

 

Output

Rule added
Rule added (v6)

در مرحله بعد، یک فایل پیکربندی جدید Nginx را در پوشه /etc/nginx/sites-available باز کنید. ما سایت خود را metabase.conf می نامیم اما می توانید از نام دیگری استفاده کنید:

sudo nano /etc/nginx/sites-available/metabase.conf

موارد زیر را در فایل پیکربندی جدید جای‌گذاری کنید، مطمئن شوید که your_domain_here را با دامنه‌ای که پیکربندی کرده‌اید برای اشاره به سرور متابیس خود جایگزین کنید. برای مثال باید چیزی شبیه metabase.example.com باشد:

/etc/nginx/sites-available/metabase.conf

server {
    listen       80;
    listen       [::]:80;
    server_name  your_domain_here;

    access_log  /var/log/nginx/metabase.access.log;
    error_log   /var/log/nginx/metabase.error.log;

    location / {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Proto https;
      proxy_pass http://localhost:3000;
  }
}

این پیکربندی فعلاً فقط HTTP است، زیرا به Certbot اجازه می‌دهیم تا در مرحله بعدی پیکربندی TLS را انجام دهد. بقیه فایل پیکربندی مکان های ورود به سیستم را تنظیم می کند و سپس تمام ترافیک و همچنین برخی از هدرهای پراکسی مهم را به همراه http://localhost:3000، ظرف Metabase که در مرحله قبل راه اندازی کردیم، ارسال می کند.

فایل را ذخیره کرده و ببندید، سپس با پیوند دادن آن به /etc/nginx/sites-enabled/ پیکربندی را فعال کنید:

sudo ln -s /etc/nginx/sites-available/metabase.conf /etc/nginx/sites-enabled/

از nginx -t برای بررسی درست بودن نحو فایل پیکربندی استفاده کنید:

sudo nginx -t

 

Output

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

و در نهایت سرویس nginx را با پیکربندی جدید بارگیری مجدد کنید:

sudo systemctl reload nginx.service

سایت متابیس شما اکنون باید با HTTP ساده در دسترس باشد. http://your_domain_here را بارگیری کنید (ممکن است مجبور شوید از طریق یک هشدار امنیتی کلیک کنید) و به شکل زیر خواهد بود:

اکنون که سایت خود را از طریق HTTP راه‌اندازی کرده‌اید، زمان آن رسیده است که اتصال را با گواهی‌های Certbot و Let’s Encrypt ایمن کنید. شما باید این کار را قبل از انجام مراحل راه اندازی مبتنی بر وب متابیس انجام دهید.

مرحله 4 – نصب Certbot و راه‌اندازی گواهی‌های TLS

به لطف Certbot و مجوز مجوز رایگان Let’s Encrypt، افزودن رمزگذاری TLS به برنامه Metabase شما تنها دو دستور را می‌گیرد.

ابتدا Certbot و افزونه Nginx آن را نصب کنید:

sudo apt install certbot python3-certbot-nginx

سپس، certbot را در حالت –nginx اجرا کنید و همان دامنه ای را که در دستورالعمل پیکربندی Nginx server_name استفاده کرده اید، مشخص کنید:

sudo certbot –nginx -d your_domain_here

از شما خواسته می شود با شرایط خدمات Let’s Encrypt موافقت کنید و یک آدرس ایمیل وارد کنید.

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

پس از آن، Let’s Encrypt درخواست شما را تایید می کند و Certbot گواهی شما را دانلود می کند:

 

Output

Congratulations! You have successfully enabled https://metabase.example.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=metabase.example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/metabase.example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/metabase.example.com/privkey.pem
   Your cert will expire on 2022-05-09. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

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

Certbot به طور خودکار Nginx را با پیکربندی و گواهی های جدید بارگیری می کند. سایت خود را مجدداً در مرورگر خود بارگیری کنید و اگر گزینه تغییر مسیر را انتخاب کنید، باید به طور خودکار شما را به HTTPS تغییر دهد.

سایت شما اکنون ایمن است و ادامه مراحل راه اندازی مبتنی بر وب بی خطر است.

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

به مرورگر وب خود برگردید، صفحه را دوباره بارگیری کنید. اکنون باید صفحه پیکربندی پایگاه داده Metabase را از طریق یک اتصال امن https:// باز کنید. اکنون می توانید با کلیک روی دکمه Let’s get start، فرآیند پیکربندی را تکمیل کنید.

از شما خواسته می شود که جزئیات زیر را وارد کنید:

زبان مورد علاقه شما چیست؟ اگر زبان شما در لیست است، آن را انتخاب کنید و در تصویر زیر روی Next کلیک کنید:

شما را چه صدا کنیم؟ تمام فیلدها را پر کنید و مطمئن شوید که رمز عبور خود را در جایی امن ثبت کرده اید.

اطلاعات خود را اضافه کنید: روی گزینه I’ll add my data later در پایین صفحه کلیک کنید

تنظیمات برگزیده داده استفاده: برای کمک به بهبود ابزار، انتخاب کنید که آیا می‌خواهید داده‌های استفاده را با Metabase به اشتراک بگذارید. پس از انتخاب خود روی Finish کلیک کنید.

همه چیز آماده اید! اگر می‌خواهید به‌روزرسانی‌های پروژه Metabase را دریافت کنید، آدرس ایمیل خود را اضافه کنید، در غیر این صورت می‌توانید این قسمت را نادیده بگیرید.

در نهایت روی دکمه Take me to Metabase کلیک کنید. به صفحه‌ای می‌رسید که روی آن «سلام، سامی» در بالا آمده است، با مجموعه‌ای از اشعه‌های ایکس از پیش پیکربندی‌شده که می‌توانید روی آن کلیک کنید تا داده‌های نمونه‌ای را که بارگیری کرده‌اید بررسی کنید.

برای مشاهده جزئیات جدول در متابیس روی هر X-Ray کلیک کنید. می‌توانید از کنترل‌های صفحه X-Ray برای فیلتر کردن داده‌ها یا کشف فیلدها و جداول پایگاه داده مرتبط استفاده کنید.

وقتی آماده هستید که سؤال خود را ایجاد کنید (این اصطلاحی است که Metabase برای توصیف یک پرس و جو استفاده می کند)، روی نماد Browse data grid در سمت راست بالای صفحه خود کلیک کنید. روی کاشی Sample Database کلیک کنید و سپس روی جدولی از لیست کلیک کنید. در این مثال از جدول Reviews استفاده می کنیم.

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

اکنون بر روی دکمه خلاصه در سمت راست بالای صفحه خود کلیک کنید و قسمت Summarize by را به Average of Rating تغییر دهید. Metabase این مقدار را بر اساس داده های جدول در قسمت Rating محاسبه می کند. همچنین گروه با فیلد را به Created At تغییر دهید، زیرا این فیلد به Metabase اجازه می‌دهد تا میانگین رتبه‌بندی محصول در هر ماه را در تمام محصولات و رتبه‌بندی‌های نمونه محاسبه کند.

روی دکمه Done در پایین سمت راست کلیک کنید و در صفحه‌ای قرار می‌گیرید که نموداری از میانگین رتبه‌بندی محصول را مانند تصویر زیر نشان می‌دهد:

روی دکمه Done در پایین سمت راست کلیک کنید و در صفحه‌ای قرار می‌گیرید که نموداری از میانگین رتبه‌بندی محصول را مانند تصویر زیر نشان می‌دهد:

نتیجه

در این آموزش، ابزار Metabase BI را با استفاده از Docker Compose راه‌اندازی کردید، سپس یک پروکسی معکوس Nginx راه‌اندازی کردید و آن را با استفاده از گواهی‌های Let’s Encrypt TLS ایمن کردید. شما همچنین چند نمونه از داده‌ها را اضافه کردید، و با ایجاد سؤالات خود در Metabase آزمایش کردید تا داده‌ها را پرس و جو کنید.

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

برچسب‌ها:Metabase یک ابزار مبتنی بر جاوااتصال به سرور مجازی لینوکساوبونتو 20.04 با داکرخرید سرور مجازیخرید سرور مجازی فرانسهسرور مجازینحوه نصب متابیسنصب Certbotنصب Docker Composeنصب و پیکربندی Nginxهوش تجاری (BI)

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
  • ۰
  • ۰

 نحوه نصب و استفاده از Homebrew در لینوکس

ورود به سایت

معرفی

Homebrew یک مدیر بسته است که در ابتدا برای macOS توسعه داده شد تا به شما امکان می دهد نرم افزار رایگان و منبع باز را با استفاده از ترمینال خود نصب کنید. سیستم‌های لینوکس همگی از مدیران بسته داخلی خود مانند apt در دبیان، اوبونتو و مشتقات و dnf در Red Hat، Fedora و Rocky Linux برای نصب برنامه‌ها و ابزارها از مخازن بسته‌های قابل اعتماد و نگهداری شده استفاده می‌کنند.

با این حال، نصب همه نرم افزارها از طریق apt یا dnf همیشه عملی نیست. به عنوان مثال، برخی از زبان‌های برنامه‌نویسی ترجیح می‌دهند از مدیریت بسته‌های خود مانند پیتون پایتون یا npm Node.js برای نصب اسکریپت‌ها یا کتابخانه‌های اضافی که در حساب کاربری شما بومی‌سازی شده‌اند استفاده کنند.

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

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

پیش نیازها

  • یک سرور لینوکس یا محیط دسکتاپ، و یک کاربر غیر ریشه با امتیازات sudo.
  • گیت ابزار کنترل نسخه بر روی دستگاه شما نصب شده است.

مرحله 1 – نصب یک محیط کامپایلر

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

در اوبونتو، می‌توانید بسته‌ای به نام build-essential نصب کنید که تمام بسته‌های مورد نیاز برای یک محیط کامپایلر مدرن و با پشتیبانی خوب را فراهم می‌کند. بسته را با apt نصب کنید:

sudo apt build-essential

در راکی لینوکس، CentOS یا سایر مشتقات RedHat، می‌توانید گروهی از بسته‌ها به نام ابزار توسعه را نصب کنید تا عملکرد کامپایلر یکسانی را ارائه دهید. بسته ها را با dnf نصب کنید:

dnf groups mark install “Development Tools”
dnf groupinstall “Development Tools”

شما می توانید با بررسی وجود دستور make در سیستم خود اطمینان حاصل کنید که یک کامپایلر در دسترس است. برای انجام این کار از دستور which استفاده کنید:

which make

 

Output

/usr/bin/make

اکنون که یک کامپایلر فعال دارید، می توانید Homebrew را نصب کنید.

مرحله 2 – نصب و راه اندازی Homebrew

برای نصب Homebrew، یک اسکریپت نصب را دانلود کرده و سپس اسکریپت را اجرا می کنید.

ابتدا اسکریپت را در دستگاه محلی خود دانلود کنید:

curl -fsSL -o install.sh https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh

این دستور از curl برای دانلود اسکریپت نصب Homebrew از مخزن Homebrew’s Git در GitHub استفاده می کند.

بیایید از طریق پرچم هایی که با دستور curl مرتبط هستند عبور کنیم:

  • پرچم -f یا –fail به پوسته می گوید که هیچ خروجی سند HTML روی خطاهای سرور ارائه نکند.
  • پرچم -s یا –silent کرل را بی صدا می کند تا متر پیشرفت را نشان ندهد و همراه با پرچم -S یا –show-error این اطمینان را ایجاد می کند که curl در صورت عدم موفقیت، پیام خطا را نشان می دهد.
  • پرچم -L یا –location به curl می گوید که تغییر مسیرها را مدیریت کند. اگر سرور گزارش دهد که صفحه درخواستی به مکان دیگری منتقل شده است، به طور خودکار درخواست را دوباره با استفاده از مکان جدید اجرا می کند.
  • سوئیچ -o نام فایل محلی را برای فایل مشخص می کند. سوئیچ -o به جای نمایش محتویات روی صفحه، محتویات را در فایلی که شما مشخص کرده اید ذخیره می کند.

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

less install.sh

هنگامی که با محتوای اسکریپت راحت شدید، اسکریپت را با دستور bash اجرا کنید:

/bin/bash install.sh

اسکریپت نصب توضیح می دهد که چه کاری انجام می دهد و از شما می خواهد تأیید کنید که می خواهید آن را انجام دهید. این به شما امکان می دهد قبل از اینکه اجازه دهید Homebrew دقیقاً چه کاری با سیستم شما انجام دهد. همچنین تضمین می کند که پیش نیازهای لازم را قبل از ادامه آن دارید.

از شما خواسته می شود که رمز عبور خود را در طول فرآیند وارد کنید. اگر امتیازات sudo ندارید، می توانید به جای آن Ctrl+D را فشار دهید تا این دستور را دور بزنید و Homebrew با مجوزهای محدودتر نصب می شود. می توانید این گزینه را در مستندات Homebrew مرور کنید.

هر زمان که از شما خواسته شد تا نصب را تأیید کنید، حرف y را برای “بله” فشار دهید.

پس از تکمیل، خروجی نصب Homebrew شامل مراحل بعدی نیز می شود تا محیط پوسته خود را برای کار با بسته های Homebrew پیکربندی کنید. این پیکربندی تضمین می کند که ابزار Homebrew به نفع ابزارهای ارائه شده توسط مدیر بسته سیستم استفاده می شود. دستورات را از خروجی خود کپی و جایگذاری کنید تا مسیرهای پیکربندی صحیح در سیستم شما شناسایی شود. مثال زیر از bash است:

 

Output

==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
    echo 'eval "$(/home/sammy/.linuxbrew/bin/brew shellenv)"' >> /home/sammy/.profile
    eval "$(/home/sammy/.linuxbrew/bin/brew shellenv)"

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

اکنون بررسی کنید که Homebrew به درستی تنظیم شده است. این دستور را اجرا کنید:

brew doctor

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

 

Output

Your system is ready to brew.

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

مرحله 3 – نصب، ارتقا و حذف بسته ها

اکنون که Homebrew نصب شده است، از آن برای دانلود یک بسته استفاده کنید. دستور درخت به شما امکان می دهد یک درخت دایرکتوری گرافیکی را ببینید و از طریق Homebrew در دسترس است.

درخت را با دستور brew install نصب کنید:

brew install tree

Homebrew لیست بسته های خود را به روز می کند و سپس دستور درخت را دانلود و نصب می کند:

 

Output

. . .
==> Downloading https://ghcr.io/v2/homebrew/core/tree/manifests/2.0.2
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/tree/blobs/sha256:e1d7569f6930271d694e739e93eb026aac1e8b386
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:e1d7569f6930271d694e739
######################################################################## 100.0%
==> Pouring tree--2.0.2.x86_64_linux.bottle.tar.gz
🍺  /home/linuxbrew/.linuxbrew/Cellar/tree/2.0.2: 8 files, 162.4KB
==> Running `brew cleanup tree`...

Homebrew فایل‌ها را به‌طور پیش‌فرض در /home/linuxbrew/.linuxbrew/bin/ نصب می‌کند، بنابراین با به‌روزرسانی‌های آینده لینوکس تداخلی ندارند. با نمایش مکان دستور با کدام دستور تأیید کنید که درخت نصب شده است:

which tree

خروجی نشان می دهد که درخت در /home/linuxbrew/.linuxbrew/bin/ قرار دارد:

 

Output

/home/linuxbrew/.linuxbrew/bin/tree

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

tree –version

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

 

Output

tree v2.0.2 (c) 1996 - 2022 by Steve Baker, Thomas Moore, Francesc Rocher, Florian Sesser, Kyosuke Tokoro

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

brew upgrade tree

می‌توانید برای ارتقای همه برنامه‌ها و بسته‌هایی که Homebrew مدیریت می‌کند، بدون هیچ استدلال اضافی، ارتقاء دم را اجرا کنید.

هنگامی که نسخه جدیدی را نصب می کنید، Homebrew نسخه قدیمی را در اطراف نگه می دارد. پس از مدتی، ممکن است بخواهید فضای دیسک را با حذف این کپی‌های قدیمی‌تر بازیابی کنید. برای حذف تمام نسخه‌های قدیمی نرم‌افزار مدیریت شده توسط Homebrew خود، Brew cleanup را اجرا کنید.

برای حذف بسته‌ای که دیگر از آن استفاده نمی‌کنید، از brew uninstall استفاده کنید. برای حذف دستور درخت، این دستور را اجرا کنید:

brew uninstall tree

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

 

Output

Uninstalling /home/linuxbrew/.linuxbrew/Cellar/tree/2.0.2... (8 files, 162.4KB)

مرحله 4 – حذف نصب Homebrew

اگر دیگر نیازی به Homebrew ندارید، می توانید از اسکریپت حذف نصب آن استفاده کنید.

دانلود اسکریپت حذف با curl:

curl -fsSL -o uninstall.sh https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh

مثل همیشه، محتویات اسکریپت را با دستور less برای تایید محتویات اسکریپت مرور کنید:

less uninstall.sh

هنگامی که اسکریپت را تأیید کردید، اسکریپت را با پرچم –help اجرا کنید تا گزینه های مختلفی را که می توانید استفاده کنید مشاهده کنید:

bash uninstall.sh –help

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

 

Output

Homebrew Uninstaller
Usage: uninstall.sh [options]
    -p, --path=PATH  Sets Homebrew prefix. Defaults to /usr/local.
        --skip-cache-and-logs
                     Skips removal of HOMEBREW_CACHE and HOMEBREW_LOGS.
    -f, --force      Uninstall without prompting.
    -q, --quiet      Suppress all output.
    -d, --dry-run    Simulate uninstall but don't remove anything.
    -h, --help       Display this message.

از پرچم -d استفاده کنید تا ببینید اسکریپت چه کاری انجام می دهد:

bash uninstall.sh -d

اسکریپت همه چیزهایی را که حذف می کند فهرست می کند:

 

Output

Warning: This script would remove:
/home/linuxbrew/.linuxbrew/Caskroom/
/home/linuxbrew/.linuxbrew/Cellar/
/home/linuxbrew/.linuxbrew/Homebrew/
/home/linuxbrew/.linuxbrew/Homebrew/.dockerignore
/home/linuxbrew/.linuxbrew/Homebrew/.editorconfig
. . .

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

bash uninstall.sh

این کار Homebrew و هر برنامه ای را که با آن نصب کرده اید حذف می کند.

نتیجه

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

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/

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

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه تنظیم سهمیه های سیستم فایل در اوبونتو 20.04

ورود به سایت

معرفی

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

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

پیش نیازها

این آموزش فرض می‌کند که شما وارد سرور اوبونتو 20.04 شده‌اید، با یک کاربر غیر ریشه و دارای sudo فعال، همانطور که در راه‌اندازی سرور اولیه با اوبونتو 20.04 توضیح داده شده است. تکنیک‌های این آموزش معمولاً باید روی توزیع‌های لینوکس به غیر از اوبونتو کار کنند، اما ممکن است نیاز به تطبیق داشته باشند.

مرحله 1 – نصب Quota Tools

برای تنظیم و بررسی سهمیه ها، ابتدا باید ابزارهای خط فرمان سهمیه را با استفاده از apt نصب کنید. ابتدا لیست بسته را به روز کنید، سپس بسته را نصب کنید:

sudo apt update
sudo apt install quota

با اجرای دستور quota و درخواست اطلاعات نسخه آن، می توانید تأیید کنید که ابزارها نصب شده اند:

quota –version

 

Output

Quota utilities version 4.05.
. . .

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

بعد مطمئن شوید که ماژول های هسته مناسب برای نظارت بر سهمیه ها را دارید.

مرحله 2 – ماژول Quota Kernel را نصب کنید

اگر روی یک سرور مجازی مبتنی بر ابر هستید، نصب پیش‌فرض لینوکس اوبونتو ممکن است ماژول‌های هسته مورد نیاز برای پشتیبانی از مدیریت سهمیه را نداشته باشد. برای بررسی، از find برای جستجوی ماژول های quota_v1 و quota_v2 در فهرست /lib/modules/… استفاده می کنید:

find /lib/modules/ -type f -name ‘*quota_v*.ko*’

 

Output

/lib/modules/5.4.0-99-generic/kernel/fs/quota/quota_v2.ko
/lib/modules/5.4.0-99-generic/kernel/fs/quota/quota_v1.ko

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

اگر هیچ خروجی از دستور بالا دریافت نکردید، بسته linux-image-extra-virtual را نصب کنید:

sudo apt install linux-image-extra-virtual

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

برای فعال کردن سهمیه ها در یک فایل سیستم خاص، باید آن را با چند گزینه مرتبط با سهمیه مشخص شده نصب کنید. می توانید این کار را با به روز رسانی ورودی سیستم فایل در فایل پیکربندی /etc/fstab انجام دهید. آن فایل nano یا ویرایشگر متن دلخواه خود را باز کنید:

sudo nano /etc/fstab

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

/etc/fstab

LABEL=cloudimg-rootfs   /        ext4   defaults        0 0
LABEL=UEFI      /boot/efi       vfat    defaults        0 0

این فایل fstab از یک سرور مجازی است. یک رایانه رومیزی یا لپ تاپ احتمالاً fstab کمی متفاوت خواهد داشت، اما در بیشتر موارد شما یک فایل سیستم / یا root خواهید داشت که تمام فضای دیسک شما را نشان می دهد.

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

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

/etc/fstab

LABEL=cloudimg-rootfs   /        ext4   usrquota,grpquota        0 0
. . .

این تغییر به ما این امکان را می دهد که سهمیه های کاربر (usrquota) و گروهی (grpquota) را در سیستم فایل فعال کنیم. اگر فقط به یکی یا دیگری نیاز دارید، ممکن است گزینه استفاده نشده را کنار بگذارید. اگر در خط fstab شما از قبل به جای پیش‌فرض گزینه‌های فهرست شده بود، باید گزینه‌های جدید را به انتهای هر چیزی که از قبل وجود دارد اضافه کنید، مطمئن شوید که همه گزینه‌ها را با کاما و بدون فاصله از هم جدا کنید.

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

sudo mount -o remount /

در اینجا از پرچم -o برای عبور از گزینه remount استفاده می شود.

 

Output

mount: /etc/fstab: parse error

می توانید با مشاهده فایل /proc/mounts بررسی کنید که از گزینه های جدید برای نصب فایل سیستم استفاده شده است. در اینجا، از grep استفاده کنید تا فقط ورودی سیستم فایل ریشه در آن فایل را نشان دهید:

cat /proc/mounts | grep ‘ / ‘

 

Output

/dev/vda1 / ext4 rw,relatime,quota,usrquota,grpquota 0 0

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

مرحله 4 – فعال کردن سهمیه ها

قبل از اینکه در نهایت سیستم سهمیه را روشن کنید، باید یک بار دستور quotacheck را به صورت دستی اجرا کنید:

sudo quotacheck -ugm /

این دستور فایل های /aquota.user و /aquota.group را ایجاد می کند. این فایل‌ها حاوی اطلاعاتی درباره محدودیت‌ها و استفاده از سیستم فایل هستند و قبل از روشن کردن نظارت بر سهمیه باید وجود داشته باشند. پارامترهای quotacheck مورد استفاده عبارتند از:

u: مشخص می کند که یک فایل سهمیه مبتنی بر کاربر باید ایجاد شود
g: نشان می دهد که یک فایل سهمیه مبتنی بر گروه باید ایجاد شود
m: نصب مجدد فایل سیستم را به عنوان فقط خواندنی در حین انجام محاسبه اولیه سهمیه ها غیرفعال می کند. نصب مجدد فایل سیستم به‌عنوان فقط خواندنی، در صورتی که کاربر به طور فعال فایل‌ها را در طول فرآیند ذخیره کند، نتایج دقیق‌تری به دست می‌دهد، اما در این راه‌اندازی اولیه ضروری نیست.
اگر نیازی به فعال کردن سهمیه‌های مبتنی بر کاربر یا گروه ندارید، می‌توانید گزینه quotacheck مربوطه را کنار بگذارید.

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

ls /

 

Output

aquota.group  bin   dev  home        initrd.img.old  lib64       media  opt   root  sbin  srv  tmp  var      vmlinuz.old
aquota.user   boot  etc  initrd.img  lib             lost+found  mnt    proc  run   snap  sys  usr  vmlinuz

اگر گزینه های u یا g را در دستور quotacheck وارد نکرده باشید، فایل مربوطه از بین خواهد رفت.

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

sudo modprobe quota_v1 -S 5.4.0-99-generic
sudo modprobe quota_v2 -S 5.4.0-99-generic

اکنون برای روشن کردن سیستم سهمیه آماده هستید:

sudo quotaon -v /

 

quotaon Output

/dev/vda1 [/]: group quotas turned on
/dev/vda1 [/]: user quotas turned on

سرور شما اکنون در حال نظارت و اجرای سهمیه ها است، اما ما هنوز هیچ کدام را تنظیم نکرده ایم! در مرحله بعد یک سهمیه دیسک برای یک کاربر تعیین می کنید.

مرحله 5 – پیکربندی سهمیه ها برای یک کاربر

چند راه برای تعیین سهمیه برای کاربران یا گروه ها وجود دارد. در اینجا، نحوه تنظیم سهمیه ها با هر دو دستور edquota و setquota را بررسی خواهید کرد.

استفاده از edquota برای تعیین سهمیه کاربر

از دستور edquota برای ویرایش سهمیه ها استفاده کنید. بیایید سهمیه کاربر سامی نمونه شما را ویرایش کنیم:

sudo edquota -u sammy

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

با این کار، فایلی در ویرایشگر متن پیش‌فرض شما باز می‌شود، مشابه اینکه crontab -e یک فایل موقت را برای ویرایش شما باز می‌کند. فایل شبیه به این خواهد بود:

Disk quotas for user sammy (uid 1000):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/vda1                        40          0          0         13        0        0

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

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

بیایید کاربر سامی شما را به‌روزرسانی کنیم تا سهمیه بلوکی با محدودیت نرم افزاری 100 مگابایتی و محدودیت سخت 110 مگابایتی داشته باشد:

Disk quotas for user sammy (uid 1000):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/vda1                        40       100M       110M         13        0        0

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

sudo quota -vs sammy

 

Output

Disk quotas for user sammy (uid 1000):
     Filesystem   space   quota   limit   grace   files   quota   limit   grace
      /dev/vda1     40K    100M    110M              13       0       0

این فرمان وضعیت سهمیه فعلی شما را خروجی می دهد و نشان می دهد که سهمیه شما 100M است در حالی که حد شما 110M است. این به ترتیب با محدودیت های نرم و سخت مطابقت دارد.

استفاده از setquota برای تعیین سهمیه کاربر

برخلاف edquota، setquota اطلاعات سهمیه کاربر شما را در یک دستور، بدون مرحله ویرایش تعاملی، به‌روزرسانی می‌کند. شما نام کاربری و محدودیت‌های نرم و سخت را برای سهمیه‌های مبتنی بر بلوک و inode و در نهایت سیستم فایل برای اعمال سهمیه در موارد زیر مشخص خواهید کرد:

sudo setquota -u sammy 200M 220M 0 0 /

دستور بالا محدودیت های سهمیه مبتنی بر بلوک سامی را به 200 مگابایت و 220 مگابایت دوبرابر می کند. 0 0 برای محدودیت های نرم و سخت مبتنی بر inode نشان می دهد که آنها تنظیم نشده باقی می مانند. این مورد نیاز است حتی اگر هیچ سهمیه مبتنی بر inode تنظیم نکنید.

یک بار دیگر از دستور quota برای بررسی کار خود استفاده کنید:

sudo quota -vs sammy

 

Output

Disk quotas for user sammy (uid 1000):
     Filesystem   space   quota   limit   grace   files   quota   limit   grace
      /dev/vda1     40K    200M    220M              13       0       0

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

مرحله 6 – ایجاد گزارش های سهمیه

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

sudo repquota -s /

 

Output

*** Report for user quotas on device /dev/vda1
Block grace time: 7days; Inode grace time: 7days
                        Space limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --   1696M      0K      0K          75018     0     0
daemon    --     64K      0K      0K              4     0     0
man       --   1048K      0K      0K             81     0     0
nobody    --   7664K      0K      0K              3     0     0
syslog    --   2376K      0K      0K             12     0     0
sammy     --     40K    200M    220M             13     0     0

در این مثال شما در حال تولید یک گزارش برای فایل سیستم / root هستید. دستور -s به repquota می گوید که در صورت امکان از اعداد قابل خواندن توسط انسان استفاده کند. تعداد کمی از کاربران سیستم لیست شده اند که احتمالاً هیچ سهمیه ای به طور پیش فرض ندارند. سامی کاربر شما با مقادیر استفاده شده و محدودیت های نرم و سخت در پایین لیست شده است.

همچنین به Block grace time: 7days callout و ستون grace توجه کنید. اگر کاربر شما بیش از حد نرمال بود، ستون grace نشان می دهد که چقدر زمان برای بازگشت به زیر محدودیت باقی مانده است.

مرحله 7 – پیکربندی یک دوره مهلت برای بیش از حد

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

sudo setquota -t 864000 864000 /

دستور بالا هر دو زمان grace block و inode را روی 864000 ثانیه یا 10 روز تنظیم می کند. این تنظیم برای همه کاربران اعمال می‌شود و هر دو مقدار باید ارائه شوند حتی اگر از هر دو نوع سهمیه استفاده نمی‌کنید (block در مقابل inode).

توجه داشته باشید که مقادیر باید در ثانیه مشخص شوند.

دوباره repquota را اجرا کنید تا بررسی کنید که آیا تغییرات اعمال شده اند:

sudo repquota -s /

 

Output

Block grace time: 10days; Inode grace time: 10days
. . .

تغییرات باید بلافاصله در خروجی repquota منعکس شود.

نتیجه

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

پیوست: پیام های خطای رایج مربوط به سهمیه

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

 

quotaon Output

quotaon: cannot find //aquota.group on /dev/vda1 [/]
quotaon: cannot find //aquota.user on /dev/vda1 [/]

این خطایی است که ممکن است در صورت تلاش برای روشن کردن سهمیه ها (با استفاده از quotaon) قبل از اجرای فرمان quotacheck اولیه، مشاهده کنید. دستور quotacheck فایل های سهمیه یا سهمیه مورد نیاز برای روشن کردن سیستم سهمیه را ایجاد می کند. برای اطلاعات بیشتر به مرحله 4 مراجعه کنید.

 

quotaon Output

quotaon: using //aquota.group on /dev/vda1 [/]: No such process
quotaon: Quota format not supported in kernel.
quotaon: using //aquota.user on /dev/vda1 [/]: No such process
quotaon: Quota format not supported in kernel.

این خطای quotaon به ما می گوید که هسته شما از سهمیه ها پشتیبانی نمی کند، یا حداقل از نسخه صحیح پشتیبانی نمی کند (هر دو نسخه quota_v1 و quota_v2 وجود دارد). این بدان معناست که ماژول های هسته مورد نیاز شما نصب نشده اند یا به درستی بارگذاری نمی شوند. در سرور اوبونتو، محتمل‌ترین دلیل این امر استفاده از یک تصویر نصب شده بر روی یک سرور مجازی مبتنی بر ابر است.

اگر اینطور است، با نصب بسته لینوکس-تصویر-اکسترا-مجازی با apt قابل رفع است. برای جزئیات بیشتر به مرحله 2 مراجعه کنید.

اگر این خطا پس از نصب ادامه داشت، مرحله 4 را مرور کنید. مطمئن شوید که یا به درستی از دستورات modprobe استفاده کرده اید، یا اگر این گزینه برای شما مناسب است، سرور خود را راه اندازی مجدد کرده اید.

 

quota Output

quota: Cannot open quotafile //aquota.user: Permission denied
quota: Cannot open quotafile //aquota.user: Permission denied
quota: Cannot open quotafile //quota.user: No such file or directory

اگر quota را اجرا کنید و کاربر فعلی شما مجوز خواندن فایل های سهمیه سیستم فایل شما را نداشته باشد، این خطایی است که مشاهده خواهید کرد. شما (یا مدیر سیستم شما) باید مجوزهای فایل را به درستی تنظیم کنید یا هنگام اجرای دستوراتی که نیاز به دسترسی به فایل سهمیه دارند از sudo استفاده کنید.

 

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/

برچسب‌ها:اتصال به سرور مجازیخرید سرور مجازیخرید سرور مجازی فرانسهخرید سرور مجازی قویدستور edquotaسرور اوبونتو 20.04سرور مجازیلینوکسماژول Quota Kernelنصب Quota Tools

 

  • behnam gol mohamadi
  • ۰
  • ۰

 نحوه استفاده از توابع در PHP

ورود به سایت

معرفی

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

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

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

توابع تعریف شده توسط کاربر

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

ایجاد و فراخوانی توابع

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

hello.php

<?php
function hello() {
    echo "Hello World!";
}

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

hello.php

<?php
function hello() {
    echo "Hello World!";
}
hello();

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

 

Output

Hello World!

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

hello.php

<?php
$hello = "Hello World!";
echo $hello;

این دو خط نتیجه مشابه تابع و فراخوانی را ارائه می دهند:

 

Output

Hello World!

اجازه دهید تابع مثال را برای پذیرش ورودی گسترش دهیم.

آرگومان ها و پارامترها

برای ایجاد یک تابع hello که رابطه ای بین ورودی و خروجی ایجاد می کند، تابع باید مقداری ورودی را بپذیرد. این ورودی به عنوان یک متغیر بین پرانتزهای تعریف تابع پذیرفته می شود. سپس این متغیر را می توان در بدنه تابع استفاده کرد:

hello.php

<?php
function hello($name) {
    echo "Hello ".$name;
}
hello();

تابع hello اکنون یک پارامتر ذخیره شده در متغیر $name را می پذیرد. سپس این متغیر در بدنه تابع با الحاق رشته “Hello” به متغیر $name با استفاده از . عملگر الحاق رشته ها اکنون تابع نیاز دارد که هنگام فراخوانی تابع، یک ورودی ارسال شود، اما ورودی ارائه نشده است، و باعث می شود PHP با خطا پاسخ دهد:

 

Output

Warning:  Uncaught ArgumentCountError: Too few arguments to function hello(), 0 passed in php shell code on line 1 and exactly 1 expected

هنگامی که تابع hello فراخوانی می شود، برای استفاده به عنوان ورودی نیاز به یک آرگومان دارد که مقدار $name را تعیین می کند. اصطلاح پارامتر زمانی استفاده می شود که بخشی از تعریف تابع باشد و اصطلاح آرگومان زمانی استفاده می شود که بخشی از فراخوانی تابع باشد. هر دو به ورودی یک تابع اشاره دارند. برای ارائه ورودی به تابع، یک آرگومان بین پرانتز فراخوانی تابع ارسال می کنیم:

hello.php

<?php
function hello($name) {
    echo "Hello ".$name;
}
hello("Sammy");

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

 

Output

Hello Sammy

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

مقادیر پیش فرض اختیاری

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

hello.php

<?php
function hello($name, $greeting = "Hello") {
    echo $greeting." ".$name;
}
hello("Sammy", "Bonjour");

اکنون یک پارامتر دوم به نام $greeting وجود دارد. سپس این متغیر در بدنه تابع برای تغییر مقدار بخش تبریک خروجی استفاده می شود:

 

Output

Bonjour Sammy

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

hello.php

<?php
function hello($name, $greeting = "Hello") {
    echo $greeting." ".$name;
}
hello("Sammy");

هنگامی که تنها یک آرگومان ارسال می شود، مقدار متغیر $greeting روی مقدار پیش فرض “Hello” تنظیم می شود:

 

Output

Hello Sammy

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

مقدار تهی اختیاری

زمانی که یک متغیر کاملا اختیاری است و اصلاً نیازی به مقدار ندارد، مقدار پیش‌فرض را می‌توان null تعریف کرد. مقدار null فضایی را برای یک مقدار بدون اضافه کردن یک مقدار اضافی نگه می دارد:

hello.php

<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
    echo $greeting." ".$name.$punctuation;
}
hello("Sammy");

متغیر is “اعلام شده” است، بنابراین هنگام تلاش بدنه تابع برای دسترسی به متغیر، خطایی وجود نخواهد داشت، و با این حال، متغیر “تنظیم نشده” در نظر گرفته می شود، بنابراین خروجی اضافی اضافه نخواهد شد:

 

Output

Hello Sammy

ارزش های بازگشتی

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

hello.php

<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
    return $greeting." ".$name.$punctuation;
}
hello("Sammy");
echo hello("Sammy");

در اولین فراخوانی تابع hello، هیچ کاری با مقدار برگشتی انجام نمی شود، و به نظر می رسد که هیچ اتفاقی نیفتاده است، حتی اگر کد موجود در تابع اجرا شده باشد. در فراخوانی دوم تابع hello، کلمه کلیدی echo قبل از فراخوانی تابع استفاده می‌شود و به PHP می‌گوید نتایج خروجی برگشتی را چاپ کند:

 

Output

Hello Sammy

ما همیشه مجبور نیستیم نتیجه را چاپ کنیم. این نتایج همچنین می توانند در یک متغیر ذخیره شوند یا به عنوان ورودی برای تابع دیگری استفاده شوند.

فراخوانی توابع در یک تابع

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

hello.php

<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY");

خط اول در تابع hello اکنون مقداری قالب بندی برای مقدار $name اعمال می کند. ابتدا رشته را به حروف کوچک تبدیل می کند. تابع strtolower مقداری را برمی گرداند که بلافاصله در تابع دوم، ucwords استفاده می شود. این حرف اول هر کلمه را به حروف بزرگ تبدیل می کند. تابع hello اکنون بدون در نظر گرفتن ورودی دریافتی، یک خروجی با فرمت ثابت ارائه می دهد:

 

Output

Hello Sammy

اعلانات نوع

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

hello.php

<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello(123);

PHP هیچ گونه مشکلی در شعبده بازی ندارد، که عدد صحیح 123 را به رشته “123” تبدیل می کند، سپس تابع را مانند قبل ادامه می دهد:

 

Output

Hello 123

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

hello.php

<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
    // $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello(["Sammy", "World"]);

این بار کد یک اطلاعیه ارائه می دهد، اما خیلی واضح نیست. همچنین، بسته به نحوه راه‌اندازی سیستم، اعلان‌ها می‌توانند خاموش یا نادیده گرفته شوند زیرا اجرای کد را متوقف نمی‌کنند. ممکن است متوجه نباشیم که مشکلی وجود دارد، یا ممکن است در تشخیص محل وقوع مشکل با مشکل مواجه شویم. خروجی به نظر می رسد که گویی رشته “Array” به تابع ارسال شده است:

 

Output

Notice: Array to string conversion in php shell code on line 2
Hello Array

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

اعلان نوع پارامتر

اعلان‌های نوع پارامتر تضمین می‌کنند که مقدار آرگومان که هنگام فراخوانی تابع استفاده می‌شود، با نوع مشخص شده مطابقت دارد. در غیر این صورت، یک TypeError پرتاب می شود. بیایید نوع رشته را به پارامتر $name خود اضافه کنیم و آرگومان های آرایه را دوباره امتحان کنیم. این بار می توانیم خط stringtolower را نگه داریم زیرا به آن کد دسترسی پیدا نمی کند:

hello.php

<?php
function hello(string $name, $greeting = "Hello", $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello(["Sammy", "World"]);

این بار فراخوانی تابع باعث ایجاد یک استثنا می شود که اجرای کد را متوقف می کند، بنابراین خروجی معتبری به نظر نمی رسد. پیام همچنین واضح تر است که خطا در واقع وجود دارد:

 

Output

Warning: Uncaught TypeError: Argument 1 passed to hello() must be of the type string, array given

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

hello.php

<?php
function hello(string $name, $greeting = "Hello", $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello(123);

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

 

Output

Hello 123

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

انواع سختگیرانه

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

hello.php

<?php
declare(strict_types=1);
function hello(string $name, $greeting = "Hello", $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello(123);

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

 

Output

PHP Fatal error:  Uncaught TypeError: Argument 1 passed to hello() must be of the type string, int given.

انواع Nullable

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

hello.php

<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", string $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY", "Hola", null);

از آنجایی که مقدار پیش‌فرض پارامتر سوم روی null تنظیم شده است، آرگومان null و همچنین یک رشته مجاز است:

 

Output

Hola Sammy

با این حال، هنگامی که مقدار پیش فرض یک پارامتر به عنوان یک رشته اعلام می شود، دیگر مقدار تهی را نمی پذیرد:

hello.php

<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", string $punctuation = "!") {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY", "Hola", null);

در عوض TypeError داده می شود:

 

Output

Warning: Uncaught TypeError: hello(): Argument #3 ($punctuation) must be of type string, null given

وقتی مقدار پیش‌فرض یک پارامتر چیزی غیر از null باشد، اما null نیز یک ورودی معتبر باشد، PHP دستور اضافی را برای تعریف آن رابطه با اضافه کردن یک علامت سوال قبل از اعلان نوع ارائه می‌کند:

hello.php

<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", ?string $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY", "Hola", null);

حالا تابع آرگومان سوم null را می پذیرد و همانطور که قبلا پردازش شده است ادامه می دهد:

 

Output

Hola Sammy!

پیشوند علامت سوال با تمام اعلان‌های نوع کار می‌کند، نه فقط رشته‌ها، و نیازی به مقدار پیش‌فرض (مانند ?int $age) ندارد.

اعلامیه های نوع بازگشت

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

hello.php

<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): ?int {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY");

توجه داشته باشید که نوع بازگشتی اعلام شده یک عدد صحیح یا یک مقدار تهی است. این نوع اعلام شده با مقدار بازگشتی آنها مطابقت ندارد و یک استثنا ایجاد می شود:

 

Output

Warning: Uncaught TypeError: hello(): Return value must be of type ?int, string returned

بیایید نوع بازگشتی را به روز کنیم تا با نوع رشته برگشتی مطابقت داشته باشد:

hello.php

<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): string {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY");

این خروجی را به ما می دهد که قبلاً دیده بودیم:

 

Output

Hello Sammy!

بدون ارزش برگشتی

گاهی اوقات یک تابع عملی را انجام می دهد که به مقدار برگشتی منجر نمی شود. تابع var_dump یک مثال است. اگر به اولین نسخه تابع hello برگردیم، می‌توانیم یک نوع بازگشتی void اضافه کنیم:

hello.php

<?php
function hello(): void {
    echo "Hello World!";
}
$greeting = hello();
var_dump($greeting);

این نشان می دهد که تابع مقداری را بر نمی گرداند. هنگامی که تابع فراخوانی می شود و روی یک متغیر اعمال می شود، خروجی نمایش داده می شود زیرا کلمه کلیدی echo در خود تابع استفاده می شود. با استفاده از var_dump در متغیر $greeting، می‌بینیم که هیچ مقداری برگردانده نشده است و متغیر $greeting روی یک مقدار null تنظیم می‌شود:

 

Output

Hello World!
NULL

نوع void بیشتر هنگام دستکاری خود متغیر و نه فقط یک مقدار استفاده می شود. برای آن، ما باید دامنه را درک کنیم.

محدوده

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

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

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

از آنجایی که PHP این دو حوزه را به‌عنوان موجودیت‌های مجزا در نظر می‌گیرد، زمانی که یک متغیر به یک تابع ارسال می‌شود، «مقدار» متغیر ارسال می‌شود و نه خود متغیر. بیایید یک متغیر سراسری تنظیم کنیم تا ببینیم این به چه معناست برای کد:

hello.php

<?php
declare(strict_types=1);
$name = "SAMMY";
function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): string {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello($name);
echo $name;

به جای ارسال مستقیم یک رشته، اکنون یک متغیر رشته را ارسال می کنیم. این متغیر به همان شیوه ای عمل می کند که یک رشته را به طور مستقیم ارسال می کند زیرا فقط از مقدار متغیر استفاده می شود. هنگامی که مقدار متغیر $name در تابع تغییر می کند، فقط متغیر $name در تابع تحت تأثیر قرار می گیرد. متغیر $name در دامنه جهانی یک متغیر جداگانه است:

 

Output

Hello Sammy!
SAMMY

خروجی echo hello($name) “Hello Sammy” است، زیرا این مقداری است که توسط تابعی که با آرگومان $name ارائه شده است، برگردانده می شود. حتی پس از فراخوانی تابع، مقدار متغیر $name در محدوده جهانی تغییر نمی کند، بنابراین خروجی echo $name; “SAMMY” است، زیرا متغیر جهانی روی “SAMMY” تنظیم می شود.

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

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

hello.php

<?php
declare(strict_types=1);
$name = "SAMMY";
function hello(string $greeting = "Hello", ?string $punctuation = "!"): string {
    global $name;
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello();
echo $name;

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

 

Output

Hello Sammy!
Sammy

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

گذراندن استدلال ها با مرجع

پی اچ پی آرگومان ها را به عنوان مقادیر می خواند. فرقی نمی‌کند که متغیری حاوی رشته «SAMMY» یا خود رشته را پاس کنیم. فقط از مقدار استفاده می شود. عبور از مقدار از همپوشانی دامنه جهانی و دامنه عملکرد جلوگیری می کند. از آنجا که یک تابع ممکن است مقداری را برگرداند، می‌توانیم از آن مقدار برای تنظیم هر متغیری در یک محدوده جداگانه استفاده کنیم، حتی یکی از آن‌ها به عنوان آرگومان استفاده می‌شود. با نوشتن کد به این روش، مدیریت یک متغیر به وضوح در محدوده اصلی نگهداری می شود. مثال‌های قبلی مقدار متغیر $name را با نادیده گرفتن مقدار متغیر برای مطابقت با مقدار بازگشتی برخی از توابع داخلی تغییر داده‌اند. بیایید نگاهی دقیق‌تر به قالب‌بندی ucwords و strtolower بیندازیم:

$name = "SAMMY";
$name = ucwords(strtolower($name));
echo $name;

این مقدار جدید $name اکنون قالب بندی جدیدی دارد:

 

Output

Sammy

در حالی که یک تابع فقط می تواند یک مقدار را برگرداند، یک تابع ممکن است بیش از یک متغیر را تحت تأثیر قرار دهد. در مثال‌هایی که نوشتیم، تابع hello از چندین متغیر استفاده می‌کند اما مقدار آن متغیرها را در محدوده جهانی تغییر نمی‌دهد. PHP راهی را برای تعامل مستقیم با یک متغیر از محدوده دیگر، با ارسال یک مرجع به خود متغیر، نه فقط مقدار آن، فراهم می کند. آرگومان ها با ارجاع با افزودن علامت (&) به هر پارامتری منتقل می شوند:

hello.php

<?php
declare(strict_types=1);
$name = "SAMMY";
function hello(string &$name, string $greeting = "Hello", ?string $punctuation = "!"): void {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello($name);
echo $name;

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

 

Output

Hello Sammy!
Sammy

هنگام عبور از مرجع، آرگومان باید یک متغیر باشد. یک مقدار دیگر پذیرفته نمی شود:

hello.php

<?php
declare(strict_types=1);
function hello(string &$name, string $greeting = "Hello", ?string $punctuation = "!"): string {
    global $name;
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY");

از آنجایی که هیچ متغیری برای مرجع وجود ندارد، یک خطا داده می شود:

 

Output

Warning: Uncaught Error: hello(): Argument #1 ($name) cannot be passed by reference

توابع داخلی

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

وقتی مستندات تعریف تابع یک تابع داخلی را می خوانید، بسیار شبیه توابع تعریف شده توسط کاربر است که نوشتیم، که شامل Type Declarations نیز می شود.

توابع مدیریت متغیر

توابع مدیریت متغیر جزئیاتی را در مورد یک متغیر مانند نوع یا مقدار آن ارائه می دهند. یکی از رایج ترین توابع مدیریت متغیر var_dump است:

hello.php

<?php
var_dump("Hello World!");

این تابع جزئیات مقادیر داده شده را شامل نوع و اندازه آنها می دهد. رشته “سلام دنیا!” شامل 12 کاراکتر:

 

Output

string(12) "Hello World!"

PHP همچنین توابع اضافی را برای تعامل با مقدار متغیرهای نوع خاص فراهم می کند.

نتیجه

توابع روشی قدرتمند برای نوشتن کدی که ماژولار و قابل استفاده مجدد است ارائه می دهد. توابع ممکن است از توزیع استاندارد PHP یا پسوندهای اضافی که با PHP کامپایل شده اند باشد. توسعه دهندگان فردی همچنین ممکن است توابعی را برای یک پروژه بنویسند یا آنها را در چندین پروژه به اشتراک بگذارند. هنگامی که به یک عمل نیاز دارید که علیه بیش از یک مورد یا مکان انجام شود، توابع ابزار هستند.

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

 

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/

برچسب‌ها:serverآرگومان ها و پارامترهااستفاده از توابع در PHPانواع Nullableپی اچ پیتوابع داخلی در phpخرید سرور مجازیخرید سرور مجازی آمریکاسرور مجازیمدیریت توابع متغیر در php

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از Ansible برای خودکارسازی تنظیمات اولیه سرور در اوبونتو 20.04

ورود به سایت

معرفی

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

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

این راهنما نحوه استفاده از Ansible را برای خودکارسازی مراحل موجود در راهنمای نصب اولیه سرور برای سرورهای اوبونتو 20.04 توضیح می‌دهد.

پیش نیازها

برای اجرای تنظیمات خودکار ارائه شده توسط playbook در این راهنما، به موارد زیر نیاز دارید:

  • یک گره کنترلی Ansible: یک دستگاه اوبونتو 20.04 با Ansible نصب و پیکربندی شده است تا با استفاده از کلیدهای SSH به میزبان Ansible شما متصل شود. اطمینان حاصل کنید که گره کنترل دارای یک کاربر معمولی با مجوزهای sudo و فایروال فعال است، همانطور که در راهنمای راه اندازی سرور اولیه ما توضیح داده شده است. برای راه اندازی Ansible، لطفاً راهنمای ما در مورد نحوه نصب و پیکربندی Ansible در اوبونتو 20.04 را دنبال کنید.
  • یک سرور راه دور با نصب تمیز اوبونتو 20.04: هیچ تنظیمات قبلی در این سرور مورد نیاز نیست، اما باید از گره کنترل Ansible که در بالا ذکر شد به این سرور دسترسی SSH داشته باشید. این سرور به یک سرور از راه دور میزبان Ansible تبدیل می شود که برای تامین خودکار توسط گره کنترل Ansible هدف قرار می گیرد.

این کتاب بازی چه کاری انجام می دهد؟

این کتاب بازی Ansible جایگزینی برای اجرای دستی از طریق روش مشخص شده در راهنمای راه اندازی اولیه سرور اوبونتو 20.04 و راهنمای تنظیم کلیدهای SSH در اوبونتو 20.04 هر بار که سرور را راه اندازی می کنید ارائه می دهد. یک بار کتاب پخش خود را تنظیم کنید و بعد از آن برای هر سرور از آن استفاده کنید.

اجرای این playbook اقدامات زیر را روی میزبان Ansible شما انجام می دهد:

  • aptitude را نصب کنید که توسط Ansible به عنوان جایگزینی برای مدیر بسته apt ترجیح داده می شود.
  • یک کاربر sudo جدید ایجاد کنید و sudo بدون رمز عبور را راه اندازی کنید.
  • یک کلید عمومی SSH محلی را کپی کنید و آن را در فایل authorized_keys برای کاربر مدیریت جدید در میزبان راه دور قرار دهید.
  • غیرفعال کردن احراز هویت مبتنی بر رمز عبور برای کاربر اصلی.
  • بسته های سیستمی را نصب کنید.
  • فایروال UFW را طوری پیکربندی کنید که فقط به اتصالات SSH اجازه دهد و هر درخواست دیگری را رد کند.

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

برای شروع، وارد یک کاربر دارای sudo در سرور گره کنترل Ansible خود شوید.

مرحله 1 – گره کنترل Ansible خود را آماده کنید

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

sudo nano /etc/ansible/hosts

با این کار فایل موجودی Ansible شما باز می شود. IP سرور راه دور میزبان Ansible خود را به بلوک [سرورها] اضافه کنید:

/etc/ansible/hosts

[servers]
server1 ansible_host=your_remote_server_ip

. . .

اکنون اتصال SSH خود را بین این گره کنترلی Ansible و سرور از راه دور میزبان Ansible خود آزمایش و احراز هویت خواهید کرد:

ssh root@your_remote_server_ip

درخواست احراز هویت را بپذیرید و در صورت درخواست رمز عبور خود را وارد کنید. هنگامی که اتصال SSH را تأیید کردید، CTRL+D را فشار دهید تا اتصال بسته شود و به گره کنترل خود بازگردید.

مرحله 2 – آماده کردن Playbook خود

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

nano playbook.yml

با این کار یک فایل YAML خالی باز می شود. قبل از اضافه کردن وظایف به کتاب بازی خود، با افزودن موارد زیر شروع کنید:

playbook.yml

---
- hosts: all
  become: true
  vars:
    created_username: sammy

با خیال راحت نام کاربری را با یکی از دلخواه خود جایگزین کنید.

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

vars به شما امکان می دهد داده ها را در متغیرها ذخیره کنید. اگر تصمیم به تغییر این نام کاربری در آینده دارید، فقط باید همین خط را در فایل خود ویرایش کنید.

مرحله 3 – یک کار نصب Aptitude به Playbook خود اضافه کنید

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

همه وظایف موجود در این کتاب بازی می توانند به تنهایی بایستند و مجدداً در سایر کتاب های بازی شما مورد استفاده قرار گیرند.

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

playbook.yml

  tasks:
    - name: Install aptitude
      apt:
        name: aptitude
        state: latest
        update_cache: true

در اینجا، شما از ماژول داخلی apt Ansible برای هدایت Ansible برای نصب aptitude استفاده می کنید. ماژول ها در Ansible میانبرهایی برای اجرای عملیاتی هستند که در غیر این صورت باید به عنوان دستورات bash خام اجرا می شدند. در صورتی که استعداد در دسترس نباشد، Ansible با خیال راحت دوباره به گزینه نصب بسته‌ها می‌رود. بنابراین در حالی که این مرحله از نظر فنی اختیاری است، Ansible از نظر تاریخی استعداد را ترجیح داده است.

مرحله 4 – اضافه کردن Sudo User Setup Tasks به Playbook خود

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

playbook.yml

    - name: Setup passwordless sudo
      lineinfile:
        path: /etc/sudoers
        state: present
        regexp: '^%sudo'
        line: '%sudo ALL=(ALL) NOPASSWD: ALL'
        validate: '/usr/sbin/visudo -cf %s' 

    - name: Create a new regular user with sudo privileges
      user:
        name: "{{ created_username }}"
        state: present
        groups: sudo
        append: true
        create_home: true

شما از ماژول lineinfile Ansible برای هدف گیری و جایگزینی یک خط خاص در یک فایل استفاده می کنید. در این مورد، شما از regex برای هدف قرار دادن یک خط خاص در فایل sudoers استفاده می‌کنید و سپس آن را تغییر می‌دهید تا امکان استفاده بدون رمز عبور از sudo را فراهم کنید. شما همچنین از visudo برای تأیید تغییرات خود استفاده می کنید تا از شکستن هر چیزی جلوگیری کنید.

برای استفاده از این مزیت، یک کاربر جدید با ماژول کاربر اضافه می‌کنید. Ansible اطمینان حاصل می کند که اگر این کاربر قبلاً وجود نداشته باشد، ایجاد شده است، که کاربر به گروه sudo تعلق دارد در حالی که از گروه های دیگر حذف نمی شود، و یک فهرست خانه ایجاد می شود.

مرحله 5 – اضافه کردن SSH Key Setup و غیرفعال کردن وظایف رمز عبور ریشه به Playbook شما

Ansible با این فرض عمل می کند که از کلیدهای SSH استفاده می کنید. جفت کردن استفاده از کلید SSH با غیرفعال کردن احراز هویت رمز عبور ریشه اکیداً توصیه می شود و به طور کلی تمرین خوبی است. برای خودکار کردن این، اضافه کنید:

playbook.yml

    - name: Set authorized key for remote user
      ansible.posix.authorized_key:
        user: "{{ created_username }}"
        state: present
        key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"

    - name: Disable password authentication for root
      lineinfile:
        path: /etc/ssh/sshd_config
        state: present
        regexp: '^#?PermitRootLogin'
        line: 'PermitRootLogin prohibit-password'

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

ماژول lineinfile برای جستجو و جایگزینی یک خط در sshd_config به منظور غیرفعال کردن احراز هویت رمز عبور برای ریشه، محدود کردن دسترسی به امتیازات آن برای افزایش امنیت استفاده می‌شود.

مرحله 6 – یک کار نصب بسته را به Playbook خود اضافه کنید

Ansible می تواند اطمینان حاصل کند که بسته های خاصی همیشه روی سرور شما نصب می شوند. به جای فراخوانی apt install بر روی هر بسته جداگانه، یا تقسیم آن به چندین کار، می‌توانید تمام بسته‌های مورد نظر خود را فهرست کنید:

playbook.yml

    - name: Update apt and install required system packages
      apt:
        pkg:
          - curl
          - vim
          - git
          - ufw
        state: latest
        update_cache: true

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

مرحله 7 – افزودن یک کار راه اندازی فایروال به Playbook خود

فایروال برای هر سروری که با اینترنت روبرو است ضروری است. می‌توانید از Ansible اطمینان حاصل کنید که UFW (دیوار آتش بدون عارضه) به درستی پیکربندی شده است با اضافه کردن:

playbook.yml

    - name: UFW - Allow SSH connections
      community.general.ufw:
        rule: allow
        name: OpenSSH

    - name: UFW - Enable and deny by default
      community.general.ufw:
        state: enabled
        default: deny

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

مرحله 8 – کتاب راهنمای کامل خود را مرور کنید

کتاب بازی شما باید تقریباً شبیه شکل زیر باشد، با تفاوت های جزئی بسته به سفارشی سازی های شما:

playbook.yml

---
- hosts: all
  become: true
  vars:
    created_username: sammy

  tasks:
    - name: Install aptitude
      apt:
        name: aptitude
        state: latest
        update_cache: true

    - name: Setup passwordless sudo
      lineinfile:
        path: /etc/sudoers
        state: present
        regexp: '^%sudo'
        line: '%sudo ALL=(ALL) NOPASSWD: ALL'
        validate: '/usr/sbin/visudo -cf %s'

    - name: Create a new regular user with sudo privileges
      user:
        name: "{{ created_username }}"
        state: present
        groups: sudo
        append: true
        create_home: true

    - name: Set authorized key for remote user
      ansible.posix.authorized_key:
        user: "{{ created_username }}"
        state: present
        key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"

    - name: Disable password authentication for root
      lineinfile:
        path: /etc/ssh/sshd_config
        state: present
        regexp: '^#?PermitRootLogin'
        line: 'PermitRootLogin prohibit-password'

    - name: Update apt and install required system packages
      apt:
        pkg:
          - curl
          - vim
          - git
          - ufw
        state: latest
        update_cache: true

    - name: UFW - Allow SSH connections
      community.general.ufw:
        rule: allow
        name: OpenSSH

    - name: UFW - Enable and deny by default
      community.general.ufw:
        state: enabled
        default: deny

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

مرحله 9 – Playbook خود را برای اولین بار اجرا کنید

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

برای اجرای playbook فقط در server1 که به صورت root متصل می شود، می توانید از دستور زیر استفاده کنید:

ansible-playbook playbook.yml -l server1 -u root -k

پرچم -l سرور شما را مشخص می‌کند و پرچم -u مشخص می‌کند که کدام کاربری در سرور راه دور وارد شود. از آنجایی که هنوز سرور راه دور خود را راه اندازی نکرده اید، root تنها گزینه شماست. پرچم -k در اولین اجرای playbook شما بسیار مهم است، زیرا به شما امکان می دهد رمز عبور SSH خود را وارد کنید.

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

 

Output

. . .

TASK [UFW - Allow SSH connections] ***************************************************************************************************************************************************************************************************************************
changed: [server1]

TASK [UFW - Enable and deny by default] **********************************************************************************************************************************************************************************************************************
changed: [server1]

PLAY RECAP ***************************************************************************************************************************************************************************************************************************************************
server1                    : ok=9    changed=8    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

این نشان می دهد که راه اندازی سرور شما کامل شده است! خروجی شما نباید دقیقاً یکسان باشد، اما مهم این است که هیچ شکستی نداشته باشید.

اکنون که اولین راه‌اندازی را برای کتاب پخش خود انجام داده‌اید، همه تماس‌های انتساب‌پذیر بعدی را می‌توان با کاربر sammy و بدون پرچم -k انجام داد:

ansible-playbook playbook.yml -l server1 -u sammy

همچنین می توانید با استفاده از:

 

ssh sammy@your_remote_server_ip

 

به یاد داشته باشید که sammy را با کاربر تعریف شده توسط متغیر create_username و server_host_or_IP را با نام میزبان یا آدرس IP سرور خود جایگزین کنید.

پس از ورود به سرور، می‌توانید قوانین فعال فایروال UFW را بررسی کنید تا تأیید کنید که به درستی پیکربندی شده است:

sudo ufw status

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

 

Output

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             

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

نتیجه

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

در این راهنما، نحوه استفاده از Ansible را برای خودکارسازی کارهای اولیه که باید در یک سرور تازه اجرا شوند، مانند ایجاد یک کاربر غیر ریشه با دسترسی sudo، فعال کردن UFW و غیرفعال کردن ورود به سیستم ریشه مبتنی بر رمز عبور از راه دور، نشان دادید.

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

اگر می‌خواهید برای سفارشی‌سازی بیشتر تنظیمات اولیه سرور خود، وظایف جدیدی را در این کتاب بازی اضافه کنید، لطفاً به راهنمای مقدماتی Ansible Configuration Management 101: Writing Ansible Playbooks مراجعه کنید. همچنین می توانید راهنمای ما در مورد نحوه استفاده از نقش های Ansible برای انتزاع محیط زیرساخت خود را بررسی کنید.

 

 

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/

اوبونتو 20.04تنظیم کلیدهای SSH در اوبونتو 20.04تنظیمات اولیه سرورتنظیمات اولیه سرور در اوبونتو 20.04خرید سرور مجازیخودکارسازی تنظیمات اولیه سرورراه اندازی اولیه سرورراه اندازی سرور مجازیسرور مجازی آلماننحوه استفاده از Ansible

  • behnam gol mohamadi
  • ۰
  • ۰

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

ورود به سایت

معرفی

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

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

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

پیش نیازها

برای اجرای تنظیمات خودکار ارائه شده توسط playbook در این راهنما، به موارد زیر نیاز دارید:

  • یک گره کنترلی Ansible: یک ماشین اوبونتو 20.04 با Ansible نصب و پیکربندی شده است تا با استفاده از کلیدهای SSH به میزبان Ansible شما متصل شود. اطمینان حاصل کنید که گره کنترل دارای یک کاربر معمولی با مجوزهای sudo و فایروال فعال است، همانطور که در راهنمای راه اندازی سرور اولیه ما توضیح داده شده است.
  • یک یا چند میزبان Ansible: یک یا چند سرور اوبونتو 20.04 راه دور که قبلاً طبق راهنمای نحوه استفاده از Ansible برای خودکارسازی تنظیمات اولیه سرور در اوبونتو 20.04 تنظیم شده است.

این کتاب بازی چه کاری انجام می دهد؟

این کتاب بازی Ansible جایگزینی برای اجرای دستی روشی است که در راهنمای ما در مورد نحوه نصب و استفاده از Docker در اوبونتو 20.04 بیان شده است. Playbook خود را یک بار تنظیم کنید و بعد از هر نصب از آن استفاده کنید.

اجرای این کتاب بازی، اقدامات زیر را روی میزبان های Ansible شما انجام می دهد:

  • aptitude را نصب کنید که توسط Ansible به عنوان جایگزینی برای مدیر بسته apt ترجیح داده می شود.
  • بسته های سیستمی مورد نیاز را نصب کنید.
  • کلید Docker GPG APT را نصب کنید.
  • مخزن رسمی Docker را به منابع apt اضافه کنید.
  • Docker را نصب کنید.
  • ماژول Python Docker را از طریق پیپ نصب کنید.
  • تصویر پیش‌فرض مشخص‌شده توسط default_container_image را از Docker Hub بکشید.
  • تعداد کانتینرهای تعریف شده توسط متغیر container_count را ایجاد کنید، هر کدام با استفاده از تصویر تعریف شده توسط default_container_image، و دستور تعریف شده در default_container_command را در هر کانتینر جدید اجرا کنید.

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

برای شروع، وارد یک کاربر دارای sudo در سرور گره کنترل Ansible خود شوید.

مرحله 1 – آماده کردن Playbook خود

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

nano playbook.yml

با این کار یک فایل YAML خالی باز می شود. قبل از اضافه کردن وظایف به کتاب بازی خود، با افزودن موارد زیر شروع کنید:

playbook.yml

---
- hosts: all
  become: true
  vars:
    container_count: 4
    default_container_name: docker
    default_container_image: ubuntu
    default_container_command: sleep 1

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

vars به شما امکان می دهد داده ها را در متغیرها ذخیره کنید. اگر تصمیم به تغییر این موارد در آینده دارید، فقط باید این خطوط را در فایل خود ویرایش کنید. در اینجا توضیح مختصری در مورد هر متغیر آورده شده است:

  • container_count: تعداد کانتینرهایی که باید ایجاد شوند.
  • default_container_name: نام کانتینر پیش‌فرض.
  • default_container_image: تصویر پیش‌فرض Docker برای استفاده در هنگام ایجاد کانتینرها.
  • default_container_command: دستور پیش فرض برای اجرا در کانتینرهای جدید.

مرحله 2 – افزودن وظایف نصب بسته ها به Playbook خود

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

همه وظایف موجود در این کتاب بازی می توانند به تنهایی بایستند و مجدداً در سایر کتاب های بازی شما مورد استفاده قرار گیرند.

اولین وظایف خود یعنی نصب aptitude، ابزاری برای ارتباط با مدیر بسته لینوکس و نصب بسته های سیستم مورد نیاز را اضافه کنید. Ansible اطمینان حاصل می کند که این بسته ها همیشه بر روی سرور شما نصب می شوند:

playbook.yml

  tasks:
    - name: Install aptitude
      apt:
        name: aptitude
        state: latest
        update_cache: true

    - name: Install required system packages
      apt:
        pkg:
          - apt-transport-https
          - ca-certificates
          - curl
          - software-properties-common
          - python3-pip
          - virtualenv
          - python3-setuptools
        state: latest
        update_cache: true

در اینجا، شما از ماژول داخلی apt Ansible برای هدایت Ansible برای نصب بسته های خود استفاده می کنید. ماژول ها در Ansible میانبرهایی برای اجرای عملیاتی هستند که در غیر این صورت باید به عنوان دستورات bash خام اجرا می شدند. اگر aptitude در دسترس نباشد، Ansible با خیال راحت به apt برای نصب بسته ها باز می گردد، اما Ansible از لحاظ تاریخی استعداد را ترجیح داده است.

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

مرحله 3 – افزودن وظایف نصب Docker به Playbook خود

وظیفه شما آخرین نسخه Docker را از مخزن رسمی نصب می کند. کلید Docker GPG برای تأیید دانلود اضافه می شود، مخزن رسمی به عنوان منبع بسته جدید اضافه می شود و Docker نصب می شود. علاوه بر این، ماژول داکر برای پایتون نیز نصب خواهد شد:

playbook.yml

    - name: Add Docker GPG apt Key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present

    - name: Add Docker Repository
      apt_repository:
        repo: deb https://download.docker.com/linux/ubuntu focal stable
        state: present

    - name: Update apt and install docker-ce
      apt:
        name: docker-ce
        state: latest
        update_cache: true

    - name: Install Docker Module for Python
      pip:
        name: docker

خواهید دید که ماژول‌های Ansible داخلی apt_key و apt_repository ابتدا به آدرس‌های اینترنتی صحیح اشاره می‌کنند، سپس وظیفه دارند از وجود آنها اطمینان حاصل کنند. این امکان نصب آخرین نسخه Docker را به همراه استفاده از پیپ برای نصب ماژول برای پایتون فراهم می کند.

مرحله 4 – افزودن Docker Image و وظایف Container به Playbook خود

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

playbook.yml

    - name: Pull default Docker image
      community.docker.docker_image:
        name: "{{ default_container_image }}"
        source: pull

    - name: Create default containers
      community.docker.docker_container:
        name: "{{ default_container_name }}{{ item }}"
        image: "{{ default_container_image }}"
        command: "{{ default_container_command }}"
        state: present
      with_sequence: count={{ container_count }}

از docker_image برای کشیدن تصویر Docker که می‌خواهید به عنوان پایه کانتینرهای خود استفاده کنید استفاده می‌شود. docker_container به شما اجازه می دهد تا مشخصات کانتینرهایی را که ایجاد می کنید، به همراه دستوری که می خواهید آنها را ارسال کنید، مشخص کنید.

with_sequence روش Ansible برای ایجاد یک حلقه است و در این حالت ایجاد کانتینرهای شما را با توجه به تعداد تعیین شده شما حلقه می کند. این یک حلقه شمارش اولیه است، بنابراین متغیر آیتم در اینجا عددی را ارائه می دهد که تکرار حلقه فعلی را نشان می دهد. این شماره در اینجا برای نامگذاری ظروف شما استفاده می شود.

مرحله 5 – کتاب راهنمای کامل خود را مرور کنید

کتاب بازی شما باید تقریباً شبیه شکل زیر باشد، با تفاوت های جزئی بسته به سفارشی سازی های شما:

playbook.yml

---
- hosts: all
  become: true
  vars:
    container_count: 4
    default_container_name: docker
    default_container_image: ubuntu
    default_container_command: sleep 1d

  tasks:
    - name: Install aptitude
      apt:
        name: aptitude
        state: latest
        update_cache: true

    - name: Install required system packages
      apt:
        pkg:
          - apt-transport-https
          - ca-certificates
          - curl
          - software-properties-common
          - python3-pip
          - virtualenv
          - python3-setuptools
        state: latest
        update_cache: true

    - name: Add Docker GPG apt Key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present

    - name: Add Docker Repository
      apt_repository:
        repo: deb https://download.docker.com/linux/ubuntu focal stable
        state: present

    - name: Update apt and install docker-ce
      apt:
        name: docker-ce
        state: latest
        update_cache: true

    - name: Install Docker Module for Python
      pip:
        name: docker

    - name: Pull default Docker image
      community.docker.docker_image:
        name: "{{ default_container_image }}"
        source: pull

    - name: Create default containers
      community.docker.docker_container:
        name: "{{ default_container_name }}{{ item }}"
        image: "{{ default_container_image }}"
        command: "{{ default_container_command }}"
        state: present
      with_sequence: count={{ container_count }}

با خیال راحت این کتاب راهنما را طوری تغییر دهید که مطابق با نیازهای فردی شما در جریان کار خود باشد. برای مثال، می‌توانید از ماژول docker_image برای فشار دادن تصاویر به Docker Hub یا ماژول docker_container برای راه‌اندازی شبکه‌های کانتینری استفاده کنید.

مرحله 6 – اجرای Playbook خود

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

برای اجرای playbook فقط در server1 که به صورت sammy متصل می شود، می توانید از دستور زیر استفاده کنید:

ansible-playbook playbook.yml -l server1 -u sammy

پرچم -l سرور شما را مشخص می‌کند و پرچم -u مشخص می‌کند که کدام کاربر در سرور راه دور وارد شود. خروجی مشابه این دریافت خواهید کرد:

این نشان می دهد که راه اندازی سرور شما کامل شده است! خروجی شما نباید دقیقاً یکسان باشد، اما مهم این است که هیچ شکستی نداشته باشید.

پس از اتمام اجرا، از طریق SSH به سروری که توسط Ansible ارائه شده است وارد شوید تا بررسی کنید که آیا کانتینرها با موفقیت ایجاد شده اند یا خیر.

وارد سرور راه دور با:

ssh sammy@your_remote_server_ip

و ظروف Docker خود را در سرور راه دور فهرست کنید:

sudo docker ps -a

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

 

Output

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a3fe9bfb89cf        ubuntu              "sleep 1d"          5 minutes ago       Created                                 docker4
8799c16cde1e        ubuntu              "sleep 1d"          5 minutes ago       Created                                 docker3
ad0c2123b183        ubuntu              "sleep 1d"          5 minutes ago       Created                                 docker2
b9350916ffd8        ubuntu              "sleep 1d"          5 minutes ago       Created                                 docker1

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

نتیجه

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

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

 

 

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 یا سرور مجازیآماده کردن Playbookافزودن Docker Imageانواع سرور مجازیاوبونتو 20.04ایجاد سرور مجازیبه روز رسانی سرورخرید سرور مجازیکتاب بازی Ansible

  • behnam gol mohamadi
  • ۰
  • ۰

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

ورود به سایت

معرفی

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

Discourse با استفاده از نصب با یک کلیک vpsgol روی یک Droplet به خوبی کار می کند، اما با رشد جامعه شما، می تواند از یک Droplet بیشتر شود. اگر یکی از قطره‌های شما آفلاین شود، استفاده از چند قطره به جامعه شما انعطاف‌پذیری می‌دهد. هر قطره همچنین پهنای باند شما را افزایش می دهد. هنگام استفاده از چند قطره، یک Load Balancer می تواند به گسترش استقرار شما کمک کند و دسترسی بالا را به برنامه وب شما بیاورد. در نهایت، یک نمونه پایگاه داده مدیریت شده تجربه کاربری ثابتی را در چندین قطره تضمین می کند.

پس از تکمیل این آموزش، شما یک استقرار Discourse بسیار در دسترس و به راحتی مقیاس پذیر خواهید داشت که در vpsgol اجرا می شود. شما با یک قطره جدید اوبونتو 20.04 شروع می‌کنید و با یک نصب گفتمان مقیاس‌پذیر افقی که شامل یک Load Balancer، Managed PostgreSQL cluster، Redis instance (اختیاری) و Droplet‌های اضافی است، به پایان می‌رسانید.

پیش نیازها

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

  • یک سرور اوبونتو 20.04 با حداقل 2 گیگابایت رم پیکربندی شده با یک کاربر غیر ریشه با امتیازات sudo و فایروال، که می توانید با دنبال کردن راهنما، راه اندازی اولیه سرور با اوبونتو 20.04، این کار را انجام دهید.
  • Discourse بر روی سرور شما نصب و پیکربندی شده است که می توانید با دنبال کردن آموزش نحوه نصب Discourse در اوبونتو 20.04 این کار را انجام دهید.
  • نام دامنه ای که سوابق DNS آن توسط vpsgol مدیریت می شود، که می توانید با دنبال کردن آموزش نحوه اشاره به سرورهای نام vpagol  از ثبت کننده های دامنه رایج، این کار را انجام دهید. هنگام تنظیم Discourse بر روی سرور خود، مطمئن شوید که از نام دامنه اصلی و نه یک زیر دامنه استفاده کنید (به عنوان مثال، به جای discourse.yoursite.com از yoursite.com استفاده کنید).
  • آشنایی با Docker که می توانید از آموزش The Docker Ecosystem: An Introduction to Common Components به دست آورید.

مرحله 1 – اضافه کردن یک متعادل کننده بار vpsgol به یک سرور گفتمان

در این مرحله شما یک vpsgol Load Balancer را به سرور Discourse که در پیش نیازها ایجاد کرده اید اضافه می کنید. به کنترل پنل vpsgol خود دسترسی پیدا کنید، روی Networking، سپس Load Balancers، و سپس روی Create Load Balancer کلیک کنید.

شما باید یک منطقه مرکز داده را برای متعادل کننده بار خود انتخاب کنید. حتماً همان منطقه ای را که برای قطره گفتمان انتخاب کرده اید انتخاب کنید. Load Balancer با Droplet شما با استفاده از شبکه خصوصی آن ارتباط برقرار می کند، بنابراین هر دو Droplet و Load Balancer شما باید در یک منطقه باشند.

سپس، Droplet خود را با تایپ کردن نام Droplet در قسمت متن به Load Balancer اضافه کنید.

Discourse معمولاً با صدور گواهی رایگان Let’s Encrypt در طول فرآیند نصب، HTTPS را برای شما مدیریت می کند. با این حال، وقتی Droplet شما پشت Load Balancer قرار دارد، Let’s Encrypt نمی تواند گواهی شما را تمدید کند زیرا آدرس IP دامنه شما با IP Droplet شما مطابقت ندارد.

خوشبختانه، vpsgol Load Balancer می تواند گواهی ها را برای شما مدیریت کند. فقط باید یک قانون حمل و نقل برای HTTPS به Load Balancer خود اضافه کنید. یک قانون حمل و نقل به Load Balancer می گوید که نوع خاصی از ترافیک را به Droplet شما ارسال کند.

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

از آنجایی که دامنه خود را به عنوان بخشی از پیش نیازها به vpsgol اضافه کردید، افزودن پشتیبانی HTTPS فقط چند کلیک طول می کشد. در قسمت Forwarding rules یک قانون جدید به نام HTTPS اضافه کنید که می توانید آن را از لیست کشویی انتخاب کنید. حالا Certificate و سپس + New Certificate را بزنید.

نام دامنه خود را در فیلد متنی تایپ کنید، که باید به صورت خودکار برای شما پر شود. سپس به گواهینامه خود یک نام بدهید و روی Generate Certificate کلیک کنید تا vpsgol درخواست داشته باشد و یک گواهی را برای شما مدیریت کند.

تقریباً راه اندازی Load Balancer خود را تمام کرده اید. روی دکمه Edit Advanced Settings کلیک کنید و کادر با عنوان Enable Proxy Protocol را علامت بزنید. هنگامی که پروتکل PROXY فعال است، Load Balancer اطلاعات مشتری مانند آدرس IP کاربر را به Droplets پشت Load Balancer ارسال می کند. بدون پروتکل PROXY، Discourse فکر می‌کرد که تمام ترافیک آن از یک کاربر منفرد (Load Balancer) می‌آید، و همه گزارش‌ها نشانی IP Load Balancer را به جای آدرس‌های IP واقعی کاربران شما نشان می‌دهند.

در نهایت یک نام برای Load Balancer خود انتخاب کنید و روی Create Load Balancer کلیک کنید.

اکنون که Load Balancer را راه اندازی کرده اید، باید فایل های پیکربندی Discourse خود را تغییر دهید.

مرحله 2 – اصلاح فایل های پیکربندی گفتمان

در این مرحله، فایل‌های پیکربندی پیش‌فرض موجود در Discourse را تغییر می‌دهید. SSH را به Droplet خود وارد کنید و با استفاده از این دستور به فهرست /var/discourse بروید:

cd /var/discourse

با استفاده از nano یا ویرایشگر متن مورد علاقه خود، یک فایل جدید به نام loadbalancer.template.yml در فهرست قالب ها ایجاد و باز کنید:

sudo nano templates/loadbalancer.template.yml

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

در loadbalancer.template.yml، خطوط زیر را وارد کنید:

run:
– exec: “sed -i ‘s:listen 80: listen 80 proxy_protocol:g’ /etc/nginx/conf.d/discourse.conf”
– exec: “sed -i ‘s:$remote_addr:$proxy_protocol_addr:g’ /etc/nginx/conf.d/discourse.conf”
– exec: “sed -i ‘s:X-Forwarded-For $proxy_add_x_forwarded_for:X-Forwarded-For $proxy_protocol_addr:g’ /etc/nginx/conf.d/discourse.conf”

خط اول پیکربندی Discourse Nginx را برای فعال کردن پشتیبانی از پروتکل PROXY تغییر می‌دهد. اگر پروتکل PROXY در Load Balancer فعال باشد اما در Nginx فعال نباشد، Discourse یک خطای سرور را برمی‌گرداند.

خط دوم یافتن و جایگزینی را انجام می‌دهد و همه رخدادهای $remote_addr را با $proxy_protocol_addr جایگزین می‌کند. $proxy_protocol_addr حاوی آدرس IP مشتری است که از Load Balancer ارسال شده است. $remote_addr معمولاً آدرس IP کاربر را نشان می دهد، اما از آنجایی که Discourse پشت Load Balancer قرار دارد، آدرس IP Load Balancer را نشان می دهد.

خط آخر همه موارد X-Forwarded-For $proxy_add_x_forwarded_for را با X-Forwarded-For $proxy_protocol_addr جایگزین می‌کند و اطمینان حاصل می‌کند که هدر X-Forwarded-For آدرس IP مشتری را به درستی ثبت می‌کند و نه آدرس IP Load Balancer.

با فشار دادن CTRL+X و سپس y فایل را ذخیره کرده و ببندید.

آخرین کاری که باید انجام دهید این است که قالب را در Discourse بارگذاری کنید و Discourse را بازسازی کنید.

با استفاده از nano یا ویرایشگر متن مورد علاقه خود، فایلی به نام app.yml را در فهرست کانتینرها ویرایش کنید:

sudo nano containers/app.yml

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

containers/app.yml

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/loadbalancer.template.yml"

حتماً الگوی جدید را در یک خط زیر templates/web.template.yml اضافه کنید.

در مرحله بعد، مطمئن شوید که دو خط web.ssl.template.yml و templates/web.letsencrypt.ssl.template.yml هر دو با اضافه کردن یک علامت پوند [#] همانطور که نشان داده شده است، توضیح داده شده اند:

containers/app.yml

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/loadbalancer.template.yml"
## Uncomment these two lines if you wish to add Lets Encrypt (https)
#  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"

در نهایت چند خط پایین بروید تا expose را ببینید. خط “443:443” # https را با اضافه کردن علامت پوند [#] همانطور که نشان داده شده است، نظر دهید:

containers/app.yml

...
expose:
  - "80:80"   # http
# - "443:443" # https

اکنون وقتی Discourse را بازسازی می کنید، HTTPS در Discourse غیرفعال می شود. اتصال HTTPS در Load Balancer خاتمه می یابد و Load Balancer با Droplet شما از طریق شبکه خصوصی امن vpsgol ارتباط برقرار می کند، بنابراین نیازی به راه اندازی HTTPS در سرور Discourse خود ندارید.

با فشار دادن CTRL+X و سپس y فایل را ذخیره کرده و ببندید.

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

sudo ./launcher rebuild app

این دستور به امتیازات فوق کاربر نیاز دارد، به همین دلیل است که با sudo اضافه شده است.

در این مرحله، پیکربندی Discourse و Load Balancer را به پایان رسانده اید. در مرحله بعد، نام دامنه خود را به آدرس IP Load Balancer نشان می دهید.

مرحله 3 – به روز رسانی DNS

در این مرحله، دامنه خود را به جای آدرس IP Droplet به آدرس IP Load Balancer اشاره می‌کنید.

اگر از میزبانی DNS vpsgol استفاده می کنید، به کنترل پنل بروید و روی Networking کلیک کنید. روی نام دامنه خود کلیک کنید، سپس به دنبال رکورد A باشید که به Droplet شما اشاره می کند. منوی بیشتر رکورد را برای تغییر رکورد انتخاب کنید. مقدار این رکورد را از آدرس IP Droplet خود به آدرس IP Load Balancer تغییر دهید.

سرور Discourse شما پشت یک  vpsgol Load Balancer اجرا می شود و شما مجبور نخواهید بود گواهینامه های SSL خود را مدیریت کنید زیرا vpsgol این کار را برای شما انجام می دهد.

با مراجعه به نام دامنه خود، نصب Discourse خود را تست کنید. شما باید صفحه ای را ببینید که شبیه به این است:

اکنون که دامنه شما به Load Balancer اشاره می کند، یک نمونه پایگاه داده مدیریت شده را برای ایجاد یک تجربه ثابت برای کاربران خود اضافه می کنید.

مرحله 4 – افزودن یک پایگاه داده مدیریت شده vpsgol

در این مرحله، یک نمونه vpsgol Managed PostgreSQL ایجاد می‌کنید و آن را به استقرار Discourse خود اضافه می‌کنید.

مزیت اصلی Load Balancer تقسیم ترافیک شما بین چند قطره است. تا به حال، پایگاه داده، سرور Redis و وب سرور شما همگی بر روی یک Droplet اجرا می شدند. اگر نمونه دوم Discourse را اضافه کنید، پایگاه داده، سرور Redis و وب سرور خود را خواهد داشت و مانند یک وب سایت کاملاً متفاوت عمل می کند. بازدیدکنندگان شما ممکن است احساس کنند که به وب‌سایت‌های دیگر با پست‌ها و کاربران متفاوت می‌روند، زیرا به پایگاه‌های داده متفاوتی متصل خواهند شد. شما می توانید این مشکل را با استفاده از یکی از نمونه های مدیریت شده PostgreSQL vpsgol حل کنید، به جای اینکه یک پایگاه داده جداگانه در هر قطره گفتمان اجرا شود.

با رفتن به کنترل پنل vpsgol یک نمونه PostgreSQL مدیریت شده vpsgol را تنظیم کنید. روی Databases کلیک کنید، سپس Create Database Cluster، در نهایت PostgresSQL را انتخاب کنید، منطقه را مطابق با مکان Droplet خود تنظیم کنید و روی Create a Database Cluster کلیک کنید.

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

در صفحه بعدی شبکه VPC را انتخاب کنید و مقادیر میزبان پایگاه داده، نام کاربری، رمز عبور و پورت را یادداشت کنید، زیرا باید آنها را به فایل containers/app.yml خود اضافه کنید.

هنگامی که کلاستر پایگاه داده شما ایجاد شد، باید پیکربندی Discourse را به روز کنید. باز کردن containers/app.yml:

sudo nano containers/app.yml

در بخش الگوها، خط را نظر دهید – templates/postgres.template.yml همانطور که نشان داده شده است:

containers/app.yml

templates:
# - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/loadbalancer.template.yml"

این باعث می‌شود Discourse هنگام بازسازی، سرور Postgres خود را فراهم نکند.

سپس به دنبال بخش env از containers/app.yml بگردید و خطوط زیر را اضافه کنید و مقادیر خود را برای نام کاربری پایگاه داده، رمز عبور، میزبان، نام و پورت جایگزین کنید.

containers/app.yml

env:
    DISCOURSE_DB_USERNAME: your_db_username
    DISCOURSE_DB_PASSWORD: your_db_password
    DISCOURSE_DB_HOST: your_db_host
    DISCOURSE_DB_NAME: your_db_name
    DISCOURSE_DB_PORT: your_db_port

این متغیرهای اضافی به Droplet شما اجازه می دهد تا به پایگاه داده خارجی شما متصل شود.

فایل را با فشار دادن CTRL+X و سپس y ذخیره کنید.

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

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

sudo ./launcher rebuild app

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

در نهایت، یک تنظیم را تغییر می‌دهید تا اطمینان حاصل کنید که کاربران هنگام بازدید از سایت، در همان Droplet باقی می‌مانند.

به تنظیمات Load Balancer خود در کنترل پنل vpsgol برگردید. به Networking، سپس Load Balancers، سپس Settings بروید و به دنبال Sticky Sessions بگردید. روی Edit کلیک کنید.

Sticky Sessions را از None به Cookie تغییر دهید و روی Save کلیک کنید.

Sticky Sessions تضمین می‌کند که هر کاربری که از طریق Load Balancer از وب‌سایت شما بازدید می‌کند، در طول مدت بازدید خود به همان Droplet متصل می‌ماند. این مهم است زیرا هر قطره هنوز هم نمونه Redis خود را دارد و Redis این است که چگونه Discourse کاربر را هنگام ورود به سیستم ردیابی می کند. بدون Sticky Sessions، کاربر می تواند در یک Droplet وارد شود، سپس از یک صفحه جدید بازدید کند و (ناشناس به آنها) با قطره دیگری که در آن وارد نشده‌اند تعویض شود. Sticky Sessions با نگه داشتن کاربر در همان Droplet از این امر جلوگیری می کند.

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

مرحله 5 – (اختیاری) افزودن یک نمونه Redis مدیریت شده vpsgol

این مرحله اختیاری است و به یک نمونه vpsgol Managed Redis نیاز دارد. تا این مرحله، نمونه Redis در Droplet در پشت Load Balancer قرار می‌گرفت، که برای اطمینان از ورود کاربران به سیستم، نیاز به جلسات چسبنده دارد. با این حال، در تنظیم قبلی، کاربران پس از تغییر Droplet از سیستم خارج می شدند زیرا اطلاعات جلسه آنها در Droplet ذخیره می شود.

افزودن یک سرور Redis خارجی به Droplets می تواند این مشکل را برطرف کند. این به طور موثر وضعیت Discourse را از Droplets شما دور می کند. اگر Droplet آفلاین شود، کاربران شما از سیستم خارج نمی‌شوند – در واقع، آنها حتی متوجه نمی‌شوند.

شما می توانید یک سرور Redis مدیریت شده vpsgol را به همان روشی که پایگاه داده مدیریت شده PostgreSQL خود را ایجاد کردید راه اندازی کنید. به کنترل پنل vpsgol بروید. روی Databases، سپس Create، سپس Database کلیک کنید و Redis را برای موتور پایگاه داده خود انتخاب کنید. همان منطقه را با سایر منابع خود انتخاب کنید تا مطمئن شوید که آنها در همان شبکه VPC هستند. به سرور خود یک نام بدهید و روی Create a database cluster کلیک کنید.

درست مانند زمانی که پایگاه داده Postgres خود را ایجاد می کنید، یک صفحه خوش آمدگویی با چند مرحله شروع خواهید دید. روی Secure this database cluster کلیک کنید، نام Droplet خود را وارد کنید و سپس روی Allow these inbound sources only کلیک کنید. این تضمین می کند که فقط Droplet شما می تواند به Redis متصل شود.

اکنون باید سیاست تخلیه را برای سرور Redis خود انتخاب کنید. allkeys-lru را انتخاب کنید. این خط مشی به این معنی است که اگر سرور Redis شما پر شود، شروع به حذف قدیمی ترین ورودی های خود می کند. با این کار کاربرانی که مدتی است از وب سایت شما استفاده نکرده اند، از سیستم خارج می شود، اما بهتر از این است که Redis خطاها را بازگرداند و کار را متوقف کند.

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

هنگامی که نمونه Redis ایجاد شد، باید پیکربندی Discourse خود را به روز کنید. باز کردن containers/app.yml با استفاده از nano:

sudo nano containers/app.yml

همانطور که در اینجا نشان داده شده است، جزئیات اتصال Redis را به بخش env اضافه کنید. حتما متن هایلایت شده را با اطلاعات خود جایگزین کنید. (نیازی به وارد کردن قسمت نام کاربری ندارید.)

containers/app.yml

env:
    DISCOURSE_REDIS_HOST: your_redis_host
    DISCOURSE_REDIS_PASSWORD: your_redis_password
    DISCOURSE_REDIS_PORT: your_redis_port
    DISCOURSE_REDIS_USE_SSL: true

در مرحله بعد، در بخش templates، روی خط نظر دهید – templates/redis.template.yml همانطور که نشان داده شده است:

containers/app.yml

templates:
# - "templates/postgres.template.yml"
# - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/loadbalancer.template.yml"

این امر از Discourse از ایجاد نمونه Redis خود جلوگیری می کند.

با فشار دادن CTRL+X و سپس y فایل را ذخیره کرده و ببندید.

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

برنامه بازسازی sudo ./launcher
با یک نمونه Redis مدیریت شده، دیگر نیازی به Sticky Sessions ندارید. در صورت تمایل می توانید آن گزینه را خاموش کنید، اما کاربران شما تفاوتی را در هر دو صورت متوجه نمی شوند.

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

مرحله 6 – اضافه کردن قطرات اضافی

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

با رفتن به کنترل پنل vpsgol یک عکس فوری جدید ایجاد کنید. روی Droplets کلیک کنید، Droplet خود را پیدا کنید و روی Snapshots کلیک کنید. برای عکس فوری خود یک نام بگذارید و روی Take snapshot زنده کلیک کنید.

شما می توانید از این عکس فوری برای اضافه کردن قطرات اضافی پشت Load Balancer و افزایش ظرفیت وب سایت خود استفاده کنید.

هر بار که یک Droplet جدید ایجاد می کنید، باید منابع مورد اعتماد را در سرورهای Postgres و Redis خود به روز کنید، که می توانید از طریق کنترل پنل انجام دهید. همانطور که در مرحله قبل انجام دادید، نمونه پایگاه داده‌ای را که می‌خواهید تغییر دهید انتخاب کنید، به نمای کلی بروید و سپس Secure this database cluster. آدرس های IP جدید Droplet خود را به لیست منابع قابل اعتماد اضافه کنید.

در این مرحله، از Snapshot برای ایجاد قطره‌های اضافی استفاده کردید و آنها را به عنوان منابع قابل اعتماد به نمونه‌های PostgreSQL و Redis خود اضافه کردید.

نتیجه

در این آموزش، شما یک سرور Discourse را در پشت یک vpsgol Load Balancer راه اندازی می کنید. برای کمک به مقیاس‌بندی استقرار خود، یک پایگاه داده مدیریت‌شده PostgreSQL و نمونه مدیریت‌شده Redis را نیز اضافه کرده‌اید. در نهایت، با استفاده از عکس های فوری و کنترل پنل، قطرات بیشتری اضافه کردید. با استفاده از کنترل پنل، می توانید منابع بیشتری را با رشد جامعه خود اضافه کنید.

اکنون که یک Load Balancer راه‌اندازی کرده‌اید، می‌توانید موارد استفاده دیگر را برای vpsgol Load Balancer مانند Canary Deployments بررسی کنید. همچنین می توانید با دنبال کردن آموزش نحوه اتصال به یک نمونه Redis مدیریت شده از طریق TLS با Stunnel و redis-cli، با استفاده از خط فرمان به نمونه Redis خود متصل شوید. در نهایت، می‌توانید با استفاده از مستندات پایگاه‌های داده مدیریت شده و آموزش، استخرهای اتصال پایگاه‌های داده مدیریت‌شده و بنچمارک PostgreSQL با استفاده از pgbench، درباره پایگاه‌های داده vpsgol و عملکرد آن‌ها اطلاعات بیشتری کسب کنید.

 

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/

برچسب‌ها:استقرار Discourseبه روز رسانی DNSپیکربندی Discourseخرید سرور مجازیخرید سرور مجازی آمریکاسرور Discourseسرور Redisهاست خرید

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از PostgreSQL با برنامه جنگو در اوبونتو 20.04

ورود به سایت

معرفی

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

در این راهنما، PostgreSQL (که اغلب به آن Postgres گفته می شود) را برای استفاده در برنامه های جنگو نصب و پیکربندی می کنید. شما نرم افزار لازم را نصب می کنید، اعتبار پایگاه داده را برای برنامه ما ایجاد می کنید و سپس یک پروژه جنگو جدید را برای استفاده از این باطن شروع و پیکربندی می کنید.

پیش نیازها

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

وقتی برای ادامه آماده شدید، به عنوان کاربر sudo خود وارد شوید.

مرحله 1 – نصب کامپوننت ها از مخازن اوبونتو

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

شما از پایتون 3 استفاده خواهید کرد که با اوبونتو 20.04 عرضه می شود. نصب را با تایپ کردن شروع کنید:

sudo apt update
sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib

با پایان نصب، می توانید به پایگاه داده بروید.

مرحله 2 – ایجاد یک پایگاه داده و کاربر پایگاه داده

به طور پیش فرض، Postgres از یک طرح احراز هویت به نام “تأیید هویت همتا” برای اتصالات محلی استفاده می کند. اساساً، این بدان معنی است که اگر نام کاربری سیستم عامل کاربر با نام کاربری معتبر Postgres مطابقت داشته باشد، آن کاربر می تواند بدون احراز هویت بیشتر وارد شود.

در طول نصب Postgres، یک کاربر سیستم عامل به نام postgres ایجاد شد تا با کاربر مدیریت PostgreSQL مطابقت داشته باشد. برای انجام کارهای اداری باید از این کاربر استفاده کنید. با گزینه -u می توانید از sudo و pass در نام کاربری استفاده کنید.

با تایپ کردن، وارد یک جلسه تعاملی Postgres شوید:

sudo -u postgres psql

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

CREATE DATABASE myproject;

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

CREATE USER myprojectuser WITH PASSWORD ‘password’;

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

ALTER ROLE myprojectuser SET client_encoding TO ‘utf8’;
ALTER ROLE myprojectuser SET default_transaction_isolation TO ‘read committed’;
ALTER ROLE myprojectuser SET timezone TO ‘UTC’;

شما کدگذاری پیش‌فرض را روی UTF-8 تنظیم می‌کنید که جنگو انتظار دارد. شما همچنین طرح پیش‌فرض جداسازی تراکنش را روی «خواندن تعهد» تنظیم می‌کنید که خواندن تراکنش‌های غیرمتعهد را مسدود می‌کند. در نهایت، شما در حال تنظیم منطقه زمانی هستید. به‌طور پیش‌فرض، پروژه‌های جنگو شما برای استفاده از UTC تنظیم می‌شوند. اینها همه توصیه هایی از خود پروژه جنگو هستند.

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

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

برای بازگشت به جلسه پوسته کاربر postgres از اعلان SQL خارج شوید:

\q

جنگو را در یک محیط مجازی نصب کنید

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

برای نصب virtualenv تایپ کنید:

sudo pip3 install virtualenv

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

mkdir ~/myproject

cd ~/myproject

شما می توانید با تایپ کردن یک محیط مجازی برای ذخیره نیازمندی های Python پروژه جنگو خود ایجاد کنید:

python3 -m virtualenv myprojectenv

این یک کپی محلی از پایتون و یک دستور pip محلی را در فهرستی به نام myprojectenv در فهرست پروژه شما نصب می کند.

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

source myprojectenv/bin/activate

اعلان شما تغییر می کند تا نشان دهد که اکنون در محیط مجازی کار می کنید. چیزی شبیه این (myprojectenv)user@host:~/myproject$ خواهد بود.

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

pip install Django psycopg2

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

django-admin startproject myproject .

تنظیمات پایگاه داده جنگو را پیکربندی کنید

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

فایل اصلی تنظیمات پروژه جنگو را که در دایرکتوری پروژه فرزند قرار دارد باز کنید:

nano ~/myproject/myproject/settings.py

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

~/myproject/myproject/settings.py

. . .

DATABASES = {
    'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

. . .

این در حال حاضر برای استفاده از SQLite به عنوان پایگاه داده پیکربندی شده است. شما باید این را تغییر دهید تا پایگاه داده PostgreSQL شما به جای آن استفاده شود.

ابتدا موتور را طوری تغییر دهید که به جای آداپتور sqlite3 از آداپتور postgresql استفاده کند. برای NAME، از نام پایگاه داده خود (myproject در این مثال) استفاده کنید. همچنین باید اعتبار ورود به سیستم را اضافه کنید. برای اتصال به نام کاربری، رمز عبور و میزبان نیاز دارید. گزینه پورت را اضافه کرده و آن را خالی می گذارید تا پیش فرض انتخاب شود:

~/myproject/myproject/settings.py

. . .

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'myproject',
        'USER': 'myprojectuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

. . .

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

در قطعه زیر، چند نمونه نظر داده شده برای نشان دادن وجود دارد:

~/myproject/myproject/settings.py

. . .
# The simplest case: just add the domain name(s) and IP addresses of your Django server
# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
# To respond to 'example.com' and any subdomains, start the domain with a dot
# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
ALLOWED_HOSTS = ['your_server_domain_or_IP']

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

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

پایگاه داده را مهاجرت کنید و پروژه خود را آزمایش کنید.

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

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

cd ~/myproject

python manage.py makemigrations

python manage.py migrate

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

python manage.py createsuperuser

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

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

با تایپ کردن:

sudo ufw allow 8000

هنگامی که پورت را باز کردید، می توانید با راه اندازی سرور توسعه جنگو تست کنید که پایگاه داده شما به درستی کار می کند:

python manage.py runserver 0.0.0.0:8000

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

http://server_domain_or_IP:8000

شما باید صفحه فهرست پیش فرض را ببینید:

/admin را به انتهای URL اضافه کنید و باید بتوانید به صفحه ورود به رابط مدیریت دسترسی داشته باشید:

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

پس از اتمام بررسی، می توانید با زدن CTRL-C در پنجره ترمینال، سرور توسعه را متوقف کنید.

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

نتیجه

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

 

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/

برچسب‌ها:اوبونتو 20.04برنامه جنگوبرنامه های پایتونخرید سرورخرید سرور مجازیخرید سرور مجازی آمریکاسرور اوبونتو 20.04نحوه استفاده از PostgreSQLنرم‌افزار پایگاه داده

  • behnam gol mohamadi
  • ۰
  • ۰

 چگونه سرورهای اوبونتو 20.04 را به روز نگه داریم

ورود به سایت

معرفی

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

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

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

پیش نیازها

یک سرور اوبونتو 20.04 و یک کاربر غیر ریشه با امتیازات sudo.

مرحله 1 – پیروی از بهترین روش ها برای مدیریت برنامه

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

در صورت امکان، برنامه های موجود در پشته شما باید توسط سیستم init سرور شما مدیریت شود، که در اکثر توزیع های لینوکس مدرن از جمله اوبونتو سیستمی است. Systemd دستور systemctl را برای تعامل با سرویس های در حال اجرا و راه اندازی مجدد خودکار آنها در صورت نیاز ارائه می دهد. تقریباً تمام نرم افزارهایی که از طریق مدیریت بسته شما نصب می شوند و برای اجرا در پس زمینه طراحی می شوند، باید به طور خودکار یک سرویس systemd و یک فایل واحد پیکربندی را به عنوان بهترین روش ارائه دهند.

هنگام اجرای نرم افزار خود، یا نرم افزار مستقر شده از مخازن Git، ایده بدی نیست که فایل های واحد خود را برای ادغام با systemd بنویسید. به عنوان یک جایگزین سبک، ممکن است ترجیح دهید از ابزاری مانند سرپرست استفاده کنید. همچنین می‌توانید از زمان‌بندی cron سیستم خود با دستور reboot@ استفاده کنید.

پس از اینکه پیکربندی در جای خود قرار گرفت، مطمئن شوید که آن را از طریق راه اندازی مجدد تست کنید. می‌توانید با اجرای sudo shutdown now -r راه‌اندازی مجدد کنید، که فرآیندهای در حال اجرا شما را کاملاً متوقف می‌کند و بلافاصله راه‌اندازی مجدد می‌شود. همچنین می‌توانید به‌جای زمان کنونی، زمان را به hh:mm یا چند دقیقه از هم‌اکنون تعیین کنید تا در آینده راه‌اندازی مجدد را برنامه‌ریزی کنید. استقرار تولید معمولاً پس از قطعی های برنامه ریزی نشده نیازی به توجه شما ندارد و همه سرویس ها و نقاط پایانی لازم باید به طور خودکار بازیابی شوند.

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

مرحله 2 – پیکربندی ارتقاءهای بدون نظارت

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

اوبونتو یک ابزار منحصر به فرد به نام ارتقاهای بدون نظارت را به منظور بازیابی و نصب خودکار وصله های امنیتی و سایر ارتقاءهای ضروری برای سرور شما فراهم می کند. اکثر سرورهای اوبونتو با این ابزار به صورت خودکار نصب و پیکربندی می شوند، اما می توانید آن را با دستورات apt زیر نصب کنید:

sudo apt update
sudo apt install unattended-upgrades

پس از نصب، می توانید بررسی کنید که آیا سرویس ارتقاء بدون نظارت با استفاده از systemctl اجرا می شود:

sudo systemctl status unattended-upgrades.service

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

پیکربندی آن در /etc/apt/apt.conf.d/50unattended-upgrades ذخیره می شود. این فایل را با استفاده از nano یا ویرایشگر متن مورد علاقه خود باز کنید:

sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

فایل به خوبی حاشیه نویسی شده است، و می توانید خطوط بسیاری از نظرات کد (با //) را ببینید که عملکرد آن را توضیح می دهند. اولین بلوک پیکربندی، بسته‌هایی را که به‌طور خودکار به‌روزرسانی می‌شوند، بررسی می‌کند و با الگوی نام‌های مخزن بسته اوبونتو مطابقت دارد. فایل‌های موجود در مخزن هسته و مخزن -security به طور پیش‌فرض به‌روزرسانی می‌شوند، اما خطوط حاوی مخازن -updates، -proposed و -backports به‌طور پیش‌فرض نظر داده می‌شوند.

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

در پایین تر از فایل، تعدادی گزینه با ضامن تنظیمات درست / نادرست وجود دارد. به عنوان مثال، پس از نصب بسته هایی که برای اعمال نیاز به راه اندازی مجدد دارند، یک جابجایی برای راه اندازی مجدد خودکار وجود دارد. می توانید این گزینه را با حذف علامت // و تغییر false به true فعال کنید. با این حال، انجام این کار باعث می شود سرور شما در فواصل غیرقابل پیش بینی از دسترس خارج شود. اگر این گزینه را فعال کردید، مطمئن شوید که برنامه‌ها یا کاربران شما می‌توانند خرابی را تحمل کنند.

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

اگر تغییراتی در پیکربندی ایجاد کردید، سرویس ارتقاهای بدون نظارت را مجدداً بارگیری کنید تا اعمال شود:

sudo systemctl reload unattended-upgrades.service

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

مرحله 3 – به روز رسانی و LivePatching هسته

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

هیچ روش جهانی برای زمان بندی خودکار به روز رسانی هسته لینوکس وجود ندارد. این به این دلیل است که به‌روزرسانی‌های هسته از گذشته نیازمند راه‌اندازی مجدد کامل سیستم بوده‌اند و زمان‌بندی راه‌اندازی مجدد بدون ایجاد فرضیاتی در مورد محیط شما غیرممکن است. انتظار می‌رود که بسیاری از سرورها تا حد امکان در دسترس بودن 24 ساعته و 7 روز هفته را ارائه دهند و راه‌اندازی مجدد می‌تواند مدت زمان نامعلومی طول بکشد یا نیاز به مداخله دستی داشته باشد.

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

فعال کردن Livepatch برای اطمینان از Uptime سرور در طول به روز رسانی هسته

برای جلوگیری از خرابی در هنگام ارتقای هسته، می توانید از ویژگی هسته لینوکس به نام وصله زنده استفاده کنید. این ویژگی امکان پیاده سازی به روز رسانی هسته را بدون راه اندازی مجدد می دهد. دو نگهدارنده اصلی برای وصله‌های زنده هسته وجود دارد: Canonical، که سرویس Livepatch خود را برای اوبونتو ارائه می‌کند، و KernelCare که اوبونتو را علاوه بر سایر توزیع‌های اصلی لینوکس پشتیبانی می‌کند. هر دو برای استفاده نیاز به ثبت نام دارند و فقط سرویس Canonical برای استفاده فردی رایگان است.

می توانید برای یک کلید Livepatch در https://auth.livepatch.canonical.com/ ثبت نام کنید. پس از ثبت نام، می توانید بسته snap canonical-livepatch را نصب کنید. Snap یکی دیگر از مدیریت بسته های اوبونتو است که در کنار apt اجرا می شود.

sudo snap install canonical-livepatch

می‌توانید با استفاده از کلید وب‌سایت آن‌ها، با فرمان یک خطی، canonical-livepatch را فعال کنید:

sudo canonical-livepatch enable your-key

خروجی باید حاوی پیام Successfully enabled device باشد. این سرویس باید از این پس بدون هیچ گونه مداخله دیگری در پس زمینه اجرا شود و می توانید وضعیت آن را با استفاده از وضعیت canonical-livepatch بررسی کنید:

sudo canonical-livepatch status

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

نتیجه

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

 

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/

برچسب‌ها:LivePatching هستهاتصال به سرور مجازیبه روز رسانی سرورخرید سرور مجازیراه اندازی سرورسرور مجازیسرورهای اوبونتو 20.04فعال کردن Livepatch

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از MongoDB در یک برنامه Flask

ورود به سایت

معرفی

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

Flask یک چارچوب وب سبک وزن پایتون است که ابزارها و ویژگی های مفیدی را برای ایجاد برنامه های کاربردی وب در زبان پایتون ارائه می دهد. MongoDB یک برنامه پایگاه داده NoSQL برای همه منظوره، سند محور است که از اسناد JSON مانند برای ذخیره داده ها استفاده می کند. برخلاف روابط جدولی که در پایگاه‌های اطلاعاتی رابطه‌ای استفاده می‌شود، اسناد JSON مانند امکان ایجاد طرح‌واره‌های انعطاف‌پذیر و پویا را در عین سادگی حفظ می‌کنند. به طور کلی، پایگاه های داده NoSQL توانایی مقیاس افقی را دارند که آنها را برای داده های بزرگ و برنامه های بلادرنگ مناسب می کند.

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

پیش نیازها

  • یک محیط برنامه نویسی محلی Python 3، آموزش توزیع خود را در نحوه نصب و راه اندازی یک محیط برنامه نویسی محلی برای سری Python 3 دنبال کنید. در این آموزش ما دایرکتوری پروژه خود را flask_app می نامیم.
  • MongoDB روی دستگاه محلی شما نصب شده است. راهنمای نحوه نصب MongoDB در اوبونتو 20.04 را برای تنظیم پایگاه داده MongoDB خود دنبال کنید.
  • درک مفاهیم پایه فلاسک، مانند مسیرها، توابع مشاهده، و الگوها. اگر با Flask آشنایی ندارید، نحوه ایجاد اولین برنامه وب خود با استفاده از Flask و Python و نحوه استفاده از الگوها در یک برنامه Flask را بررسی کنید.
  • درک مفاهیم اولیه HTML برای آگاهی از پیشینه، می‌توانید مجموعه آموزش نحوه ساخت یک وب‌سایت با HTML را مرور کنید.

مرحله 1 – راه اندازی PyMongo و Flask

در این مرحله Flask و کتابخانه PyMongo را نصب خواهید کرد.

با فعال شدن محیط مجازی، از pip برای نصب Flask و PyMongo استفاده کنید:

pip install Flask pymongo

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

 

Output

Successfully installed Flask-2.0.2 Jinja2-3.0.3 MarkupSafe-2.0.1 Werkzeug-2.0.2 click-8.0.3 itsdangerous-2.0.1 pymongo-4.0.1

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

مرحله 2 – اتصال به سرور MongoDB و ایجاد یک مجموعه

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

با فعال بودن محیط برنامه نویسی خود، فایلی به نام app.py را برای ویرایش در پوشه flask_app خود باز کنید:

nano app.py

این فایل کلاس و راهنماهای لازم را از Flask و کتابخانه PyMongo وارد می کند. شما با سرور MongoDB خود برای ایجاد یک پایگاه داده و ایجاد مجموعه ای برای کارها تعامل خواهید داشت. کد زیر را به app.py اضافه کنید:

flask_app/app.py

from flask import Flask
from pymongo import MongoClient

app = Flask(__name__)

client = MongoClient('localhost', 27017)

db = client.flask_db
todos = db.todos

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

در اینجا شما کلاس Flask را وارد می کنید، که از آن برای ایجاد یک نمونه برنامه کاربردی Flask به نام app استفاده می کنید.

شما MongoClient را وارد می کنید که از آن برای ایجاد یک شی کلاینت برای نمونه MongoDB به نام کلاینت استفاده می کنید، که به شما امکان می دهد با سرور MongoDB خود ارتباط برقرار کنید و با آن تعامل داشته باشید. وقتی MongoClient را نمونه‌سازی می‌کنید، آن را به میزبان سرور MongoDB خود، که در مورد ما localhost است، و پورت را که در اینجا 27017 است، منتقل می‌کنید.

سپس از نمونه مشتری برای ایجاد یک پایگاه داده MongoDB به نام flask_db استفاده می کنید و یک مرجع به آن را در متغیری به نام db ذخیره می کنید.

سپس مجموعه ای به نام todos در پایگاه داده flask_db با استفاده از متغیر db ایجاد می کنید. مجموعه ها گروهی از اسناد را در MongoDB ذخیره می کنند، مانند جداول در پایگاه های داده رابطه ای.

در MongoDB، پایگاه داده ها و مجموعه ها با تنبلی ایجاد می شوند. این به این معنی است که حتی اگر فایل app.py را اجرا کنید، تا زمانی که اولین سند ایجاد نشود، هیچ یک از کدهای مربوط به پایگاه داده اجرا نخواهد شد. شما یک برنامه کوچک Flask با صفحه ای ایجاد خواهید کرد که به کاربران اجازه می دهد در مرحله بعد اسناد todo را در مجموعه کارهای شما وارد کنند. هنگامی که اولین سند todo اضافه شد، پایگاه داده flask_db و مجموعه todos در سرور MongoDB شما ایجاد می شود.

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

mongo

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

show dbs

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

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

مرحله 3 – ایجاد یک صفحه وب برای افزودن و نمایش کارها

در این مرحله، یک صفحه وب با یک فرم وب ایجاد می‌کنید که به کاربران اجازه می‌دهد تا کارها را اضافه کرده و در همان صفحه نمایش دهند.

با فعال بودن محیط برنامه نویسی، فایل app.py خود را برای ویرایش باز کنید:

nano app.py

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

flask_app/app.py

from flask import Flask, render_template, request, url_for, redirect
from pymongo import MongoClient

# ...

در اینجا، تابع render_template() کمکی را که برای رندر یک قالب HTML استفاده می کنید، شی درخواست برای دسترسی به داده هایی که کاربر ارسال می کند، تابع url_for() برای تولید URL و تابع redirect() برای تغییر مسیر کاربر وارد می کنید. پس از افزودن یک کار به صفحه فهرست بازگردید.

سپس مسیر زیر را در انتهای فایل اضافه کنید:

flask_app/app.py

# ...


@app.route('/', methods=('GET', 'POST'))
def index():
    return render_template('index.html')

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

در این مسیر، تاپل (“GET”، “POST”) را به پارامتر متد ارسال می کنید تا درخواست های GET و POST را مجاز کنید. درخواست های GET برای بازیابی داده ها از سرور استفاده می شود. درخواست های POST برای ارسال داده ها به یک مسیر خاص استفاده می شود. به طور پیش فرض، فقط درخواست های GET مجاز هستند. هنگامی که کاربر برای اولین بار مسیر / را با استفاده از یک درخواست GET درخواست می کند، یک فایل الگو به نام index.html ارائه می شود. شما بعداً این مسیر را برای رسیدگی به درخواست‌های POST برای زمانی که کاربران فرم وب را برای ایجاد کارهای جدید پر کرده و ارسال می‌کنند، ویرایش خواهید کرد.

سپس یک پوشه templates در پوشه flask_app خود و الگوی index.html که در مسیر قبلی به آن اشاره کردید ایجاد کنید:

mkdir templates
nano templates/index.html

کد زیر را داخل فایل index.html اضافه کنید:

flask_app/templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>FlaskApp</title>
    <style>
        .todo {
            padding: 20px;
            margin: 10px;
            background-color: #eee;
        }
    </style>
</head>
<body>
    <h1>FlaskTODO</h1>
    <hr>
    <div class="content">
    <form method="post">
        <p>
            <b><label for="content">Todo content</label></b>
        </p>
        <p>
            <input type="text" name="content"
                placeholder="Todo Content"></input>
        </p>

        <p>
            <b><label for="degree">Degree</label></b>
        </p>
        <p>
            <input id="degree-0" name="degree" required type="radio" value="Important">
            <label for="degree-0">Important</label>
        </p>
        <p>
            <input id="degree-1" name="degree" required type="radio" value="Unimportant">
            <label for="degree-1">Unimportant</label>
        </p>
        <button type="submit">Submit</button>
    </form>
    </div>
</body>
</html>

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

در اینجا شما یک صفحه اصلی HTML با عنوان، چند سبک، عنوان و یک فرم وب دارید. در فرم وب، ویژگی متد را برای ارسال نشان می دهید که فرم درخواست POST ارسال می کند. شما یک فیلد ورودی متنی برای محتوای todo با محتوای نام دارید که برای دسترسی به داده های عنوان در مسیر / از آن استفاده می کنید. شما همچنین دو دکمه رادیویی HTML با درجه نام دارید که به کاربر امکان می‌دهد درجه اهمیت هر مورد را مشخص کند: آنها می‌توانند گزینه مهم یا گزینه غیرممکن را هنگام ایجاد کار انتخاب کنند. در آخر، شما یک دکمه ارسال در انتهای فرم دارید.

در حالی که در دایرکتوری flask_app خود با محیط مجازی فعال هستید، با استفاده از متغیر محیطی FLASK_APP به Flask در مورد برنامه (در این مورد app.py) بگویید. سپس متغیر محیطی FLASK_ENV را روی توسعه تنظیم کنید تا برنامه در حالت توسعه اجرا شود و به دیباگر دسترسی پیدا کنید. برای اطلاعات بیشتر در مورد اشکال زدا Flask، به نحوه رسیدگی به خطاها در یک برنامه فلاسک مراجعه کنید. برای این کار از دستورات زیر استفاده کنید:

export FLASK_APP=app
export FLASK_ENV=development

بعد، برنامه را اجرا کنید:

flask run

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

http://127.0.0.1:5000/

صفحه فهرست را با یک فیلد ورودی برای محتوای todo، دو دکمه رادیویی برای درجه اهمیت و یک دکمه ارسال خواهید دید.

برای اطلاعات بیشتر در مورد فرم های وب، نحوه استفاده از فرم های وب در یک برنامه فلاسک را ببینید. برای یک روش پیشرفته تر و ایمن تر برای مدیریت فرم های وب، به نحوه استفاده و اعتبارسنجی فرم های وب با Flask-WTF مراجعه کنید.

اگر فرم را پر کنید و ارسال کنید، با ارسال یک درخواست POST به سرور، هیچ اتفاقی نمی افتد زیرا شما درخواست های POST را در مسیر / رسیدگی نکرده اید.

سرور را در حال اجرا بگذارید و یک پنجره ترمینال جدید باز کنید.

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

nano app.py

مسیر / را به شکل زیر ویرایش کنید:

flask_app/app.py

@app.route('/', methods=('GET', 'POST'))
def index():
    if request.method=='POST':
        content = request.form['content']
        degree = request.form['degree']
        todos.insert_one({'content': content, 'degree': degree})
        return redirect(url_for('index'))

    all_todos = todos.find()
    return render_template('index.html', todos=all_todos)

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

در این تغییرات، شما درخواست های POST را در داخل شرط if request.method == ‘POST’ مدیریت می کنید. شما محتوای todo و درجه اهمیتی که کاربر ارسال می کند را از شی request.form استخراج می کنید.

شما از متد insert_one() در مجموعه todos برای اضافه کردن یک سند todo به آن استفاده می کنید. شما داده‌های todo را در فرهنگ لغت پایتون ارائه می‌دهید، «محتوا» را روی مقداری که کاربر در قسمت متن برای محتوای todo ارسال کرده است، تنظیم می‌کنید و کلید «درجه» را روی مقدار دکمه رادیویی که کاربر انتخاب می‌کند، تنظیم می‌کنید. سپس به صفحه فهرست هدایت می‌شوید، که صفحه را تازه می‌کند و آیتم جدید اضافه شده را نمایش می‌دهد.

برای نمایش تمام کارهای ذخیره شده، از متد find() خارج از کدی که مسئول رسیدگی به درخواست‌های POST است استفاده می‌کنید، که تمام اسناد todo موجود در مجموعه todos را برمی‌گرداند. کارهایی را که از پایگاه داده دریافت می کنید در متغیری به نام all_todos ذخیره می کنید و سپس فراخوانی تابع render_template() را ویرایش می کنید تا لیست اسناد todo را به قالب index.html منتقل کنید، که در قالب در متغیری به نام موجود خواهد بود. کارها

اگر صفحه فهرست را بازخوانی کنید، ممکن است پیامی از مرورگر دریافت کنید که از شما می خواهد ارسال مجدد فرم را تأیید کنید. اگر بپذیرید، مورد todo که قبلاً قبل از رسیدگی به درخواست‌های POST ارسال کرده‌اید، سپس به پایگاه داده اضافه می‌شود، زیرا کد رسیدگی به فرم‌ها اکنون در مسیر وجود دارد.

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

use flask_db

سپس از تابع find() برای دریافت همه موارد todo در پایگاه داده استفاده کنید:

db.todos.find()

اگر داده‌ای دوباره ارسال شد، آن را اینجا در خروجی خود خواهید دید.

سپس، قالب index.html را باز کنید تا محتویات لیست کارهایی که به آن ارسال کرده اید نمایش داده شود:

nano templates/index.html

فایل را با اضافه کردن یک شکست <hr> و یک حلقه Jinja برای بعد از فرم ویرایش کنید، به طوری که فایل به شکل زیر باشد:

flask_app/templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>FlaskApp</title>
    <style>
        .todo {
            padding: 20px;
            margin: 10px;
            background-color: #eee;
        }
    </style>
</head>
<body>
    <h1>FlaskTODO</h1>
    <hr>
    <div class="content">
    <form method="post">
        <p>
            <b><label for="content">Todo content</label></b>
        </p>
        <p>
            <input type="text" name="content"
                placeholder="Todo Content"></input>
        </p>

        <p>
            <b><label for="degree">Degree</label></b>
        </p>
        <p>
            <input id="degree-0" name="degree" required type="radio" value="Important">
            <label for="degree-0">Important</label>
        </p>
        <p>
            <input id="degree-1" name="degree" required type="radio" value="Unimportant">
            <label for="degree-1">Unimportant</label>
        </p>
        <button type="submit">Submit</button>
    </form>
    <hr>
    {% for todo in todos %}
        <div class="todo">
            <p>{{ todo['content'] }} <i>({{ todo['degree']}})</i></p>
        </div>
    {% endfor %}

    </div>
</body>
</html>

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

در این فایل، یک تگ <hr> اضافه می‌کنید تا فرم وب و لیست کارها را جدا کنید.

شما از یک حلقه for در خط {% for todo in todos %} برای عبور از هر مورد در لیست کارها استفاده می کنید. شما محتوای todo و درجه اهمیت را در یک تگ <p> نمایش می دهید.

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

مرحله 4 – حذف Todos

در این مرحله، مسیری را اضافه می‌کنید که به کاربران اجازه می‌دهد تا با استفاده از یک دکمه، کارها را حذف کنند.

ابتدا، یک مسیر /id/delete جدید اضافه می‌کنید که درخواست‌های POST را می‌پذیرد. تابع view delete() جدید شما شناسه کاری را که باید از URL حذف شود دریافت می کند، سپس از آن شناسه برای حذف آن استفاده کنید.

برای حذف یک todo، شناسه آن را به عنوان یک رشته دریافت می‌کنید و باید قبل از ارسال آن به روش حذف مجموعه، آن را به ObjectId تبدیل کنید. بنابراین باید کلاس ObjectId() را از ماژول bson وارد کنید، که کدگذاری و رمزگشایی BSON (Binary JSON) را مدیریت می کند.

برای ویرایش app.py را باز کنید:

nano app.py

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

flask_app/app.py

from bson.objectid import ObjectId

# ...

این کلاس ObjectId() است که از آن برای تبدیل شناسه رشته ها به اشیاء ObjectId استفاده می کنید.

سپس مسیر زیر را در پایان اضافه کنید:

flask_app/app.py

# ...


@app.post('/<id>/delete/')
def delete(id):
    todos.delete_one({"_id": ObjectId(id)})
    return redirect(url_for('index'))

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

در اینجا، به جای استفاده از دکوراتور معمولی app.route، از دکوراتور app.post معرفی شده در Flask نسخه 2.0.0 استفاده می کنید که میانبرهایی را برای روش های رایج HTTP اضافه می کند. برای مثال، @app.post(“/login”) یک میانبر برای @app.route(“/login”، method=[“POST”]) است. این بدان معناست که این تابع view فقط درخواست‌های POST را می‌پذیرد، و پیمایش به مسیر /ID/delete در مرورگر شما، خطای 405 Method Not Allowed را برمی‌گرداند، زیرا مرورگرهای وب به‌طور پیش‌فرض درخواست‌های GET را دارند. برای حذف یک todo، کاربر روی دکمه ای کلیک می کند که درخواست POST را به این مسیر ارسال می کند.

تابع شناسه سند کاری را که باید حذف شود دریافت می کند. شما این شناسه را به متد ()delete_one در مجموعه todos ارسال می‌کنید و شناسه رشته‌ای را که دریافت می‌کنید با استفاده از کلاس ObjectId() که قبلاً وارد کرده‌اید به ObjectId تبدیل می‌کنید.

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

سپس، قالب index.html را ویرایش کنید تا دکمه Delete Todo اضافه شود:

nano templates/index.html

حلقه for را با افزودن یک تگ <form> جدید ویرایش کنید:

flask_app/templates/index.html

    {% for todo in todos %}
        <div class="todo">
            <p>{{ todo['content'] }} <i>({{ todo['degree']}})</i></p>
            <form method="POST" action="{{ url_for('delete', id=todo['_id']) }}" >
                <input type="submit" value="Delete Todo"
                       onclick="return confirm('Are you sure you want to delete this entry?')">
            </form>
        </div>
    {% endfor %}

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

در اینجا، یک فرم وب دارید که یک درخواست POST را به تابع view delete() ارسال می کند. شما به todo[‘_id’] منتقل می‌کنید تا کاری را که حذف می‌شود، مشخص کنید. شما از متد ()firm موجود در مرورگرهای وب برای نمایش پیام تایید قبل از ارسال درخواست استفاده می کنید.

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

اکنون راهی برای حذف کارهای ناخواسته از پایگاه داده mongoDB خود در برنامه Flask خود دارید.

برای تایید حذف، پوسته مونگو خود را باز کنید و از تابع find() استفاده کنید:

db.todos.find()

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

نتیجه

شما یک برنامه وب کوچک Flask برای مدیریت کارهای انجام دادید که با پایگاه داده 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/

برچسب‌ها:اتصال به سرور MongoDBاتصال به سرور مجازیبرنامه Flaskبرنامه های کاربردی وبپایتونحذف Todosخرید سرور مجازیخرید سرور مجازی قویراه اندازی PyMongoسرور مجازینحوه استفاده از MongoDB

  • behnam gol mohamadi