#!/bin/bash # Скрипт для загрузки всех изображений в S3 # Этот скрипт загружает все изображения из static/images в S3 bucket set -e # Остановка при ошибке # Загрузка конфигурации source "$(dirname "$0")/config.sh" # Инициализация init_migration log "Начало загрузки изображений в S3..." # Проверка существования bucket if ! aws s3 ls "s3://$S3_BUCKET" &> /dev/null; then error_log "S3 bucket '$S3_BUCKET' не найден или недоступен" exit 1 fi # Подсчет файлов для загрузки total_files=$(find "$LOCAL_IMAGES_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.gif" -o -iname "*.webp" \) | wc -l) log "Найдено $total_files изображений для загрузки" # Счетчик загруженных файлов uploaded_count=0 error_count=0 # Функция для загрузки файла upload_file() { local file_path="$1" local relative_path="${file_path#$LOCAL_IMAGES_DIR/}" local s3_key="images/$relative_path" # Определение MIME типа local mime_type="" case "${file_path##*.}" in jpg|jpeg) mime_type="image/jpeg" ;; png) mime_type="image/png" ;; gif) mime_type="image/gif" ;; webp) mime_type="image/webp" ;; *) mime_type="application/octet-stream" ;; esac # Загрузка файла if aws s3 cp "$file_path" "s3://$S3_BUCKET/$s3_key" \ --content-type "$mime_type" \ --cache-control "max-age=31536000" \ --metadata-directive REPLACE; then uploaded_count=$((uploaded_count + 1)) log "[$uploaded_count/$total_files] Загружено: $relative_path" else error_count=$((error_count + 1)) error_log "Ошибка загрузки: $relative_path" fi } # Загрузка всех изображений log "Загрузка изображений..." export -f upload_file log error_log export LOCAL_IMAGES_DIR S3_BUCKET uploaded_count error_count total_files LOG_FILE ERROR_LOG find "$LOCAL_IMAGES_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" -o -iname "*.gif" -o -iname "*.webp" \) | while read -r file; do upload_file "$file" done # Загрузка фавикона и фоновых изображений log "Загрузка специальных изображений..." # Фавикон if [ -f "./static/images/favicon.ico" ]; then aws s3 cp "./static/images/favicon.ico" "s3://$S3_BUCKET/images/favicon.ico" \ --content-type "image/x-icon" \ --cache-control "max-age=31536000" log "Загружен favicon.ico" fi # Фоновые изображения for bg_file in "./static/images/bg-"*.jpg "./static/images/DESKTOP_NEW_1.jpg"; do if [ -f "$bg_file" ]; then basename_file=$(basename "$bg_file") aws s3 cp "$bg_file" "s3://$S3_BUCKET/images/$basename_file" \ --content-type "image/jpeg" \ --cache-control "max-age=31536000" log "Загружен фоновый файл: $basename_file" fi done # Настройка публичного доступа для чтения log "Настройка публичного доступа..." aws s3api put-object-acl --bucket "$S3_BUCKET" --key "images/" --acl public-read || true # Применение политики bucket для публичного чтения cat > "$TEMP_DIR/bucket-policy.json" << EOF { "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::$S3_BUCKET/images/*" } ] } EOF aws s3api put-bucket-policy --bucket "$S3_BUCKET" --policy file://"$TEMP_DIR/bucket-policy.json" # Статистика загрузки log "Загрузка завершена!" log "Загружено файлов: $uploaded_count" log "Ошибок: $error_count" log "Общий размер: $(du -sh "$LOCAL_IMAGES_DIR" | cut -f1)" # Проверка нескольких случайных файлов log "Проверка доступности загруженных файлов..." sample_files=($(find "$LOCAL_IMAGES_DIR" -type f -name "*.jpg" | head -3)) for file in "${sample_files[@]}"; do relative_path="${file#$LOCAL_IMAGES_DIR/}" s3_url="$S3_BASE_URL/images/$relative_path" if curl -I "$s3_url" &> /dev/null; then log "✓ Файл доступен: $s3_url" else error_log "✗ Файл недоступен: $s3_url" fi done log "Скрипт 1 завершен. Теперь запустите: ./2-update-content.sh"