راهنمای استفاده از API آویاتو
در این صفحه، از ساخت کلید API و پیدا کردن UUID پروژه تا دریافت گزینهها، ساخت VM، پیگیری وضعیت، اتصال SSH و حذف امن را قدمبهقدم میبینید.
راهنمای شروع
ترتیب پیشنهادی استفاده از API
وارد پنل شوید و کلید بسازید
UUID پروژه را پیدا کنید
گزینههای ساخت را بخوانید
VM بسازید و وضعیت را بخوانید
در صورت نیاز، VM را حذف کنید
ساخت و حذف فوری نیستند. پس از ارسال درخواست، از endpoint جزئیات استفاده کنید و مقدار provisioning_status یا status را تا پایان عملیات بررسی کنید.
۰۱ · دسترسی
ساخت کلید API و انتخاب دسترسیها
برای ساخت کلید، ابتدا وارد پنل مشتری شوید. لینک «پروفایل» در بالای سمت چپ صفحه قرار دارد؛ روی آن کلیک کنید، وارد صفحه پروفایل شوید و در بخش «دسترسی API» نام کلید را وارد کنید. دسترسیهای مورد نیاز را انتخاب کنید و روی «ساخت کلید API» بزنید. مقدار کلید فقط همان لحظه نمایش داده میشود، پس آن را در محل امن ذخیره کنید.
Authorization: Bearer YOUR_API_KEY ارسال کنید. کلید را داخل کد سمت کاربر، Git یا لاگها قرار ندهید.vm:readخواندن options، list و detail
vm:createارسال درخواست ساخت VM
vm:deleteارسال درخواست حذف VM
برای خواندن، فقط vm:read کافی است. برای ساخت باید vm:create و برای حذف باید vm:delete روی همان کلید فعال باشد. این دسترسیها مستقلاند و یک کلید فقط به endpointهایی دسترسی دارد که ability آن را دارد.
S3 · ۰۱
S3 چیست و چگونه کار میکند؟
S3 یک فضای ذخیرهسازی شیءگراست: فایل شما داخل یک bucket قرار میگیرد و با یک نام یکتا به نام object key قابل دسترسی است. در آویاتو، endpoint استاندارد S3 روی https://s3.aviato.ir ارائه میشود و ابزارهای رسمی AWS CLI، SDK PHP و SDK JavaScript میتوانند به آن متصل شوند.
Bucket
فضای نام پروژه؛ مثل customer-backups
Object key
مسیر منطقی فایل؛ مثل uploads/invoice.pdf
S3 credentials
Access key و secret برای امضای SigV4
orders/2026/07/order-1842.pdf در باکت ذخیره کند و هنگام درخواست مشتری همان فایل را با API دریافت کند؛ فایل روی سرور وب شما عبور نمیکند و مسیر ذخیرهسازی یکپارچه میماند.هر درخواست S3 با AWS Signature Version 4 امضا میشود. کلاینت با access key و secret، متد HTTP، مسیر، هدرها و زمان درخواست را امضا میکند؛ آویاتو امضا را بررسی میکند، پروژه صاحب کلید را پیدا میکند و فقط به باکتهای همان پروژه اجازه دسترسی میدهد.
S3 · ۰۲ · راهاندازی
ساخت باکت و کلید دسترسی
- ۱وارد پنل مشتری شوید و از منوی «فضای ذخیرهسازی» پروژه فعال را انتخاب کنید.
- ۲در بخش «باکتها» یک نام کوچک انگلیسی بسازید؛ مثلا
customer-backups. نام باکت در آویاتو باید یکتا باشد. - ۳در بخش «کلیدهای اتصال» یک توضیح مثل
Production backupsبنویسید و کلید بسازید. - ۴Access key ID و Secret access key را همان لحظه در password manager ذخیره کنید. secret بعدا دوباره نمایش داده نمیشود.
Endpoint
https://s3.aviato.irRegion
aviato-1S3 · ۰۳ · فایل
آپلود و دریافت اولین فایل
بعد از ساخت باکت و کلید، مقدارهای YOUR_ACCESS_KEY_ID، YOUR_SECRET_ACCESS_KEY و YOUR_BUCKET_NAME را در نمونهها جایگزین کنید. مسیر فایل در S3 با ترکیب endpoint، نام باکت و key ساخته میشود:
نمونه زیر فایل محلی invoice-2026-07.pdf را آپلود میکند، سپس همان object را در invoice-downloaded.pdf ذخیره میکند. ابزارها خودشان درخواست را با SigV4 امضا میکنند.
- aws configure set aws_access_key_id YOUR_ACCESS_KEY_ID
- aws configure set aws_secret_access_key YOUR_SECRET_ACCESS_KEY
- aws s3api put-object \
- --endpoint-url https://s3.aviato.ir \
- --region aviato-1 \
- --bucket YOUR_BUCKET_NAME \
- --key uploads/invoice-2026-07.pdf \
- --body ./invoice-2026-07.pdf
- aws s3api get-object \
- --endpoint-url https://s3.aviato.ir \
- --region aviato-1 \
- --bucket YOUR_BUCKET_NAME \
- --key uploads/invoice-2026-07.pdf \
- ./invoice-downloaded.pdf
- use Aws\\S3\\S3Client;
- $s3 = new S3Client([
- 'version' => 'latest',
- 'region' => 'aviato-1',
- 'endpoint' => 'https://s3.aviato.ir',
- 'use_path_style_endpoint' => true,
- 'credentials' => [
- 'key' => 'YOUR_ACCESS_KEY_ID',
- 'secret' => 'YOUR_SECRET_ACCESS_KEY',
- ],
- ]);
- $s3->putObject([
- 'Bucket' => 'YOUR_BUCKET_NAME',
- 'Key' => 'uploads/invoice-2026-07.pdf',
- 'SourceFile' => __DIR__.'/invoice-2026-07.pdf',
- 'ContentType' => 'application/pdf',
- ]);
- $s3->getObject([
- 'Bucket' => 'YOUR_BUCKET_NAME',
- 'Key' => 'uploads/invoice-2026-07.pdf',
- 'SaveAs' => __DIR__.'/invoice-downloaded.pdf',
- ]);
- import { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3';
- import { createReadStream, createWriteStream } from 'node:fs';
- import { pipeline } from 'node:stream/promises';
- const s3 = new S3Client({
- region: 'aviato-1',
- endpoint: 'https://s3.aviato.ir',
- forcePathStyle: true,
- credentials: { accessKeyId: 'YOUR_ACCESS_KEY_ID', secretAccessKey: 'YOUR_SECRET_ACCESS_KEY' },
- });
- await s3.send(new PutObjectCommand({ Bucket: 'YOUR_BUCKET_NAME', Key: 'uploads/invoice-2026-07.pdf', Body: createReadStream('./invoice-2026-07.pdf'), ContentType: 'application/pdf' }));
- const object = await s3.send(new GetObjectCommand({ Bucket: 'YOUR_BUCKET_NAME', Key: 'uploads/invoice-2026-07.pdf' }));
- await pipeline(object.Body, createWriteStream('./invoice-downloaded.pdf'));
aws --version. برای PHP پکیج composer require aws/aws-sdk-php و برای Node پکیجهای npm install @aws-sdk/client-s3 لازم است. کلاینت را server-side اجرا کنید.S3 · ۰۴ · هزینه
هزینه ذخیرهسازی چگونه محاسبه میشود؟
مدل قیمتگذاری MVP آویاتو برای S3 بر دو جزء طراحی شده است:
۱. فضای ذخیرهشده
متوسط فضای مصرفشده در طول روز به GB تبدیل میشود و در نرخ storage GB ضرب میشود.
۲. درخواستها
درخواستهای موفق PUT، GET، HEAD، LIST، DELETE و multipart بر اساس نرخ request محاسبه میشوند.
request charge = successful request units × request rate
total = daily storage charge + request charge
وضعیت فعلی: در این نسخه، ثبت object و شمارنده مصرف آماده است اما settlement و اضافه شدن S3 به invoice هنوز فعال نشده است؛ تا قبل از فعال شدن صورتحساب S3، هزینهای از این بابت به فاکتور اضافه نمیشود. egress، replication، versioning و public access نیز در MVP صورتحساب جداگانه ندارند.
S3 · ۰۵ · عیبیابی
خطاهای رایج S3
| کد | معنی | راهحل |
|---|---|---|
| InvalidAccessKeyId | کلید پیدا نشد یا لغو شده است. | کلید فعال را از صفحه Storage دوباره بررسی کنید. |
| SignatureDoesNotMatch | امضای SigV4 با درخواست یکی نیست. | region را aviato-1 و endpoint را دقیق بررسی کنید؛ ساعت سیستم نیز باید درست باشد. |
| NoSuchBucket / NoSuchKey | باکت یا key وجود ندارد. | نام باکت و key را دقیق و case-sensitive ارسال کنید. |
| AccessDenied | کلید به پروژه صاحب باکت تعلق ندارد. | از کلید همان project استفاده کنید. |
/projects/{project_uuid}/virtual-machines/options
vm:read
اول گزینههای قابل استفاده را دریافت کنید
قبل از ساخت VM این endpoint را صدا بزنید. از پاسخ آن، ID مربوط به location، image و bundle را انتخاب کنید؛ این IDها را دستی حدس نزنید یا از یک پروژه دیگر کپی نکنید. پاسخ شامل locationهای فعال، imageهای فعال، نسخههای سیستمعامل، bundleهای مجاز، منابع، قیمت، ظرفیت IP، موجودی کیف پول و وضعیت quota است.
برای انتخاب معتبر، ابتدا image را انتخاب کنید، سپس یکی از locationهایی را بردارید که در location_ids آن image آمده است. اگر bundle استفاده میکنید، ID آن باید در allowed_bundle_ids image باشد. اطلاعات محرمانه زیرساخت در پاسخ نمایش داده نمیشود.
- curl -X GET "https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/options" \
- -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_KEY"
- $response = Http::withToken('YOUR_API_KEY')
- ->acceptJson()
- ->get('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/options');
- $options = $response->json('data');
- const response = await fetch('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/options', {
- headers: {
- Accept: 'application/json',
- Authorization: 'Bearer YOUR_API_KEY',
- },
- });
- const options = (await response.json()).data;
۰۲ · پروژه
پیدا کردن UUID پروژه
درخواستهای VM با UUID پروژه ارسال میشوند، نه با نام پروژه. وارد پنل مشتری شوید و پروژه مورد نظر را باز کنید؛ UUID واقعی پروژه را از آدرس صفحه یا بخش جزئیات همان پروژه بردارید و جای YOUR_PROJECT_UUID قرار دهید.
اگر کلید متعلق به مشتری دیگری باشد، عضو پروژه نباشد، یا ability لازم را نداشته باشد، API دسترسی را رد میکند. تغییر UUID در URL باعث دیده شدن VMهای پروژه دیگر نمیشود.
/projects/{project_uuid}/virtual-machines
vm:create
ساخت VM
پس از دریافت options، IDهای انتخابشده را در این درخواست قرار دهید. cloud_image_id الزامی است. اگر vm_bundle_id بفرستید، CPU، RAM و disk از همان bundle خوانده میشود. اگر bundle نمیفرستید، هر سه cpu_cores، ram_gb و disk_gb الزامیاند.
نام نمایشی، username و SSH key اختیاریاند. سرویس quota، موجودی و قفل بودن wallet، سازگاری image/location/bundle، حداقل منابع و ظرفیت IP را بررسی میکند. پاسخ موفق با 201 Created برمیگردد و VM ابتدا در وضعیت pending است.
generated_login_password پاسخ create قرار میگیرد. آن را همان لحظه ذخیره کنید؛ در list و detail قابل بازیابی نیست.- curl -X POST "https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines" \
- -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
- -d '{"infrastructure_location_id":12,"cloud_image_id":4,"vm_bundle_id":2,"display_name":"My Production Server","login_username":"ubuntu","ssh_public_key":"ssh-ed25519 ..."}'
- $response = Http::withToken('YOUR_API_KEY')
- ->acceptJson()
- ->post('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines', [
- 'infrastructure_location_id' => 12,
- 'cloud_image_id' => 4,
- 'vm_bundle_id' => 2,
- 'display_name' => 'My Production Server',
- 'login_username' => 'ubuntu',
- 'ssh_public_key' => 'ssh-ed25519 ...',
- ]);
- $createdVm = $response->json('data');
- const response = await fetch('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines', {
- method: 'POST',
- headers: {
- Accept: 'application/json',
- Authorization: 'Bearer YOUR_API_KEY',
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- infrastructure_location_id: 12, cloud_image_id: 4, vm_bundle_id: 2,
- display_name: 'My Production Server', login_username: 'ubuntu',
- ssh_public_key: 'ssh-ed25519 ...',
- }),
- });
- const createdVm = (await response.json()).data;
/projects/{project_uuid}/virtual-machines
vm:read
دیدن VMهای پروژه
برای نمایش فهرست VMها، این endpoint را صدا بزنید. نتیجه صفحهبندی میشود؛ per_page تعداد رکوردهای هر صفحه را مشخص میکند، search در نام، hostname یا IP جستوجو میکند و status میتواند running، stopped، suspended یا deleting باشد. VMهای deleted به صورت پیشفرض برگردانده نمیشوند.
- curl -X GET "https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines?per_page=25" \
- -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_KEY"
- $vms = Http::withToken('YOUR_API_KEY')
- ->acceptJson()
- ->get('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines', ['per_page' => 25])
- ->json('data');
- const response = await fetch('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines?per_page=25', {
- headers: { Accept: 'application/json', Authorization: 'Bearer YOUR_API_KEY' },
- });
- const vms = (await response.json()).data;
/projects/{project_uuid}/virtual-machines/{virtual_machine_uuid}
vm:read
خواندن وضعیت و اطلاعات اتصال
بعد از create، UUID VM را از پاسخ بگیرید و این endpoint را با همان UUID بخوانید. تا زمانی که provisioning_status برابر pending است، چند ثانیه صبر کنید و دوباره درخواست بفرستید. وقتی ssh_ready برابر true شد، میتوانید از username و ssh_command استفاده کنید. رمز عبور در این endpoint نمایش داده نمیشود.
- curl -X GET "https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/YOUR_VM_UUID" \
- -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_KEY"
- $vm = Http::withToken('YOUR_API_KEY')
- ->acceptJson()
- ->get('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/YOUR_VM_UUID')
- ->json('data');
- const response = await fetch('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/YOUR_VM_UUID', {
- headers: { Accept: 'application/json', Authorization: 'Bearer YOUR_API_KEY' },
- });
- const vm = (await response.json()).data;
/projects/{project_uuid}/virtual-machines/{virtual_machine_uuid}
vm:delete
حذف VM
برای جلوگیری از حذف اشتباه، مقدار confirmation در بدنه درخواست باید دقیقاً با display_name VM یکسان باشد. بعد از پذیرش درخواست، وضعیت VM فوراً deleting میشود و حذف زیرساخت در پسزمینه انجام میشود. تا پایان کار، detail را دوباره بخوانید. درخواست تکراری همان VM نتیجهای امن و idempotent دارد.
- curl -X DELETE "https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/YOUR_VM_UUID" \
- -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
- -d '{"confirmation":"My Production Server"}'
- $response = Http::withToken('YOUR_API_KEY')
- ->acceptJson()
- ->delete('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/YOUR_VM_UUID', [
- 'confirmation' => 'My Production Server',
- ]);
- const response = await fetch('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/YOUR_VM_UUID', {
- method: 'DELETE',
- headers: {
- Accept: 'application/json',
- Authorization: 'Bearer YOUR_API_KEY',
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({ confirmation: 'My Production Server' }),
- });
- const deletion = (await response.json()).data;
۰۳ · وضعیتها
کدام وضعیت را باید منتظر بمانید؟
pendingدرخواست ثبت شده است. چند ثانیه بعد detail را دوباره بخوانید.
readyآماده استفاده است؛ اگر IP موجود باشد SSH هم آماده است.
failedآمادهسازی موفق نشده است. مقدار failure را بخوانید و برای پشتیبانی request ID را نگه دارید.
deleting / deletedحذف در حال انجام است یا رکورد به طور کامل حذف شده است.
رمز عبور و SSH
اگر در create رمز عبور ارسال نکنید، سرویس ممکن است یک رمز تولید کند و آن را فقط در همان پاسخ با نام generated_login_password برگرداند. آن را همان لحظه در محل امن ذخیره کنید؛ مسیر بازیابی رمز وجود ندارد و detail آن را نشان نمیدهد.
برای اتصال، تا آماده شدن VM صبر کنید. وقتی ssh_ready برابر true شد، مقدار login_username و ssh_command را از detail بخوانید.
فیلدهای ساخت و زمان استفاده از آنها
| فیلد | چه زمانی لازم است؟ |
|---|---|
| cloud_image_id | همیشه؛ از options انتخاب کنید. |
| infrastructure_location_id | برای انتخاب location مشخص؛ باید با image سازگار باشد. |
| vm_bundle_id | برای استفاده از bundle آماده و منابع/قیمت آن. |
| cpu_cores, ram_gb, disk_gb | فقط وقتی bundle نمیفرستید؛ هر سه لازماند. |
| display_name, login_username, ssh_public_key | اختیاری؛ برای نام و روش اتصال دلخواه. |
اگر درخواست خطا داد
401 یعنی توکن وجود ندارد یا معتبر نیست. 403 یعنی ability یا دسترسی پروژه کافی نیست. 404 یعنی project یا VM در scope این کلید نیست. 422 یعنی فیلدها، سازگاری، quota، wallet یا ظرفیت IP مشکل دارد و 429 یعنی باید بعداً دوباره درخواست کنید. در همه حالتها meta.request_id را برای پشتیبانی نگه دارید.
{ "error": { "code": "validation_error", "fields": {} }, "meta": { "request_id": "REQUEST_ID" } }نکات امنیتی هنگام استفاده
کلید را در Git، log، مرورگر یا کد frontend نگذارید. برای هر سرویس و محیط یک کلید جدا بسازید، فقط ability لازم را فعال کنید و در صورت افشا از صفحه پروفایل آن را لغو کنید. رمز اولیه را فقط در secret manager ذخیره کنید.
Wallet API برای integrationهای موجود
endpointهای کیف پول برای سازگاری همچنان در دسترساند و به wallet:read نیاز دارند: