Open-Meteo 1.7.0 配置参数详解

Open-Meteo 1.7.0 全量配置解析:env 文件/systemd 单元/命令行三载体、40 余个环境变量逐项语义与源码默认值,DATA_DIRECTORY 与 REMOTE_DATA_DIRECTORY 源码级校验、LOCATIONS_LIMIT 生效条件、CACHE_SIZE 预分配机制均实测验证,附三类生产配置模板与排障 FAQ。

Open-MeteoOpen-Meteo气象Ubuntu22.04Ubuntu24.042026/10/28

Open-Meteo 1.7.0 配置参数详解

目标:把 Open-Meteo 1.7.0 的全部运行期配置讲透——三个参数载体(/etc/default/openmeteo-api.env 环境变量文件、systemd 单元、serve/sync 命令行参数)、40 余个环境变量的语义/默认值/取值格式,以及对部署最关键的 4 类参数逐一实测验证(含两处源码级 fatalError 校验与 LOCATIONS_LIMIT 生效条件)。本文在 Ubuntu 22.04.5(官方 APT 包形态)与 Ubuntu 24.04.5(源码编译形态)两台服务器上实测,全部回显取自真实环境。

一、环境信息

项目服务器 A(APT 包形态)服务器 B(源码编译形态)
操作系统Ubuntu 22.04.5 LTS (jammy)Ubuntu 24.04.5 LTS (noble)
内核x86_64,6 核 / 18 GB 内存x86_64,6 核 / 18 GB 内存
软件版本openmeteo-api 1.7.0(官方 APT 包)openmeteo-api 1.7.0(源码编译)
版本自检sha=92e8d2f9918d73a3a03e0dbba5baead8ee60fd35 branch=unknown tag=1.7.0同左
安装路径/usr/local/bin/openmeteo-api/opt/open-meteo/bin/openmeteo-api
数据目录/var/lib/openmeteo-api/data/opt/open-meteo/data
参数文件/etc/default/openmeteo-api.envsystemd 单元内 Environment=
服务单元openmeteo-api.service / openmeteo-sync.service(包内置)openmeteo-api.service(自建)
服务端口8080(0.0.0.0)8080(0.0.0.0)
运行模式远程缓存模式(REMOTE_DATA_DIRECTORY 指向官方 S3)同左
查询日期2026-10-282026-10-28

二、前置条件

  • 已按《Open-Meteo 1.7.0 安装部署指南》完成部署,服务处于 active 状态(systemctl is-active openmeteo-api 返回 active)。
  • 理解 Open-Meteo 的三组件架构与远程缓存模式概念,见《Open-Meteo 介绍与选型指南》。
  • Open-Meteo 没有单一「配置文件」:全部配置通过环境变量注入,命令行 flags 只覆盖少量启动项。因此本文的「参数」一律指环境变量。
  • 参数语义均对照 1.7.0 源码(Sources/App/configure.swift 等)核实,非猜测;每个关键参数给出源码默认值。

三、参数查看与修改方式

3.1 载体一:/etc/default/openmeteo-api.env(官方 APT 包参数文件)

APT 包安装后自带参数模板文件,由 openmeteo-api.service 的 EnvironmentFile= 读取(全文实测回显):

cat /etc/default/openmeteo-api.env
# API service configuration
VAPOR_ENV=production
LOG_LEVEL=info
API_BIND="0.0.0.0:8080"
API_APIKEYS_PATH=
API_SYNC_APIKEYS=

# Email address to send failure notifications to
# NOTIFICATION_EMAIL=

# Sync client configuration
SYNC_ENABLED=true
SYNC_APIKEY=
SYNC_SERVER=
SYNC_DOMAINS=dwd_icon
SYNC_VARIABLES=temperature_2m
SYNC_PAST_DAYS=1
SYNC_CONCURRENT=1
SYNC_REPEAT_INTERVAL=10

