# 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`