Helcode | Хелкод | Скрипты и автоматизация
993 subscribers
52 photos
34 links
☎️ Контакты для связи: @helcodeadm
Download Telegram
Пишем свой systemd сервис для Python-скрипта

У Вас есть полезный Python-скрипт, который должен работать постоянно как демон. Держать его в screen или nohup это каменный век. Давайте сделаем его полноценным systemd-сервисом!

Пример (/etc/systemd/system/my_script.service):
[Unit]
Description=My Awesome Python Script
After=network.target

[Service]
Type=simple
User=deploy
WorkingDirectory=/opt/my_script
ExecStart=/usr/bin/python3 /opt/my_script/main.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target


Как использовать:
sudo systemctl daemon-reload
sudo systemctl enable my_script
sudo systemctl start my_script


Restart=always - перезапускать скрипт, если он упал
RestartSec=5 - ждать 5 секунд перед перезапуском
User=deploy - от имени какого пользователя запускать

А Вы уже перевели свои скрипты на systemd?

Systemd-сервис для скрипта - это как получение гражданства для беженца-процесса. Теперь у него есть права, обязанности и защита государства (системы).


🌐 @helcode
👍93
Git: не просто система контроля версий, а машина времени для вашего кода

"Это работало вчера!" - фраза, от которой стынет кровь. Git - это не просто способ хранить код, а полноценная машина времени, которая позволяет вернуться к любому моменту жизни проекта.

➤ Коммит - это слепок состояния файлов в определенный момент времени.
➤ Ветка- это указатель на конкретный коммит, который движется вперед.
➤ Слияние - это объединение изменений из разных веток.

Продвинутые концепции:
➤ Rebase vs Merge - два способа интегрировать изменения
➤ Interactive rebase - переписывание истории (осторожно!)
➤ Git hooks - автоматизация на события в Git

Git - это самый дешевый и эффективный способ путешествовать во времени. Правда, в отличие от Делореана, он не может попасть в будущее, где ваш код уже написан.


🌐 @helcode | #git
🔥6
Docker: шпаргалка для тех, кто не хочет тонуть в контейнерах

"У меня на машине работает!" - самый страшный баг в истории. Docker решает это, упаковывая приложение со всем его окружением в контейнер. Вот шпаргалка, чтобы не запутаться в базовых командах.

Пример:
➤ Собрать образ:
docker build -t myapp:latest .
➤ Запустить контейнер:
docker run -d -p 8080:80 myapp:latest
➤ Посмотреть запущенные контейнеры:
docker ps
➤ Посмотреть все контейнеры:
docker ps -a
➤ Остановить контейнер:
docker stop <container_id>
➤ Посмотреть логи:
docker logs <container_id>
➤ Зайти внутрь контейнера
docker exec -it <container_id> bash

Dockerfile - это инструкция по сборке образа. Образ - это шаблон. Контейнер - это запущенный экземпляр образа.

Docker - это как виртуальная машина, только без лишнего веса. Если виртуальная машина - это целый дом, то Docker-контейнер - это студия с мебелью Икеа: всё необходимое, ничего лишнего.


🌐 @helcode | #docker
👍7
Пишем свой Dockerfile для Python-приложения

Ваше Python-приложение зависит от конкретных версий пакетов, системных библиотек и переменных окружения. Давайте упакуем его в Docker, чтобы оно запускалось везде одинаково.

Пример:
# Используем официальный Python образ
FROM python:3.11-slim

# Устанавливаем рабочую директорию
WORKDIR /app

# Копируем зависимости сначала (для кэширования)
COPY requirements.txt .
RUN pip install -r requirements.txt

# Копируем весь проект
COPY . .

# Открываем порт
EXPOSE 8000

# Запускаем приложение
CMD ["python", "main.py"]


Как собрать и запустить:
docker build -t mypythonapp .
docker run -p 8000:8000 mypythonapp


Сначала копируем requirements.txt и устанавливаем зависимости - это позволяет Docker кэшировать этот слой и не переустанавливать зависимости при каждом изменении кода.

А Вы уже перевели свои проекты в Docker?

