Guides6 min read
Déployer Potato sur un serveur
Guide de déploiement en production pour Potato incluant Docker, les plateformes cloud et la configuration SSL.
Potato Team·
Déployer Potato sur un serveur
Ce guide couvre le déploiement de Potato pour une utilisation en production, incluant la configuration du serveur, le déploiement Docker, les plateformes cloud et la configuration de sécurité.
Options de déploiement
| Méthode | Idéale pour | Complexité |
|---|---|---|
| Local | Développement, tests | Faible |
| Docker | Déploiements reproductibles | Moyenne |
| VM Cloud | Contrôle total, configuration personnalisée | Moyenne |
| Docker Compose | Configurations multi-conteneurs | Moyenne |
| Kubernetes | Déploiements à grande échelle | Élevée |
Déploiement basique sur serveur
Prérequis
bash
# Ubuntu/Debian server
sudo apt update
sudo apt install python3.9 python3-pip nginx certbot python3-certbot-nginx
# Create directory structure
mkdir -p /opt/potato/projects
cd /opt/potatoInstallation
bash
# Create virtual environment
python3 -m venv venv
source venv/bin/activate
# Install Potato
pip install potato-annotation
# Verify installation
potato --versionExécution avec Gunicorn
bash
# Install production server
pip install gunicorn
# Run with gunicorn
gunicorn -w 4 -b 127.0.0.1:8000 \
--chdir /opt/potato/projects/my_project \
"potato.server:create_app(config_path='config.yaml')"Service Systemd
Créez /etc/systemd/system/potato.service :
ini
[Unit]
Description=Potato Annotation Server
After=network.target
[Service]
Type=simple
User=potato
Group=potato
WorkingDirectory=/opt/potato/projects/my_project
Environment="PATH=/opt/potato/venv/bin"
ExecStart=/opt/potato/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 \
"potato.server:create_app(config_path='config.yaml')"
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.targetActivez et démarrez :
bash
sudo systemctl enable potato
sudo systemctl start potato
sudo systemctl status potatoConfiguration Nginx
Proxy inverse basique
Créez /etc/nginx/sites-available/potato :
nginx
server {
listen 80;
server_name annotation.example.com;
location / {
proxy_pass http://127.0.0.1:8000;
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 support (if needed)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# Static files
location /static/ {
alias /opt/potato/projects/my_project/static/;
expires 30d;
add_header Cache-Control "public, no-transform";
}
# Upload size limit
client_max_body_size 100M;
}Activez le site :
bash
sudo ln -s /etc/nginx/sites-available/potato /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxSSL avec Let's Encrypt
bash
# Get SSL certificate
sudo certbot --nginx -d annotation.example.com
# Auto-renewal
sudo systemctl enable certbot.timerDéploiement Docker
Dockerfile
dockerfile
FROM python:3.9-slim
WORKDIR /app
# Install dependencies
RUN pip install potato-annotation gunicorn
# Copy project files
COPY config.yaml .
COPY data/ ./data/
# Create directories
RUN mkdir -p annotations logs
# Expose port
EXPOSE 8000
# Run server
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", \
"potato.server:create_app(config_path='config.yaml')"]Construire et exécuter
bash
# Build image
docker build -t potato-annotation .
# Run container
docker run -d \
--name potato \
-p 8000:8000 \
-v $(pwd)/annotations:/app/annotations \
-v $(pwd)/logs:/app/logs \
potato-annotationDocker Compose
yaml
# docker-compose.yml
version: '3.8'
services:
potato:
build: .
ports:
- "8000:8000"
volumes:
- ./data:/app/data:ro
- ./annotations:/app/annotations
- ./logs:/app/logs
environment:
- POTATO_ENV=production
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./ssl:/etc/nginx/ssl:ro
depends_on:
- potato
restart: unless-stoppedDéploiement sur plateforme cloud
AWS EC2
bash
# Launch EC2 instance (Ubuntu 22.04)
# Configure security group: ports 22, 80, 443
# SSH to instance
ssh -i your-key.pem ubuntu@your-instance-ip
# Follow basic server deployment steps above
# For persistent storage, attach EBS volume
sudo mount /dev/xvdf /opt/potato/dataGoogle Cloud Platform
bash
# Create VM instance
gcloud compute instances create potato-server \
--zone=us-central1-a \
--machine-type=e2-medium \
--image-family=ubuntu-2204-lts \
--image-project=ubuntu-os-cloud
# Configure firewall
gcloud compute firewall-rules create allow-http \
--allow tcp:80,tcp:443DigitalOcean
bash
# Create droplet via CLI
doctl compute droplet create potato-server \
--size s-2vcpu-4gb \
--image ubuntu-22-04-x64 \
--region nyc1Configuration pour la production
Configuration de production
yaml
# config.yaml
annotation_task_name: "Production Annotation Task"
# Note: Server settings (host, port, workers) are CLI flags:
# potato -p 8000 --host 0.0.0.0 config.yaml
# Or use gunicorn for production with multiple workers
# Logging
logging:
level: INFO
file: logs/potato.log
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
rotation:
max_size: 10MB
backup_count: 5
# Data
data_files:
- items.jsonl
item_properties:
id_key: id
text_key: text
# Output
output_annotation_dir: annotations/
output_annotation_format: jsonlVariables d'environnement
bash
# /opt/potato/.env
POTATO_SECRET_KEY=your-secure-random-key-here
POTATO_ENV=production
OPENAI_API_KEY=sk-... # If using AI featuresChargez dans systemd :
ini
[Service]
EnvironmentFile=/opt/potato/.envBonnes pratiques de sécurité
Authentification
yaml
user_config:
auth_type: password
# Strong password requirements
password_policy:
min_length: 12
require_uppercase: true
require_number: true
# Session security
session:
secure_cookie: true
http_only: true
same_site: strictConfiguration HTTPS
nginx
server {
listen 443 ssl http2;
server_name annotation.example.com;
ssl_certificate /etc/letsencrypt/live/annotation.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/annotation.example.com/privkey.pem;
# Modern SSL configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
# Security headers
add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
# ... rest of config
}Pare-feu
bash
# UFW configuration
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 'Nginx Full'
sudo ufw enableSurveillance
Endpoint de vérification de santé
bash
# Check server health
curl http://localhost:8000/health
# Expected response
{"status": "healthy", "version": "2.0.0"}Surveillance des logs
bash
# View logs
sudo journalctl -u potato -f
# Or check log file
tail -f /opt/potato/logs/potato.logMétriques Prometheus (optionnel)
yaml
# config.yaml
monitoring:
prometheus:
enabled: true
port: 9090Stratégie de sauvegarde
Sauvegardes automatisées
bash
# backup.sh
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=/opt/potato/backups
# Backup annotations
tar -czf $BACKUP_DIR/annotations_$DATE.tar.gz /opt/potato/projects/*/annotations/
# Backup configs
tar -czf $BACKUP_DIR/configs_$DATE.tar.gz /opt/potato/projects/*/config.yaml
# Remove old backups (keep 7 days)
find $BACKUP_DIR -mtime +7 -delete
# Optional: sync to cloud storage
# aws s3 sync $BACKUP_DIR s3://your-bucket/potato-backups/Ajoutez au crontab :
bash
# Run daily at 2am
0 2 * * * /opt/potato/backup.shMise à l'échelle
Workers multiples
bash
# Increase gunicorn workers based on CPU cores
gunicorn -w $((2 * $(nproc) + 1)) -b 0.0.0.0:8000 ...Équilibrage de charge
nginx
upstream potato_servers {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
server {
location / {
proxy_pass http://potato_servers;
}
}Dépannage
Problèmes courants
Port déjà utilisé :
bash
sudo lsof -i :8000
sudo kill -9 <PID>Permission refusée :
bash
sudo chown -R potato:potato /opt/potatoMémoire insuffisante :
bash
# Add swap space
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfilePour une aide supplémentaire, consultez la documentation complète ou les discussions GitHub.