> ## Documentation Index
> Fetch the complete documentation index at: https://docs.leviacloud.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Siklus hidup VM

> Buat, nyalakan, matikan, restart, resize, snapshot, dan hapus VM.

Endpoint VM butuh `compute:read` (baca) atau `compute:write` (ubah). Snapshot VM memakai `storage:*`. Contoh di halaman ini memakai variabel dari [Quickstart](https://docs.leviacloud.com/quickstart.md).

## Buat VM

**name** `string` *required*

Nama VM, 1–255 karakter.

**region\_id** `string` *required*

Dari `GET /regions`.

**plan\_id** `string` *required*

Dari `GET /plans?region_id=…`. Pilih yang `available: true`.

**image** `string` *required*

Id (slug) image dari `GET /images`, mis. `ubuntu-24-04`.

**ssh\_key\_id** `string` *required*

Dari `GET /ssh-keys` atau `POST /ssh-keys`.

**zone\_id** `string`

Zona. Tanpa ini, dipilih zona dengan ruang terbanyak yang punya image itu.

**vpc\_id** `string`

VPC. Tanpa `vpc_id`/`subnet_id`, VPC default organisasi di region itu dipakai (dibuat saat pertama dipakai).

**subnet\_id** `string`

Subnet di VPC itu.

**network\_type** `string` (default: private)

`public` memberi VM IP publik; `private` (bawaan) tanpa IP publik.

**security\_group\_ids** `string[]`

Maks. 10, dari `GET /security-groups` di VPC yang sama (butuh `network:read`). Kosong = grup `default` VPC.

**user\_data** `string`

Skrip/konfigurasi cloud-init, maks. 16 KB.

**hostname** `string`

Hostname RFC 1123, maks. 63 karakter.

**tags** `string[]`

Maks. 20 tag.

```bash theme={null}
curl -s -X POST "$LEVIA_API/vms" \
  -H "Authorization: Bearer $LEVIA_KEY" -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "name": "web-1",
    "region_id": "'$REGION'",
    "zone_id": "'$ZONE'",
    "plan_id": "'$PLAN'",
    "image": "ubuntu-24-04",
    "ssh_key_id": "'$SSH'",
    "network_type": "public",
    "user_data": "#cloud-config\npackages: [nginx]\n"
  }'
```

Saldo diperiksa sebelum VM dibuat; saldo tidak cukup ditolak `422`. VM baru berstatus `provisioning`; tunggu sampai `running` (lihat [Operasi asinkron](https://docs.leviacloud.com/konsep/operasi-asinkron.md)). Setelah itu `private_ip`, `public_ip` (bila `public`), dan `login_user` (user SSH bawaan image) terisi.

## Status dan aksi

Aksi daya menjawab `202` dengan `pending_action` terisi. Selama `pending_action` terisi, aksi masih berjalan.

| Aksi | Endpoint | Syarat |
| - | - | - |
| Nyalakan | `POST /vms/{id}/start` | VM mati. VM yang dihentikan karena tagihan baru bisa dinyalakan setelah saldo cukup. |
| Matikan | `POST /vms/{id}/stop` | VM menyala. Body opsional `{"force": true}`. |
| Restart | `POST /vms/{id}/restart` | VM menyala |
| Resize | `POST /vms/{id}/resize` `{"plan_id": "…"}` | VM **sudah dimatikan** |

```bash Matikan theme={null}
curl -s -X POST "$LEVIA_API/vms/$VM/stop" -H "Authorization: Bearer $LEVIA_KEY"
```

```bash Matikan paksa theme={null}
curl -s -X POST "$LEVIA_API/vms/$VM/stop" -H "Authorization: Bearer $LEVIA_KEY" \
  -H "Content-Type: application/json" -d '{"force": true}'
```

```bash Nyalakan theme={null}
curl -s -X POST "$LEVIA_API/vms/$VM/start" -H "Authorization: Bearer $LEVIA_KEY"
```

```bash Restart theme={null}
curl -s -X POST "$LEVIA_API/vms/$VM/restart" -H "Authorization: Bearer $LEVIA_KEY"
```

* **Stop biasa** meminta OS shutdown (ACPI). Bila OS tidak merespons, `status_message` menjelaskannya dan Anda bisa mengulang dengan `force: true`, yang langsung mematikan daya.
* Aksi yang tidak cocok dengan status VM ditolak `409`, mis. stop pada VM yang sudah mati.

## Resize

Resize memindahkan VM ke paket lain. Disk hanya bisa membesar, dan akun prabayar harus punya saldo untuk selisih harganya.

**1. Matikan VM**

`POST /vms/{id}/stop`, lalu tunggu `status: stopped` dan `pending_action` kosong.

**2. Resize**

```bash theme={null}
curl -s -X POST "$LEVIA_API/vms/$VM/resize" \
  -H "Authorization: Bearer $LEVIA_KEY" -H "Content-Type: application/json" \
  -d '{"plan_id": "'$NEW_PLAN'"}'
```

Jawaban `202`; tunggu `pending_action` kosong.

**3. Nyalakan lagi**

`POST /vms/{id}/start`, lalu tunggu `running`. Bila disk diperbesar, perbesar partisi/filesystem dari dalam OS bila image tidak melakukannya otomatis.

## Snapshot VM

Snapshot disk utama VM, opsional beserta volume yang terpasang. Butuh `storage:write`.

```bash theme={null}
curl -s -X POST "$LEVIA_API/vms/$VM/snapshots" \
  -H "Authorization: Bearer $LEVIA_KEY" -H "Content-Type: application/json" \
  -d '{"name": "web-1-sebelum-upgrade", "include_volumes": true}'
```

Status `provisioning` sampai `active`. Daftar snapshot VM: `GET /vms/{id}/snapshots`; semua snapshot: `GET /snapshots?source_type=vm`. Lihat [Volume & snapshot](https://docs.leviacloud.com/produk/volume-snapshot.md).

## Hapus VM

```bash theme={null}
curl -s -X DELETE "$LEVIA_API/vms/$VM?release_floating_ips=true" -H "Authorization: Bearer $LEVIA_KEY"
```

* Tagihan VM berhenti. Jawaban `202` (`status: "deleting"`) berarti penghapusan masih berjalan; VM hilang dari daftar setelah selesai.
* Floating IP yang terpasang **tetap milik organisasi** (dan tetap ditagih) kecuali `release_floating_ips=true`.
* Jawaban mencantumkan `released_floating_ips`, `kept_floating_ips`, dan `deleted_snapshots`.

> [!WARNING]
>
> Penghapusan VM tidak bisa dibatalkan. Periksa `deleted_snapshots` di jawaban, dan buat backup data penting di volume terpisah sebelum menghapus.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.