5.7 KiB
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.