# Réglages

> La source, le réseau, la taille, la commande de démarrage.

Une seule lecture rassemble ce qui se règle sur un service, et trois écritures le
changent. Ces routes ne valent que pour ce qui tourne sur notre daemon : serveurs de jeu
et applications, bases de données comprises.

## Tout lire

```http
GET /api/resources/{id}/settings
```

```json
{
  "source": {
    "kind": "image",
    "reference": "registry.arkya.gg/c-7f3a91c04d2e/demo-app@sha256:717869a0…",
    "digest": "sha256:717869a0…",
    "tag": "20260916T204458",
    "releasedAt": "2026-09-16T20:45:00.646Z",
    "origin": "Poussée depuis ton poste avec ark deploy"
  },
  "network": {
    "alias": "demo-app",
    "project": "arkya-prj-prj_0d3b6964bcbe4fd8518f",
    "internalPort": 30010,
    "publicIp": null,
    "publicPort": null,
    "isPublic": false,
    "editable": true
  },
  "scale": {
    "cpuCores": 1, "ramGb": 1, "storageGb": 15,
    "cpuMin": 1, "cpuMax": 16,
    "ramMinGb": 1, "ramMaxGb": 128,
    "storageMinGb": 10, "storageMaxGb": 500,
    "cpuMillicentsPerMonth": 420,
    "ramMillicentsPerGbMonth": 560,
    "storageMillicentsPerGbMonth": 8,
    "optionsMillicents": 0,
    "monthlyMillicents": 1100,
    "editable": true,
    "lockedReason": null
  },
  "deploy": { "command": "", "defaultCommand": null, "editable": true },
  "deletable": true
}
```

`kind` vaut `image` quand l'image vient du registre ou du catalogue, `runtime` quand
c'est une édition maison (un serveur de jeu). Les bornes `cpuMin`…`storageMaxGb` sont
celles du **nœud** qui héberge : elles décident ce que `PUT /scale` acceptera.

## Réseau

```http
PUT /api/resources/{id}/network
```

```json
{ "isPublic": false }
```

Fermé, le service garde son port réservé et **reste joignable par ses voisins du projet**
sous son `alias` — rien n'est publié sur le nœud. Ouvert, il répond sur
`publicIp:publicPort`.

Ouvrir alors qu'aucun port n'est encore réservé en prend un sur l'IP partagée du nœud.
S'il n'y en a plus, la route rend un `409`.

<Warning>
Un changement de réseau **refait le conteneur** : le service s'arrête et redémarre, parce
que Docker fige les ports publiés à la création. La route ne rend la main qu'une fois
l'opération faite. Un service déjà arrêté n'est pas démarré pour l'occasion : il prendra
le réglage à son prochain démarrage.
</Warning>

## Taille

```http
PUT /api/resources/{id}/scale
```

```json
{ "cpuCores": 2, "ramGb": 4, "storageGb": 20 }
```

Les trois champs sont obligatoires : envoie la taille voulue en entier, pas un delta.

- Les valeurs doivent tenir dans les bornes du nœud, sinon `400`.
- **Le disque ne se réduit pas** : tes fichiers y sont. Demander moins rend un `400`.
- Le tarif est recalculé aux tarifs du nœud et court dès l'instant de l'appel. La
  facturation en cours est soldée à l'ancien tarif avant l'écriture, pour que la tranche
  non facturée ne change pas de prix rétroactivement.
- Un service gratuit ou suspendu ne se retaille pas : `scale.lockedReason` dit pourquoi.

Processeur et mémoire s'appliquent **à chaud**, sans redémarrage. Un processus qui a lu
sa mémoire à son démarrage — une JVM et son `-Xmx`, par exemple — garde son idée jusqu'à
son prochain redémarrage : c'est la limite du cgroup qui bouge, pas ce qu'il en a déduit.

## Commande de démarrage

```http
PUT /api/resources/{id}/deploy
```

```json
{ "command": "node server.js" }
```

La ligne lancée dans le conteneur, appliquée au prochain démarrage. Une chaîne vide
rétablit celle d'origine — `deploy.defaultCommand` la donne quand elle existe.

## Changer de projet

```http
PUT /api/resources/{id}/project
```

```json
{ "projectId": "prj_0d3b6964bcbe4fd8518f" }
```

Le service rejoint le réseau privé du projet visé et quitte l'ancien. Son alias ne change
pas, mais **ses anciens voisins ne le joignent plus**.
