Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥4
Это плагины, которые позволяют Terraform взаимодействовать с различными облачными провайдерами, сервисами и другими API. Они выступают в роли интерфейсов между Terraform и целевыми инфраструктурами, обеспечивая возможность создания, управления и изменения ресурсов в этих инфраструктурах.
Провайдеры определяют типы ресурсов, которые можно создавать и управлять с их помощью. Например, для провайдера AWS это могут быть ресурсы типа
aws_instance
, aws_s3_bucket
и т.д.Провайдеры содержат логику для создания, обновления, чтения и удаления ресурсов в целевой системе. Они используют API целевых систем для выполнения этих операций.
Провайдеры обрабатывают аутентификацию и настройки соединения, необходимые для взаимодействия с API целевых систем.
Управление ресурсами в AWS, такими как EC2, S3, RDS и другие.
Управление ресурсами в Microsoft Azure, такими как виртуальные машины, базы данных и сети.
Управление ресурсами в GCP, такими как Compute Engine, Cloud Storage и другие.
Управление кластерами Kubernetes и ресурсами внутри них.
Управление репозиториями, организациями и командами на GitHub.
Пример использования провайдера в Terraform
# Определение провайдера
provider "aws" {
region = "us-west-2"
access_key = "your_access_key"
secret_key = "your_secret_key"
}
# Определение ресурса
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "example-instance"
}
}
Провайдеры определяются в конфигурационных файлах Terraform (с расширением
.tf
). В примере выше это блок provider "aws"
.После определения провайдеров в конфигурации необходимо инициализировать рабочее окружение с помощью команды
terraform init
. Эта команда скачивает и устанавливает все необходимые плагины провайдеров.terraform init
Пример команды инициализации
Initializing provider plugins...
- Finding latest version of hashicorp/aws...
- Installing hashicorp/aws v3.37.0...
- Installed hashicorp/aws v3.37.0 (signed by HashiCorp)
Terraform has been successfully initialized!
Провайдеры обеспечивают единый интерфейс для управления различными инфраструктурами, что упрощает процессы DevOps и автоматизацию.
Существует множество провайдеров, что позволяет работать с различными облачными платформами, сервисами и инструментами.
Провайдеры позволяют описывать инфраструктуру как код (Infrastructure as Code, IaC), что упрощает автоматизацию и управление инфраструктурой.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1
Происходит несколько шагов, чтобы загрузить запрашиваемую веб-страницу. Эти шаги включают преобразование доменного имени в IP-адрес, установление соединения и загрузку содержимого страницы.
Браузер проверяет кэш на наличие сохраненной копии страницы.
Если IP-адрес не найден, браузер отправляет запрос к DNS-серверу для получения IP-адреса доменного имени
google.com
. DNS-сервер отвечает с IP-адресом (например, 172.217.10.46).Браузер устанавливает TCP-соединение с сервером по полученному IP-адресу через трехстороннее рукопожатие (three-way handshake):
1. Клиент отправляет SYN (synchronize) пакет серверу.
2. Сервер отвечает SYN-ACK (synchronize-acknowledge) пакетом.
Если используется HTTPS, устанавливается TLS/SSL соединение для шифрования данных:
1. Клиент и сервер обмениваются сертификатами и ключами.
2. Устанавливается защищенный канал для передачи данных.
Браузер отправляет HTTP-запрос на сервер
GET / HTTP/1.1
Host: google.com
Веб-сервер (например, Nginx или Apache) получает запрос и передает его к приложению (например, к веб-приложению Google). Сервер обрабатывает запрос, возможно, обращаясь к базе данных или другим сервисам, и формирует HTTP-ответ.
Сервер отправляет HTTP-ответ обратно клиенту:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<html>
<head><title>Google</title></head>
<body>...</body>
</html>
Браузер может кэшировать ресурсы (CSS, JS, изображения) для ускорения последующих загрузок. Сервер может отправлять заголовки кэширования, такие как
Cache-Control
и Expires
, чтобы указать браузеру, как долго хранить ресурсы.Страница может использовать JavaScript для выполнения дополнительных запросов к серверу (AJAX) без перезагрузки страницы.
Пользователь вводит
google.com
в адресную строку браузера.Браузер отправляет DNS-запрос и получает ответ
google.com has address 172.217.10.46
Браузер и сервер выполняют трехстороннее рукопожатие:
1. Клиент:
SYN
2. Сервер:
SYN-ACK
3. Клиент:
ACK
Браузер и сервер обмениваются сертификатами и устанавливают защищенный канал.
Браузер отправляет запрос
GET / HTTP/1.1
Host: google.com
Сервер отвечает
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<html>
<head><title>Google</title></head>
<body>...</body>
</html>
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤3
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Linux системам часто по умолчанию разрешается иметь открытыми не более 1024 файловых дескрипторов на процесс. Это число может быть увеличено. Проверка текущих лимитов:
Используйте команду
ulimit
для проверки текущих лимитов:ulimit -n
Чтобы увеличить лимит, отредактируйте файл
/etc/security/limits.conf
и добавьте или измените следующие строки. Перезапустите терминал или перезагрузите систему для применения изменений.* soft nofile 65536
* hard nofile 65536
Отредактируйте файл
/etc/sysctl.conf
и добавьте следующие строкиfs.file-max = 2097152
Примените изменения командой
sudo sysctl -p
Убедитесь, что в конфигурации Nginx указано достаточно соединений на один процесс. Откройте файл конфигурации Nginx (обычно
/etc/nginx/nginx.conf
) и настройте параметры worker_connections
и worker_rlimit_nofile
.worker_rlimit_nofile 65536;
events {
worker_connections 65536;
}
Отредактируйте файл
/etc/security/limits.conf
и добавьте или измените строки для увеличения максимального количества процессов* soft nproc 65536
* hard nproc 65536
Отредактируйте файл
/etc/sysctl.conf
и добавьте следующие строки:kernel.pid_max = 4194303
Примените изменения:
sudo sysctl -p
После внесения всех изменений перезапустите Nginx для применения новых настроек:
sudo systemctl restart nginx
Редактирование /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
Применение изменений sysctl
sudo sysctl -w fs.file-max=2097152
worker_rlimit_nofile 65536;
events {
worker_connections 65536;
}
sudo systemctl restart nginx
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥5
Как и любая другая серверная программа, может сталкиваться с различными лимитами, которые могут ограничивать его производительность и возможности. Эти лимиты могут исходить как от самой конфигурации Nginx, так и от операционной системы и оборудования.
Определяет максимальное количество соединений, которые каждый рабочий процесс (worker) может обслуживать одновременно. Конфигурация:
/etc/nginx/nginx.conf
events {
worker_connections 1024;
}
Определяет количество рабочих процессов. Обычно рекомендуется настроить на количество ядер процессора. Конфигурация:
/etc/nginx/nginx.conf
worker_processes auto;
Определяет максимальный размер тела запроса (например, загрузка файлов). Конфигурация:
/etc/nginx/nginx.conf
или в контексте сервера/локации. http {
client_max_body_size 10m;
}
Размер буфера для хранения тела запроса клиента. Конфигурация:
/etc/nginx/nginx.conf
http {
client_body_buffer_size 8k;
}
Используются для ограничения количества соединений от одного клиента. Конфигурация:
/etc/nginx/nginx.conf
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
limit_conn addr 10;
}
}
}
Используются для ограничения количества запросов от одного клиента в единицу времени (например, для защиты от DDoS-атак). Конфигурация:
/etc/nginx/nginx.conf
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location / {
limit_req zone=one burst=5;
}
}
}
Linux системам по умолчанию разрешается иметь ограниченное количество открытых файловых дескрипторов на процесс. Проверка текущих лимитов
ulimit -n
Увеличение лимитов
В
/etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
В
/etc/sysctl.conf
fs.file-max = 2097152
Применение изменений
sudo sysctl -p
Максимальное количество полуподключений.
В
/etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 4096
Применение изменений
sudo sysctl -p
Количество ядер и тактовая частота процессора могут влиять на количество одновременных соединений и общую производительность Nginx.
Недостаток оперативной памяти может привести к увеличению времени отклика и сбоям при большом количестве запросов.
Высокая нагрузка на диск может замедлить обработку запросов, особенно при работе с большими файлами или логами.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥6
Команда
ping
отправляет пакеты ICMP на указанный домен и отображает IP-адрес.ping google.com
Пример вывода
В этом примере IP-адрес
google.com
— 142.250.190.78.PING google.com (142.250.190.78): 56 data bytes
64 bytes from 142.250.190.78: icmp_seq=0 ttl=115 time=14.3 ms
Команда
nslookup
запрашивает DNS-сервер для получения информации о домене, включая IP-адрес.nslookup google.com
Пример вывода
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: google.com
Address: 142.250.190.78
Команда
dig
(domain information groper) запрашивает DNS-сервер для получения информации о домене. Она более гибкая и детализированная, чем nslookup
.dig google.com
Пример вывода
; <<>> DiG 9.11.3-1ubuntu1.12-Ubuntu <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49142
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 299 IN A 142.250.190.78
;; Query time: 21 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Jul 26 12:00:00 UTC 2024
;; MSG SIZE rcvd: 55
Команда
host
— еще один способ запроса DNS для получения IP-адреса домена.host google.com
Пример вывода
google.com has address 142.250.190.78
google.com has IPv6 address 2607:f8b0:4005:809::200e
Существует множество онлайн-сервисов, которые позволяют определить IP-адрес веб-сайта.
[WhatIsMyIPAddress](https://www.whatismyipaddress.com/)
[DNSWatch](https://www.dnswatch.info/)
[IP-Checker](https://ipinfo.info/html/ip_checker.php)
ping
ping example.com
PING example.com (93.184.216.34): 56 data bytes
64 bytes from 93.184.216.34: icmp_seq=0 ttl=56 time=12.3 ms
nslookup
nslookup example.com
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: example.com
Address: 93.184.216.34
dig
dig example.com
; <<>> DiG 9.11.3-1ubuntu1.12-Ubuntu <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32477
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;example.com. IN A
;; ANSWER SECTION:
example.com. 299 IN A 93.184.216.34
;; Query time: 21 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Jul 26 12:00:00 UTC 2024
;; MSG SIZE rcvd: 55
host
host example.com
example.com has address 93.184.216.34
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥10❤1
Это команда в Unix-подобных операционных системах, которая используется для ограничения ресурсов, доступных оболочке и запущенным из нее процессам. С помощью
ulimit
можно устанавливать и проверять различные лимиты, такие как количество открытых файлов, размер стека, размер файлов и т. д. Эти лимиты помогают предотвратить исчерпание системных ресурсов отдельными процессами и улучшить безопасность и стабильность системы.Максимальное количество открытых файлов (file descriptors).
Максимальное количество процессов, которые может создать пользователь.
Максимальный размер файлов, которые могут быть созданы пользователем (в блоках).
Размер стека (stack size).
Размер файлов core dump.
Максимальный объем виртуальной памяти (virtual memory size).
Максимальный объем памяти, который может быть заблокирован в оперативной памяти (locked-in-memory size).
ulimit -a
Вывод этой команды покажет все текущие лимиты для текущего пользователя и сеанса
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 63691
max locked memory (kbytes, -l) 16384
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 63691
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Это установит лимит на 4096 открытых файлов для текущей сессии.
ulimit -n 4096
Это установит максимальный размер файла в 1 ГБ (1048576 блоков по 1024 байта).
ulimit -f 1048576
Это установит размер стека в 16 МБ.
ulimit -s 16384
Чтобы установить лимиты на постоянной основе, нужно отредактировать конфигурационные файлы, такие как
/etc/security/limits.conf
и /etc/pam.d/common-session
.* soft nofile 4096
* hard nofile 65536
* soft nproc 4096
* hard nproc 8192
Вы можете включить
ulimit
в ваши скрипты для временного изменения лимитов ресурсов перед выполнением команд#!/bin/bash
ulimit -n 4096
ulimit -s 16384
# Выполнение команд
./myprogram
Root может устанавливать более высокие лимиты, чем обычные пользователи. Ограничения могут варьироваться между различными системами и дистрибутивами Linux.
Изменения, сделанные с помощью команды
ulimit
, применяются только к текущему сеансу и процессам, запущенным из него.Лимиты могут иметь максимальные значения, заданные ядром системы. Например, максимальный лимит для количества открытых файлов может быть установлен с помощью параметра
fs.file-max
в /etc/sysctl.conf
.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1🔥1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18
Можно увеличить несколько лимитов, связанных как с самой конфигурацией Nginx, так и с настройками операционной системы.
ulimit -n
* soft nofile 65536
* hard nofile 65536
Перезапустите терминал или перезагрузите систему, чтобы изменения вступили в силу.
LimitNOFILE=65536
sudo systemctl daemon-reload
Откройте файл конфигурации Nginx (обычно
/etc/nginx/nginx.conf
) и настройте следующие параметры:worker_rlimit_nofile: Установите максимальное количество открытых файлов.
worker_rlimit_nofile 65536;
worker_connections: Увеличьте количество соединений, которые каждый рабочий процесс может обрабатывать одновременно.
events {
worker_connections 65536;
}
worker_processes: Настройте количество рабочих процессов. Обычно это число соответствует количеству ядер процессора.
worker_processes auto;
Отредактируйте файл
/etc/sysctl.conf
и добавьте строкуfs.file-max = 2097152
Примените изменения
sudo sysctl -p
Отредактируйте файл
/etc/sysctl.conf
и добавьте строкиnet.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 4096
Примените изменения
sudo sysctl -p
После внесения всех изменений перезагрузите Nginx для их применения:
sudo systemctl restart nginx
Пример конфигурационного файла Nginx
user nginx;
worker_processes auto;
worker_rlimit_nofile 65536;
events {
worker_connections 65536;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/conf.d/*.conf;
}
Проверка лимита открытых файлов
ulimit -n
Проверка параметров sysctl
sysctl fs.file-max
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_max_syn_backlog
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥7❤1
Обычно хранятся в каталоге
/var/log
. Также многие современные дистрибутивы используют систему журналирования systemd
для управления и просмотра логов.Каталог
/var/log
содержит логи большинства системных сервисов и приложений. Логи системных сообщений
/var/log/syslog
: Содержит общие системные логи. /var/log/messages
: Содержит общие системные сообщения (не во всех дистрибутивах).cat /var/log/syslog
less /var/log/syslog
tail -f /var/log/syslog
Логи конкретных сервисов
Apache: /var/log/apache2/ или /var/log/httpd/ Логи доступа: /var/log/apache2/access.log или /var/log/httpd/access_log Логи ошибок: /var/log/apache2/error.log или /var/log/httpd/error_log
tail -f /var/log/apache2/access.log
tail -f /var/log/apache2/error.log
Nginx: /var/log/nginx/ Логи доступа: /var/log/nginx/access.log Логи ошибок: /var/log/nginx/error.log
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
MySQL: /var/log/mysql/ или /var/log/mysqld.log
tail -f /var/log/mysql/error.log
SSH: /var/log/auth.log или /var/log/secure
tail -f /var/log/auth.log
journalctl
— это утилита для просмотра и управления журналами systemd
. Она позволяет фильтровать логи по различным критериям, таким как время, сервис и уровень логирования.Основные команды
journalctl
Просмотр всех журналов
journalctl
Логов конкретного сервиса
journalctl -u nginx.service
Последних логов и продолжение просмотра в реальном времени
journalctl -f
journalctl -u nginx.service -f
Логов за определённый период
journalctl --since "2024-07-25 12:00:00" --until "2024-07-25 13:00:00"
Логов с определённым уровнем логирования
journalctl -p err
journalctl -p warning
Логи доступа
tail -f /var/log/apache2/access.log
Логи ошибок
tail -f /var/log/apache2/error.log
Логи доступа
tail -f /var/log/nginx/access.log
Логи ошибок
tail -f /var/log/nginx/error.log
Все логи Nginx
journalctl -u nginx.service
Последние логи Nginx в реальном времени
journalctl -u nginx.service -f
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18
Работа с большими логами может быть сложной, так как стандартные текстовые редакторы и команды могут не справляться с такими объемами данных.
Это команда для постраничного просмотра файлов, которая загружает файл по частям, что позволяет работать с большими файлами без их полного открытия в памяти. Навигация:
Space: следующая страница
b: предыдущая страница
G: перейти в конец файла
g: перейти в начало файла
/pattern: поиск по файлу
less /path/to/large-log-file.log
Это команда для просмотра последних строк файла. Она полезна для мониторинга новых записей в реальном времени.
tail -n 1000 /path/to/large-log-file.log
Для непрерывного мониторинга
tail -f /path/to/large-log-file.log
Это команда для просмотра первых строк файла.
head -n 1000 /path/to/large-log-file.log
Это мощный текстовый процессор, который может быть использован для фильтрации и обработки лог-файлов.
awk '/ERROR/' /path/to/large-log-file.log
Это команда для поиска по файлу. Она позволяет быстро находить строки, содержащие определенные паттерны.
grep "ERROR" /path/to/large-log-file.log
Для просмотра строк до и после найденного паттерна
grep -C 5 "ERROR" /path/to/large-log-file.log
Это команда для разбиения больших файлов на более мелкие части. Разбиение файла на части размером по 500 МБ
split -b 500M /path/to/large-log-file.log part_
Некоторые текстовые редакторы, такие как Sublime Text, поддерживают работу с большими файлами. Они могут быть полезны для просмотра и редактирования логов.
GoAccess: интерактивный просмотр логов веб-сервера в режиме реального времени.
goaccess /path/to/access.log -c
lnav: интерактивный просмотрщик логов, который автоматически определяет формат логов и предоставляет удобную навигацию и поиск.
lnav /path/to/large-log-file.log
Использование
less
для просмотра большого лог-файлаless /path/to/large-log-file.log
Использование
grep
для поиска по логуgrep "ERROR" /path/to/large-log-file.log
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤1
Это команда в системе контроля версий Git, которая позволяет выбрать отдельные коммиты из одной ветки и применить их к другой ветке. Это полезно, когда вы хотите перенести конкретные изменения (коммиты) в текущую ветку, не выполняя слияние всей ветки.
Когда нужно перенести конкретные исправления или функции из одной ветки в другую, не сливая все изменения из исходной ветки.
Когда найденное исправление в одной ветке нужно срочно применить в другой, например, из ветки разработки в ветку релиза.
Когда слияние всей ветки может привести к конфликтам или нежелательным изменениям,
cherry-pick
позволяет аккуратно перенести только нужные коммиты.Перенос одного коммита из другой ветки.
# Переключитесь на ветку, куда вы хотите применить изменения
git checkout target-branch
# Выполните cherry-pick коммита
git cherry-pick <commit-hash>
Перенос нескольких коммитов из другой ветки.
# Переключитесь на ветку, куда вы хотите применить изменения
git checkout target-branch
# Выполните cherry-pick нескольких коммитов
git cherry-pick <commit-hash-1> <commit-hash-2> <commit-hash-3>
Перенос диапазона коммитов из другой ветки.
# Переключитесь на ветку, куда вы хотите применить изменения
git checkout target-branch
# Выполните cherry-pick диапазона коммитов
git cherry-pick <start-commit-hash>..<end-commit-hash>
git add <filename>
cherry-pick
git cherry-pick --continue
Если вы хотите прервать процесс
cherry-pick
, можно использовать командуgit cherry-pick --abort
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10