Писать Dockerfile - это как собирать чемодан в отпуск: положил всё необходимое, но не забыл про зубную щетку (системные зависимости).


🌐 @helcode | #docker
💯3👏1
Мониторинг: или как понять, что ваш сервер умирает, до того как это увидят пользователи

Сервер не умирает мгновенно. Он сначала хрипит, кашляет и показывает симптомы. Мониторинг - это стетоскоп, который позволяет услышать эти хрипы до того, как сервер умрет окончательно.

➤ Метрики - количественные данные (CPU, память, диски)
➤ Логи - качественные данные (что происходило)
➤ Трейсинг - отслеживание запроса через все сервисы

Популярный стек:
➤ Prometheus - сбор метрик
➤ Grafana - визуализация
➤ ELK/EFK - работа с логами
➤ Jaeger - трейсинг

А какой стек мониторинга используете Вы? Что мониторите в первую очередь?

Сервер без мониторинга - это как пациент в коме: Вы не знаете, жив он или нет, пока не попробуете пнуть (сделать запрос).


🌐 @helcode
👍4
Prometheus + Grafana: первый контакт

Вы поставили Prometheus и Grafana, открыли интерфейс и... запутались в метриках и дашбордах. Вот шпаргалка по самым полезным метрикам и запросам.

🛠 Пример:
# CPU использование
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# Память использование
node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes

# Свободное место на диске
node_filesystem_avail_bytes{mountpoint="/"}

# Rate HTTP запросов
rate(http_requests_total[5m])


PromQL - это язык запросов Prometheus. rate() считает скорость изменения метрики за промежуток времени, очень полезно для счетчиков.

А какая Ваша любимая метрика или самый полезный дашборд? Делитесь скриншотами!

Prometheus - это тот парень, который считает каждую мелочь. А Grafana - это его друг-художник, который превращает эти цифры в красивые графики.


🌐 @helcode | #PromQL
🤝3
Планировщики задач в Linux: Ваш выбор?

Доброго времени суток! Решили изучить, какие инструменты для запуска задач по расписанию используются чаще всего. Ваш голос поможет составить точную картину. Голосуйте за Ваш основной планировщик!
Anonymous Poll
70%
cron — классика, проверенная временем
25%
systemd timers — современный и интегрированный
0%
anacron — для ноутбуков и нерегулярного аптайма
0%
Клауд/оркестратор (K8s CronJobs, AWS CloudWatch)
4%
Свой скрипт/другое (напиши в комментах!)
Мониторим свое приложение: пишем кастомные метрики для Prometheus

Встроенных метрик системы часто недостаточно. Хочется знать, сколько пользователей онлайн, сколько запросов в секунду обрабатывает Ваше приложение, какая бизнес-логика выполняется. Давайте научим ваше приложение разговаривать с Prometheus!

🛠 Пример:
from prometheus_client import Counter, Gauge, start_http_server
import time

# Создаем метрики
REQUEST_COUNT = Counter('http_requests_total', 'Total HTTP Requests')
USERS_ONLINE = Gauge('users_online', 'Number of online users')

# В обработчике запроса
def handle_request():
REQUEST_COUNT.inc() # Увеличиваем счетчик
USERS_ONLINE.set(get_online_users()) # Устанавливаем значение

# Запускаем HTTP сервер для метрик
start_http_server(8000)


➤ Counter - только увеличивается (запросы, ошибки)
➤ Gauge - может увеличиваться и уменьшаться (пользователи онлайн, температура)
➤ Histogram - распределение значений (время ответа)

🌐 @helcode | #python
👍1
Балансировщики нагрузки: или как разделить ношу на несколько плеч

Один сервер не справляется с нагрузкой? Вместо того чтобы покупать сервер побольше, добавьте несколько поменьше и поставьте перед ними балансировщик - того парня, который будет распределять нагрузку.

➤ Round Robin - по очереди
➤ Least Connections - тому, у кого меньше подключений
➤ IP Hash - один и тот же пользователь всегда попадает на один сервер

Типы балансировщиков:
➤ L4 (Transport) - работает на уровне TCP/UDP
➤ L7 (Application) - работает на уровне HTTP, умнее

