From 3d5bfe30237b2969be111e8f3425c607ea571f32 Mon Sep 17 00:00:00 2001 From: Vladislav Kopnin Date: Sat, 10 Oct 2026 11:51:33 +0300 Subject: [PATCH] =?UTF-8?q?README:=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BF=D1=83=D1=81=D1=82=D0=B0=D1=8F=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=D0=B0=20=D0=B2=20=D0=B1=D0=BB=D0=BE=D0=BA=D0=B5=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D1=8B=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=81=D0=BB=D0=B5=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20install.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 70 ++++++++++++++----------------------------------------- 1 file changed, 17 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index a07a282..b862282 100644 --- a/README.md +++ b/README.md @@ -46,68 +46,29 @@ nginx — порты 80/443, https://<домен сайта> → 127.0.0.1:<по ## Установка на сервер -Скачайте zip с проектом, распакуйте и запустите одну команду: +### Docker (deploy.sh) + +Скачайте zip с проектом, распакуйте и заполните `.env`: ```bash unzip schedule.zip && cd schedule -bash install.sh +cp .env.example .env && nano .env # SCHEDULE_LINK обязателен; ADMIN_* — по желанию +sudo ./deploy.sh # собрать образы и запустить +curl -s http://127.0.0.1:8080/api/status # {"has_data":true} — работает ``` -Установка требует root — скрипт сам перезапустится через sudo. До запуска DNS -домена уже должен указывать на сервер, а порты 80/443 — быть открытыми: -сертификат Let's Encrypt выпускается прямо в процессе установки. +`deploy.sh` проверяет, что Docker и `.env` на месте, собирает образы и поднимает +контейнеры. Обновление — тем же скриптом: `git pull && sudo ./deploy.sh`. +Почему Docker: сервисы изолированы, автоматически перезапускаются, не зависят +от Python в системе и обновляются одной командой. -Скрипт спросит: - -| Вопрос | Что ответить | -|---|---| -| Как ставить: Docker или систему | Docker — рекомендуется (разница ниже) | -| Публичная ссылка на таблицу | ссылка Я.Диска, единственная обязательная настройка | -| Домен сайта | например `sched.example.ru`; пусто = без nginx, сайт на 127.0.0.1 | -| Порт api и порт сайта | по умолчанию 8000 и 8080 | -| Пользователь служб (только для «в систему») | от кого работают сервисы | -| Почта (только если задан домен) | для уведомлений Let's Encrypt | - -Ответы можно передать и флагами: `--mode`, `--link`, `--domain`, `--api-port`, -`--front-port`, `--user`, `--email`. `install.sh --dry-run` показывает план -установки, ничего не меняя. - -### Docker или система — что выбрать - -**Docker** — рекомендуется: сервисы изолированы, автоматически перезапускаются, -обновляются одной командой, не зависят от Python в системе. Установщик поставит -Docker (если нет), запишет `.env`, соберёт образы, запустит контейнеры и -дождётся их готовности. - -**Система (без Docker)** — если Docker не нужен: установщик проверит Python -3.11+, создаст `.venv`, поставит зависимости и зарегистрирует две службы -systemd — `schedule-api` и `schedule-frontend` (автозапуск после ребута, -перезапуск при падении). - -В обоих случаях, если домен задан, установщик дополнительно поставит nginx и -certbot, выпустит сертификат Let's Encrypt (webroot — продление автоматическое, -сайт не останавливается) и настроит конфиг: http → https, прокси на порт -фронта. Снаружи виден только nginx. - -### Ручная установка (без скрипта) - -Установщик делает ровно следующее — при желании те же шаги выполняются руками. - -**Docker:** - -```bash -cp .env.example .env && nano .env # SCHEDULE_LINK (+ порты при желании) -sudo ./deploy.sh # собрать и запустить -curl -s http://127.0.0.1:8080/api/status # {"has_data":true} — работает -``` - -**Система:** +### Без Docker (systemd) ```bash sudo apt install -y python3 python3-venv python3-pip # Python 3.11+ python3 -m venv .venv .venv/bin/pip install -r requirements.txt -cp .env.example .env && nano .env # SCHEDULE_LINK +cp .env.example .env && nano .env # SCHEDULE_LINK (+ ADMIN_*, если нужна админка) ``` Две службы systemd (`/etc/systemd/system/`), затем @@ -144,6 +105,10 @@ RestartSec=3 WantedBy=multi-user.target ``` +Если службы работают не от владельца каталога проекта, выдайте пользователю +службы права на запись в `data/` (там админка хранит ссылку, интервал и историю +входов) или задайте свой путь в `SETTINGS_FILE`. + **nginx + сертификат** (общий шаг для обоих способов; `.env` уже должен быть): ```bash @@ -345,7 +310,6 @@ ADMIN_PASSWORD=<длинный пароль> ## Структура кода ``` -install.sh интерактивная установка на сервер: Docker или systemd + nginx src/ backend/ main.py FastAPI: маршруты, create_app(cache), /healthz @@ -370,7 +334,7 @@ src/ tools/ make_icons.py генерация иконок приложения из логотипа (нужен rsvg-convert) deploy/ - nginx-site.sh генерация и включение конфига nginx (используется install.sh) + nginx-site.sh генерация и включение конфига nginx (ручная настройка) tests/ conftest.py общие фикстуры xlsx_builder.py генерация xlsx в памяти (без openpyxl)