Uw app werkt op localhost. Nu wilt u hem delen via een echt domein, zonder uw laptop aan te laten staan. De ontbrekende onderdelen zijn een VPS, een beheerd applicatieproces, DNS en een HTTPS-reverse-proxy.
Deze gids laat dat traject zien met een kleine Node.js-app. Claude Code kan helpen uw project te inspecteren en configuratie voor te bereiden die u vervolgens beoordeelt; u blijft zelf verantwoordelijk voor de wijzigingen op de server. Het model wordt niet op de VPS geïnstalleerd en toegang tot en facturering van Claude staan los van de hosting.
Geanimeerde walkthrough. Het dashboard is een fictieve demonstratie, geen live infrastructuurmonitoring.
Bekijk het overzicht van de deployment
Bekijk het deploymentoverzicht (video in het Engels).
Wat we daadwerkelijk hebben getest: een echt dashboard, oorspronkelijk gemaakt door Claude Code, is door onze operator uitgerold op een wegwerp-Linux-VPS. We hebben de openbare DNS, vertrouwde HTTPS, doorverwijzing van HTTP naar HTTPS, non-root applicatie- en proxyprocessen en de toegang na het herstarten van de applicatieservice gecontroleerd. Er was geen nieuwe autonome deployment door Claude. De onderstaande voorgestelde prompt is bedoeld als instructie en is geen opgenomen antwoord.
Voordat u begint
- Een Linux VPS met systemd en een SSH-account met sudo-toegang. Gebruik eerst een test-VPS; overschrijf geen services of webconfiguratie van een bestaande site.
- Een ondersteunde Node.js LTS-runtime die voor de server is geïnstalleerd en Caddy als systeemservice. Installeer deze vereisten voordat u de deploymentstappen volgt.
- Een domein of subdomein waarvan u de DNS-records kunt bewerken.
- Een kleine, op zichzelf staande app. Ons voorbeeld serveert
index.htmlmetserver.mjs, zonder pakketafhankelijkheden of database.
Frameworktoepassingen hebben een eigen buildopdracht, startopdracht, afhankelijkheden en opslagplan nodig. Ga er niet van uit dat een project met Next.js, Python of een database dit voorbeeld van twee bestanden ongewijzigd kan gebruiken.
1. Laat Claude Code het project inspecteren voordat het iets wijzigt
Begin in uw lokale projectmap. Een goede eerste vraag is:
Inspect this project without changing files. Identify its runtime,
build and start commands, configuration and secrets. Propose a Linux
VPS deployment using a non-root systemd service and Caddy HTTPS.
Bind the app to 127.0.0.1:3000. Explain each proposed file and
verification step. Do not connect to a server or edit DNS.
De gedocumenteerde workflows van Claude Code omvatten plannen voordat er wordt bewerkt. Beoordeel de voorgestelde wijzigingen in plaats van deploymentopdrachten klakkeloos te accepteren. Houd API-sleutels, productiegegevens en privé-SSH-sleutels buiten prompts en repositories; alleen-lezentoegang maakt gevoelige bestanden niet vertrouwelijk.
2. Bereid de applicatie voor en draag hem over
Sla voor dit minimale voorbeeld uw HTML op als index.html en gebruik de volgende server. Die bindt standaard aan loopback en geeft geen willekeurige projectbestanden vrij:
import {createServer} from 'node:http';
import {readFileSync} from 'node:fs';
import {fileURLToPath} from 'node:url';
const page=readFileSync(new URL('./index.html',import.meta.url));
export function createAppServer(){
return createServer((req,res)=>{
const pathname=new URL(req.url,'http://localhost').pathname;
if(pathname!=='/' && pathname!=='/index.html'){
res.writeHead(404,{'Content-Type':'text/plain; charset=utf-8'});res.end('Not found');return;
}
res.writeHead(200,{'Content-Type':'text/html; charset=utf-8','X-Content-Type-Options':'nosniff'});res.end(page);
});
}
if(process.argv[1]===fileURLToPath(import.meta.url)){
const host=process.env.HOST||'127.0.0.1';const port=Number(process.env.PORT||3000);
const server=createAppServer();server.listen(port,host,()=>console.log(`Demo app listening on ${host}:${port}`));
process.on('SIGTERM',()=>server.close(()=>process.exit(0)));
}
Voer hem lokaal uit met node server.mjs, open http://127.0.0.1:3000 en stop hem daarna voordat u verdergaat. Gebruikt uw VPS al poort 3000, kies dan een andere privépoort en gebruik die consistent in zowel de service als de proxy.
Vervang vanuit uw lokale projectmap deploy en VPS_IP door uw SSH-account en het daadwerkelijke serveradres:
ssh deploy@VPS_IP 'mkdir -p ~/my-app'
scp index.html server.mjs deploy@VPS_IP:~/my-app/
Installeer op de server deze twee niet-geheime bestanden in een leesbare applicatiemap:
sudo install -d -m 0755 /opt/my-app
sudo install -m 0644 ~/my-app/index.html ~/my-app/server.mjs /opt/my-app/
command -v node
Noteer het absolute pad van het Node-uitvoerbare bestand. Het moet toegankelijk zijn buiten uw loginshell en homemap. Een installatie met een versiebeheerder die alleen voor uzelf onder /home staat, is niet geschikt voor de beveiligde service hieronder. Kopieer nooit een ontwikkel-.env, privésleutel of databasedump naar een openbare webmap.
3. Draai de app als non-root systemd-service
Gebruik sudoedit /etc/systemd/system/my-app.service. Vervang /ABSOLUTE/PATH/TO/node door het echte serverbrede pad naar het uitvoerbare bestand dat u zojuist hebt gecontroleerd:
[Unit]
Description=My Node web app
After=network.target
[Service]
Type=simple
DynamicUser=true
WorkingDirectory=/opt/my-app
ExecStart=/ABSOLUTE/PATH/TO/node /opt/my-app/server.mjs
Environment=NODE_ENV=production
Environment=HOST=127.0.0.1
Environment=PORT=3000
Restart=on-failure
RestartSec=2
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
[Install]
WantedBy=multi-user.target
De uitvoeringsinstellingen van systemd documenteren het dynamische account en de hardeningopties. Dit profiel past bij onze alleen-lezen app; apps die uploads of databases wegschrijven, vereisen bewust geconfigureerde persistente opslag en rechten.
sudo systemctl daemon-reload
sudo systemctl enable --now my-app.service
sudo systemctl status my-app.service --no-pager
curl -fsS http://127.0.0.1:3000/
Los applicatiefouten op voordat u aan DNS komt. Een ingeschakelde service is geconfigureerd om bij het opstarten te starten, maar dat is geen bewijs dat een herstart is getest.
4. Laat een subdomein naar de VPS verwijzen
Maak een A-record aan voor de hostnaam van uw keuze, zoals app.example.com, dat verwijst naar het openbare IPv4-adres van uw VPS. Met Cloudflare gebruikte onze demonstratie met directe server alleen DNS en automatische TTL. Kopieer het IP-adres van onze demonstratie niet naar de records van uw eigen site.
Controleer het openbare antwoord met dig +short A app.example.com. Controleer ook dig +short AAAA app.example.com: als er een IPv6-record bestaat, moet die via IPv6 dezelfde werkende deployment bereiken. DNS koppelt alleen een adres; het start uw app niet en configureert geen HTTPS.
5. Plaats Caddy voor de privé-app
Houd de Node-service op 127.0.0.1:3000. Zorg dat de openbare webpoorten 80 en 443 bereikbaar zijn via de firewall van de provider en de firewall van de host, zonder uw SSH-toegang te verwijderen. Stel poort 3000 niet bloot aan internet.
Voeg dit siteblok toe aan de configuratie van uw geïnstalleerde Caddy-service en vervang de voorbeeldhostnaam. Behoud niet-gerelateerde siteblokken:
app.example.com {
encode zstd gzip
reverse_proxy 127.0.0.1:3000
}
De reverse_proxy-directive stuurt openbare verzoeken door naar de privétoepassing. Bij een geschikte openbare hostnaam en werkende voorwaarden voor certificaatvalidatie verkrijgt en verlengt de automatische HTTPS van Caddy certificaten en leidt het HTTP om naar HTTPS.
Voor de standaard Caddy-systeemservice en het standaard configuratiepad:
sudo caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
sudo systemctl reload caddy
Onze VPS voor de opnames gebruikte een aparte Caddy-service en geïsoleerde configuratiepaden in plaats van de standaard gedeelde service hierboven. Het routeringsprincipe is hetzelfde; deze paden en servicenamen voor lezers zijn aanpassingen en geen letterlijk installatietranscript.
6. Controleer het openbare resultaat en een herstart van de service
curl -I http://app.example.com/
curl -I https://app.example.com/
sudo systemctl restart my-app.service
curl --retry 5 --retry-delay 1 --retry-connrefused -I https://app.example.com/
Controleer op een HTTP-doorverwijzing naar HTTPS, een geslaagde HTTPS-respons en een geldig certificaat in de browser. Gebruik curl -k niet om vertrouwensfouten te verbergen. Open de pagina vanaf een ander netwerk, niet alleen vanuit de VPS zelf.
Een mislukte herstartcontrole vraagt om onderzoek: bekijk journalctl -u my-app.service -n 50 --no-pager en de servicelogs van Caddy. DNS-fouten, onjuiste IPv6, een gestopte app, een verkeerde upstreampoort en geblokkeerde certificaatvalidatie zijn verschillende problemen.
We hebben een herstart van de applicatieservice geverifieerd, geen herstart van de VPS en geen hoogbeschikbaar-opzet. Plan voordat u een echte bedrijfsapplicatie host ook updates, back-ups, monitoring, geheimenbeheer en eventuele persistente gegevens.
Van lokaal project naar een openbaar adres
Het volledige traject is eenvoudig: bereid het project voor, draag het over naar de VPS, laat het draaien als beheerde non-root service, laat DNS naar de server verwijzen en beëindig de openbare HTTPS bij de reverse proxy. Claude Code kan helpen deze onderdelen voor te bereiden en toe te lichten; review en operationele controles blijven belangrijk.
Ontdek de Linux VPS-pakketten van SharpHeberg wanneer u klaar bent om een lokaal project online te brengen. Hosting levert de serveromgeving, geen inbegrepen Claude-abonnement of lokaal gehost Claude-model.