Updates MinIO credentials to meet minimum length requirements:
- MINIO_ROOT_USER: at least 3 characters (was 'minioadmin')
- MINIO_ROOT_PASSWORD: at least 8 characters (was 'minioadmin')
Now uses environment variables with sensible defaults that can be
overridden via .env file or GitHub Actions secrets.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>