9d6181260a
Desktop Client Build / Resolve Build Metadata (push) Successful in 43s
Frontend CI / Frontend (push) Successful in 3m49s
Backend CI / Backend (push) Failing after 7m10s
Desktop Client Build / Build Desktop Client (push) Successful in 23m4s
Desktop Client Build / Publish Client Artifacts to NAS (push) Successful in 28s
Introduce an end-to-end media-supply feature: tenant-side resource sync service/worker backed by a Meijiequan supplier client, ops-side management APIs, and admin/ops web views for resources, orders, favorites and submission. Adds a shared digitocr helper, MediaSupply config blocks for tenant and ops, shared types, and migrations for supplier media resources, price overrides, customer visibility and order refunds. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
290 lines
7.6 KiB
Plaintext
290 lines
7.6 KiB
Plaintext
# Copy this file to config.local.yaml and adjust values for your local environment.
|
||
# config.local.yaml is gitignored.
|
||
|
||
server:
|
||
port: 8080
|
||
mode: debug
|
||
# Production should restrict this to real frontend origins.
|
||
# Empty keeps local development CORS permissive.
|
||
allowed_origins: []
|
||
security_headers:
|
||
enabled: true
|
||
trusted_proxies:
|
||
- 127.0.0.1
|
||
- ::1
|
||
- 10.42.0.0/16
|
||
- 10.43.0.0/16
|
||
- 172.16.0.0/12
|
||
|
||
database:
|
||
host: localhost
|
||
port: 5432
|
||
user: geo
|
||
password: geo_dev
|
||
dbname: geo
|
||
sslmode: disable
|
||
max_open_conns: 12
|
||
max_idle_conns: 3
|
||
|
||
monitoring_database:
|
||
host: localhost
|
||
port: 5433
|
||
user: geo
|
||
password: geo_dev
|
||
dbname: geo_monitoring
|
||
sslmode: disable
|
||
max_open_conns: 8
|
||
max_idle_conns: 2
|
||
|
||
rabbitmq:
|
||
url: amqp://geo:geo_dev@localhost: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
|
||
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_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
|
||
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
|
||
# Prefer environment override when needed:
|
||
# export RABBITMQ_URL=amqp://geo:geo_dev@localhost:5672/geo
|
||
|
||
scheduler:
|
||
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
|
||
|
||
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: 0
|
||
ai_point_base_chars: 1000
|
||
image_storage_bytes: 524288000
|
||
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: 1073741824
|
||
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: localhost:6379
|
||
|
||
qdrant:
|
||
url: localhost:6334
|
||
collection: geo_knowledge_chunks
|
||
timeout: 15s
|
||
|
||
object_storage:
|
||
provider: minio
|
||
endpoint: localhost:9000
|
||
bucket: geo-private
|
||
use_ssl: false
|
||
public_base_url: ""
|
||
region: ""
|
||
force_path_style: false
|
||
# Prefer environment override for secrets:
|
||
# export OBJECT_STORAGE_ACCESS_KEY=minioadmin
|
||
# export OBJECT_STORAGE_SECRET_KEY=minioadmin
|
||
# MinIO example:
|
||
# provider: minio
|
||
# endpoint: localhost:9000
|
||
# bucket: geo-private
|
||
# use_ssl: false
|
||
# force_path_style: true
|
||
#
|
||
# Cloudflare R2 / S3-compatible example:
|
||
# provider: r2
|
||
# endpoint: <account-id>.r2.cloudflarestorage.com
|
||
# bucket: your-bucket
|
||
# region: auto
|
||
# use_ssl: true
|
||
# force_path_style: true
|
||
#
|
||
# Aliyun OSS example:
|
||
# provider: aliyun
|
||
# endpoint: https://oss-cn-hangzhou.aliyuncs.com
|
||
# bucket: your-bucket
|
||
# region: cn-hangzhou
|
||
# use_ssl: true
|
||
# public_base_url: https://your-bucket.oss-cn-hangzhou.aliyuncs.com
|
||
# export OBJECT_STORAGE_ACCESS_KEY=your-access-key
|
||
# export OBJECT_STORAGE_SECRET_KEY=your-secret-key
|
||
|
||
jwt:
|
||
secret: "your-local-secret"
|
||
access_ttl: 15m
|
||
refresh_ttl: 720h
|
||
|
||
auth:
|
||
login_guard:
|
||
enabled: true
|
||
password_cipher:
|
||
# Empty private_key_pem generates a per-process key. Production multi-instance deployments
|
||
# should inject the same private key through AUTH_PASSWORD_CIPHER_PRIVATE_KEY_PEM.
|
||
enabled: true
|
||
key_id: login-password-rsa-oaep-v1
|
||
private_key_pem: ""
|
||
|
||
llm:
|
||
provider: ark
|
||
base_url: https://ark.cn-beijing.volces.com/api/v3
|
||
model: doubao-seed-2-0-lite-260215
|
||
knowledge_url_model: doubao-seed-2-0-mini-260215
|
||
timeout: 2m
|
||
max_output_tokens: 4000
|
||
temperature: 0.7
|
||
reasoning_effort: minimal
|
||
web_search_limit: 3
|
||
# top_p: 0.95
|
||
# Prefer environment override for secrets:
|
||
# export LLM_API_KEY=your-api-key
|
||
|
||
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
|
||
# Emergency deployment kill switch:
|
||
# export COMPLIANCE_ENABLED=false
|
||
|
||
retrieval:
|
||
provider: siliconflow
|
||
base_url: https://api.siliconflow.cn/v1
|
||
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
|
||
# Prefer environment override for retrieval api key:
|
||
# export SILICONFLOW_API_KEY=your-siliconflow-api-key
|
||
# or export RETRIEVAL_API_KEY=your-retrieval-api-key
|
||
|
||
generation:
|
||
queue_size: 128
|
||
worker_concurrency: 8
|
||
stream_enabled: false
|
||
article_timeout: 8m
|
||
|
||
browser_fetch:
|
||
enabled: false
|
||
provider: lightpanda
|
||
service_url: http://localhost:8082
|
||
token: dev-browser-fetch-token
|
||
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
|
||
|
||
media_supply:
|
||
enabled: true
|
||
default_markup_percent: 50
|
||
minimum_markup_cents: 0
|
||
worker:
|
||
enabled: true
|
||
poll_interval: 5s
|
||
batch_size: 1
|
||
order_max_attempts: 3
|
||
sync_max_attempts: 2
|
||
backlink_sync_interval: 10m
|
||
backlink_batch_size: 20
|
||
meijiequan:
|
||
base_url: http://www.meijiequan.com
|
||
# 建议用环境变量注入,或放到未入库的 configs/config.local.yaml:
|
||
# export MEIJIEQUAN_USER_ID=962
|
||
# export MEIJIEQUAN_USERNAME=your-phone
|
||
# export MEIJIEQUAN_PASSWORD=your-password
|
||
user_id: ""
|
||
username: ""
|
||
password: ""
|
||
session_ttl: 4h
|
||
request_timeout: 30s
|
||
sync_page_delay: 800ms
|
||
sync_page_size: 100
|
||
max_sync_pages: 200
|
||
published_page_size: 20
|
||
published_max_pages: 3
|
||
search_options_ttl: 12h
|
||
upstream_lock_ttl: 2m
|
||
upstream_min_interval: 800ms
|