remove somthings
This commit is contained in:
@@ -1,172 +0,0 @@
|
||||
# کد نویسی برای بات تلگرام
|
||||
ربات **تلگرام** (**telegram** bot) یک نوع حساب کاربری ویژه در **تلگرام** است که به صورت اتوماتیک پیام ها را ارسال و دریافت می نماید . کاربران از طریق ارسال دستورات گوناگون با ربات ها در ارتباط هستند و امکان مدیریت ربات ها از طریق API **تلگرام** و درخواست های HTTPS وجود دارد . عبارت bot برای ربات ها نمایش داده می شود.
|
||||
|
||||
## ساخت بات با BotFather
|
||||
اولین مرحله برای کد نویسی بات تلگرام ساختن بات است. از طریق [BotFather](https://telegram.me/BotFather) بات را خواهیم ساخت. پیام `start/` را در BotFather وارد کنید سپس روی **newbot - create a new bot/** کلیک کنید. بعد از مشاهده پیام **Alright, a new bot. How are we going to call it? Please choose a name for your bot.** یک اسم برای بات خود وارد کنید.
|
||||
سپس بعد از مشاهده پیام **Good. Now let's choose a username for your bot. It must end in bot. Like this, for example: TetrisBot or tetris_bot.** یک نام **خاص و Unique انگلیسی** که حتما در آخرش کلمه **bot** را دارد وارد کنید.
|
||||
|
||||
زمانی که بات شما ساخته شد توکن بات را که زیر **Use this token to access the HTTP API** قرار دارد را کپی کنید و در محل امنی قرار دهید.
|
||||
|
||||
## آماده سازی محیط کد نویسی
|
||||
به طور کلی از دو روش می توان برای بات های تلگرام برنامه نویسی کرد.
|
||||
**روش اول: استفاده از Rest API رسمی تلگرام که نحوه استفاده از در سایت core.telegram.org/bots/api قابل دسترس است**
|
||||
**روش دوم: استفاده از پکیج هایی که کد های پایه بات را برای زبان برنامه نویسی مورد نظر شما ساخته اند**
|
||||
برخی از این پکیج های عبارت اند از:
|
||||
برای سی شارپ ([Telegram.Bot](https://www.nuget.org/packages/Telegram.Bot))
|
||||
این پکیج از طریق کامند زیر در **Dotnet CLI** نصب می شود
|
||||
|
||||
dotnet add package Telegram.Bot --version 19.0.0
|
||||
|
||||
برای پایتون ( [python-telegram-bot](https://pypi.org/project/python-telegram-bot/2.4/))
|
||||
این پکیج نیز از طریق کامند زیر قابل نصب است
|
||||
|
||||
pip install python-telegram-bot==2.4
|
||||
|
||||
برای اینکه این آموزش بر Core و Universal بودن تاکید دارد ما از از طریق روش اول برای بات خود کد نویسی هر چند این روش کمی سخت تر است اما اگر به خوبی این روش را یادبگرید خود می توانید کتابخانه مانند دو نمونه بالا بنوسید
|
||||
|
||||
## کد نویسی برای بات
|
||||
پروژه ای با زبان مورد نظر خود ایجاد کنید و کتابخانه هایی مورد نیاز برای **Rest API** را روی پروژه نصب یا Import کنید.
|
||||
برای مثال اگر از زبان برنامه نویسی سی شارپ استفاده می کنید باید **RestSharp** را نصب کنید و نحوه کار با آن را بلد باشید و اگر از پایتون استفاده می کنید باید کتابخانه **Request** را نصب و Import کنید.
|
||||
|
||||
**قبل از شروع به این نکات درباره API تلگرام توجه کنید.**
|
||||
|
||||
+ تلگرام به حروف بزرگ و کوچک در API حساس است
|
||||
+ تلگرام فقط از **POST** و **GET** پشتیبانی می کند
|
||||
+ همه درخواست ها باید کاملا با **UTF-8** باشند
|
||||
+ تلگرام از هر 4 روش رایج ارسال درخواست **(application/json, multipart/form-data ,QueryString, application/x-www-form-urlencoded)** پشتیبانی می کند
|
||||
**پیشنهاد:** من به شما پیشنهاد می کنم از QueryString یا application/json استفاده کنید.
|
||||
|
||||
### روش QueryString چیست؟
|
||||
در این روش پارامتر های تابع که می خواهیم اجرا کنیم به عنوان QueryString در Url گذاشته می شوند مانند:
|
||||
|
||||
https://test.ir/APIFunction?param1=inp1¶m2=inp2
|
||||
|
||||
همانطور که در مثال بالا آشکار است هر چه بعد از **?** قرا ر می گیرد **Query String** است.
|
||||
پارامتر 1 یا **param1** اسم متغیر اول ماست و **inp1** ورودی متغیر **param1** است.
|
||||
سپس پارامتر های ورودی با علامت **&** جدا شده اند. و پارمتر دوم یا **param2** و ورود آن قرار گرفته است.
|
||||
|
||||
### روش application/json
|
||||
در این روش Url فقط به آدرس تابع اشاره دارد نه به ورود های آن مانند:
|
||||
|
||||
https://test.ir/APIFunction
|
||||
|
||||
در این روش پارامتر ها به عنوان Json در بدنه ارسال می شوند. مانند زیر
|
||||
|
||||
{
|
||||
"Body":{
|
||||
"param1":"inp1",
|
||||
"param2":"inp2",
|
||||
},
|
||||
|
||||
البته ارسال بدنه با توجه به کتابخانه که برای API استفاده می کنید. متفاوت مثلا برای **RestSharp** از Request.AddBody باید استفاده کنید.
|
||||
|
||||
## استاندارد های استفاده از API تلگرام
|
||||
**آدرس پایه API:**
|
||||
|
||||
https://api.telegram.org/bot<token>/<FuncName>
|
||||
|
||||
**توکن:** به جای **<token>** توکنی را که از بات فادر گرفتید قرار دهید
|
||||
**نام تابع:** تابعی که می خواهید فراخوانی کنید را به جای **<Funcname>** قرار دهید
|
||||
|
||||
**موفق بودن یا نا موفق بودن درخواست**
|
||||
اگر درخواست شما **موفقیت آمیز** باشد با **OK:True** مواجه می شوید و جواب درخواست را به عنوان **Result** به شما برگردانده می شود
|
||||
**مثال:**
|
||||
|
||||
{
|
||||
"ok":true,
|
||||
"result":[]
|
||||
}
|
||||
|
||||
اگر درخواست شما **ناموفق** باشد. **OK: False** می شود و شما پارامتر به عنوان **Result** نخواهید داشت همچنین **error_code** و **description** را به ترتیب برای شماره خطا و توصیف خطا دریافت خواهید کرد.
|
||||
**مثال: **
|
||||
|
||||
{
|
||||
"ok":false,
|
||||
"error_code":404,
|
||||
"description":"Not Found"
|
||||
}
|
||||
|
||||
**بروزرسانی بات:**
|
||||
هر بار که پیامی برای بات ارسال می شود را می توان با **getUpdate** بدست آورد. برای بدست آوردن لیست آپدیت می توانید Url زیر را GET کنید
|
||||
|
||||
https://api.telegram.org/bot<token>/getUpdates
|
||||
|
||||
این درخواست لیستی از Update ها بر می گرداند.
|
||||
برای مشاهده شئ Update به https://core.telegram.org/bots/api#update مراجعه کنید
|
||||
|
||||
**دریافت اطلاعات کلی بات:**
|
||||
برای دریافت اطلاعات کلی از آدرس زیر استفاده کنید
|
||||
|
||||
https://api.telegram.org/bot<token>/getMe
|
||||
|
||||
**جواب:**
|
||||
|
||||
{
|
||||
"ok": true,
|
||||
"result": {
|
||||
"id": 6775339167,
|
||||
"is_bot": true,
|
||||
"first_name": "ForDocumentPack",
|
||||
"username": "ForDocumentPackBot",
|
||||
"can_join_groups": true,
|
||||
"can_read_all_group_messages": false,
|
||||
"supports_inline_queries": false
|
||||
}
|
||||
}
|
||||
|
||||
## ساخت پروژه ساده
|
||||
می خواهیم یک پروژه کد نویسی کنیم که زمانی که بات روشن می شود یک پیام خوش آمد گویی ارسال کند.
|
||||
برای این کار از طریق تابع **getUpdates** پیام هایی که بات داده شده است را مشاهده می کنیم مانند زیر:
|
||||
|
||||
{
|
||||
"ok": true,
|
||||
"result": [
|
||||
{
|
||||
"update_id": 529754041,
|
||||
"message": {
|
||||
"message_id": 1,
|
||||
"from": {
|
||||
"id": 407692495,
|
||||
"is_bot": false,
|
||||
"first_name": "Mahdiyar",
|
||||
"last_name": "Abdollahi",
|
||||
"username": "Mdr_abdollahi",
|
||||
"language_code": "en"
|
||||
},
|
||||
"chat": {
|
||||
"id": 407692495,
|
||||
"first_name": "Mahdiyar",
|
||||
"last_name": "Abdollahi",
|
||||
"username": "Mdr_abdollahi",
|
||||
"type": "private"
|
||||
},
|
||||
"date": 1697995311,
|
||||
"text": "/start",
|
||||
"entities": [
|
||||
{
|
||||
"offset": 0,
|
||||
"length": 6,
|
||||
"type": "bot_command"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
**نکته: get_updates را در حلقه بی نهایت بی اندازید تا همیشه بروزرسانی شود**
|
||||
**نکته: بررسی کنید تا به کسانی که به آنها پاسخ داده اید دوباره پاسخ ندهید.**
|
||||
**نکته: اگر به جای getUpdates از** [WebHooks](https://core.telegram.org/bots/api#getting-updates) **استفاده کنید نیاز به بررسی پاسخ های تکراری نیست**
|
||||
|
||||
برای ارسال پیام نیاز به **chat_id** داریم.
|
||||
|
||||
result => message => chat => id
|
||||
|
||||
بعد از دریافت **chat_id** می توانیم با تابع **sendMessage** پیام برای کاربر ارسال کنید.
|
||||
|
||||
https://api.telegram.org/bot<token>/sendMessage
|
||||
|
||||
**نکته: حتما باید پارامتر chat_id و text ارسال شود**
|
||||
**نکته: حتما باید بصورت POST ارسال شود و پارامتر ها به صورت application/json باشد**
|
||||
|
||||
شما می توانید تمامی تابع های API تلگرام را از سایت تلگرام مشاهده کنید -> https://core.telegram.org/bots/api
|
||||
@@ -1,41 +0,0 @@
|
||||
# آموزش اجرای سرور بات تلگرام
|
||||
در این سند قصد داریم که سرور بات تلگرام را به صورت لوکال بالا بیاوریم. توجه داشته باشید که شما می توانید از سرور های پیشفرض تلگرام به آدرس **api.telegram.org** استفاده کنید اما اگر قصد دارید که از قابلیت های ویژه مانند اتصال webhook لوکال استفاده نیاز به این سند دارید.
|
||||
[کاربرد های سرور لوکال تلگرام](https://github.com/tdlib/telegram-bot-api#usage)
|
||||
|
||||
**این آموزش فقط برای سیستم های بر پایه Ubuntu 22.04 تست شده است**
|
||||
|
||||
## مرحله اول: نصب وابستگی ها
|
||||
یک سری نرم افزار ها و پکیج ها را باید قبل از اجرای سرور نصب کرد
|
||||
**اوپن اس اس ال - Open SSL**
|
||||
|
||||
sudo apt-get install libssl-dev
|
||||
|
||||
**کامپایلر سی پلاس پلاس نسخه 14 ما از g++ 14 استفاده خواهیم کرد**
|
||||
|
||||
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
|
||||
sudo apt update
|
||||
sudo apt install g++
|
||||
|
||||
**زی لیب - zlib**
|
||||
|
||||
sudo apt install zlib1g
|
||||
|
||||
**جی پرف - gperf**
|
||||
|
||||
sudo apt install gperf
|
||||
|
||||
**سی میک - cmake**
|
||||
|
||||
sudo apt install cmake
|
||||
|
||||
## مرحله دوم: نصب
|
||||
برای نصب دستورات زیر را در ترمینال وارد کنید
|
||||
|
||||
git clone --recursive https://github.com/tdlib/telegram-bot-api.git
|
||||
cd telegram-bot-api
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DCMAKE_BUILD_TYPE=Release ..
|
||||
cmake --build . --target install
|
||||
|
||||
```
|
||||
@@ -1,53 +0,0 @@
|
||||
|
||||
# استفاده از Web Hooks در گرفتن پیام های بات تلگرام
|
||||
**توجه: پیش نیاز این سند Getting Started.MD است**
|
||||
|
||||
دو روش برای دریافت پیام ارسالی به بات در تلگرام وجود دارد. **Get Updates Function** و **Web Hooks** روش **Get Updates Function** را در سند قبلی استفاده و بررسی کردیم. برای درک Web Hook باید اول Get Updates را خوب متوجه شویم
|
||||
|
||||
## روش اول: Get Updates
|
||||
در این روش که در سندی قبل از آن استفاده کردیم. شما به تلگرام مراجعه می کنید و تلگرام همه پیام هایی تاریخ بات را برای شما می فرستد در این روش چند چالش وجود دارد
|
||||
|
||||
+ **در هر درخواست تمامی پیام ها ارسال می شود این به معنی است که در یک بات با مخاطبان متوسط هر درخواست شامل صد ها هزار پیام است که قبلا به آن پاسخ داده اید و به آن ها دیگر نیازی ندارید**
|
||||
|
||||
+ **باید بررسی کنید که به کدام پیام پاسخ داده شده و به کدام پاسخ نداده شده است**
|
||||
|
||||
+ **باید از حلقه بی نهایت استفاده کنید تا همیشه از تلگرام درخواست کند. پیاده سازی حلقه بی نهاییت در بسیاری از نرم افزار ها مانند وب سایت بسیار چالش بر انگیز یا غیر ممکن است.**
|
||||
|
||||
راه کار بهتر روش Web Hooks است.
|
||||
|
||||
## روش دوم: Web Hooks
|
||||
در این روش به جای اینکه مانند روش **Get Updates** شما به تلگرام مراجعه کنید. تلگرام به شما مراجعه می کند. **پیام های جدید را که قبلا دریافت نکرده اید** به شما می دهد. این روش هر سه مشکل **Get Updates** را بر طرف می کند. البته این روش نیز بی نقص نیست و چالش به همراه دارد. مانند:
|
||||
|
||||
+ **چون تلگرام باید برای شما چیزی ارسال کند نمی توان از این روش در فضای Local استفاده کرد**
|
||||
|
||||
+ **محدودیت توسط تلگرام برای این روش اعمال شده است که ممکن است رفع این محدودیت ها هزینه بر یا وقت گیر باشد**
|
||||
|
||||
|
||||
### محدودیت های Web Hooks
|
||||
|
||||
+ **اگر از وب هوکس استفاده کنید دیگر نمی توانید از getUpdates استفاده کنید**
|
||||
+ **فقط پورت های 443, 80, 88, 8443 برای اینکار قابل استفاده اند**
|
||||
+ **فقط تلگرام به سایت هایی که دارای SSL هستند. پیام ها را ارسال می کند**
|
||||
|
||||
## تنظیم از Web Hooks
|
||||
برای تنظیم وب هوک از طریق تابع **setWebhook** آدرسی که می خواهیم به آن پیام ها ارسال شود را به عنوان **Url** ارسال می کنیم
|
||||
|
||||
https://api.telegram.org/bot<token>/setWebhook
|
||||
|
||||
**نکنه: حتما از متد POST استفاده کنید و Url را با روش application/json بفرستید**
|
||||
|
||||
برای مشاهده پارامتر های اختیاری Web Hooks به لینک زیر مراجعه کنید
|
||||
[https://core.telegram.org/bots/api#setwebhook](Web%20Hooks)
|
||||
|
||||
## پاک کردن Web Hooks
|
||||
اگر به هر دلیلی خواستید وب هوک را پاک کنید یا از get Updates استفاده کنید با استفاده از تابع زیر وب هوکس پاک شده و Get Updates دوباره فعال می شود
|
||||
|
||||
https://api.telegram.org/bot<token>/deleteWebhook
|
||||
|
||||
## مشاهده وضعیت Web Hooks
|
||||
با تابع زیر می توان وضعیت وب هوک، سرعت پاسخ دهی، آخرین خطا ها، آخرین هشدار ها و... را مشاهده کرد
|
||||
|
||||
https://api.telegram.org/bot<token>/getwebhookinfo
|
||||
|
||||
[برای مشاهده اطلاعات دریافتی از این تابع کلیک کنید](https://core.telegram.org/bots/api#webhookinfo)
|
||||
|
||||
0
Web Development & Frameworks/Django/db.sqlite3 → Linux/LPIC1/12-grep.md
Executable file → Normal file
0
Web Development & Frameworks/Django/db.sqlite3 → Linux/LPIC1/12-grep.md
Executable file → Normal file
0
Web Development & Frameworks/Django/info/__init__.py → Linux/LPIC1/13-less.md
Executable file → Normal file
0
Web Development & Frameworks/Django/info/__init__.py → Linux/LPIC1/13-less.md
Executable file → Normal file
0
Web Development & Frameworks/Django/info/migrations/__init__.py → Linux/LPIC1/14-head-tail.md
Executable file → Normal file
0
Web Development & Frameworks/Django/info/migrations/__init__.py → Linux/LPIC1/14-head-tail.md
Executable file → Normal file
0
Linux/LPIC1/15-wc.md
Normal file
0
Linux/LPIC1/15-wc.md
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,3 +0,0 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
@@ -1,6 +0,0 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class InfoConfig(AppConfig):
|
||||
default_auto_field = "django.db.models.BigAutoField"
|
||||
name = "info"
|
||||
@@ -1,3 +0,0 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
@@ -1,24 +0,0 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
class MemoryInfoSerializer(serializers.Serializer):
|
||||
total = serializers.IntegerField()
|
||||
available = serializers.IntegerField()
|
||||
percent = serializers.FloatField()
|
||||
used = serializers.IntegerField()
|
||||
free = serializers.IntegerField()
|
||||
active = serializers.IntegerField()
|
||||
inactive = serializers.IntegerField()
|
||||
buffers = serializers.IntegerField()
|
||||
cached = serializers.IntegerField()
|
||||
shared = serializers.IntegerField()
|
||||
|
||||
|
||||
class CpuInfoSerializer(serializers.Serializer):
|
||||
info = serializers.FloatField()
|
||||
|
||||
class HardInfoSerializer(serializers.Serializer):
|
||||
total = serializers.IntegerField()
|
||||
used = serializers.IntegerField()
|
||||
free = serializers.IntegerField()
|
||||
percent = serializers.FloatField()
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
@@ -1,7 +0,0 @@
|
||||
from django.urls import path
|
||||
from .views import *
|
||||
urlpatterns = [
|
||||
path("memory", MemoryInfoView.as_view(),name="memory"),
|
||||
path("cpu", CpuInfoView.as_view(),name="cpu"),
|
||||
path("hard",HardInfoView.as_view(),name='hard'),
|
||||
]
|
||||
@@ -1,34 +0,0 @@
|
||||
from django.shortcuts import render
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.response import Response
|
||||
from .serializers import *
|
||||
import psutil
|
||||
import os
|
||||
# Create your views here.
|
||||
|
||||
class MemoryInfoView(APIView):
|
||||
def get(self, request, *args, **kwargs):
|
||||
memo_info = psutil.virtual_memory()._asdict()
|
||||
seri = MemoryInfoSerializer(data=memo_info)
|
||||
if seri.is_valid():
|
||||
return Response(seri.data)
|
||||
return Response(seri.errors,status=400)
|
||||
|
||||
|
||||
class CpuInfoView(APIView):
|
||||
def get(self, request, *args, **kwargs):
|
||||
cpu_info = psutil.cpu_percent()
|
||||
info = {"info":cpu_info}
|
||||
seri= CpuInfoSerializer(data=info)
|
||||
if seri.is_valid():
|
||||
return Response(seri.data)
|
||||
return Response(seri.errors,status=400)
|
||||
|
||||
class HardInfoView(APIView):
|
||||
def get(self,request,*args,**kwargs):
|
||||
hard_info = psutil.disk_usage(os.getcwd())._asdict()
|
||||
seri = HardInfoSerializer(data=hard_info)
|
||||
if seri.is_valid():
|
||||
return Response(seri.data)
|
||||
return Response(seri.errors,status=400)
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
"""Django's command-line utility for administrative tasks."""
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
||||
def main():
|
||||
"""Run administrative tasks."""
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sysinfo.settings")
|
||||
try:
|
||||
from django.core.management import execute_from_command_line
|
||||
except ImportError as exc:
|
||||
raise ImportError(
|
||||
"Couldn't import Django. Are you sure it's installed and "
|
||||
"available on your PYTHONPATH environment variable? Did you "
|
||||
"forget to activate a virtual environment?"
|
||||
) from exc
|
||||
execute_from_command_line(sys.argv)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,40 +0,0 @@
|
||||
جمعآوری اطلاعات سیستم با استفاده از Django و Django Rest Framework
|
||||
مقدمه
|
||||
در این پروژه، از Django و Django Rest Framework استفاده شدهاست تا اطلاعاتی از سیستم مانند CPU، حافظه و ... جمعآوری شود.
|
||||
|
||||
راهاندازی
|
||||
نصب مورد نیازها
|
||||
برای نصب وابستگیهای مورد نیاز:
|
||||
|
||||
bash
|
||||
Copy code
|
||||
pip install -r requirements.txt
|
||||
راهاندازی دیتابیس
|
||||
برای مهاجرت دیتابیس، دستورات زیر را اجرا کنید:
|
||||
|
||||
bash
|
||||
Copy code
|
||||
python manage.py makemigrations
|
||||
python manage.py migrate
|
||||
اجرای سرور
|
||||
برای اجرای سرور توسط Django:
|
||||
|
||||
bash
|
||||
Copy code
|
||||
python manage.py runserver
|
||||
API ها
|
||||
دریافت اطلاعات CPU
|
||||
|
||||
URL: /api/cpu_info/
|
||||
روش: GET
|
||||
خروجی: اطلاعات مربوط به CPU
|
||||
دریافت اطلاعات حافظه
|
||||
|
||||
URL: /api/memory_info/
|
||||
روش: GET
|
||||
خروجی: اطلاعات مربوط به حافظه
|
||||
... (و همین طور برای سایر API ها)
|
||||
|
||||
جمعبندی
|
||||
این پروژه به شما امکان میدهد تا با استفاده از یک وب API ساده، اطلاعات مختلف سیستم را مشاهده کنید.
|
||||
|
||||
@@ -1,153 +0,0 @@
|
||||
|
||||
# Deploying a Laravel Application on Nginx
|
||||
|
||||
This guide covers the steps to deploy a Laravel application on an Nginx web server. You’ll configure Nginx, install PHP and required extensions, set up Composer, and secure your Laravel application.
|
||||
|
||||
---
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- **A Linux server** with root or sudo privileges.
|
||||
- **Nginx installed** or installation instructions are provided below.
|
||||
- **PHP and required extensions** for running Laravel applications.
|
||||
- **Composer installed** for managing Laravel dependencies.
|
||||
|
||||
---
|
||||
|
||||
## Step 1: Install Nginx
|
||||
|
||||
1. **Update the package list**:
|
||||
```bash
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
2. **Install Nginx**:
|
||||
```bash
|
||||
sudo apt install nginx
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Step 2: Configure Nginx for Laravel
|
||||
|
||||
1. **Open the default Nginx configuration file**:
|
||||
```bash
|
||||
sudo nano /etc/nginx/sites-available/default
|
||||
```
|
||||
|
||||
2. **Replace the existing content** with the following configuration. Make sure to replace `your_domain.com` with your domain or server’s IP address.
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name your_domain.com;
|
||||
root /var/www/html/your_laravel_project/public;
|
||||
|
||||
index index.php index.html index.htm;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php?$query_string;
|
||||
}
|
||||
|
||||
location ~ \.php$ {
|
||||
include snippets/fastcgi-php.conf;
|
||||
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # Adjust PHP version if necessary
|
||||
}
|
||||
|
||||
location ~ /\.ht {
|
||||
deny all;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
3. **Save and close the file**.
|
||||
|
||||
4. **Test the Nginx configuration** for syntax errors:
|
||||
```bash
|
||||
sudo nginx -t
|
||||
```
|
||||
|
||||
5. **Restart Nginx** to apply the new configuration:
|
||||
```bash
|
||||
sudo systemctl restart nginx
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Step 3: Install PHP and Required Extensions
|
||||
|
||||
1. **Add the PHP PPA repository**:
|
||||
```bash
|
||||
sudo add-apt-repository ppa:ondrej/php
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
2. **Install PHP and required extensions** for Laravel:
|
||||
```bash
|
||||
sudo apt install php7.4-fpm php7.4-mbstring php7.4-xml php7.4-zip php7.4-mysql php7.4-curl php7.4-gd
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Step 4: Install Composer
|
||||
|
||||
1. **Download and install Composer globally**:
|
||||
```bash
|
||||
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Step 5: Deploy the Laravel Application
|
||||
|
||||
1. **Clone or upload your Laravel project** to the Nginx web root:
|
||||
```bash
|
||||
sudo mkdir -p /var/www/html/your_laravel_project
|
||||
# Clone or upload your project files here
|
||||
```
|
||||
|
||||
2. **Set appropriate permissions** for the Laravel `storage` and `bootstrap/cache` directories:
|
||||
```bash
|
||||
cd /var/www/html/your_laravel_project
|
||||
sudo chown -R www-data:www-data storage bootstrap/cache
|
||||
sudo chmod -R 775 storage bootstrap/cache
|
||||
```
|
||||
|
||||
3. **Install Laravel dependencies** with Composer:
|
||||
```bash
|
||||
cd /var/www/html/your_laravel_project
|
||||
composer install --no-dev --optimize-autoloader
|
||||
```
|
||||
|
||||
4. **Generate an application key** for Laravel:
|
||||
```bash
|
||||
php artisan key:generate
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Step 6: Restart PHP-FPM
|
||||
|
||||
Restart PHP-FPM to apply any changes:
|
||||
```bash
|
||||
sudo systemctl restart php7.4-fpm # Adjust PHP version as needed
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Summary and Final Checks
|
||||
|
||||
Your Laravel application should now be deployed and accessible through Nginx. Visit `http://your_domain.com` in a browser to confirm that the application is working.
|
||||
|
||||
---
|
||||
|
||||
## Additional Notes
|
||||
|
||||
- **Security**: Ensure the `APP_ENV` in your `.env` file is set to `production` for live applications.
|
||||
- **Permissions**: For added security, periodically review file and folder permissions, particularly within the `storage` and `bootstrap/cache` directories.
|
||||
- **SSL/TLS**: For a production environment, set up SSL using [Certbot](https://certbot.eff.org/) for secure HTTPS access.
|
||||
|
||||
This guide provides the foundational steps to deploy a Laravel application on Nginx. Customize configurations further as per your project requirements.
|
||||
|
||||
## Author
|
||||
[alinuxist](https://github.com/alinuxist)
|
||||
@@ -1,206 +0,0 @@
|
||||
### Installing Packages from Ubuntu Repositories
|
||||
|
||||
1. Update your Ubuntu system:
|
||||
```bash
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
2. Install necessary packages:
|
||||
```bash
|
||||
sudo apt install python3-venv python3-dev libpq-dev postgresql postgresql-contrib nginx curl
|
||||
```
|
||||
|
||||
### Creating the PostgreSQL Database and User
|
||||
|
||||
3. Log into an interactive Postgres session:
|
||||
```bash
|
||||
sudo -u postgres psql
|
||||
```
|
||||
|
||||
4. Inside the PostgreSQL prompt, create a database for your project:
|
||||
```sql
|
||||
CREATE DATABASE myproject;
|
||||
```
|
||||
|
||||
5. Create a database user for your project with a secure password:
|
||||
```sql
|
||||
CREATE USER myprojectuser WITH PASSWORD 'password';
|
||||
```
|
||||
|
||||
6. Modify connection parameters for the user:
|
||||
```sql
|
||||
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';
|
||||
```
|
||||
|
||||
7. Grant the new user access to administer the new database:
|
||||
```sql
|
||||
GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
|
||||
```
|
||||
|
||||
8. Exit the PostgreSQL prompt:
|
||||
```sql
|
||||
\q
|
||||
```
|
||||
|
||||
### Creating a Python Virtual Environment for Your Project
|
||||
|
||||
9. Create a directory for your project files:
|
||||
```bash
|
||||
mkdir ~/myprojectdir
|
||||
cd ~/myprojectdir
|
||||
```
|
||||
|
||||
10. Create a Python virtual environment:
|
||||
```bash
|
||||
python3 -m venv myprojectenv
|
||||
```
|
||||
|
||||
11. Activate the virtual environment:
|
||||
```bash
|
||||
source myprojectenv/bin/activate
|
||||
```
|
||||
|
||||
12. Install Django, Gunicorn, and psycopg2:
|
||||
```bash
|
||||
pip install django gunicorn psycopg2-binary
|
||||
```
|
||||
|
||||
### Creating and Configuring a New Django Project
|
||||
|
||||
13. Create a new Django project with a defined directory:
|
||||
```bash
|
||||
django-admin startproject myproject ~/myprojectdir
|
||||
```
|
||||
|
||||
14. Adjust settings in the `settings.py` file:
|
||||
- Set `ALLOWED_HOSTS` to `['*']`
|
||||
- Configure `DATABASES` with PostgreSQL details
|
||||
|
||||
15. Add static root configuration to `settings.py`:
|
||||
```python
|
||||
import os
|
||||
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
|
||||
```
|
||||
|
||||
16. Migrate initial database schema:
|
||||
```bash
|
||||
~/myprojectdir/manage.py makemigrations
|
||||
~/myprojectdir/manage.py migrate
|
||||
```
|
||||
|
||||
17. Create an administrative user:
|
||||
```bash
|
||||
~/myprojectdir/manage.py createsuperuser
|
||||
```
|
||||
|
||||
18. Collect static content:
|
||||
```bash
|
||||
~/myprojectdir/manage.py collectstatic
|
||||
```
|
||||
|
||||
19. Allow port 8000:
|
||||
```bash
|
||||
sudo ufw allow 8000
|
||||
```
|
||||
|
||||
20. Start Django development server:
|
||||
```bash
|
||||
~/myprojectdir/manage.py runserver 0.0.0.0:8000
|
||||
```
|
||||
|
||||
21. Access your application in a web browser.
|
||||
|
||||
22. Stop Apache2 service:
|
||||
```bash
|
||||
sudo /etc/init.d/apache2 restart
|
||||
```
|
||||
|
||||
### Testing Gunicorn
|
||||
|
||||
23. Test Gunicorn to ensure it can serve the application:
|
||||
```bash
|
||||
cd ~/myprojectdir
|
||||
gunicorn --bind 0.0.0.0:8000 myproject.wsgi
|
||||
```
|
||||
|
||||
24. Stop Gunicorn:
|
||||
- Press `CTRL-C`
|
||||
|
||||
### Creating systemd Socket and Service Files for Gunicorn
|
||||
|
||||
25. Create a systemd socket file for Gunicorn:
|
||||
```bash
|
||||
sudo nano /etc/systemd/system/gunicorn.socket
|
||||
```
|
||||
|
||||
26. Create and open a systemd service file for Gunicorn:
|
||||
```bash
|
||||
sudo nano /etc/systemd/system/gunicorn.service
|
||||
```
|
||||
|
||||
27. Configure the service file with appropriate details.
|
||||
|
||||
### Checking for the Gunicorn Socket File
|
||||
|
||||
28. Check the status of the Gunicorn socket:
|
||||
```bash
|
||||
sudo systemctl status gunicorn.socket
|
||||
```
|
||||
|
||||
29. Check for the existence of the Gunicorn socket file:
|
||||
```bash
|
||||
file /run/gunicorn.sock
|
||||
```
|
||||
|
||||
30. Check Gunicorn socket logs:
|
||||
```bash
|
||||
sudo journalctl -u gunicorn.socket
|
||||
```
|
||||
|
||||
### Testing Socket Activation
|
||||
|
||||
31. Test the socket activation mechanism:
|
||||
```bash
|
||||
sudo systemctl status gunicorn
|
||||
```
|
||||
|
||||
32. Send a connection to the socket through curl:
|
||||
```bash
|
||||
curl --unix-socket /run/gunicorn.sock localhost
|
||||
```
|
||||
|
||||
### Configuring Nginx to Proxy Pass to Gunicorn
|
||||
|
||||
33. Create and open a new server block in Nginx's sites-available directory:
|
||||
```bash
|
||||
sudo nano /etc/nginx/sites-available/myproject
|
||||
```
|
||||
|
||||
34. Configure the server block with appropriate settings.
|
||||
|
||||
35. Enable the server block:
|
||||
```bash
|
||||
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
|
||||
```
|
||||
|
||||
36. Test Nginx configuration for syntax errors:
|
||||
```bash
|
||||
sudo nginx -t
|
||||
```
|
||||
|
||||
37. Restart Nginx:
|
||||
```bash
|
||||
sudo systemctl restart nginx
|
||||
```
|
||||
|
||||
38. Open firewall to normal traffic on port 80:
|
||||
```bash
|
||||
sudo ufw delete allow 8000
|
||||
sudo ufw allow 'Nginx Full'
|
||||
```
|
||||
|
||||
### Conclusion
|
||||
|
||||
You should now be able to access your Django application via your server's domain or IP address.
|
||||
@@ -1,114 +0,0 @@
|
||||
# Deploying .NET on Linux
|
||||
|
||||
This tutorial has been tested only on .NET 7 and Ubuntu 22.04.
|
||||
|
||||
## Getting the Output
|
||||
|
||||
First, let's install .NET:
|
||||
```bash
|
||||
sudo apt install dotnet-sdk-7.0
|
||||
```
|
||||
*Note: You can create a .NET project using `dotnet new mvc` command.*
|
||||
|
||||
Then, we need to publish our project:
|
||||
```bash
|
||||
dotnet publish
|
||||
```
|
||||
The location of the output file will be displayed after the command finishes. Typically, the project output will be placed in:
|
||||
**bin/Debug/net7.0/publish**
|
||||
|
||||
## Installing Nginx
|
||||
|
||||
**Nginx** is a high-performance web server with low resource usage, distributed under the terms of the BSD license. It runs on Unix-like operating systems and is widely used, currently powering 12.07% of the internet's domains.
|
||||
|
||||
To install **Nginx** via `apt`, use the following command:
|
||||
```bash
|
||||
sudo apt install nginx
|
||||
```
|
||||
|
||||
Then, disable the firewall with:
|
||||
```bash
|
||||
sudo ufw disable
|
||||
```
|
||||
If you encounter an error with this command, it means you don't have a firewall. In that case, skip this part.
|
||||
|
||||
If the installation is successful, you should see "Welcome to Nginx" when typing `localhost` in your browser.
|
||||
|
||||
## Configuring Nginx
|
||||
|
||||
Create a directory for your site:
|
||||
```bash
|
||||
sudo mkdir /var/www/app1
|
||||
```
|
||||
|
||||
Copy the contents of the `publish` directory to the newly created directory:
|
||||
```bash
|
||||
sudo cp yourprojectFolder/bin/Debug/net7.0/publish /var/www/app1
|
||||
```
|
||||
|
||||
Then, navigate to the Nginx configuration:
|
||||
```bash
|
||||
sudo vim /etc/nginx/sites-available/default
|
||||
```
|
||||
|
||||
Replace the contents of the file with the following:
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name example.com *.example.com;
|
||||
location / {
|
||||
proxy_pass http://localhost:5000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection keep-alive;
|
||||
proxy_set_header Host $host;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
}
|
||||
```
|
||||
*Note: Replace `example.com` with your site address.*
|
||||
|
||||
Check the configuration file syntax:
|
||||
```bash
|
||||
sudo nginx -t
|
||||
```
|
||||
|
||||
If no errors are reported, reload Nginx to apply the changes:
|
||||
```bash
|
||||
sudo nginx -s reload
|
||||
```
|
||||
|
||||
## Adding the Site as a Service
|
||||
|
||||
Create a service file for your site:
|
||||
```bash
|
||||
sudo vim /etc/systemd/system/app1.service
|
||||
```
|
||||
|
||||
Copy the following code into the file:
|
||||
```plaintext
|
||||
[Unit]
|
||||
Description=dotnet webapp
|
||||
[Service]
|
||||
WorkingDirectory=/var/www/app1
|
||||
ExecStart=/usr/bin/dotnet /var/www/app/projectname.dll
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
SyslogIdentifier=projectname
|
||||
Environment=ASPNETCORE_ENVIRONMENT=Production
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
*Note: Replace `projectname` with your project's name.*
|
||||
|
||||
Enable and start the site, and check its status:
|
||||
```bash
|
||||
sudo systemctl enable app1.service
|
||||
sudo systemctl start app1.service
|
||||
sudo systemctl status app1.service
|
||||
```
|
||||
## Author
|
||||
[Mahdiyar Abdollahi](https://github.com/IAmMahdiyar)
|
||||
Reference in New Issue
Block a user