|
|
||
|---|---|---|
| deploy | ||
| src | ||
| .gitignore | ||
| CMakeLists.txt | ||
| LICENSE | ||
| README.md | ||
| config.json | ||
| configure.sh | ||
README.md
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):
sudo apt-get install libboost-all-dev libpq-dev libpqxx-dev nlohmann-json3-dev cmake build-essential
Сборка
./configure.sh
Или вручную:
mkdir -p build && cd build
cmake ..
make -j"$(nproc)"
cd ..
Бинарник: build/bin/cards
Конфигурация
По умолчанию читает config.json из рабочей директории. Можно указать путь к другому файлу:
./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_HOSTDB_PORTDB_NAMEDB_USERDB_PASSWORD
Пример:
DB_PASSWORD=secret ./build/bin/cards
API
| Метод | Путь | Описание |
|---|---|---|
| GET | / |
Случайная запись из таблицы random_data |
| GET | /health |
Проверка состояния сервера |
Пример ответа GET /
{
"id": 3,
"name": "Gamma",
"value": 300,
"description": "Third test record",
"created_at": "2025-01-01 12:00:00",
"timestamp": 1735732800000000000
}
Пример ответа GET /health
{
"status": "ok",
"timestamp": 1735732800000000000
}
База данных
При первом запуске автоматически создаётся таблица random_data и заполняется десятью тестовыми записями.
Схема таблицы:
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
[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
Установка вручную:
sudo cp deploy/systemd/cards.service /usr/lib/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now cards
Сборка deb-пакета
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