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)