Docker WSL: Очистка и оптимизация дисков

Docker Desktop на Windows использует WSL2 с динамическими VHDX-файлами. Они растут, когда добавляются образы/контейнеры, но не сжимаются автоматически при удалении. Результат: диск C: заполняется, хотя docker system df показывает свободное место. 💡 Решение: ручная оптимизация VHDX через PowerShell + утилита Docker. 📦 Скрипт очистки Создание файла # Файл: $HOME\Scripts\docker-clear-wsl.ps1 $script = @' $LOCAL = "$env:LOCALAPPDATA\Docker\wsl" $VHD1 = Join-Path $LOCAL "disk\docker_data.vhdx" $VHD2 = Join-Path $LOCAL "main\ext4.vhdx" # 1. Очистка Docker docker system prune -f # 2. Возврат места через официальный инструмент docker run --rm --privileged --pid=host docker/desktop-reclaim-space docker rmi docker/desktop-reclaim-space -f # 3. Остановка Docker Desktop Get-Process -Name "Docker Desktop","com.docker.backend","com.docker.build" ` -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue # 4. Выключение WSL wsl --shutdown # 5. Оптимизация VHDX-файлов (сжатие) if (Test-Path $VHD1) { Optimize-VHD -Path $VHD1 -Mode Full } if (Test-Path $VHD2) { Optimize-VHD -Path $VHD2 -Mode Full } # 6. Запуск Docker Desktop Start-Sleep -Seconds 2 Start-Process -FilePath "$env:ProgramFiles\Docker\Docker\Docker Desktop.exe" ` -ErrorAction SilentlyContinue '@ $script | Out-File -FilePath "$HOME\Scripts\docker-clear-wsl.ps1" -Encoding UTF8 Запуск # От имени Администратора (требуется для Optimize-VHD) powershell.exe -ExecutionPolicy Bypass -File "$HOME\Scripts\docker-clear-wsl.ps1" 🔍 Как это работает Шаг Команда Что делает 1 docker system prune -f Удаляет остановленные контейнеры, неиспользуемые образы, кэш 2 docker/desktop-reclaim-space Официальный инструмент Docker для возврата места в WSL2 3 Stop-Process Корректно останавливает Docker Desktop (иначе VHDX заблокирован) 4 wsl --shutdown Полностью выключает WSL, освобождая файлы для оптимизации 5 Optimize-VHD -Mode Full Сжимает VHDX-файлы, возвращая место на хосте 6 Start-Process Запускает Docker Desktop обратно Обоснование: ...

17 мар. 2026 · 3 минуты · 568 слов · Potato Energy Team, ponfertato

GitHub CLI: Массовое удаление старых задач

