> ## 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.

# Jaringan & floating IP

> VPC, subnet, security group, dan IP publik yang bisa dipindah antar VM.

Endpoint di halaman ini butuh `network:read` (baca) atau `network:write` (ubah).

## VPC

VPC adalah jaringan privat dalam satu region. Setiap organisasi punya **VPC default** per region yang dibuat otomatis saat pertama dipakai (mis. saat membuat VM tanpa `vpc_id`).

```bash theme={null}
curl -s -X POST "$LEVIA_API/vpcs" \
  -H "Authorization: Bearer $LEVIA_KEY" -H "Content-Type: application/json" \
  -d '{"name": "prod", "region_id": "'$REGION'", "ip_range": "10.10.0.0/16"}'
```

* `template`: `simple` (bawaan) membuat satu subnet publik default /20 di **setiap** zona aktif region itu; `public_private` membuat satu subnet publik /20 dan satu subnet privat /20 per zona. Hapus subnet zona yang tidak dipakai dengan `DELETE /vpcs/{id}/subnets/{subnet_id}`.
* `resource_count` di daftar dan detail = jumlah VM, database, load balancer, dan node Kubernetes di VPC itu.
* `DELETE /vpcs/{id}`: VPC harus kosong (tanpa VM, database, load balancer). Subnet dan security group default-nya ikut terhapus. VPC default tidak bisa dihapus.

## Subnet

Satu VPC punya paling banyak 32 subnet. Setiap subnet ada di satu zona.

```bash theme={null}
curl -s -X POST "$LEVIA_API/vpcs/$VPC/subnets" \
  -H "Authorization: Bearer $LEVIA_KEY" -H "Content-Type: application/json" \
  -d '{"name": "app-a", "zone_id": "'$ZONE'", "prefix": 24, "type": "private", "egress_mode": "nat"}'
```

| Field | Arti |
| - | - |
| `cidr` atau `prefix` | CIDR tertentu (mis. `10.10.1.0/24`), atau ukuran prefix untuk meminta CIDR bebas |
| `type` | `public`, atau `private` (tanpa IP publik) |
| `egress_mode` | `nat`: akses internet keluar lewat NAT Gateway VPC; `none`: tanpa |

Hapus subnet: `DELETE /vpcs/{id}/subnets/{subnet_id}`. Subnet harus kosong.

> [!NOTE]
>
> Pengelolaan subnet (`/vpcs/{id}/subnets`, `template`, dan `subnet_id` saat membuat resource) bergantung pada fitur subnet platform. Selama fitur itu belum aktif, endpoint subnet menjawab `404` dan `template`/`subnet_id` ditolak `422`.

## Security group

Security group adalah firewall stateful untuk VM di satu VPC. Tanpa rule: semua trafik keluar diizinkan, tidak ada yang masuk.

```bash theme={null}
curl -s -X POST "$LEVIA_API/security-groups" \
  -H "Authorization: Bearer $LEVIA_KEY" -H "Content-Type: application/json" \
  -d '{
    "name": "web",
    "vpc_id": "'$VPC'",
    "rules": [
      {"direction": "inbound", "protocol": "tcp", "port_range": "22", "source": "203.0.113.7/32", "description": "SSH kantor"},
      {"direction": "inbound", "protocol": "tcp", "port_range": "443", "source": "0.0.0.0/0"},
      {"direction": "inbound", "protocol": "icmp", "source": "any"}
    ]
  }'
```

| Field rule | Nilai |
| - | - |
| `direction` | `inbound` / `outbound` |
| `protocol` | `tcp`, `udp`, `icmp`, `all` |
| `port_range` | Mis. `443` atau `8000-8100` |
| `source` | IP/CIDR; kosong atau `any` = `0.0.0.0/0` |

* **Ganti rule**: `PUT /security-groups/{id}/rules` dengan `{"rules": [...]}` menggantikan **seluruh** daftar rule (`[]` menghapus semua). Berlaku langsung untuk semua VM yang memakai grup itu.
* **Pakai di VM**: kirim `security_group_ids` saat `POST /vms`.
* **Grup default**: setiap VPC punya grup `default` yang **tidak** tampil di `GET /security-groups`. VM tanpa `security_group_ids` memakai grup default itu.
* **Hapus**: `DELETE /security-groups/{id}`. Lepaskan dulu dari semua VM.

## Floating IP

Floating IP adalah IP publik milik organisasi yang bisa dipasang ke VM dan dipindah ke VM lain. Ditagih per jam sejak dipesan sampai dilepas (release), terpasang atau tidak.

**1. Pesan**

```bash theme={null}
curl -s -X POST "$LEVIA_API/floating-ips" \
  -H "Authorization: Bearer $LEVIA_KEY" -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"region_id": "'$REGION'", "zone_id": "'$ZONE'"}'
```

Dengan `vm_id`, IP langsung dipasang ke VM itu (zona IP mengikuti VM).

**2. Pasang ke VM**

```bash theme={null}
curl -s -X POST "$LEVIA_API/floating-ips/$FIP/assign" \
  -H "Authorization: Bearer $LEVIA_KEY" -H "Content-Type: application/json" \
  -d '{"vm_id": "'$VM'"}'
```

VM harus di zona yang sama dengan IP. `status` menjadi `associated`.

**3. Lepas dari VM**

`POST /floating-ips/{id}/unassign`. IP kembali `available` dan tetap milik organisasi (tetap ditagih).

**4. Release**

`DELETE /floating-ips/{id}`. IP kembali ke pool dan tagihannya berhenti.

> [!NOTE]
>
> Floating IP hanya bisa dipasang ke VM. Load balancer sudah punya IP publik sendiri. Saat menghapus VM, floating IP-nya tetap milik organisasi kecuali `DELETE /vms/{id}?release_floating_ips=true`.


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