cards/README.md

186 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# cards
Веб-сервер на C++20 с использованием Boost.Beast и PostgreSQL. Отдаёт случайные записи из базы данных по REST API.
## Требования
- Компилятор с поддержкой C++20 (GCC 10+, Clang 10+)
- CMake >= 3.14
- PostgreSQL (runtime) + libpq + libpqxx >= 7.0
- Boost (system)
- nlohmann_json 3.x
Установка зависимостей (Debian/Ubuntu):
```bash
sudo apt-get install libboost-all-dev libpq-dev libpqxx-dev nlohmann-json3-dev cmake build-essential
```
## Сборка
```bash
./configure.sh
```
Или вручную:
```bash
mkdir -p build && cd build
cmake ..
make -j"$(nproc)"
cd ..
```
Бинарник: `build/bin/cards`
## Конфигурация
По умолчанию читает `config.json` из рабочей директории. Можно указать путь к другому файлу:
```bash
./build/bin/cards /path/to/config.json
```
### Поля `config.json`
**server**
| Поле | Тип | Значение по умолчанию |
|---|---|---|
| address | string | `"0.0.0.0"` |
| port | int | `8080` |
| threads | int | `4` |
**database**
| Поле | Тип | Значение по умолчанию |
|---|---|---|
| host | string | `"localhost"` |
| port | int | `5432` |
| dbname | string | `"testdb"` |
| user | string | `"postgres"` |
| password | string | (пусто) |
### Переменные окружения
Переопределяют соответствующие поля `config.json`:
- `DB_HOST`
- `DB_PORT`
- `DB_NAME`
- `DB_USER`
- `DB_PASSWORD`
Пример:
```bash
DB_PASSWORD=secret ./build/bin/cards
```
## API
| Метод | Путь | Описание |
|---|---|---|
| GET | `/` | Случайная запись из таблицы `random_data` |
| GET | `/health` | Проверка состояния сервера |
### Пример ответа `GET /`
```json
{
"id": 3,
"name": "Gamma",
"value": 300,
"description": "Third test record",
"created_at": "2025-01-01 12:00:00",
"timestamp": 1735732800000000000
}
```
### Пример ответа `GET /health`
```json
{
"status": "ok",
"timestamp": 1735732800000000000
}
```
## База данных
При первом запуске автоматически создаётся таблица `random_data` и заполняется десятью тестовыми записями.
Схема таблицы:
```sql
CREATE TABLE random_data (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
value INTEGER NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
## systemd
Юнит-файл: `deploy/systemd/cards.service`
```ini
[Unit]
Description=Cards web server
After=network-online.target
[Service]
Type=simple
User=cards
Group=cards
ExecStart=/usr/bin/cards /etc/cards/config.json
Restart=on-failure
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=yes
ProtectSystem=full
ProtectHome=yes
PrivateTmp=yes
```
Установка вручную:
```bash
sudo cp deploy/systemd/cards.service /usr/lib/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now cards
```
## Сборка deb-пакета
```bash
cd build
cmake ..
cpack
```
Результат: `cards-1.0.0-Linux.deb`
### Содержимое deb-пакета
| Путь | Назначение |
|---|---|
| `/usr/bin/cards` | Исполняемый файл |
| `/usr/lib/systemd/system/cards.service` | systemd-юнит |
| `/etc/cards/config.json.example` | Пример конфигурации |
| `/usr/share/doc/cards/LICENSE` | Лицензия |
### Управляющие скрипты
При установке deb-пакета (`postinst`):
- Создаётся пользователь и группа `cards`
- Копируется `/etc/cards/config.json.example` → `/etc/cards/config.json` (если нет)
- Сервис `cards` включается и запускается
При удалении (`prerm`):
- Сервис останавливается и отключается
## Завершение работы
- Вручную: `Ctrl+C` или `kill` с сигналом `SIGTERM`
- systemd: `systemctl stop cards`