В долгосрочных проектах накапливаются устаревшие задачи: баги для старых версий, неактуальные фичи, тестовые тикеты. Ручное удаление занимает много времени. Скрипт автоматически находит и удаляет (или помечает) старые задачи по заданным меткам. 💡 Скрипт использует dry-run по умолчанию - сначала показывает, что будет удалено, без реального удаления. 📦 Скрипт: delete-issues.sh Полный код #!/bin/bash # Удаление старых GitHub Issues по меткам и дате # Использование: ./delete-issues.sh [--execute] set -euo pipefail # === НАСТРОЙКИ === REPO="owner/repo" # Репозиторий в формате owner/repo LABELS='label1,label2,label3' # Метки для фильтрации (через запятую) CUTOFF="2025-12-31T23:59:59Z" # Удалять задачи, созданные ДО этой даты DRY_RUN=true # true = только показать, false = реально удалить # Парсинг аргументов if [[ "${1:-}" == "--execute" ]]; then DRY_RUN=false echo "⚠️ Режим: РЕАЛЬНОЕ УДАЛЕНИЕ" else echo "ℹ️ Режим: DRY RUN (ничего не будет удалено)" fi echo "🔍 Поиск задач в $REPO с метками: $LABELS, созданных до $CUTOFF" echo "---" # Получение и фильтрация задач gh issue list --repo "$REPO" --state all --limit 1000 \ --json number,title,createdAt,labels,url | \ jq -r --arg labels "$LABELS" --arg cutoff "$CUTOFF" ' ($labels | split(",")) as $label_array | .[] | select(.createdAt < $cutoff) | select(.labels | map(.name) | any(. as $l | $label_array | index($l))) | "\(.number)|\(.title)|\(.url)" ' | \ while IFS='|' read -r number title url; do if [[ "$DRY_RUN" == "true" ]]; then echo "[DRY RUN] ##$number - $title" echo " $url" else echo "🗑 Удаление ##$number - $title" gh issue delete "$REPO" "$number" --yes sleep 1 # Небольшая пауза, чтобы не превысить rate limit fi done echo "---" echo "✅ Готово" Установка зависимостей # GitHub CLI # Windows (winget): winget install GitHub.cli # Linux (Ubuntu/Debian): sudo apt install gh # macOS (Homebrew): brew install gh # Авторизация gh auth login # jq (JSON-процессор) # Windows (winget): winget install jq.jq # Linux: sudo apt install jq # macOS: brew install jq Запуск # Сделать скрипт исполняемым chmod +x delete-issues.sh # DRY RUN (безопасный режим - только показать) ./delete-issues.sh # РЕАЛЬНОЕ УДАЛЕНИЕ (добавить флаг --execute) ./delete-issues.sh --execute 🔍 Как это работает Пошаговый разбор Шаг Команда Что делает 1 gh issue list --json ... Получает задачи в формате JSON с полями: номер, заголовок, дата, метки, ссылка 2 jq -r ... Фильтрует: дата < cutoff И есть хотя бы одна из указанных меток 3 while read ... Обрабатывает каждую найденную задачу 4 gh issue delete Удаляет задачу (только если DRY_RUN=false) Логика jq-фильтра ($labels | split(",")) as $label_array | # Разбиваем строку меток в массив .[] | # Для каждой задачи select(.createdAt < $cutoff) | # Только если создана до cutoff select( .labels | map(.name) | # Получаем список имён меток any(. as $l | $label_array | index($l)) # Есть ли совпадение с нашими метками ) | "\(.number)|\(.title)|\(.url)" # Форматируем вывод Обоснование: ...

17 мар. 2026 · 4 минуты · 826 слов · Potato Energy Team, ponfertato

Docker: Автоматическое выключение по расписанию

Для домашних серверов и тестовых сред актуальна задача экономии ресурсов: ночью или в нерабочее время контейнеры можно останавливать, а систему - выключать. Это руководство описывает безопасный метод с сохранением состояния и автоматическим восстановлением. 💡 Метод подходит для OrangePI, Raspberry Pi, старых ПК и любых систем, где важна экономия энергии. 📦 Скрипт остановки контейнеров и выключения Создание скрипта # Файл: /usr/local/bin/stop_containers_and_shutdown.sh cat > /usr/local/bin/stop_containers_and_shutdown.sh << 'EOF' #!/bin/bash # # Скрипт сохраняет ID запущенных контейнеров, # останавливает их и инициирует завершение работы системы. # CONTAINERS_FILE="/etc/active_containers.txt" echo "=== $(date '+%Y-%m-%d %H:%M:%S') ===" echo "Запуск скрипта остановки контейнеров и выключения системы" # Получаем список запущенных контейнеров (по ID) RUNNING_CONTAINERS=$(docker ps -q) if [ -n "${RUNNING_CONTAINERS}" ]; then echo "Сохранение списка запущенных контейнеров в ${CONTAINERS_FILE}" echo "${RUNNING_CONTAINERS}" > "${CONTAINERS_FILE}" docker stop ${RUNNING_CONTAINERS} echo "Контейнеры остановлены." else echo "Нет запущенных контейнеров." [ -f "${CONTAINERS_FILE}" ] && rm -f "${CONTAINERS_FILE}" fi sleep 10 echo "Завершение работы системы." /sbin/shutdown -h now EOF Сделать исполняемым chmod +x /usr/local/bin/stop_containers_and_shutdown.sh Как работает Шаг Описание docker ps -q Получает ID всех запущенных контейнеров > /etc/active_containers.txt Сохраняет список для восстановления docker stop Корректно останавливает контейнеры (SIGTERM) sleep 10 Даёт время на завершение операций shutdown -h now Выключает систему Обоснование: ...

17 мар. 2026 · 4 минуты · 817 слов · Potato Energy Team, ponfertato

Docker Volumes: Бэкап и миграция

Docker Volumes хранят данные независимо от контейнеров, но требуют отдельного подхода к резервному копированию. Это руководство описывает универсальные методы работы с volumes на примере популярных сервисов. 💡 Имена volumes в примерах следует заменить на свои. Методы применимы к любым контейнерам. 📦 Бэкап volumes Через docker-volume-backup (рекомендуется) docker run --rm \ -v portainer_data:/backup/portainer_data \ -v postgres_data:/backup/postgres_data \ -v redis_data:/backup/redis_data \ -v /opt/docker/backup:/archive \ --entrypoint backup \ offen/docker-volume-backup:v2 Параметры: Параметр Описание -v <volume>:/backup/<name> Маппинг volume в директорию бэкапа -v /opt/docker/backup:/archive Куда сохранять архив на хосте --entrypoint backup Запускает режим бэкапа --rm Удаляет контейнер после завершения Преимущества метода: ...

16 мар. 2026 · 3 минуты · 1 слово · Potato Energy Team, ponfertato

OpenWRT: Продвинутая настройка роутера

Практическое руководство по настройке OpenWRT для продвинутого домашнего использования. Рассматриваются конфигурации, расширяющие функциональность роутера: фильтрация трафика на уровне DNS, безопасный удалённый доступ через WireGuard, мониторинг метрик и автоматические уведомления. 💡 Все чувствительные данные заменены на <...>. Следует подставить свои значения. 📦 Установка пакетов opkg update # Мониторинг: prometheus exporter + модули opkg install \ prometheus-node-exporter-lua \ prometheus-node-exporter-lua-nat_traffic \ prometheus-node-exporter-lua-netstat \ prometheus-node-exporter-lua-openwrt \ prometheus-node-exporter-lua-wifi \ prometheus-node-exporter-lua-wifi_stations # WireGuard: ядро + утилиты + LuCI opkg install \ kmod-wireguard \ wireguard-tools \ luci-proto-wireguard # DNS over HTTPS opkg install https-dns-proxy # Утилиты для отладки opkg install curl jq tmux htop Назначение: ...

16 мар. 2026 · 7 минут · 1362 слова · Potato Energy Team, ponfertato

OrangePI: Восстановление и миграция данных

OrangePI и другие ARM-одноплатники часто используют eMMC или SD-карты с ограниченным ресурсом записи. Со временем накопитель заполняется, деградирует или выходит из строя. Эта статья описывает метод восстановления данных и миграции на внешний носитель (USB SSD/HDD) через chroot-окружение. 💡 Метод универсален: подходит для OrangePI, Raspberry Pi, NanoPi и других ARM-систем. 📦 Подготовка Что потребуется Компонент Требования USB-накопитель SSD/HDD, объём ≥ данных на eMMC Live-образ Любой Linux с поддержкой ARM (опционально) Доступ root или sudo, физический доступ к плате Сеть Ethernet или WiFi (для удалённого доступа) Проверка подключённых накопителей # Показать все MMC-устройства (eMMC, SD-карта) ls /dev/mmc* # Показать все блочные устройства lsblk # Показать разделы и точки монтирования df -h Ожидаемый вывод: ...

16 мар. 2026 · 4 минуты · 805 слов · Potato Energy Team, ponfertato