The poll is the fallback, not the mechanism. It is 30s on staging but 300s on production, so a green run could sit five minutes ahead of the deploy it claimed to have made -- the smoke job was absorbing that wait. Copied from easyDent verbatim, including the soft failure: an unset secret or an unreachable API logs and falls back to the poll rather than failing the build. That matters right now because production has no Watchtower HTTP API yet, so the production URL will do nothing until the infra stack there is updated. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WpTYCBLH58XzrM7n3xPJ5N
myAi
The myai.ro platform — a set of .NET microservices (CV matching, RAG, email, CV search, page fetching, …) behind a web frontend + API. Part of the easySoft platform.
Layout
Multiple services (*-api, *-job) + web, sharing a common bootstrap in
startup-helpers/ (Serilog, Swagger, .env/Key Vault loading, middleware). See CLAUDE.md
for the full service map, dependency chain, and conventions.
Run locally
docker compose up --build # or run individual services with: dotnet run --project <svc>
Deploy
CI builds registry.easysoft.ro/apps/myai-*:{staging,production}; Watchtower rolls them out to
the staging (10.0.0.183) + production (10.0.0.248) Portainer stacks. Edge Caddy serves
myai.ro (prod) / myai.easysoft.ro (staging).
Logging
Every service: ConfigureJsonSerilog(name, version) → Serilog Compact JSON to stdout → Grafana
Alloy → Loki. No app metrics/traces (simple services).
See CLAUDE.md for the detailed solution guide and ACCESS.md (local, gitignored) for infrastructure access.