Перейти к основному содержимому

monolith

monolith — компактный CLI-инструмент, написанный на Rust, для сохранения веб-страницы в один самодостаточный HTML-файл со всеми встроенными ресурсами (CSS, изображениями, шрифтами, JS). Альтернатива SingleFile для командной строки и скриптов.

Сайт: github.com/Y2Z/monolith

Зачем нужен​

Когда нужна одна страница без зависимостей — одним файлом, без сетевых запросов, без сюрпризов с CDN-блокировками. Главные отличия от SingleFile:

  • Чистый CLI — без браузерного расширения, без JavaScript-движка.
  • Не выполняет JS — статичный снимок HTML в момент загрузки.
  • Очень быстрый — написан на Rust, обрабатывает страницу за секунды.
  • Минимальные зависимости — один бинарник.

Где незаменим:

  • Скрипты и автоматизация — без браузера.
  • Docker-окружения — alpine-образ с monolith ≈ 5 МБ.
  • Серверы без GUI — крошечный размер и нулевые зависимости.
  • Быстрые разовые задачи — «сохрани эту страницу одной командой».

Возможности​

  • Один файл — все CSS, изображения, шрифты, JS inline.
  • Опциональное удаление:
    • JavaScript (--no-js).
    • Изображений (--no-images).
    • Видео/аудио (--no-audio, --no-video).
    • CSS (--no-css).
  • Base64-кодирование ресурсов в HTML.
  • Извлечение и замена — -e (CSS-блок из внешнего файла) и -r (replace string).
  • User-Agent настраивается.
  • Cookies через заголовки.
  • HTTP прокси.
  • Output в файл или stdout для пайпов.
  • TUI-режим — интерактивное сохранение в терминале (опционально).
  • HTML-санитизация — удаление опасных элементов (-s).
  • Кросс-компиляция — Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD, Solaris.

Когда использовать​

✅ Подходит для:

  • Сохранения одной страницы в скрипте или cron-задаче.
  • Server-side рендеринга без headless-браузера.
  • CI/CD — сохранение отчётов, документации, выгрузок.
  • Docker — alpine-контейнер с monolith.
  • Быстрой обработки списка URL в bash-пайплайне.

❌ Не подходит для:

  • Современных SPA с обязательным JS (React, Vue без SSR) — страница будет пустой каркас.
  • Сайтов с защитой от ботов (Cloudflare, Incapsula) — нет headless-браузера для обхода.
  • Страниц за авторизацией — поддержка cookies ограничена.
  • Сложных медиа (видео-плееры, интерактивные графики) — сохраняется как есть, без интерактива.

Установка​

Через пакетные менеджеры​

# macOS
brew install monolith

# Debian/Ubuntu (AUR или скачать .deb)
# https://github.com/Y2Z/monolith/releases

# Arch
yay -S monolith
# или
sudo pacman -S monolith

# Nix
nix-env -i monolith

# FreeBSD
pkg install monolith

Cargo (из исходников)​

cargo install monolith

Готовые бинарники​

# Linux x86_64
curl -L https://github.com/Y2Z/monolith/releases/latest/download/monolith-linux-x86_64.tar.gz \
| tar -xz -C /usr/local/bin/ monolith
chmod +x /usr/local/bin/monolith

Docker​

docker run --rm -v $(pwd):/data ghcr.io/y2z/monolith \
https://example.com > /data/page.html

Использование​

Базовая команда​

# В файл
monolith https://example.com > page.html

# Или с -o
monolith -o page.html https://example.com

Удалить JavaScript​

monolith --no-js https://example.com > page.html

Полезно для: очистки от трекеров, экономии места, страниц без полезного JS.

Удалить изображения​

monolith --no-images https://example.com > page.html

Удалить всё «тяжёлое» для текстового архива​

monolith --no-js --no-images --no-video --no-audio --no-css \
https://example.com > page-text.html

Останется чистый текст со встроенными шрифтами и базовой вёрсткой.

Cookies​

monolith -c "session=abc123; auth=xyz789" https://example.com

User-Agent​

monolith -u "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36" \
https://example.com

Через прокси​

monolith --proxy-host 127.0.0.1 --proxy-port 8080 https://example.com

HTML-санитизация (удалить <script>, <iframe> и т.д.)​

monolith -s https://example.com > clean.html

Заменить строку в HTML (например, убрать трекеры)​

monolith -r "google-analytics.com" "blocked.local" https://example.com

Извлечь внешний CSS и заменить его inline-блоком​

monolith -e "https://example.com/style.css" -r "stylesheet-link" "inline-style" \
https://example.com

