smarttools/docs/DEPLOYMENT.md

5.7 KiB

SmartTools Deployment Guide

This guide covers deploying the SmartTools Registry web application.

Quick Start (Development)

# Clone and install
git clone https://gitea.brrd.tech/rob/SmartTools.git
cd SmartTools
pip install -e ".[dev]"

# Initialize database
cd src/smarttools/web
python -c "from app import create_app; create_app()"

# Run development server
flask run --port 5050 --host 0.0.0.0

Access at http://localhost:5050

Production Deployment

Prerequisites

  • Python 3.8+
  • pip/pipx
  • nginx (recommended for reverse proxy)
  • systemd (for process management)

1. Install Application

# Create application directory
sudo mkdir -p /opt/smarttools
sudo chown $USER:$USER /opt/smarttools
cd /opt/smarttools

# Clone repository
git clone https://gitea.brrd.tech/rob/SmartTools.git .

# Create virtual environment
python3 -m venv venv
source venv/bin/activate

# Install dependencies
pip install -e ".[prod]"
pip install gunicorn

2. Configure Environment

Create /opt/smarttools/.env:

# Required
FLASK_ENV=production
SECRET_KEY=your-secret-key-here  # Generate with: python -c "import secrets; print(secrets.token_hex(32))"

# Optional
SENTRY_DSN=https://xxx@sentry.io/xxx  # Error monitoring
SITE_URL=https://registry.smarttools.dev  # For sitemap/SEO

3. Initialize Database

cd /opt/smarttools/src/smarttools/web
python -c "from app import create_app; create_app()"

Database will be created at data/smarttools.db.

4. systemd Service

Create /etc/systemd/system/smarttools-web.service:

[Unit]
Description=SmartTools Registry Web Application
After=network.target

[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/smarttools
Environment="PATH=/opt/smarttools/venv/bin"
EnvironmentFile=/opt/smarttools/.env
ExecStart=/opt/smarttools/venv/bin/gunicorn \
    --workers 4 \
    --bind 127.0.0.1:5050 \
    --access-logfile /var/log/smarttools/access.log \
    --error-logfile /var/log/smarttools/error.log \
    'smarttools.web.app:create_app()'
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Enable and start:

# Create log directory
sudo mkdir -p /var/log/smarttools
sudo chown www-data:www-data /var/log/smarttools

# Enable service
sudo systemctl daemon-reload
sudo systemctl enable smarttools-web
sudo systemctl start smarttools-web

# Check status
sudo systemctl status smarttools-web

5. nginx Configuration

Create /etc/nginx/sites-available/smarttools:

server {
    listen 80;
    server_name registry.smarttools.dev;

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

server {
    listen 443 ssl http2;
    server_name registry.smarttools.dev;

    # SSL certificates (use certbot for Let's Encrypt)
    ssl_certificate /etc/letsencrypt/live/registry.smarttools.dev/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/registry.smarttools.dev/privkey.pem;

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

    # Static files (optional - Flask can serve these)
    location /static/ {
        alias /opt/smarttools/src/smarttools/web/static/;
        expires 1d;
        add_header Cache-Control "public, immutable";
    }

    # Proxy to gunicorn
    location / {
        proxy_pass http://127.0.0.1:5050;
        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;
    }
}

Enable site:

sudo ln -s /etc/nginx/sites-available/smarttools /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

6. SSL with Let's Encrypt

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d registry.smarttools.dev

Environment Variables

Variable Required Description
FLASK_ENV Yes production or development
SECRET_KEY Yes Secret key for sessions (32+ chars)
SENTRY_DSN No Sentry error monitoring DSN
SITE_URL No Public URL for sitemap generation
DATABASE_PATH No Override database path (default: data/smarttools.db)

Database Backup

# Backup
cp /opt/smarttools/data/smarttools.db /backup/smarttools-$(date +%Y%m%d).db

# Or use SQLite backup command for consistency
sqlite3 /opt/smarttools/data/smarttools.db ".backup '/backup/smarttools.db'"

Monitoring

Logs

# Application logs
tail -f /var/log/smarttools/error.log
tail -f /var/log/smarttools/access.log

# systemd logs
journalctl -u smarttools-web -f

Sentry Integration

The application includes Sentry integration for error monitoring. Set SENTRY_DSN environment variable to enable.

Health Check

curl http://localhost:5050/api/v1/tools

Troubleshooting

Service won't start

# Check logs
journalctl -u smarttools-web -n 50

# Verify Python path
/opt/smarttools/venv/bin/python -c "import smarttools"

# Test gunicorn manually
cd /opt/smarttools
source venv/bin/activate
gunicorn --bind 127.0.0.1:5050 'smarttools.web.app:create_app()'

Database errors

# Check database exists and is readable
ls -la /opt/smarttools/data/smarttools.db

# Verify permissions
chown www-data:www-data /opt/smarttools/data/
chown www-data:www-data /opt/smarttools/data/smarttools.db

Static files not loading

# Rebuild Tailwind CSS
cd /opt/smarttools
npm install
npm run css:build

# Or use development CSS
# (static/css/output.css should exist)

Architecture Diagram

See docs/diagrams/deployment-architecture.svg for visual representation.