
AI-funksjoner trenger ikke å starte med en stor plattform der dataflyten er vanskelig å forklare. Med en VPS fra Webhuset kan du sette opp en enkel inference API på din egen server i Norge, teste trygt og beholde kontrollen før du eventuelt velger større plattformer.
Hva du trenger
- En VPS med Ubuntu
- SSH-tilgang til serveren
- Et domene eller subdomene, for eksempel
ai.dittdomene.no- Tips: Bruk Webhuset MCP og be coding agenten din opprette subdomene for deg.
- En lokal inference-tjeneste, for eksempel Ollama
- Grunnleggende kjennskap til
curl,systemdog Nginx- Tips: Eller bare gi denne artikkelen til en coding agent som Claude Code eller Codex og be den fikse det for deg 😄
I dette eksempelet kjører vi Ollama lokalt og legger et lite FastAPI-lag foran. Det gir deg ett ryddig endpoint, token-basert tilgang, logging, rate limiting og reverse proxy uten å gjøre løsningen til et enterprise-prosjekt.
Trinn 1: Installer Ollama og en lett modell
Logg inn på serveren med SSH og installer det du trenger:
sudo apt update
sudo apt install -y python3 python3-venv python3-pip nginx
curl -fsSL https://ollama.com/install.sh | shLast ned en modell som passer for testing:
ollama pull llama3.2Test at modellen svarer lokalt:
ollama run llama3.2 "Forklar inference på én kort setning."Trinn 2: Lag et enkelt API
Opprett en mappe for tjenesten:
mkdir -p ~/inference-api
cd ~/inference-api
python3 -m venv .venv
source .venv/bin/activate
pip install fastapi uvicorn requestsLag filen app.py:
import os
import time
import logging
import requests
from fastapi import FastAPI, Header, HTTPException, Request
API_TOKEN = os.environ["API_TOKEN"]
OLLAMA_URL = "http://localhost:11434/api/generate"
logging.basicConfig(level=logging.INFO)
app = FastAPI()
@app.post("/v1/infer")
async def infer(request: Request, authorization: str = Header(default="")):
if authorization != f"Bearer {API_TOKEN}":
raise HTTPException(status_code=401, detail="Unauthorized")
body = await request.json()
prompt = body.get("prompt", "")
if not prompt:
raise HTTPException(status_code=400, detail="Missing prompt")
start = time.time()
response = requests.post(OLLAMA_URL, json={
"model": "llama3.2",
"prompt": prompt,
"stream": False
})
duration = round(time.time() - start, 3)
logging.info("inference duration=%s status=%s", duration, response.status_code)
return {
"duration": duration,
"result": response.json().get("response", "")
}Kjør API-et lokalt:
export API_TOKEN="lag-en-lang-tilfeldig-token"
uvicorn app:app --host 127.0.0.1 --port 8000Test endpointet fra serveren:
curl -X POST http://127.0.0.1:8000/v1/infer \
-H "Authorization: Bearer lag-en-lang-tilfeldig-token" \
-H "Content-Type: application/json" \
-d '{"prompt":"Hva er en inference API?"}'Trinn 3: Kjør API-et som en service
Lag en systemd-service:
sudo nano /etc/systemd/system/inference-api.serviceLim inn:
[Unit]
Description=Simple inference API
After=network.target
[Service]
WorkingDirectory=/home/ubuntu/inference-api
Environment="API_TOKEN=lag-en-lang-tilfeldig-token"
ExecStart=/home/ubuntu/inference-api/.venv/bin/uvicorn app:app --host 127.0.0.1 --port 8000
Restart=always
User=ubuntu
[Install]
WantedBy=multi-user.targetStart tjenesten:
sudo systemctl daemon-reload
sudo systemctl enable inference-api
sudo systemctl start inference-api
sudo systemctl status inference-apiTrinn 4: Legg Nginx foran som reverse proxy
Legg først inn enkel rate limiting i http-blokken i /etc/nginx/nginx.conf:
limit_req_zone $binary_remote_addr zone=inference:10m rate=5r/m;Lag deretter en Nginx-config:
sudo nano /etc/nginx/sites-available/inference-apiEksempel:
server {
server_name ai.dittdomene.no;
location / {
limit_req zone=inference burst=10 nodelay;
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}Aktiver configen:
sudo ln -s /etc/nginx/sites-available/inference-api /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxSett opp TLS før du bruker endpointet i en app, for eksempel med Certbot.
Tips før du bygger videre
- Bruk en lang, tilfeldig API-token.
- Ikke logg hele prompts hvis de kan inneholde personopplysninger.
- Sett grenser for prompt-lengde og antall requests tidlig.
- Bruk staging og produksjon med ulike tokens.
- Hold endpointet bak VPN eller IP-filter hvis det bare skal brukes internt.
Du har nå en enkel inference API med endpoint, token, logging, rate limiting og reverse proxy — hostet på din egen VPS i Norge, under din kontroll og beskyttet av norsk lov og GDPR.