Популярные решения:
➤ nginx - простой и эффективный
➤ HAProxy - профессиональное решение
➤ Cloud Load Balancers - от облачных провайдеров

А Вы какой балансировщик используете? С какими интересными кейсами сталкивались?

Балансировщик нагрузки - это как администратор в клубе: решает, кого впустить, кому сказать "мест нет", а VIP-клиентов (по IP hash) всегда проводит к их любимому столику (серверу).


🌐 @helcode
2🥱1🤝1
Nginx как балансировщик: включаем многопоточность для нашего приложения

У Вас несколько экземпляров приложения и нужно распределять между ними нагрузку. Nginx может быть не только веб-сервером, но и отличным балансировщиком.

🛠 Пример (конфиг для балансировки):
upstream backend {
server backend1.example.com:8000 weight=3;
server backend2.example.com:8001;
server backend3.example.com:8002 backup;
}

server {
listen 80;

location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}


weight=3 - в 3 раза больше запросов на этот сервер
backup - использовать только если остальные упали
proxy_set_header - передавать заголовки клиента

А Вы настраивали health checks в nginx? Какие стратегии балансировки используете?

Nginx в роли балансировщика это как шеф-повар, который не готовит сам, а раздает задания поварам-стажерам (бэкендам), следя, чтобы никто не перегрузился.


🌐 @helcode
👀3
Кеширование: или как не делать одну и ту же работу дважды

Ваше приложение каждый раз заново вычисляет тяжелые запросы, генерирует одни и те же страницы или ходит в базу за одинаковыми данными. Кеш - это память ленивого гения, который помнит результат и не любит повторяться.

➤ Client-side caching - браузер кеширует статику
➤ Server-side caching - Redis, Memcached для данных
➤ CDN caching - кеширование контента географически ближе к пользователям
➤ Database caching - кеш-запросов в самой БД

Когда использовать:
➤ Данные редко меняются
➤ Вычисления тяжелые
➤ Частые одинаковые запросы

А вы какой подход к кешированию используете? Redis, Memcached или что-то другое? Делитесь опытом!

Кеш - это как шпаргалка на экзамене: зачем каждый раз вычислять интеграл, если можно посмотреть в готовый ответ? Главное - вовремя обновлять шпаргалки, когда билеты меняются.


🌐 @helcode
👍4
Redis: 5 команд, которые сделают вас мастером кеширования

Redis - это не просто хранилище ключ-значение, это швейцарский нож для данных в памяти. Вот команды, которые должны быть в арсенале каждого автоматизатора.

Пример:
# Положить значение
SET user:123 "John Doe" EX 3600 # EX - время жизни в секундах

# Получить значение
GET user:123

# Проверить существование ключа
EXISTS user:123

# Установить несколько значений за раз
MSET user:123 "John" user:456 "Jane"

# Увеличить счетчик
INCR page_views


EX 3600 устанавливает время жизни ключа в 1 час. Автоматическое удаление устаревших данных - одна из крутейших фич Redis.

Какую самую необычную задачу вы решали с помощью Redis?

Redis - это диктофон для ваших данных: записал, прослушал, а через час оно само стирается. Удобно!


🌐 @helcode | #bash
👍1
Кешируем результаты API-запросов в Redis

Ваш скрипт делает запросы к медленному API, которое отвечает одними и теми же данными. Давайте сохраним результат в Redis и будем использовать его вместо повторных запросов!

🛠 Пример:
import redis
import requests
import json
import time

r = redis.Redis(host='localhost', port=6379, db=0)

def get_cached_data(user_id):
cache_key = f"user:{user_id}"
cached = r.get(cache_key)

if cached:
print("Данные из кеша!")
return json.loads(cached)

# Если нет в кеше - делаем запрос к API
print("Делаем запрос к API...")
response = requests.get(f"https://api.example.com/users/{user_id}")
data = response.json()

# Сохраняем в кеш на 5 минут
r.setex(cache_key, 300, json.dumps(data))
return data

# Использование
user_data = get_cached_data(123)


setex устанавливает значение с временем жизни. Через 5 минут ключ автоматически удалится.

А вы кешируете запросы к внешним API? Какие библиотеки или подходы используете?

