diff --git a/Cargo.lock b/Cargo.lock index 35fb59b..6122cff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2559,7 +2559,7 @@ checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reporter" -version = "0.1.1" +version = "0.1.2" dependencies = [ "anyhow", "clap", @@ -4225,7 +4225,7 @@ dependencies = [ [[package]] name = "website" -version = "0.2.1" +version = "0.2.2" dependencies = [ "dotenvy", "env_logger", diff --git a/reporter/Cargo.toml b/reporter/Cargo.toml index 8ae87e2..dd2f76d 100644 --- a/reporter/Cargo.toml +++ b/reporter/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "reporter" -version = "0.1.1" +version = "0.1.2" edition = "2024" license-file = "../LICENSE" description = "DPI probe: checks blockage of domains by SNI" @@ -12,6 +12,12 @@ path = "src/main.rs" [package.metadata.deb] name = "cheburchecker" maintainer = "Lowder " +maintainer-scripts = "debian/" +systemd-units = [ + { unit-name = "cheburchecker", enable = false, start = false }, + { unit-name = "cheburchecker.100k" }, + { unit-name = "cheburchecker.1kk" }, +] [dependencies] tokio = { workspace = true } diff --git a/reporter/README.md b/reporter/README.md index ccf6255..02b844f 100644 --- a/reporter/README.md +++ b/reporter/README.md @@ -1,4 +1,5 @@ # Cheburcheck Reporter +[![Build Rust Application](https://github.com/LowderPlay/cheburcheck/actions/workflows/build.yml/badge.svg)](https://github.com/LowderPlay/cheburcheck/actions/workflows/build.yml) Инструмент для автоматического сканирования и анализа блокировок. Позволяет сканировать большое количество доменов за короткий срок за счет параллелизации запросов. @@ -27,16 +28,14 @@ cargo run Для этого достаточно запустить его: 1. Сохранить результаты в CSV - -```shell -cheburchecker output.csv -``` + ```shell + cheburchecker output.csv + ``` 2. Отправить результаты в **Cheburcheck Agency** - -```shell -cheburchecker -k -``` + ```shell + cheburchecker -k + ``` > Для того чтобы получить API-ключ, > обратитесь по адресу [agency@cheburcheck.ru](mailto:agency@cheburcheck.ru). @@ -59,3 +58,47 @@ cheburchecker -k | `-P, --path ` | Путь к файлу на сервере | 100MB.bin | | `-a, --endpoint ` | Адрес сервера, на который будут загружены результаты сканирования | https://cheburcheck.ru/agency/report | | `-k, --key ` | API-ключ | | + +## Автоматическое сканирование по расписанию (Systemd) + +Для автоматического и регулярного запуска чекера на Debian-based системах, вы можете использовать systemd таймеры. Этот проект поставляется с преднастроенными systemd юнитами, которые автоматически устанавливаются с помощью `cargo-deb`. + +### Установка + +1. **Установка пакета:** + При установке автоматически будут размещены systemd юниты и включены таймеры. + ```shell + sudo apt install cheburchecker_*.deb + ``` + +2. **Настройка API-ключа (обязательно):** + Чекер отправляет результаты в Cheburcheck Agency. Для этого требуется API-ключ. Его необходимо сохранить в файле `/etc/default/cheburchecker`. + ```bash + echo "AGENCY_KEY=ВАШ_API_КЛЮЧ" | sudo tee /etc/default/cheburchecker + ``` + Замените `ВАШ_API_КЛЮЧ` на ваш реальный ключ. + +### Расписание задач + +Предусмотрено два автоматических расписания: + +* **`cheburchecker.100k.timer`**: Запускает проверку **100,000 доменов** каждые 6 часов (в 06:00, 12:00, 18:00 UTC). +* **`cheburchecker.1kk.timer`**: Запускает проверку **1,000,000 доменов** ежедневно (в 00:00 UTC). + +Таймеры настроены таким образом, чтобы не конфликтовать друг с другом. + +### Проверка статуса и логов + +Вы можете проверить статус таймеров и служб, а также просмотреть их логи: + +* **Статус таймеров:** + ```bash + systemctl status cheburchecker.100k.timer + systemctl status cheburchecker.1kk.timer + ``` +* **Логи служб:** + ```bash + journalctl -u cheburchecker@100000.service + journalctl -u cheburchecker@1000000.service + ``` + Отчеты сохраняются в `/var/log/cheburchecker/` с именем файла, включающим количество доменов (например, `report-100000.csv`). diff --git a/reporter/debian/cheburchecker.100k.timer b/reporter/debian/cheburchecker.100k.timer new file mode 100644 index 0000000..fde2c75 --- /dev/null +++ b/reporter/debian/cheburchecker.100k.timer @@ -0,0 +1,10 @@ +[Unit] +Description=Run Cheburchecker for 100k domains + +[Timer] +OnCalendar=06,12,18:00:00 +Persistent=true +Unit=cheburchecker@100000.service + +[Install] +WantedBy=timers.target diff --git a/reporter/debian/cheburchecker.1kk.timer b/reporter/debian/cheburchecker.1kk.timer new file mode 100644 index 0000000..4c75dee --- /dev/null +++ b/reporter/debian/cheburchecker.1kk.timer @@ -0,0 +1,10 @@ +[Unit] +Description=Run Cheburchecker for 1M domains + +[Timer] +OnCalendar=daily +Persistent=true +Unit=cheburchecker@1000000.service + +[Install] +WantedBy=timers.target diff --git a/reporter/debian/cheburchecker@.service b/reporter/debian/cheburchecker@.service new file mode 100644 index 0000000..702d781 --- /dev/null +++ b/reporter/debian/cheburchecker@.service @@ -0,0 +1,12 @@ +[Unit] +Description=Cheburchecker blocklist checker (count: %i) +After=network.target + +[Service] +Type=exec +ExecStart=/bin/sh -c '/usr/bin/cheburchecker --count %i /var/log/cheburchecker/report-%i.csv' +EnvironmentFile=-/etc/default/cheburchecker +ExecStartPre=/bin/mkdir -p /var/log/cheburchecker +User=root +Group=root +LimitNOFILE=16384 diff --git a/website/Cargo.toml b/website/Cargo.toml index ae1a28c..afc1791 100644 --- a/website/Cargo.toml +++ b/website/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "website" -version = "0.2.1" +version = "0.2.2" edition = "2024" [dependencies] diff --git a/website/src/whitelist.rs b/website/src/whitelist.rs index 610688b..06bc2ce 100644 --- a/website/src/whitelist.rs +++ b/website/src/whitelist.rs @@ -58,8 +58,9 @@ pub async fn export_csv( }) } -#[get("/histogram?")] -pub async fn histogram(mut db: Connection, filter: Option) -> Result>, Status> { - Ok(Json(collect_histogram(&mut db, 50, 100_000, filter.is_some()).await +#[get("/histogram?&")] +pub async fn histogram(mut db: Connection, filter: Option, limit: Option) -> Result>, Status> { + let limit = limit.unwrap_or(100_000).clamp(0, 1_000_000); + Ok(Json(collect_histogram(&mut db, 50, limit, filter.is_some()).await .map_err(|e| Status::InternalServerError)?)) } diff --git a/website/templates/pages/faq.html.tera b/website/templates/pages/faq.html.tera index 36217fd..c92b192 100644 --- a/website/templates/pages/faq.html.tera +++ b/website/templates/pages/faq.html.tera @@ -40,7 +40,7 @@

