<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های رضا خلفی</title>
        <link>https://virgool.io/feed/@reza_khalafi</link>
        <description>شغل من برنامه‌نویسی است، مطالعه و موسیقی هم دوست دارم.</description>
        <language>fa</language>
        <pubDate>2026-06-07 15:09:18</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/30934/avatar/avatar.png?height=120&amp;width=120</url>
            <title>رضا خلفی</title>
            <link>https://virgool.io/@reza_khalafi</link>
        </image>

                    <item>
                <title>ثبت SSL و HTTPS با Certbot</title>
                <link>https://virgool.io/@reza_khalafi/%D8%AB%D8%A8%D8%AA-ssl-%D9%88-https-%D8%A8%D8%A7-certbot-l4vbitiuuomh</link>
                <description>ابتدا به سرور از طریق SSH متصل شوید و certbot را نصب کنید:sudo apt install certbotدر صورت نیاز:sudo apt install python3-certbot-nginxرا نیز نصب کنید.وضعیت Firewall خود را چک کنید:sudo ufw statusدر صورت غیرفعال بودن فعال کنید:sudo ufw enableباید دسترسی کامل به Nginx، SSH و HTTPS داشته باشید:sudo ufw allow &#039;OpenSSH&#039;
sudo ufw allow &#039;Nginx HTTPS&#039;
sudo ufw allow &#039;Nginx Full&#039;حالا دامنه مورد نظر خود را به certbot بدهید(قاعدتا باید این دامنه را در config های nginx ثبت کرده باشید):sudo certbot --nginx -d example.com -d www.example.comحالا Nginx را restart کنید:sudo systemctl restart nginxقبل از بستن ترمینال حتما دوباره status را بگیرید و مطمئن باشید که OpenSSH باز باشد. یا حتی برای تست بهتر است یک ترمینال دیگر باز کنید و سعی کنید با SSH به سرور متصل شوید اگر پورت OpenSSH بسته باشد شما دیگر نمی‌توانید از طریق SSH به سرور متصل شوید.مقداری زمان دهید تا https شما فعال و قابل استفاده شود.پایان</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Mon, 07 Nov 2022 16:22:03 +0330</pubDate>
            </item>
                    <item>
                <title>اکسپورت و ایمپورت دیتابیس Postgres روی سرور Ubuntu</title>
                <link>https://virgool.io/@reza_khalafi/%D8%A7%DA%A9%D8%B3%D9%BE%D9%88%D8%B1%D8%AA-%D9%88-%D8%A7%DB%8C%D9%85%D9%BE%D9%88%D8%B1%D8%AA-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-postgres-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-ubuntu-xualrp9rltm3</link>
                <description>ابتدا از طریق ssh به سرور خود متصل شوید.با استفاده از دستورات زیر postgresql را نصب می‌کنیم:sudo apt -y update
