osw-studio / docs /SERVER_MODE.md
otst's picture
add secure cookies option and fix admin login redirect
8e14f7e
# Server Mode - Self-Hosting Guide
Self-host OSW Studio with persistence, authentication, and static site publishing.
---
## Overview
OSW Studio supports two deployment modes:
- **Browser Mode** (default): Pure client-side application using IndexedDB
- **Server Mode**: Full-stack deployment with publishing
Server Mode adds:
- Local database for persistent storage (no external database needed)
- Admin authentication with JWT sessions
- Sites publishing system with static site serving
- Project sync between browser and server
- Built-in analytics and compliance features
---
## Browser Mode vs Server Mode
### Browser Mode (Default)
**Characteristics:**
- No backend required
- Deploy to any static host (Vercel, Netlify, GitHub Pages, HuggingFace)
- Zero configuration
- Complete privacy (data never leaves browser)
- No multi-user support
- No server-side persistence
- No static site publishing
**Use Cases:**
- Personal development environment
- Quick prototyping
- Privacy-focused workflows
- Static deployment (HuggingFace Spaces)
### Server Mode
**Characteristics:**
- Local persistence (no external database)
- Admin authentication
- Multiple sites per project
- Static site publishing at `/sites/{siteId}/`
- Built-in analytics
- Project sync (browser <-> server)
- Requires persistent file system
- Requires server hosting
**Use Cases:**
- Production deployments
- Multi-user environments
- Publishing static sites
- Persistent project storage
---
## Quick Start
### 1. Configure Environment
Create `.env` file in project root:
```bash
# Enable Server Mode
NEXT_PUBLIC_SERVER_MODE=true
# Session security (generate with: openssl rand -base64 32)
SESSION_SECRET=your_random_secret_here
# Admin password
ADMIN_PASSWORD=your_secure_password_here
# Optional: Analytics secret
ANALYTICS_SECRET=your_analytics_secret_here
# Optional: Secrets encryption (generate with: node -e "console.log(require('crypto').randomBytes(32).toString('base64'))")
SECRETS_ENCRYPTION_KEY=your_encryption_key_here
# Optional: App URL (for SEO/sitemaps)
NEXT_PUBLIC_APP_URL=https://your-domain.com
```
### 2. Start Server
```bash
npm install
npm run dev
```
SQLite databases are created automatically:
- `data/osws.sqlite` - Core database (projects, templates, skills)
- `sites/{siteId}/site.sqlite` - Per-site databases (files, settings, analytics)
### 3. Access Application
- **Studio**: http://localhost:3000/
- **Admin panel**: http://localhost:3000/admin/login
- **Published sites**: http://localhost:3000/sites/{siteId}/
**Login with** ADMIN_PASSWORD from .env
---
## Server Context Integration
In Server Mode, the AI gains awareness of your site's server features through a special `/.server/` folder that appears in the file explorer.
### How It Works
When you select a site from the **Site Selector** dropdown (in the workspace header), OSW Studio:
1. Loads that site's server features (edge functions, database schema, server functions, secrets)
2. Mounts them as transient files in `/.server/`
3. Informs the AI about these capabilities in its system prompt
### The `/.server/` Folder
This hidden folder contains:
- **db/schema.sql** - Database schema (read-only, use `sqlite3` for DDL)
- **edge-functions/*.json** - Edge functions (editable via `json_patch`)
- **server-functions/*.json** - Server functions (editable via `json_patch`)
- **secrets/*.json** - Secret placeholders (editable - AI creates, user sets values in admin UI)
These files are:
- **Transient** - They are not saved with the project
- **Auto-updated** - They reflect the current site's state
- **Partially editable** - Schema is read-only, but functions and secrets can be modified
### Using Server Features with AI
Once a site is selected, you can ask the AI to:
```
What edge functions are available for this site?
```
```
Help me create an edge function that uses the products table
```
```
Show me the database schema
```
The AI will use the `/.server/` files to understand your site's capabilities and provide relevant assistance.
### Viewing the `/.server/` Folder
The folder is hidden by default. To view it:
1. Right-click in the File Explorer
2. Select **Show Hidden Files**
3. The `/.server/` folder appears with an orange server icon
---
## Project Sync
Server Mode uses a hybrid storage approach: projects are edited locally in the browser (for speed) and synced to the server (for persistence). This gives you the best of both worlds - fast local editing with server-side backup.
### How Sync Works
**Automatic Push (on save):**
When you save a project in Server Mode, it automatically syncs to the server. You'll see a brief "Project synced" notification.
**Automatic Pull (on load):**
When you open the Project Manager, OSW Studio checks for any updates from the server and pulls them automatically. Projects that exist on the server but not locally are downloaded.
**Manual Sync:**
For bulk operations or troubleshooting, use the Sync button in the sidebar. This opens a dialog where you can:
- **Push to Server** - Upload all local projects to the database
- **Pull from Server** - Download all server projects to your browser
### When to Use Manual Sync
- **Setting up a new browser** - Pull to populate your IndexedDB from the server
- **After server restore** - Pull to get the restored data locally
- **Troubleshooting** - Force push/pull if auto-sync isn't working
---
## Deployment Options
> **Important**: Server Mode requires **persistent file system** storage because published sites are written to `/public/sites/` and databases are stored locally. Serverless platforms like Vercel, Netlify, and Cloudflare Workers **will not work** for Server Mode.
### Option 1: Railway (Recommended)
**Why**: Simple setup, persistent storage, usage-based pricing
**Pricing**: $5/month minimum (includes $5 in usage credits). Free trial: 30 days with $5 credits.
**Steps:**
1. **Create Railway Account:**
- Go to https://railway.app
- Sign up with GitHub
2. **New Project:**
- Click "New Project"
- Select "Deploy from GitHub repo"
- Choose your OSW Studio fork
3. **Configure Variables:**
- Go to project variables
- Add:
```
NEXT_PUBLIC_SERVER_MODE=true
SESSION_SECRET=<generate>
ADMIN_PASSWORD=<your password>
NEXT_PUBLIC_APP_URL=${{ RAILWAY_PUBLIC_DOMAIN }}
```
4. **Deploy:**
- Railway auto-deploys on push
- Access at: `https://your-project.up.railway.app`
---
### Option 2: VPS (Full Control)
**Why**: Complete control, custom domains, lowest cost at scale
**Requirements:**
- Ubuntu 22.04+ server
- SSH access
- Domain (optional)
**Steps:**
1. **Install Dependencies:**
```bash
# Update system
sudo apt update && sudo apt upgrade -y
# Install Node.js 18+
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
# Install git
sudo apt install -y git
```
2. **Clone and Configure:**
```bash
# Clone repository
git clone https://github.com/o-stahl/osw-studio.git
cd osw-studio
# Install dependencies
npm install
# Create .env
nano .env
```
Paste:
```
NEXT_PUBLIC_SERVER_MODE=true
SESSION_SECRET=<generate with: openssl rand -base64 32>
ADMIN_PASSWORD=<your password>
NEXT_PUBLIC_APP_URL=http://your-domain.com
# SECURE_COOKIES=false # Uncomment until SSL is configured
```
> **Note**: If you're setting up without SSL initially, uncomment `SECURE_COOKIES=false` to allow login over HTTP. Re-comment or remove this line after configuring SSL with certbot (Step 5).
3. **Build and Start:**
```bash
# Production build
npm run build
# Start with PM2 (process manager)
sudo npm install -g pm2
pm2 start npm --name "osw-studio" -- start
pm2 save
pm2 startup
```
4. **Setup Nginx (Reverse Proxy):**
```bash
sudo apt install -y nginx
sudo nano /etc/nginx/sites-available/osw-studio
```
Paste:
```nginx
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
```
Enable:
```bash
sudo ln -s /etc/nginx/sites-available/osw-studio /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
```
5. **Setup SSL (Let's Encrypt):**
```bash
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com
```
**Access:**
- http://your-domain.com (redirects to HTTPS)
- https://your-domain.com/admin/login
---
## Environment Variables
| Variable | Required | Description |
|----------|----------|-------------|
| `NEXT_PUBLIC_SERVER_MODE` | Yes | Set to `true` to enable Server Mode |
| `SESSION_SECRET` | Yes | Random string for JWT signing |
| `ADMIN_PASSWORD` | Yes | Password for admin login |
| `ANALYTICS_SECRET` | No | Secret for analytics API |
| `SECRETS_ENCRYPTION_KEY` | No | 256-bit key for encrypting secrets |
| `SECURE_COOKIES` | No | Set to `false` to allow insecure cookies (pre-SSL only) |
| `NEXT_PUBLIC_APP_URL` | No | Base URL for SEO/sitemaps |
---
## Troubleshooting
### Database Issues
**Symptoms**: "Failed to initialize database"
**Solutions**:
1. Check write permissions on `data/` directory
2. Ensure disk space is available
3. Check file system supports SQLite (most do)
4. Try deleting `data/osws.sqlite` and restarting (loses data)
### Migration Failures
**Symptoms**: Tables not created, "relation does not exist"
**Solutions**:
1. Migrations run automatically on first request
2. Check terminal logs for errors
3. Restart the server to trigger migrations
### Authentication Issues
**Symptoms**: Can't login to /admin
**Solutions**:
1. Verify `ADMIN_PASSWORD` is set in .env
2. Try resetting password:
```bash
# Update .env
ADMIN_PASSWORD=new_password_here
# Restart server
pm2 restart osw-studio # or npm run dev
```
3. Clear browser cookies
4. Try incognito mode
5. Check `SESSION_SECRET` is set
### Performance Issues
**Symptoms**: Slow site loads, high memory
**Solutions**:
1. Optimize published sites:
- Compress images
- Minify CSS/JS
- Use CDN for libraries
2. Monitor server resources:
```bash
htop # or top
df -h # disk space
free -m # memory
```
3. Scale server resources (RAM/CPU)
4. Add caching (Nginx cache)
---
## Next Steps
- **[Site Publishing](?doc=site-publishing)** - Publish sites with analytics, SEO, compliance
- **[Server Features](?doc=server-features)** - Database, edge functions, secrets
- **[FAQ](?doc=faq)** - Common Server Mode questions
- **[Troubleshooting](?doc=troubleshooting)** - Fix common issues