# πŸš€ Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Quoter Quoter - это Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ сСрвис с автоматичСским рСсайзингом ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, систСмой ΠΊΠ²ΠΎΡ‚ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ. ## πŸ“‹ АрхитСктура систСмы ### 1. πŸ” АутСнтификация ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ - **JWT валидация**: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² с Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠ΅ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, Π΄Π»ΠΈΠ½Ρ‹ ΠΈ подписи - **Rate limiting**: ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ запросов ΠΏΠΎ IP с Redis-Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ΠΌ - **Request validation**: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΈ ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠ² - **Session management**: ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ· Redis сСссий ### 2. πŸ“€ ΠŸΡ€ΠΎΡ†Π΅ΡΡ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ``` ΠšΠ»ΠΈΠ΅Π½Ρ‚ β†’ [Auth] β†’ [Quota Check] β†’ [Upload] β†’ [Thumbnail Generation] β†’ [S3 Storage] ``` **Π­Ρ‚Π°ΠΏΡ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ:** 1. **Валидация Ρ‚ΠΎΠΊΠ΅Π½Π°**: JWT ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° + ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ user_id 2. **ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΊΠ²ΠΎΡ‚**: ВСкущая ΠΊΠ²ΠΎΡ‚Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (Π»ΠΈΠΌΠΈΡ‚ 12 Π“Π‘) 3. **Π‘Ρ‚Ρ€ΠΈΠΌΠΈΠ½Π³ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°**: Π§Ρ‚Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° ΠΏΠΎ частям с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Π»ΠΈΠΌΠΈΡ‚ΠΎΠ² 4. **MIME дСтСкция**: АвтоматичСскоС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Ρ„Π°ΠΉΠ»Π° 5. **ГСнСрация UUID**: УникальноС имя Ρ„Π°ΠΉΠ»Π° 6. **Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π² Storj**: ОсновноС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ 7. **Асинхронная гСнСрация ΠΌΠΈΠ½ΠΈΠ°Ρ‚ΡŽΡ€**: Для ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ### 3. πŸ–ΌοΈ БистСма ΠΌΠΈΠ½ΠΈΠ°Ρ‚ΡŽΡ€ **ΠŸΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹:** - `10px` - ΠΌΠΈΠΊΡ€ΠΎ-ΠΏΡ€Π΅Π²ΡŒΡŽ - `40px` - Π°Π²Π°Ρ‚Π°Ρ€Ρ‹ - `110px` - малСнькиС ΠΏΡ€Π΅Π²ΡŒΡŽ - `300px` - срСдниС изобраТСния - `600px` - стандартныС изобраТСния - `800px` - большиС изобраТСния - `1400px` - ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ **Lazy Generation:** - ΠœΠΈΠ½ΠΈΠ°Ρ‚ΡŽΡ€Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ запросу - ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π» возвращаСтся ΠΏΠΎΠΊΠ° гСнСрируСтся ΠΌΠΈΠ½ΠΈΠ°Ρ‚ΡŽΡ€Π° - Асинхронная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π² Ρ„ΠΎΠ½Π΅ - ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² S3 ### 4. πŸ“‚ БистСма Ρ„Π°ΠΉΠ»ΠΎΠ² (Multi-Cloud) ``` β”Œβ”€ Storj S3 (primary) ─┐ β”Œβ”€ AWS S3 (fallback) ─┐ β”‚ β€’ НовыС Ρ„Π°ΠΉΠ»Ρ‹ β”‚ β”‚ β€’ Legacy Ρ„Π°ΠΉΠ»Ρ‹ β”‚ β”‚ β€’ ΠœΠΈΠ½ΠΈΠ°Ρ‚ΡŽΡ€Ρ‹ β”‚ β”‚ β€’ Backup β”‚ β”‚ β€’ ОсновноС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ β”‚ β”‚ β€’ Migration source β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` **Π›ΠΎΠ³ΠΈΠΊΠ° обслуТивания:** 1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π² Storj (основноС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅) 2. Fallback Π½Π° AWS S3 (legacy Ρ„Π°ΠΉΠ»Ρ‹) 3. АвтоматичСская миграция AWS β†’ Storj ΠΏΡ€ΠΈ запросС 4. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡƒΡ‚Π΅ΠΉ (`production/image/`, etc.) ### 5. πŸ” ΠžΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² (GET) ``` Request β†’ [Security] β†’ [Cache Check] β†’ [File Lookup] β†’ [Resize] β†’ [Response] ``` **ΠŸΡ€ΠΎΡ†Π΅ΡΡ:** 1. **Security ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ**: Rate limits, ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ 2. **ETag ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅**: HTTP 304 для Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² 3. **Path parsing**: Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° 4. **File lookup**: Поиск Π² Π±Π°Π·Π΅ ΠΏΡƒΡ‚Π΅ΠΉ ΠΈΠ»ΠΈ ΠΏΠΎ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρƒ 5. **Resize logic**: Π’Ρ‹Π±ΠΎΡ€ блиТайшСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΠ»ΠΈ гСнСрация 6. **Cached response**: ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ### 6. πŸ’Ύ Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ²ΠΎΡ‚Π°ΠΌΠΈ **Redis структуры:** ```redis quota:user:{user_id} # ВСкущая ΠΊΠ²ΠΎΡ‚Π° (bytes) files:user:{user_id} # Бписок Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ file_info:{filename} # MIME-type ΠΈ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ rate_limit:{type}:{ip} # Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊΠΈ rate limiting ``` **ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ:** - ΠŸΡ€Π΅Π²Π΅Π½Ρ‚ΠΈΠ²Π½Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ - Streaming ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠΎ частям - Atomic ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ послС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ - Π›ΠΈΠΌΠΈΡ‚: 12 Π“Π‘ Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ### 7. πŸ›‘οΈ БистСма бСзопасности **Π£Ρ€ΠΎΠ²Π½ΠΈ Π·Π°Ρ‰ΠΈΡ‚Ρ‹:** 1. **Network**: Security headers, CORS, payload limits 2. **Application**: Rate limiting, request validation 3. **Authentication**: JWT validation, session management 4. **Monitoring**: Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π°Ρ‚Π°ΠΊ, ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ **Rate Limits:** - ΠžΠ±Ρ‰ΠΈΠ΅ запросы: 100/ΠΌΠΈΠ½ (Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° 5 ΠΌΠΈΠ½) - Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„Π°ΠΉΠ»ΠΎΠ²: 10/5ΠΌΠΈΠ½ (Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° 10 ΠΌΠΈΠ½) - АутСнтификация: 20/15ΠΌΠΈΠ½ (Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° 30 ΠΌΠΈΠ½) ## πŸ”„ ΠŸΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… ### Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„Π°ΠΉΠ»Π° ```mermaid sequenceDiagram Client->>+Quoter: POST / (multipart) Quoter->>+Redis: Validate session Redis-->>-Quoter: User data Quoter->>+Redis: Check quota Redis-->>-Quoter: Current usage Quoter->>+Storj: Upload file Storj-->>-Quoter: Success Quoter->>+Background: Generate thumbnails Quoter->>+Redis: Update quota Quoter-->>-Client: File URL ``` ### ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° ```mermaid sequenceDiagram Client->>+Quoter: GET /file_300.jpg Quoter->>+Cache: Check ETag Cache-->>-Quoter: 304 or miss Quoter->>+Storj: Get thumbnail alt Thumbnail exists Storj-->>Quoter: File data else Thumbnail missing Storj-->>Quoter: Original file Quoter->>Background: Generate thumbnail end Quoter-->>-Client: Image + headers ``` ## πŸ“Š ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ### ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ - **HTTP ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅**: ETag, immutable cache headers - **Lazy thumbnail generation**: ГСнСрация ΠΏΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ - **Асинхронная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°**: ΠΠ΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ - **Local + Redis cache**: ΠœΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ΅ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ - **Streaming uploads**: ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎ частям ### ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ - ВрСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запросов - Бтатистика Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΈΠ½ΠΈΠ°Ρ‚ΡŽΡ€ - ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ rate limiting - ИспользованиС ΠΊΠ²ΠΎΡ‚ ΠΏΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ - Ошибки ΠΈ security события