# Fetch data from a remote S3 bucket and cache it locally.
REMOTE_DATA_DIRECTORY=https://openmeteo.s3.amazonaws.com/data/
CACHE_SIZE=8GB
# Only allow access to pressure level data via the atomic block cache
# REMOTE_PRESSURE_LEVELS_ONLY=false
  • 该文件每行一个 KEY=VALUE,# 为注释;等号两侧不加引号也可(API_BIND="0.0.0.0:8080" 的引号由 systemd 解析)。
  • 源码编译部署没有这个文件,等价做法是在自建 systemd 单元里用 Environment=KEY=VALUE 逐行注入(见《安装部署指南》5.7),语义完全一致。

3.2 载体二:systemd 单元

两个内置单元的完整定义(systemctl cat 去注释行):

systemctl cat openmeteo-api.service
[Unit]
Description = Run Open-Meteo API
StartLimitIntervalSec=0

[Service]
EnvironmentFile=/etc/default/openmeteo-api.env
PassEnvironment=VAPOR_ENV API_SYNC_APIKEYS LOG_LEVEL CACHE_FILE CACHE_SIZE BLOCK_SIZE CACHE_META_FILE CACHE_META_SIZE REMOTE_DATA_DIRECTORY SWIFT_BACKTRACE REMOTE_DATA_DIRECTORY_MINIMUM_AGE STRIPE_API_KEY
Type=simple
User=openmeteo-api
Group=openmeteo-api
Slice=openmeteo.slice
OOMPolicy=kill
WorkingDirectory=/var/lib/openmeteo-api/
ExecStart=/usr/local/bin/openmeteo-api serve -b $API_BIND --env $VAPOR_ENV
ExecStopPost=/bin/bash -c 'if [ "$$EXIT_STATUS" != 0 ]; then /usr/local/bin/openmeteo-notify.sh $NOTIFICATION_EMAIL %N; fi'
Restart=always
RestartSec=1
LimitNOFILE=infinity

[Install]
WantedBy = default.target
systemctl cat openmeteo-sync.service
[Unit]
Description = Run Open-Meteo sync client
StartLimitIntervalSec=0

[Service]
EnvironmentFile=/etc/default/openmeteo-api.env
PassEnvironment=VAPOR_ENV SWIFT_BACKTRACE
Type=simple
User=openmeteo-api
Group=openmeteo-api
WorkingDirectory=/var/lib/openmeteo-api/
ExecStart=/bin/sh -c "LOG_LEVEL=info /usr/local/bin/openmeteo-api sync $$SYNC_DOMAINS $$SYNC_VARIABLES $${SYNC_APIKEY:+--apikey $$SYNC_APIKEY} $${SYNC_PAST_DAYS:+--past-days $$SYNC_PAST_DAYS} $${SYNC_SERVER:+--server $$SYNC_SERVER} $${SYNC_REPEAT_INTERVAL:+--repeat-interval $$SYNC_REPEAT_INTERVAL} $${SYNC_CONCURRENT:+--concurrent $$SYNC_CONCURRENT} $${SYNC_CONCURRENT_MODELS:+--concurrent-models $$SYNC_CONCURRENT_MODELS} $${SYNC_DATA_DIRECTORY_MAX_SIZE_GB:+--data-directory-max-size-gb $$SYNC_DATA_DIRECTORY_MAX_SIZE_GB} --execute"
ExecStopPost=/bin/bash -c 'if [[ "$$EXIT_STATUS" != 0 && "$SYNC_ENABLED" = "true" ]]; then /usr/local/bin/openmeteo-notify.sh $NOTIFICATION_EMAIL %N; fi'
Restart=always
RestartSec=10
LimitNOFILE=infinity
ExecCondition=/bin/test "$SYNC_ENABLED" = "true"
MemoryMax=500M

[Install]
WantedBy = default.target

三个值得注意的单元细节:

  • EnvironmentFile 导入的变量全量注入进程环境,PassEnvironment= 行并不构成白名单——它的作用是把 systemd 管理器全局环境(systemctl set-environment 设置)中的同名变量也传给服务。因此向 env 文件追加任何新变量(如 LOCATIONS_LIMIT=2)重启后即生效,实测见 5.4。
  • openmeteo-sync 用 ExecCondition 检查 SYNC_ENABLED:false 时服务标记为 skipped 而非失败;MemoryMax=500M 为同步进程单独限内存。
  • ExecStopPost 在服务异常退出(非 0)时调用 openmeteo-notify.sh 发邮件,收件人取 NOTIFICATION_EMAIL(未设置则不发)。

