# Wat het inrichten van een server installeert en instelt

> Precies wat Vimonto Deploy installeert en instelt bij het inrichten van een Ubuntu-server: gebruikers, SSH, ufw, fail2ban, swap, Nginx, PHP, databases en Redis.

Inrichten (provisioning) is het werk dat een verse Ubuntu-server omzet in een server die klaar is voor je applicaties. Vimonto Deploy doet het direct nadat het [een server aanmaakt](https://ops.vimonto.com/docs/nl/servers/create-a-server) bij je provider, of nadat je [je eigen VPS koppelt](https://ops.vimonto.com/docs/nl/servers/custom-vps). Het werkt het systeem bij, maakt de servergebruiker aan, beveiligt SSH, zet de firewall en automatische beveiligingsupdates aan en installeert de software die het [servertype](https://ops.vimonto.com/docs/nl/servers/server-types) nodig heeft.

Inrichten draait als één taak, stap voor stap, via SSH. Elke stap is een bash-script dat als root draait, bij de eerste fout stopt en veilig opnieuw kan worden uitgevoerd, zodat je mislukt inrichten gewoon opnieuw kunt starten. Het duurt meestal 5 tot 15 minuten.

![De detailpagina van een taak met de stappen, hun status en de uitvoer van elke stap](https://ops.vimonto.com/docs-media/nl/task-detail.webp?v=161e760d "Inrichten is een taak zoals elke andere: elke stap met zijn uitvoer")

## Hoe het inrichten verloopt

De taak deelt de stappen in vier fases in: **Opstarten**, **Beveiligen**, **Software installeren** en **Afronden**.

| Fase | Stappen |
| --- | --- |
| Opstarten | **Privénetwerk aanmaken** (als je om een nieuw netwerk vroeg), **Server aanmaken bij …**, **Wachten tot de server is opgestart**, **Wachten tot de server SSH accepteert** |
| Beveiligen | **Systeem voorbereiden**, **Gebruiker en SSH instellen**, **Firewall instellen**, **Automatische beveiligingsupdates aanzetten** |
| Software installeren | **Nginx installeren**, **PHP … installeren**, **Node.js installeren**, de database **installeren**, **Redis en Memcached installeren**, **Meilisearch installeren**, **Supervisor installeren**, afhankelijk van het type |
| Afronden | **Afronden**, **Monitoring-agent installeren** |

Een eigen VPS slaat de stappen bij de provider over en begint bij **Wachten tot de server SSH accepteert**. Je ziet de voortgang op de pagina van de server en op de pagina [activiteit](https://ops.vimonto.com/docs/nl/organization/activity), met de volledige uitvoer van elk commando onder **Details en logboek**. Je hoeft de pagina niet open te houden.

Zolang de server wordt ingericht (aangemaakt, wachtend op zijn verbindingscommando, aan het inrichten, of daarbij mislukt), is zijn overzicht met de voortgang zijn enige pagina: er is geen zijbalk, en elke andere pagina van de server en van zijn sites leidt terug naar het overzicht. Zijn **Instellingen** openen nog wel vanuit het overzicht, zodat je een server kunt verwijderen waarvan het inrichten mislukte. De zijbalk komt vanzelf terug zodra de server actief is.

## Systeem voorbereiden

- Controleert of de server Ubuntu 24.04 of 26.04 draait, en stopt anders.
- Wacht tot cloud-init klaar is, als de provider dat gebruikt.
- Stelt de hostname in op de servernaam (tenzij de omgeving de hostname zelf beheert) en de tijdzone op UTC.
- Voert `apt-get update` en `apt-get upgrade` uit.
- Installeert basispakketten: `software-properties-common`, `ca-certificates`, `curl`, `gnupg`, `lsb-release`, `unzip`, `zip`, `git`, `jq`, `acl`, `rsync`, `ufw`, `fail2ban`, `unattended-upgrades`, `cron`, `logrotate` en `htop`.
- Maakt **swap** aan als de server die niet heeft: de helft van het geheugen, minstens 1 GB en hoogstens 4 GB, in `/swapfile`. Hosts die geen swap toestaan (sommige containers) gaan zonder verder.
- Stelt de kernel af: `vm.swappiness = 10`, `fs.inotify.max_user_watches = 524288` en `net.core.somaxconn = 65535`.

## De servergebruiker en SSH

Elke server heeft één **systeemgebruiker**, standaard `vimonto`. Je sites, deployments, queue workers en geplande taken draaien als deze gebruiker (een site die je als geïsoleerd aanmaakt, krijgt een eigen Linux-gebruiker; zie [een site aanmaken](https://ops.vimonto.com/docs/nl/sites/create-a-site)).

- De gebruiker wordt aangemaakt met een homemap in `/home/vimonto` en komt in de groepen `sudo` en `www-data`.
- Het **sudo-wachtwoord** wordt voor deze server gegenereerd: 24 willekeurige letters en cijfers. Het wordt één keer getoond wanneer de server wordt aangemaakt (zie [de wachtwoorden van de server bewaren](https://ops.vimonto.com/docs/nl/servers/create-a-server#bewaar-de-wachtwoorden-van-de-server)).
- `~/.ssh/authorized_keys` krijgt de sleutel van Vimonto Deploy voor deze server, de accountsleutels die bij het aanmaken van de server zijn gekozen, de sleutels van de organisatie en de sleutels die de pagina **SSH-sleutels** van de server al voor deze gebruiker toont. Root accepteert dezelfde sleutels.
- De gebruiker krijgt een eigen Ed25519-sleutel (`~/.ssh/id_ed25519`), de **Publieke sleutel van de server** op het overzicht, waarmee hij repository's kan clonen. De SSH-hostsleutels van GitHub, GitLab en Bitbucket worden aan zijn `known_hosts` toegevoegd.
- SSH wordt beveiligd: inloggen met een wachtwoord of keyboard-interactive staat uit, en root mag alleen met een sleutel inloggen (`PermitRootLogin prohibit-password`).

Deployments mogen PHP-FPM en Nginx herladen en Supervisor bedienen zonder wachtwoord; voor al het andere heeft de gebruiker `sudo` met het sudo-wachtwoord nodig.

### De SSH-sleutel van de server in Vimonto Deploy

Daarnaast krijgt elke server bij het aanmaken een eigen Ed25519-sleutelpaar in Vimonto Deploy. Vimonto Deploy gebruikt dat om verbinding te maken voor het inrichten, deployments en al het andere; de privésleutel wordt versleuteld opgeslagen en nooit tussen servers gedeeld. De eerste verbinding legt de SSH-hostsleutel van de server vast, en Vimonto Deploy weigert verbinding te maken als die sleutel ooit verandert.

## Firewall en fail2ban

De firewall `ufw` wordt gereset en zo ingesteld dat al het inkomende verkeer wordt geweigerd en al het uitgaande verkeer is toegestaan. Hij staat toe:

- de SSH-poort (22, of de poort die je voor een eigen VPS invulde), en de poort waarop `sshd` echt luistert als die afwijkt (voor servers achter NAT);
- poorten 80 en 443 op app-servers, webservers en load balancers;
- op database-, cache- en Meilisearch-servers in een [privénetwerk](https://ops.vimonto.com/docs/nl/servers/server-types#servers-in-een-privénetwerk) hun servicepoorten, alleen vanuit het adresbereik van dat netwerk: 3306 (MySQL, MariaDB) of 5432 (PostgreSQL) op een databaseserver, 6379 (Redis) en 11211 (Memcached) op een cacheserver, en 7700 op een Meilisearch-server. Zonder privénetwerk komt er geen regel bij en blijven deze poorten dicht.

`fail2ban` wordt aangezet om adressen te blokkeren die steeds tevergeefs via SSH proberen in te loggen. Beheer firewallregels daarna op de pagina [netwerk](https://ops.vimonto.com/docs/nl/servers/network) van de server, waar de regels van het inrichten staan. Wil je SSH later naar een andere poort verplaatsen, wijzig dan de **SSH-poort** in de [serverinstellingen](https://ops.vimonto.com/docs/nl/servers/server-settings#de-ssh-poort-wijzigen): de firewallregel en fail2ban gaan mee.

## Automatische beveiligingsupdates

`unattended-upgrades` wordt aangezet: pakketlijsten worden bijgewerkt en beveiligingsupdates worden elke dag geïnstalleerd, en oude pakketten worden wekelijks opgeruimd.

## Nginx

Op app-servers, webservers en load balancers:

- Nginx draait als de servergebruiker en verbergt zijn versie (`server_tokens off`).
- Requests tot 64 MB zijn toegestaan (`client_max_body_size 64M`), en gzip-compressie staat aan voor tekst, CSS, JavaScript, JSON, XML en SVG.
- De standaardsite wordt verwijderd. Een catch-all-server beantwoordt requests voor onbekende hostnamen met helemaal niets (status 444), in plaats van de eerste site te tonen.
- De configuratie wordt gecontroleerd met `nginx -t` voordat Nginx wordt herstart.

Elke site krijgt later een eigen configuratie; zie [Nginx](https://ops.vimonto.com/docs/nl/sites/nginx).

## PHP

Op app-, web- en workerservers wordt de PHP-versie die je koos (8.1 tot 8.5) geïnstalleerd uit de repository `ondrej/php`, met PHP-FPM en deze extensies: bcmath, cli, curl, fpm, gd, igbinary, imagick, intl, mbstring, memcached, msgpack, mysql, pgsql, readline, redis, soap, sqlite3, xml en zip.

- PHP-FPM draait als de servergebruiker, met maximaal 5 processen.
- PHP-FPM-instellingen: `memory_limit` 512 MB, uploads tot 64 MB, `max_execution_time` 60 seconden, `max_input_vars` 1000, OPcache aan, `expose_php` uit, tijdzone UTC.
- De opdrachtregel krijgt `memory_limit = 1G`.
- **Composer** wordt geïnstalleerd in `/usr/local/bin/composer`, nadat de handtekening van de installer is gecontroleerd.

Wijzig deze instellingen en installeer meer versies op de pagina [PHP](https://ops.vimonto.com/docs/nl/servers/php).

## Node.js

App- en webservers krijgen Node.js 22 met npm, van NodeSource, om front-end-assets te bouwen tijdens deployments.

## Database

App-servers (tenzij je **Geen** koos) en databaseservers krijgen de database die je koos:

| Database | Geïnstalleerd uit |
| --- | --- |
| MySQL 8.4 LTS | De MySQL-repository van Oracle |
| MySQL 8.0 | Ubuntu |
| MariaDB 11.4 LTS | De repository van MariaDB |
| MariaDB 10.11 LTS | Ubuntu |
| PostgreSQL 18 of 17 | De PostgreSQL-repository |
| PostgreSQL 16 | Ubuntu |

Voor elke database:

- Een databasegebruiker met de naam van de servergebruiker (`vimonto`) wordt aangemaakt met volledige rechten en het **databasewachtwoord**: 32 willekeurige letters en cijfers, één keer getoond. Er wordt ook een database met dezelfde naam aangemaakt.
- MySQL en MariaDB gebruiken `utf8mb4` met `utf8mb4_unicode_ci`, UTC en maximaal 300 verbindingen. De root-gebruiker heeft geen wachtwoord en kan alleen op de server zelf inloggen.
- PostgreSQL gebruikt UTC en maximaal 300 verbindingen, en accepteert inloggen met een wachtwoord (`scram-sha-256`); de firewall bepaalt wie verbinding kan maken.
- Op een **app-server** luistert de database alleen op de server zelf. Op een **databaseserver** luistert hij op alle adressen, zodat je andere servers verbinding kunnen maken: in een privénetwerk laat de firewall ze al toe (zie hierboven), anders zodra je een regel voor ze toevoegt.

Bij het inrichten wordt ook gecontroleerd of de geïnstalleerde versie de versie is die je koos. Beheer databases en gebruikers op de pagina [databases](https://ops.vimonto.com/docs/nl/servers/databases).

## Redis en Memcached

App-servers en cacheservers krijgen Redis en Memcached. Op een app-server luisteren ze alleen op de server zelf. Op een cacheserver luisteren ze op alle adressen en draait Redis zonder protected mode, voor je andere servers; in een privénetwerk staat de firewall hun poorten alleen vanuit dat netwerk toe.

## Meilisearch

Een Meilisearch-server krijgt de nieuwste Meilisearch-binary, die als eigen systeemgebruiker `meilisearch` onder systemd draait, in productiemodus op poort 7700, met data in `/var/lib/meilisearch`. De master key is het gegenereerde wachtwoord dat één keer wordt getoond als **Meilisearch master key**.

## Supervisor

App-, web- en workerservers krijgen Supervisor, dat je queue workers en andere [processen](https://ops.vimonto.com/docs/nl/servers/processes) draaiende houdt.

## Afronden en de monitoring-agent

De laatste stappen:

- twee standaard [geplande taken](https://ops.vimonto.com/docs/nl/servers/scheduler) toevoegen die als root draaien: **Composer bijwerken** (elke nacht) en **Ongebruikte pakketten opruimen** (wekelijks);
- pakketten verwijderen die niet meer nodig zijn en de pakketcache opschonen;
- de Ubuntu-versie en de publieke sleutel van de server vastleggen;
- de **monitoring-agent** installeren: een klein bash-script dat cron elke minuut uitvoert. Het meet CPU, belasting, geheugen, schijf en netwerk, en stuurt die naar Vimonto Deploy. Er luistert niets op de server voor de agent. Zie [monitoring](https://ops.vimonto.com/docs/nl/servers/monitoring).

Mislukt alleen de installatie van de agent, dan is de server toch actief; je kunt de agent opnieuw installeren op de pagina **Monitoring**.

Als alles klaar is, wordt de server **Actief** en zie je op de pagina's wat er is geïnstalleerd: de firewallregels, de PHP-versie, de database en de gebruiker ervan, de SSH-sleutels en de geplande taken.

Leden die de server kunnen zien, krijgen een melding **Server klaar**, of **Een server inrichten is mislukt** als het inrichten met een fout stopt, via de kanalen die ze bij [meldingen](https://ops.vimonto.com/docs/nl/more/notifications) hebben gekozen.

## Wat als het inrichten mislukt?

Wanneer een stap mislukt, stopt de taak, krijgt de server de status **Mislukt** en toont de pagina **Inrichten mislukt** met de stap en de exitcode. De uitvoer onder **Details en logboek** laat zien wat er misging.

1. Lees de uitvoer van de mislukte stap. Veelvoorkomende oorzaken: een pakketmirror die tijdelijk onbereikbaar is, een server die niet binnen 15 minuten opstart of SSH accepteert, een firewall bij de provider die SSH blokkeert, of een systeem dat geen Ubuntu 24.04 of 26.04 is.
2. Los de oorzaak op, als die aan jouw kant ligt.
3. Kies **Opnieuw proberen** op de pagina van de server. Daarvoor heb je het recht nodig om servers aan te maken.

Het inrichten begint dan opnieuw vanaf het begin. Dat is veilig: een server die al bij de provider is aangemaakt, wordt niet opnieuw aangemaakt, elke stap controleert wat al gedaan is, en `apt-get` wacht op locks van automatische updates en probeert het opnieuw. Had je de wachtwoorden al bevestigd, dan worden er nieuwe sudo- en databasewachtwoorden gegenereerd en nog één keer getoond. Er worden dezelfde SSH-sleutels geïnstalleerd als bij de eerste poging, ook als een accountsleutel intussen is verwijderd.

> [!TIP]
> Eén stap mag tot 25 minuten lopen voordat hij wordt gestopt. Een stap die lijkt te hangen, wacht meestal op `apt-get`, dat tot 10 minuten wacht op een lock van de eigen updates van Ubuntu na de eerste keer opstarten.

## Veelgestelde vragen

### Hoe lang duurt het inrichten?

Meestal 5 tot 15 minuten in totaal. Ubuntu bijwerken en de database installeren kosten de meeste tijd; een cacheserver of load balancer is sneller klaar dan een app-server.

### Kan ik de commando's zien die zijn uitgevoerd?

Ja. De uitvoer van elke stap staat in de taak, onder **Details en logboek** op de pagina van de server of op de pagina [activiteit](https://ops.vimonto.com/docs/nl/organization/activity).

### Hoe heet de systeemgebruiker?

Standaard `vimonto`. De naam wordt per server opgeslagen wanneer die wordt aangemaakt.

### Verandert het inrichten mijn server nadat het klaar is?

Nee. Na het inrichten verandert er alleen iets wanneer jij of een deployment dat doet, plus de automatische beveiligingsupdates van Ubuntu en de standaard geplande taken.
