Docker Compose: оркестрируем многокомпонентные приложения
Ваше приложение состоит из веб-сервера, базы данных и кеша. Запускать каждый контейнер вручную - мука. Docker Compose позволяет описать всю инфраструктуру в одном файле.
Пример (docker-compose.yml):
Какие самые сложные композ-файлы Вам приходилось писать?
🌐 @helcode | #yaml
Ваше приложение состоит из веб-сервера, базы данных и кеша. Запускать каждый контейнер вручную - мука. 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):
Как использовать:
Весь WordPress и MySQL запускаются в изолированных контейнерах. После остановки данные сохраняются в volume.
🌐 @helcode | #yaml #bash
Нужно быстро протестировать плагин или тему 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? Для каких задач он подошел лучше всего?
🌐 @helcode
Вам нужно запустить код, но не хочется думать о серверах, масштабировании и обновлениях. 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 CLI использует те же права доступа, что и веб-консоль. Настройте IAM-роли правильно!
Какие ваши любимые команды AWS CLI?
🌐 @helcode | #bash
Постоянно заходить в веб-консоль 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
Пишем свою первую Lambda функцию на Python
Хотите попробовать serverless, но кажется сложным? Давайте создадим простейшую Lambda функцию, которая возвращает "Hello, World!".
🛠 Пример:
Как развернуть:
Функция получает
А вы уже пробовали Lambda? Какие функции написали?
🌐 @helcode | #python
Хотите попробовать serverless, но кажется сложным? Давайте создадим простейшую Lambda функцию, которая возвращает "Hello, World!".
🛠 Пример:
import json
def lambda_handler(event, context):
# event содержит данные запроса
name = event.get('name', 'World')
return {
'statusCode': 200,
'body': json.dumps({
'message': f'Hello, {name}!'
})
}
Как развернуть:
# Упаковываем код в zip
zip function.zip lambda_function.py
# Создаем функцию в AWS
aws lambda create-function --function-name hello-world \
--runtime python3.9 --role arn:aws:iam::123456789012:role/lambda-role \
--handler lambda_function.lambda_handler --zip-file fileb://function.zip
# Тестируем
aws lambda invoke --function-name hello-world \
--payload '{"name": "Digital Automation Lab"}' output.txt
Функция получает
event (данные запроса) и context (информация о выполнении), а возвращает ответ в определенном формате.А вы уже пробовали Lambda? Какие функции написали?
Написание Lambda функции - это как отправка письма по почте: написал, отправил, а почтальон (AWS) уже знает, куда его доставить и как обработать.
🌐 @helcode | #python
👍2❤1
Infrastructure as Code: или как управлять серверами как кодом
Вы вручную настраиваете серверы, а потом не можете воспроизвести ту же конфигурацию? IaC - это подход, при котором инфраструктура описывается в коде и разворачивается автоматически.
Аспекты:
➤ Декларативный подход - описываем ЖЕЛАЕМОЕ состояние
➤ Идемпотентность - многократное применение дает один результат
➤ Версионирование - инфраструктура в Git
Популярные инструменты:
➤ Terraform - мультиоблачный, свой язык HCL
➤ CloudFormation - только AWS, YAML/JSON
➤ Pulumi - использование реальных языков программирования
Вы уже используете IaC? Какой инструмент выбрали и почему?
🌐 @helcode
Вы вручную настраиваете серверы, а потом не можете воспроизвести ту же конфигурацию? IaC - это подход, при котором инфраструктура описывается в коде и разворачивается автоматически.
Аспекты:
➤ Декларативный подход - описываем ЖЕЛАЕМОЕ состояние
➤ Идемпотентность - многократное применение дает один результат
➤ Версионирование - инфраструктура в Git
Популярные инструменты:
➤ Terraform - мультиоблачный, свой язык HCL
➤ CloudFormation - только AWS, YAML/JSON
➤ Pulumi - использование реальных языков программирования
Вы уже используете IaC? Какой инструмент выбрали и почему?
IaC - это как рецепт в кулинарии: можно воспроизвести тот же торт сто раз, и он всегда будет одинаково вкусным. Без рецепта - как угадывать ингредиенты.
🌐 @helcode
👍2
Terraform: основные команды для управления инфраструктурой
Terraform стал стандартом для IaC. Вот шпаргалка по основным командам, которые нужно знать каждому инженеру.
Код:
Всегда запускайте
Какие самые сложные вещи вы описывали в Terraform? Базы данных, Kubernetes?
🌐 @helcode | #bash
Terraform стал стандартом для IaC. Вот шпаргалка по основным командам, которые нужно знать каждому инженеру.
Код:
# Инициализация проекта
terraform init
# Просмотр плана изменений
terraform plan
# Применение изменений
terraform apply
# Уничтожение инфраструктуры
terraform destroy
# Просмотр состояния
terraform show
# Обновление состояния
terraform refresh
Всегда запускайте
terraform plan перед apply! Это покажет, что именно изменится, и спасет от неожиданностей.Какие самые сложные вещи вы описывали в Terraform? Базы данных, Kubernetes?
Команда terraform destroy - это как красная кнопка: нажимаешь, и вся тщательно построенная инфраструктура исчезает. Страшно, но иногда очень нужно.
🌐 @helcode | #bash
🤩2❤1🔥1
Мониторим изменения в файлах inotifywait
Нужно отслеживать изменения в файлах или директориях и автоматически выполнять действия (перезагружать сервис, запускать тесты и т.д.)?
🛠 Варианты использования:
- Автоперезагрузка dev-сервера
- Синхронизация файлов при изменении
- Запуск тестов при изменении кода
🌐 @helcode | #bash
Нужно отслеживать изменения в файлах или директориях и автоматически выполнять действия (перезагружать сервис, запускать тесты и т.д.)?
inotifywait - утилита для отслеживания событий файловой системы# Установка
sudo apt install inotify-tools
# Мониторим изменения в JS файлах
inotifywait -m -e modify,create,delete --format "%w%f" ./src/*.js |
while read file; do
echo "Файл $file изменен, перезагружаем сервер..."
pkill -f "node server.js"
node server.js &
done
🛠 Варианты использования:
- Автоперезагрузка dev-сервера
- Синхронизация файлов при изменении
- Запуск тестов при изменении кода
🌐 @helcode | #bash
👍2
Анализируем логи с awk
Нужно быстро проанализировать логи и получить статистику?
Преимущества:
➤ Работает с огромными файлами
➤ Гибкие условия фильтрации
➤ Можно считать суммы, средние, группировать
🌐 @helcode | #bash
Нужно быстро проанализировать логи и получить статистику?
awk для сложной обработки текста# Топ IP-адресов в access.log
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
# Статистика HTTP-статусов
awk '{print $9}' access.log | sort | uniq -c | sort -nr
# Средний размер ответа по URL
awk '{sum[$7] += $10; count[$7]++} END {for (url in sum) print url, sum[url]/count[url]}' access.log
Преимущества:
➤ Работает с огромными файлами
➤ Гибкие условия фильтрации
➤ Можно считать суммы, средние, группировать
🌐 @helcode | #bash
👍4
Работаем с CSV в командной строке
Нужно быстро обработать CSV файл без открытия Excel?
Комбинация утилит для работы с CSV
Идеально для быстрого анализа данных, подготовки данных для скриптов
🌐 @helcode | #bash
Нужно быстро обработать CSV файл без открытия Excel?
Комбинация утилит для работы с CSV
# Установка csvkit для удобной работы
pip install csvkit
# Просмотр структуры
csvstat data.csv
# Фильтрация строк
csvgrep -c "status" -m "active" data.csv
# Выбор колонок
csvcut -c "name,email,phone" data.csv
# Сортировка
csvsort -c "date" -r data.csv
# А если нет csvkit - используем awk:
awk -F',' '$3 > 1000 {print $1 "," $3}' data.csv
Идеально для быстрого анализа данных, подготовки данных для скриптов
🌐 @helcode | #bash
👍3
Шифруем файлы с GPG
Нужно безопасно передать конфиденциальные файлы или хранить пароли?
Шифрование с помощью GPG
🛠 Лучшие практики:
➤ Используйте надежные парольные фразы
➤ Храните закрытый ключ в безопасном месте
➤ Для конфигов используйте симметричное шифрование
🌐 @helcode | #bash
Нужно безопасно передать конфиденциальные файлы или хранить пароли?
Шифрование с помощью GPG
# Генерация ключевой пары
gpg --full-generate-key
# Шифрование файла для получателя
gpg --encrypt --recipient alice@company.com secret_document.txt
# Расшифровка
gpg --decrypt secret_document.txt.gpg > decrypted.txt
# Шифрование симметричным ключом (только пароль)
gpg --symmetric --cipher-algo AES256 file.txt
🛠 Лучшие практики:
➤ Используйте надежные парольные фразы
➤ Храните закрытый ключ в безопасном месте
➤ Для конфигов используйте симметричное шифрование
🌐 @helcode | #bash
👍2
Работа с API через curl
Нужно протестировать API или автоматизировать запросы?
✅ Полезные флаги:
➤
➤
➤
🌐 @helcode | #bash
Нужно протестировать API или автоматизировать запросы?
curl с правильными заголовками и аутентификацией# Базовый GET запрос
curl -X GET "https://api.example.com/users" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN"
# POST с JSON телом
curl -X POST "https://api.example.com/users" \
-H "Content-Type: application/json" \
-d '{"name": "John", "email": "john@example.com"}'
# Загрузка файла
curl -X POST "https://api.example.com/upload" \
-F "file=@document.pdf" \
-F "description=Important document"
# Сохраняем cookies для сессии
curl -c cookies.txt -X POST "https://api.example.com/login" \
-d "username=user&password=pass"
✅ Полезные флаги:
➤
-v для verbose вывода➤
--retry 3 для повторения при ошибках➤
--max-time 10 для таймаута🌐 @helcode | #bash
👍3
Docker: оптимизация образов
Docker образы слишком большие и медленно собираются?
Многоступенчатая сборка и оптимизация слоев
🛠 Советы по оптимизации:
➤ Используйте .dockerignore
➤ Объединяйте RUN команды
➤ Копируйте requirements.txt отдельно для кеширования
➤ Используйте легковесные базовые образы (alpine, slim)
🌐 @helcode | #docker
Docker образы слишком большие и медленно собираются?
Многоступенчатая сборка и оптимизация слоев
# Многоступенчатая сборка для Python
FROM python:3.9-slim as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt
FROM python:3.9-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "app.py"]
🛠 Советы по оптимизации:
➤ Используйте .dockerignore
➤ Объединяйте RUN команды
➤ Копируйте requirements.txt отдельно для кеширования
➤ Используйте легковесные базовые образы (alpine, slim)
🌐 @helcode | #docker
👍3
Продвинутый grep с контекстом
Нужно найти ошибку в логе и понять, что происходило до/после
Экспорт результатов:
🌐 @helcode | #bash
Нужно найти ошибку в логе и понять, что происходило до/после
grep с контекстом и дополнительными флагами# Ищем ошибку с 5 строками контекста после
grep -A 5 "ERROR" application.log
# Контекст до и после
grep -B 3 -A 3 "NullPointerException" server.log
# Рекурсивный поиск с исключением директорий
grep -r "deprecated" ./src --include="*.js" --exclude-dir="node_modules"
# Поиск по шаблону в архивах
zgrep "login failed" /var/log/auth.log.*.gz
# Инвертированный поиск (строки БЕЗ шаблона)
grep -v "DEBUG" application.log
Экспорт результатов:
# Сохраняем с номерами строк
grep -n "critical" app.log > critical_errors.txt
# С цветным выводом в файл
grep --color=always "warning" app.log > warnings.txt
🌐 @helcode | #bash
👍6❤1
Как мы настраивали кеширование в боте: TTLCache, ошибки и итоговый код
Рад всех приветствовать! В недавнем посте я показывал, как кешировать запросы к медленному API в Redis. Спасибо за ваши комментарии и реакции! Что ж, выполняю обещание - делюсь нашей историей.
Как и в том примере с Redis, наша задача была проста: не дёргать постоянно одни и те же данные, если они уже были получены. Но в нашем случае речь шла о внутренних операциях бота - результатах выполнения скриптов, поисковых запросах и списке категорий. Использовать для этого отдельный Redis-сервер показалось избыточным, и мы выбрали кеширование в оперативной памяти с помощью библиотеки
Начало: идеальный план и первая ошибка...
Заранее хочу сообщить, что данный бот изначально не подразумевался, как решение для общего пользования. Это было скорее личной, удобной БД для хранения. Продолжаю повествование...
Мы обрадовались, найдя простой и элегантный инструмент -
Первый код был таким:
Ошибка №1: один кеш на все типы данных. Мы начали складывать в него и результаты скриптов, и поисковые выдачи, и списки категорий. Всё бы ничего, пока... пока мы не обновили список категорий. Новые категории не появляются, всё остается прежним после изменений. А всё потому, что бот отдавал устаревшие данные из кеша, который очищался только через час. Мы не могли просто взять и очистить весь кеш, потому что это убило бы и производительность поиска.
Решение: "разделяй и властвуй"
Стало очевидно, что нужны отдельные кеши для разных сущностей. Так мы получили контроль над каждым типом данных.
Теперь, если мы обновляем категории в базе данных, мы можем точечно очистить только
Ошибка №2: "а оно нам надо?"
Первоначально мы выставили
Проблема вот в чём: данные скриптов и категорий меняются очень редко - при обновлении функционала, то есть раз в несколько недель или месяцев. А мы заставляли память хранить их всего час и снова делать запросы к БД.
Решение: мы добавили комментарии в код, которые служат нам шпаргалкой. Теперь любой разработчик, глядя на константы, понимает: «Ага, скрипты стали реже обновляться, можно смело ставить TTL на сутки (
Финальный код и ещё один костыльный выход из ситуации
Вот наш финальный модуль
А эта функция
🌐 @helcode
Рад всех приветствовать! В недавнем посте я показывал, как кешировать запросы к медленному API в Redis. Спасибо за ваши комментарии и реакции! Что ж, выполняю обещание - делюсь нашей историей.
Как и в том примере с Redis, наша задача была проста: не дёргать постоянно одни и те же данные, если они уже были получены. Но в нашем случае речь шла о внутренних операциях бота - результатах выполнения скриптов, поисковых запросах и списке категорий. Использовать для этого отдельный Redis-сервер показалось избыточным, и мы выбрали кеширование в оперативной памяти с помощью библиотеки
cachetools.Начало: идеальный план и первая ошибка...
Заранее хочу сообщить, что данный бот изначально не подразумевался, как решение для общего пользования. Это было скорее личной, удобной БД для хранения. Продолжаю повествование...
Мы обрадовались, найдя простой и элегантный инструмент -
TTLCache. Это как словарь, который автоматически удаляет старые записи по истечении их времени жизни (TTL).Первый код был таким:
from cachetools import TTLCache
# Один кеш на всё (а кто знает, как оно себя поведёт, да?)
cache = TTLCache(maxsize=100, ttl=3600)
Ошибка №1: один кеш на все типы данных. Мы начали складывать в него и результаты скриптов, и поисковые выдачи, и списки категорий. Всё бы ничего, пока... пока мы не обновили список категорий. Новые категории не появляются, всё остается прежним после изменений. А всё потому, что бот отдавал устаревшие данные из кеша, который очищался только через час. Мы не могли просто взять и очистить весь кеш, потому что это убило бы и производительность поиска.
Решение: "разделяй и властвуй"
Стало очевидно, что нужны отдельные кеши для разных сущностей. Так мы получили контроль над каждым типом данных.
from cachetools import TTLCache
CACHE_SIZE = 500 # При увеличении скриптов установить значение ("1000" (5-10МБ RAM))
CACHE_TTL = 3600 # В случае редких изменений БД установить значение ("86400")
# Отдельные кеши
script_cache = TTLCache(maxsize=CACHE_SIZE, ttl=CACHE_TTL)
search_cache = TTLCache(maxsize=CACHE_SIZE, ttl=CACHE_TTL)
categories_cache = TTLCache(maxsize=CACHE_SIZE, ttl=CACHE_TTL)
Теперь, если мы обновляем категории в базе данных, мы можем точечно очистить только
categories_cache, не затрагивая остальные.Ошибка №2: "а оно нам надо?"
Первоначально мы выставили
CACHE_TTL = 3600 (1 час) для всего, не задумываясь о реальной частоте изменений данных.Проблема вот в чём: данные скриптов и категорий меняются очень редко - при обновлении функционала, то есть раз в несколько недель или месяцев. А мы заставляли память хранить их всего час и снова делать запросы к БД.
Решение: мы добавили комментарии в код, которые служат нам шпаргалкой. Теперь любой разработчик, глядя на константы, понимает: «Ага, скрипты стали реже обновляться, можно смело ставить TTL на сутки (
86400), чтобы еще реже ходить в базу». Костыль? Полнейший, даже не спорю. Финальный код и ещё один костыльный выход из ситуации
Вот наш финальный модуль
cache.py, который живет в проекте:from cachetools import TTLCache
CACHE_SIZE = 500 # при увеличении скриптов установить значение ("1000" (5-10МБ RAM))
CACHE_TTL = 3600 # в случае редких изменений БД установить значение ("86400")
script_cache = TTLCache(maxsize=CACHE_SIZE, ttl=CACHE_TTL)
search_cache = TTLCache(maxsize=CACHE_SIZE, ttl=CACHE_TTL)
categories_cache = TTLCache(maxsize=CACHE_SIZE, ttl=CACHE_TTL)
def clear_all_caches():
script_cache.clear()
search_cache.clear()
categories_cache.clear()
А эта функция
clear_all_caches - спасение на тот случай, если нужно сбросить всё и сразу (например, после глобального обновления данных). Фактически, после крупных изменений, одна кнопка админском меню бота - и всё сбрасывается в ноль.🌐 @helcode
👍4❤1
Стоит, наверное, подвести небольшие итоги:
1. Инструмент:
2. Тактика: не используйте один кеш для разнородных данных. Разделение кешей дает гибкость.
3. Время жизни: всегда анализируйте, как часто меняются ваши данные. TTL в 5 минут, час и сутки - это три огромные разницы.
4. Память: не забывайте следить за размером кеша (
Наш путь показал, что даже в такой, казалось бы, простой задаче, как кеширование, есть над чем подумать. Стоило ли вообще добавлять кеширование при малом количестве пользователей? Сомневаюсь. Зачем тогда добавлять? Залог на будущее, попытка просчитать всё до запуска и всё в этом духе. На бота имеются планы, готовлю новый и достаточно крупный пак скриптов под все языки. Надеюсь, будет полезно)
А у вас были интересные кейсы с кешированием? Сталкивались с неочевидными ошибками? Делитесь опытом в комментариях!
🌐 @helcode
1. Инструмент:
TTLCache - действительно хорошее решение для in-memory кеширования внутри приложения. Просто, эффективно, легко внедряется.2. Тактика: не используйте один кеш для разнородных данных. Разделение кешей дает гибкость.
3. Время жизни: всегда анализируйте, как часто меняются ваши данные. TTL в 5 минут, час и сутки - это три огромные разницы.
4. Память: не забывайте следить за размером кеша (
maxsize), особенно если храните много крупных объектов.Наш путь показал, что даже в такой, казалось бы, простой задаче, как кеширование, есть над чем подумать. Стоило ли вообще добавлять кеширование при малом количестве пользователей? Сомневаюсь. Зачем тогда добавлять? Залог на будущее, попытка просчитать всё до запуска и всё в этом духе. На бота имеются планы, готовлю новый и достаточно крупный пак скриптов под все языки. Надеюсь, будет полезно)
А у вас были интересные кейсы с кешированием? Сталкивались с неочевидными ошибками? Делитесь опытом в комментариях!
🌐 @helcode
👍3
Дрессируем терминал: история о том, как я приручил автодополнение
Представьте, Вы печатаете длинные пути вручную, как средневековый переписчик. А ведь терминал можно научить понимать вас с полуслова!
Живой пример:
"Раньше я тратил 10 секунд на ввод
Твоя задача: Добавь эти настройки и почувствуй себя волшебником терминала! ✨
🌐 @helcode | #bash
Представьте, Вы печатаете длинные пути вручную, как средневековый переписчик. А ведь терминал можно научить понимать вас с полуслова!
# Волшебная строка в ~/.inputrc
echo "set show-all-if-ambiguous on" >> ~/.inputrc
echo "set completion-ignore-case on" >> ~/.inputrc
# Теперь работает:
cd /u/sh/app [TAB] → cd /usr/share/applications
git ch[TAB] → git checkout
docker p[TAB] → docker ps
Живой пример:
"Раньше я тратил 10 секунд на ввод
cd /var/log/nginx/. Теперь просто cd /v/l/n/[TAB] — и я уже там! За день экономлю 5-10 минут чистого времени."Твоя задача: Добавь эти настройки и почувствуй себя волшебником терминала! ✨
🌐 @helcode | #bash
👍6❤4
Детективная история: как я нашел утечку памяти с помощью /proc
Сервер медленно умирал. Оперативка исчезала как деньги перед зарплатой. Виновник - загадочный процесс, пожирающий память.
Оказалось, скрипт на Python бесконечно добавлял данные в список и никогда их не очищал.
🌐 @helcode | #bash
Сервер медленно умирал. Оперативка исчезала как деньги перед зарплатой. Виновник - загадочный процесс, пожирающий память.
# Расследование начинается:
cat /proc/meminfo # Общая картина преступления
ps aux --sort=-%mem | head -10 # Подозреваемые процессы
# Глубокий анализ подозреваемого:
ls -la /proc/1234/fd # Какие файлы открыл процесс?
cat /proc/1234/status # Подробное досье
cat /proc/1234/maps # Карта памяти процесса
Оказалось, скрипт на Python бесконечно добавлял данные в список и никогда их не очищал.
lsof -p 1234 показал тысячи открытых файловых дескрипторов./proc - это детективное агентство для расследования проблем с процессами.🌐 @helcode | #bash
🔥5👎1
Машина времени для данных: история о том, как btrfs спас мой проект
Сценарий: "Я случайно удалил папку с недельной работой. Руки дрожали, пот выступил на лбу. Но потом я вспомнил про btrfs..."
Результат: все данные вернулись за 2 секунды! Теперь я делаю снапшоты перед любыми рискованными операциями.
Твоя очередь: если используешь btrfs - начни делать снапшоты. Если нет - возможно, пора перейти? 🕰
🌐 @helcode
Сценарий: "Я случайно удалил папку с недельной работой. Руки дрожали, пот выступил на лбу. Но потом я вспомнил про btrfs..."
# Создаем снапшот:
btrfs subvolume snapshot /data /data/snapshots/backup_$(date +%Y%m%d)
# Список снапшотов:
btrfs subvolume list /data
# Возвращаемся во времени:
btrfs subvolume delete /data/work # Удаляем испорченное
btrfs subvolume snapshot /data/snapshots/backup_20240115 /data/work
Результат: все данные вернулись за 2 секунды! Теперь я делаю снапшоты перед любыми рискованными операциями.
Твоя очередь: если используешь btrfs - начни делать снапшоты. Если нет - возможно, пора перейти? 🕰
🌐 @helcode
👍2🗿2
Снайперская точность: как научиться убивать процессы по шаблону
Можно использовать
История из жизни: на продакшн-сервере
Всегда проверяй что убиваешь:
🌐 @helcode | #bash
Можно использовать
killall как дробовик - стрелять по площади. Но зачастую это будет опасно:# Дробовик (опасно!):
killall python # Убьет ВСЕ python процессы
# Более точно:
pkill -f "python data_processor.py" # Только конкретный скрипт
# Еще точнее — с проверкой:
pgrep -f "python data_processor.py" | xargs kill -TERM # Вежливая просьба :)
sleep 5
pgrep -f "python data_processor.py" | xargs kill -KILL # Принудительно :(
История из жизни: на продакшн-сервере
killall java остановил не только проблемное приложение, но и три критичных сервиса. Минутная паника научила меня точности...Всегда проверяй что убиваешь:
pgrep -fl "pattern" покажет список целей.🌐 @helcode | #bash
🔥7👌2