Deployment & infraGitHub source
Configuring the Flask deployment
/deploymentComplete production deployment configuration for Flask applications.
// skill content
Flask Deployment Configuration Complete production deployment setup for Flask applications. ## Usage ``bash # Build Docker image docker build -t myapp . # Run with Docker Compose docker-compose up -d # Deploy to cloud gunicorn --bind 0.0.0.0:8000 app:app ` ## Production Configuration `python # config.py import os from urllib.parse import quote_plus class ProductionConfig: """Production configuration.""" # Security SECRET_KEY = os.environ.get('SECRET_KEY') DEBUG = False TESTING = False # Database SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \ f"postgresql://{os.environ.get('DB_USER')}:{quote_plus(os.environ.get('DB_PASSWORD'))}@" \ f"{os.environ.get('DB_HOST')}:{os.environ.get('DB_PORT', '5432')}/{os.environ.get('DB_NAME')}" SQLALCHEMY_TRACK_MODIFICATIONS = False SQLALCHEMY_ENGINE_OPTIONS = { 'pool_size': 10, 'max_overflow': 20, 'pool_recycle': 3600, 'pool_pre_ping': True } # Security Headers SECURITY_HEADERS = { 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'Content-Security-Policy': "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'" } # Session SESSION_COOKIE_SECURE = True SESSION_COOKIE_HTTPONLY = True SESSION_COOKIE_SAMESITE = 'Lax' PERMANENT_SESSION_LIFETIME = 3600 # 1 hour # Cache CACHE_TYPE = 'redis' CACHE_REDIS_URL = os.environ.get('REDIS_URL', 'redis://localhost:6379/0') CACHE_DEFAULT_TIMEOUT = 300 # Rate Limiting RATELIMIT_STORAGE_URL = os.environ.get('REDIS_URL', 'redis://localhost:6379/1') RATELIMIT_DEFAULT = '100/hour' # Logging LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') LOG_FILE = os.environ.get('LOG_FILE', '/var/log/app/app.log') # File Upload MAX_CONTENT_LENGTH = 16 * 1024 * 1024 # 16MB UPLOAD_FOLDER = os.environ.get('UPLOAD_FOLDER', '/var/uploads') # Email MAIL_SERVER = os.environ.get('MAIL_SERVER') MAIL_PORT = int(os.environ.get('MAIL_PORT', 587)) MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS', 'true').lower() in ['true', 'on', '1'] MAIL_USERNAME = os.environ.get('MAIL_USERNAME') MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD') MAIL_DEFAULT_SENDER = os.environ.get('MAIL_DEFAULT_SENDER') ` ## WSGI Configuration `python # wsgi.py import os from app import create_app # Get environment config_name = os.environ.get('FLASK_ENV', 'production') app = create_app(config_name) if __name__ == "__main__": app.run() ` ## Gunicorn Configuration `python # gunicorn.conf.py import multiprocessing import os # Server socket bind = f"0.0.0.0:{os.environ.get('PORT', 8000)}" backlog = 2048 # Worker processes workers = multiprocessing.cpu_count() * 2 + 1 worker_class = 'sync' worker_connections = 1000 timeout = 30 keepalive = 60 max_requests = 1000 max_requests_jitter = 100 # Security limit_request_line = 4094 limit_request_fields = 100 limit_request_field_size = 8190 # Logging accesslog = '-' errorlog = '-' loglevel = os.environ.get('LOG_LEVEL', 'info').lower() access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" %(D)s' # Process naming proc_name = 'flask_app' # Server mechanics daemon = False pidfile = '/tmp/gunicorn.pid' user = os.environ.get('USER', 'www-data') group = os.environ.get('GROUP', 'www-data') tmp_upload_dir = None # SSL keyfile = os.environ.get('SSL_KEYFILE') certfile = os.environ.get('SSL_CERTFILE') ` ## Docker Configuration `dockerfile # Dockerfile FROM python:3.11-slim # Set environment variables ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 # Install system dependencies RUN apt-get update && apt-get install -y \ build-essential \ libpq-dev \ curl \ && rm -rf /var/lib/apt/lists/* # Create app user RUN groupadd -r appuser && useradd -r -g appuser appuser # Set work directory WORKDIR /app # Install Python dependencies COPY requirements/production.txt ./requirements.txt RUN pip install --no-cache-dir -r requirements.txt # Copy application code COPY . . # Create necessary directories RUN mkdir -p /var/log/app /var/uploads && \ chown -R appuser:appuser /app /var/log/app /var/uploads # Switch to non-root user USER appuser # Expose port EXPOSE 8000 # Health check HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \ CMD curl -f http://localhost:8000/health || exit 1 # Run application CMD ["gunicorn", "--config", "gunicorn.conf.py", "wsgi:app"] ` ## Docker Compose ``yaml # docker-compose.yml version: '3.8' services: web: build: . ports: - "8000:8000" environment: - FLASKENV=production - DATABASEURL=postgresql:/
// original public source
davila7/claude-code-templates/cli-tool/templates/python/examples/flask-app/.claude/commands/deployment.md
License: MIT License
Independent project, not affiliated with Anthropic. This skill remains the property of its original author.