Infrastructure: MinIO service added to docker-compose (prod + dev) with
minio-init container that creates the avatars bucket with public read
policy. Traefik routes minio.task.beetech.dev → port 9000.
Backend: native MinIO SDK integration via MinioStorageService;
UploadUserPhotoUseCase validates 5 MB limit and image content-type;
new POST /auth/profile/photo endpoint (multipart). All hardcoded
ui-avatars.com fallback URLs removed from 6 use cases — backend now
returns null when user has no photo.
Frontend: ProfilePage gains clickable avatar with camera overlay,
file picker, preview, and photo upload on save. UserAvatar gains
onError handler for broken URLs and xs size. OrganizationAdminPage
replaces hardcoded ui-avatars.com with UserAvatar component.
CI/CD: deploy-main.yml passes 5 new MinIO secrets to the server and
writes them to .env.production.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove leading slash from smallrye-health.root-path so the health
endpoint resolves to /backend/q/status (relative to non-app root)
instead of the unreachable absolute path /status
- Clean up docker-compose traefik labels (remove stale comments)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>