APP_NAME=Laravel APP_ENV=production # 留空则由 Docker 入口执行 key:generate 写入;勿向容器注入「空」的 APP_KEY 环境变量,否则无法写入有效密钥。 APP_KEY= APP_DEBUG=false APP_URL=http://localhost:18080 SITE_URL= ASSET_URL= # Docker Compose 的 init/app 容器在此值为空时使用 REMOTE_ADDR,仅信任内部 Nginx 直接调用方。 # 直接运行 Artisan 服务或自建代理链时,按实际边界留空或填写明确的代理 IP/CIDR。 TRUSTED_PROXIES= # 外层代理以固定单层目录发布时填写(例如 /docs);留空会清除客户端传入的 X-Forwarded-Prefix。 GEOFLOW_FORWARDED_PREFIX= # Laravel Boost 仅用于本地调试;生产/公开部署应关闭浏览器日志脚本注入。 BOOST_BROWSER_LOGS_WATCHER=false # docker-compose.yml 中 app 服务宿主机端口映射(与 APP_URL 一致) APP_PORT=18080 APP_TIMEZONE=Asia/Shanghai # --- GEOFlow(遗留 config.php 对齐,见 config/geoflow.php)--- SITE_NAME="智能GEO内容系统" SITE_FULL_NAME="GEO+AI内容生成系统" SITE_URL="${APP_URL}" SITE_DESCRIPTION= SITE_KEYWORDS= ADMIN_BASE_PATH=geo_admin # 前台 Blade 翻译语言(与 APP_LOCALE 独立;默认 zh_CN 对齐旧站中文导航) GEOFLOW_PUBLIC_LOCALE=zh_CN # AI 工作台可由超级管理员在网站设置中开启;这里提供首次保存前的默认值和服务器紧急关闭能力。 GEOFLOW_ADMIN_UI_V3_ENABLED=true GEOFLOW_AI_WORKSPACE_RUNTIME_ENABLED=false GEOFLOW_AI_WORKSPACE_FORCE_DISABLED=false GEOFLOW_AI_WORKSPACE_RETENTION_DAYS=90 GEOFLOW_AI_WORKSPACE_GLOBAL_CONCURRENCY=10 GEOFLOW_AI_WORKSPACE_CONCURRENCY_CACHE_STORE=redis GEOFLOW_AI_WORKSPACE_ADMIN_DAILY_MODEL_CALLS=200 GEOFLOW_AI_WORKSPACE_MODEL_TOTAL_TIMEOUT=90 GEOFLOW_AI_WORKSPACE_MODEL_ATTEMPT_TIMEOUT=30 GEOFLOW_AI_WORKSPACE_HISTORY_CHAR_BUDGET=16000 GEOFLOW_AI_WORKSPACE_GENERATION_LEASE_SECONDS=180 GEOFLOW_AI_WORKSPACE_RESOLUTION_LEASE_MINUTES=3 GEOFLOW_AI_WORKSPACE_EXECUTION_LEASE_MINUTES=15 GEOFLOW_AI_WORKSPACE_REQUIRE_VERIFIED_MODEL=true # 托管渠道站点默认关闭。启用前需完成泛 DNS、通配符 TLS、可信代理和 Nginx 三入口配置。 GEOFLOW_HOSTED_SITES_ENABLED=false GEOFLOW_PRIMARY_HOSTS=localhost GEOFLOW_HOSTED_SITE_ROOT_DOMAINS= # Nginx 三入口使用单个主站域名、可选空格分隔别名,以及单个托管根域。 GEOFLOW_NGINX_PRIMARY_HOST=your-domain.com GEOFLOW_NGINX_PRIMARY_ALIASES=www.your-domain.com GEOFLOW_NGINX_HOSTED_ROOT_DOMAIN=sites.your-domain.com GEOFLOW_NGINX_PUBLIC_SCHEME=https GEOFLOW_NGINX_PUBLIC_PORT=443 GEOFLOW_HOSTED_SITE_RESOLVER_POSITIVE_TTL=300 GEOFLOW_HOSTED_SITE_RESOLVER_NEGATIVE_TTL=30 GEOFLOW_HOSTED_SITE_DAILY_PUBLISH_LIMIT=3 GEOFLOW_HOSTED_SITE_MIN_PUBLISH_INTERVAL_MINUTES=360 GEOFLOW_HOSTED_SITE_MIN_ARTICLES_BEFORE_INDEX=10 GEOFLOW_HOSTED_SITE_FAILURE_COOLDOWN_THRESHOLD=3 GEOFLOW_HOSTED_SITE_FAILURE_COOLDOWN_MINUTES=60 GEOFLOW_HOSTED_SITE_RESERVATION_TTL_MINUTES=30 GEOFLOW_HOSTED_SITE_RECONCILE_LIMIT=500 GEOFLOW_HOSTED_SITE_STALE_SENDING_SECONDS=150 GEOFLOW_HOSTED_SITE_CERTIFIED_THEMES=default GEOFLOW_LINK_POOL_THEME_SHARED_STORAGE=false GEOFLOW_LINK_POOL_THEME_READBACK_BASE_URL= GEOFLOW_HOSTED_SITE_NETWORK_PREFLIGHT=false GEOFLOW_HOSTED_SITE_PREFLIGHT_TIMEOUT=8 GEOFLOW_HOSTED_SITE_PREFLIGHT_FRESH_MINUTES=15 GEOFLOW_HOSTED_SITE_INDEX_OBSERVATION_MINUTES=30 # 开发 Docker 入口(docker/entrypoint.sh):迁移完成后是否执行 php artisan optimize(默认 false;生产见 .env.prod.example / entrypoint.prod.sh) AUTO_OPTIMIZE=false # Docker init 服务启动时修正 storage/bootstrap/cache 权限;常驻服务已关闭重复扫描。 AUTO_FIX_STORAGE_PERMISSIONS=true GEOFLOW_ITEMS_PER_PAGE=12 GEOFLOW_ADMIN_ITEMS_PER_PAGE=20 GEOFLOW_TITLE_AI_MAX_MANUAL_RETRIES=3 GEOFLOW_TITLE_AI_SUBMIT_RATE_PER_MINUTE=6 GEOFLOW_TITLE_AI_SUBMIT_IP_RATE_PER_MINUTE=12 GEOFLOW_TITLE_AI_MAX_ACTIVE_RUNS_PER_ADMIN=3 GEOFLOW_TITLE_AI_MAX_PENDING_TITLES_PER_MODEL=300000 GEOFLOW_TITLE_AI_MAX_COUNT=100000 GEOFLOW_TITLE_AI_CONFIRMATION_THRESHOLD=1000 GEOFLOW_TITLE_AI_BATCH_SIZE=50 GEOFLOW_TITLE_AI_RATE_PER_MINUTE=30 GEOFLOW_TITLE_AI_MAX_EMPTY_BATCHES=3 GEOFLOW_TITLE_AI_MAX_BATCH_ATTEMPTS=3 GEOFLOW_TITLE_AI_MAX_REQUEST_MULTIPLIER=3 GEOFLOW_TITLE_AI_REQUEST_TIMEOUT_SECONDS=90 GEOFLOW_TITLE_AI_LEASE_SECONDS=420 GEOFLOW_TITLE_AI_RECOVERY_STALE_SECONDS=300 GEOFLOW_KNOWLEDGE_FACT_GENERATION_RATE_PER_MINUTE=10 GEOFLOW_KNOWLEDGE_FACT_GENERATION_MAX_BATCH_ATTEMPTS=3 GEOFLOW_KNOWLEDGE_FACT_GENERATION_BATCH_LEASE_SECONDS=210 GEOFLOW_KNOWLEDGE_FACT_GENERATION_MAX_RECOVERY_ATTEMPTS=3 GEOFLOW_KNOWLEDGE_FACT_GENERATION_RECOVERY_STALE_SECONDS=300 GEOFLOW_KNOWLEDGE_FACT_GENERATION_FINALIZER_PENDING_SECONDS=900 GEOFLOW_KNOWLEDGE_FACT_GENERATION_PENDING_BATCH_MAX_AGE_SECONDS=900 GEOFLOW_AI_QUALITY_REQUEST_TIMEOUT_SECONDS=160 GEOFLOW_AI_QUALITY_DEADLINE_SECONDS=180 GEOFLOW_AI_QUALITY_SAMPLED_FALLBACK_SECONDS=45 GEOFLOW_AI_QUALITY_SAMPLED_REQUEST_TIMEOUT_SECONDS=35 GEOFLOW_AI_QUALITY_SAMPLED_MAX_CHARACTERS=6000 GEOFLOW_AI_QUALITY_SAMPLED_MAX_RANGES=12 GEOFLOW_AI_QUALITY_FULL_ONLINE_MAX_CHARACTERS=60000 GEOFLOW_AI_QUALITY_SAMPLED_AUTO_RELEASE_ENABLED=true GEOFLOW_AI_QUALITY_PERSISTENCE_RESERVE_SECONDS=10 GEOFLOW_AI_QUALITY_WORKER_STALE_SECONDS=300 GEOFLOW_AI_QUALITY_JOB_TIMEOUT_SECONDS=245 GEOFLOW_AI_QUALITY_WORKER_TIMEOUT_SECONDS=250 GEOFLOW_AI_QUALITY_STOP_GRACE_PERIOD=260s GEOFLOW_AI_QUALITY_MAX_OUTPUT_TOKENS=2048 GEOFLOW_AI_QUALITY_MAX_MODEL_CANDIDATES=2 GEOFLOW_AI_QUALITY_MAX_EVIDENCE=12 GEOFLOW_AI_QUALITY_MAX_EVIDENCE_CHARACTERS=6000 GEOFLOW_AI_QUALITY_MAX_FACT_RETRIEVALS=6 GEOFLOW_AI_QUALITY_QUEUE=ai-quality GEOFLOW_AI_QUALITY_BACKFILL_QUEUE=ai-quality-backfill AI_QUALITY_QUEUE_REPLICAS=2 GEOFLOW_AI_QUALITY_EXECUTION_VERSION=legacy GEOFLOW_AI_QUALITY_PRINCIPLE_V2_PERCENT=0 GEOFLOW_AI_QUALITY_FAST_V2_PERCENT=0 GEOFLOW_AI_QUALITY_SCORING_V2_PERCENT=0 GEOFLOW_AI_QUALITY_SHADOW_V2_PERCENT=0 GEOFLOW_AI_QUALITY_EVIDENCE_CACHE_TTL_SECONDS=86400 GEOFLOW_AI_QUALITY_EVIDENCE_CACHE_ENABLED=true GEOFLOW_AI_QUALITY_CIRCUIT_CONSECUTIVE_FAILURES=5 GEOFLOW_AI_QUALITY_CIRCUIT_SAMPLE_SIZE=10 GEOFLOW_AI_QUALITY_CIRCUIT_FAILURE_PERCENT=50 GEOFLOW_AI_QUALITY_CIRCUIT_OPEN_SECONDS=60 GEOFLOW_AI_QUALITY_FRONT_QUEUE_WAIT_SECONDS=10 GEOFLOW_AI_QUALITY_BACKFILL_QUOTA_RESERVE=2 GEOFLOW_AI_QUALITY_RECOVERY_STALE_SECONDS=60 GEOFLOW_AI_QUALITY_STRUCTURED_REPROBE_SECONDS=86400 GEOFLOW_AI_QUALITY_OPTIMIZATION_ENABLED=false GEOFLOW_AI_QUALITY_OPTIMIZATION_AUTO_APPLY_ENABLED=false GEOFLOW_AI_QUALITY_OPTIMIZATION_PERCENT=0 GEOFLOW_AI_QUALITY_OPTIMIZATION_AUTO_APPLY_PERCENT=0 GEOFLOW_AI_QUALITY_OPTIMIZATION_QUEUE=ai-content-optimization GEOFLOW_AI_QUALITY_OPTIMIZATION_BULK_QUEUE=ai-content-optimization-bulk GEOFLOW_AI_QUALITY_OPTIMIZATION_BULK_QUOTA_RESERVE=2 GEOFLOW_AI_QUALITY_OPTIMIZATION_MAX_MODEL_ATTEMPTS=2 GEOFLOW_AI_QUALITY_OPTIMIZATION_MAX_ROUNDS=3 GEOFLOW_AI_QUALITY_OPTIMIZATION_MAX_EDIT_CHARACTERS=8000 GEOFLOW_AI_QUALITY_OPTIMIZATION_ROUND_ESTIMATED_SECONDS=235 GEOFLOW_AI_QUALITY_OPTIMIZATION_LEASE_SECONDS=300 GEOFLOW_AI_QUALITY_OPTIMIZATION_RECOVERY_STALE_SECONDS=300 GEOFLOW_AI_QUALITY_OPTIMIZATION_JOB_TIMEOUT_SECONDS=850 GEOFLOW_AI_QUALITY_OPTIMIZATION_WORKER_TIMEOUT_SECONDS=900 AI_QUALITY_OPTIMIZATION_QUEUE_REPLICAS=2 # true 时记录知识库检索「查询向量」是否由 embedding 接口生成(验证用,默认 false) GEOFLOW_DEBUG_KNOWLEDGE_QUERY_EMBEDDING=false # 私网出站仅允许精确 host:port(逗号分隔);留空时全部拒绝,不支持通配符或路径。 GEOFLOW_OUTBOUND_PRIVATE_TARGETS= GEOFLOW_OUTBOUND_JSON_MAX_BYTES=4194304 GEOFLOW_OUTBOUND_AI_MAX_BYTES=8388608 GEOFLOW_OUTBOUND_IMPORT_MAX_BYTES=5242880 GEOFLOW_OUTBOUND_METADATA_MAX_BYTES=1048576 GEOFLOW_OUTBOUND_RESPONSE_MAX_BYTES=52428800 # 安全出站网关会绕过系统/进程 HTTP 代理并固定已校验 IP,避免代理改写目标。 GEOFLOW_UPLOAD_URL=/assets/images/ GEOFLOW_MAX_UPLOAD_BYTES=2097152 # 旧客户端直接提交图片路径的兼容开关,默认关闭;仅在受控迁移窗口临时开启。 GEOFLOW_LEGACY_IMAGE_PATH_INPUT=false # 全新空库的手动迁移可在单次命令中临时设为 true;Docker init 服务已限定作用域,已有迁移历史或业务数据时该标志无效。 GEOFLOW_SECURITY_FRESH_INSTALL_CONFIRMED=false # 已有数据升级专用的一次性确认;仅在 down、停止并排空全部 web/worker/scheduler/在途请求后临时改为 true,迁移完成立即恢复 false。 GEOFLOW_SECURITY_UPGRADE_DRAIN_CONFIRMED=false # 完成 managed image hash readiness 并确认全部进程均为新版本前保持默认 false。 GEOFLOW_MANAGED_IMAGE_DELETION_ENABLED=false # 安全审计判定 deleting 操作中断的短阈值,以及 present 无引用成为长期 orphan 的独立阈值。 GEOFLOW_SECURITY_AUDIT_DELETING_STALE_MINUTES=15 GEOFLOW_SECURITY_AUDIT_ORPHAN_AGE_HOURS=24 GEOFLOW_CACHE_ENABLED=true GEOFLOW_CACHE_TTL=3600 GEOFLOW_MAX_LOGIN_ATTEMPTS=5 GEOFLOW_LOGIN_LOCKOUT_SECONDS=900 GEOFLOW_ADMIN_REMEMBER_MINUTES=43200 GEOFLOW_SESSION_TIMEOUT=2592000 GEOFLOW_API_LOGIN_RATE_LIMIT_ATTEMPTS=10 GEOFLOW_API_LOGIN_RATE_LIMIT_DECAY=60 GEOFLOW_API_TOKEN_DEFAULT_TTL_DAYS=30 # 首次空库安装写入的默认后台账号;重复执行安装命令不会覆盖已有账号。开发环境默认 password,生产环境见 .env.prod.example。 GEOFLOW_ADMIN_USERNAME=admin GEOFLOW_ADMIN_EMAIL=admin@example.com GEOFLOW_ADMIN_PASSWORD=password # 兼容旧配置名;正式安装入口不会执行演示 Seeder,请保持 false。 GEOFLOW_SEED_FRONTEND_DEMO=false # 仅供测试环境显式调用 FrontendDemoSeeder 时控制覆盖行为,正式环境请保持 false。 GEOFLOW_SEED_FRONTEND_DEMO_OVERWRITE=false # 默认管理员尚未成功登录前,登录页会展示一次初始账号提示;生产对外部署如不希望页面提示,可设为 false。 GEOFLOW_INITIAL_ADMIN_HINT_ENABLED=true GEOFLOW_KNOWLEDGE_EMBEDDING_JOB_SIZE=32 GEOFLOW_WORKER_STALE_SECONDS=120 # 变更后所有管理员会再次看到后台项目说明弹窗 GEOFLOW_WELCOME_INTRO_VERSION=3.0 # 匿名统计只发送随机实例 ID、管理员摘要、版本和后台活跃事件;留空监控地址时不会发出请求。 GEOFLOW_TELEMETRY_ENABLED=false GEOFLOW_TELEMETRY_ENDPOINT= GEOFLOW_TELEMETRY_INTERVAL_SECONDS=86400 # 后台右上角通知会每天最多拉取一次 GitHub version.json;如需关闭,设置为 false GEOFLOW_UPDATE_CHECK_ENABLED=true GEOFLOW_UPDATER_INSTANCE_ID=primary GEOFLOW_UPDATER_READ_TIMEOUT_SECONDS=10 GEOFLOW_UPDATER_SOCKET=/run/geoflow-updater/geoflow-updater.sock GEOFLOW_UPDATER_CONTROL_TOKEN_FILE=/run/secrets/geoflow-updater-control-token GEOFLOW_UPDATER_HOST_ROOT= GEOFLOW_UPDATE_METADATA_URL=https://raw.githubusercontent.com/yaojingang/GEOFlow/main/version.json GEOFLOW_UPDATE_METADATA_CACHE_TTL=86400 GEOFLOW_UPDATE_CENTER_ENABLED=true GEOFLOW_UPDATE_REQUIRE_ADMIN_PASSWORD=true APP_LOCALE=zh_CN APP_FALLBACK_LOCALE=en APP_FAKER_LOCALE=en_US APP_MAINTENANCE_DRIVER=file # APP_MAINTENANCE_STORE=database # PHP_CLI_SERVER_WORKERS=4 BCRYPT_ROUNDS=12 LOG_CHANNEL=daily LOG_STACK=single LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug # Docker Compose 默认值;若改为宿主机直连数据库/Redis,再按实际环境修改。 DB_CONNECTION=pgsql DB_HOST=postgres DB_PORT=5432 DB_DATABASE=geo_flow DB_USERNAME=geo_user DB_PASSWORD=geo_password POSTGRES_DATA_DIR=./docker-data/dev/postgres POSTGRES_CONTAINER_DATA_DIR=/var/lib/postgresql SESSION_DRIVER=database SESSION_LIFETIME=43200 SESSION_ENCRYPT=false SESSION_PATH=/ SESSION_DOMAIN=null BROADCAST_CONNECTION=reverb REVERB_APP_ID=geoflow-reverb-app REVERB_APP_KEY=geoflow-reverb-key REVERB_APP_SECRET=geoflow-reverb-secret REVERB_HOST=localhost REVERB_PORT=18080 REVERB_SCHEME=http REVERB_BROADCAST_HOST=reverb REVERB_BROADCAST_PORT=8080 REVERB_BROADCAST_SCHEME=http REVERB_SERVER_HOST=0.0.0.0 REVERB_SERVER_PORT=8080 REVERB_SERVER_PATH=/reverb REVERB_ALLOWED_ORIGINS=localhost FILESYSTEM_DISK=local # 生产与计划一致用 redis;本机未装 Redis 时可改为 sync 或 database QUEUE_CONNECTION=redis DB_QUEUE_RETRY_AFTER=960 CACHE_STORE=database CACHE_LIMITER_STORE=database # CACHE_PREFIX= MEMCACHED_HOST=127.0.0.1 REDIS_CLIENT=phpredis REDIS_HOST=redis REDIS_PASSWORD=null REDIS_PORT=6379 # 须大于应用内最长队列任务 timeout(系统更新任务为 900 秒) REDIS_QUEUE_RETRY_AFTER=960 QUEUE_CONTAINER_MEMORY_LIMIT=384m KNOWLEDGE_QUEUE_CONTAINER_MEMORY_LIMIT=256m AI_QUALITY_QUEUE_CONTAINER_MEMORY_LIMIT=384m AI_QUALITY_BACKFILL_QUEUE_CONTAINER_MEMORY_LIMIT=256m HORIZON_MAX_PROCESSES=3 # 管理员 AI 执行身份灰度:先写入与 Shadow,对账后再开启访问和撤权强制。 GEOFLOW_ADMIN_AI_OWNERSHIP_WRITE_ENABLED=true GEOFLOW_ADMIN_AI_SHADOW_ENABLED=true GEOFLOW_ADMIN_AI_ACCESS_ENFORCE_ENABLED=false GEOFLOW_ADMIN_AI_REVOCATION_ENFORCE_ENABLED=false MAIL_MAILER=log MAIL_SCHEME=null MAIL_HOST=127.0.0.1 MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_FROM_ADDRESS="hello@example.com" MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= AWS_USE_PATH_STYLE_ENDPOINT=false VITE_APP_NAME="${APP_NAME}" # --- Docker 入口 geoflow-entrypoint(docker-compose 启动 app/queue 等时)--- # 每次启动执行 composer install(拉代码后依赖变更;设为 false 可加快本地反复重启) COMPOSER_ON_START=true # Docker 构建和启动期 composer install 使用的 Packagist 镜像;留空可恢复官方源。 COMPOSER_PACKAGIST_MIRROR= # Docker 基础镜像可按网络情况切换为镜像代理地址,例如 m.daocloud.io/docker.io/library/php:8.4-cli-bookworm。 GEOFLOW_APP_IMAGE=geoflow-app-prod:latest GEOFLOW_WEB_IMAGE=geoflow-web-prod:latest COMPOSER_IMAGE=composer:2 PHP_FPM_IMAGE=php:8.4-fpm-bookworm NGINX_IMAGE=nginx:1.31.1-alpine PGVECTOR_IMAGE=pgvector/pgvector:pg18 REDIS_IMAGE=redis:8-alpine # 仅当上述镜像地址不含可识别主版本(例如使用纯 digest)时,为独立更新工具显式指定。 GEOFLOW_UPDATER_POSTGRES_MAJOR= GEOFLOW_UPDATER_REDIS_MAJOR= # 每次启动执行 php artisan migrate --force(数据库结构随仓库更新;设为 false 需自行迁移) AUTO_MIGRATE=true # compose 的 init 服务专用:先 migrate,再由 geoflow:install 判断空库后只执行一次安装填充 AUTO_INIT_ONCE=true # 已迁移数据库上单独执行一次 geoflow:install;常驻服务默认不要开启 # AUTO_INSTALL_ONCE=false