Skip to content

Docker Deployment

Stina can be deployed as a self-hosted web application using Docker Compose. This is ideal for running Stina on a home server, NAS, or cloud VM.

Terminal window
curl -O https://raw.githubusercontent.com/einord/stina/main/docker-compose.yml
docker compose up -d

Stina is now running at localhost:3002.

The Docker deployment consists of two services:

  • stina-api — The backend API server (Node.js), handles AI provider communication, database, extensions, and scheduling
  • stina-web — The frontend web app (Vue.js), served as static files with a lightweight HTTP server

Both images are published to GitHub Container Registry (ghcr.io/einord).

VariableDefaultDescription
STINA_VERSIONlatestDocker image version tag
STINA_DATA_PATH./dataHost path for persistent data
NODE_ENVproductionNode environment
DB_PATH/data/data.dbDatabase file path inside container
EXTENSIONS_PATH/data/extensionsExtensions directory inside container
Terminal window
STINA_DATA_PATH=/opt/stina/data docker compose up -d
Terminal window
STINA_VERSION=1.0.0 docker compose up -d

To update to the latest version:

Terminal window
docker compose pull
docker compose up -d

Your data is preserved in the mounted volume.

To expose Stina behind a reverse proxy (e.g., Nginx, Caddy, Traefik), point your proxy to port 3002 (the web frontend). The web app communicates with the API internally.

server {
listen 443 ssl;
server_name stina.example.com;
location / {
proxy_pass http://localhost:3002;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /api/ {
proxy_pass http://localhost:3001/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}

All persistent data is stored in the data volume. To back up:

Terminal window
cp -r ./data ./data-backup-$(date +%Y%m%d)

Or if using a custom path:

Terminal window
cp -r /opt/stina/data /opt/stina/data-backup-$(date +%Y%m%d)