README: убрана пустая строка в блоке структуры после удаления install.sh

This commit is contained in:
2026-10-10 11:51:33 +03:00
parent b49ef93619
commit 3d5bfe3023

View File

@@ -46,68 +46,29 @@ nginx — порты 80/443, https://<домен сайта> → 127.0.0.1:<по
## Установка на сервер ## Установка на сервер
Скачайте zip с проектом, распакуйте и запустите одну команду: ### Docker (deploy.sh)
Скачайте zip с проектом, распакуйте и заполните `.env`:
```bash ```bash
unzip schedule.zip && cd schedule 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 `deploy.sh` проверяет, что Docker и `.env` на месте, собирает образы и поднимает
домена уже должен указывать на сервер, а порты 80/443 — быть открытыми: контейнеры. Обновление — тем же скриптом: `git pull && sudo ./deploy.sh`.
сертификат Let's Encrypt выпускается прямо в процессе установки. Почему Docker: сервисы изолированы, автоматически перезапускаются, не зависят
от Python в системе и обновляются одной командой.
Скрипт спросит: ### Без Docker (systemd)
| Вопрос | Что ответить |
|---|---|
| Как ставить: 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} — работает
```
**Система:**
```bash ```bash
sudo apt install -y python3 python3-venv python3-pip # Python 3.11+ sudo apt install -y python3 python3-venv python3-pip # Python 3.11+
python3 -m venv .venv python3 -m venv .venv
.venv/bin/pip install -r requirements.txt .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/`), затем Две службы systemd (`/etc/systemd/system/`), затем
@@ -144,6 +105,10 @@ RestartSec=3
WantedBy=multi-user.target WantedBy=multi-user.target
``` ```
Если службы работают не от владельца каталога проекта, выдайте пользователю
службы права на запись в `data/` (там админка хранит ссылку, интервал и историю
входов) или задайте свой путь в `SETTINGS_FILE`.
**nginx + сертификат** (общий шаг для обоих способов; `.env` уже должен быть): **nginx + сертификат** (общий шаг для обоих способов; `.env` уже должен быть):
```bash ```bash
@@ -345,7 +310,6 @@ ADMIN_PASSWORD=<длинный пароль>
## Структура кода ## Структура кода
``` ```
install.sh интерактивная установка на сервер: Docker или systemd + nginx
src/ src/
backend/ backend/
main.py FastAPI: маршруты, create_app(cache), /healthz main.py FastAPI: маршруты, create_app(cache), /healthz
@@ -370,7 +334,7 @@ src/
tools/ tools/
make_icons.py генерация иконок приложения из логотипа (нужен rsvg-convert) make_icons.py генерация иконок приложения из логотипа (нужен rsvg-convert)
deploy/ deploy/
nginx-site.sh генерация и включение конфига nginx (используется install.sh) nginx-site.sh генерация и включение конфига nginx (ручная настройка)
tests/ tests/
conftest.py общие фикстуры conftest.py общие фикстуры
xlsx_builder.py генерация xlsx в памяти (без openpyxl) xlsx_builder.py генерация xlsx в памяти (без openpyxl)