Подробнее... - {{ typography::heading(title='Мне написало, что сайт "Заблокирован", но у меня все работает!') }} + {{ typography::heading(title='Мне написало, что сайт «Заблокирован», но у меня все работает!') }}

Мы не можем с точностью утверждать, заблокирован сайт или нет. Блокировки Роскомнадзора, зачастую, непредсказуемые, непубличные и незаконные. @@ -67,6 +67,7 @@

diff --git a/website/templates/pages/whitelist.html.tera b/website/templates/pages/whitelist.html.tera index 7564d02..31b7929 100644 --- a/website/templates/pages/whitelist.html.tera +++ b/website/templates/pages/whitelist.html.tera @@ -68,17 +68,17 @@ curl: (28) Operation timed out after 5000 milliseconds with 16101 out of 65537 b

Исходя из анализа 1,000,000 доменов из рейтинга Tranco list от 26 ноября 2025, - в белом списке содержится около 1000 доменов. Все* домены из списка входят в топ-100,000 рейтинга. + в белом списке содержится около 1000 доменов.

* — Мы не включаем в это число домены из зоны .co.uk, так как по какой-то причине, они все находятся в белом списке. - Гистограмма количества доменов относительно их положения в рейтинге - {{ histogram::histogram(endpoint="/whitelist/histogram") }} + Гистограмма количества доменов относительно их положения в рейтинге (топ-30k, без .co.uk) + {{ histogram::histogram(endpoint="/whitelist/histogram?filter&limit=30000") }}
- Гистограмма без учета доменов .co.uk - {{ histogram::histogram(id="filtered", endpoint="/whitelist/histogram?filter") }} + Гистограмма количества доменов относительно их положения в рейтинге (топ-1kk, без .co.uk) + {{ histogram::histogram(id="filtered", endpoint="/whitelist/histogram?limit=1000000") }} {{ typography::heading(title="Скачать списки") }}