Копирует любой сайт на Framer в статическую папку — готовую к заливке на любой хостинг
🇷🇺 Русский · 🇬🇧 English · 🇨🇳 中文
| 🌐 Любой Framer-сайт | вставляете URL — получаете папку с рабочим сайтом |
| 🧹 Чистая копия | панели редактора Framer и промо-бейджи («Made in Framer», «Buy template», «Remix», «from $99») вырезаны |
| 🔌 Полностью автономно | ноль внешних запросов, все ассеты локальные |
| 🖱 Живая копия | Framer-гидратация и анимации работают, ничего не белеет |
| 📦 ZIP в один клик | готовая папка для заливки на хостинг |
| 👀 Встроенный предпросмотр | каждый клон открывается в браузере прямо из панели |
| 💾 Не падает на заполненном диске | краулинг идёт в том Docker, обходя порог 99% занятого места |
# 1. Docker (macOS: OrbStack — быстрее и легче Docker Desktop)
brew install orbstack && open -a OrbStack
# Linux: sudo apt install docker.io
# 2. Проект
git clone https://github.com/robofighter/site-copier.git
cd site-copier
# 3. Образ краулера Browsertrix — ОБЯЗАТЕЛЬНО (подробнее в разделе ниже)
docker pull webrecorder/browsertrix-crawler:1.15.0
# 4. Панель (порт по умолчанию 8200, можно свой: PORT=9000)
python3 server.py
# 5. Открыть в браузере → http://127.0.0.1:8200Дальше всё через панель: URL → «Скопировать сайт» → дождаться «готово» → «Открыть» / «Скачать ZIP».
Почему образ — обязательный шаг. Это не вспомогательный софт, а сам краулер: без него система физически не может работать — задания падают с ошибкой «Не удалось скачать образ». Панель попробует скачать образ автоматически при первом задании (индикатор покажет «образ не скачан», если не выйдет), но лучше скачать сразу, чтобы первое задание не ждало загрузку гигабайта.
Что это. webrecorder/browsertrix-crawler:1.15.0 — официальный контейнер
проекта Browsertrix (Webrecorder):
внутри — Chromium и краулер, который обходит сайт в реальном браузере.
Именно он запускается на каждом задании (crawler.py → docker run), поэтому
Docker — не опция, а необходимость.
| Параметр | Значение |
|---|---|
| Образ | webrecorder/browsertrix-crawler:1.15.0 |
| Размер (сжатый) | ~1.03 ГБ (на диске со слоями ~3.6 ГБ) |
| Архитектура | arm64 (Apple Silicon) / amd64 — Docker сам выберет нужную |
| Зачем | обход сайта в браузере + запись WACZ |
| Без него | задания падают с «Не удалось скачать образ», панель показывает «образ не скачан» |
Скачать образ
docker pull webrecorder/browsertrix-crawler:1.15.0Проверить, что образ на месте:
docker images webrecorder/browsertrix-crawler
# или детально:
docker image inspect webrecorder/browsertrix-crawler:1.15.0Панель тоже проверяет образ сама — индикатор в правом верхнем углу
(«Docker готов» / «образ не скачан») и GET /api/status.
Автоматическая загрузка
Если образ не найден при запуске задания, crawler.py сам выполнит
docker pull и продолжит работу. Удобно, но первый старт замедлится на время
загрузки — поэтому ручной docker pull заранее рекомендуется.
Офлайн / другой компьютер: сохранить и загрузить образ архивом
# сохранить в файл (на машине с интернетом)
docker save webrecorder/browsertrix-crawler:1.15.0 | gzip > browsertrix-crawler.tar.gz
# загрузить из файла (на машине без интернета)
gunzip -c browsertrix-crawler.tar.gz | docker loadЕсли docker pull падает
- Проверьте, что Docker запущен (
docker info) и есть интернет. - При корпоративном прокси настройте
HTTP_PROXY/HTTPS_PROXYдля демона Docker (в настройках OrbStack / Docker Desktop). - Освободите место: на диске должно быть ~4 ГБ.
- Альтернатива — перенос архива образа с другого компьютера (см. выше).
Развёртывание на сервере / VPS
# на сервере с Linux
sudo apt update && sudo apt install -y docker.io python3
sudo usermod -aG docker $USER && newgrp docker
git clone https://github.com/robofighter/site-copier.git && cd site-copier
docker pull webrecorder/browsertrix-crawler:1.15.0 # образ краулера — обязательно
PORT=8200 nohup python3 server.py > panel.log 2>&1 &
# панель доступна на http://<ip-сервера>:8200Git: обновление проекта до последней версии
cd site-copier
git pull # забрать обновления с GitHub
docker pull webrecorder/browsertrix-crawler:1.15.0 # если обновился тег образаПапки jobs/, previews/, crawls/ в git не идут (см. .gitignore) — при
git pull ваши задания и копии сайтов не затрагиваются.
flowchart LR
A["🌐 URL сайта"] --> B["🐳 Browsertrix Crawler<br/>в Docker-томе"]
B -->|"📦 WACZ"| C["⚙️ convert.py"]
C --> D["📁 site/<br/>статическая папка"]
C --> E["🗜 site.zip"]
D --> F["🚀 ЛЮБОЙ хостинг"]
- Краулинг (
crawler.py) — Browsertrix обходит сайт в браузере и складывает WACZ. - Конвертация (
convert.py) — WACZ превращается в папку: URL переписываются в локальные, в страницы внедряется шимnew URL()(без него Framer-гидрация падает и сайт остаётся белым), вырезаются панели Framer, промо-бейджи удаляются MutationObserver'ом уже после гидрации. - Готово —
site/заливается на хостинг как есть, плюс ZIP для скачивания.
- Новый сайт — URL, область обхода (host / prefix / domain / page), лимит страниц, число браузеров, лимит времени, поведения, свои CSS-селекторы для скрытия элементов
- Задания — статусы и стадии
queued → crawl → convert → done, живой журнал - Предпросмотр — каждая копия открывается на своём мини-сервере, как при реальном
размещении (корне-абсолютные
/assets/...работают корректно) - Скачать ZIP · Перечитать — пересканирование
jobs/без перезапуска панели
| Что | Зачем | Обязательно |
|---|---|---|
| Docker (OrbStack / Docker Desktop / docker-ce) | Запуск краулера в контейнере | ✅ |
Образ webrecorder/browsertrix-crawler:1.15.0 |
Сам краулер — без него задания не работают (подробнее) | ✅ |
| Python 3.8+ | Панель и конвертер | ✅ |
| pip-пакеты | не нужны — весь код на стандартной библиотеке | — |
| Node.js + Playwright | только для авто-проверки клонов (внешние скрипты) | ⬜ опционально |
Переменные окружения
PORT— порт панели (по умолчанию8200)BTRIX_IMAGE— тег образа краулера (по умолчаниюwebrecorder/browsertrix-crawler:1.15.0)
site-copier/
├── server.py # веб-панель: задания, статусы, ZIP, предпросмотр, API
├── crawler.py # обёртка над Browsertrix Crawler в Docker (краулинг в том)
├── convert.py # WACZ → статическая папка (переписывание URL, чистка)
├── warcutil.py # разбор WACZ/WARC, извлечение записей
├── static/ # интерфейс панели (index.html, app.js, style.css)
├── docs/ # скриншоты
└── jobs/ # артефакты заданий (в git не идёт)
Эндпоинты панели
| Метод | Путь | Назначение |
|---|---|---|
| GET | /api/status |
состояние Docker и образа |
| GET | /api/jobs |
список заданий |
| POST | /api/jobs |
создать задание ({url, scope, limit, workers, timeLimit, behaviors, hideSelectors}) |
| GET | /api/jobs/<id> |
детали задания + лог |
| GET | /api/jobs/<id>/download |
скачать site.zip |
| GET | /api/jobs/<id>/open |
URL предпросмотра |
| GET | /api/jobs/<id>/preview/<путь> |
файл копии (с корректными MIME) |
| POST | /api/jobs/rescan |
перечитать jobs/ с диска |
«Out of disk space» при старте краулинга
Не про свободные гигабайты, а про процент: Browsertrix содержит жёстко зашитый
порог usedPercentage >= 99. На хосте, забитом до 99%, краулинг падает через
пару секунд, даже если свободно 15+ ГБ. Решение встроено — краулинг идёт в
именованный том Docker (у VM OrbStack занято ~22%), затем результат копируется
обратно. Если том создать не удалось, crawler.py честно откатывается на прямой
каталог задания.
Промо-бейдж «Buy Now» в широком модуле
Некоторые шаблоны вставляют виджет покупки как модуль data-framer-name="Buy Template Module" во всю ширину страницы, а видимая кнопка внутри имеет нейтральное имя
(Button Wrapper). Простая размерная защита такие модули пропускала — теперь
«сметщик» дополнительно проверяет содержимое на признаки промо (Buy Now,
from $99, чекаут) и прячет весь модуль.
Переменные HTTP_PROXY / HTTPS_PROXY
Ломают ручные проверки через curl (502) и браузер (ERR_PROXY_CONNECTION_FAILED).
Для панели не критично; при ручной проверке используйте curl --noproxy '*' и
--no-proxy-server у браузера.
| Сайт | Страниц | Готово | Гидр. | Картинки | Внешн. | 404 | Ошибки | Промо |
|---|---|---|---|---|---|---|---|---|
precept.framer.website |
33 | ✅ | Y | 25/25 | 0 | 0 | 0 | 0 |
kyma.framer.ai |
27 | ✅ | Y | 31/31 | 0 | 0 | 0 | 0 |
oberon.framer.website |
8 | ✅ | Y | 36/37 | 0 | 0 | 0 | 0 |
«Гидр.» — отработала Framer-гидрация (главный признак «не белый экран»); «Внешн.» — запросы на сторонние сервера; «Промо» — бейджи Framer, включая кнопки покупки шаблона.
Топики GitHub — уже проставлены на репозитории, по ним проект находят через поиск GitHub:
framer · framer-website · framer-template · website-copier · site-downloader · website-cloner · web-archiving · browsertrix · webrecorder · static-site · docker · python · web-crawler · web-scraping · self-hosted · site-backup · web-archive · offline-first
Хештеги для постов (X/Twitter, Reddit, Telegram, VC):
#framer #framerwebsite #webdev #python #docker #opensource
#webarchiving #staticwebsite #selfhosted #копированиесайтов #верстка
Панель · ZIP · автономная копия — всё локально, без подписок



