Claude Code en ChatGPT Codex op een Linux-server installeren: stap voor stap

Gepubliceerd op Bijgewerkt op 13 min leestijd

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 met claude --help, codex --help of gemini --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 dnf in plaats van apt.
  • 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.com en api.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-permissions bij Claude Code en danger-full-access bij 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: etckeeper installeren, zodat elke wijziging onder /etc in 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

MeldingOorzaak en oplossing
EACCES: permission denied bij npm install -gnpm 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 supportedTe oude versie uit de distributiebronnen. Stap 2 herhalen en met node --version controleren of 22.x actief is.
claude: command not foundDe 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 browserOp 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 startenUitgaand HTTPS is geblokkeerd. Firewallregels voor poort 443 naar buiten controleren; op KernelHost-servers is uitgaand verkeer standaard vrij.
429 rate limit of overloadedQuotum 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 bevestigingDe allowlist in ~/.claude/settings.json respectievelijk approval_policy in config.toml aanvullen, maar alleen met leescommando's.
Cronjob verstuurt lege e-mailsIn 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.md of GEMINI.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?
Beide werken. Met een Claude-account (Pro, Max of Team) meld je je bij de eerste start aan via de browser, op een server zonder browser via een code op een ander apparaat. Voor geautomatiseerde taken zonder iemand ervoor is een API-sleutel in de omgevingsvariabele ANTHROPIC_API_KEY de nettere weg, omdat die niet aan een persoon gebonden is en met een budget kan worden begrensd.
Hoe meld ik Codex CLI aan op een server zonder browser?
Ofwel via de aanmelding met het ChatGPT-account, waarbij Codex een adres toont dat je op je laptop of smartphone opent, ofwel via de omgevingsvariabele OPENAI_API_KEY met een sleutel van het OpenAI-platform. Voor cronjobs en scripts is de API-sleutel de betrouwbaardere variant.
Welke Node.js-versie heb ik nodig?
Claude Code vereist minimaal Node.js 18, Codex CLI minimaal Node.js 22. Installeer daarom meteen Node.js 22 LTS via de NodeSource-repository of met nvm in de homedirectory van de agentgebruiker. De versie uit de pakketbronnen van Debian 12 is te oud. Controleer na de installatie met node --version welke versie actief is: toont het commando nog een oudere hoofdversie, dan staat de distributieversie eerder in het pad.
Waarom mislukt npm install -g met EACCES?
Omdat npm globaal wil schrijven in een systeemmap waarop de gebruiker geen rechten heeft. Stel een gebruikersprefix in met npm config set prefix ~/.npm-global, voeg ~/.npm-global/bin toe aan het PATH en installeer opnieuw. Je kunt ook nvm gebruiken, of voor Claude Code de native installer, die zonder npm werkt.
Kan ik Claude Code in een cronjob laten draaien?
Ja, met claude -p en een taak als tekst, plus een allowlist van toegestane hulpmiddelen. Gebruik daarvoor een API-sleutel, beperk de hulpmiddelen tot leescommando's en stuur de uitvoer naar een bestand of een e-mail. Ingrijpende acties horen niet thuis in runs zonder toezicht.
Werkt dit ook op Windows-servers van KernelHost?
Ja. Claude Code en Codex CLI draaien onder Windows native met Node.js of in het Windows-subsysteem voor Linux. De stappen voor gebruiker en sudo-allowlist komen daar overeen met een eigen Windows-gebruiker zonder beheerdersrechten. Windows Server is bij KernelHost beschikbaar als Bring Your Own License, en de regels voor goedkeuringen, back-ups en geheimen gelden daar net zo als onder Linux.
Kan ik Claude Code, Codex CLI en Gemini CLI tegelijk op één server gebruiken?
Ja. Alle drie de programma's draaien naast elkaar in hetzelfde gebruikersaccount en beschikken over dezelfde rechten. Elk programma leest zijn eigen regelbestand in de werkmap: Claude Code de CLAUDE.md, Codex CLI de AGENTS.md en Gemini CLI de GEMINI.md. Het eenvoudigst is om de inhoud één keer bij te houden en naar alle drie de bestanden te kopiëren. Welk programma je gebruikt, hangt meestal af van het account dat je toch al hebt.
Hoeveel werkgeheugen heeft een AI-agent op de server nodig?
Weinig, want het taalmodel draait bij de aanbieder. Het commandoregelprogramma en Node.js nemen tijdens een sessie meestal maar een paar honderd megabyte in beslag. Voor een server waarop verder weinig draait, volstaan 2 vCPU en 4 GB RAM. Draaien er daarnaast websites, databases of gameservers, reserveer dan ongeveer 1 GB voor de agent. Een GPU is niet nodig.
Hoe werk ik Claude Code, Codex CLI en Gemini CLI bij?
Na installatie met de native installer werkt Claude Code zichzelf bij. Codex CLI en Gemini CLI breng je up-to-date met npm update -g @openai/codex @google/gemini-cli, daarna controleer je de versies met codex --version en gemini --version. Lees na een update de release notes voordat runs zonder toezicht verder draaien, omdat opties kunnen veranderen.
Hoe richt ik Gemini CLI op de server in?
Met npm install -g @google/gemini-cli in het account van de agentgebruiker; daarna gemini starten en aanmelden met een Google-account, of voor scripts een API-sleutel in de omgevingsvariabele GEMINI_API_KEY zetten. De regels leest Gemini CLI uit een bestand GEMINI.md in de werkmap; runs zonder toezicht start je met gemini -p en de taak als tekst.
Waarom mag de AI-agent niet als root draaien?
Omdat een agent die een instructie verkeerd begrijpt, met rootrechten in het ergste geval de hele server beschadigt, bijvoorbeeld door een verkeerd verwijdercommando. Met een eigen gebruiker en een sudo-allowlist mag hij alleen de commando's uitvoeren die je uitdrukkelijk hebt toegestaan. De mogelijke schade blijft daarmee beperkt tot die commando's, en in de logs is altijd te zien wat de agent heeft gedaan.

Claude Code Codex CLI Gemini CLI ChatGPT AI-agent Node.js Debian Ubuntu Serverbeheer