Object Storage

Simpan file aplikasi di Object Storage S3: Laravel, Node.js, Python, dan domain sendiri

Sambungkan aplikasi Laravel, Node.js, atau Python ke Object Storage AwanCerah: upload file, link unduhan sementara, akses publik, dan domain sendiri dengan HTTPS otomatis.

Diperbarui 12 November 2026 · ±4 menit baca

Menyimpan file upload di Object Storage membuat server aplikasi tetap ringan. File tidak ikut hilang saat server dibuat ulang, dan bisa dipakai bersama oleh beberapa server sekaligus. Panduan ini menunjukkan cara menyambungkan Laravel, Node.js, dan Python ke Object Storage AwanCerah, lalu menyajikan file publik lewat domain Anda sendiri.

Yang perlu disiapkan

  1. S3 Account dan bucket. Bila belum punya, ikuti panduan Mulai memakai Object Storage S3.
  2. Access key khusus aplikasi: klik Buat access key, pilih Bucket tertentu, lalu beri izin Baca & tulis ke bucket aplikasi.
  3. Endpoint dan region dari kartu Akses S3: https://s3.awanbaru.my.id dan pwt1.

Contoh di bawah memakai bucket toko-foto. Ganti dengan nama bucket Anda. Kodenya sudah kami uji ke endpoint AwanCerah dengan SDK versi terbaru: AWS SDK for PHP (dipakai driver S3 Laravel), AWS SDK for JavaScript v3, dan boto3.

Laravel

Pasang driver S3 Laravel:

composer require league/flysystem-aws-s3-v3 "^3.0" --with-all-dependencies

Isi .env. Disk s3 bawaan Laravel di config/filesystems.php sudah membaca variabel ini:

FILESYSTEM_DISK=s3
AWS_ACCESS_KEY_ID=<access key>
AWS_SECRET_ACCESS_KEY=<secret key>
AWS_DEFAULT_REGION=pwt1
AWS_BUCKET=toko-foto
AWS_ENDPOINT=https://s3.awanbaru.my.id
AWS_USE_PATH_STYLE_ENDPOINT=true

Simpan, buat link, dan hapus file:

use Illuminate\Support\Facades\Storage;

// simpan file dari form upload, hasilnya path seperti "produk/abc123.jpg"
$path = $request->file('foto')->store('produk', 's3');

// link unduhan sementara 15 menit untuk file privat
$url = Storage::disk('s3')->temporaryUrl($path, now()->addMinutes(15));

// hapus file
Storage::disk('s3')->delete($path);

Bila bucket dibuka untuk publik, isi juga AWS_URL dengan alamat publik bucket, misalnya https://toko-foto.web.awanbaru.my.id. Setelah itu Storage::disk('s3')->url($path) langsung menghasilkan link publik.

Node.js

Pasang AWS SDK for JavaScript v3:

