- Replace archived MinIO images with community-maintained pgsty images
- Change routing domain to task2.beetech.dev across frontend, backend, and minio
- Avoid port collisions with existing homelab services (postgres port 5434)
- Add .env and *.pem to .gitignore
- Remove legacy deploy/ directory and deploy-main.yml workflow
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>