7d8e82c69f
Ship the Ops backstage 对象存储 page (browse / upload / move / delete / folder ops) backed by a new object-storage service + handler, with the shared storage client extended with List/Stat/Copy/Usage/DownloadURL so both MinIO and Aliyun providers cover the new surface. Add ForcePathStyle to the object-storage config and treat r2/s3/custom_s3 as external providers so Cloudflare R2 and other S3-compatibles can share the MinIO client path without spinning up the bundled MinIO. Also add CSV import/export + template download to the site-domain mappings page, raise gin MaxMultipartMemory to 8 MiB for the new multipart endpoints, register Ops swagger routes, and extend the descriptions-parity test to cover the ops router. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
276 lines
8.1 KiB
YAML
276 lines
8.1 KiB
YAML
server:
|
|
port: 8080
|
|
mode: release
|
|
trusted_proxies:
|
|
- 127.0.0.1
|
|
- ::1
|
|
- 10.42.0.0/16
|
|
- 10.43.0.0/16
|
|
- 172.16.0.0/12
|
|
|
|
database:
|
|
host: pgbouncer
|
|
port: 5432
|
|
user: geo
|
|
password: ${POSTGRES_PASSWORD:geo_dev}
|
|
dbname: geo
|
|
sslmode: disable
|
|
max_open_conns: 12
|
|
max_idle_conns: 3
|
|
|
|
monitoring_database:
|
|
host: monitoring-pgbouncer
|
|
port: 5432
|
|
user: geo
|
|
password: ${POSTGRES_PASSWORD:geo_dev}
|
|
dbname: geo_monitoring
|
|
sslmode: disable
|
|
max_open_conns: 8
|
|
max_idle_conns: 2
|
|
|
|
rabbitmq:
|
|
url: amqp://geo:geo_dev@rabbitmq:5672/geo
|
|
monitor_result_exchange: monitor.result
|
|
monitor_result_routing_key: monitor.result.ingest
|
|
monitor_result_queue: monitor.result.ingest
|
|
monitor_result_dlx: monitor.result.dlx
|
|
monitor_result_dlq: monitor.result.ingest.dlq
|
|
monitor_result_dlq_routing_key: monitor.result.ingest.dlq
|
|
monitor_projection_exchange: monitor.projection
|
|
monitor_projection_routing_key: monitor.projection.rebuild
|
|
monitor_projection_queue: monitor.projection.rebuild
|
|
monitor_projection_dlx: monitor.projection.dlx
|
|
monitor_projection_dlq: monitor.projection.rebuild.dlq
|
|
monitor_projection_dlq_routing_key: monitor.projection.rebuild.dlq
|
|
generation_exchange: generation.task
|
|
generation_routing_key: generation.task.run
|
|
generation_queue: generation.task.run
|
|
generation_dlx: generation.task.dlx
|
|
generation_dlq: generation.task.run.dlq
|
|
generation_dlq_routing_key: generation.task.run.dlq
|
|
generation_event_exchange: generation.event
|
|
desktop_task_event_exchange: desktop.task.event
|
|
desktop_dispatch_exchange: desktop.task.dispatch
|
|
desktop_dispatch_publish_prefix: publish
|
|
desktop_dispatch_monitor_prefix: monitor
|
|
desktop_account_health_exchange: desktop.account.health
|
|
desktop_account_health_routing_key: desktop.account.health.report
|
|
desktop_account_health_queue: desktop.account.health.report
|
|
desktop_account_health_dlx: desktop.account.health.dlx
|
|
desktop_account_health_dlq: desktop.account.health.report.dlq
|
|
desktop_account_health_dlq_routing_key: desktop.account.health.report.dlq
|
|
template_assist_exchange: template.assist
|
|
template_assist_routing_key: template.assist.run
|
|
template_assist_queue: template.assist.run
|
|
template_assist_dlx: template.assist.dlx
|
|
template_assist_dlq: template.assist.run.dlq
|
|
template_assist_dlq_routing_key: template.assist.run.dlq
|
|
kol_assist_exchange: kol.assist
|
|
kol_assist_routing_key: kol.assist.run
|
|
kol_assist_queue: kol.assist.run
|
|
kol_assist_dlx: kol.assist.dlx
|
|
kol_assist_dlq: kol.assist.run.dlq
|
|
kol_assist_dlq_routing_key: kol.assist.run.dlq
|
|
compliance_review_exchange: compliance.review
|
|
compliance_review_routing_key: compliance.review.run
|
|
compliance_review_queue: compliance.review.run
|
|
compliance_review_dlx: compliance.review.dlx
|
|
compliance_review_dlq: compliance.review.run.dlq
|
|
compliance_review_dlq_routing_key: compliance.review.run.dlq
|
|
consumer_prefetch: 10
|
|
publish_channel_pool_size: 32
|
|
|
|
scheduler:
|
|
http_host: 127.0.0.1
|
|
http_port: 8081
|
|
internal_metrics_token: dev_scheduler_metrics_token
|
|
dispatch_interval: 15s
|
|
dispatch_timeout: 30s
|
|
dispatch_batch_size: 100
|
|
dispatch_concurrency: 4
|
|
generation_queue_backpressure_limit: 1000
|
|
|
|
monitoring_workers:
|
|
result_ingest_concurrency: 4
|
|
projection_rebuild_concurrency: 2
|
|
|
|
monitoring_dispatch:
|
|
desktop_tasks_rollout_percentage: 5
|
|
|
|
membership:
|
|
default_plan_code: free
|
|
plans:
|
|
- code: free
|
|
name: Free
|
|
article_generation: 3
|
|
article_quota_cycle: lifetime
|
|
ai_points_monthly: 0
|
|
ai_point_base_chars: 1000
|
|
image_storage_bytes: 10485760
|
|
company_limit: 1
|
|
subscription_duration: 72h
|
|
contact_admin_on_expiry: true
|
|
- code: plus
|
|
name: Plus
|
|
article_generation: 200
|
|
article_quota_cycle: monthly
|
|
ai_points_monthly: 1000
|
|
ai_point_base_chars: 1000
|
|
image_storage_bytes: 26214000
|
|
company_limit: 1
|
|
subscription_duration: 720h
|
|
- code: pro
|
|
name: Pro
|
|
article_generation: 400
|
|
article_quota_cycle: monthly
|
|
ai_points_monthly: 1500
|
|
ai_point_base_chars: 1000
|
|
image_storage_bytes: 524288000
|
|
company_limit: 2
|
|
subscription_duration: 720h
|
|
|
|
brand_library:
|
|
free_brand_limit: 1
|
|
paid_brand_limit: 2
|
|
question_limits_by_plan:
|
|
default: 25
|
|
free: 5
|
|
plus: 25
|
|
pro: 50
|
|
max_keywords: 5
|
|
max_questions_per_keyword: 5
|
|
|
|
redis:
|
|
addr: redis:6379
|
|
db: 0
|
|
|
|
qdrant:
|
|
url: qdrant:6334
|
|
api_key: ""
|
|
collection: geo_knowledge_chunks
|
|
timeout: 15s
|
|
|
|
object_storage:
|
|
provider: minio
|
|
endpoint: minio:9000
|
|
bucket: geo-private
|
|
use_ssl: false
|
|
public_base_url: ""
|
|
region: ""
|
|
force_path_style: false
|
|
|
|
cache:
|
|
driver: redis
|
|
|
|
jwt:
|
|
# Override via JWT_SECRET env var in .env
|
|
secret: "change-me-in-production"
|
|
access_ttl: 15m
|
|
refresh_ttl: 720h
|
|
|
|
auth:
|
|
password_cipher:
|
|
# 生产多实例请在 config.local.yaml 中配置同一把 private_key_pem。
|
|
enabled: true
|
|
key_id: login-password-rsa-oaep-v1
|
|
private_key_pem: "-----BEGIN PRIVATE KEY-----
|
|
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCpXOkG9M0Lumc9
|
|
48gk2Besn1h+86XQ6+Dvzn7njspGPsmxnn4bQ6L3ZYJODcr8rAq6tkRJgIbT+7T6
|
|
YDGvH7RPmHleOTwm9pCGWy9VcffASt/BcXZ6Kghc6sqEdtn+nIGXj9CEs9AcOPQL
|
|
tFXy1iAMoTx+g7sOUDDvXqQtYpTpLK3BEPVW83nGDwkaGJ59yE/sNBYCfprmW0+7
|
|
AgCWPddWYAHgyjcUBdfCLNenxlmxOpdrW1eg8i30WJH/YeSIGa4QfO3kxtxYbuVv
|
|
xQr8tEEQfKzidE0HS4sYH5n7auLgSfhcPHJTvyIL0U/1DIeVsQsCfjYsS5dJW9Rd
|
|
IwnsBZL5AgMBAAECggEABH4g9lzHFbEPrQ4eUI/k7ODbPZ7j/qtLL8FYD3dzuTJQ
|
|
MmSEbt+38n0gXEa0ZEiCDlroa9S7fuMV9XBY0Q7zvwrJ6Wx2QohW5CGGG2unCVRT
|
|
JDQI0wvLZf+aeLIYbU8khus7OlH0ytLd8nOJtiPk/MDINIj1DNemvKrTixqq3ZaV
|
|
PKpgjytzlCDtF3bwylyNP78bepsBvqJruUpqf2c993Um6HkdPj6ho9ssmEtbdK5A
|
|
w9yC55jUGJ51nQe6zwAZBNz6rLaBpHqY8EhDOuCrW63q6wxQq8Wd+SY4fDbQeK6n
|
|
mKrPz7mKWYtV0J3lEDmbGBftQa8hBg69ze7v+UmPAwKBgQDjEkA69vVRApyKR1eG
|
|
ujy4YH/AW2+Mo0baP3m8K6QGSPpHmDk7fH2OSq5xebjW0QA4a25cZmaHYGkPwjU+
|
|
8728Q9ppnVHW+Ra6t+wibw4MNCrH/i7FwTbDTbdtN8q6MZDexDgy3cV+xYRTJ9Op
|
|
tLR+ax7nR3iq1BZ8bJo2HYGxnwKBgQC+8IwTKW8Q5Ykj1jXA6dq5cZaOYy1WncN9
|
|
jOM6NXsPT6TYc7VSkNnPBwT+9bxDn/6q9zJyHq4nNiCCiPWZB3OTamrGlqcbwdJT
|
|
YLegmXG/49zjDloJuji/bn4FrZEvdOhTyP3rTNby2kNc9xW4Yp5CkS9AhTMfhwyr
|
|
2SjCGmtkZwKBgQCq+8I75FwjLSk9Aq2IuNIiMB/ic7eSmhwvGV8Mb3wqc2dq49gs
|
|
z/gnXlru/a5Oq8BTu6m1kDIiPFnAUQgRKC62Bg4AO0M18gjIftgjsaZNUDbqs576
|
|
sBwRgoLdjgZsoAgrhmue+dnONOMITtQWVQkYrIbvtqTJVby84nZYy20ulwKBgFRg
|
|
dnYNTFB6LqVQhwaOESL76B1aBHIPW5FCzjMt6Qi2GFGyqEEpU6ciIfoNW7nCnUat
|
|
4HP/zNP1Hl6w6V9LpK5TS4Ygkw44E5rW1a65wEOdDUKlV/KOgX9O84/MyKjhD73e
|
|
xx7RIPfGrhgJ9GY75lXiVLA9bH8VLetPFqzYAfcnAoGAUZuAlANpJ8/Y/LzwU5lo
|
|
6+ROeRtHvyGrheVRo8k2dyR0X/ghmxfBxCJLKxYKKS7BrrJfpJEuZsczhTec8hYM
|
|
WcBt+4TgngS9auYaRfQDuR8UjS9w+OivWohg44LF7qoChVuhU1Je2r68MTlNEALC
|
|
VhDbVsNlp4yUY8uLDAK+rug=
|
|
-----END PRIVATE KEY-----"
|
|
|
|
log:
|
|
level: info,warn,error
|
|
format: json
|
|
|
|
llm:
|
|
provider: ark
|
|
base_url: https://ark.cn-beijing.volces.com/api/v3
|
|
api_key: "7fb6c66b-129c-4935-9617-709236c4205a"
|
|
model: doubao-seed-2-0-pro-260215 # doubao-seed-2-0-lite-260215 #
|
|
knowledge_url_model: doubao-seed-2-0-mini-260215 #doubao-seed-2-0-mini-260215
|
|
timeout: 2m
|
|
max_output_tokens: 16000
|
|
temperature: 0.7
|
|
reasoning_effort: minimal
|
|
web_search_limit: 3
|
|
|
|
compliance:
|
|
enabled: true
|
|
llm_judge_enabled: false
|
|
snapshot_reload_interval: 30s
|
|
publish_gate_timeout: 800ms
|
|
review_worker_concurrency: 1
|
|
review_worker_timeout: 45s
|
|
review_max_attempts: 3
|
|
|
|
retrieval:
|
|
provider: siliconflow
|
|
base_url: https://api.siliconflow.cn/v1
|
|
api_key: "sk-dikvcafrdcbajjpfgjjephqcggpdxwxdkighllieijlehwsf"
|
|
embedding_model: BAAI/bge-m3
|
|
reranker_model: BAAI/bge-reranker-v2-m3
|
|
timeout: 30s
|
|
chunk_size: 900
|
|
chunk_overlap: 120
|
|
embedding_batch_size: 16
|
|
recall_limit: 12
|
|
rerank_top_n: 6
|
|
max_chunks_per_doc: 6
|
|
overlap_tokens: 60
|
|
|
|
generation:
|
|
queue_size: 128
|
|
worker_concurrency: 8
|
|
stream_enabled: false
|
|
article_timeout: 8m
|
|
task_lease_ttl: 10m
|
|
task_recovery_interval: 1m
|
|
task_recovery_timeout: 30s
|
|
task_recovery_batch_size: 100
|
|
task_queued_stale_after: 2m
|
|
task_max_attempts: 3
|
|
|
|
browser_fetch:
|
|
enabled: true
|
|
provider: lightpanda
|
|
service_url: http://browser-fetch:8082
|
|
queue_size: 64
|
|
worker_concurrency: 2
|
|
request_timeout: 45s
|
|
cache_ttl: 6h
|
|
allowed_domains:
|
|
- zhuanlan.zhihu.com
|
|
- zhihu.com
|
|
- baidu.com
|
|
trigger_status:
|
|
- 403
|
|
- 429
|
|
- 500
|
|
- 502
|
|
- 503
|
|
- 504
|