npm install @aws-sdk/client-s3 @aws-sdk/s3-request-presigner
import { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';

const s3 = new S3Client({
  region: 'pwt1',
  endpoint: 'https://s3.awanbaru.my.id',
  forcePathStyle: true,
  credentials: {
    accessKeyId: process.env.S3_ACCESS_KEY,
    secretAccessKey: process.env.S3_SECRET_KEY,
  },
  // supaya link upload sementara (presigned PUT) tidak ditolak, lihat catatan di bawah
  requestChecksumCalculation: 'WHEN_REQUIRED',
});

// upload
await s3.send(new PutObjectCommand({
  Bucket: 'toko-foto',
  Key: 'produk/kaos-biru.jpg',
  Body: fileBuffer,
  ContentType: 'image/jpeg',
}));

// link unduhan sementara 15 menit
const url = await getSignedUrl(
  s3,
  new GetObjectCommand({ Bucket: 'toko-foto', Key: 'produk/kaos-biru.jpg' }),
  { expiresIn: 900 },
);

**Kenapa ada requestChecksumCalculation?** Sejak awal 2025, AWS SDK for JavaScript v3 menambahkan checksum isi file ke link upload sementara. Isi file belum ada saat link dibuat, jadi upload lewat link itu ditolak dengan error InvalidDigest. Opsi WHEN_REQUIRED mengembalikan perilaku lama. Upload biasa lewat PutObjectCommand tidak terpengaruh.

Python

pip install boto3
import boto3

s3 = boto3.client(
    's3',
    endpoint_url='https://s3.awanbaru.my.id',
    region_name='pwt1',
    aws_access_key_id='<access key>',
    aws_secret_access_key='<secret key>',
)

# upload file (file besar otomatis dikirim bertahap)
s3.upload_file('laporan.pdf', 'toko-foto', 'dokumen/laporan.pdf')

# link unduhan sementara 15 menit
url = s3.generate_presigned_url(
    'get_object',
    Params={'Bucket': 'toko-foto', 'Key': 'dokumen/laporan.pdf'},
    ExpiresIn=900,
)

Untuk Django, paket django-storages memakai pengaturan yang sama: AWS_S3_ENDPOINT_URL, AWS_S3_REGION_NAME, dan AWS_STORAGE_BUCKET_NAME.

Upload langsung dari browser

File besar tidak perlu lewat server Anda: browser bisa mengirimnya langsung ke S3 memakai link upload sementara (presigned PUT). Izinkan dulu situs Anda di aturan CORS bucket:

  1. Buka bucket, tab Pengaturan, lalu kartu CORS.
  2. Klik Tambah aturan, isi Origin dengan alamat situs Anda, misalnya https://tokoanda.com, lalu centang PUT untuk upload dan GET bila browser juga mengunduh file.
  3. Klik Simpan.

Backend Anda membuat link upload sementara seperti contoh Node.js di atas, lalu browser mengirim file ke link itu:

// di browser: uploadUrl didapat dari backend Anda
await fetch(uploadUrl, {
  method: 'PUT',
  body: file,
  headers: { 'Content-Type': file.type },
});

Bila link dibuat dengan ContentType, browser harus mengirim header Content-Type yang sama. Access key tetap di backend dan tidak pernah dikirim ke browser.

Link unduhan sementara bisa dipakai langsung di browser tanpa aturan CORS, misalnya untuk tombol unduh atau tag <img>.

File publik dan domain sendiri

Untuk gambar produk, aset situs, atau file yang memang boleh dilihat siapa pun, buka akses publik pada bucket:

  1. Buka bucket, lalu tab Akses publik & domain.
  2. Nyalakan Akses publik. Semua file di bucket ini bisa dibuka tanpa access key, jadi simpan file rahasia di bucket lain.
  3. File langsung bisa dibuka di alamat publik bucket, misalnya https://toko-foto.web.awanbaru.my.id/produk/kaos-biru.jpg.

Untuk memakai domain sendiri, misalnya cdn.tokoanda.com:

  1. Di kartu Domain sendiri, isi domain lalu klik Tambah domain.
  2. Console menampilkan record DNS yang perlu dibuat: CNAME untuk subdomain seperti cdn.tokoanda.com, atau A untuk domain utama. Salin jenis, nama, dan nilainya persis ke pengelola DNS domain Anda.
  3. Bila domain memakai Cloudflare, matikan proxy (DNS only). Hapus juga record AAAA untuk nama itu bila ada.
  4. Status berubah menjadi Aktif setelah DNS terdeteksi. Klik Cek sekarang untuk mengecek lebih cepat.

Sertifikat HTTPS dipasang otomatis saat domain pertama kali dibuka.

Situs statis

Bucket publik juga bisa menyajikan situs statis, misalnya hasil build Hugo, Astro, atau React. Upload index.html ke akar bucket beserta file lainnya, dan alamat bucket langsung menampilkan index.html. Halaman 404 khusus belum bisa diatur, jadi aplikasi React atau Vue sebaiknya memakai hash routing.

Tips

  • Pisahkan bucket publik dan bucket privat.
  • Buat satu access key untuk setiap aplikasi. Bila satu key bocor, aplikasi lain tidak ikut terganggu.
  • Simpan access key di environment variable atau file .env, jangan di kode yang masuk Git.
  • Saat kuota S3 Account penuh, upload ditolak dengan error AccessDenied (403). Tangani error ini di aplikasi, dan naikkan paket dari console bila perlu.

Pindahkan file aplikasi ke S3

Server tetap ringan dan file tersimpan di dua server fisik. Paket mulai Rp1.000 per bulan.

Buat S3 Account

Masih ada pertanyaan?

Tim kami siap membantu lewat live chat, email, atau WhatsApp.

Chat WhatsApp support@awancerah.cloud