# MyHOT 的配置。复制成 .env 再改(或者运行 node scripts/init-env.ts,它会生成 .env 并填好随机密钥)。 # 前端只拿到网站地址;所有密钥只在后端。不要把 .env 提交到 Git。 # ===== 必填 ===== # 网站对外的地址:生成的链接、RSS、分享图、MCP 都用它。本机试用就用下面这个。 SITE_URL=http://localhost:3000 # 管理员密码(至少 12 位),登录 /admin 用。 ADMIN_PASSWORD= # 会话签名和图片代理签名的密钥,各填一串随机字符(可以用 openssl rand -hex 32 生成)。 SESSION_SECRET= IMG_PROXY_SIGN_SECRET= # 用 Docker 时数据库的密码(数据库不对外开放端口,也请用随机字符)。 POSTGRES_PASSWORD= # 模型:任何 OpenAI 兼容接口都可以,所有步骤默认都用它。下面是 DeepSeek 的写法。 LLM_BASE_URL=https://api.deepseek.com/v1 LLM_API_KEY= LLM_MODEL=deepseek-flash # 服务商特有的请求参数(JSON),比如关掉思考模式: LLM_EXTRA_JSON={"thinking":{"type":"disabled"}} # 其他服务商的例子: # 千问 LLM_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 LLM_MODEL=qwen3.8-flash LLM_EXTRA_JSON={"enable_thinking":false} # 智谱 LLM_BASE_URL=https://open.bigmodel.cn/api/paas/v4 LLM_MODEL=glm-5.3-flash LLM_EXTRA_JSON={"thinking":{"type":"enabled"},"reasoning_effort":"low"} # 模型能看图就打开(精选内容的标题摘要会参考首图): # LLM_VISION=true # 服务不支持 JSON 模式(response_format)时关掉: # LLM_JSON_MODE=false # 推理模型(先想再答,推理和答案共用输出额度)额外给推理留的输出额度,加在每一步自己的额度上,不填为 0。 # 调用报 “output token limit reached (finish_reason=length)” 时设它,比如: # LLM_REASONING_TOKENS=4000 # ===== 选填:让事件归组更准 ===== # 向量召回:任何 OpenAI 兼容的 /embeddings 接口。不填也能跑:归组改用文字重合度找候选, # 但只作热度证据的讨论帖(hot_signal 信源)大多挂不到事件上,热度会偏低。 # EMBEDDING_BASE_URL=https://api.openai.com/v1 # EMBEDDING_API_KEY= # EMBEDDING_MODEL=text-embedding-3-small # 或者只填阿里云百炼的 key,就用 text-embedding-v4: # DASHSCOPE_API_KEY= # 向量的维度(用 EMBEDDING_* 时默认取服务返回的,百炼默认 1024);改了以后旧向量会重新计算: # EMBEDDING_DIMS= # ===== 选填:每一步单独换模型 ===== # 默认每一步都用上面的 LLM_*。想让某一步用别家,填预设名(需要对应的 key): # PREFILTER_MODEL SCORE_MODEL UNDERSTAND_MODEL SUMMARIZE_MODEL WORDING_MODEL STRUCTURE_MODEL # GROUP_MODEL GROUP_REVIEW_MODEL DIGEST_MODEL REPORT_MODEL TRANSLATE_MODEL # 预设名与需要的 key: # deepseek-flash / deepseek-flash-think DEEPSEEK_BASE_URL=https://api.deepseek.com/v1 DEEPSEEK_API_KEY= # qwen3.7-flash / qwen3.8-flash / qwen3-vl-flash DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 DASHSCOPE_API_KEY= # glm-5.3-flash / glm-5.3-flash-selection ZHIPU_BASE_URL=https://open.bigmodel.cn/api/paas/v4 ZHIPU_API_KEY= # mimo-v2.6-flash XIAOMI_MIMO_BASE_URL=https://api.xiaomimimo.com/v1 XIAOMI_MIMO_API_KEY= # 注意:填了 DASHSCOPE_API_KEY、又没填 EMBEDDING_API_KEY 时,归组会自动用百炼的向量(text-embedding-v4),按百炼的价格另外计费。 # ===== 选填:付费的采集服务(按请求计费,有预算熔断,在后台“设置”里调) ===== # X(推特)账号:SocialData # SOCIALDATA_API_KEY= # 微信公众号:极致了(Dajiala) # DAJIALA_KEY= # 抓不到正文时用浏览器渲染兜底:Jina Reader # JINA_API_KEY= # ===== 选填:飞书 ===== # 精选推送到飞书群(只推 T1、T1_5 信源的精选):在后台“设置 → 通知目的地”里启用,webhook 地址填在这里。 FEISHU_CONTENT_PUSH_ENABLED=false # FEISHU_PUSH_WEBHOOK_URL= # FEISHU_PUSH_MIRROR_WEBHOOK_URL= # 告警、反馈转发到内部飞书群(需要一个飞书自建应用): FEISHU_INTERNAL_ENABLED=false # FEISHU_APP_ID= # FEISHU_APP_SECRET= # FEISHU_INTERNAL_CHAT_ID= # FEISHU_ALERT_CHAT_ID= # 用飞书账号登录后台(可选,和管理员密码并存): # FEISHU_LOGIN_APP_ID= # FEISHU_LOGIN_APP_SECRET= # ADMIN_FEISHU_UNION_IDS= # ADMIN_EMAILS= # ===== 选填:其他 ===== # 读 GitHub 接口(api.github.com)的 JSON 信源带上它,配额更高。GitHub 免费申请,只要只读权限: # GITHUB_TOKEN= # 外部脚本往站里推送内容(POST /api/ingest/items)用的 token,至少 16 位;不填就关闭这个接口。 # INGEST_TOKEN= # 推送接口每个客户端每分钟最多推几次(docker compose 默认 10);前面的反向代理已经限流时可以设成 0: # INGEST_RATE_LIMIT=10 # 抓取海外信源要走代理时(比如服务器在中国大陆): # EGRESS_PROXY_URL=http://127.0.0.1:7890 # 图片代理从原站取图的流量上限(每分钟多少 MB、每天多少 GB),超过后没缓存的图先返回 503;不填就按 site/site.ts 的 DEPLOYMENT.imageUpstreamBudget,那里默认不设上限: # IMGPROXY_UPSTREAM_MB_PER_MINUTE=300 # IMGPROXY_UPSTREAM_GB_PER_DAY=30 # 前面有 Caddy 或 Nginx 这类反向代理时设为 true,访客地址才从代理的 X-Forwarded-For 里读; # 网站直接对外时保持 false,免得有人伪造地址绕过登录次数和反馈的限制。 TRUST_PROXY=false # MCP 只接受发给 SITE_URL 域名(和 localhost)的请求;还有别的访问域名时,逗号分隔写在这里: # MCP_ALLOWED_HOSTS= # 网站多久没有新内容就算“停止收录”并告警(分钟);不填按 site/site.ts 的 ALERTS.quietMinutes(默认 360): # ALERT_QUIET_MINUTES=360 # 每天把新页面提交给 IndexNow(Bing 等);key 是 32 位十六进制,自己生成一个: INDEXNOW_SUBMIT_ENABLED=false # INDEXNOW_KEY= # 数据库每天备份到 S3 兼容的对象存储(腾讯云 COS、AWS S3、阿里云 OSS……)。 # 不填 DB_BACKUP_STORE_DOMAIN 时按腾讯云 COS 拼地址(<桶名>.cos.<地域>.myqcloud.com); # 用别家时填带桶名的访问域名,比如 AWS S3 填 my-bucket.s3.us-east-1.amazonaws.com: # DB_BACKUP_STORE_SECRET_ID= # DB_BACKUP_STORE_SECRET_KEY= # DB_BACKUP_STORE_BUCKET= # DB_BACKUP_STORE_REGION= # DB_BACKUP_STORE_DOMAIN= # 日志级别(默认 info)和数据库连接池上限(默认 10): # LOG_LEVEL=info # DATABASE_POOL_MAX=10 # 版本名:显示在后台“运行”页和 /api/health,升级后可以确认进程已经换新: # AIHOT_RELEASE= # 环境名,默认按 NODE_ENV 取 production 或 development;不是 production 时告警会带上它,开发免登录也只在非 production 时可用: # AIHOT_ENVIRONMENT= # 把密钥按组写在一个目录里(models.env、collectors.env、integrations.env、auth.env),代替写在这里;这里写了的优先: # AIHOT_CREDENTIALS_DIR= # ===== 安全阀 ===== # 写成 true 才抓信源(包括每天取信源图标)、调模型;删掉这两行或改成 false 就都停下(调试界面时有用)。 # 这份文件里所有 *_ENABLED 开关都只认 true,写 1、yes 或 TRUE 都当作关。 COLLECT_ENABLED=true MODEL_CALLS_ENABLED=true # ===== 不用 Docker、直接在本机跑时才需要 ===== # DATABASE_URL=postgres://用户名@127.0.0.1:5432/myhot # API_BASE_URL=http://127.0.0.1:3001 # 上传的文件、图片缓存和本地备份放在哪个目录(默认仓库里的 .data): # AIHOT_DATA_DIR=/var/lib/myhot # 开发时免登录进后台(生产环境会拒绝启动),后台显示的名字: # DEV_AUTH_ROLE=admin # DEV_AUTH_DISPLAY_NAME=Dev Admin # 本机调试时允许抓内网地址(默认禁止,生产环境拒绝启动): # ALLOW_PRIVATE_NETWORK_FETCH=true # ===== 用 docker compose --profile https 时 ===== # SITE_DOMAIN=example.com # 网站在本机开的端口(docker compose 用,默认 3000,所有网卡都能访问);用 HTTPS 时只给本机的 Caddy 用,不直接对外: # PORT=127.0.0.1:3000 # 同时把上面的 TRUST_PROXY 改成 true。