3.3 载体三:serve / sync 命令行参数

openmeteo-api serve --help
Usage: /opt/open-meteo/bin/openmeteo-api serve [--hostname,-H] [--port,-p] [--bind,-b] [--unix-socket] 

Begins serving the app over HTTP.

Options:
     hostname Set the hostname the server will run on.
         port Set the port the server will run on.
         bind Convenience for setting hostname and port together.
  unix-socket Set the path for the unix domain socket file the server will bind to.
  • -b/--bind 是 -H/--hostname + -p/--port 的合写,官方单元用 -b $API_BIND,官方 Dockerfile 用 --hostname 0.0.0.0 --port 8080,二者等价。
  • --env production 指定 Vapor 运行环境(等价环境变量 VAPOR_ENV);--unix-socket 可走 Unix 套接字配合前置 Nginx。
  • sync 子命令的 flags(--apikey/--server/--repeat-interval/--past-days/--concurrent/--concurrent-models/--data-directory-max-size-gb/--execute)见 5.5,完整命令详解见《Open-Meteo 1.7.0 常用 CLI 命令与工具详解》。

3.4 修改生效方式与惰性初始化

改任何环境变量的生效方式都是重启对应服务:

systemctl restart openmeteo-api   # API 服务参数
systemctl restart openmeteo-sync  # 同步参数

⚠️ 注意:Open-Meteo 的配置在源码里多为 static let 惰性初始化——变量在首次被访问时才读取和校验。因此两类现象要提前有预期:一是配置错误(如路径格式非法)不在启动时报错,而在第一个触发该配置的请求上以 fatalError 崩溃(systemd Restart=always 会立即拉起,表现为「服务一直 active 但首个请求必崩」,见 FAQ Q2/Q3 的实测);二是改完 CACHE_SIZE 后 cache.bin 尺寸在重启后、首个请求时才变化。

四、参数总览

按作用域归类(serve = API 服务进程读取;sync = 同步进程/同步 flags;源码列 = 1.7.0 configure.swift 实测默认值):

环境变量默认值作用域作用
VAPOR_ENVdevelopmentserveVapor 运行环境(生产必须 production)
API_BIND无(必须由单元传入)serve监听地址:端口,如 0.0.0.0:8080
LOG_LEVELinfoserve/sync日志级别(debug/info/notice/warning/error/critical)
MAX_BODY_SIZEVapor 默认 16KBserve请求体大小上限(POST 网格点查询需调大)
DATA_DIRECTORY./data/serve/sync本地数据目录,必须以斜杠结尾
REMOTE_DATA_DIRECTORY无(不启用)serve远程 S3 数据源,必须以 /data/ 结尾,逗号分隔多源
CACHE_SIZE10GBserve数据块缓存 cache.bin 容量
CACHE_FILE<DATA_DIRECTORY>/cache.binserve缓存文件路径
BLOCK_SIZE64KBserve缓存块粒度
REMOTE_DATA_DIRECTORY_MINIMUM_AGE无(不限制)serve仅拉取早于该秒数的远程数据
REMOTE_PRESSURE_LEVELS_ONLYfalseserve气压层数据仅走块缓存
DATA_SPATIAL_DIRECTORY无(不启用)serve静态空间数据(高程等)目录
DATA_RUN_DIRECTORY无(不启用)下载命令按模式起报时次存放原始下载文件
TEMP_DIRECTORY<DATA_DIRECTORY>下载命令下载临时目录
GENERATE_PREVIOUS_DAYtrueserve是否生成 previous day 数据库
LOCATIONS_LIMIT1000serve单请求坐标点上限(仅 open-meteo.com 域名请求生效)
CALL_LIMIT_DAILY/HOURLY/MINUTELY10000/5000/600serve免费 API 节点按 IP 的日/时/分调用限额
CONCURRENCY_LIMIT / _HARD / _TOTAL1 / 5 / 4096serve单 IP 并发/硬并发/全机总并发
IP_ALLOWLIST_PATH无serveIP 白名单文件路径
API_APIKEYS_PATH无serve商业 API key 文件路径
API_SYNC_APIKEYS空serve允许拉取本机数据的 sync apikey 列表(逗号分隔)
SYNC_ENABLEDfalsesync是否启用 openmeteo-sync 服务(ExecCondition 门控)
SYNC_DOMAINS无sync同步的气象模式,逗号分隔(如 dwd_icon)
SYNC_VARIABLES无sync同步的变量,逗号分隔
SYNC_PAST_DAYS0sync同步过去 N 天数据
SYNC_CONCURRENT1sync单模式内并发下载数
SYNC_CONCURRENT_MODELS1sync并发下载的模式数
SYNC_REPEAT_INTERVAL0(单次)sync重复执行间隔(分钟)
SYNC_SERVER无(官方 S3)sync拉取数据的对端服务器
SYNC_APIKEY无sync对端服务器 apikey
SYNC_DATA_DIRECTORY_MAX_SIZE_GB无sync数据目录容量上限(GB),超出自动清理
NOTIFICATION_EMAIL无serve/sync失败通知邮箱
SWIFT_BACKTRACE无serve/syncSwift 运行时崩溃回溯开关
HTTP_CACHE无下载命令原始数据 HTTP 下载缓存开关
S3_CREDENTIALS_<BUCKET>无下载命令自定义 S3 桶凭证(按桶名拼接)
GOOGLE_APPLICATION_CREDENTIALS无下载命令Google Cloud 凭证文件路径
KNMI_API_KEY / METEOFRANCE_API_KEY无下载命令KNMI/Météo-France 官方下载凭证
STRIPE_API_KEY无serve商业计费(Stripe)密钥,自托管用不到

