Skip to main content

Self-Hosted Deployment

Deploy Friday Dev on your own infrastructure for full control and privacy.

Why Self-Host?

  • Data Privacy - Keep all data on your servers
  • Customization - Full control over configuration
  • No Limits - Unlimited usage, no rate limits
  • Compliance - Meet regulatory requirements
  • Air-gapped - Deploy in isolated networks

Requirements

Minimum

ResourceRequirement
CPU2 cores
RAM4 GB
Disk10 GB SSD
OSLinux (Ubuntu 20.04+), macOS, Windows
ResourceRequirement
CPU4+ cores
RAM8+ GB
Disk50+ GB SSD
OSUbuntu 22.04 LTS

Quick Deploy

One-Line Install

curl -fsSL https://friday-dev.com/install.sh | bash

This will:

  1. Install Friday Dev binary
  2. Set up systemd service
  3. Configure Nginx
  4. Set up SSL (Let's Encrypt)

Manual Install

# Download binary
wget https://github.com/friday-dev-team/friday-dev/releases/latest/download/friday-dev-linux-x64.tar.gz

# Extract
tar -xzf friday-dev-linux-x64.tar.gz

# Move to PATH
sudo mv friday-dev /usr/local/bin/

# Verify
friday-dev --version

Configuration

Environment Variables

# Required
export DATABASE_URL="sqlite:/var/lib/friday-dev/db.sqlite?mode=rwc"
export PORT=3000

# API Keys (at least one required for AI features)
export GEMINI_API_KEY="your-key"
export OPENAI_API_KEY="your-key"
export ANTHROPIC_API_KEY="your-key"

# Optional
export RUST_LOG=info
export HOST=0.0.0.0

Config File

Create /etc/friday-dev/config.json:

{
"server": {
"port": 3000,
"host": "0.0.0.0"
},
"database": {
"url": "sqlite:/var/lib/friday-dev/db.sqlite?mode=rwc"
},
"apiKeys": {
"gemini": "your-gemini-key",
"openai": "your-openai-key"
},
"security": {
"enableAuth": true,
"jwtSecret": "your-secret-key"
}
}

Systemd Service

Create /etc/systemd/system/friday-dev.service:

[Unit]
Description=Friday Dev - AI Development Platform
After=network.target

[Service]
Type=simple
User=friday-dev
Group=friday-dev
WorkingDirectory=/var/lib/friday-dev
ExecStart=/usr/local/bin/friday-dev
Restart=always
RestartSec=5
Environment="DATABASE_URL=sqlite:/var/lib/friday-dev/db.sqlite?mode=rwc"
Environment="RUST_LOG=info"
Environment="PORT=3000"

[Install]
WantedBy=multi-user.target

Enable and start:

sudo systemctl daemon-reload
sudo systemctl enable friday-dev
sudo systemctl start friday-dev

Nginx Reverse Proxy

Create /etc/nginx/sites-available/friday-dev:

server {
listen 80;
server_name your-domain.com;

# Redirect to HTTPS
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl http2;
server_name your-domain.com;

# SSL certificates (Let's Encrypt)
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;

# SSL settings
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;

# Frontend static files
location / {
root /var/www/friday-dev;
try_files $uri $uri/ /index.html;
}

# API proxy
location /api {
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;
}

# WebSocket proxy
location /ws {
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_read_timeout 86400;
}

# Gzip compression
gzip on;
gzip_types text/plain text/css application/json application/javascript;
}

Enable:

sudo ln -sf /etc/nginx/sites-available/friday-dev /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

SSL with Let's Encrypt

# Install Certbot
sudo apt install certbot python3-certbot-nginx

# Get certificate
sudo certbot --nginx -d your-domain.com

# Auto-renewal (usually automatic)
sudo certbot renew --dry-run

Database

SQLite (Default)

Good for single-server deployments:

# Location
/var/lib/friday-dev/db.sqlite

# Backup
sqlite3 /var/lib/friday-dev/db.sqlite ".backup '/backup/db-$(date +%Y%m%d).sqlite'"

PostgreSQL (Scaling)

For larger deployments:

# Install PostgreSQL
sudo apt install postgresql

# Create database
sudo -u postgres createdb friday_dev
sudo -u postgres createuser friday_dev

# Configure
export DATABASE_URL="postgresql://friday_dev:password@localhost/friday_dev"

Security

Firewall

# Allow HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Block direct access to backend port
sudo ufw deny 3000/tcp

# Enable firewall
sudo ufw enable

User Permissions

# Create dedicated user
sudo useradd -r -s /bin/false friday-dev

# Set ownership
sudo chown -R friday-dev:friday-dev /var/lib/friday-dev

# Restrict permissions
sudo chmod 700 /var/lib/friday-dev

API Key Security

# Never in config files, use environment
export GEMINI_API_KEY="your-key"

# Or use secrets manager
# AWS Secrets Manager, HashiCorp Vault, etc.

Monitoring

Logs

# View service logs
sudo journalctl -u friday-dev -f

# Log location
/var/log/friday-dev/

Health Check

# Check service status
curl http://localhost:3000/api/health

# Expected response
{"status": "ok", "version": "0.1.0"}

Metrics (Prometheus)

Friday Dev exposes metrics at /metrics:

curl http://localhost:3000/metrics

Example Prometheus config:

scrape_configs:
- job_name: 'friday-dev'
static_configs:
- targets: ['localhost:3000']

Updates

Automatic Updates

# Create update script
cat > /usr/local/bin/update-friday-dev.sh << 'EOF'
#!/bin/bash
curl -fsSL https://github.com/friday-dev-team/friday-dev/releases/latest/download/friday-dev-linux-x64.tar.gz -o /tmp/friday-dev.tar.gz
tar -xzf /tmp/friday-dev.tar.gz -C /tmp
sudo mv /tmp/friday-dev /usr/local/bin/
sudo systemctl restart friday-dev
EOF

chmod +x /usr/local/bin/update-friday-dev.sh

Manual Updates

# Stop service
sudo systemctl stop friday-dev

# Download new version
wget https://github.com/friday-dev-team/friday-dev/releases/download/v0.2.0/friday-dev-linux-x64.tar.gz

# Replace binary
sudo mv friday-dev /usr/local/bin/

# Start service
sudo systemctl start friday-dev

Backup & Recovery

Backup Script

#!/bin/bash
BACKUP_DIR="/backup/friday-dev"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR

# Backup database
cp /var/lib/friday-dev/db.sqlite "$BACKUP_DIR/db_$DATE.sqlite"

# Backup config
cp /etc/friday-dev/config.json "$BACKUP_DIR/config_$DATE.json"

# Keep last 7 days
find $BACKUP_DIR -mtime +7 -delete

Recovery

# Stop service
sudo systemctl stop friday-dev

# Restore database
cp /backup/friday-dev/db_20240115.sqlite /var/lib/friday-dev/db.sqlite

# Start service
sudo systemctl start friday-dev

Troubleshooting

Service Won't Start

# Check logs
sudo journalctl -u friday-dev -n 50

# Common issues:
# - Port already in use
# - Database permission errors
# - Missing environment variables

Connection Refused

# Check if service is running
sudo systemctl status friday-dev

# Check if port is listening
sudo netstat -tlnp | grep 3000

# Check firewall
sudo ufw status

Database Errors

# Check permissions
ls -la /var/lib/friday-dev/

# Fix permissions
sudo chown friday-dev:friday-dev /var/lib/friday-dev/db.sqlite

# Reset database (caution: loses data)
sudo rm /var/lib/friday-dev/db.sqlite
sudo systemctl restart friday-dev

Next Steps