Batch-обработка списка URL​

# urls.txt — один URL на строку
while read url; do
filename=$(echo "$url" | sed 's|https://||;s|/|_|g').html
monolith "$url" > "$filename"
done < urls.txt

Сохранение в stdout для пайпа​

# Передать в gzip, загрузить по S3, отправить в архив
monolith https://example.com | gzip > page.html.gz
monolith https://example.com | aws s3 cp - s3://my-bucket/page.html

Конфигурация​

monolith намеренно минималистичен — конфиг-файла нет. Все настройки через CLI-флаги.

Полный список опций:

monolith --help
ФлагОписание
-o, --output <file>Сохранить в файл
-u, --user-agent <ua>User-Agent
-c, --cookie <cookies>Cookies (header формат)
--proxy-host, --proxy-portПрокси
--timeout <seconds>Таймаут HTTP
--no-cssУдалить CSS
--no-jsУдалить JavaScript
--no-imagesУдалить изображения
--no-videoУдалить видео
--no-audioУдалить аудио
--no-fontsУдалить шрифты
--no-framesУдалить iframe
-i, --isolateИзолировать страницу (CSS-неймспейсы)
-s, --sanitizeУдалить потенциально опасные элементы
-e, --extract <url>Извлечь ресурс, заменить его в HTML
-r, --replace <from> <to>Заменить строку в HTML
-t, --transform <rules>Трансформации (CSS/JS)
-a, --allow-attributesРазрешить определённые HTML-атрибуты
-b, --base-url <url>Базовый URL для относительных путей
-l, --language <code>Accept-Language
-k, --insecureИгнорировать TLS-ошибки

Сравнение с другими инструментами​

ИнструментЯзыкJSCLIРасширениеСкорость
monolithRust❌✅❌⚡ Очень быстро
SingleFileJavaScript✅⚠️✅🟡 Средне
ObeliskGo❌✅❌⚡ Быстро
monolith (Python)Python❌✅❌🟡 Медленнее
HTTrackC❌✅❌ GUI🟡 Медленно (но с рекурсией)
MHTML (Chrome встроенный)—✅❌✅⚡ Встроенный

Когда monolith лучше всех​

  • Нужен один бинарник без зависимостей (≈ 5 МБ).
  • Скрипт на сервере без GUI и без Node.js.
  • Хочется минимальный, предсказуемый результат — без JS-рендера.
  • Docker-контейнер минимального размера.

Когда лучше SingleFile​

  • Страница с обязательным JS (SPA, динамическая загрузка).
  • Нужно расширение браузера для интерактивной работы.
  • Хочется точное соответствие тому, что видит пользователь.

Когда лучше Obelisk​

  • Нужен Go в стеке (единый язык).
  • Хочется API/библиотеку для интеграции.

Best practices​

1. Всегда удаляйте JS для долгосрочного хранения​

monolith --no-js https://example.com > archive/page.html

JavaScript — главный источник нестабильности архивов: ссылки CDN умирают, API меняются, рекламные скрипты блокируются.

2. Используйте в пайплайнах с другими инструментами​

# Сохранить страницу + сжать + положить в WARC
monolith --no-js https://example.com | \
gzip > /tmp/page.html.gz

warc-tools -i /tmp/page.html.gz -o archive.warc.gz

3. Указывайте осмысленный User-Agent​

monolith -u "Mozilla/5.0 (compatible; RuarxiveBot/1.0; +https://ruarxive.org)" URL

4. Таймаут обязателен​

monolith --timeout 30 URL

Без таймаута может «висеть» на медленных ответах.

5. Для массовых выгрузок — параллелизм​

# 4 параллельных процесса
cat urls.txt | xargs -n 1 -P 4 -I {} \
sh -c 'monolith "$1" > "out/$(echo $1 | tr / _).html"' _ {}

6. Валидируйте выход​

# Проверить, что HTML не пустой и содержит ожидаемое
monolith https://example.com > page.html
test -s page.html && grep -q "<title>" page.html && echo "OK"

Ограничения​

  • Нет JavaScript-рендера — современные SPA сохранятся пустыми.
  • Нет рекурсивного обхода — одна страница за раз.
  • Нет браузерной авторизации — cookies передаются вручную.
  • Не обходит Cloudflare и подобные — нужен прокси с реальным браузером.
  • Большие страницы (несколько МБ) могут съесть память.
  • Бинарные форматы (PDF, видео) сохраняются как base64 в HTML — непрактично.
  • Один URL за раз — для массовых выгрузок нужен wrapper-скрипт.

Ресурсы​

Связанные материалы​