五、核心参数分类详解

5.1 服务监听与运行环境

VAPOR_ENV——Vapor 框架运行环境,官方单元以 --env $VAPOR_ENV 传入。取值 production / development。生产必须 production:development 下错误响应会暴露内部堆栈细节,且日志冗余量大。官方 env 模板默认 VAPOR_ENV=production。

API_BIND——监听地址与端口,唯一在单元 ExecStart 里以命令行形式传入的参数(serve -b $API_BIND)。格式 地址:端口;0.0.0.0:8080 表示全网卡监听。改端口即改此值(如 API_BIND="0.0.0.0:8147"),改完 systemctl restart openmeteo-api 生效,ss -lntp | grep 8080 可核对。

LOG_LEVEL——日志级别,取值 debug/info/notice/warning/error/critical。默认 info:服务启动会打 [ NOTICE ] Server started on http://0.0.0.0:8080,每个请求打一条 [ INFO ] GET /v1/forecast [request-id: …](journalctl 实测回显见《安装部署指南》5.8)。排障时临时调 debug,观察后调回 info,避免日志刷盘压力。

MAX_BODY_SIZE——请求体上限(字节,如 1048576)。GET 查询不受影响;用 POST 方式批量提交坐标时,默认 16KB 会直接 413,按坐标量调大。仅在自建单元中以 Environment= 注入(env 文件同样可写)。

5.2 数据目录与存储布局

DATA_DIRECTORY——核心参数,本地数据目录(omfile 时序数据库、cache.bin 的根),默认 ./data/(相对进程工作目录)。两条硬性源码校验,实测复现:

DATA_DIRECTORY=/opt/open-meteo/data /opt/open-meteo/bin/openmeteo-api serve -b 127.0.0.1:18081 &
# 服务正常启动,首个请求触发校验:
curl "http://127.0.0.1:18081/v1/elevation?latitude=39.9&longitude=116.4"
App/configure.swift:14: Fatal error: DATA_DIRECTORY must end with a trailing slash

进程以 SIGILL 自陷退出(wait 捕获 exit=132,systemd 视角即 openmeteo-api.service: Main process exited, code=dumped, status=4/ILL)。目录必须以 / 结尾:写 /opt/open-meteo/data 会崩,必须写 /opt/open-meteo/data/。

