Приложение поставляется в виде трёх контейнеров докер.
В качестве примера развёртывания приведён файл docker-compose-ghrc.yml
services:
trustvpn-backend:
container_name: trustvpn-backend
image: ghcr.io/maxirmx/trustvpn-backend:latest
environment:
ConnectionStrings__DefaultConnection: "Host=trustvpn-db;Database=postgres;Username=postgres;Password=postgres"
ASPNETCORE_ENVIRONMENT: Production
ASPNETCORE_HTTP_PORTS: 8080
ASPNETCORE_HTTPS_PORTS: 8081
ASPNETCORE_Kestrel__Certificates__Default__Path: "/etc/certificate/sw_consulting.pfx"
ASPNETCORE_Kestrel__Certificates__Default__Password: <password>
ports:
- "8080:8080"
- "8081:8081"
depends_on:
trustvpn-db:
condition: service_healthy
trustvpn-container:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "localhost:8080/api/auth/status"]
interval: 10s
timeout: 5s
retries: 2
volumes:
- /etc/nginx/certificate:/etc/certificate
- /var/run/docker.sock:/var/run/docker.sock
- /var/o-service/logs:/app/logs
trustvpn-db:
container_name: trustvpn-db
image: postgres:16.2
environment:
- PGUSER=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
interval: 10s
timeout: 5s
retries: 5
volumes:
- /var/o-service/pgdata:/var/lib/postgresql/data
trustvpn-container:
container_name: trustvpn-container
image: ghcr.io/maxirmx/trustvpn-container:latest
command: ["trustvpn-container-if-start", "-u", "o-service.sw.consulting"]
ports:
- "1194:1194/udp"
cap_add:
- NET_ADMIN
sysctls:
- net.ipv6.conf.all.disable_ipv6=0
- net.ipv6.conf.all.forwarding=1
healthcheck:
test: ["CMD", "openvpn-check"]
interval: 10s
timeout: 5s
retries: 2
volumes:
- /var/o-service/ovpn:/etc/openvpn
После установки документация swagger доступна по адресу :/swagger
POST <host>:<port>/api/auth/login
{
"Password": "... посылал отдельно ...",
"Email": "ivanov@example.com"
}
Ответ:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjUiLCJuYmYiOjE3MDExOTUyMDYsImV4cCI6MTcwMTgwMDAwNiwiaWF0IjoxNzAxMTk1MjA2fQ.ZF21pHD4C-7bCZuyAuICcYGxxmOIOjGeg6F4n8zaxvU",
"id": 5,
"firstName": "Иван",
"lastName": "Иванов",
"patronimic": "Иванович",
"email": "ivanov@example.com",
"isAdmin": true,
"profileId": 2,
"config": ""
}
Токен - JSON Web Token (RFC 7519), используется для авторизации в следующих запросах. Нужно передавать в HTTP заголовке "Authorization". Всё остальноe - для справки.
POST <host>:<port>/api/user/add
{
"FirstName": "Роман",
"LastName": "Ойра-Ойра",
"Password": "12345",
"Email": "oyra@example.com",
"IsAdmin": false,
"ProfileId": 2
}
- profileId = 1 -- блокировка
- profileId = 2 -- профиль с ограничением пропускной способности
- profileId = 3 -- профиль без ограничения пропускной способности
Ответ:
{
"id": 12
}
Обязательные поля "Email", "IsAdmin", "ProfileId" Отсутсвие поля трактуется как пустая строка, а не null
GET <host>:<port>/api//user/12
Ответ:
{
"id": 12,
"firstName": "Роман",
"lastName": "Ойра-Ойра",
"patronimic": "",
"email": "oyra@example.com",
"isAdmin": false,
"profileId": 2,
"config": " ... "
}
В поле config будет содержимое конфигурацинного файла. Нужно просто сохранить с расширением 'openvpn' Eсли поле config пустое, значит пользователь заблокирован (profileId=1). Это ошибка, конфиг будет выдаваться всегда.
PUT <host>:<port>/api//user/12
{
"ProfileId": 3
}
Нужно передавать те поля, которые хочется поменять. Можно поменять несколько полей одним запросом.