OpenAPI English gyrohosting.com ↗
Markdown olarak görClaude'da aç ↗

Kova olaylarıyla (webhook) yüklemelere tepki verin

Bir nesne yüklenince ya da silinince imzalı HTTPS çağrısı alın: küçük resim, virüs taraması, indeksleme, eşitleme.

Kova olayı, bir nesne oluşturulunca (yükleme, kopyalama, çok parçalı yükleme), silinince ya da toplu silme yapılınca HTTPS adresinize POST gönderir. Nesne Depolama ve Korumalı Depolama'da çalışır. Gövdede dosyanın kendisi yoktur; yalnız anahtarı, boyutu, ETag'i ve zamanı.

1. Webhook ekleyin#

curl -s -X POST https://www.gyrohosting.com/api/v1/client/cloud/storage/12345/buckets/gyro-proje/events \
  -H "Authorization: Bearer $GYRO_TOKEN" -H "Content-Type: application/json" \
  -d '{"url":"https://ornek.com/s3-olay","events":["storage.object.created"],"prefix":"resimler/","suffix":[".jpg",".png"]}'
# yanıtta "secret" BİR KEZ gelir: saklayın
gyro storage events add 12345 gyro-proje --url https://ornek.com/s3-olay --events storage.object.created --prefix resimler/ --suffix .jpg,.png
gyro storage events test 12345 7
gyro storage events deliveries 12345 7
gyro storage events usage 12345
resource "gyro_storage_bucket_notification" "thumbnails" {
  service_id = 12345
  bucket     = "gyro-proje"
  url        = "https://ornek.com/s3-olay"
  events     = ["storage.object.created"]
  prefix     = "resimler/"
  suffix     = [".jpg", ".png"]
}

2. İmzayı doğrulayın#

Her istekte X-Gyro-Event, X-Gyro-Delivery (tekil kimlik), X-Gyro-Timestamp ve X-Gyro-Signature: sha256=HMAC-SHA256(gizli, timestamp + "." + ham gövde) vardır; hesap webhook'larıyla aynı biçim.

import crypto from "node:crypto";
import express from "express";
const app = express();
app.post("/s3-olay", express.raw({ type: "application/json" }), (req, res) => {
  const ts = req.get("X-Gyro-Timestamp");
  const want = "sha256=" + crypto.createHmac("sha256", process.env.GYRO_EVENT_SECRET).update(ts + "." + req.body).digest("hex");
  const got = req.get("X-Gyro-Signature") || "";
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300 || got.length !== want.length ||
      !crypto.timingSafeEqual(Buffer.from(got), Buffer.from(want))) return res.status(401).end();
  const ev = JSON.parse(req.body);          // drop duplicates with req.get("X-Gyro-Delivery")
  console.log(ev.event, ev.data.bucket, ev.data.key, ev.data.size);
  res.status(204).end();                    // answer within 6 s; do slow work in the background
});
app.listen(8080);
import hashlib, hmac, os, time
from flask import Flask, request, abort
app = Flask(__name__)
SECRET = os.environ["GYRO_EVENT_SECRET"].encode()
@app.post("/s3-olay")
def s3_olay():
    ts, body = request.headers.get("X-Gyro-Timestamp", ""), request.get_data()
    want = "sha256=" + hmac.new(SECRET, ts.encode() + b"." + body, hashlib.sha256).hexdigest()
    if abs(time.time() - int(ts or 0)) > 300 or not hmac.compare_digest(want, request.headers.get("X-Gyro-Signature", "")):
        abort(401)
    ev = request.get_json()   # X-Gyro-Delivery: unique id, ignore repeats
    print(ev["event"], ev["data"]["bucket"], ev["data"].get("key"))
    return "", 204

3. Gövde#

{"id":"0b3c7c9e-6a0e-4c43-9b7b-2f5f1c1c9a11","event":"storage.object.created","created_at":"2026-11-15T10:12:04+03:00",
 "data":{"service_id":12345,"bucket":"gyro-proje","event_time":"2026-11-15T10:12:04+03:00","method":"put","source":"api",
         "key":"resimler/kapak.jpg","access_key_id":"GKxxxxxxxxxxxxxxxxxxxxxxxx","size":248133,"etag":"9b2cf535f27731c974343645a3985328","content_type":"image/jpeg"}}

Olaylar: storage.object.created (method put / multipart), storage.object.deleted, storage.objects.deleted_bulk (anahtar listesi gelmez), storage.test. Korumalı Depolama'da version_id de gelir.

Teslim, sınırlar, fiyat#

En az bir kez, sıra garantisi yok: tekrarları X-Gyro-Delivery ile ayıklayın. 6 saniye içinde 2xx dönün; aksi 8 kez, yaklaşık 2 saat yeniden denenir; art arda 20 hata webhook'u kapatır (PATCH status=active ile açılır). İstekler 45.87.174.151, 45.87.174.153 ve 45.87.174.154 adreslerinden gelir. Hedef genel internette, 443 ya da 8443 portunda https olmalı. Kova başına 5, hizmet başına 20 webhook. Kova başına aylık ücretsiz hak + satın alındığı ay geçerli ön ödemeli olay paketleri; aşım faturası yoktur: hak dolunca yeni olaylar gönderilmez (GET .../events/usage). Yaşam döngüsü kuralının sildiği nesneler olay üretmez.