💡 说明:目录不存在时不会自动创建,首请求同样崩溃(Fatal error: cannotOpenFile(name: "./data/"),排障过程见《安装部署指南》4.4 与 FAQ);部署后先 mkdir -p <目录>/data && chown 再启动。

DATA_SPATIAL_DIRECTORY——静态空间数据(全球高程 DEM 等)的独立目录,未设置时高程数据走主数据目录/远程缓存。设了它可以把「变动频繁的预报数据」和「基本不变的静态数据」分盘存放。

DATA_RUN_DIRECTORY——供 download-* 下载命令按「模式起报时次」存放原始下载文件的目录(grb2/grib 等中间产物),自托管 API 用不到,跑数据流水线时才需要。

TEMP_DIRECTORY——下载命令的临时目录,默认等于 DATA_DIRECTORY。建议在大盘上显式指定,避免与数据目录争 IO。

GENERATE_PREVIOUS_DAY——默认 true,每日生成 previous day 数据库(支撑 past_days= 查询的上一日部分)。设 false 可省一次日构建,代价是 previous days 数据不可用。

5.3 远程缓存与数据块缓存

这一组决定「自托管最轻形态」:不下载全量数据,请求时按需从远程 S3 拉数据分块并缓存在本地。

REMOTE_DATA_DIRECTORY——远程数据源根地址,设置后即启用远程缓存模式。两条硬性源码校验(实测):

