See Getting Started for local setup.
docker compose up -ddocker compose logs -f uberskills # View logs
docker compose down # Stop
docker compose up -d --build # Rebuild after code changesThe docker-compose.yml service uses a named volume for data persistence. The app runs as a non-root user on port 3000.
Environment variables can be set in docker-compose.yml:
environment:
- NODE_ENV=production
- DATABASE_URL=file:/app/data/uberskills.dbFor cloud deployment, SQLite is replaced with Turso (libSQL, SQLite-compatible).
-
Create a Turso database:
turso db create uberskills turso db tokens create uberskills
-
Set environment variables in Vercel:
DATABASE_URL=libsql://<db-name>-<org>.turso.io DATABASE_AUTH_TOKEN=<turso-token> ENCRYPTION_SECRET=<random-32-byte-hex> -
Deploy:
vercel --prod
{
"buildCommand": "pnpm run build",
"installCommand": "pnpm install",
"framework": "nextjs",
"outputDirectory": "apps/web/.next"
}The database layer detects the DATABASE_URL scheme (file: vs libsql://) and selects the appropriate driver automatically. Schema and queries remain identical.
server {
listen 80;
server_name uberskills.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# SSE support for AI streaming
proxy_buffering off;
proxy_cache off;
}
}# /etc/systemd/system/uberskills.service
[Unit]
Description=uberSKILLS
After=network.target
[Service]
Type=simple
User=uberskills
WorkingDirectory=/opt/uberskills
ExecStart=/usr/local/bin/node apps/web/server.js
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
Environment=PORT=3000
Environment=DATABASE_URL=file:/opt/uberskills/data/uberskills.db
[Install]
WantedBy=multi-user.targetThe CI pipeline runs on push to main and on pull requests:
- Lint -- Biome linting
- Typecheck -- TypeScript type checking
- Test -- Vitest unit tests
- Build -- Production build (depends on lint, typecheck, test)
- E2E -- Playwright E2E tests (depends on build)
On tag push (v*), a Docker image is built and pushed to GitHub Container Registry (ghcr.io).