Îñšţàļļîñĝ Bowrain Šéŕṽéŕ
À Bowrain đéþļöýḿéñţ îš šéṽéŕàļ çööþéŕàţîñĝ šéŕṽîçéš, ñöţ à šîñĝļé ƃîñàŕý:
- bowrain-šéŕṽéŕ: ţĥé ŔÉŠŢ + ĝŔÞÇ ÀÞÎ (öñé þŕöçéšš; ĝŔÞÇ îš ḿüļţîþļéẋéđ öñţö ţĥé ĤŢŢÞ þöŕţ).
- bowrain-ŵöŕķéŕ: ţĥé àšýñç ŵöŕķéŕ ţĥàţ îñĝéšţš þüšĥéš àñđ ŕüñš ţĥé đŕàƒţîñĝ ĵöƃš à ŕüñ éñǫüéüéš àĝàîñšţ àñ üþšţŕéàḿ ÀÎ þŕöṽîđéŕ.
- ÞöšţĝŕéŠǪĻ: ţĥé àüţĥöŕîţàţîṽé šţöŕé (þŕöĵéçţš, ƃļöçķš, ŵöŕķšþàçéš, üšéŕš, ĵöƃš). Ţĥé šéŕṽéŕ ŕéǫüîŕéš ÞöšţĝŕéŠǪĻ; ţĥéŕé îš ñö ŠǪĻîţé öŕ ƒîļé ƃàçķéñđ.
- À ĵöƃ ǫüéüé (Àḿàžöñ ŠǪŠ, öŕ àñ ŠǪŠ-çöḿþàţîƃļé ƃŕöķéŕ šüçĥ àš ÉļàšţîçḾǪ) àñđ Ŕéđîš ƒöŕ ţĥé éṽéñţ ƃüš (Ŕéđîš Šţŕéàḿš), šĥàŕéđ ƃý ţĥé šéŕṽéŕ àñđ ŵöŕķéŕ.
- bowrain-ŵéƃ: ţĥé šţàţîç ŵéƃ ÜÎ, šéŕṽéđ àš îţš öŵñ çöñţàîñéŕ.
- Àñ ÖÎĐÇ îđéñţîţý þŕöṽîđéŕ (ƒöŕ éẋàḿþļé Ķéýçļöàķ) àñđ àñ ŠḾŢÞ šéñđéŕ.
Ţĥîš þàĝé çöṽéŕš ļöçàļ éṽàļüàţîöñ. Ƒöŕ à þŕöđüçţîöñ šţàçķ ŵîţĥ ŢĻŠ, ƃàçķüþš, àñđ à ŕéṽéŕšé þŕöẋý, šéé Šéļƒ-Ĥöšţîñĝ, ŵĥîçĥ îš ţĥé çàñöñîçàļ ŕéƒéŕéñçé ƒöŕ ţĥé ƒüļļ àŕçĥîţéçţüŕé àñđ ţĥé çöḿþļéţé éñṽîŕöñḿéñţ-ṽàŕîàƃļé šéţ.
Öñé-çöḿḿàñđ ļöçàļ šţàçķ
Ţĥé ŕéþöšîţöŕý šĥîþš à šéļƒ-çöñţàîñéđ ļöçàļ šţàçķ àţ bowrain/compose.full.yaml: šéŕṽéŕ, ŵöŕķéŕ, ÞöšţĝŕéŠǪĻ, ÉļàšţîçḾǪ (ŠǪŠ-çöḿþàţîƃļé ĵöƃ ǫüéüé), Ŕéđîš, ḾîñÎÖ, Ķéýçļöàķ (ŵîţĥ à þŕé-îḿþöŕţéđ ŕéàļḿ), àñđ Ḿàîļþîţ. Îţ đéƒàüļţš ţö ţĥé öƒƒļîñé demo þŕöṽîđéŕ, šö ţĥé ƒüļļ þüšĥ → đŕàƒţ → þüļļ çýçļé ŵöŕķš ŵîţĥ ñö ÀÞÎ ķéýš àñđ ñö ÖÎĐÇ šéţüþ:
docker compose -f bowrain/compose.full.yaml up -d --build --wait
Éñđþöîñţš öñçé îţ îš üþ:
| ÜŔĻ | Šéŕṽîçé |
|---|---|
http://localhost:8080 | bowrain-šéŕṽéŕ ÀÞÎ (àñđ ţĥé ŵéƃ ÜÎ ŵîţĥ --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
Ñéẋţ šţéþš
- Çöñƒîĝüŕàţîöñ: ţĥé çöḿþļéţé éñṽîŕöñḿéñţ-ṽàŕîàƃļé àñđ ÇĻÎ-ƒļàĝ ŕéƒéŕéñçé.
- Ĝéţţîñĝ Šţàŕţéđ: ƒîŕšţ ļöĝîñ, ŵöŕķšþàçéš, îñṽîţàţîöñš.
- Šéļƒ-Ĥöšţîñĝ: þŕöđüçţîöñ đéþļöýḿéñţ ŵîţĥ ŢĻŠ àñđ ƃàçķüþš.