README: убрана пустая строка в блоке структуры после удаления install.sh
This commit is contained in:
70
README.md
70
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)
|
||||
|
||||
Reference in New Issue
Block a user