sudo apt  install -y postgresql postgresql-contribوضعیت postgresql را از طریق دستور زیر مشاهده کنید:dpkg --status postgresqlاز طریق دستور زیر وارد سرور PostgreSql می‌شویم:sudo su postgresبه آدرس root در سرور PostgreSql می‌رویم:cdبرای ایجاد و مدیریت دیتا‌بیس به فضای Command Line آن متصل می‌شویم:psqlو چنین متنی را مشاهده می‌کنیم:با دستور زیر لیست دیتابیس‌های موجود را مشاهده کنید:\lایجاد دیتابیسقصد داریم یک دیتابیس به نام test_db ایجاد کنیم و چند رکورد وارد آن کنیم:احتمالا شما از قبل این دیتابیس را دارید و نیاز به این مرحله ندارید.postgres=# CREATE USER reza WITH PASSWORD &#039;reza1234&#039;;
postgres=# CREATE DATABASE test_db;
postgres=# GRANT ALL PRIVILEGES ON DATABASE test_db to reza;دوباره با دستور \l  لیست دیتابیس‌های خود را ببینید:ابتدا با دستور زیر به دیتابیس test_db متصل می‌شویم:\c test_db;یک تیبل به نام users ایجاد می‌کنیم و چند رکورد وارد آن می‌کنیم:test_db=# CREATE TABLE users(name varchar(20));
test_db=# INSERT INTO users(name) VALUES(&#039;Reza&#039;);
test_db=# INSERT INTO users(name) VALUES(&#039;Ali&#039;);
test_db=# INSERT INTO users(name) VALUES(&#039;Kamran&#039;);
test_db=# SELECT * FROM users;گرفتن Back up از دیتابیسابتدا دستور زیر را وارد کنید تا از فضای comman line  دیتابیس خارج شوید:\qبا دستور زیر عملیات بک‌آپ گیری انجام خواهد شد:pg_dump test_db &gt; test_db_backup.sqlیاpg_dump -U postgres -f test_db_bakcup.sql test_dbاگر می‌خواهید فایل ایجاد شده را ببینید(برای نگهداری در جای دیگر و یا به سرور دیگر) به آدرس زیر بروید:/var/lib/postgresql/
llعملیات بک‌آپ گیری انجام شد.نکته: حتما متن فایل بک‌آپ گرفته شده را نگاه کنید تا از درستی آن مطمئن شوید زیرا ممکن است بک‌آپ اشتباهی را گرفته باشید و اطلاعات شما از بین برود. وارد کردن دیتابیس بک‌اپ‌گیری شدهبرای این‌ کار باید دیتابیس مورد نظر در سرور PostgreSql از قبل ایجاد شده باشد. این دیتابیس ممکن است خالی و یا دارای رکورد‌هایی باشد. بهتر است دیتابیس خالی باشد تا با error و یا conflict مواجه نشوید.حال برای تست این موضوع با دستور زیر تیبل users را کاملا پاک(drop) می‌کنیم:psql
\c test_db;
test_db=# DROP TABLE users;دوباره خارج می‌شویم:\qبا دستور زیر می‌توانید دیتابیس بک‌آپ‌گیری شده را وارد Postgres کنید:psql -U postgres -d test_db -f test_db_backup.sqlبارگذاری بک‌آپ تمام شده و حالا می‌توانید با کوئری زدن یا به هر نحو دیگر صحت اطلاعات خود را بررسی کنید.پایان.</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Mon, 09 May 2022 15:46:06 +0430</pubDate>
            </item>
                    <item>
                <title>ثبت‌نام با OAuth2 گوگل در وب</title>
                <link>https://virgool.io/dexign/%D8%AB%D8%A8%D8%AA-%D9%86%D8%A7%D9%85-%D8%A8%D8%A7-oauth2-%DA%AF%D9%88%DA%AF%D9%84-%D8%AF%D8%B1-%D9%88%D8%A8-eyhtskyig0dm</link>
                <description>برای استفاده از OAuth گوگل نیاز به هیچ پکیج و کامپوننتی ندارید و تفاوتی نمی‌کند که از چه زبان برنامه‌نویسی استفاده می‌کنید.ثبت نام و لاگین با گوگل شامل سه مرحله اصلی می‌شود:دریافت کد از گوگل که به معنای Grant Access می‌باشد.دریافت Access Token که با استفاده از کد دریافتی انجام می‌شود.دریافت اطلاعات اکونت گوگل شخص که با استفاده از Access Token انجام می‌شود.اطلاعات بیشتر در این صفحه گوگل موجود می‌باشد: Google OAuth2برای تمامی مراحل بالا گوگل Api های لازم را در اختیار ما گذاشته که در ادامه به آن خواهیم پرداخت.در ابتدا به یک اکونت گوگل نیاز داریم که می‌توانید از این روش آن را بسازید: ساخت Credentionals برای Google OAuth2حالا شما client_id, client_secret و redirect_uri را ساخته‌اید و می‌توانید با Grant Access Api را از طریق Curl یا به هر روش دیگر کال کنید.curl --location --request GET &#039;https://accounts.google.com/o/oauth2/v2/auth?client_id=MY_CLIENT_ID_EXAMPLE&amp;redirect_uri=MY_REDIRECT_URI_EXAMPLE&amp;scope=https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile&amp;response_type=code&#039;دقت کنید Scopes برای مشخص کردن دیتایی‌ست که شما از گوگل می‌خواهید دریافت کنید که در اینجا من اطلاعات پروفایل و ایمیل را درخواست داده‌ام که با یک space از هم جدا شده‌اند.https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/userinfo.profileاگر این request را از طریق یک browser انجام دهید خواهید دید که شما را به یک صفحه redirect_uri‌ هدایت می‌کند و از شما می‌خواهد تا اکونت گوگل خود را انتخاب کنید و آن را Sign In کنید و سپس در آدرس redirect_uri‌ به شما code تحویل داده می‌شود. این کد در مرحله بعد استفاده خواهد شد.تا این مرحله که از client_secret استفاده نشده‌ است نیاز به اعمال مسایل امنیتی نیست و شما می‌توانید از طریق بخش Frontend یا هر سیستم دیگری code را دریافت کنید. اما مراحل بعدی بهتر است در سمت Server انجام بپذیرد.حال برای دریافت access token از request زیر استفاده کنید.curl --location --request POST &#039;https://accounts.google.com/o/oauth2/token&#039; \
--header &#039;Cache-Control: no-cache&#039; \
--header &#039;Content-Type: application/x-www-form-urlencoded&#039; \
--data-urlencode &#039;client_id=MY_CLIENT_ID_EXAMPLE&#039; \
--data-urlencode &#039;client_secret=MY_CLEINT_SECRET&#039; \
--data-urlencode &#039;code=MY_CODE_EXAMPLE_FROM_PREVIOUS_STEP&#039; \
--data-urlencode &#039;redirect_uri=MY_REDIRECT_URI&#039; \
--data-urlencode &#039;grant_type=authorization_code&#039;دقت کنید که code دریافتی را ابتدا حتما Decode کنید و بعد ارسال کنید در واقع کد ارسالی در request بالا باید چیزی شبیه به 4/0AX4XfWhyiChTJDNi41X_6F1g0yZ3uFTR1HFvUVoN3e3h-R0voxomoOrHTuaqPamUHVP-aw باشد.نتیجه این request به شکل زیر است:حال شما access token را دارید و می‌توانید برای دریافت اطلاعات کاربر مورد نظر api سوم را کال کنید.curl --location --request GET &#039;https://www.googleapis.com/oauth2/v2/userinfo&#039; \
--header &#039;Authorization: Bearer ya29.A0ARrdaM8aMvnCEzbo5yOfFf_uFSdFnh5SqAZmahTC2ykHKOYTu6XkU-_k0msMgtA1HYC_lrK8y1gFyH-rX5SPGnhldL56zdGVoUVOE8V_r3kkb-38QNCCn4zvpcDkriQaAskqnFwXpWuZE00MZIPZkibHgtKq&#039;نیتجه این request بصورت زیر دریافت می‌شود.در دیتای دیافتی id برای هر اکونت گوگل ثابت می‌باشد و شما می‌توانید در احراز هویت در database خود از آن به عنوان یک شاخص مطمئن استفاده کنید.شما اطلاعات مورد نظر خود را در اختیار دارید.پایان.</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Sat, 30 Apr 2022 10:09:37 +0430</pubDate>
            </item>
                    <item>
                <title>ساخت Credentionals برای Google OAuth2</title>
                <link>https://virgool.io/@reza_khalafi/%D8%B3%D8%A7%D8%AE%D8%AA-credentionals-%D8%A8%D8%B1%D8%A7%DB%8C-google-oauth2-yixyfblevrm4</link>
                <description>هدف از ساخت Credential دریافت client_id, client_secret و تعیین redirect_uri می‌باشد.پس به آدرس زیر مراجعه کنید:ساخت Credentialابتدا یک New Project درست می‌کنیم.در صفحه Create OAuth client ID گزینه Web Application را انتخاب کنید.نام اپ را وارد کنید.و در قسمت Authorized redirect URIs آدرس برگشتی یا Callback Uri را وارد کنید. یا حتی چند آدرس وارد کنید.گزینه Create Credentials را انتخاب کنید و روی گزینه OAuth Client ID کلیک کنید.در صورت لزوم اگر اسکرین شما نیاز به تنظیم دارد گزینه configure consent screen  را انتخاب کنید.گزینه External را انتخاب کنید.در صفحه App information ‌می‌توانید نام، ایمیل دولوپری، ایمیل پشتیبانی و حتی لوگوی اپ را انتخاب کنید.در نهایت شما client_secret  و client_id را تحویل میگیرید.توجه کنید ممکن است شما از قبل پروژه تعریف شده داشته باشید واین باعث شود در توالی مراحل بالا تغییراتی ایجاد شود.موفق باشید.</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Sat, 30 Apr 2022 10:01:22 +0430</pubDate>
            </item>
                    <item>
                <title>دیپلوی پروژه Django با استفاده از Nginx، Systemd و Gunicorn بر روی سرور Ubuntu</title>
                <link>https://virgool.io/@reza_khalafi/%D8%AF%DB%8C%D9%BE%D9%84%D9%88%DB%8C-%D9%BE%D8%B1%D9%88%DA%98%D9%87-django-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-nginx-systemd-%D9%88-gunicorn-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-ubuntu-zhbyw2lu2mbn</link>
                <description>هدف از نوشتن این مطلب در حال اجرا نگه‌داشتن پروژه بر روی سرور به صورت بهینه است به شکلی که اگر ترمینال سیستم خود را می‌بندید یا سرور خود را restart می‌کنید پروژه شما همچنان قابل اجرا باشد.سرویس systemd در واقع یک پکیج مدیریت سرویس می‌باشد که در ابتدای بوت شدن سیستم‌عامل اجرا شده و توانایی کنترل و مدیریت پروسه‌ها را دارا می‌باشد.سرویس Gunicorn ساخته شده تا با web server های زیادی در تعامل باشد و این توانایی را دارد تا از طریق رابط WSGI وظیفه ارتباط بین web server و web application ها را بر عهده بگیرد. پس Gunicorn پروژه شما را در دل خود جای می‌دهد و آن را مدیریت می‌کند. و ما برای اداره کردن Gunicorn از systemd یا ابزارهای دیگر استفاده می‌کنیم.یکی از ابزار‌های مشهور برای مدیریت Gunicorn سرویس supervisor است.  برای داشتن یک دید بهتر به تصویر زیر نگاهی بیاندازیم:فرض بر این است که پروژه شما کاملا قابل اجرا از طریق Nginx می باشد و بدون مشکل کار می‌کند اگر تا به اینجای کار با مشکل مواجه هستید کافی‌است پست «دیپلوی پروژه جنگو روی سرور ابوتنو لینوکس با استفاده از انجین‌ایکس» با دقت مشاهده و اجرا کنید تا برای اجرای دستورات این مرحله آماده شوید.ابتدا env پروژه خود را به حالت activate در بیاوردید(من از نام rezaenv استفاده می‌کنم).دستور زیر را برای نصب Gunicorn در ترمینال وارد کنید:pip install gunicornیاpip3 install gunicornدستور gunicorn --version را استفاده کنید تا ورژن نصب شده را ببینید.حالا وارد آدرس rezaenv/bin شوید و دستور ll را وارد کنید تا فایل gunicorn ایجاد شده را ببینید:اگر Gunicorn را زمانی نصب کنید که در حالت env activate نیستید، این فایل ایجاد نمی‌شود.فایل‌بندی پروژه وب اپلیکیشن جنگوحال وارد آدرس rezaproject/reza شده و فایل settings.py را با دستور sudo nano settings.py ویرایش می‌کنیم:اگر IP سرور ما در حال حاضر 185.239.107.157 باشد:ALLOWED_HOSTS = [&amp;quot185.239.107.157&amp;quot, &amp;quotlocalhost&amp;quot, &amp;quot127.0.0.1&amp;quot]دقت کنید localhost حتما باید در بین آدرس‌های وارد شده باشد.برای تست کردن Gunicorn ابتدا به آدرس rezaproject بروید و از دستور زیر استفاده کنید:gunicorn --bind 0.0.0.0:8000 reza.wsgiپس می‌توانید آدرس سایت را وارد کرده و تست کنید.حالا deactivate کنید و از محیط env خارج شوید.حالا قصد داریم تا از طریق systemd سرویس Gunicorn را تنظیم و مدیریت کنیم. این کار بوسیله یک Socket انجام می‌شود که سرعت بالایی نسبت به حالت network آن دارد. یعنی nginx که یک request از طریق یک client دریافت کرده از طریق یک سوکت با gunicorn صحبت می‌کند و gunicorn نیز با Django app ما.پس به آدرس زیر می‌رویم:cd /etc/systemd/system/با دستور touch دو فایل gunicorn.socket و gunicorn.service را ایجاد می‌کنیم.touch gunicorn.socket
touch gunicorn.serviceابتدا socket را با sudo nano gunicorn.socket کانفیگ می‌کنیم طبق دستور زیر:/etc/systemd/system/gunicorn.socket[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.targetبا ctl + x آن را save می‌کنیم و خارج می‌شویم.و سپس sudo nano gunicorn.service:/etc/systemd/system/gunicorn.service[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/rezaproject
ExecStart=/home/ubuntu/rezaenv/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          reza.wsgi:application

[Install]
WantedBy=multi-user.targetذخیره کرده و خارج شوید.دقت کنید User=ubuntu باید دقیقا همان کاربری باشد که شما با آن وارد سرور شدید.دستور زیر را وارد کنید تا gunicorn بتواند به محتوای پروژه شما دسترسی داشته باشد:sudo chown -R ubuntu:www-data ~/rezaprojectحال برای راه‌اندازی gunicorn به روش زیر عمل می‌کنیم(ترتیب اجرا بسیار مهم می‌باشد):sudo systemctl daemon-reload
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socketو برای تست سوکت آن :sudo systemctl status gunicorn.socketبرای اطمینان این مورد را نیز تست کنید:  sudo systemctl status gunicornدر صورتی که gunicorn.service هنوز ران نشده است دستور زیر را وارد کنید و دوباره status هار را چک کنید:sudo systemctl enable gunicorn.serviceحال که کار ما با Gunicorn تمام شده به سراغ تغییرات Nginx می‌رویم، پس به آدرس و فایل زیر می‌رویم:sudo nano /etc/nginx/nginx.confو تغییرات را به شکل زیر اعمال می‌کنیم:events {

}

http {
    server {
        server_name 185.239.107.157;
        listen 9003;
        location / {
            include proxy_params;
            proxy_pass http://unix:/run/gunicorn.sock;
        }
    }
}ذخیره کنید و خارج شوید.توجه کنید server_name آدرس ip سرور، یا نام دامین سرور شما می‌باشد ‌و listen پورتی است که شما مایل هستید تا به همراه آدرس توسط request ها call شود.دستور sudo nginx -t را وارد کنید تا از syntax فایل nginx.conf مطمئن شوید:و سپس nginx را restart کنید:sudo systemctl restart nginxحال می‌توانید پروژه خود را روی آدرسی شبیه به http://185.239.107.157:9003 مشاهده کنید. مطمئن باشید با خارج شدن از ترمینال مک یا لینوکس خود یا reboot و reset شدن سرور، پروژه شما دوباره run خواهد شد و این اتفاق با همکاری تمامی این عناصر خواهد بود.پایان.</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Wed, 10 Nov 2021 16:05:51 +0330</pubDate>
            </item>
                    <item>
                <title>اتصال آسان و بدون Password به سرور Ubuntu با SSH Key</title>
                <link>https://virgool.io/@reza_khalafi/%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A2%D8%B3%D8%A7%D9%86-%D9%88-%D8%A8%D8%AF%D9%88%D9%86-password-%D8%A8%D9%87-%D8%B3%D8%B1%D9%88%D8%B1-ubuntu-%D8%A8%D8%A7-ssh-key-dm6nl1fhwc2l</link>
                <description>در مک یا لینوکس خود یک ترمینال باز کنید و قبل از هر گنه اتصال ssh دستور زیر را وارد کنید:ssh-keygen -t rsaفقط کافی‌است enter بزنید تا ssh key برای شما ایجاد شود.سپس دستور زیر را وارد کنید تا ssh key صادر شده در سیستم شما ذخیره شود:ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu@185.239.107.157رمز عبوری را که همیشه با آن به سرور وصل می‌شدید وارد کنید(برای آخرین بار).حالا می‌توانیم بدون رمز عبور بوسیله ssh به سرور وصل شویم:ssh ubuntu@185.239.107.157شما به سرور خود از طریق ssh وصل شدید.پایان.</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Wed, 10 Nov 2021 14:05:26 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده از Screen برای Run نگه داشتن Server</title>
                <link>https://virgool.io/@reza_khalafi/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-screen-%D8%A8%D8%B1%D8%A7%DB%8C-run-%D9%86%DA%AF%D9%87-%D8%AF%D8%A7%D8%B4%D8%AA%D9%86-server-eepv0tkvjm6q</link>
                <description>اسکرین یک ابزار ساده برای زنده نگه داشتن session شما در سرور می‌باشد. در صورت استفاده از این ابزار دیگر با بسته شدن ترمینال ارتباطی شما با سرور، session از بین نمی‌رود و کد شما همیشه در حالت running باقی می‌ماند.برای شروع به دایرکتوری مورد نظر رفته و قبل از اجرای هر دستوری که نیاز به حفظ حالت running دارد دستور screen را اجرا کنید تا این ابزار به دایرکتوری مربوطه اضافه شود:screenسپس enter بزنید تا screen به ترمینال شما attach شود. حالا کد خود را run کنید.به عنوان مثال برای جنگو python manage.py runserver 127.0.0.1:8003 اجرا می‌شود.پس از اجرای کد نتیجه را در browser ببینید. حالا ترمینال را ببندید و دوباره نتیجه را در browser ببینید. کد شما همچنان در حال اجرا می‌باشد.برای detach کردن هم کافی است دقیقا به همان دایرکتوری که کد screen را نصب و سپس کد را اجرا کردید بروید و سپس Ctrl+A را بزنید و سپس:d حالا screen شما detach  شده است.برای اطلاعات بیشتر و آشنایی با امکانات و command های دیگر screen پست linux_screen را ببینید.پایان.</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Sat, 06 Nov 2021 10:54:03 +0330</pubDate>
            </item>
                    <item>
                <title>دیپلوی پروژه جنگو روی سرور ابوتنو لینوکس با استفاده از انجین‌ایکس</title>
                <link>https://virgool.io/@reza_khalafi/%D8%AF%DB%8C%D9%BE%D9%84%D9%88%DB%8C-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%AC%D9%86%DA%AF%D9%88-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-%D8%A7%D8%A8%D9%88%D8%AA%D9%86%D9%88-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%A7%D9%86%D8%AC%DB%8C%D9%86-%D8%A7%DB%8C%DA%A9%D8%B3-jjkop2gmqcu4</link>
                <description>در اینجا قصد دارم تا به ساده‌ترین روش ممکن بدون پیش کشیدن هر گونه مبحث اضافه یک پروژه جنگو را روی یک سرور لینوکس(ابونتو) نصب کنم که با nginx کار می‌کند.هر مرحله در یک پست جداگانه مخصوص به خود شرح داده شده است، بنابراین این پست عنوان و شرح اولیه هر مرحله بصورت یک لیست دیده می‌شود و برای مشاهده هر بخش باید از طریق لینک مربوطه به صفحه آن پست مراجعه کنید.در ابتدا باید به سرور مورد نظر از طریق پروتکل ssh وصل شویم: اتصال به سرور Ubuntu از طریق SSH در ترمینال لینوکسبرای اینکه تمامی dependency ها به درستی با هم کار بکنند لازم است تا ابونتو ما بروزرسانی شود: بروزرسانی سرور لینوکسنیاز به یک سیستم مدیریت پکیج داریم که از pip استفاده می‌کنیم: نصب PIP روی سرور Ubuntuپایتون عموما روی سرور نصب می‌باشد اما بهتر است تا نسخه جدید آن چک و نصب شود: نصب پایتون روی سرور Ubuntuفریم‌ورک جنگو را نصب می‌کنیم: نصب Django روی سرور Ubuntuایجاد یک محیط Virtual برای سرور که مدیریت پروژه را از طریق آن انجام می‌دهیم: نصب Virtual Environment روی سرور Ubuntu برای Djangoتا اینجا تمامی پکیج‌های مورد نیاز نصب شده‌اند و حال باید پروژه خود را که قبلا آماده و روی یکی از SCM ها قرار داده‌ایم را روی سرور بگذاریم: دریافت پروژه(جنگو) روی سرور از گیت(گیت‌لب)حالا nginx را نصب کرده و پروژه را به آن متصل می‌کنیم تا دیپلوی ما کامل شود: نصب Nginx و اتصال به فریم‌ورک Djangoپایان.</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Wed, 03 Nov 2021 13:38:47 +0330</pubDate>
            </item>
                    <item>
                <title>نصب Nginx و اتصال به فریم‌ورک Django</title>
                <link>https://virgool.io/@reza_khalafi/%D9%86%D8%B5%D8%A8-nginx-%D9%88-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A8%D9%87-%D9%81%D8%B1%DB%8C%D9%85-%D9%88%D8%B1%DA%A9-django-ofq7xv8dy4xw</link>
                <description>برای نصب nginx دستور زیر را در ترمینال وارد کنید:sudo apt-get install nginxپس از نصب موفقیت‌آمیز می‌توانید ورژن نصب شده را اینگونه مشاهده کنید:nginx -vبرای دسترسی به فایل‌های nginx وارد دایرکتوری زیر می‌شویم:cd /etc/nginxو با دستور ll می‌توانید لیستی از این محتویات را مشاهده کنید:لیست فایل‌های nginxکانفیگ‌های nginx در فایل nginx.conf قرار دارد و برای تنظیمات و ارتباط با فریم‌ورک جنگو باید در این فایل دست ببریم.برای صرفا دیدن محتویات این فایل دستور زیر را وارد کنید:cat nginx.confبرای تنظیمات ابتدا دستوری زیر را وارد کرده تا بتوانیم در فایل مورد نظر تغییرات ایجاد کنیم:sudo nano nginx.confتنظیمات nginx تنظیمات شامل موارد زیادی می‌شود اما چیزی که در خطوط زیر می‌بینید ساده‌ترین حالت ممکن را شامل می‌شود:events {
}
http {
       server {
                    server_name 11.34.22.12;
                   #server_name http://example.com
                    listen 9003;
                    location / {
                                      proxy_pass http://127.0.0.1:9002;
                    }
       }
}برای اطمینان از syntax درست خطوط بالا دستور زیر را اجرا کنید:sudo nginx -tو نتیجه آن:حالت صحیح کدو nginx را reload یا restart کنید:sudo nginx -s reload
sudo service nginx restartدر واقع server_name همان آدرسی است که شما به آن ssh زده‌اید و می‌توانید آدرس domain نیز بجای آن وارد کنید. پس client برای استفاده از سرویس بالا آمده باید آدرس server_name را call کند. listen نیز پورتی است که client باید آن را call کند و ما عملا nginx را مجبور کرده‌ایم که برای ارتباط با فریم‌ورک ما به پورت مثلا 9003 گوش دهد. بنابراین client می‌تواند چیزی شبیه به خط پایین را call کند:http://example.com:9003/somethingیاhttp://11.34.22.12:9003/something تا اینجا nginx اطلاعت و request ها را از client دریافت کرده و حال باید برای تحلیل آن‌ها را به فریم‌وررک بفرستد. در اسکوپ location این proxy_pass است که این وظیفه را برعهده دارد. آدرس 127.0.0.1 در واقع همان آدرسی است که زمانی که در local پروژه را run می کردیم استفاده می‌شد. دقیقا نشان‌دهنده این مفهوم است که ما کد و پروژه خود را پشت nginx قرار داده‌ایم و nginx با پروژه ما مثل یک پروژه local برخورد می‌کند. شما می‌توانید هر پورت و آی پی را در این قسمت قرار دهید.حالا rezaenv را active کنید و دستور:python manage.py runserver 127.0.0.1:9002 اجرا کنید.اگر پروژه با موفقیت run شد یکی از آدرس‌های صحیح وبسایت یا api را call کنید. شما باید نتیجه مورد نظر خود را ببینید و اگر با خطاهای درون پروژه ای برخورد کردید به این معناست که سیستم deployment شما کاملا صحیح است و شما صرفا نیاز دارید تا کد خود و تنظیمات فریم‌ورک خود را بازبینی کنید.دقت کنید در صورت بسته شدن ترمینال session شما از بین می‌رود و ریکوئست‌ها respond نخواهند داد برای این کار می‌توانید از ابزار screen استفاده کنید.فراموش نکنید ERROR 502 به این معنا می‌باشد که nginx درخواستی را از یک client دریافت کرده است ولی نمی‌تواند با پروژه شما ارتباط برقرار کند.پایان.بازگشت به پست اصلی</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Wed, 03 Nov 2021 12:01:23 +0330</pubDate>
            </item>
                    <item>
                <title>دریافت پروژه(جنگو) روی سرور از گیت(گیت‌لب)</title>
                <link>https://virgool.io/@reza_khalafi/%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA-%D9%BE%D8%B1%D9%88%DA%98%D9%87%D8%AC%D9%86%DA%AF%D9%88-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-%D8%A7%D8%B2-%DA%AF%DB%8C%D8%AA%DA%AF%DB%8C%D8%AA-%D9%84%D8%A8-b8nvpwfjhc8o</link>
                <description>برای دریافت پروژه خود از SCM یا Source Code Manager مثل Github, Gitlab, Bitbucket و ... باید git روی سرور ubuntu شما نصب باشد که البته بصورت پیشفرض نصب می‌باشد.پس شما به سه پارامتر نیاز دارید:آدرس https پروژه خودنام کاربری حساب کاربری گیت کلمه عبور حساب کاربری گیتحال باید در دایرکتوری projects که در پست «نصب Virtual Environment روی سرور Ubuntu برای Django» گفته شد قرار گیریم و پروژه خود را اصطلاحا کلون کنیم:git clone https://gitlab.com/reza-services/rezaproject.gitبدلیل تحریم قبل از کلون کردن می‌توانید از این پراکسی‌ها را در ترمینال خود وارد کنید:git config --global http.proxy fodev.org:8118
git config --global https.proxy fodev.org:8118یابا تغییر DNS از طریق شکن و این راهنما یا این راهنما مشکل را برطرف کنید.پس از دریافت پروژه با دستور ls می‌توانید محتوای دایرکتوری را چک کنید. چیزی که مشاهده می‌کنید شامل rezaenv و rezaproject می باشد([cloned project] + [new environment]).حال باید تنظیمات اولیه پروژه کلون شده را انجام دهیم پس ابتدا rezaenv را activate می‌کنیم، سپس وارد دایرکتوری پروژه کلون شده می‌شویم:cd rezaprojectدر نظر گرفته شده که شما از فایل requirements.txt برای نصب پکیج‌های خود استفاده می‌کنید که در دایرکتوری کنونی قرار دارد. پس برای نصب این پکیج‌ها دستور زیر را وارد کنید:pip install -r requirements.txtیاpip3 install -r requirements.txtحالا برای مشاهده اینکه چه پکیج‌هایی روی env و پروژه شما نصب شده است می‌توانید از یکی از دستورات زیر استفاده کنید:pip list
pip freeze سپس قصد داریم تا table های DB را بسازیم پس طبق دستورات زیر عمل می‌کنیم:python manage.py makemigrations app_name_or_models_folder
python manage.py migrate
python manage.py runserverاگر نتیجه دستورات بالا شبیه به تصویر پایین باشد یعنی پروژه شما تا اینجای کار به سلامت نصب و راه‌اندازی شده و اقدامات اولیه با موفقیت انجام پذیرفته است:تا اینجا شما env جدید ساخته و آن را به درستی اجرا کرده‌اید و با آن پروژه کلون شده خود را کانفیگ اولیه کرده‌اید.در مرحله بعد به سراغ نصب nginx و اتصال آن به پروژه می‌رویم.پایان.بازگشت به پست اصلی</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Tue, 02 Nov 2021 17:54:17 +0330</pubDate>
            </item>
                    <item>
                <title>نصب Virtual Environment روی سرور Ubuntu برای Django</title>
                <link>https://virgool.io/@reza_khalafi/%D9%86%D8%B5%D8%A8-virtual-environment-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-ubuntu-%D8%A8%D8%B1%D8%A7%DB%8C-django-yj89o5mqjyee</link>
                <description>پس از اتصال از طریق ssh به سرور برای نصب venv طبق دستور زیر عمل می‌کنیم:sudo apt-get install python3-venvیاsudo apt install python3-virtualenvنتیجه و ورژن نصب شده را به شکل زیر مشاهده کنید:virtualenv --versionvirtualenv 20.0.17 from /usr/lib/python3/dist-packages/virtualenv/__init__.py حال بهتر است root پروژه را ببینم:pwdنتیجه چیزی شبیه به خط زیر خواهد بود:/home/ubuntuبهتر از یک دایرکتوری برای پروژه جدیدمان ایجاد کنیم(من از نام projects استفاده کرده‌ام):sudo mkdir projects از طریق دستورهای ls یا ll می‌توانید محتوای دایرکتوری را ببینید.حال وارد دایرکتوری projects می‌شویم:cd projectsدر این دارکتوری قصد داریم یک env جدید ایجاد کنیم با نام دلخواه(من از نام rezaenv استفاده کرده‌ام):python3 -m venv rezaenvحال می‌توانیم وارد دایرکتوری rezaenv شویم و با دستور ls محتویات آن را ببینیم:و اگر وارد دایرکتوری bin شویم:هدف از دو تصور بالا رسیدن به فایل activate است، حال دوباره به دایرکتوری projects باز می‌گردیم:cd ..
cd ..و برای فعال کردن محیط یا env جدید rezaenv از دستور زیر استفاده می‌کنیم:source rezaenv/bin/activateنتیجه به صورت زیر ظاهر می‌شود:حال ما در محیط rezaenv هستیم و می‌توانیم برای مدیریت و راه‌اندازی پروژه جنگو خود اقدام کنیم.و برای خروج از محیط env جدید از دستور زیر استفاده کنید:deactivateپایان.بازگشت به پست اصلی</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Tue, 02 Nov 2021 16:28:36 +0330</pubDate>
            </item>
                    <item>
                <title>نصب Django روی سرور Ubuntu</title>
                <link>https://virgool.io/@reza_khalafi/%D9%86%D8%B5%D8%A8-django-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-ubuntu-m71qnee22ibf</link>
                <description>برای نصب جنگو روی سرور لینوکسی کافی‌است در ترمینال مک یا لینوکس خود دستور زیر را وارد کنید:pip install Djangoیاsudo apt install python3-djangoحال برای مشاهده نسخه نصب شده:django-admin --versionنتیجه چیزی شبیه به خط زیر می‌باشد:3.2.7پایان.بازگشت به پست اصلی</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Tue, 02 Nov 2021 15:58:03 +0330</pubDate>
            </item>
                    <item>
                <title>نصب پایتون روی سرور Ubuntu</title>
                <link>https://virgool.io/@reza_khalafi/%D9%86%D8%B5%D8%A8-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-ubuntu-qtusexpfhq3p</link>
                <description>یک راه ساده برای نصب پایتون روی یک سرور لینوکسی بصورت زیر می‌باشد و کافی‌است شما در یک ترمینال دستور زیر را وارد کنید:sudo apt-get install python-is-python3حال شما نسخه شماره سه پایتون را نصب کرده‌اید.برای تست ورژن دقیق آن دستور زیر را در ترمینال وارد کنید:python --versionنسخه‌ای شبیه به زیر را مشاهده خواهید نمود:Python 3.8.10پایان.بازگشت به پست اصلی</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Tue, 02 Nov 2021 15:53:33 +0330</pubDate>
            </item>
                    <item>
                <title>نصب PIP روی سرور Ubuntu</title>
                <link>https://virgool.io/@reza_khalafi/%D9%86%D8%B5%D8%A8-pip-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-ubuntu-kgqsdhfni6jy</link>
                <description>برای نصب  نرم‌افزار مدیریت پکیج percentage in point یا pip طبق دستور زیر عمل می‌کنیم:sudo apt-get install python-pipیاsudo apt-get install python3-pipو برای مشاهده ورژن نصب شده:pip --versionنتیجه را بصورت زیر مشاهده خواهید کرد:pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)پایان.بازگشت به پست اصلی</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Tue, 02 Nov 2021 15:49:54 +0330</pubDate>
            </item>
                    <item>
                <title>بروزرسانی سرور لینوکس</title>
                <link>https://virgool.io/@reza_khalafi/%D8%A8%D8%B1%D9%88%D8%B2%D8%B1%D8%B3%D8%A7%D9%86%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-ckfyd8vvofxi</link>
                <description>بهتر است قبل از هر گونه بروزرسانی ابتدا OS را بروزرسانی کنیم.برای بروزرسانی سرور لینوکس(ابونتو) دو دستور زیر را در ترمینال مک یا لینوکس خود وارد کنید:sudo apt-get update
sudo apt-get upgradeپایان.بازگشت به پست اصلی</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Tue, 02 Nov 2021 15:41:00 +0330</pubDate>
            </item>
                    <item>
                <title>اتصال به سرور Ubuntu از طریق SSH در ترمینال لینوکس</title>
                <link>https://virgool.io/@reza_khalafi/%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A8%D9%87-%D8%B3%D8%B1%D9%88%D8%B1-ubuntu-%D8%A7%D8%B2-%D8%B7%D8%B1%DB%8C%D9%82-ssh-%D8%AF%D8%B1-%D8%AA%D8%B1%D9%85%DB%8C%D9%86%D8%A7%D9%84-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-vo8om974hbm4</link>
                <description>-ابتدا ترمینال لینوکس یا مک خود را باز کنید.شما نیاز به سه پارامتر دارید: ّIP, Username, Passwordبنابراین به شکل زیر عمل می‌کنید:‍‍‍‍‍‍‍ssh username@ipبه عنوان مثال:reza123@11.34.22.12سپس باید کلمه‌عبور را وارد کنید.شما می‌توانید با روش زیر سریعتر این کار را انجام دهید:expect -c &#039;spawn ssh reza123@11.34.22.12 ; expect password ; send &amp;quotmy_custom_password\n&amp;quot ; interact&#039;پایان.بازگشت به پست اصلی</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Tue, 02 Nov 2021 15:23:27 +0330</pubDate>
            </item>
                    <item>
                <title>Make Permissions and Groups</title>
                <link>https://virgool.io/@reza_khalafi/make-permissions-and-groups-qmrsbnwnfvc8</link>
                <description>Reza KhalafiDjango permissions and group learning.1.Import dependencies:from django.contrib.auth.models import User, Group, Permission
from django.contrib.contenttypes.models import ContentType2.Create group:Group.objects.create(name=&#039;wizard&#039;)3.Get content_type:content_type = ContentType.objects.get(app_label=&#039;myapp&#039;, model=&#039;blogpost&#039;)4.Create permission:permission = Permission.objects.create(codename=&#039;can_publish&#039;, name=&#039;Can Publish Posts&#039;, content_type=content_type)5.Get user:user = User.objects.get(username=&#039;reza7&#039;)6.Get permission:content_type = ContentType.objects.get(app_label=&#039;myapp&#039;, model=&#039;blogpost&#039;)
permission = Permission.objects.get(codename=&#039;add_blogpost&#039;, content_type=content_type)7.Get group:group = Group.objects.get(name=&#039;wizard&#039;)8.Assign permission to group:group.permissions.add(permission)9.Assign user to groups:user.groups.add(group)10.Check user has permission:user.has_perm(&#039;myapp.can_publish&#039;)</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Mon, 20 Sep 2021 12:24:09 +0430</pubDate>
            </item>
                    <item>
                <title>یک صحبت ساده</title>
                <link>https://virgool.io/@reza_khalafi/%DB%8C%DA%A9-%D8%B5%D8%AD%D8%A8%D8%AA-%D8%B3%D8%A7%D8%AF%D9%87-agafbb5vyh99</link>
                <description>سال‌ها پیش با دنیای کد‌نویسی آشنا شدم و خودم رو در کنار انبوهی از ناشناخته‌ها دیدم، کدها من رو به سرزمین شگفت‌انگیز خودشون راه دادن و من دیدم که به چه شکل غیرممکن‌ها ممکن می‌شن. این دنیا پُلی شد برای اتصال این جهان پیچیده به واقعیت. و این واقعیت همون محصولاتی هستن که ما توسعه و تحویل جامعه می‌دیم. و امروز در من در استودیو دیزاین هدفم اینه که بتونم بهترین و محکم‌ترین پل ارتباطی بین کد و محصول رو ایجاد کنم.</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Sun, 22 Aug 2021 14:45:23 +0430</pubDate>
            </item>
                    <item>
                <title>ایجاد پروژه Flask با Postgresql در Mac-OSX</title>
                <link>https://virgool.io/coderlife/%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D9%BE%D8%B1%D9%88%DA%98%D9%87-flask-%D8%A8%D8%A7-postgresql-%D8%AF%D8%B1-mac-osx-ukglgiaessmz</link>
                <description>ایجاد پروژه Flask و ساخت یک table در دیتابیس توسط کد پایتون.- نصب Python3 بر روی مک:brew install python- نصب pip:sudo easy_install pip- نصب Flask:pip install Flask- نصب virtualenv:python3 -m pip install --user virtualenv- ایجاد پوشه پروژه myappcd -&gt; myapp- ایجاد پوشه env در پروژه myapp:python3 -m venv env- ایجاد فایل app.py جهت کدنویسی و قرار دادن کدهای زیر:from flask import Flask
app = Flask(__name__) app.debug = True

@app.route(&#039;/&#039;) 
def hello_world():     
    return &#039;Hello, World!&#039;- ران کردن پروژه:export FLASK_APP=app.py
python3 app.py
flask run- نصب postgressql:brew install postgresql- نصب psycopg2  جهت اتصال myapp به postgresql:pip install psycopg2-binary-کدهای مربوط به اتصال دیتابیس و ایجاد جدول:app.pyfrom flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.debug = True

#postgresql://username:password@localhost:port/mydatabasename
app.config[&#039;SQLALCHEMY_DATABASE_URI&#039;] = &#039;postgresql://postgres:root@localhost:5432/myapp&#039;
app.config[&#039;SQLALCHEMY_TRACK_MODIFICATIONS&#039;] = False
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(8), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self,username,email):
        self.username = username
        self.email = email

    def __repr__(self):
        return &#039;&lt;User %r&gt;&#039; % self.username

@app.route(&#039;/&#039;)
def hello_world():
    return &#039;Hello, World!&#039;- به آدرس postgresql url می‌رویم و دیتابیس myapp را ایجاد می‌کنیم: - جهت ران شدن کد در ترمینال وارد کنید:python3
from app import db
db.create_all()
exit()- حالا دیتابیس را چک کنید باید جدول user را مشاهده کنید:موفق باشید.</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Mon, 31 Aug 2020 14:43:07 +0430</pubDate>
            </item>
                    <item>
                <title>خودشناسی</title>
                <link>https://virgool.io/khodbavari/%D8%AE%D9%88%D8%AF%D8%B4%D9%86%D8%A7%D8%B3%DB%8C-vamjjlyqwzop</link>
                <description>سلام، این اولین مطلب من هست؛ پس خیلی کوتاه و ساده می‌نویسم.تصور می‌کنم مهم‌ترین چیز در زندگی ما انسان‌ها خودشناسی می‌تونه باشه. باید را‌ه‌هایی پیدا کنیم تا فرزندان ما در سنین پایین به خودشناسی برسند. یافتن اهداف، توانایی‌ها و استعدادها، جایگاه ما در طبیعت و اخلاقیات.</description>
                <category>رضا خلفی</category>
                <author>رضا خلفی</author>
                <pubDate>Wed, 06 Feb 2019 13:51:40 +0330</pubDate>
            </item>
            </channel>
</rss>