Налаштування облачного хранилища Selectel
Selectel надає S3-сумісне об'єктне хранилище у російських дата-центрах. Підходить для проектів з вимогою зберігати дані на території РФ (152-ФЗ).
Створення хранилища та ключів доступу
У панелі Selectel: Control Panel → Object Storage → створити bucket. Тип доступу — 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());
// Публічна ссилка (якщо bucket 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
Лінія часу
Інтеграція Selectel Object Storage в Laravel або Node.js проект: 1 день. З налаштуванням політик доступу, CDN та автоматичним backup: 2–3 дні.







