Šķîþ ţö ḿàîñ çöñţéñţ

Îñšţàļļîñĝ Bowrain Šéŕṽéŕ

À Bowrain đéþļöýḿéñţ îš šéṽéŕàļ çööþéŕàţîñĝ šéŕṽîçéš, ñöţ à šîñĝļé ƃîñàŕý:

  • bowrain-šéŕṽéŕ: ţĥé ŔÉŠŢ + ĝŔÞÇ ÀÞÎ (öñé þŕöçéšš; ĝŔÞÇ îš ḿüļţîþļéẋéđ öñţö ţĥé ĤŢŢÞ þöŕţ).
  • bowrain-ŵöŕķéŕ: ţĥé àšýñç ŵöŕķéŕ ţĥàţ îñĝéšţš þüšĥéš àñđ ŕüñš ţĥé đŕàƒţîñĝ ĵöƃš à ŕüñ éñǫüéüéš àĝàîñšţ àñ üþšţŕéàḿ ÀÎ þŕöṽîđéŕ.
  • ÞöšţĝŕéŠǪĻ: ţĥé àüţĥöŕîţàţîṽé šţöŕé (þŕöĵéçţš, ƃļöçķš, ŵöŕķšþàçéš, üšéŕš, ĵöƃš). Ţĥé šéŕṽéŕ ŕéǫüîŕéš ÞöšţĝŕéŠǪĻ; ţĥéŕé îš ñö ŠǪĻîţé öŕ ƒîļé ƃàçķéñđ.
  • À ĵöƃ ǫüéüé (Àḿàžöñ ŠǪŠ, öŕ àñ ŠǪŠ-çöḿþàţîƃļé ƃŕöķéŕ šüçĥ àš ÉļàšţîçḾǪ) àñđ Ŕéđîš ƒöŕ ţĥé éṽéñţ ƃüš (Ŕéđîš Šţŕéàḿš), šĥàŕéđ ƃý ţĥé šéŕṽéŕ àñđ ŵöŕķéŕ.
  • bowrain-ŵéƃ: ţĥé šţàţîç ŵéƃ ÜÎ, šéŕṽéđ àš îţš öŵñ çöñţàîñéŕ.
  • Àñ ÖÎĐÇ îđéñţîţý þŕöṽîđéŕ (ƒöŕ éẋàḿþļé Ķéýçļöàķ) àñđ àñ ŠḾŢÞ šéñđéŕ.

Ţĥîš þàĝé çöṽéŕš ļöçàļ éṽàļüàţîöñ. Ƒöŕ à þŕöđüçţîöñ šţàçķ ŵîţĥ ŢĻŠ, ƃàçķüþš, àñđ à ŕéṽéŕšé þŕöẋý, šéé Šéļƒ-Ĥöšţîñĝ, ŵĥîçĥ îš ţĥé çàñöñîçàļ ŕéƒéŕéñçé ƒöŕ ţĥé ƒüļļ àŕçĥîţéçţüŕé àñđ ţĥé çöḿþļéţé éñṽîŕöñḿéñţ-ṽàŕîàƃļé šéţ.

Öñé-çöḿḿàñđ ļöçàļ šţàçķ

Ţĥé ŕéþöšîţöŕý šĥîþš à šéļƒ-çöñţàîñéđ ļöçàļ šţàçķ àţ bowrain/compose.full.yaml: šéŕṽéŕ, ŵöŕķéŕ, ÞöšţĝŕéŠǪĻ, ÉļàšţîçḾǪ (ŠǪŠ-çöḿþàţîƃļé ĵöƃ ǫüéüé), Ŕéđîš, ḾîñÎÖ, Ķéýçļöàķ (ŵîţĥ à þŕé-îḿþöŕţéđ ŕéàļḿ), àñđ Ḿàîļþîţ. Îţ đéƒàüļţš ţö ţĥé öƒƒļîñé demo þŕöṽîđéŕ, šö ţĥé ƒüļļ þüšĥ → đŕàƒţ → þüļļ çýçļé ŵöŕķš ŵîţĥ ñö ÀÞÎ ķéýš àñđ ñö ÖÎĐÇ šéţüþ:

docker compose -f bowrain/compose.full.yaml up -d --build --wait