REMOTE_DATA_DIRECTORY=https://openmeteo.s3.amazonaws.com/foo/ openmeteo-api serve ...
# 首个请求触发:
App/configure.swift:31: Fatal error: REMOTE_DATA_DIRECTORY must end with '/data/'
  • 必须以 /data/ 结尾(官方开放数据桶即 https://openmeteo.s3.amazonaws.com/data/);
  • 多源负载均衡:逗号分隔多个地址,请求会在多源间哈希分流(官方自托管文档明确支持);
  • 远程缓存模式与本地模式二选一:设置了 REMOTE_DATA_DIRECTORY 就不需要全量下载数据。

CACHE_SIZE——数据块缓存 cache.bin 的容量,默认 10GB。cache.bin 是启动后首个请求时一次性预分配的定长文件(mmap),两台服务器实测:

ls -la /opt/open-meteo/data/   # CACHE_SIZE=4GB 的源码编译机
-rw-r--r-- 1 openmeteo openmeteo 4294967040 Oct 28 15:01 cache.bin
ls -lh /var/lib/openmeteo-api/data/   # CACHE_SIZE=8GB 的 APT 包机
-rw-r--r-- 1 openmeteo-api openmeteo-api 8.0G Oct 28 14:36 cache.bin

💡 说明:cache.bin 走 mmap,占磁盘、不常驻内存;物理内存占用由操作系统页缓存按热数据自动淘汰。容量越大热缓存命中率越高(实测:同坐标首调 42.6 秒,热缓存复测 8 毫秒),磁盘富余就按 8-16GB 配。

CACHE_FILE——缓存文件路径,默认 <DATA_DIRECTORY>/cache.bin。想把缓存放到更快的盘(如 NVMe)而数据在机械盘时单独指定。

BLOCK_SIZE——缓存块粒度,默认 64KB。S3 上单个 om 分块文件按 64KB 切块缓存,调小可降低边缘请求浪费、调大减少元数据开销,无特殊瓶颈用默认值。

REMOTE_DATA_DIRECTORY_MINIMUM_AGE——秒数。设置后只拉取「数据时间早于该秒数」的远程数据,避免反复拉取还在滚动更新的最新时次,适合多级缓存架构中的上游节点。

REMOTE_PRESSURE_LEVELS_ONLY——true 时仅气压层数据强制走块缓存。气压层数据体量最大(多模式 × 多层 × 多时次),官方模板里以注释形式给出,公开镜像节点会打开。

⚠️ 注意:CACHE_META_FILE/CACHE_META_SIZE 虽出现在单元 PassEnvironment 列表,但 1.7.0 源码中对应实现(文件元数据缓存)整段被注释,当前版本设置无效;PassEnvironment 列表是为兼容后续版本保留的。

5.4 请求限制与访问控制

LOCATIONS_LIMIT——单次请求坐标点上限,默认 1000。⚠️ 关键生效条件:只对 Host 含 open-meteo.com 的请求生效(源码 ApiKeyManager.swift 对 localhost/自建域名路径传入 nil)。逐项验证实测(自建单元注入 LOCATIONS_LIMIT=2):

LOCATIONS_LIMIT=2 openmeteo-api serve -b 127.0.0.1:18083 &
# 带官方域名 Host 头请求 3 个坐标:
curl -H "Host: api.open-meteo.com" "http://127.0.0.1:18083/v1/forecast?latitude=39.9,48.85,52.52&longitude=116.4,2.35,13.41&current=temperature_2m&models=ecmwf_ifs025&forecast_days=1"
{"reason":"Only up to 2 locations can be requested at once","error":true}
# 边界内 2 个坐标,正常返回:
curl -H "Host: api.open-meteo.com" "http://127.0.0.1:18083/v1/forecast?latitude=39.9,48.85&longitude=116.4,2.35&..." 
# → 正常 JSON 数组
# 不带 Host 头(localhost 直连)请求 3 个坐标 → 不限流,正常返回

APT 包形态通过 env 文件注入同样生效(实测):向 /etc/default/openmeteo-api.env 追加 LOCATIONS_LIMIT=2 并重启后请求 3 坐标:

{"error":true,"reason":"Only up to 2 locations can be requested at once"}

即:自托管内网用 IP/自建域名直连时此参数不拦请求;若想限制使用方,用反向代理层实现或让客户端走 open-meteo.com 域名访问。

CALL_LIMIT_DAILY / CALL_LIMIT_HOURLY / CALL_LIMIT_MINUTELY——免费开放 API 的按 IP 调用限额,默认 10000 次/日、5000 次/时、600 次/分。同样只在 open-meteo.com 域名路径生效,自托管场景默认不启用。

CONCURRENCY_LIMIT / CONCURRENCY_LIMIT_HARD / CONCURRENCY_LIMIT_TOTAL——单 IP 并发 1、单 IP 硬并发 5、全机总并发 4096(默认)。防单 IP 打满服务线程池,同样仅在开放 API 路径生效。

IP_ALLOWLIST_PATH——IP 白名单文件路径(CIDR 逐行),设置后仅白名单 IP 可访问,适合把 API 直接暴露给固定使用方的场景。

API_APIKEYS_PATH——商业 API key 文件路径(每行 key:限额[:客户ID]),配合 customer- 前缀域名做按 key 计费与限额;自托管团队内网用不到,留空即可。

API_SYNC_APIKEYS——本机作为「数据分发服务端」时允许的 sync apikey 列表(逗号分隔)。设置后其他节点可用 openmeteo-api sync ... --apikey <key> --server https://本机/ 从本机拉数据(详见 5.5 与《安装部署指南》4.8)。

5.5 数据同步(openmeteo-sync 与 sync 命令)

sync 进程的 flags 全部由 env 文件的 SYNC_* 变量经单元模板拼装(见 3.2 的 ExecStart),一一对应:

SYNC_ENABLED——true 时 openmeteo-sync 服务真正执行(ExecCondition 门控),false 时服务 skipped。官方模板默认 true,且默认 SYNC_DOMAINS=dwd_icon、SYNC_VARIABLES=temperature_2m——装完包即使不配置,同步服务也会开始拉 dwd_icon 气温数据,不想要就设 false。

SYNC_DOMAINS / SYNC_VARIABLES——同步的气象模式与变量,逗号分隔(dwd_icon,dwd_icon_eu / temperature_2m,wind_speed_10m)。决定磁盘占用的一号参数:模式 × 变量越多,本地数据越大(实测单模式单变量 past_days=1 起步即数百 MB,官方全量数据为 TB 级)。

SYNC_PAST_DAYS——回补过去 N 天数据(默认模板 1)。与 API 的 past_days= 查询参数对应,想提供 7 天历史就设 7,磁盘相应增大。

SYNC_CONCURRENT / SYNC_CONCURRENT_MODELS——单模式内并发数与并发模式数。对端限速或机器 IO 弱时保持 1;提高可缩短单轮同步时间,实测对端 S3 直连约 90-150 KB/s 时并发提升有限,瓶颈在带宽。

SYNC_REPEAT_INTERVAL——分钟。设置后 sync 进程常驻并周期执行(默认模板 10 分钟一轮);0 为单次执行退出(systemd Restart=always + RestartSec=10 也会再拉起)。

SYNC_SERVER / SYNC_APIKEY——从自建数据分发服务器拉取时的对端地址与 apikey(对端需设置 API_SYNC_APIKEYS)。不设置时默认从官方开放数据 S3 拉取。多节点架构(下载节点 + API 节点)的完整配置见《安装部署指南》4.8 与官方 sync-command 文档。

SYNC_DATA_DIRECTORY_MAX_SIZE_GB——数据目录容量上限(GB),超出自动清理最旧数据,防磁盘写满。

5.6 通知与其他

NOTIFICATION_EMAIL——失败通知邮箱,ExecStopPost 在服务非 0 退出时调用 openmeteo-notify.sh 发送;未设置则静默。邮件通道需宿主机具备发信能力(可用本机 MTA 或中继)。

SWIFT_BACKTRACE——Swift 运行时崩溃回溯开关(如 SWIFT_BACKTRACE=enable=yes)。Swift fatalError 默认只打一行,排障 SIGILL 类崩溃(见 FAQ Q2)时打开可拿到符号化堆栈。

HTTP_CACHE——为 download-* 命令的原始数据 HTTP 下载开启缓存,重复跑流水线时省带宽。API 服务请求不经过它。

S3_CREDENTIALS_<BUCKET> / GOOGLE_APPLICATION_CREDENTIALS / KNMI_API_KEY / METEOFRANCE_API_KEY——数据流水线凭证:从私有 S3 桶、Google Cloud、KNMI、Météo-France 拉原始数据时分别配置。仅在运行对应 download 命令时需要,纯 API 部署不涉及。

STRIPE_API_KEY——Stripe 计费密钥,商业运营计量用,自托管忽略。

六、生产配置模板

6.1 最小可运行模板(远程缓存模式,8GB 内存 / 20GB 磁盘机型)

APT 包形态,按需从零到可用最快、数据规模最小(仅 cache.bin 8GB):

# /etc/default/openmeteo-api.env
VAPOR_ENV=production
LOG_LEVEL=info
API_BIND="0.0.0.0:8080"
API_APIKEYS_PATH=
API_SYNC_APIKEYS=

SYNC_ENABLED=false

REMOTE_DATA_DIRECTORY=https://openmeteo.s3.amazonaws.com/data/
CACHE_SIZE=8GB
  • 适用:内网调用、轻量自用、先跑通再演进。
  • 磁盘核算:cache.bin 8GB + 系统余量;内存:进程常驻约 1-2GB + 页缓存。
  • 依赖外部 S3 连通性(首次访问新区域需联网拉块,冷 0.5-60 秒,热毫秒级)。

6.2 本地数据模式模板(大磁盘 + 周期同步,无对外 S3 依赖)

# /etc/default/openmeteo-api.env
VAPOR_ENV=production
LOG_LEVEL=info
API_BIND="0.0.0.0:8080"

SYNC_ENABLED=true
SYNC_DOMAINS=dwd_icon,dwd_icon_eu
SYNC_VARIABLES=temperature_2m,relative_humidity_2m,wind_speed_10m,precipitation
SYNC_PAST_DAYS=7
SYNC_CONCURRENT=2
SYNC_REPEAT_INTERVAL=10
SYNC_DATA_DIRECTORY_MAX_SIZE_GB=200

# 不设 REMOTE_DATA_DIRECTORY:API 只读本机数据目录
# LOG_LEVEL=info
  • 适用:内网隔离或不想依赖外网 S3;数据新鲜度 = 同步间隔。
  • 磁盘按模式 × 变量 × 天数核算(实测单模式单变量 1 天即数百 MB 量级,上例组合建议 200GB 起步并启用容量上限自动清理)。

6.3 多节点同步模板(下载节点分发 + 多台 API 节点拉取)

数据服务端(下载节点)额外设置:

API_SYNC_APIKEYS=mykey123

API 节点(每台):

SYNC_ENABLED=true
SYNC_SERVER=https://data.internal.example.com/
SYNC_APIKEY=mykey123
SYNC_DOMAINS=dwd_icon
SYNC_VARIABLES=temperature_2m
SYNC_REPEAT_INTERVAL=5

对端连通性验证:https://<服务端>/?list-type=2&delimiter=/&prefix=data/&apikey=mykey123 应返回 S3 风格文件列表。

七、常见问题(FAQ)

Q1:改了 /etc/default/openmeteo-api.env 不生效?

必须 systemctl restart openmeteo-api(env 只在进程启动时读取)。已实测确认两点:一是 env 文件变量全量注入进程,单元里的 PassEnvironment= 列表不是白名单、不会拦截新变量(实测向 env 文件追加 LOCATIONS_LIMIT=2 重启后立即生效,回显见 5.4);二是 APT 包与源码自建单元在「环境变量注入」上等价,源码形态把变量写在自建单元的 Environment= 行即可。

Q2:服务一直 active,但请求必崩/502,journal 里是 SIGILL(status=4/ILL)?

优先查 DATA_DIRECTORY:路径不以 / 结尾、或目录不存在且属主不对,都会在首个请求触发 fatalError,Swift 以 SIGILL 自陷(实测 App/configure.swift:14: Fatal error: DATA_DIRECTORY must end with a trailing slash,exit 132)。systemd Restart=always 秒级拉起掩盖现场,表现为「服务 active 但请求崩」。修复:mkdir -p <数据目录> && chown openmeteo-api:openmeteo-api <数据目录> 并确保路径尾斜杠。

Q3:REMOTE_DATA_DIRECTORY 明明写了却报 must end with '/data/'?

远程缓存模式地址必须精确到 /data/ 结尾(实测 App/configure.swift:31: Fatal error: REMOTE_DATA_DIRECTORY must end with '/data/')。正确写法 https://openmeteo.s3.amazonaws.com/data/;自建分发端同理,填到桶的 data 目录层。该错误同样惰性触发——启动正常、首个请求崩溃,容易误判为「配置没读到」。

Q4:LOCATIONS_LIMIT 设小了,内网直连却依然能一次查几十个坐标?

该限制仅对 Host 含 open-meteo.com 的请求生效(源码对 localhost/自建域名路径传入 nil,实测对照回显见 5.4)。内网用 http://<IP>:8080 直连不经过该限制;确需限制时在反向代理层控制,或约束客户端统一用 open-meteo.com 域名访问。

Q5:CACHE_SIZE 调大后,内存会不会跟着涨?cache.bin 为什么是固定大小?

cache.bin 在首个请求时按 CACHE_SIZE 一次性预分配(mmap 定长文件),实测 4GB 配置生成 4294967040 字节、8GB 配置生成 8.0G,与配置精确对应。它占磁盘空间,物理内存由页缓存按访问热度自动管理,不会因调大 CACHE_SIZE 而常驻等量内存;磁盘充裕时调大命中率收益直接(冷 42.6 秒 → 热 8 毫秒的差距就来自这块缓存)。

八、参考链接

  1. 配置实现源码(configure.swift,1.7.0):https://github.com/open-meteo/open-meteo/blob/1.7.0/Sources/App/configure.swift
  2. 官方自托管指南(getting-started.md):https://github.com/open-meteo/open-meteo/blob/main/docs/getting-started.md
  3. 多节点同步文档(sync-command.md):https://github.com/open-meteo/open-meteo/blob/main/docs/sync-command.md
  4. 1.7.0 源码标签:https://github.com/open-meteo/open-meteo/tree/1.7.0
  5. 官方开放数据(S3):https://openmeteo.s3.amazonaws.com
  6. Vapor 环境与日志说明:https://docs.vapor.codes

本栏系列文档: