sunucu.com.tr

Araçlar ve SDK'lar

S3 API'si ile konuşan her araç ve kütüphane çalışır. Uç nokta https://s3.tr.sunucu.com.tr, bölge tr-ist-1 ve path-style ayarını verin; anahtarları ortam değişkeninde tutun. Aşağıdaki örneklerde <ERISIM_ANAHTARI>, <GIZLI_ANAHTAR> ve <bucket-adi> yerine kendi değerlerinizi yazın.

Belgeler ve içindekiler

AWS CLI

AWS CLI v2 ile bir kez profil oluşturun; uç nokta profile kaydedildiği için her komutta --endpoint-url yazmanız gerekmez. Eski sürümler endpoint_url ayarını tanımıyorsa komutlara --endpoint-url https://s3.tr.sunucu.com.tr ekleyin.

Terminal

# Kimlik bilgisini ayrı bir profile kaydedin (AWS CLI v2)
aws configure set aws_access_key_id <ERISIM_ANAHTARI> --profile sunucu
aws configure set aws_secret_access_key <GIZLI_ANAHTAR> --profile sunucu
aws configure set region tr-ist-1 --profile sunucu
aws configure set s3.addressing_style path --profile sunucu
aws configure set endpoint_url https://s3.tr.sunucu.com.tr --profile sunucu

# Listele, yükle, indir, eşitle, sil
aws s3 ls s3://<bucket-adi>/ --profile sunucu
aws s3 cp ./rapor.pdf s3://<bucket-adi>/belgeler/ --profile sunucu
aws s3 cp s3://<bucket-adi>/belgeler/rapor.pdf ./ --profile sunucu
aws s3 sync ./arsiv s3://<bucket-adi>/arsiv --profile sunucu
aws s3 rm s3://<bucket-adi>/belgeler/rapor.pdf --profile sunucu

rclone

rclone eşitleme, kopyalama ve doğrulama için en pratik araçtır. rclone config sihirbazında depolama türü olarak S3 uyumlu sağlayıcıları (s3), sağlayıcı olarak "Other" seçin ya da yapılandırma dosyasına şunu ekleyin:

rclone.conf

# ~/.config/rclone/rclone.conf
[sunucu]
type = s3
provider = Other
access_key_id = <ERISIM_ANAHTARI>
secret_access_key = <GIZLI_ANAHTAR>
region = tr-ist-1
endpoint = https://s3.tr.sunucu.com.tr
force_path_style = true
no_check_bucket = true

Terminal

rclone ls sunucu:<bucket-adi>
rclone copy /var/www/uploads sunucu:<bucket-adi>/uploads --progress
rclone sync /srv/arsiv sunucu:<bucket-adi>/arsiv --transfers 8 --checkers 16
rclone check /srv/arsiv sunucu:<bucket-adi>/arsiv

no_check_bucket = true, rclone'un bucket oluşturmaya çalışmasını engeller: bucket'lar panelden açılır, erişim anahtarının bucket oluşturma yetkisi yoktur.

s3cmd

s3cmd --configure ile ya da ~/.s3cfg dosyasını düzenleyerek ayarlayın. host_bucket değerinin uç noktayla aynı olması path-style kullanılmasını sağlar.

.s3cfg

# ~/.s3cfg
[default]
access_key = <ERISIM_ANAHTARI>
secret_key = <GIZLI_ANAHTAR>
host_base = s3.tr.sunucu.com.tr
host_bucket = s3.tr.sunucu.com.tr
bucket_location = tr-ist-1
use_https = True
signature_v2 = False

Terminal

s3cmd ls s3://<bucket-adi>/
s3cmd put ./yedek.tar.gz s3://<bucket-adi>/yedekler/
s3cmd get s3://<bucket-adi>/yedekler/yedek.tar.gz
s3cmd sync ./site/ s3://<bucket-adi>/site/

Kod örnekleri

Resmi S3 kütüphaneleri doğrudan çalışır. Üç ayar önemlidir: uç nokta, bölge tr-ist-1 ve path-style.

// npm i @aws-sdk/client-s3
import { S3Client, PutObjectCommand, ListObjectsV2Command } from "@aws-sdk/client-s3";
import { readFile } from "node:fs/promises";

const s3 = new S3Client({
  endpoint: "https://s3.tr.sunucu.com.tr",
  region: "tr-ist-1",
  forcePathStyle: true,
  credentials: {
    accessKeyId: process.env.S3_ACCESS_KEY_ID,
    secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
  },
});

await s3.send(new PutObjectCommand({
  Bucket: "<bucket-adi>",
  Key: "belgeler/rapor.pdf",
  Body: await readFile("./rapor.pdf"),
  ContentType: "application/pdf",
}));

