Configure paperless-ai with JWT token fetching and proper LLM API setup
- Add init container to fetch JWT token from Authentik at pod startup - Use token for LLM API calls via public gateway (https://api.riotpiao.com/v1) - Mount PVC for persistent configuration storage - Update LLM model to qwen2.5:3b-instruct (faster, smaller) - Reduce scan interval from 300s to 60s for faster testing - Enable document descriptions via AI_DESCRIPTIONS env var The init container: - Fetches JWT via client_credentials grant using paperless-ai-agent credentials - Stores token in /app/data/llm_token.txt for paperless-ai to read at runtime - Token has llm:inference claim embedded for gateway authorization
This commit is contained in:
@@ -21,6 +21,42 @@ spec:
|
||||
- key: node-role.kubernetes.io/control-plane
|
||||
operator: Exists
|
||||
effect: NoSchedule
|
||||
volumes:
|
||||
- name: paperless-ai-data
|
||||
persistentVolumeClaim:
|
||||
claimName: paperless-ai-data
|
||||
initContainers:
|
||||
- name: fetch-llm-token
|
||||
image: curlimages/curl:8.12.0
|
||||
command:
|
||||
- sh
|
||||
- -c
|
||||
- |
|
||||
set -e
|
||||
echo "[init] Fetching JWT token from Authentik for paperless-ai-agent..."
|
||||
|
||||
# Get JWT token via client_credentials grant
|
||||
TOKEN_RESPONSE=$(curl -s -X POST https://authentik.riotpiao.com/application/o/token/ \
|
||||
-d "grant_type=client_credentials" \
|
||||
-d "client_id=paperless-ai-agent" \
|
||||
-d "client_secret=29skAhE0tBzWn0qrPvmPTQMva0joFjcCr7msDQr_VXQ" \
|
||||
-d "scope=openid llm:inference" 2>/dev/null)
|
||||
|
||||
# Extract token
|
||||
TOKEN=$(echo "$TOKEN_RESPONSE" | grep -o '"access_token":"[^"]*' | cut -d'"' -f4)
|
||||
|
||||
if [ -z "$TOKEN" ]; then
|
||||
echo "[error] Failed to get token. Response: $TOKEN_RESPONSE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Store token in file for main container to read
|
||||
mkdir -p /data
|
||||
echo "$TOKEN" > /data/llm_token.txt
|
||||
echo "[init] Token fetched and stored (length: ${#TOKEN})"
|
||||
volumeMounts:
|
||||
- name: paperless-ai-data
|
||||
mountPath: /data
|
||||
containers:
|
||||
- name: paperless-ai
|
||||
image: clusterzx/paperless-ai:latest
|
||||
@@ -35,18 +71,20 @@ spec:
|
||||
key: PAPERLESS_API_TOKEN
|
||||
- name: PAPERLESS_USERNAME
|
||||
value: "admin"
|
||||
# LLM API — local gateway, no auth required (phase 3 not built yet)
|
||||
# LLM API — via public gateway with JWT auth
|
||||
- name: AI_PROVIDER
|
||||
value: "custom"
|
||||
- name: CUSTOM_BASE_URL
|
||||
value: "http://reasoning-predictor.llm-serving.svc.cluster.local:80/v1"
|
||||
- name: CUSTOM_API_KEY
|
||||
value: "not-required"
|
||||
value: "https://api.riotpiao.com/v1"
|
||||
# Token will be read from file at runtime by the application
|
||||
# The init container fetches it and stores in /app/data/llm_token.txt
|
||||
- name: CUSTOM_API_KEY_FILE
|
||||
value: "/app/data/llm_token.txt"
|
||||
- name: CUSTOM_MODEL
|
||||
value: "reasoning"
|
||||
# Behavior
|
||||
value: "qwen2.5:3b-instruct"
|
||||
# Behavior - scan for new documents and tag them
|
||||
- name: SCAN_INTERVAL
|
||||
value: "300"
|
||||
value: "60"
|
||||
- name: PROCESS_PREDEFINED_DOCUMENTS
|
||||
value: "no"
|
||||
- name: ADD_AI_TAG
|
||||
@@ -55,6 +93,11 @@ spec:
|
||||
value: "ai-processed"
|
||||
- name: USE_PROMPT_TAGS
|
||||
value: "yes"
|
||||
- name: ADD_AI_DESCRIPTIONS
|
||||
value: "yes"
|
||||
volumeMounts:
|
||||
- name: paperless-ai-data
|
||||
mountPath: /app/data
|
||||
resources:
|
||||
requests:
|
||||
cpu: 100m
|
||||
|
||||
Reference in New Issue
Block a user