
# `start()`

Démarre un serveur à partir d'un objet de configuration. Retourne un [`SimpleServer`](/fr/docs/typescript-types#simpleserver) qui porte l'URL résolue et une méthode `stop()`.

```typescript
import { start } from 'sovrium'

const server = await start({ name: 'my-app' })

console.log(`Server running at ${server.url}`)
```

`start` valide la configuration face à `AppSchema` avant de lier quoi que ce soit. Une configuration invalide rejette avec une erreur `Sovrium failed to start:` nommant le chemin fautif — jamais un serveur à moitié configuré.

## `StartOptions`

Le second argument, optionnel. Chaque propriété a un défaut opérationnel : `start(app)` seul est donc valide.

| Propriété    | Description                                                                               |
| ------------ | ----------------------------------------------------------------------------------------- |
| `port`       | Numéro de port, `0`–`65535`. `0` prend un port libre. Par défaut : `3000`.                |
| `hostname`   | Interface sur laquelle se lier. Par défaut : `localhost`.                                 |
| `publicDir`  | Répertoire de fichiers statiques. Les fichiers sont servis à leur chemin relatif.         |
| `configPath` | Chemin du fichier de configuration, enregistré dans le verrou pour `restart` et `reload`. |
| `configHash` | Empreinte du contenu de la configuration, utilisée pour détecter les changements.         |

Les deux dernières existent pour les commandes de cycle de vie du CLI. Ne les définissez que si vous réimplémentez `restart`/`reload` vous-même ; sinon, laissez-les tranquilles.

```typescript
import { start } from 'sovrium'

const server = await start(
  {
    name: 'my-app',
    tables: [
      {
        id: 1,
        name: 'tasks',
        fields: [
          { id: 1, name: 'title', type: 'single-line-text', required: true },
          { id: 2, name: 'done', type: 'checkbox' },
        ],
      },
    ],
  },
  {
    port: 8080,
    hostname: '0.0.0.0',
    publicDir: './public',
  }
)
```

## Se lier à un port libre

Passer `port: 0` laisse le système choisir. C'est le motif fiable pour les tests et pour plusieurs instances sur une même machine — relisez le vrai port depuis `server.url` plutôt que de le supposer :

```typescript
const server = await start({ name: 'test-app' }, { port: 0 })

const response = await fetch(`${server.url}/api/health`)
console.log(response.status) // 200

await server.stop()
```

## Arrêter le serveur

`stop()` se résout une fois l'arrêt terminé : un `await` suffit donc à séquencer la fermeture.

```typescript
const server = await start({ name: 'my-app' })

process.on('SIGTERM', async () => {
  await server.stop()
  process.exit(0)
})
```

:::callout
**Un serveur par processus.** `start()` installe des gestionnaires d'arrêt propre sur le processus. L'appeler deux fois dans le même processus vous donne deux serveurs qui se disputent les mêmes signaux — lancez plutôt des processus séparés.
:::

## Pages associées

- [Aperçu de l'API TypeScript](/fr/docs/typescript) — `AppConfig` et les autres fonctions.
- [Référence des types](/fr/docs/typescript-types) — `SimpleServer` et les types de configuration.
- [Commandes de cycle de vie](/fr/docs/cli-lifecycle) — le même comportement depuis le CLI.
- [Variables d'environnement](/fr/docs/env-vars) — `PORT` et les autres entrées d'exécution.
