d3731e78df
- added images of notification feature working - added seed data script - race condition fix for notifications worker - small improvements
188 lines
5.5 KiB
Markdown
188 lines
5.5 KiB
Markdown
# Lotty A/B Platform
|
|
|
|
Service for managing A/B testing experiments. Drive your tests without breaking user experience!_)
|
|
|
|
## 🎨 Artifacts
|
|
|
|
### ADR
|
|
|
|
[ADR](./ADR/README.md)
|
|
|
|
### Runbook
|
|
|
|
[RUNBOOK.md](./RUNBOOK.md)
|
|
|
|
### Diagrams
|
|
|
|
#### C4 Context
|
|
|
|

|
|
|
|
Source: [C4 context](./assets/plantuml/raw/c4-context.puml)
|
|
|
|
#### C4 Container
|
|
|
|

|
|
|
|
Source: [C4 container](./assets/plantuml/raw/c4-container.puml)
|
|
|
|
#### C4 Component
|
|
|
|

|
|
|
|
Source: [C4 component](./assets/plantuml/raw/c4-component-critical-path.puml)
|
|
|
|
### Testing report
|
|
|
|
Can be seen in GitLab CI/CD pipeline run
|
|
|
|
1. Go to the [pipelines page](https://gitlab.prodcontest.com/2026-final-users/backend/itq.dev/-/pipelines)
|
|
2. Click on the latest pipeline run
|
|

|
|
3. Testing report (`Tests` tab)
|
|

|
|
4. Tests coverage (`Jobs` tab)
|
|

|
|
|
|
Here on screenshot you can see coverage percent (`97%`), for detailed coverage per file go to the `test` job log
|
|
|
|

|
|
|
|
Here we can see statements coverage per file, you can check out job run artifacts for html report.
|
|
|
|

|
|
|
|
Click here on `index.html` and you'll see complete coverage html report.
|
|
|
|
### Repository map
|
|
|
|
[MAP.md](./MAP.md)
|
|
|
|
Yep, artifacts content is written in Russian, but all other docs are in English, this is for judges' convenient experience.
|
|
|
|
## 📋 Instructions
|
|
|
|
### Dedicated services setup
|
|
|
|
[Backend](./src/backend/README.md)
|
|
|
|
### Setup with docker compose
|
|
|
|
#### Warning
|
|
|
|
Please note that by default containers will use ports 80 (reverse proxy) and range 14601-14611 (for direct access to containers), so there is must be no listeners on this ports range. You can customize the ports in [.env.template](./.env.template).
|
|
|
|
#### 0. Prerequisites
|
|
|
|
- [Docker](https://www.docker.com/) (latest version recommended)
|
|
- [Docker compose](https://www.docker.com/) (latest version recommended)
|
|
- Cloned repository
|
|
|
|
#### 1. Configuration
|
|
|
|
- Docker compose configuration files are stored in [deploy/compose](./deploy/compose).
|
|
- Configuration files for containers are stored in [infrastructure/configs](./infrastructure/configs).
|
|
Env could be customized by creating `.env` file in each service config directory, it will automatically override the default values from `.env.template`.
|
|
- Ports on which containers will be accessible are defined in [.env.template](./.env.template). This could be customized by creating `.env` file in the root directory and patching the following lines compose you are running:
|
|
|
|
```yaml
|
|
x-defaults: &defaults
|
|
project_directory: ./
|
|
env_file:
|
|
- ./.env.template
|
|
- ./.env # add this
|
|
```
|
|
|
|
#### 2. Choosing compose configuration
|
|
|
|
- [compose.yaml](./compose.yaml) - default configuration with base services included.
|
|
- [compose.prod.yaml](./compose.prod.yaml) - configuration for production environment with full observability stack.
|
|
|
|
#### 3. Running compose configuration
|
|
|
|
To run the compose configuration, use the following command:
|
|
|
|
```bash
|
|
docker compose -f compose.yaml up
|
|
# OR
|
|
docker compose -f compose.prod.yaml --profile observability up
|
|
```
|
|
|
|
That's it, project is already preconfigured for running, so no changes before running this are required.
|
|
|
|
## Linting && formatting
|
|
|
|
Instructions [here](./src/backend/README.md#linting--formatting).
|
|
|
|
Example run:
|
|

|
|
|
|
## Observability
|
|
|
|
### Structured logs
|
|
|
|

|
|
|
|
### Health/ready endpoints (`/health`/`/ready`)
|
|
|
|

|
|

|
|
|
|
### Metrics (`/metrics`)
|
|
|
|

|
|
|
|
System metrics (gc, requests, etc.) and several business metrics (`lotty_decide_requests_total`, `lotty_events_ingested_total`).
|
|
|
|
### OTEL
|
|
|
|
You can enable full observability for backend by setting `OTEL_ENABLED=True` in `.env`, also you need to run `compose.prod.yaml` with `observability` profile in order to deploy full observability stack.
|
|
|
|

|
|

|
|

|
|
|
|
Also there is some other predefined dashboards for services.
|
|
|
|
Grafana ([localhost/grafana/](http://localhost:80/grafana/)):
|
|
|
|
login: `admin`
|
|
|
|
password: `prooooood`
|
|
|
|
## Load testing (k6)
|
|
|
|
Reproducible k6 profile for `POST /api/v1/decide`:
|
|
|
|
- scenario script: [infrastructure/k6/decide.js](./infrastructure/k6/decide.js)
|
|
- runner: [infrastructure/k6/run-decide.sh](./infrastructure/k6/run-decide.sh)
|
|
- guide: [infrastructure/k6/README.md](./infrastructure/k6/README.md)
|
|
|
|
## Demo data seed (HTTP)
|
|
|
|
One-command API seed for demo datasets:
|
|
|
|
- script: [infrastructure/http/seed-demo-data.sh](./infrastructure/http/seed-demo-data.sh)
|
|
- runbook section: [RUNBOOK.md](./RUNBOOK.md#35-seed-демо-данных-через-http-api)
|
|
|
|
Example:
|
|
```bash
|
|
BACKEND_BASE_URL='http://127.0.0.1' \
|
|
TG_BOT_TOKEN='<your_bot_token>' \
|
|
TG_CHAT_ID='<your_chat_id>' \
|
|
./infrastructure/http/seed-demo-data.sh
|
|
```
|
|
|
|
SMTP can be enabled with `SMTP_ENABLED=true` and SMTP env settings (see `RUNBOOK.md`).
|
|
|
|
## Selected extra features
|
|
|
|
- Notifications
|
|
|
|
|
|

|
|

|
|
|
|
- Learnings Library
|
|
- Domain Conflicts
|