Open-Meteo 1.7.0 配置参数详解
Open-Meteo 1.7.0 全量配置解析:env 文件/systemd 单元/命令行三载体、40 余个环境变量逐项语义与源码默认值,DATA_DIRECTORY 与 REMOTE_DATA_DIRECTORY 源码级校验、LOCATIONS_LIMIT 生效条件、CACHE_SIZE 预分配机制均实测验证,附三类生产配置模板与排障 FAQ。
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.env | systemd 单元内 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-28 | 2026-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 崩溃(systemdRestart=always会立即拉起,表现为「服务一直 active 但首个请求必崩」,见 FAQ Q2/Q3 的实测);二是改完CACHE_SIZE后cache.bin尺寸在重启后、首个请求时才变化。
四、参数总览
按作用域归类(serve = API 服务进程读取;sync = 同步进程/同步 flags;源码列 = 1.7.0 configure.swift 实测默认值):
| 环境变量 | 默认值 | 作用域 | 作用 |
|---|---|---|---|
| VAPOR_ENV | development | serve | Vapor 运行环境(生产必须 production) |
| API_BIND | 无(必须由单元传入) | serve | 监听地址:端口,如 0.0.0.0:8080 |
| LOG_LEVEL | info | serve/sync | 日志级别(debug/info/notice/warning/error/critical) |
| MAX_BODY_SIZE | Vapor 默认 16KB | serve | 请求体大小上限(POST 网格点查询需调大) |
| DATA_DIRECTORY | ./data/ | serve/sync | 本地数据目录,必须以斜杠结尾 |
| REMOTE_DATA_DIRECTORY | 无(不启用) | serve | 远程 S3 数据源,必须以 /data/ 结尾,逗号分隔多源 |
| CACHE_SIZE | 10GB | serve | 数据块缓存 cache.bin 容量 |
| CACHE_FILE | <DATA_DIRECTORY>/cache.bin | serve | 缓存文件路径 |
| BLOCK_SIZE | 64KB | serve | 缓存块粒度 |
| REMOTE_DATA_DIRECTORY_MINIMUM_AGE | 无(不限制) | serve | 仅拉取早于该秒数的远程数据 |
| REMOTE_PRESSURE_LEVELS_ONLY | false | serve | 气压层数据仅走块缓存 |
| DATA_SPATIAL_DIRECTORY | 无(不启用) | serve | 静态空间数据(高程等)目录 |
| DATA_RUN_DIRECTORY | 无(不启用) | 下载命令 | 按模式起报时次存放原始下载文件 |
| TEMP_DIRECTORY | <DATA_DIRECTORY> | 下载命令 | 下载临时目录 |
| GENERATE_PREVIOUS_DAY | true | serve | 是否生成 previous day 数据库 |
| LOCATIONS_LIMIT | 1000 | serve | 单请求坐标点上限(仅 open-meteo.com 域名请求生效) |
| CALL_LIMIT_DAILY/HOURLY/MINUTELY | 10000/5000/600 | serve | 免费 API 节点按 IP 的日/时/分调用限额 |
| CONCURRENCY_LIMIT / _HARD / _TOTAL | 1 / 5 / 4096 | serve | 单 IP 并发/硬并发/全机总并发 |
| IP_ALLOWLIST_PATH | 无 | serve | IP 白名单文件路径 |
| API_APIKEYS_PATH | 无 | serve | 商业 API key 文件路径 |
| API_SYNC_APIKEYS | 空 | serve | 允许拉取本机数据的 sync apikey 列表(逗号分隔) |
| SYNC_ENABLED | false | sync | 是否启用 openmeteo-sync 服务(ExecCondition 门控) |
| SYNC_DOMAINS | 无 | sync | 同步的气象模式,逗号分隔(如 dwd_icon) |
| SYNC_VARIABLES | 无 | sync | 同步的变量,逗号分隔 |
| SYNC_PAST_DAYS | 0 | sync | 同步过去 N 天数据 |
| SYNC_CONCURRENT | 1 | sync | 单模式内并发下载数 |
| SYNC_CONCURRENT_MODELS | 1 | sync | 并发下载的模式数 |
| SYNC_REPEAT_INTERVAL | 0(单次) | sync | 重复执行间隔(分钟) |
| SYNC_SERVER | 无(官方 S3) | sync | 拉取数据的对端服务器 |
| SYNC_APIKEY | 无 | sync | 对端服务器 apikey |
| SYNC_DATA_DIRECTORY_MAX_SIZE_GB | 无 | sync | 数据目录容量上限(GB),超出自动清理 |
| NOTIFICATION_EMAIL | 无 | serve/sync | 失败通知邮箱 |
| SWIFT_BACKTRACE | 无 | serve/sync | Swift 运行时崩溃回溯开关 |
| 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¤t=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 毫秒的差距就来自这块缓存)。
八、参考链接
- 配置实现源码(configure.swift,1.7.0):https://github.com/open-meteo/open-meteo/blob/1.7.0/Sources/App/configure.swift
- 官方自托管指南(getting-started.md):https://github.com/open-meteo/open-meteo/blob/main/docs/getting-started.md
- 多节点同步文档(sync-command.md):https://github.com/open-meteo/open-meteo/blob/main/docs/sync-command.md
- 1.7.0 源码标签:https://github.com/open-meteo/open-meteo/tree/1.7.0
- 官方开放数据(S3):https://openmeteo.s3.amazonaws.com
- Vapor 环境与日志说明:https://docs.vapor.codes
本栏系列文档: