Webhuset
Tilbake til Nyheter
3 min lesetid

Slik kjører du en enkel inference API på din egen VPS

Slik kjører du en enkel inference API på din egen VPS

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, systemd og 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 | sh

Last ned en modell som passer for testing:

ollama pull llama3.2

Test 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 requests

Lag 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 8000

Test 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.service

Lim 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.target

Start tjenesten:

sudo systemctl daemon-reload
sudo systemctl enable inference-api
sudo systemctl start inference-api
sudo systemctl status inference-api

Trinn 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-api

Eksempel:

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 nginx

Sett 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.