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