const list = await s3.send(new ListObjectsV2Command({ Bucket: "<bucket-adi>", Prefix: "belgeler/" }));
console.log(list.Contents?.map((o) => o.Key));

Süreli paylaşım bağlantısı (presigned URL)

Bucket'lar herkese kapalıdır. Bir dosyayı anahtar paylaşmadan indirtmek ya da kullanıcının tarayıcısından doğrudan yükletmek için süreli imzalı bağlantı üretin. Bağlantı en çok 7 gün geçerli olur ve onu imzalayan anahtarın yetkisiyle çalışır.

aws s3 presign s3://<bucket-adi>/belgeler/rapor.pdf --expires-in 3600 --profile sunucu

IP kısıtlı anahtar

Anahtarınızda IP listesi varsa bağlantı da yalnız o adreslerden açılır. Müşterilerinize ya da ziyaretçilere bağlantı verecekseniz bu iş için IP kısıtı olmayan, yalnız ilgili bucket'a erişen ayrı bir anahtar kullanın.

Büyük dosyalar (multipart)

  • Tek istekte (PUT) en çok 5 GiB yüklenir. Daha büyük dosyalar parçalı yüklenir.
  • Parça sayısı en çok 10.000; son parça hariç her parça en az 5 MiB. 64 MiB parça ile yaklaşık 625 GiB'lık dosya yüklenebilir; daha büyük dosyada parça boyutunu artırın.
  • Yarım kalan parçalı yüklemeler 7 gün sonra kendiliğinden temizlenir; o zamana kadar kotanıza sayılır.
# AWS CLI 8 MB üstünü kendiliğinden parçalı yükler; parça boyutunu büyütmek büyük dosyada hızlandırır
aws configure set s3.multipart_chunksize 64MB --profile sunucu
aws configure set s3.max_concurrent_requests 8 --profile sunucu
aws s3 cp ./vm-disk.img s3://<bucket-adi>/imajlar/ --profile sunucu

# Yarım kalan yüklemeleri listeleyip iptal edin
aws s3api list-multipart-uploads --bucket <bucket-adi> --profile sunucu
aws s3api abort-multipart-upload --bucket <bucket-adi> --key imajlar/vm-disk.img --upload-id <UPLOAD_ID> --profile sunucu

Tarayıcıdan yükleme (CORS)

Kullanıcılarınızın dosyayı sunucunuzdan geçirmeden presigned URL ile doğrudan yüklemesi için bucket'a CORS kuralı ekleyin. Kuralı erişim anahtarınızla S3 API'si üzerinden yazarsınız.

Terminal

# cors.json
{
  "CORSRules": [{
    "AllowedOrigins": ["https://www.alanadiniz.com"],
    "AllowedMethods": ["GET", "PUT"],
    "AllowedHeaders": ["*"],
    "ExposeHeaders": ["ETag"],
    "MaxAgeSeconds": 3000
  }]
}

aws s3api put-bucket-cors --bucket <bucket-adi> --cors-configuration file://cors.json --profile sunucu

Sorun giderme

403 AccessDenied

  • Anahtarın IP listesinde sunucunuzun genel IP adresi var mı?
  • Anahtar tek bucket'a özelse başka bucket'a erişemez.
  • Bucket listesi (ListBuckets; bucket adı vermeden aws s3 ls) erişim anahtarlarına kapalıdır. Komutlarda bucket adını yazın; bucket'larınızı panelde ya da panel API'sinde görürsünüz.
  • Anahtar pasif ya da yenilenmiş olabilir; panelde durumunu kontrol edin.
  • Hizmet askıdaysa bütün istekler reddedilir.

SignatureDoesNotMatch ya da bölge hatası

Bölgeyi tr-ist-1 yazın, path-style'ı açın ve sunucunuzun saatinin doğru olduğundan emin olun (imza 15 dakikadan fazla saat farkını kabul etmez; timedatectl ile NTP'yi açın).

Yeni SDK sürümlerinde checksum hatası

Güncel AWS SDK ve CLI sürümleri yüklemeye varsayılan olarak ek bütünlük özeti ekler. S3 uyumlu depolamalarda bu bazen hata verir; görürseniz yapılandırmada request_checksum_calculation = when_required ve response_checksum_validation = when_required ayarlayın (ortam değişkeni olarak AWS_REQUEST_CHECKSUM_CALCULATION=when_required).

QuotaExceeded

Paket ya da bucket kotası doldu. Gereksiz dosyaları ve eski sürümleri silin ya da daha büyük pakete geçin. Sınırların tamamı Sınırlar ve kurallar sayfasında.