Éñđþöîñţš öñçé îţ îš üþ:

ÜŔĻŠéŕṽîçé
http://localhost:8080bowrain-šéŕṽéŕ ÀÞÎ (àñđ ţĥé ŵéƃ ÜÎ ŵîţĥ --profile web)
http://localhost:8080/api/v1/healthĤéàļţĥ çĥéçķ
http://localhost:8180Ķéýçļöàķ àđḿîñ çöñšöļé (àđḿîñ / àđḿîñ)
http://localhost:8025Ḿàîļþîţ (çàþţüŕéđ éḿàîļš)

Ţö šéŕṽé ţĥé ŵéƃ ÜÎ ƒŕöḿ ţĥé šéŕṽéŕ, àđđ ţĥé web þŕöƒîļé:

docker compose -f bowrain/compose.full.yaml --profile web up -d --build

Ƒöŕ ŕéàļ đŕàƒţš, šéţ BOWRAIN_PLATFORM_PROVIDER (ƒöŕ éẋàḿþļé gemini) àñđ ţĥé ḿàţçĥîñĝ ÀÞÎ ķéý îñ à .env ƒîļé; šéé Šéļƒ-Ĥöšţîñĝ.

Ţéàŕ đöŵñ ŵîţĥ docker compose -f bowrain/compose.full.yaml down -v.

Šéļƒ-ĥöšţîñĝ ƒŕöḿ þüƃļîšĥéđ îḿàĝéš

Ţö ŕüñ ƒŕöḿ ţĥé þüƃļîšĥéđ ghcr.io/neokapi/ îḿàĝéš àĝàîñšţ ýöüŕ öŵñ ÖÎĐÇ þŕöṽîđéŕ, üšé ţĥé ŕéƒéŕéñçé šţàçķ àţ bowrain/deploy/docker/compose.yaml: Ţŕàéƒîķ, ÞöšţĝŕéŠǪĻ, ÉļàšţîçḾǪ, Ŕéđîš, ţĥé šéŕṽéŕ, ţĥé ŵöŕķéŕ, àñđ ţĥé ŵéƃ ÜÎ.

docker compose -f deploy/docker/compose.yaml up -d

Àţ ḿîñîḿüḿ, þŕöṽîđé àñ éẋţéŕñàļ ÖÎĐÇ îššüéŕ, à ĴŴŢ šéçŕéţ, àñđ (ƒöŕ đŕàƒţîñĝ) àñ üþšţŕéàḿ þŕöṽîđéŕ:

POSTGRES_PASSWORD=... # database password
BOWRAIN_JWT_SECRET=$(openssl rand -base64 32) # JWT signing secret
BOWRAIN_OIDC_ISSUER_URL=... # your realm's issuer URL
BOWRAIN_OIDC_CLIENT_SECRET=... # the bowrain client's secret
BOWRAIN_PLATFORM_PROVIDER=gemini # or bedrock / openai / anthropic / ollama
BOWRAIN_PLATFORM_API_KEY=... # provider API key

Šéé Šéļƒ-Ĥöšţîñĝ ƒöŕ ţĥé ƒüļļ þŕöđüçţîöñ ŵàļķţĥŕöüĝĥ, îñçļüđîñĝ ŢĻŠ, ƃàçķüþš, àñđ ţĥé çöḿþļéţé šéŕṽîçé ţöþöļöĝý.

Ƃüîļđîñĝ ţĥé ƃîñàŕîéš

Ţĥé šéŕṽéŕ àñđ ŵöŕķéŕ àŕé ƃüîļţ ƒŕöḿ šöüŕçé. Ñéîţĥéŕ îš þüƃļîšĥéđ àš à đöŵñļöàđ: ţĥé ĜîţĤüƃ Ŕéļéàšéš ƒöŕ ţĥîš ŕéþöšîţöŕý çàŕŕý ţĥé kapi ÇĻÎ, ţĥé kapi-bowrain þļüĝîñ àñđ ţĥé Bowrain đéšķţöþ àþþ, àñđ ñö šéŕṽéŕ àŕţîƒàçţ. Ţĥé çöḿþöšé šţàçķ àƃöṽé ƃüîļđš ţĥé šéŕṽéŕ îḿàĝé ļöçàļļý ƒöŕ ţĥé šàḿé ŕéàšöñ.

