Claude Code en ChatGPT Codex op een Linux-server installeren: stap voor stap
Van een verse Debian- of Ubuntu-installatie naar een werkende AI-agent: gebruiker en sudo-allowlist, Node.js 22, installatie en aanmelding van Claude Code, Codex CLI en Gemini CLI, regelbestanden, cronjobs, eerste taken en de typische fouten.
Deze handleiding brengt je van een vers geïnstalleerde Debian- of Ubuntu-server naar een werkende AI-agent die logs analyseert, configuraties controleert en onderhoudstaken uitvoert. We richten Claude Code (Anthropic) en Codex CLI (OpenAI, het commandoregelprogramma achter ChatGPT) in, allebei onder een eigen gebruiker met beperkte rechten, en laten Gemini CLI (Google) zien als derde mogelijkheid. Alle commando's zijn getest op een KVM-rootserver van KernelHost met Debian 13 en Ubuntu 24.04. Wat een AI managed server in wezen is en welke architecturen er zijn, lees je in het artikel AI managed server: AI-agents veilig koppelen.
Stand van zaken: september 2026. De programma's ontwikkelen zich snel; controleer opties bij twijfel metclaude --help,codex --helpofgemini --help.
Vereisten
- Een rootserver met Debian 12 of 13 dan wel Ubuntu 22.04 of 24.04 en roottoegang via SSH. Op AlmaLinux en Rocky Linux zijn de stappen hetzelfde, alleen heten de pakketcommando's
dnfin plaats vanapt. - Basisbeveiliging op orde: SSH-login met sleutel, firewall, automatische beveiligingsupdates. De checklist voor nieuwe rootservers behandelt dat.
- Een account bij Anthropic (Claude Pro, Max of Team) of een API-sleutel, een ChatGPT-account (Plus, Pro of Team) of een OpenAI-API-sleutel. Je hebt er maar één van nodig als je maar één programma wilt inrichten.
- Uitgaand HTTPS naar
api.anthropic.comenapi.openai.com. Op KernelHost-servers is dat standaard het geval; een eigen restrictieve firewall moet het toestaan.
Welke server volstaat voor een AI-agent?
Een AI-agent heeft op de server geen bijzondere hardware en geen GPU nodig, want het taalmodel draait bij de aanbieder. Op de server draaien alleen het commandoregelprogramma en Node.js, samen tijdens een sessie meestal een paar honderd megabyte werkgeheugen. Voor een server waarop verder weinig draait, volstaan 2 vCPU en 4 GB RAM. Draait de server daarnaast websites, databases of gameservers, reserveer dan ongeveer 1 GB werkgeheugen voor de agent. Een KVM-rootserver van KernelHost staat in ongeveer 30 seconden klaar, wordt PrePaid zonder minimale looptijd afgerekend en is daardoor ook geschikt als testsysteem waarop je de agent eerst eens uitprobeert.
Stap 1: eigen gebruiker aanmaken en sudo beperken
De agent draait nooit als root. Hij krijgt een eigen account en via een sudo-allowlist precies de commando's die hij nodig heeft. Begin met een paar leescommando's en breid de lijst uit als een taak dat echt vereist.
sudo adduser --disabled-password --gecos "KI-Agent" aiagent
sudo tee /etc/sudoers.d/aiagent >/dev/null <<'EOF'
aiagent ALL=(root) NOPASSWD: /usr/bin/journalctl *, /usr/bin/systemctl status *, /usr/bin/systemctl restart nginx, /usr/bin/apt-get update, /usr/bin/apt-get upgrade -y, /usr/bin/tail *, /usr/bin/df *, /usr/bin/ss *
EOF
sudo chmod 440 /etc/sudoers.d/aiagent
sudo visudo -cf /etc/sudoers.d/aiagent
De laatste regel controleert de syntaxis. Een fout in een sudoers-bestand kan sudo voor iedereen blokkeren, daarom hoort die controle er altijd bij. --disabled-password zorgt ervoor dat niemand zich met een wachtwoord als aiagent kan aanmelden; je schakelt later met sudo -iu aiagent over naar het account. Hoe sudo-gebruikers in principe werken, legt het artikel sudo-gebruiker aanmaken op Linux uit.
Schrijfrechten gericht toekennen in plaats van een editor via sudo
Moet de agent bestanden in /etc wijzigen, geef hem dan geen sudo-toegang tot nano (daarmee zou elk bestand te bewerken zijn, ook /etc/sudoers), maar werk met een groep en gerichte schrijfrechten, bijvoorbeeld setfacl -m u:aiagent:rw /etc/nginx/sites-available/meine-seite.conf. Om te beginnen is het ruim voldoende als de agent wijzigingen voorstelt en jij ze doorvoert.
Hetzelfde geldt voor commando's met jokertekens in de allowlist. /usr/bin/tail * laat de agent elk bestand lezen waartoe root toegang heeft, ook bestanden met toegangsgegevens. Wie dat niet wil, legt de toegestane paden exact vast, bijvoorbeeld /usr/bin/tail -n 200 /var/log/nginx/error.log.
Stap 2: Node.js 22 installeren
Beide programma's draaien op Node.js. Claude Code vereist minimaal versie 18, Codex CLI minimaal 22, daarom installeren we 22 LTS. De pakketbronnen van Debian 12 leveren een te oude versie; NodeSource levert de actuele:
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs
node --version
npm --version
Alternatief zonder rootrechten: nvm
Wie geen scripts van internet met rootrechten wil uitvoeren, gebruikt nvm in de homedirectory van de agentgebruiker; dat kan dan helemaal zonder rootrechten. Het installatiecommando voor nvm neem je over uit de README van het project, daarna volstaan drie regels:
nvm install 22
nvm alias default 22
node --version
Details en andere manieren staan in de handleiding voor Node.js op Debian.
Stap 3: Claude Code installeren en aanmelden
Vanaf hier werken we in het account van de agent:
sudo -iu aiagent
curl -fsSL https://claude.ai/install.sh | bash
claude --version
De native installer zet Claude Code in ~/.local/bin en houdt zichzelf up-to-date. Het kan ook via npm met npm install -g @anthropic-ai/claude-code; mislukt dat met EACCES, dan helpt het gedeelte over probleemoplossing verderop.
Aanmelden op een server zonder browser
Bij de eerste start van claude vraagt het programma je om je aan te melden. Met een Claude-account opent het normaal gesproken de browser; op een server zonder browser toont het een adres en een code die je op je laptop of smartphone bevestigt. De aanmelding geldt daarna voor deze gebruiker op deze server, totdat je je afmeldt.
API-sleutel voor scripts en cronjobs
Voor scripts en cronjobs is een API-sleutel de betere keuze:
echo 'export ANTHROPIC_API_KEY="sk-ant-..."' >> ~/.bashrc
chmod 600 ~/.bashrc
source ~/.bashrc
claude -p "Antwoord alleen met OK"
De sleutel staat daarmee alleen in de homedirectory van de agentgebruiker, die andere gebruikers niet kunnen lezen. Maak hem in de Anthropic-console aan met een maandelijkse bestedingslimiet, dan kan een sessie die uit de hand loopt niet duur worden. De sleutel zelf zet je nooit in een taak voor de agent en nooit in een bestand dat hij moet weergeven.
Stap 4: Claude Code voor de server configureren
Het regelbestand CLAUDE.md
Claude Code leest bij het starten een bestand CLAUDE.md in de huidige map. Daarin staan de regels die voor elke sessie gelden. Maak in de homedirectory van de agent een werkmap met dit bestand aan:
mkdir -p ~/server && cd ~/server
cat > CLAUDE.md <<'EOF'
# Regels voor deze server
- Dit is een productieserver (Debian 13, nginx, PHP-FPM, MariaDB).
- Leescommando's (journalctl, systemctl status, tail, df, ss) zijn altijd toegestaan.
- Vóór elk schrijvend commando kort uitleggen wat het verandert en op goedkeuring wachten.
- Nooit pakketten verwijderen, nooit bestanden onder /var/lib wissen, nooit gebruikers aanmaken of verwijderen.
- Wachtwoorden, sleutels en klantgegevens nooit in uitvoer herhalen.
- Aan het eind van elke taak een samenvatting in drie zinnen geven.
EOF
Het bestand groeit mee. Telkens als de agent iets anders doet dan je wilt, hoort de correctie erin als nieuwe regel. Na een paar weken weerspiegelt het vrij nauwkeurig de werkwijze op je server.
De allowlist in settings.json
Daar komt een allowlist van hulpmiddelen bij, zodat Claude Code leescommando's zonder bevestiging uitvoert en voor al het andere om toestemming vraagt. Het bestand ~/.claude/settings.json geldt voor de gebruiker:
mkdir -p ~/.claude
cat > ~/.claude/settings.json <<'EOF'
{
"permissions": {
"allow": [
"Bash(sudo journalctl:*)",
"Bash(sudo systemctl status:*)",
"Bash(sudo tail:*)",
"Bash(df:*)",
"Bash(free:*)",
"Bash(ss:*)"
],
"deny": [
"Bash(rm -rf:*)",
"Bash(sudo rm:*)",
"Bash(dd:*)",
"Bash(mkfs:*)"
]
}
}
EOF
De denylist is een extra vangnet, geen muur: een commando kun je op veel manieren schrijven. De eigenlijke grens trekt de sudo-allowlist uit stap 1, want wat de gebruiker niet mag, mag de agent ook niet.
De eerste taak, interactief
Nu de eerste taak, interactief:
cd ~/server && claude
> Vat de fouten uit journalctl van de afgelopen 24 uur samen en noem de drie meest voorkomende oorzaken.
Zonder toezicht via een cronjob
En dezelfde taak zonder toezicht, bijvoorbeeld als dagelijkse cronjob om 7 uur, waarvan het resultaat per e-mail binnenkomt:
0 7 * * * cd /home/aiagent/server && /home/aiagent/.local/bin/claude -p "Vat fouten en waarschuwingen uit journalctl van de afgelopen 24 uur samen. Noem dienst, tijdstip en waarschijnlijke oorzaak." --allowedTools "Bash(sudo journalctl:*)" 2>&1 | mail -s "Dagelijks serverrapport" admin@example.com
De optie -p start Claude Code zonder interactieve sessie, --allowedTools beperkt de hulpmiddelen tot precies wat de run nodig heeft. Schrijvende acties horen niet thuis in runs zonder toezicht. Hoe je cronjobs in het algemeen instelt, staat in het artikel Cronjob instellen op Linux.
Stap 5: Codex CLI (ChatGPT) installeren en aanmelden
Installatie en aanmelding
Codex CLI is het programma van OpenAI dat de modellen achter ChatGPT naar de commandoregel brengt. Installatie in hetzelfde gebruikersaccount:
npm install -g @openai/codex
codex --version
Aanmelden gaat met het ChatGPT-account (Plus, Pro of Team): codex starten, „Sign in with ChatGPT" kiezen en het getoonde adres openen op een apparaat met een browser. Voor scripts stel je in plaats daarvan een API-sleutel van het OpenAI-platform in:
echo 'export OPENAI_API_KEY="sk-..."' >> ~/.bashrc
source ~/.bashrc
Sandbox en goedkeuringsmodus in config.toml
Codex heeft een eigen sandbox en een goedkeuringsmodus. Beide leg je vast in ~/.codex/config.toml; voor een productieserver is deze combinatie zinvol:
mkdir -p ~/.codex
cat > ~/.codex/config.toml <<'EOF'
approval_policy = "on-request"
sandbox_mode = "workspace-write"
EOF
workspace-write staat schrijven alleen toe in de huidige werkmap, on-request laat de agent voor alles daarbuiten om toestemming vragen. Het niveau danger-full-access heft beide op en hoort niet thuis op een productiesysteem.
Regels in AGENTS.md
Regels zoals in CLAUDE.md leest Codex uit een bestand AGENTS.md in de werkmap; je kunt dezelfde inhoud gebruiken:
cp ~/server/CLAUDE.md ~/server/AGENTS.md
cd ~/server && codex "Controleer of alle ingeschakelde systemd-diensten draaien, en som de mislukte op met hun laatste foutmelding."
Voor runs zonder toezicht is er codex exec "Aufgabe", de tegenhanger van claude -p.
Stap 6: Gemini CLI als derde mogelijkheid
Gemini CLI is het commandoregelprogramma van Google en werkt volgens hetzelfde principe. Het draait eveneens op Node.js en wordt in hetzelfde gebruikersaccount geïnstalleerd:
npm install -g @google/gemini-cli
gemini --version
Bij de eerste start van gemini meld je je aan met een Google-account; voor scripts zet je een API-sleutel in de omgevingsvariabele GEMINI_API_KEY. De regels leest Gemini CLI uit een bestand GEMINI.md in de werkmap; ook hier kun je de inhoud van CLAUDE.md overnemen. Runs zonder toezicht start je met gemini -p "Aufgabe". Welk van de drie programma's je gebruikt, is vooral een kwestie van het account dat je toch al hebt: de werkwijze op de server is bij alle drie hetzelfde, en je kunt er meerdere naast elkaar gebruiken.
Alternatief: de agent draait op je computer en werkt via SSH
Wie niets op de server wil installeren, start Claude Code of Codex op de laptop en laat de agent commando's via SSH uitvoeren. Daarvoor krijgt de server een eigen SSH-sleutel van de agentgebruiker, en in CLAUDE.md staat de regel om alle servercommando's te laten voorafgaan door ssh aiagent@server. Voor incidenteel onderhoud werkt dat goed, maar langere taken en cronjobs draaien beter direct op de server. Hoe de SSH-koppeling met een eigen sleutel, host-alias en goedkeuringen er in detail uitziet en volgens welke werkwijze de agent daarna op productiesystemen deployt, laat het praktijkverslag AI aan je server koppelen zien.
Stap 7: beveiligen en grenzen stellen
- Snapshot of back-up vóór elke sessie waarin iets moet worden gewijzigd. De back-upstrategie voor servers laat zien hoe dat automatisch gaat.
- Goedkeuringsmodus aanlaten.
--dangerously-skip-permissionsbij Claude Code endanger-full-accessbij Codex zijn bedoeld voor wegwerp-VM's. - Geheimen buiten bereik. De agentgebruiker mag
.env-bestanden, databasewachtwoorden en klantgegevens niet kunnen lezen. Wat hij leest, gaat naar de aanbieder. - Kostenlimiet voor elke API-sleutel instellen in de console van de aanbieder.
- Traceerbaarheid:
etckeeperinstalleren, zodat elke wijziging onder/etcin Git belandt, en de samenvattingen van de agent bewaren. - Inkomend verandert er niets. Beide programma's hebben alleen uitgaand HTTPS nodig. Firewall, Fail2ban en de DDoS-bescherming van de hoster blijven ongewijzigd.
De eerste taken: vijf zinvolle opdrachten
De beste eerste taken zijn taken met veel leeswerk en zonder risico. Ze laten snel zien hoe grondig de agent werkt en leveren meteen iets op:
- Lograpport: „Vat de fouten en waarschuwingen van de afgelopen 24 uur samen, gegroepeerd per dienst, met de waarschijnlijke oorzaak."
- Diensten controleren: „Som alle mislukte systemd-diensten op met de laatste foutmelding en leg per dienst uit wat er zou moeten gebeuren. Verander niets."
- Opslagruimte: „Laat zien welke mappen de meeste ruimte innemen en stel voor wat zonder risico kan worden opgeruimd." Achtergrond hierbij in het artikel Schijf vol op Linux.
- Updates: „Voor welke pakketten staan beveiligingsupdates open, en welke diensten moeten daarna opnieuw worden gestart?"
- Webserver: „Controleer de nginx-configuratie op fouten en verouderde instellingen en leg elke bevinding uit."
Pas als deze analyses kloppen, loont het om de agent schrijvende taken te geven, en dan eerst op een testsysteem.
Typische fouten en oplossingen
| Melding | Oorzaak en oplossing |
EACCES: permission denied bij npm install -g | npm wil in een systeemmap schrijven. Gebruikersprefix instellen: npm config set prefix ~/.npm-global, daarna export PATH=~/.npm-global/bin:$PATH toevoegen aan ~/.bashrc en opnieuw installeren. |
Node.js version ... is not supported | Te oude versie uit de distributiebronnen. Stap 2 herhalen en met node --version controleren of 22.x actief is. |
claude: command not found | De native installer zet het programma in ~/.local/bin, dat nog niet in het PATH staat. export PATH=$HOME/.local/bin:$PATH toevoegen aan ~/.bashrc en de shell opnieuw laden. |
| Aanmelden opent geen browser | Op een server is dat te verwachten. Het getoonde adres op een ander apparaat openen en de code invoeren, of overstappen op een API-sleutel. |
ECONNREFUSED of time-out bij het starten | Uitgaand HTTPS is geblokkeerd. Firewallregels voor poort 443 naar buiten controleren; op KernelHost-servers is uitgaand verkeer standaard vrij. |
429 rate limit of overloaded | Quotum van het abonnement of de API opgebruikt, of de aanbieder is overbelast. Even wachten en in runs zonder toezicht een nieuwe poging na enkele minuten inbouwen. |
| De agent vraagt bij elk commando om bevestiging | De allowlist in ~/.claude/settings.json respectievelijk approval_policy in config.toml aanvullen, maar alleen met leescommando's. |
| Cronjob verstuurt lege e-mails | In cron ontbreken de omgevingsvariabelen van de shell. De API-sleutel in de crontab zetten of in een omgevingsbestand dat de job inleest, en het volledige pad naar het programma gebruiken. |
De programma's up-to-date houden
Na installatie met de native installer werkt Claude Code zichzelf bij. De via npm geïnstalleerde programma's breng je met één commando up-to-date:
npm update -g @openai/codex @google/gemini-cli
codex --version
gemini --version
Nieuwe versies wijzigen af en toe opties of standaardinstellingen. Lees na een update even de release notes voordat je runs zonder toezicht laat doorlopen, en controleer het volgende dagrapport op afwijkingen.
Conclusie
Een AI-agent op de server is in een uur ingericht: gebruiker, sudo-allowlist, Node.js, programma, regels. Het eigenlijke werk zit in de grenzen, en die zijn hier bewust strak getrokken. Breid ze stap voor stap uit als een taak daarom vraagt, nooit over de hele linie. Op een KernelHost-rootserver of dedicated server hoeft daarvoor niets te worden vrijgeschakeld: roottoegang, vrije distributiekeuze en uitgaande verbindingen zijn standaard.
Hoe een agent daarna op productiesystemen deployt, met back-up, terugweg en goedkeuringen, beschrijft het praktijkverslag AI aan je server koppelen.
Kort samengevat
- Claude Code, Codex CLI en Gemini CLI draaien op elke Linux-server met Node.js 22; een GPU is niet nodig.
- De agent krijgt een eigen gebruiker met sudo-allowlist en draait nooit als root.
- Regels staan in
CLAUDE.md,AGENTS.mdofGEMINI.md, leescommando's gaan in de allowlist, al het andere vereist goedkeuring. - Voor cronjobs en scripts is een API-sleutel met bestedingslimiet de nette weg; runs zonder toezicht blijven beperkt tot lezen.
- Back-up vóór elke sessie, geheimen buiten bereik, goedkeuringsmodus aan.
- Op KernelHost-servers zijn roottoegang, vrije distributiekeuze en uitgaande verbindingen standaard aanwezig.
Veelgestelde vragen
Heb ik voor Claude Code een abonnement nodig of volstaat een API-sleutel?
Hoe meld ik Codex CLI aan op een server zonder browser?
Welke Node.js-versie heb ik nodig?
Waarom mislukt npm install -g met EACCES?
Kan ik Claude Code in een cronjob laten draaien?
Werkt dit ook op Windows-servers van KernelHost?
Kan ik Claude Code, Codex CLI en Gemini CLI tegelijk op één server gebruiken?
Hoeveel werkgeheugen heeft een AI-agent op de server nodig?
Hoe werk ik Claude Code, Codex CLI en Gemini CLI bij?
Hoe richt ik Gemini CLI op de server in?
Waarom mag de AI-agent niet als root draaien?
2026 KernelHost GmbH. Alle rechten voorbehouden. Deze handleiding is auteursrechtelijk beschermd. Publicatie op andere websites, geheel, gedeeltelijk of in bewerkte vorm, is zonder onze schriftelijke toestemming niet toegestaan. Citeren met bronvermelding en link is uitdrukkelijk welkom.

