
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
自动同步Tautulli统计数据到Ghost CMS,生成包含最常观看媒体的个性化新闻通讯。本指南详细介绍如何使用Docker和Docker Compose部署Tautulli2Ghost。
bash# 从Docker Hub拉取镜像 docker pull sharkhunterr/tautulli2ghost:latest # 创建配置目录 mkdir -p tautulli2ghost/{config,data/logs,templates} cd tautulli2ghost # 下载配置文件 curl -o docker-compose.yml https://raw.githubusercontent.com/sharkhunterr/Tautulli2Ghost/main/docker-compose.prod.yml curl -o .env.example https://raw.githubusercontent.com/sharkhunterr/Tautulli2Ghost/main/.env.example curl -o config.json.example https://raw.githubusercontent.com/sharkhunterr/Tautulli2Ghost/main/config.json.example
bashgit clone https://github.com/sharkhunterr/Tautulli2Ghost.git cd Tautulli2Ghost
bash# 创建必要目录 mkdir -p data/logs config # 复制示例配置文件 cp config.json.example config.json # 编辑参数 nano config.json
bash# 复制并编辑配置文件 cp .env.example .env cp config.json.example config.json # 编辑参数 nano .env nano config.json
bash# 标准生产版本 docker-compose up -d # 带Redis缓存 docker-compose --profile redis up -d # 带完整监控(Prometheus + Grafana) docker-compose --profile monitoring --profile redis up -d # 开发版本 docker-compose -f docker-compose.dev.yml up -d
bash# 查看日志 docker-compose logs -f tautulli2ghost # 检查状态 docker-compose ps # 更新 docker-compose pull && docker-compose up -d # 停止 docker-compose down
bash# 测试API curl http://localhost:8000/api/health # 测试新闻通讯生成 curl -X POST http://localhost:8000/api/newsletter/generate # 访问Web界面 open http://localhost:8000 # 访问监控(若启用) open http://localhost:3000 # Grafana open http://localhost:9090 # Prometheus
bash# 稳定版本(推荐) docker pull sharkhunterr/tautulli2ghost:latest docker pull sharkhunterr/tautulli2ghost:stable # 特定版本 docker pull sharkhunterr/tautulli2ghost:2.0.145 docker pull sharkhunterr/tautulli2ghost:2.0 # 开发版本 docker pull sharkhunterr/tautulli2ghost:dev
| 标签 | 压缩大小 | 解压大小 |
|---|---|---|
latest | ~150 MB | ~400 MB |
dev | ~180 MB | ~450 MB |
编辑config.json填入参数:
json{ "apis": { "tautulli": { "url": "http://your-tautulli:8181", "api_key": "your_tautulli_api_key", "timeout": 30 }, "ghost": { "url": "https://your-ghost-blog.com", "admin_api_key": "your_ghost_admin_api_key", "api_version": "v5.0" }, "tmdb": { "api_key": "your_tmdb_api_key", "language": "zh-CN" } }, "app": { "host": "0.0.0.0", "port": 8000, "debug": false, "log_level": "INFO" }, "newsletter": { "default_template": "template_mixe.html", "default_days": 7, "items_limit": { "movies": 30, "shows": 25, "stats": 10 } } }
创建.env文件存储敏感变量:
env# ===== API配置 ===== # Tautulli(必填) TAUTULLI_API_KEY=your_tautulli_api_key TAUTULLI_URL=http://your-tautulli:8181 TAUTULLI_TIMEOUT=30 # Ghost CMS(必填) GHOST_API_KEY=your_ghost_admin_api_key GHOST_URL=https://your-ghost-blog.com GHOST_API_VERSION=v5.0 # TMDB(可选 - 丰富元数据) TMDB_API_KEY=your_tmdb_api_key TMDB_LANGUAGE=zh-CN # ===== 应用配置 ===== # Web服务器 APP_HOST=0.0.0.0 APP_PORT=8000 APP_DEBUG=false APP_WORKERS=1 # 日志 APP_LOG_LEVEL=INFO # DEBUG, INFO, WARNING, ERROR APP_LOG_FORMAT=json # json, text APP_LOG_FILE=true # 启用文件日志 APP_LOG_ROTATION=true # 自动日志轮转 # ===== 新闻通讯配置 ===== # 模板和生成 NEWSLETTER_DEFAULT_TEMPLATE=template_mixe.html NEWSLETTER_DEFAULT_DAYS=7 NEWSLETTER_ITEMS_LIMIT_MOVIES=30 NEWSLETTER_ITEMS_LIMIT_SHOWS=25 NEWSLETTER_ITEMS_LIMIT_STATS=10 # 自动计划 NEWSLETTER_AUTO_GENERATION=false # 自动生成 NEWSLETTER_CRON_SCHEDULE="0 9 * * 1" # 每周一9点(cron格式) # ===== 数据库配置 ===== # SQLite(默认) DATABASE_URL=sqlite:///data/tautulli2ghost.db DATABASE_POOL_SIZE=10 DATABASE_TIMEOUT=30 # ===== 缓存配置 ===== # Redis(可选) REDIS_URL=redis://localhost:6379/0 REDIS_TIMEOUT=5 CACHE_TTL=3600 # TTL秒数 # ===== 安全配置 ===== # 会话和认证 SECRET_KEY=your-secret-key-here-change-this SESSION_TIMEOUT=3600 # 会话超时秒数 CORS_ORIGINS=http://localhost:3000,https://your-domain.com # 速率限制 RATE_LIMIT_ENABLED=true RATE_LIMIT_REQUESTS=100 # 每分钟请求数 RATE_LIMIT_WINDOW=60 # 窗口秒数 # ===== 系统配置 ===== # 时区和本地化 TZ=Asia/Shanghai LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8 # 监控和指标 METRICS_ENABLED=true HEALTH_CHECK_ENABLED=true PROMETHEUS_PORT=9090 # ===== Docker配置 ===== # 用户和权限 PUID=1000 # 用户ID PGID=1000 # 组ID UMASK=022 # 默认权限 # 资源 MEMORY_LIMIT=1g # 内存限制 CPU_LIMIT=1.0 # CPU限制
yamlversion: '3.8' services: tautulli2ghost: image: sharkhunterr/tautulli2ghost:latest container_name: tautulli2ghost restart: unless-stopped ports: - "${APP_PORT:-8000}:8000" volumes: # 配置 - ./config.json:/app/config.json:ro # 持久化数据 - ./data:/app/data # 自定义模板(可选) - ./templates:/app/templates:ro # 日志 - ./data/logs:/app/data/logs environment: # 基础应用 - PYTHONPATH=/app - TZ=${TZ:-Asia/Shanghai} - PUID=${PUID:-1000} - PGID=${PGID:-1000} # APIs - TAUTULLI_API_KEY=${TAUTULLI_API_KEY} - TAUTULLI_URL=${TAUTULLI_URL} - TAUTULLI_TIMEOUT=${TAUTULLI_TIMEOUT:-30} - GHOST_API_KEY=${GHOST_API_KEY} - GHOST_URL=${GHOST_URL} - GHOST_API_VERSION=${GHOST_API_VERSION:-v5.0} - TMDB_API_KEY=${TMDB_API_KEY} - TMDB_LANGUAGE=${TMDB_LANGUAGE:-zh-CN} # 应用配置 - APP_HOST=${APP_HOST:-0.0.0.0} - APP_PORT=8000 - APP_DEBUG=${APP_DEBUG:-false} - APP_LOG_LEVEL=${APP_LOG_LEVEL:-INFO} - APP_LOG_FORMAT=${APP_LOG_FORMAT:-json} - APP_LOG_FILE=${APP_LOG_FILE:-true} - APP_LOG_ROTATION=${APP_LOG_ROTATION:-true} # 新闻通讯 - NEWSLETTER_DEFAULT_TEMPLATE=${NEWSLETTER_DEFAULT_TEMPLATE:-template_mixe.html} - NEWSLETTER_DEFAULT_DAYS=${NEWSLETTER_DEFAULT_DAYS:-7} - NEWSLETTER_AUTO_GENERATION=${NEWSLETTER_AUTO_GENERATION:-false} - NEWSLETTER_CRON_SCHEDULE=${NEWSLETTER_CRON_SCHEDULE:-"0 9 * * 1"} # 数据库 - DATABASE_URL=${DATABASE_URL:-sqlite:///data/tautulli2ghost.db} - DATABASE_POOL_SIZE=${DATABASE_POOL_SIZE:-10} # 缓存(若使用Redis) - REDIS_URL=${REDIS_URL} - CACHE_TTL=${CACHE_TTL:-3600} # 安全 - SECRET_KEY=${SECRET_KEY} - SESSION_TIMEOUT=${SESSION_TIMEOUT:-3600} - CORS_ORIGINS=${CORS_ORIGINS} - RATE_LIMIT_ENABLED=${RATE_LIMIT_ENABLED:-true} - RATE_LIMIT_REQUESTS=${RATE_LIMIT_REQUESTS:-100} # 监控 - METRICS_ENABLED=${METRICS_ENABLED:-true} - HEALTH_CHECK_ENABLED=${HEALTH_CHECK_ENABLED:-true} - PROMETHEUS_PORT=${PROMETHEUS_PORT:-9090} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/api/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s deploy: resources: limits: memory: ${MEMORY_LIMIT:-1g} cpus: '${CPU_LIMIT:-1.0}' reservations: memory: 256m cpus: '0.1' logging: driver: "json-file" options: max-size: "10m" max-file: "3" security_opt: - no-new-privileges:true networks: - tautulli2ghost # Redis(可选 - 缓存) redis: image: redis:7-alpine container_name: tautulli2ghost-redis restart: unless-stopped command: redis-server --appendonly yes --maxmemory 128mb --maxmemory-policy allkeys-lru volumes: - redis_data:/data networks: - tautulli2ghost profiles: - redis # Prometheus监控(可选) prometheus: image: prom/prometheus:latest container_name: tautulli2ghost-prometheus restart: unless-stopped ports: - "9090:9090" volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' - '--storage.tsdb.retention.time=200h' - '--web.enable-lifecycle' networks: - tautulli2ghost profiles: - monitoring # Grafana可视化(可选) grafana: image: grafana/grafana:latest container_name: tautulli2ghost-grafana restart: unless-stopped ports: - "3000:3000" volumes: - grafana_data:/var/lib/grafana - ./monitoring/grafana/provisioning:/etc/grafana/provisioning:ro environment: - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-admin} - GF_USERS_ALLOW_SIGN_UP=false networks: - tautulli2ghost profiles: - monitoring volumes: redis_data: prometheus_data: grafana_data: networks: tautulli2ghost: driver: bridge
yamlversion: '3.8' services: tautulli2ghost-dev: build: context: . dockerfile: Dockerfile.dev container_name: tautulli2ghost-dev restart: unless-stopped ports: - "8000:8000" - "5678:5678" # 调试端口 volumes: # 开发模式源码挂载 - .:/app:cached - /app/__pycache__ - /app/.pytest_cache environment: - PYTHONPATH=/app - TZ=Asia/Shanghai - APP_DEBUG=true - APP_LOG_LEVEL=DEBUG - APP_RELOAD=true # APIs(来自.env.dev) - TAUTULLI_API_KEY=${TAUTULLI_API_KEY} - TAUTULLI_URL=${TAUTULLI_URL} - GHOST_API_KEY=${GHOST_API_KEY} - GHOST_URL=${GHOST_URL} - TMDB_API_KEY=${TMDB_API_KEY} command: ["python", "-m", "debugpy", "--listen", "0.0.0.0:5678", "--wait-for-client", "-m", "app.web.main"] networks: - tautulli2ghost-dev networks: tautulli2ghost-dev: driver: bridge
dockerfile# 多阶段构建以减小镜像体积 FROM python:3.12-slim as builder # 安装构建依赖 RUN apt-get update && apt-get install -y \ build-essential \ curl \ && rm -rf /var/lib/apt/lists/* # 设置工作目录 WORKDIR /app # 复制依赖文件并安装 COPY requirements.txt . RUN pip install --no-cache-dir --user -r requirements.txt # 生产阶段 FROM python:3.12-slim # 创建非root用户 RUN groupadd -r appuser && useradd -r -g appuser appuser # 安装运行时依赖 RUN apt-get update && apt-get install -y \ curl \ && rm -rf /var/lib/apt/lists/* # 设置工作目录 WORKDIR /app # 从构建阶段复制Python依赖 COPY --from=builder /root/.local /home/appuser/.local # 复制应用代码 COPY app/ ./app/ COPY templates/ ./templates/ COPY static/ ./static/ COPY webui_templates/ ./webui_templates/ COPY main.py ./ # 创建目录 RUN mkdir -p data/logs && \ chown -R appuser:appuser /app # 切换到非root用户 USER appuser # 设置环境变量 ENV PYTHONPATH=/app ENV PATH=/home/appuser/.local/bin:$PATH # 暴露端口 EXPOSE 8000 # 健康检查 HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ CMD curl -f http://localhost:8000/api/health || exit 1 # 运行应用 CMD ["python", "-m", "app.web.main"]
bash# 启动 docker-compose up -d # 停止 docker-compose down # 重启 docker-compose restart # 查看日志 docker-compose logs -f # 查看特定服务日志 docker-compose logs -f tautulli2ghost # 进入容器 docker-compose exec tautulli2ghost bash # 更新镜像 docker-compose pull docker-compose up -d --force-recreate # 检查状态 docker-compose ps
bash# 备份数据 docker run --rm -v tautulli2ghost_data:/data -v $(pwd):/backup alpine tar czf /backup/backup.tar.gz /data # 恢复数据 docker run --rm -v tautulli2ghost_data:/data -v $(pwd):/backup alpine tar xzf /backup/backup.tar.gz -C /
yaml# 在docker-compose.yml中 services: tautulli2ghost: # ...其他选项 security_opt: - no-new-privileges:true read_only: true tmpfs: - /tmp - /var/tmp volumes: - ./config.json:/app/config.json:ro # 只读 - ./data:/app/data:rw # 日志读写
bash# 实时日志 docker-compose logs -f --tail=100 tautulli2ghost # 带时间戳的日志 docker-compose logs -t tautulli2ghost # 仅错误日志 docker-compose logs --tail=50 tautulli2ghost | grep ERROR
yaml# 添加到docker-compose.yml services: prometheus: image: prom/prometheus:latest ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml
容器无法启动
bash# 查看日志 docker-compose logs tautulli2ghost # 检查配置 docker-compose config # 测试JSON配置 python -c "import json; print(json.load(open('config.json')))"
Port已占用
bash# 检查占用端口 sudo netstat -tulpn | grep :8000 # 在docker-compose.yml中修改端口 ports: - "8080:8000" # 使用8080代替8000
权限问题
bash# 检查权限 ls -la data/ # 修复权限 sudo chown -R 1000:1000 data/
容器错误
bash# 重启容器 docker-compose restart tautulli2ghost # 重建镜像 docker-compose build --no-cache docker-compose up -d
bash# 检查容器信息 docker inspect tautulli2ghost # 查看容器内进程 docker-compose exec tautulli2ghost ps aux # 查看资源使用 docker stats tautulli2ghost # 检查健康状态 docker-compose exec tautulli2ghost curl -f http://localhost:8000/api/health
nginx# /etc/nginx/sites-available/tautulli2ghost server { listen 80; server_name your-domain.com; location / { proxy_pass http://localhost: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; } }
bash# 安装Certbot sudo apt install certbot python3-certbot-nginx # 获取证书 sudo certbot --nginx -d your-domain.com # 自动续期 sudo crontab -e 0 12 * * * /usr/bin/certbot renew --quiet
bash#!/bin/bash # backup.sh DATE=$(date +%Y%m%d_%H%M%S) BACKUP_DIR="/backup/tautulli2ghost" mkdir -p $BACKUP_DIR # 备份配置 cp config.json $BACKUP_DIR/config_$DATE.json # 备份数据 docker run --rm -v tautulli2ghost_data:/data -v $BACKUP_DIR:/backup alpine tar czf /backup/data_$DATE.tar.gz /data # 删除30天以上的旧备份 find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
bash# 停止容器 docker-compose down # 更新代码 git pull origin main # 重建镜像 docker-compose build --no-cache # 重启 docker-compose up -d
yaml# 添加到docker-compose.yml services: watchtower: image: containrrr/watchtower volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - WATCHTOWER_POLL_INTERVAL=300 - WATCHTOWER_CLEANUP=true
Tautulli2Ghost v2.0.0 Docker指南
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务