Кеширование API-запросов - это как записывать сериал на флешку: не нужно ждать загрузки каждый раз, когда хотите пересмотреть.


P.S. Если Вам интересно, как мы настраивали кеширование в нашем боте и с чем столкнулись на практике - пишите об этом в комментариях! Спойлер: ошибок было действительно много...


🌐 @helcode | #python
👍4
Очереди сообщений: или как разгрузить ваш основной сервис

Пользователь загрузил видео, а ваш сервер должен его обработать, отправить уведомления, сгенерировать превью... И все это мгновенно! Очереди сообщений позволяют отложить тяжелую работу и выполнять ее фоном.

Ключевые понятия:
➤ Producer - производитель (отправляет сообщения)
➤ Consumer - потребитель (обрабатывает сообщения)
➤ Queue - очередь (хранит сообщения)
➤ Broker - посредник (управляет очередями)

Популярные решения:
➤ RabbitMQ - классика, много возможностей
➤ Redis Streams - просто, если уже есть Redis
➤ Apache Kafka - для больших объемов данных

Вы используете очереди в своих проектах? Для каких задач?


Очередь сообщений - это как почтовый ящик: можно бросать письма, даже когда почтальон спит. Он разберет их утром.


🌐 @helcode
1🔥1
RabbitMQ: управляем очередями как профессионалы

RabbitMQ - один из самых популярных брокеров сообщений. Вот основные команды для управления им из командной строки.

Пример:
# Создать очередь
rabbitmqadmin declare queue name=video_processing durable=true

# Отправить сообщение
rabbitmqadmin publish exchange=amq.default routing_key=video_processing payload="hello"

# Посмотреть статистику
rabbitmqctl list_queues name messages_ready messages_unacknowledged

# Создать пользователя
rabbitmqctl add_user myuser mypassword

# Настроить права
rabbitmqctl set_permissions -p / myuser ".*" ".*" ".*"


durable=true делает очередь устойчивой - сообщения не потеряются при перезагрузке RabbitMQ.

Какие самые интересные паттерны с очередями Dы реализовывали? Work queues, pub/sub?

Команда rabbitmqctl - это как пульт управления для Dаших очередей: можно посмотреть, кто в очереди стоит и сколько народу ждет своей очереди.


🌐 @helcode | #bash
👀51
Пишем простую систему обработки задач с Redis RQ

Нужен простой способ выполнять фоновые задачи без настройки сложных брокеров? Redis RQ (Redis Queue) - минималистичное и эффективное решение для Python.

Код:
# worker.py
import requests
from rq import Queue
from redis import Redis
from worker import count_words

# Подключаемся к Redis
redis_conn = Redis()
q = Queue(connection=redis_conn)

# Отправляем задачу в очередь
job = q.enqueue(count_words, 'https://example.com')
print(f"Задача {job.id} добавлена в очередь!")

# Запускаем воркер в отдельном терминале:
# rq worker


# tasks.py
import requests

def count_words(url):
response = requests.get(url)
word_count = len(response.text.split())
print(f"На странице {url} слов: {word_count}")
return word_count


RQ использует Redis как брокер. Воркеры постоянно слушают очередь и выполняют задачи по мере их поступления.

А Вы пробовали RQ или другие простые системы очередей? Как впечатления?


Redis RQ - это как нанять стажера на подработку: отдаешь задачу и забываешь, а он тихо ее выполняет где-то в фоне.


🌐 @helcode | #python
👍2
Контейнеризация vs Виртуализация: битва технологий

Нужно изолировать приложения, но не знаете что выбрать - виртуальные машины или контейнеры? Давайте разберемся в разнице.

➤ Виртуализация: полная эмуляция оборудования. Каждая VM имеет свою ОС. Тяжеловесная, но полная изоляция.
➤ Контейнеризация: изоляция на уровне процессов. Все контейнеры используют ядро хостовой ОС. Легковесная, быстрый старт.

Сравнение:

Виртуальные машины:
✓ Полная изоляция
✓ Разные ОС на одном железе
✗ Высокие накладные расходы

