rpi: Google — календарь и Gmail (только чтение) для Astra; fr1: страницы OAuth на www.ruzzy.dev/astra
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
d28fe9f5be
commit
f87fcd1f5a
+1
-1
@@ -107,7 +107,7 @@ backend=systemd banaction=ufw
|
||||
## nginx + TLS
|
||||
- nginx 1.24 (apt) + certbot 2.9 (`python3-certbot-nginx`), автопродление через systemd-таймер certbot.
|
||||
- vhost `/etc/nginx/sites-available/mon.ruzzy.dev.conf` → проксирует на Grafana (`127.0.0.1:3000`), HTTPS-редирект, websocket.
|
||||
- vhost'ы `share.ruzzy.dev.conf` и `www.ruzzy.dev.conf` — статика с **общим** корнем `/var/www/share.ruzzy.dev` (`autoindex off`, `try_files $uri =404`, `server_tokens off`), у каждого свой сертификат. Используется для раздачи клиентских конфигов OpenVPN — сейчас там `marina-de.ovpn`, `masha-de.ovpn`.
|
||||
- vhost'ы `share.ruzzy.dev.conf` и `www.ruzzy.dev.conf` — статика с **общим** корнем `/var/www/share.ruzzy.dev` (`autoindex off`, `try_files $uri =404`, `server_tokens off`), у каждого свой сертификат. Используется для раздачи клиентских конфигов OpenVPN — сейчас там `marina-de.ovpn`, `masha-de.ovpn`; с 2026-10-12 ещё `astra/index.html` и `astra/privacy.html` — страницы OAuth-приложения Astra для Google (`stacks/www-ruzzy/`, см. `servers/rpi.md`).
|
||||
- vhost `default` — catch-all `server_name _`, `listen 80 default_server`, отдаёт дефолтную страницу `/var/www/html/index.nginx-debian.html`. На `:443` `default_server` **не задан**, поэтому TLS-запрос с неизвестным SNI попадает на первый по алфавиту vhost (`git.ruzzy.dev`) и получает его сертификат. Так отвечают и `https://ruzzy.dev`, и `https://fr1.ruzzy.dev` — своих vhost'ов и сертификатов у них нет, браузер видит несовпадение имени (проверено 2026-10-11).
|
||||
- vhost `astra.ruzzy.dev` (вебхук Маруси) — **удалён 2026-10-11** вместе с сертификатом. ⚠️ DNS-запись `astra.ruzzy.dev` (CNAME → fr1.ruzzy.dev) у регистратора — удалить вручную; пока она есть, запросы к этому имени отвечает vhost `git` с чужим сертификатом.
|
||||
- Сертификаты LE: `mon`, `git`, `share`, `www`, `astra` (с 2026-10-11, `certbot certonly --nginx`, продление тем же таймером). `cam.ruzzy.dev` удалён 2026-09-08 вместе с ipcam.
|
||||
|
||||
@@ -224,3 +224,12 @@ Docker CE 29.9 + Compose v5.6 из репо download.docker.com (в Debian ст
|
||||
- 2026-10-12 по прямой просьбе владельца OneDrive-бэкап и еженедельная проверка исключают объекты с метаданными `malware-detected=true` через `--metadata-exclude`; `--onedrive-av-override=false` явно запрещает обход серверного антивируса независимо от конфигурации. Ранее восемь заблокированных файлов приводили к ошибке всех прогонов и нулевой метке последнего успеха. Фильтр динамический, не список восьми путей; проверен на `Olya/laptop/калитники - платформы.rar`: без фильтра файл виден, с фильтром отсутствует; метаданные подтверждают true. Скрипты установлены в `/usr/local/bin/`, прежние сохранены с `.bak-20261012-malware`. Файлы в current/archive и в облаке не удалялись, текущие процессы не прерывались; следующий запуск по таймеру использует фильтр. ⚠️ Успех означает полноту бэкапа только среди файлов без отметки OneDrive; ранее сохранённые копии не очищаются, новые реальные ошибки не подавляются. Успешный полный прогон после изменения пока не подтверждён.
|
||||
|
||||
- 2026-10-12 08:16 MSK по прямой просьбе владельца вручную запущен `onedrive-backup.service` после установки фильтра malware-detected. Перед запуском служба была failed (предыдущий результат 04:57), конкурирующего прогона не было; запуск принят, состояние activating/start. Итог и обновление метрики успеха ещё ожидаются, алерт вручную не сбрасывался.
|
||||
|
||||
|
||||
## Google: календарь и почта владельца (с 2026-10-12)
|
||||
|
||||
- Скилл Astra **`google`** (`ruzzy/astra-bot`, `codex/skills/google/`): `gcal` (повестка, свободные окна, создать/перенести/изменить/удалить событие), `gmail` (**только чтение**: список/поиск, непрочитанные, письмо, вложения → `/tmp/astra-gmail/`), `google-auth` (вход/статус). На rpi: `/usr/local/bin/{gcal,gmail,google-auth}`, модуль `/usr/local/lib/astra-google/google_api.py` (только stdlib). Без подтверждения — `codex/rules/google.rules`.
|
||||
- Аккаунт `ruslan.gilfanov@gmail.com`; OAuth-клиент Desktop в Google Cloud проекте `astra` (Calendar API + Gmail API), приложение опубликовано (In production, не проверено Google — для личного использования). Branding: домашняя `https://www.ruzzy.dev/astra/index.html`, политика `https://www.ruzzy.dev/astra/privacy.html` (fr1, `stacks/www-ruzzy/`), authorized domain `ruzzy.dev`, без логотипа (логотип требует верификации).
|
||||
- Права токена: `calendar` + `gmail.readonly`. Секреты — `/etc/astra-google/` (root:astra 2770; `client.json` 640, `token.json` 640 — refresh-токен), в git нет. Вход (PKCE, redirect `http://localhost`): `google-auth url` → «Разрешить» → адрес `http://localhost/?code=…` из браузера → `google-auth code 'АДРЕС'`. Отозвать — myaccount.google.com/permissions.
|
||||
- Календари: личный (запись), «Семейная группа» (запись — только по явной просьбе), праздники США (чтение), **рабочий `rgilfanov@walletteam.org` — только занятость** (freeBusyReader через `freeBusy`): админ walletteam запрещает внешний доступ к подробностям; обход (секретный iCal, копирование) — не делать. `gcal` пишет только в календари с ролью owner/writer.
|
||||
- Доступ: владелец — всё; `129703290` — календарь, почта закрыта; Поле — ни календарь, ни почту (правила в `codex/AGENTS.md`).
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
# www.ruzzy.dev/astra — страницы для Google OAuth (Branding)
|
||||
|
||||
Домашняя страница и privacy policy OAuth-приложения «Astra» (Google Cloud, проект `astra`,
|
||||
личный аккаунт владельца) — см. `servers/rpi.md`, раздел «Google». Отдаёт vhost `www.ruzzy.dev`
|
||||
на fr1 (корень `/var/www/share.ruzzy.dev`, `try_files $uri =404` — ссылки только с `.html`).
|
||||
|
||||
Установка на fr1: скопировать каталог в `~/www-ruzzy` и `sudo sh ~/www-ruzzy/install.sh`.
|
||||
@@ -0,0 +1,12 @@
|
||||
<!doctype html>
|
||||
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>Astra</title>
|
||||
<style>body{font:16px/1.5 system-ui,sans-serif;max-width:640px;margin:40px auto;padding:0 16px;color:#222}</style>
|
||||
</head><body>
|
||||
<h1>Astra</h1>
|
||||
<p>Astra is a private home assistant run by Ruslan Gilfanov for personal and family use only.
|
||||
It is not offered to the public.</p>
|
||||
<p>It uses the Google Calendar API to show the owner's agenda and to create or change events in the owner's
|
||||
own Google Calendar on request.</p>
|
||||
<p><a href="privacy.html">Privacy policy</a> · Contact: ruslan.gilfanov@gmail.com</p>
|
||||
</body></html>
|
||||
@@ -0,0 +1,21 @@
|
||||
<!doctype html>
|
||||
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>Astra — Privacy policy</title>
|
||||
<style>body{font:16px/1.5 system-ui,sans-serif;max-width:640px;margin:40px auto;padding:0 16px;color:#222}</style>
|
||||
</head><body>
|
||||
<h1>Astra — Privacy policy</h1>
|
||||
<p>Last updated: 2026-10-12.</p>
|
||||
<p>Astra is a private assistant used only by its owner (Ruslan Gilfanov) and his family. It is not a public service.</p>
|
||||
<h2>Data accessed</h2>
|
||||
<p>With the owner's consent Astra accesses the owner's Google Calendar (events and calendars visible to the owner's
|
||||
Google account) to show the agenda, find free time and create, change or delete events at the owner's request.</p>
|
||||
<h2>Storage and sharing</h2>
|
||||
<p>The OAuth token and calendar data are processed on the owner's own home server only. Data is not sold,
|
||||
shared with third parties or used for advertising. Calendar data is not used to train AI models.</p>
|
||||
<p>The use of information received from Google APIs adheres to the
|
||||
<a href="https://developers.google.com/terms/api-services-user-data-policy">Google API Services User Data Policy</a>,
|
||||
including the Limited Use requirements.</p>
|
||||
<h2>Revoking access</h2>
|
||||
<p>Access can be revoked at any time at <a href="https://myaccount.google.com/permissions">myaccount.google.com/permissions</a>.</p>
|
||||
<p>Contact: ruslan.gilfanov@gmail.com</p>
|
||||
</body></html>
|
||||
@@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
# Страницы Astra для Google OAuth Branding (homepage + privacy policy) → https://www.ruzzy.dev/astra/
|
||||
# Запуск на fr1: sudo sh ~/www-ruzzy/install.sh
|
||||
set -e
|
||||
src=$(dirname "$0")/astra
|
||||
install -d -o www-data -g www-data -m 755 /var/www/share.ruzzy.dev/astra
|
||||
install -o www-data -g www-data -m 644 "$src/index.html" "$src/privacy.html" /var/www/share.ruzzy.dev/astra/
|
||||
# /astra/ → index.html (vhost: try_files $uri =404, без index-каталога)
|
||||
ls -l /var/www/share.ruzzy.dev/astra
|
||||
Reference in New Issue
Block a user