Из недр картофельного ядра 🥔⚙️

Основные направления

#android   → Android без лишнего крахмала: Shizuku, Obtainium, OS-фиксы, автоматизация
#docker    → Контейнеры, которые не развариваются: оркестрация, бэкапы, оптимизация
#git       → Контроль версий без комков: от submodule до GitHub CLI
#gpt       → AI в инфраструктуре: умные помощники, автоматизация, эксперименты
#linux     → Системы, которые работают: NixOS, ARM, восстановление, тонкая настройка
#mesh      → Своя сеть без интернета: LoRa, Meshtastic, Reticulum, приватность
#openwrt   → Роутеры с характером: фильтрация, WireGuard, мониторинг
#windows   → Гибридные решения: WSL, OpenSSH, интеграция с экосистемой

🥔 Картофель - это не просто овощ. Это состояние души.
А хороший код - это не просто работа. Это искусство.

Следуйте за нами:
VK | MAX | Steam | RSS

NixOS: Запуск «чужих» программ через Distrobox

Иногда на NixOS нужно запустить программу, которая есть только для Ubuntu/Debian или распространяется в виде .deb/.iso. Distrobox позволяет запустить её в контейнере, но с интеграцией в систему хоста - как нативное приложение. 💡 Метод работает на любом дистрибутиве с установленным Nix. 📦 Создание контейнера # Создать контейнер с пробросом нужных директорий nix shell nixpkgs#distrobox --command distrobox create \ --image ubuntu:20.04 \ --name <container-name> \ --volume "<volume_pts>:/dev/pts" \ --volume "<volume_journal>:/var/log/journal" \ --home "$HOME/<container-name>-home" Параметры: ...

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

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 минуты · 614 слов · 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 · 5 минут · 889 слов · 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 · 5 минут · 858 слов · 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 · 4 минуты · 667 слов · Potato Energy Team, ponfertato

Git Submodules: Шпаргалка

Подмодуль - это ссылка на другой Git-репозиторий внутри вашего проекта. Удобно, когда нужно использовать внешнюю библиотеку или общий код, но держать его в отдельном репозитории. 💡 Подмодуль хранит не код, а ссылку на конкретный коммит внешнего репозитория. Добавить подмодуль # Добавить репозиторий как подмодуль в указанную папку git submodule add <URL> <путь/куда/положить> # Пример git submodule add https://github.com/luizdepra/hugo-coder.git themes/hugo-coder # Зафиксировать изменения git commit -m "Add submodule: themes/hugo-coder" git push После этого в проекте появятся: ...

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

Git: Установка и настройка

Git - система контроля версий. Сохраняет историю изменений кода, позволяет работать в команде и откатывать ошибки. 💡 Установил один раз - пользуешься годами. Установка Windows Способ 1: Официальный установщик (рекомендуется) Скачай с git-scm.com Запусти установщик, оставляй настройки по умолчанию Важно: на шаге “Adjusting your PATH” выбери Git from the command line and also from 3rd-party software Способ 2: Через Winget (PowerShell) winget install Git.Git Способ 3: Через Chocolatey choco install git -y Linux Ubuntu / Debian ...

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