ΠΠ΅ΠΌΠΎ-ΡΠ΅ΠΆΠΈΠΌ! ΠΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ°. ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π½Π΅ ΡΠΎΡ
ΡΠ°Π½ΡΡΡΡΡ.
π Π Π°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ
ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
Slug:
deployment.html
ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΎ:
30.05.2026 15:03
30.05.2026 15:03
Π Π°Π·ΠΌΠ΅Ρ:
22.66 KB
22.66 KB
ΠΡΡΡ:
/resources/docs/developer/deployment.html
Π‘ΡΡΠ»ΠΊΠΈ
ΠΡΠ±Π»ΠΈΡΠ½Π°Ρ ΡΡΡΠ»ΠΊΠ°:
Π‘ΡΡΠ»ΠΊΠ° Π² Π°Π΄ΠΌΠΈΠ½ΠΊΠ΅:
π Π Π°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ
βΉοΈ ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΡΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ. ΠΠ»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ "Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ°".
Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ
ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ
| ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ | ΠΠΈΠ½ΠΈΠΌΡΠΌ | Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ | ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΡ |
|---|---|---|---|
| CPU | 2 ΡΠ΄ΡΠ° | 4+ ΡΠ΄Π΅Ρ | ΠΠ»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ ΠΈ API |
| RAM | 2GB | 8GB+ | MySQL + Redis + PHP-FPM |
| ΠΠΈΡΠΊ | 20GB | 100GB SSD | ΠΠ»Ρ Π»ΠΎΠ³ΠΎΠ² ΠΈ Π±ΡΠΊΠ°ΠΏΠΎΠ² |
| OS | Ubuntu 20.04 | Ubuntu 22.04 LTS | ΠΠΎΠ»Π³ΠΎΡΡΠΎΡΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° |
| ΠΡΠΎΠΏΡΡΠΊΠ½Π°Ρ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ | 100 Mbps | 1 Gbps | ΠΠ»Ρ API ΠΈ Π·Π°Π³ΡΡΠ·ΠΎΠΊ |
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ
- PHP: 8.1+ Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ:
- bcmath, ctype, fileinfo, json, mbstring, openssl, pdo, tokenizer, xml, zip
- gd ΠΈΠ»ΠΈ imagick Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
- redis Π΄Π»Ρ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
- MySQL: 8.0+ ΠΈΠ»ΠΈ MariaDB 10.4+
- Redis: 6.0+
- Nginx: 1.18+ ΠΈΠ»ΠΈ Apache 2.4+
- Node.js: 16+ (Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π°ΡΡΠ΅ΡΠΎΠ²)
- Supervisor: ΠΠ»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ
- Certbot: ΠΠ»Ρ SSL ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ²
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°
1. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°
# ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ
sudo apt update && sudo apt upgrade -y
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π±Π°Π·ΠΎΠ²ΡΡ
ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²
sudo apt install -y curl wget git unzip build-essential software-properties-common
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΠ°ΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ°
sudo timedatectl set-timezone Europe/Moscow
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π»ΠΎΠΊΠ°Π»ΠΈ
sudo locale-gen ru_RU.UTF-8
sudo update-locale LANG=ru_RU.UTF-8
2. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° PHP 8.1+
# ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° PHP ΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ
sudo apt install -y php8.1 php8.1-fpm php8.1-mysql php8.1-redis \
php8.1-curl php8.1-gd php8.1-mbstring php8.1-xml php8.1-zip \
php8.1-bcmath php8.1-common php8.1-intl php8.1-soap
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π²Π΅ΡΡΠΈΠΈ
php --version
3. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° MySQL 8.0
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° MySQL
sudo apt install -y mysql-server mysql-client
# ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°
sudo mysql_secure_installation
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
sudo mysql -u root -p
CREATE DATABASE dexa CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'dexa_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON dexa.* TO 'dexa_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
4. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Redis
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Redis
sudo apt install -y redis-server
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Redis
sudo nano /etc/redis/redis.conf
# ΠΠ·ΠΌΠ΅Π½ΠΈΡΡ:
# maxmemory 256mb
# maxmemory-policy allkeys-lru
# requirepass Π²Π°Ρ_ΠΏΠ°ΡΠΎΠ»Ρ_redis
# ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊ
sudo systemctl restart redis
sudo systemctl enable redis
5. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Nginx
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Nginx
sudo apt install -y nginx
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° firewall
sudo ufw allow 'Nginx Full'
sudo ufw allow 'OpenSSH'
sudo ufw --force enable
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠ°
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ PHP-FPM
# Π Π΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ PHP-FPM
sudo nano /etc/php/8.1/fpm/php.ini
# ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ:
memory_limit = 256M
upload_max_filesize = 10M
post_max_size = 12M
max_execution_time = 300
max_input_time = 300
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ Π΄Π»Ρ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π°
expose_php = Off
display_errors = Off
log_errors = On
error_log = /var/log/php/error.log
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ΅ΡΡΠΈΠΉ
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=Π²Π°Ρ_ΠΏΠ°ΡΠΎΠ»Ρ_redis"
# ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊ PHP-FPM
sudo systemctl restart php8.1-fpm
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Nginx
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΡΠ°ΠΉΡΠ°
sudo nano /etc/nginx/sites-available/dexa
# ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
server {
listen 80;
server_name Π²Π°Ρ-Π΄ΠΎΠΌΠ΅Π½.com www.Π²Π°Ρ-Π΄ΠΎΠΌΠ΅Π½.com;
root /var/www/dexa/public;
index index.php index.html index.htm;
# ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
# ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ
client_max_body_size 10M;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
location ~ /\.(?!well-known).* {
deny all;
}
# Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
log_not_found off;
}
# ΠΠ°ΠΏΡΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊζζ ΡΠ°ΠΉΠ»Π°ΠΌ
location ~ /\.env$ {
deny all;
return 403;
}
location ~ /storage/.*\.php$ {
deny all;
return 403;
}
}
# ΠΠΊΡΠΈΠ²Π°ΡΠΈΡ ΡΠ°ΠΉΡΠ°
sudo ln -s /etc/nginx/sites-available/dexa /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° SSL (ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ)
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Certbot
sudo apt install -y certbot python3-certbot-nginx
# ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°
sudo certbot --nginx -d Π²Π°Ρ-Π΄ΠΎΠΌΠ΅Π½.com -d www.Π²Π°Ρ-Π΄ΠΎΠΌΠ΅Π½.com
# ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅
sudo certbot renew --dry-run
ΠΠ΅ΠΏΠ»ΠΎΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
1. ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
sudo adduser --disabled-password --gecos "" dexa
sudo usermod -aG www-data dexa
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ
sudo mkdir -p /var/www/dexa
sudo chown -R dexa:www-data /var/www/dexa
sudo chmod -R 775 /var/www/dexa/storage
sudo chmod -R 775 /var/www/dexa/bootstrap/cache
2. ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°
# ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
sudo su - dexa
# ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
git clone [repository-url] /var/www/dexa
cd /var/www/dexa
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
composer install --optimize-autoloader --no-dev
npm install
npm run production
# ΠΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
cp .env.example .env
nano .env # ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²
3. ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ .env Π΄Π»Ρ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π°
APP_NAME="DEXA Exchange"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://Π²Π°Ρ-Π΄ΠΎΠΌΠ΅Π½.com
APP_TIMEZONE=Europe/Moscow
# ΠΠ°Π·Π° Π΄Π°Π½Π½ΡΡ
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dexa
DB_USERNAME=dexa_user
DB_PASSWORD=strong_password
# Redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=Π²Π°Ρ_ΠΏΠ°ΡΠΎΠ»Ρ_redis
REDIS_PORT=6379
# Π‘Π΅ΡΡΠΈΠΈ ΠΈ ΠΊΡΡ
SESSION_DRIVER=redis
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
# ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ
SESSION_SECURE_COOKIE=true
SESSION_HTTP_ONLY=true
SESSION_SAME_SITE=lax
# ΠΠΎΡΡΠ° (Π½Π°ΡΡΡΠΎΠΉΡΠ΅ ΠΏΠΎΠ΄ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ°)
MAIL_MAILER=smtp
MAIL_HOST=smtp.mail.ru
MAIL_PORT=465
MAIL_USERNAME=Π²Π°Ρ_email@mail.ru
MAIL_PASSWORD=ΠΏΠ°ΡΠΎΠ»Ρ_ΠΏΠΎΡΡΡ
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=Π²Π°Ρ_email@mail.ru
MAIL_FROM_NAME="DEXA Exchange"
# Telegram Π±ΠΎΡ (Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ)
TELEGRAM_BOT_TOKEN=
TELEGRAM_CHAT_ID=
4. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
# ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΊΠ»ΡΡΠ°
php artisan key:generate
# ΠΠΈΠ³ΡΠ°ΡΠΈΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
php artisan migrate --force
# ΠΠ°ΠΏΡΡΠΊ ΡΠΈΠ΄ΠΎΠ² (Π½Π°ΡΠ°Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅)
php artisan db:seed --force
# ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ
php artisan config:cache
php artisan route:cache
php artisan view:cache
# Π‘ΠΈΠΌΠ»ΠΈΠ½ΠΊ storage
php artisan storage:link
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΡΠ°Π²
sudo chown -R www-data:www-data /var/www/dexa/storage
sudo chown -R www-data:www-data /var/www/dexa/bootstrap/cache
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Supervisor
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΄Π»Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Supervisor
sudo apt install -y supervisor
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
sudo nano /etc/supervisor/conf.d/dexa-worker.conf
# ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
[program:dexa-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/dexa/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=dexa
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/dexa/storage/logs/worker.log
stopwaitsecs=3600
# ΠΠ»Ρ Horizon (Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ)
[program:dexa-horizon]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/dexa/artisan horizon
autostart=true
autorestart=true
user=dexa
redirect_stderr=true
stdout_logfile=/var/www/dexa/storage/logs/horizon.log
# ΠΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠ° Supervisor
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start all
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Cron Π·Π°Π΄Π°Ρ
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ
# Π Π΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ crontab
sudo crontab -u www-data -e
# ΠΠΎΠ±Π°Π²ΠΈΡΡ Π·Π°Π΄Π°ΡΠΈ:
# ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΡΡΡΠΎΠ² ΠΊΠ°ΠΆΠ΄ΡΠ΅ 10 ΠΌΠΈΠ½ΡΡ
*/10 * * * * cd /var/www/dexa && php artisan schedule:run >> /dev/null 2>&1
# ΠΡΠΈΡΡΠΊΠ° ΡΡΠ°ΡΡΡ
ΡΠ΅ΡΡΠΈΠΉ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎ
0 0 * * * cd /var/www/dexa && php artisan session:gc >> /dev/null 2>&1
# Π Π΅Π·Π΅ΡΠ²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΠ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎ Π² 2:00
0 2 * * * /usr/bin/mysqldump -u dexa_user -pstrong_password dexa | gzip > /backups/dexa_$(date +\%Y\%m\%d).sql.gz
# ΠΡΠΈΡΡΠΊΠ° ΡΡΠ°ΡΡΡ
Π±ΡΠΊΠ°ΠΏΠΎΠ² (Ρ
ΡΠ°Π½ΠΈΠΌ 30 Π΄Π½Π΅ΠΉ)
0 3 * * * find /backups -name "*.sql.gz" -mtime +30 -delete
# ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π»ΠΎΠ³ΠΎΠ² (Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΡΠΉ ΠΎΡΡΠ΅Ρ)
0 8 * * * cd /var/www/dexa && php artisan log:report >> /var/log/dexa-report.log
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π·Π΄ΠΎΡΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Ρ
0 * * * * cd /var/www/dexa && php artisan system:health-check >> /dev/null 2>&1
Schedule ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² Laravel
// app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
// ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΡΡΡΠΎΠ²
$schedule->command('rates:update')
->everyTenMinutes()
->withoutOverlapping()
->onOneServer();
// ΠΡΠΈΡΡΠΊΠ° ΡΡΠ°ΡΡΡ
Π·Π°ΡΠ²ΠΎΠΊ
$schedule->command('orders:cleanup')
->daily()
->at('03:00');
// ΠΡΠΏΡΠ°Π²ΠΊΠ° ΠΎΡΡΠ΅ΡΠΎΠ²
$schedule->command('reports:daily')
->daily()
->at('08:00');
// ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π·Π΄ΠΎΡΠΎΠ²ΡΡ API
$schedule->command('api:health-check')
->hourly();
}
ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΈ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π»ΠΎΠ³ΠΎΠ²
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΉ Π΄Π»Ρ Π»ΠΎΠ³ΠΎΠ²
sudo mkdir -p /var/log/dexa
sudo chown -R www-data:www-data /var/log/dexa
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΠΎΡΠ°ΡΠΈΠΈ Π»ΠΎΠ³ΠΎΠ²
sudo nano /etc/logrotate.d/dexa
# ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
/var/www/dexa/storage/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 www-data www-data
sharedscripts
postrotate
kill -USR1 `cat /var/run/php/php8.1-fpm.pid 2>/dev/null` 2>/dev/null || true
endscript
}
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π°
- Laravel Telescope: ΠΠ»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ (Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅)
- Laravel Horizon: ΠΠ»Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ
- Prometheus + Grafana: ΠΠ»Ρ ΠΌΠ΅ΡΡΠΈΠΊ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ
- Sentry: ΠΠ»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ
- New Relic: ΠΠ»Ρ APM (Application Performance Monitoring)
Π Π΅Π·Π΅ΡΠ²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠΎΠ»Π½ΡΠΉ ΡΠΊΡΠΈΠΏΡ Π±ΡΠΊΠ°ΠΏΠ°
#!/bin/bash
# /usr/local/bin/dexa-backup.sh
BACKUP_DIR="/backups"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="dexa"
DB_USER="dexa_user"
DB_PASS="strong_password"
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ
mkdir -p $BACKUP_DIR
# ΠΡΠΊΠ°ΠΏ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz
# ΠΡΠΊΠ°ΠΏ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (Π±Π΅Π· vendor ΠΈ node_modules)
tar -czf $BACKUP_DIR/dexa_files_${DATE}.tar.gz \
--exclude="vendor" \
--exclude="node_modules" \
--exclude=".git" \
/var/www/dexa
# ΠΡΠΊΠ°ΠΏ Π»ΠΎΠ³ΠΎΠ²
tar -czf $BACKUP_DIR/dexa_logs_${DATE}.tar.gz /var/log/dexa
# ΠΡΠΊΠ°ΠΏ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΉ
tar -czf $BACKUP_DIR/dexa_configs_${DATE}.tar.gz \
/etc/nginx/sites-available/dexa \
/etc/supervisor/conf.d/dexa-worker.conf
# ΠΡΠΈΡΡΠΊΠ° ΡΡΠ°ΡΡΡ
Π±ΡΠΊΠ°ΠΏΠΎΠ² (Ρ
ΡΠ°Π½ΠΈΠΌ 30 Π΄Π½Π΅ΠΉ)
find $BACKUP_DIR -name "*.gz" -mtime +30 -delete
# ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ
echo "Backup completed: $DATE" >> /var/log/dexa-backup.log
ΠΡΠΎΡΠ΅Π΄ΡΡΠ° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ
ΠΠ΅ΡΠ΅Π΄ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ
- Π£Π²Π΅Π΄ΠΎΠΌΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΎ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ°Π±ΠΎΡΠ°Ρ
- Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΠ»Π½ΡΠΉ Π±ΡΠΊΠ°ΠΏ ΡΠΈΡΡΠ΅ΠΌΡ
- ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π² ΡΠ΅ΡΡΠΎΠ²ΠΎΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ
- ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΡ ΠΏΠ»Π°Π½ ΠΎΡΠΊΠ°ΡΠ°
ΠΡΠΎΡΠ΅ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ
# ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄ Π² ΡΠ΅ΠΆΠΈΠΌ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ
php artisan down --message="ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΠ΅ΡΠ½Π΅ΠΌΡΡ ΡΠ΅ΡΠ΅Π· 30 ΠΌΠΈΠ½ΡΡ."
# ΠΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ
sudo supervisorctl stop all
# ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°
git pull origin main
# ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
composer install --optimize-autoloader --no-dev
npm install
npm run production
# ΠΠΈΠ³ΡΠ°ΡΠΈΠΈ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
php artisan migrate --force
# ΠΡΠΈΡΡΠΊΠ° ΠΊΡΡΠ΅ΠΉ
php artisan config:clear
php artisan route:clear
php artisan view:clear
php artisan cache:clear
# ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊ Supervisor
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start all
# ΠΠ°ΠΏΡΡΠΊ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ
php artisan config:cache
php artisan route:cache
php artisan view:cache
# ΠΡΡ
ΠΎΠ΄ ΠΈΠ· ΡΠ΅ΠΆΠΈΠΌΠ° ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ
php artisan up
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ
php artisan system:health-check
ΠΡΠΊΠ°Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ
# ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΆΠΈΠΌΠ° ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ
php artisan down
# ΠΡΠΊΠ°Ρ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΉ (Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ)
php artisan migrate:rollback --step=1
# ΠΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· Π±ΡΠΊΠ°ΠΏΠ°
gunzip < /backups/dexa_20240115.sql.gz | mysql -u dexa_user -p dexa
# ΠΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²
tar -xzf /backups/dexa_files_20240115.tar.gz -C /
# ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²
sudo systemctl restart php8.1-fpm nginx
sudo supervisorctl restart all
# ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΆΠΈΠΌΠ° ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ
php artisan up
ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° PHP-FPM
# /etc/php/8.1/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
# OPCache Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° MySQL
# /etc/mysql/my.cnf
[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
query_cache_type = 1
query_cache_size = 128M
max_connections = 200
thread_cache_size = 8
table_open_cache = 2000
ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅
π¨ ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈ Π²Π°ΠΆΠ½ΠΎ: ΠΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Ρ ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ!
ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΌΠ΅ΡΡ
- ΠΠ°ΡΡΡΠΎΠΈΡΡ ΡΠ°ΠΉΡΠ²ΠΎΠ» (UFW ΠΈΠ»ΠΈ iptables)
- ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Fail2ban Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΠΎΡ Π±ΡΡΡΡΠΎΡΡΠ°
- ΠΠ°ΡΡΡΠΎΠΈΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΏΠΎΠ΄ΠΎΠ·ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ
- Π Π΅Π³ΡΠ»ΡΡΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ Π²ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ
- ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΠΏΠ°ΡΠΎΠ»ΠΈ Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²
- ΠΡΠΊΠ»ΡΡΠΈΡΡ root Π΄ΠΎΡΡΡΠΏ ΠΏΠΎ SSH
- ΠΠ°ΡΡΡΠΎΠΈΡΡ Π΄Π²ΡΡ ΡΠ°ΠΊΡΠΎΡΠ½ΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π΄Π»Ρ SSH
Fail2ban ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
sudo apt install -y fail2ban
# ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΄Π»Ρ Laravel
sudo nano /etc/fail2ban/jail.local
[laravel]
enabled = true
port = http,https
filter = laravel
logpath = /var/www/dexa/storage/logs/laravel.log
maxretry = 5
bantime = 3600
ΠΡΠΎΠ±Π»Π΅ΠΌΡ ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ
Π§Π°ΡΡΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ
| ΠΡΠΎΠ±Π»Π΅ΠΌΠ° | ΠΡΠΈΡΠΈΠ½Π° | Π Π΅ΡΠ΅Π½ΠΈΠ΅ |
|---|---|---|
| 502 Bad Gateway | PHP-FPM Π½Π΅ Π·Π°ΠΏΡΡΠ΅Π½ | sudo systemctl restart php8.1-fpm |
| ΠΡΠΈΠ±ΠΊΠΈ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ | ΠΠ΅Ρ ΠΏΡΠ°Π² Π½Π° Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ | ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΏΡΠ°Π²Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ MySQL |
| ΠΠ΅Π΄Π»Π΅Π½Π½Π°Ρ Π·Π°Π³ΡΡΠ·ΠΊΠ° | ΠΠ΅Ρ OPCache ΠΈΠ»ΠΈ Redis | ΠΠ°ΡΡΡΠΎΠΈΡΡ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ |
| ΠΡΠΈΠ±ΠΊΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ | Supervisor Π½Π΅ Π·Π°ΠΏΡΡΠ΅Π½ | ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΠ°ΡΡΡ Supervisor |
| ΠΠ΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΏΠΎΡΡΡ | ΠΠ΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ SMTP Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ | ΠΡΠΎΠ²Π΅ΡΠΈΡΡ .env ΠΈ ΡΠ΅ΡΡΠΎΠ²ΡΡ ΠΎΡΠΏΡΠ°Π²ΠΊΡ |
ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π»ΠΎΠ³ΠΎΠ²
sudo tail -f /var/www/dexa/storage/logs/laravel.log
sudo journalctl -u nginx -f
sudo journalctl -u php8.1-fpm -f
# ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΡΠ΅ΡΡΡΡΠΎΠ²
htop
iftop
iotop
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°
df -h
du -sh /var/www/dexa/*
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ΅ΡΠ΅Π²ΡΡ
ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ
netstat -tulpn
ss -tulpn
ΠΠΎΠ½ΡΠ°ΠΊΡΡ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ
- Π’Π΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ°: odeveloper@internet.ru
- ΠΠΊΡΡΡΠ΅Π½Π½ΡΠ΅ ΡΠ»ΡΡΠ°ΠΈ: Π’ΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π· Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠ΅ ΠΊΠ°Π½Π°Π»Ρ
- ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ: /admin/documentation/developer
- ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³: ΠΠ°ΡΡΡΠΎΠΈΡΡ Π°Π»Π΅ΡΡΡ Π² Telegram/Email
βΉοΈ ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅: Π Π΅Π³ΡΠ»ΡΡΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠΉΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΎΠ±Π½ΠΎΠ²Π»ΡΠΉΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈ ΡΠ»Π΅Π΄ΠΈΡΠ΅ Π·Π° Π»ΠΎΠ³Π°ΠΌΠΈ. Π Π΅Π·Π΅ΡΠ²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ - Π²Π°ΡΠ° Π»ΡΡΡΠ°Ρ ΡΡΡΠ°Ρ ΠΎΠ²ΠΊΠ°.
ΠΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅: 30.05.2026 Π² 15:03
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>π Π Π°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ</title>
<style>
body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; padding: 20px; max-width: 1200px; margin: 0 auto; }
h1 { color: #2c3e50; border-bottom: 2px solid #eee; padding-bottom: 10px; margin-bottom: 20px; }
h2 { color: #34495e; border-bottom: 1px solid #eee; padding-bottom: 5px; margin-top: 30px; }
h3 { color: #7f8c8d; margin-top: 25px; }
p { margin-bottom: 15px; }
ul, ol { margin-bottom: 15px; padding-left: 20px; }
li { margin-bottom: 5px; }
code { background-color: #f8f9fa; padding: 2px 6px; border-radius: 4px; font-family: monospace; }
pre { background-color: #f8f9fa; padding: 15px; border-radius: 8px; overflow-x: auto; border: 1px solid #dee2e6; }
.warning { background-color: #fff3cd; border: 1px solid #ffeaa7; padding: 15px; border-radius: 5px; margin: 15px 0; }
.danger { background-color: #f8d7da; border: 1px solid #f5c6cb; padding: 15px; border-radius: 5px; margin: 15px 0; }
.info { background-color: #d1ecf1; border: 1px solid #bee5eb; padding: 15px; border-radius: 5px; margin: 15px 0; }
table { border-collapse: collapse; width: 100%; margin-bottom: 20px; }
th, td { padding: 12px; border: 1px solid #dee2e6; }
th { background-color: #f8f9fa; }
</style>
</head>
<body>
<h1>π Π Π°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ</h1>
<div class="info">
<p><strong>βΉοΈ ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅:</strong> ΠΡΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ. ΠΠ»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ "Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ°".</p>
</div>
<h2>Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ</h2>
<h3>ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ</h3>
<table>
<thead>
<tr>
<th>ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ</th>
<th>ΠΠΈΠ½ΠΈΠΌΡΠΌ</th>
<th>Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ</th>
<th>ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΡ</th>
</tr>
</thead>
<tbody>
<tr>
<td>CPU</td>
<td>2 ΡΠ΄ΡΠ°</td>
<td>4+ ΡΠ΄Π΅Ρ</td>
<td>ΠΠ»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ ΠΈ API</td>
</tr>
<tr>
<td>RAM</td>
<td>2GB</td>
<td>8GB+</td>
<td>MySQL + Redis + PHP-FPM</td>
</tr>
<tr>
<td>ΠΠΈΡΠΊ</td>
<td>20GB</td>
<td>100GB SSD</td>
<td>ΠΠ»Ρ Π»ΠΎΠ³ΠΎΠ² ΠΈ Π±ΡΠΊΠ°ΠΏΠΎΠ²</td>
</tr>
<tr>
<td>OS</td>
<td>Ubuntu 20.04</td>
<td>Ubuntu 22.04 LTS</td>
<td>ΠΠΎΠ»Π³ΠΎΡΡΠΎΡΠ½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ°</td>
</tr>
<tr>
<td>ΠΡΠΎΠΏΡΡΠΊΠ½Π°Ρ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ</td>
<td>100 Mbps</td>
<td>1 Gbps</td>
<td>ΠΠ»Ρ API ΠΈ Π·Π°Π³ΡΡΠ·ΠΎΠΊ</td>
</tr>
</tbody>
</table>
<h3>ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ</h3>
<ul>
<li><strong>PHP:</strong> 8.1+ Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ:
<ul>
<li>bcmath, ctype, fileinfo, json, mbstring, openssl, pdo, tokenizer, xml, zip</li>
<li>gd ΠΈΠ»ΠΈ imagick Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ</li>
<li>redis Π΄Π»Ρ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ</li>
</ul>
</li>
<li><strong>MySQL:</strong> 8.0+ ΠΈΠ»ΠΈ MariaDB 10.4+</li>
<li><strong>Redis:</strong> 6.0+</li>
<li><strong>Nginx:</strong> 1.18+ ΠΈΠ»ΠΈ Apache 2.4+</li>
<li><strong>Node.js:</strong> 16+ (Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π°ΡΡΠ΅ΡΠΎΠ²)</li>
<li><strong>Supervisor:</strong> ΠΠ»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ</li>
<li><strong>Certbot:</strong> ΠΠ»Ρ SSL ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ²</li>
</ul>
<h2>ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°</h2>
<h3>1. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°</h3>
<pre><code># ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ
sudo apt update && sudo apt upgrade -y
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π±Π°Π·ΠΎΠ²ΡΡ
ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²
sudo apt install -y curl wget git unzip build-essential software-properties-common
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΠ°ΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ°
sudo timedatectl set-timezone Europe/Moscow
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π»ΠΎΠΊΠ°Π»ΠΈ
sudo locale-gen ru_RU.UTF-8
sudo update-locale LANG=ru_RU.UTF-8</code></pre>
<h3>2. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° PHP 8.1+</h3>
<pre><code># ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° PHP ΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ
sudo apt install -y php8.1 php8.1-fpm php8.1-mysql php8.1-redis \
php8.1-curl php8.1-gd php8.1-mbstring php8.1-xml php8.1-zip \
php8.1-bcmath php8.1-common php8.1-intl php8.1-soap
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π²Π΅ΡΡΠΈΠΈ
php --version</code></pre>
<h3>3. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° MySQL 8.0</h3>
<pre><code># Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° MySQL
sudo apt install -y mysql-server mysql-client
# ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°
sudo mysql_secure_installation
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
sudo mysql -u root -p
CREATE DATABASE dexa CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'dexa_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON dexa.* TO 'dexa_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;</code></pre>
<h3>4. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Redis</h3>
<pre><code># Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Redis
sudo apt install -y redis-server
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Redis
sudo nano /etc/redis/redis.conf
# ΠΠ·ΠΌΠ΅Π½ΠΈΡΡ:
# maxmemory 256mb
# maxmemory-policy allkeys-lru
# requirepass Π²Π°Ρ_ΠΏΠ°ΡΠΎΠ»Ρ_redis
# ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊ
sudo systemctl restart redis
sudo systemctl enable redis</code></pre>
<h3>5. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Nginx</h3>
<pre><code># Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Nginx
sudo apt install -y nginx
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° firewall
sudo ufw allow 'Nginx Full'
sudo ufw allow 'OpenSSH'
sudo ufw --force enable</code></pre>
<h2>ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠ°</h2>
<h3>ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ PHP-FPM</h3>
<pre><code># Π Π΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ PHP-FPM
sudo nano /etc/php/8.1/fpm/php.ini
# ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ:
memory_limit = 256M
upload_max_filesize = 10M
post_max_size = 12M
max_execution_time = 300
max_input_time = 300
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ Π΄Π»Ρ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π°
expose_php = Off
display_errors = Off
log_errors = On
error_log = /var/log/php/error.log
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ΅ΡΡΠΈΠΉ
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=Π²Π°Ρ_ΠΏΠ°ΡΠΎΠ»Ρ_redis"
# ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊ PHP-FPM
sudo systemctl restart php8.1-fpm</code></pre>
<h3>ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Nginx</h3>
<pre><code># Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΡΠ°ΠΉΡΠ°
sudo nano /etc/nginx/sites-available/dexa
# ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
server {
listen 80;
server_name Π²Π°Ρ-Π΄ΠΎΠΌΠ΅Π½.com www.Π²Π°Ρ-Π΄ΠΎΠΌΠ΅Π½.com;
root /var/www/dexa/public;
index index.php index.html index.htm;
# ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
# ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ
client_max_body_size 10M;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
location ~ /\.(?!well-known).* {
deny all;
}
# Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
log_not_found off;
}
# ΠΠ°ΠΏΡΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊζζ ΡΠ°ΠΉΠ»Π°ΠΌ
location ~ /\.env$ {
deny all;
return 403;
}
location ~ /storage/.*\.php$ {
deny all;
return 403;
}
}
# ΠΠΊΡΠΈΠ²Π°ΡΠΈΡ ΡΠ°ΠΉΡΠ°
sudo ln -s /etc/nginx/sites-available/dexa /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx</code></pre>
<h3>ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° SSL (ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ)</h3>
<pre><code># Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Certbot
sudo apt install -y certbot python3-certbot-nginx
# ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°
sudo certbot --nginx -d Π²Π°Ρ-Π΄ΠΎΠΌΠ΅Π½.com -d www.Π²Π°Ρ-Π΄ΠΎΠΌΠ΅Π½.com
# ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅
sudo certbot renew --dry-run</code></pre>
<h2>ΠΠ΅ΠΏΠ»ΠΎΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ</h2>
<h3>1. ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ</h3>
<pre><code># Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
sudo adduser --disabled-password --gecos "" dexa
sudo usermod -aG www-data dexa
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ
sudo mkdir -p /var/www/dexa
sudo chown -R dexa:www-data /var/www/dexa
sudo chmod -R 775 /var/www/dexa/storage
sudo chmod -R 775 /var/www/dexa/bootstrap/cache</code></pre>
<h3>2. ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°</h3>
<pre><code># ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
sudo su - dexa
# ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
git clone [repository-url] /var/www/dexa
cd /var/www/dexa
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
composer install --optimize-autoloader --no-dev
npm install
npm run production
# ΠΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
cp .env.example .env
nano .env # ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²</code></pre>
<h3>3. ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ .env Π΄Π»Ρ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π°</h3>
<pre><code>APP_NAME="DEXA Exchange"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://Π²Π°Ρ-Π΄ΠΎΠΌΠ΅Π½.com
APP_TIMEZONE=Europe/Moscow
# ΠΠ°Π·Π° Π΄Π°Π½Π½ΡΡ
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dexa
DB_USERNAME=dexa_user
DB_PASSWORD=strong_password
# Redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=Π²Π°Ρ_ΠΏΠ°ΡΠΎΠ»Ρ_redis
REDIS_PORT=6379
# Π‘Π΅ΡΡΠΈΠΈ ΠΈ ΠΊΡΡ
SESSION_DRIVER=redis
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
# ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ
SESSION_SECURE_COOKIE=true
SESSION_HTTP_ONLY=true
SESSION_SAME_SITE=lax
# ΠΠΎΡΡΠ° (Π½Π°ΡΡΡΠΎΠΉΡΠ΅ ΠΏΠΎΠ΄ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ°)
MAIL_MAILER=smtp
MAIL_HOST=smtp.mail.ru
MAIL_PORT=465
MAIL_USERNAME=Π²Π°Ρ_email@mail.ru
MAIL_PASSWORD=ΠΏΠ°ΡΠΎΠ»Ρ_ΠΏΠΎΡΡΡ
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=Π²Π°Ρ_email@mail.ru
MAIL_FROM_NAME="DEXA Exchange"
# Telegram Π±ΠΎΡ (Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ)
TELEGRAM_BOT_TOKEN=
TELEGRAM_CHAT_ID=</code></pre>
<h3>4. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ</h3>
<pre><code># ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΊΠ»ΡΡΠ°
php artisan key:generate
# ΠΠΈΠ³ΡΠ°ΡΠΈΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
php artisan migrate --force
# ΠΠ°ΠΏΡΡΠΊ ΡΠΈΠ΄ΠΎΠ² (Π½Π°ΡΠ°Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅)
php artisan db:seed --force
# ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ
php artisan config:cache
php artisan route:cache
php artisan view:cache
# Π‘ΠΈΠΌΠ»ΠΈΠ½ΠΊ storage
php artisan storage:link
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΡΠ°Π²
sudo chown -R www-data:www-data /var/www/dexa/storage
sudo chown -R www-data:www-data /var/www/dexa/bootstrap/cache</code></pre>
<h2>ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Supervisor</h2>
<h3>ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΄Π»Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ</h3>
<pre><code># Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Supervisor
sudo apt install -y supervisor
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
sudo nano /etc/supervisor/conf.d/dexa-worker.conf
# ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
[program:dexa-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/dexa/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=dexa
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/dexa/storage/logs/worker.log
stopwaitsecs=3600
# ΠΠ»Ρ Horizon (Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ)
[program:dexa-horizon]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/dexa/artisan horizon
autostart=true
autorestart=true
user=dexa
redirect_stderr=true
stdout_logfile=/var/www/dexa/storage/logs/horizon.log
# ΠΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠ° Supervisor
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start all</code></pre>
<h2>ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Cron Π·Π°Π΄Π°Ρ</h2>
<h3>ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ</h3>
<pre><code># Π Π΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ crontab
sudo crontab -u www-data -e
# ΠΠΎΠ±Π°Π²ΠΈΡΡ Π·Π°Π΄Π°ΡΠΈ:
# ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΡΡΡΠΎΠ² ΠΊΠ°ΠΆΠ΄ΡΠ΅ 10 ΠΌΠΈΠ½ΡΡ
*/10 * * * * cd /var/www/dexa && php artisan schedule:run >> /dev/null 2>&1
# ΠΡΠΈΡΡΠΊΠ° ΡΡΠ°ΡΡΡ
ΡΠ΅ΡΡΠΈΠΉ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎ
0 0 * * * cd /var/www/dexa && php artisan session:gc >> /dev/null 2>&1
# Π Π΅Π·Π΅ΡΠ²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΠ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎ Π² 2:00
0 2 * * * /usr/bin/mysqldump -u dexa_user -pstrong_password dexa | gzip > /backups/dexa_$(date +\%Y\%m\%d).sql.gz
# ΠΡΠΈΡΡΠΊΠ° ΡΡΠ°ΡΡΡ
Π±ΡΠΊΠ°ΠΏΠΎΠ² (Ρ
ΡΠ°Π½ΠΈΠΌ 30 Π΄Π½Π΅ΠΉ)
0 3 * * * find /backups -name "*.sql.gz" -mtime +30 -delete
# ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π»ΠΎΠ³ΠΎΠ² (Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΡΠΉ ΠΎΡΡΠ΅Ρ)
0 8 * * * cd /var/www/dexa && php artisan log:report >> /var/log/dexa-report.log
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π·Π΄ΠΎΡΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Ρ
0 * * * * cd /var/www/dexa && php artisan system:health-check >> /dev/null 2>&1</code></pre>
<h3>Schedule ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² Laravel</h3>
<pre><code>// app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
// ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΡΡΡΠΎΠ²
$schedule->command('rates:update')
->everyTenMinutes()
->withoutOverlapping()
->onOneServer();
// ΠΡΠΈΡΡΠΊΠ° ΡΡΠ°ΡΡΡ
Π·Π°ΡΠ²ΠΎΠΊ
$schedule->command('orders:cleanup')
->daily()
->at('03:00');
// ΠΡΠΏΡΠ°Π²ΠΊΠ° ΠΎΡΡΠ΅ΡΠΎΠ²
$schedule->command('reports:daily')
->daily()
->at('08:00');
// ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π·Π΄ΠΎΡΠΎΠ²ΡΡ API
$schedule->command('api:health-check')
->hourly();
}</code></pre>
<h2>ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΈ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅</h2>
<h3>ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π»ΠΎΠ³ΠΎΠ²</h3>
<pre><code># Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΉ Π΄Π»Ρ Π»ΠΎΠ³ΠΎΠ²
sudo mkdir -p /var/log/dexa
sudo chown -R www-data:www-data /var/log/dexa
# ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΠΎΡΠ°ΡΠΈΠΈ Π»ΠΎΠ³ΠΎΠ²
sudo nano /etc/logrotate.d/dexa
# ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
/var/www/dexa/storage/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 www-data www-data
sharedscripts
postrotate
kill -USR1 `cat /var/run/php/php8.1-fpm.pid 2>/dev/null` 2>/dev/null || true
endscript
}</code></pre>
<h3>ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π°</h3>
<ul>
<li><strong>Laravel Telescope:</strong> ΠΠ»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ (Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅)</li>
<li><strong>Laravel Horizon:</strong> ΠΠ»Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ</li>
<li><strong>Prometheus + Grafana:</strong> ΠΠ»Ρ ΠΌΠ΅ΡΡΠΈΠΊ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ</li>
<li><strong>Sentry:</strong> ΠΠ»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ</li>
<li><strong>New Relic:</strong> ΠΠ»Ρ APM (Application Performance Monitoring)</li>
</ul>
<h2>Π Π΅Π·Π΅ΡΠ²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅</h2>
<h3>ΠΠΎΠ»Π½ΡΠΉ ΡΠΊΡΠΈΠΏΡ Π±ΡΠΊΠ°ΠΏΠ°</h3>
<pre><code>#!/bin/bash
# /usr/local/bin/dexa-backup.sh
BACKUP_DIR="/backups"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="dexa"
DB_USER="dexa_user"
DB_PASS="strong_password"
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ
mkdir -p $BACKUP_DIR
# ΠΡΠΊΠ°ΠΏ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz
# ΠΡΠΊΠ°ΠΏ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (Π±Π΅Π· vendor ΠΈ node_modules)
tar -czf $BACKUP_DIR/dexa_files_${DATE}.tar.gz \
--exclude="vendor" \
--exclude="node_modules" \
--exclude=".git" \
/var/www/dexa
# ΠΡΠΊΠ°ΠΏ Π»ΠΎΠ³ΠΎΠ²
tar -czf $BACKUP_DIR/dexa_logs_${DATE}.tar.gz /var/log/dexa
# ΠΡΠΊΠ°ΠΏ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΉ
tar -czf $BACKUP_DIR/dexa_configs_${DATE}.tar.gz \
/etc/nginx/sites-available/dexa \
/etc/supervisor/conf.d/dexa-worker.conf
# ΠΡΠΈΡΡΠΊΠ° ΡΡΠ°ΡΡΡ
Π±ΡΠΊΠ°ΠΏΠΎΠ² (Ρ
ΡΠ°Π½ΠΈΠΌ 30 Π΄Π½Π΅ΠΉ)
find $BACKUP_DIR -name "*.gz" -mtime +30 -delete
# ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ
echo "Backup completed: $DATE" >> /var/log/dexa-backup.log</code></pre>
<h2>ΠΡΠΎΡΠ΅Π΄ΡΡΠ° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ</h2>
<h3>ΠΠ΅ΡΠ΅Π΄ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ</h3>
<ol>
<li>Π£Π²Π΅Π΄ΠΎΠΌΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΎ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ°Π±ΠΎΡΠ°Ρ
</li>
<li>Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΠ»Π½ΡΠΉ Π±ΡΠΊΠ°ΠΏ ΡΠΈΡΡΠ΅ΠΌΡ</li>
<li>ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π² ΡΠ΅ΡΡΠΎΠ²ΠΎΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ</li>
<li>ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΡ ΠΏΠ»Π°Π½ ΠΎΡΠΊΠ°ΡΠ°</li>
</ol>
<h3>ΠΡΠΎΡΠ΅ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ</h3>
<pre><code># ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄ Π² ΡΠ΅ΠΆΠΈΠΌ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ
php artisan down --message="ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΠ΅ΡΠ½Π΅ΠΌΡΡ ΡΠ΅ΡΠ΅Π· 30 ΠΌΠΈΠ½ΡΡ."
# ΠΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ
sudo supervisorctl stop all
# ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°
git pull origin main
# ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
composer install --optimize-autoloader --no-dev
npm install
npm run production
# ΠΠΈΠ³ΡΠ°ΡΠΈΠΈ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
php artisan migrate --force
# ΠΡΠΈΡΡΠΊΠ° ΠΊΡΡΠ΅ΠΉ
php artisan config:clear
php artisan route:clear
php artisan view:clear
php artisan cache:clear
# ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊ Supervisor
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start all
# ΠΠ°ΠΏΡΡΠΊ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ
php artisan config:cache
php artisan route:cache
php artisan view:cache
# ΠΡΡ
ΠΎΠ΄ ΠΈΠ· ΡΠ΅ΠΆΠΈΠΌΠ° ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ
php artisan up
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ
php artisan system:health-check</code></pre>
<h3>ΠΡΠΊΠ°Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ</h3>
<pre><code># ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΆΠΈΠΌΠ° ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ
php artisan down
# ΠΡΠΊΠ°Ρ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΉ (Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ)
php artisan migrate:rollback --step=1
# ΠΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· Π±ΡΠΊΠ°ΠΏΠ°
gunzip < /backups/dexa_20240115.sql.gz | mysql -u dexa_user -p dexa
# ΠΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²
tar -xzf /backups/dexa_files_20240115.tar.gz -C /
# ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²
sudo systemctl restart php8.1-fpm nginx
sudo supervisorctl restart all
# ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΆΠΈΠΌΠ° ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ
php artisan up</code></pre>
<h2>ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ</h2>
<h3>ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° PHP-FPM</h3>
<pre><code># /etc/php/8.1/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
# OPCache Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.fast_shutdown=1</code></pre>
<h3>ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° MySQL</h3>
<pre><code># /etc/mysql/my.cnf
[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
query_cache_type = 1
query_cache_size = 128M
max_connections = 200
thread_cache_size = 8
table_open_cache = 2000</code></pre>
<h2>ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅</h2>
<div class="danger">
<p><strong>π¨ ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈ Π²Π°ΠΆΠ½ΠΎ:</strong> ΠΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Ρ ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ!</p>
</div>
<h3>ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΌΠ΅ΡΡ</h3>
<ol>
<li>ΠΠ°ΡΡΡΠΎΠΈΡΡ ΡΠ°ΠΉΡΠ²ΠΎΠ» (UFW ΠΈΠ»ΠΈ iptables)</li>
<li>ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Fail2ban Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΠΎΡ Π±ΡΡΡΡΠΎΡΡΠ°</li>
<li>ΠΠ°ΡΡΡΠΎΠΈΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΏΠΎΠ΄ΠΎΠ·ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ</li>
<li>Π Π΅Π³ΡΠ»ΡΡΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ Π²ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ</li>
<li>ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΠΏΠ°ΡΠΎΠ»ΠΈ Π΄Π»Ρ Π²ΡΠ΅Ρ
ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²</li>
<li>ΠΡΠΊΠ»ΡΡΠΈΡΡ root Π΄ΠΎΡΡΡΠΏ ΠΏΠΎ SSH</li>
<li>ΠΠ°ΡΡΡΠΎΠΈΡΡ Π΄Π²ΡΡ
ΡΠ°ΠΊΡΠΎΡΠ½ΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π΄Π»Ρ SSH</li>
</ol>
<h3>Fail2ban ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ</h3>
<pre><code># Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
sudo apt install -y fail2ban
# ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΄Π»Ρ Laravel
sudo nano /etc/fail2ban/jail.local
[laravel]
enabled = true
port = http,https
filter = laravel
logpath = /var/www/dexa/storage/logs/laravel.log
maxretry = 5
bantime = 3600</code></pre>
<h2>ΠΡΠΎΠ±Π»Π΅ΠΌΡ ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ</h2>
<h3>Π§Π°ΡΡΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ</h3>
<table>
<thead>
<tr>
<th>ΠΡΠΎΠ±Π»Π΅ΠΌΠ°</th>
<th>ΠΡΠΈΡΠΈΠ½Π°</th>
<th>Π Π΅ΡΠ΅Π½ΠΈΠ΅</th>
</tr>
</thead>
<tbody>
<tr>
<td>502 Bad Gateway</td>
<td>PHP-FPM Π½Π΅ Π·Π°ΠΏΡΡΠ΅Π½</td>
<td><code>sudo systemctl restart php8.1-fpm</code></td>
</tr>
<tr>
<td>ΠΡΠΈΠ±ΠΊΠΈ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ</td>
<td>ΠΠ΅Ρ ΠΏΡΠ°Π² Π½Π° Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
</td>
<td>ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΏΡΠ°Π²Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ MySQL</td>
</tr>
<tr>
<td>ΠΠ΅Π΄Π»Π΅Π½Π½Π°Ρ Π·Π°Π³ΡΡΠ·ΠΊΠ°</td>
<td>ΠΠ΅Ρ OPCache ΠΈΠ»ΠΈ Redis</td>
<td>ΠΠ°ΡΡΡΠΎΠΈΡΡ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅</td>
</tr>
<tr>
<td>ΠΡΠΈΠ±ΠΊΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ</td>
<td>Supervisor Π½Π΅ Π·Π°ΠΏΡΡΠ΅Π½</td>
<td>ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΠ°ΡΡΡ Supervisor</td>
</tr>
<tr>
<td>ΠΠ΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΏΠΎΡΡΡ</td>
<td>ΠΠ΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ SMTP Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ</td>
<td>ΠΡΠΎΠ²Π΅ΡΠΈΡΡ .env ΠΈ ΡΠ΅ΡΡΠΎΠ²ΡΡ ΠΎΡΠΏΡΠ°Π²ΠΊΡ</td>
</tr>
</tbody>
</table>
<h3>ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ</h3>
<pre><code># ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π»ΠΎΠ³ΠΎΠ²
sudo tail -f /var/www/dexa/storage/logs/laravel.log
sudo journalctl -u nginx -f
sudo journalctl -u php8.1-fpm -f
# ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΡΠ΅ΡΡΡΡΠΎΠ²
htop
iftop
iotop
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°
df -h
du -sh /var/www/dexa/*
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ΅ΡΠ΅Π²ΡΡ
ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ
netstat -tulpn
ss -tulpn</code></pre>
<h2>ΠΠΎΠ½ΡΠ°ΠΊΡΡ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ</h2>
<ul>
<li><strong>Π’Π΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ°:</strong> odeveloper@internet.ru</li>
<li><strong>ΠΠΊΡΡΡΠ΅Π½Π½ΡΠ΅ ΡΠ»ΡΡΠ°ΠΈ:</strong> Π’ΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π· Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠ΅ ΠΊΠ°Π½Π°Π»Ρ</li>
<li><strong>ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ:</strong> /admin/documentation/developer</li>
<li><strong>ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³:</strong> ΠΠ°ΡΡΡΠΎΠΈΡΡ Π°Π»Π΅ΡΡΡ Π² Telegram/Email</li>
</ul>
<div class="info">
<p><strong>βΉοΈ ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅:</strong> Π Π΅Π³ΡΠ»ΡΡΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠΉΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΎΠ±Π½ΠΎΠ²Π»ΡΠΉΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈ ΡΠ»Π΅Π΄ΠΈΡΠ΅ Π·Π° Π»ΠΎΠ³Π°ΠΌΠΈ. Π Π΅Π·Π΅ΡΠ²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ - Π²Π°ΡΠ° Π»ΡΡΡΠ°Ρ ΡΡΡΠ°Ρ
ΠΎΠ²ΠΊΠ°.</p>
</div>
</body>
</html>