git clone https://github.com/neokapi/neokapi.git
cd neokapi
make -C bowrain build-server

Ƃöţĥ šţîļļ ŕéǫüîŕé à ŕéàçĥàƃļé ÞöšţĝŕéŠǪĻ, þļüš à šĥàŕéđ ĵöƃ ǫüéüé (ŠǪŠ öŕ àñ ŠǪŠ-çöḿþàţîƃļé ƃŕöķéŕ) àñđ Ŕéđîš ŵĥéñ ţĥé šéŕṽéŕ àñđ ŵöŕķéŕ ŕüñ àš šéþàŕàţé þŕöçéššéš.

Ŕüñ ţĥé šéŕṽéŕ (ÞöšţĝŕéŠǪĻ îš ŕéǫüîŕéđ; ţĥé çöññéçţîöñ šţŕîñĝ ḿüšţ üšé ţĥé postgres:// šçĥéḿé):

bowrain-server \
--database-url postgres://bowrain:password@localhost/bowrain \
--jwt-secret change-me-in-production \
--oidc-issuer-url https://keycloak.example.com/realms/bowrain \
--oidc-client-id bowrain \
--oidc-client-secret your-client-secret \
--port 8080

Ţĥé šçĥéḿà îš çŕéàţéđ àüţöḿàţîçàļļý öñ ƒîŕšţ šţàŕţ; ḿîĝŕàţîöñš ŕüñ öñ šţàŕţüþ. Ţĥé àšýñç ŵöŕķéŕ îš çöñƒîĝüŕéđ éñţîŕéļý ţĥŕöüĝĥ éñṽîŕöñḿéñţ ṽàŕîàƃļéš; šéé Çöñƒîĝüŕàţîöñ.

šýšţéḿđ šéŕṽîçé

/etc/systemd/system/bowrain-server.service:

[Unit]
Description=Bowrain Server
After=network.target

[Service]
Type=simple
User=bowrain
Group=bowrain
Environment=BOWRAIN_DATABASE_URL=postgres://bowrain:password@localhost/bowrain
Environment=BOWRAIN_QUEUE_BACKEND=sqs
Environment=SQS_ENDPOINT=http://localhost:9324
Environment=BOWRAIN_EVENT_BACKEND=redis
Environment=BOWRAIN_REDIS_URL=redis://localhost:6379
ExecStart=/usr/local/bin/bowrain-server \
--jwt-secret ${BOWRAIN_JWT_SECRET} \
--oidc-issuer-url https://keycloak.example.com/realms/bowrain \
--oidc-client-id bowrain \
--oidc-client-secret ${BOWRAIN_OIDC_CLIENT_SECRET} \
--port 8080
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

Éñàƃļé àñđ šţàŕţ:

sudo systemctl daemon-reload
sudo systemctl enable --now bowrain-server
sudo systemctl status bowrain-server

ÖÎĐÇ þŕöṽîđéŕ šéţüþ

Bowrain Šéŕṽéŕ ŕéǫüîŕéš àñ ÖÎĐÇ þŕöṽîđéŕ ƒöŕ àüţĥéñţîçàţîöñ. Àñý ÖÎĐÇ-çöḿþļîàñţ þŕöṽîđéŕ ŵöŕķš (Ķéýçļöàķ, Àüţĥ0, Öķţà, Àžüŕé ÀĐ, Đéẋ). Ţĥé ļöçàļ šţàçķ àƃöṽé îḿþöŕţš à þŕé-çöñƒîĝüŕéđ Ķéýçļöàķ ŕéàļḿ àüţöḿàţîçàļļý; ƒöŕ ýöüŕ öŵñ þŕöṽîđéŕ šéé ţĥé ÖÎĐÇ þŕöṽîđéŕ šéţüþ îñ Šéļƒ-Ĥöšţîñĝ.

Ĥéàļţĥ çĥéçķ

Ṽéŕîƒý ţĥé šéŕṽéŕ îš ŕüññîñĝ:

curl http://localhost:8080/api/v1/health

Ñéẋţ šţéþš