Контейнеры:
✓ Быстрый запуск
✓ Низкие накладные расходы
✗ Общее ядро ОС


Вы используете виртуализацию или контейнеризацию? В каких случаях что используете?


Виртуализация - это как снять отдельную квартиру для каждого гостя. Контейнеризация - как расселить гостей по комнатам в одном большом доме. Экономичнее, но соседи ближе.


🌐 @helcode
👍3
Docker Compose: оркестрируем многокомпонентные приложения

Ваше приложение состоит из веб-сервера, базы данных и кеша. Запускать каждый контейнер вручную - мука. Docker Compose позволяет описать всю инфраструктуру в одном файле.

Пример (docker-compose.yml):
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
depends_on:
- db
- redis

db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data

redis:
image: redis:alpine

volumes:
db_data:


depends_on гарантирует, что база и Redis запустятся до веб-сервера. Volumes сохраняют данные между перезапусками.

Какие самые сложные композ-файлы Вам приходилось писать?

Docker Compose - это как дирижер оркестра: одним взмахом палочки запускает всю инфраструктуру в идеальной гармонии.


🌐 @helcode | #yaml
🔥2
Поднимаем локальное окружение с WordPress + MySQL за 5 минут

Нужно быстро протестировать плагин или тему WordPress? Не нужно устанавливать веб-сервер, PHP и MySQL на свою машину. Docker Compose сделает все за Вас!

Пример (docker-compose.yml):
version: '3.8'
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- db_data:/var/lib/mysql

wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: root
depends_on:
- db

volumes:
db_data:


Как использовать:
docker-compose up -d
# Открываем http://localhost:8080


Весь WordPress и MySQL запускаются в изолированных контейнерах. После остановки данные сохраняются в volume.

Локальное окружение на Docker - это как играть в симулятор жизни: можно экспериментировать, не боясь сломать что-то важное.


🌐 @helcode | #yaml #bash
👍1
Serverless: или код без серверной головной боли

Вам нужно запустить код, но не хочется думать о серверах, масштабировании и обновлениях. Serverless - это подход, где вы просто загружаете код, а провайдер делает все остальное.

Подходы к задаче:
➤ FaaS (Function as a Service) - запуск отдельных функций
➤ Платите за выполнение - только когда код работает
➤ Автоматическое масштабирование - от 0 до тысяч параллельных выполнений

Популярные платформы:
➤ AWS Lambda
➤ Google Cloud Functions
➤ Azure Functions

А также российские аналоги (таковы современные реалии...):
- Yandex Cloud Functions 🇷🇺
- VK Cloud Solutions 🇷🇺
- SberCloud Cloud Functions 🇷🇺
- Selectel Serverless 🇷🇺

Плюсы:
✓ Нет управления серверами
✓ Автоматическое масштабирование
✓ Плата только за использование

Минусы:
✗ Cold start проблемы
✗ Ограничения по времени выполнения
✗ Vendor lock-in

Вы уже пробовали serverless? Для каких задач он подошел лучше всего?

Serverless - это как такси: платишь только за поездку, не нужно покупать машину, заправлять ее и делать техобслуживание.


🌐 @helcode
🔥2🤯1
AWS CLI: управляем облаком из терминала

Постоянно заходить в веб-консоль AWS неудобно. AWS CLI позволяет управлять всеми сервисами прямо из терминала. Вот самые полезные команды.

Пример:
# Настроить профиль
aws configure

# Посмотреть EC2 инстансы
aws ec2 describe-instances

# Создать S3 бакет
aws s3 mb s3://my-unique-bucket-name

# Загрузить файл в S3
aws s3 cp file.txt s3://my-bucket/

# Создать Lambda функцию
aws lambda create-function --function-name my-function \
--runtime python3.9 --role arn:aws:iam::123456789012:role/lambda-role \
--handler lambda_function.lambda_handler --zip-file fileb://function.zip


AWS CLI использует те же права доступа, что и веб-консоль. Настройте IAM-роли правильно!

Какие ваши любимые команды AWS CLI?

AWS CLI - это как пульт от всего облака: не нужно вставать с кресла, чтобы управлять целым ЦОДом.


🌐 @helcode | #bash
🔥3