Настройка облачного хранилища Selectel
Selectel предоставляет S3-совместимое объектное хранилище в российских дата-центрах. Подходит для проектов с требованием хранить данные на территории РФ (152-ФЗ).
Создание хранилища и ключей доступа
В панели Selectel: Control Panel → Object Storage → создать бакет. Тип доступа — private. Регион — ru-1 (Санкт-Петербург) или ru-2 (Москва).
Ключи доступа создаются в разделе «Пользователи» → «S3-ключи». Endpoint: https://s3.ru-1.storage.selcloud.ru.
Конфигурация Laravel
AWS_ACCESS_KEY_ID=your_selectel_key
AWS_SECRET_ACCESS_KEY=your_selectel_secret
AWS_DEFAULT_REGION=ru-1
AWS_BUCKET=myapp-uploads
AWS_ENDPOINT=https://s3.ru-1.storage.selcloud.ru
AWS_USE_PATH_STYLE_ENDPOINT=true
// config/filesystems.php
'selectel' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'ru-1'),
'bucket' => env('AWS_BUCKET'),
'endpoint' => env('AWS_ENDPOINT'),
'use_path_style_endpoint' => true,
'throw' => true,
],
// Загрузка файла
$path = Storage::disk('selectel')->putFile('uploads/' . date('Y/m'), $request->file('document'));
// Временная ссылка (presigned URL)
$url = Storage::disk('selectel')->temporaryUrl($path, now()->addHour());
// Публичная ссылка (если бакет public)
$url = Storage::disk('selectel')->url($path);
Node.js с AWS SDK v3
import { S3Client, PutObjectCommand, GetObjectCommand } from "@aws-sdk/client-s3";
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
const s3 = new S3Client({
region: "ru-1",
endpoint: "https://s3.ru-1.storage.selcloud.ru",
forcePathStyle: true,
credentials: {
accessKeyId: process.env.SELECTEL_KEY!,
secretAccessKey: process.env.SELECTEL_SECRET!,
},
});
// Загрузка
await s3.send(new PutObjectCommand({
Bucket: "myapp-uploads",
Key: `uploads/${Date.now()}-${filename}`,
Body: fileBuffer,
ContentType: mimeType,
}));
// Presigned URL для скачивания
const url = await getSignedUrl(s3, new GetObjectCommand({
Bucket: "myapp-uploads",
Key: fileKey,
}), { expiresIn: 3600 });
Политика доступа к бакету
Для раздачи статики публично (например, аватары):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadAvatars",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::myapp-uploads/avatars/*"
}
]
}
Политику применяют через AWS CLI с кастомным endpoint:
aws s3api put-bucket-policy \
--bucket myapp-uploads \
--policy file://bucket-policy.json \
--endpoint-url https://s3.ru-1.storage.selcloud.ru
Синхронизация и backup
# Синхронизация локальной папки в Selectel
aws s3 sync ./backups/ s3://myapp-backups/database/ \
--endpoint-url https://s3.ru-1.storage.selcloud.ru \
--exclude "*.tmp"
# Копирование между бакетами (межрегиональный backup)
aws s3 sync s3://myapp-uploads s3://myapp-uploads-backup \
--endpoint-url https://s3.ru-1.storage.selcloud.ru \
--source-region ru-1
Срок реализации
Интеграция Selectel Object Storage в Laravel или Node.js проект: 1 день. С настройкой политик доступа, CDN и автоматическим backup: 2–3 дня.







