Open-Meteo 1.7.0 安装部署指南
Open-Meteo 1.7.0 裸机单机部署实测:官方 APT 包(Ubuntu 22.04)与源码编译(Swift 6.2 + 1016 目标,全流程 25 分钟)双方案、systemd 托管、远程缓存模式最小可运行口径(首调 42.6 秒、热缓存 8 毫秒)、数据目录与同步服务排障实录。
Open-Meteo 1.7.0 安装部署指南
目标:在一台真实 Linux 服务器上从零部署 Open-Meteo 1.7.0 并对外提供天气 API,覆盖两条官方裸机路径——Ubuntu 22.04 官方 APT 预编译包(在线安装,推荐)与 Swift 源码编译安装(适用于 22.04 以外的发行版),两条路径均完成 systemd 托管、开机自启与真实请求验证。全部命令与回显在 Ubuntu 22.04.5 与 Ubuntu 24.04.5 两台服务器实测取得。
一、环境信息
本文实测在以下两台服务器完成,正文命令均可在同规格服务器复现:
| 项目 | 服务器 A(方案 A:官方 APT 包) | 服务器 B(方案 B:源码编译) |
|---|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS(x86_64) | Ubuntu 24.04.5 LTS(x86_64) |
| CPU / 内存 | Intel Core i7-14700KF,6 核 / 18 GB | Intel Core i7-14700KF,6 核 / 18 GB |
| 安装形态 | openmeteo-api 1.7.0(apt.open-meteo.com 官方包) | openmeteo-api 1.7.0(git 标签 1.7.0 源码构建,Swift 6.2.3 工具链) |
| 服务管理 | systemd(openmeteo-api.service / openmeteo-sync.service) | systemd(自建 openmeteo-api.service 单元) |
| 数据目录 | /var/lib/openmeteo-api/data | /opt/open-meteo/data |
| 监听端口 | 8080(API_BIND="0.0.0.0:8080") | 8080(对发放通为主访问端口 8147 的前置转发,服务本身绑定 0.0.0.0:8080) |
| 运行数据口径 | 远程缓存模式(REMOTE_DATA_DIRECTORY 指向官方 S3)+ dwd_icon 单模式单变量同步 | 远程缓存模式 |
二、前置条件
2.1 硬件与系统要求
官方自托管文档(仓库 docs/getting-started.md)给出的最低要求,实测环境满足且全程未触顶:
| 项目 | 官方要求 | 本文实测 |
|---|---|---|
| CPU | 较新的 x86-64 或 Arm CPU,需 SIMD 指令(如 Intel AVX2) | Intel i7-14700KF(支持 AVX2) |
| 内存 | 最低 8 GB,推荐 16 GB | 18 GB,服务常驻内存约数百 MB |
| 磁盘 | 中小规模部署至少 100 GB,优先 NVMe SSD(缓存与数据库共用磁盘 I/O) | 系统盘 295 GB,缓存文件 8 GB 预分配 |
⚠️ 注意:远程缓存模式的 cache.bin 会按 CACHE_SIZE 预分配磁盘空间(默认 10 GB),规划磁盘时按 CACHE_SIZE 而非实际已用量估算。
2.2 网络要求
- 需要出网访问官方开放数据端点
openmeteo.s3.amazonaws.com(远程缓存与 sync 模式都从这里拉数据),或各国气象中心原始数据站点(直连下载模式); - Ubuntu 22.04 需访问官方 APT 仓库
https://apt.open-meteo.com(HTTPS 443)与密钥服务器hkps://keys.openpgp.org; - 方案 B 需访问 swift.org 工具链下载站与 GitHub(拉取源码与 SwiftPM 依赖)。
- 本文实测环境均直连可用,未启用下载降级;若内网受限,可自建 HTTP 代理后用
export http_proxy/https_proxy方式过渡。
2.3 软件依赖
方案 A(Ubuntu 22.04)只需要系统自带的 systemd 与以下基础工具:
apt-get install -y gnupg lsb-release curl
方案 B(Ubuntu 24.04)需要完整工具链与 C 库依赖(全部来自 Ubuntu 官方仓库,实测版本):
apt-get install -y binutils git gnupg2 libc6-dev libcurl4-openssl-dev \
libedit2 libgcc-13-dev libsqlite3-0 libstdc++-13-dev libxml2-dev \
libz3-dev pkg-config tzdata unzip zlib1g-dev libnetcdf-dev libeccodes-dev
| 依赖 | 作用 | 实测版本(Ubuntu 24.04 仓库) |
|---|---|---|
| libnetcdf-dev | NetCDF 科学数据格式解码(SwiftNetCDF) | 1:4.9.2-5ubuntu4 |
| libeccodes-dev | GRIB 气象数据解码(SwiftEccodes) | 2.34.1-1build2 |
| libcurl4-openssl-dev / libxml2-dev / libz3-dev 等 | Swift 工具链与 SwiftPM 构建所需系统库 | 随发行版 |
| git | 拉取源码并供版本插件读取标签 | 随发行版 |
三、版本选型说明
- 最新版本为 1.7.0(GitHub Releases 发布于 2026-10-16T14:09:20Z,查询日期 2026-10-28);上一版本 1.6.0 发布于 2026-09-10,官方约每月一个 minor 版本。
- 官方 APT 仓库
apt.open-meteo.com当前仅提供 Ubuntu 22.04(jammy)软件源,且实测仓库内只有当前版本可选(apt-cache policy回显见 4.3),无历史版本可降级。 - 官方发行形态共三种:仓库 Dockerfile 定义的构建产物(发布于 ghcr.io/open-meteo/open-meteo)、Ubuntu 22.04 官方 APT 预编译包、源码构建。本文按真实服务器口径交付后两种裸机形态;ghcr.io 构建产物属官方自管形态,请直接参阅官方文档,本文不展开。
- 版本确认命令(安装后任意位置执行):
/usr/local/bin/openmeteo-api version
openmeteo-api sha=92e8d2f9918d73a3a03e0dbba5baead8ee60fd35 branch=unknown tag=1.7.0
💡 说明:version 输出同时给出构建 sha 与 tag;源码构建得到的二进制同样会输出版本信息(与 git 标签一致,见 5.4),可用于核对部署物与官方 Release 的对应关系。
四、方案 A:Ubuntu 22.04 官方 APT 仓库在线安装(推荐)
4.1 方案说明
官方为 Ubuntu 22.04(Jammy)提供签名 APT 仓库,安装 openmeteo-api 包即完成二进制、Resources/Public 静态资源、systemd 服务单元与同步服务单元的全部部署,是最省事的裸机路径。缺点是仓库只覆盖 jammy,其他发行版请走方案 B。
4.2 配置官方软件源
先安装基础工具并从 keys.openpgp.org 取回 Open-Meteo 仓库签名公钥(密钥指纹 E6D9BD390F8226AE):
apt-get update
apt-get install -y gnupg lsb-release curl
gpg --keyserver hkps://keys.openpgp.org --no-default-keyring \
--keyring /usr/share/keyrings/openmeteo-archive-keyring.gpg \
--recv-keys E6D9BD390F8226AE
gpg: key E6D9BD390F8226AE: public key "Open-Meteo <info@open-meteo.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
写入官方源定义并刷新索引:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/openmeteo-archive-keyring.gpg] https://apt.open-meteo.com $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/openmeteo-api.list
apt-get update
deb [arch=amd64 signed-by=/usr/share/keyrings/openmeteo-archive-keyring.gpg] https://apt.open-meteo.com jammy main
Get:2 https://apt.open-meteo.com jammy InRelease [1135 B]
Get:3 https://apt.open-meteo.com jammy/main amd64 Packages [620 B]
⚠️ 排障实录:首次执行
gpg --recv-keys曾出现密钥未落盘的情况——keyring 文件已创建但为空,随后apt-get update报W: GPG error: ... NO_PUBKEY E6D9BD390F8226AE。定位为密钥服务器请求偶发失败(keyring 文件被提前创建)。处理:重新执行同一条--recv-keys命令直至回显imported: 1,再apt-get update即恢复正常,无需换源。
4.3 安装 openmeteo-api 包
apt-get install -y openmeteo-api
Setting up openmeteo-api (1.7.0) ...
Failed to enable unit: Unit file openmeteo.slice does not exist.
Created symlink /etc/systemd/system/default.target.wants/openmeteo-sync.service → /lib/systemd/system/openmeteo-sync.service.
Created symlink /etc/systemd/system/default.target.wants/openmeteo-api.service → /lib/systemd/system/openmeteo-api.service.
Created symlink /etc/systemd/system/default.target.wants/openmeteo-api2.service → /lib/systemd/system/openmeteo-api2.service.
Created symlink /etc/systemd/system/default.target.wants/openmeteo-api3.service → /lib/systemd/system/openmeteo-api3.service.
包内容与文件布局(dpkg -L 关键项):
| 路径 | 说明 |
|---|---|
| /usr/local/bin/openmeteo-api | 主二进制(单文件) |
| /usr/local/bin/swift-backtrace | 崩溃回溯辅助工具 |
| /usr/local/bin/openmeteo-notify.sh | 服务失败通知脚本(配合 NOTIFICATION_EMAIL 与 sendmail) |
| /var/lib/openmeteo-api/Resources | 时区等资源文件 |
| /var/lib/openmeteo-api/Public | Web 静态资源 |
| /etc/default/openmeteo-api.env | 环境配置文件(systemd EnvironmentFile) |
| /lib/systemd/system/openmeteo-api.service | API 服务单元(api2/api3 为扩展实例模板) |
| /lib/systemd/system/openmeteo-sync.service | 数据同步服务单元 |
apt-cache policy 确认可用版本(仓库当前仅 1.7.0):
apt-cache policy openmeteo-api
openmeteo-api:
Installed: 1.7.0
Candidate: 1.7.0
Version table:
*** 1.7.0 500
500 https://apt.open-meteo.com jammy/main amd64 Packages
100 /var/lib/dpkg/status
4.4 初始化数据目录(必做,否则首查即崩)
安装包不会创建数据目录。实测在未创建目录时发起第一次 API 请求,服务进程直接崩溃重启(Restart=always 掩盖了崩溃现场,需查 journal 才能发现):
journalctl -u openmeteo-api --no-pager | grep -m1 -B1 "Fatal error"
[ INFO ] GET /v1/forecast [request-id: 7870F49A-64D1-45C9-B10B-40B2D404AF23]
App/OmFileSystemManager.swift:33: Fatal error: 'try!' expression unexpectedly raised an error: OmFileIO.FileSystemCacheError.cannotOpenFile(name: "./data/", errno: 2, error: "No such file or directory")
创建数据目录并授权给服务运行用户 openmeteo-api(安装包已自动创建该系统用户,uid/gid 1000):
mkdir -p /var/lib/openmeteo-api/data
chown openmeteo-api:openmeteo-api /var/lib/openmeteo-api/data
4.5 配置远程数据源与对外端口
编辑 /etc/default/openmeteo-api.env(完整逐项语义见本栏《Open-Meteo 1.7.0 配置参数详解》),本文实测改三处:开启远程数据源、缓存 8 GB、绑定 0.0.0.0 使其他主机可访问:
# API service configuration
VAPOR_ENV=production
LOG_LEVEL=info
API_BIND="0.0.0.0:8080"
API_APIKEYS_PATH=
API_SYNC_APIKEYS=
# 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
说明:
API_BIND默认127.0.0.1:8080只监听本机,改为0.0.0.0:8080才对局域网开放(官方文档建议生产环境前置 Nginx 提供 TLS);SYNC_*组开启 dwd_icon 单模式单变量的增量同步(见 4.8);REMOTE_DATA_DIRECTORY与CACHE_SIZE组成远程缓存模式,是零全量下载的最轻运行形态。
4.6 systemd 托管与开机自启
安装包已自动创建 4 个服务单元的开机自启链接,重新加载并重启服务使配置生效:
systemctl daemon-reload
systemctl restart openmeteo-api
systemctl is-active openmeteo-api
active
服务状态与资源归属(注意 CGroup 已归入 openmeteo.slice 层级):
systemctl status openmeteo-api --no-pager -n 3
● openmeteo-api.service - Run Open-Meteo API
Loaded: loaded (/lib/systemd/system/openmeteo-api.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2026-10-28 14:39:23 UTC; 2s ago
Main PID: 3960 (openmeteo-api)
CGroup: /system.slice/docker-426c6e5e919dd8e54575c880b364f1c073b6698b9c5888a9c2aeeabaf81d9839.scope/openmeteo.slice/openmeteo-api.service
⚠️ 说明:status 回显中的
docker-*.scope段是本文实测载体(物理机或虚拟机上没有这一层),服务器上看到的 CGroup 应为/system.slice/openmeteo.slice/openmeteo-api.service。安装时 postinst 输出的Failed to enable unit: Unit file openmeteo.slice does not exist.实测不影响服务启动与运行(包内该单元文件名为 openmeteo.slice.service,与单元引用名不一致,enable 失败仅意味着 slice 级 90% 内存上限未挂接,属非致命告警)。
开机自启确认:
systemctl enable openmeteo-api
systemctl is-enabled openmeteo-api
Synchronizing state of openmeteo-api.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable openmeteo-api
enabled
4.7 部署验证
本机请求北京坐标的逐小时气温(远程缓存模式首次请求,需从官方 S3 拉取数据分块,实测 42.6 秒):
time curl -sS --max-time 120 "http://127.0.0.1:8080/v1/forecast?latitude=39.9&longitude=116.4&models=ecmwf_ifs025&hourly=temperature_2m&forecast_days=1"
{"latitude":39.9,"longitude":116.4,"generationtime_ms":3763.21804523468,"utc_offset_seconds":0,"timezone":"GMT","timezone_abbreviation":"GMT","elevation":49.0,"hourly_units":{"time":"iso8601","temperature_2m":"°C"},"hourly":{"time":["2026-10-28T00:00","2026-10-28T01:00","2026-10-28T02:00","2026-10-28T03:00","2026-10-28T04:00","2026-10-28T05:00","2026-10-28T06:00","2026-10-28T07:00","2026-10-28T08:00","2026-10-28T09:00","2026-10-28T10:00","2026-10-28T11:00","2026-10-28T12:00","2026-10-28T13:00","2026-10-28T14:00","2026-10-28T15:00","2026-10-28T16:00","2026-10-28T17:00","2026-10-28T18:00","2026-10-28T19:00","2026-10-28T20:00","2026-10-28T21:00","2026-10-28T22:00","2026-10-28T23:00"],"temperature_2m":[...实测 24 个小时值...]}}
说明:首调实测耗时
real 0m42.621s(generationtime_ms 3763 为服务端纯计算耗时,其余为 S3 拉取);同一坐标第二次请求实测 8 ms(HTTP 200),LRU 缓存生效。相邻分块的新坐标首调约 0.5 秒。
缓存落盘验证(cache.bin 按 CACHE_SIZE=8GB 预分配):
du -sh /var/lib/openmeteo-api/data/
ls -lh /var/lib/openmeteo-api/data/
8.1G /var/lib/openmeteo-api/data/
-rw-r--r-- 1 openmeteo-api openmeteo-api 8.0G Oct 28 14:36 cache.bin
局域网可达性验证(从另一台机器请求,确认 0.0.0.0 绑定生效;实测从内网另一主机请求 elevation 与 forecast 端点):
curl "http://<服务器A内网IP>:8080/v1/elevation?latitude=39.9&longitude=116.4"
{"elevation":[49.0]}
参数校验错误也以结构化 JSON 返回(HTTP 400 语义),实测:
curl -sS "http://127.0.0.1:8080/v1/forecast?latitude=999&longitude=8.4"
{"reason":"Latitude must be in range of -90 to 90°. Given: 999.0.","error":true}
4.8 启用 openmeteo-sync 数据同步服务
openmeteo-sync.service 按 4.5 的 SYNC_* 配置运行 openmeteo-api sync 命令,从官方 S3 增量同步所选模式与变量到本地数据目录(--repeat-interval 10 表示每 10 分钟检查一轮)。启动并观察日志:
systemctl restart openmeteo-sync
systemctl is-active openmeteo-sync
journalctl -u openmeteo-sync --no-pager -n 5 --output=short-iso
active
2026-10-28T14:39:23+0000 openmeteo-apt22 sh[4361]: [ ERROR ] Could not read content from API_APIKEYS_PATH
2026-10-28T14:39:23+0000 openmeteo-apt22 sh[4361]: [ INFO ] Checking for files with more than 1 past days data
2026-10-28T14:39:25+0000 openmeteo-apt22 sh[4361]: [ INFO ] Downloading 5 files (663.9 MB)
2026-10-28T14:39:26+0000 openmeteo-apt22 sh[4361]: [ INFO ] Download https://openmeteo.s3.amazonaws.com/data/dwd_icon_global_native/static/coordinates.om [nConcurrent=4 nChunks=3 size=17.5 MB chunkLength=8.0 MB]
2026-10-28T14:39:26+0000 openmeteo-apt22 sh[4361]: [ INFO ] Download https://openmeteo.s3.amazonaws.com/data/dwd_icon/static/cdo_weights.nc [nConcurrent=4 nChunks=32 size=252.8 MB chunkLength=8.0 MB]
说明与数据规模口径:
sync dwd_icon temperature_2m --past-days 1首轮除变量数据外还要拉取一次性静态文件(坐标、重网格权重 cdo_weights.nc 252.8 MB 等,日志口径 663.9 MB 起步),实测走公网直连约 90–150 KB/s 时静态文件下载需 30 分钟量级;后续每轮仅增量更新。同步完成后dwd_icon、dwd_icon_global_native目录落盘(本文实测进行中即写入,最终占用以du为准)。Could not read content from API_APIKEYS_PATH为未配置 API 密钥文件时的无害提示,可忽略。⚠️ 磁盘与带宽提示:全量多模式部署可达 TB 级(官方日处理超 5 TB 的上游),生产同步建议配合
SYNC_DATA_DIRECTORY_MAX_SIZE_GB与官方文档的 cron 清理策略(chunk_* 文件按 hPa 层 10 天/地面 90 天滚动删除)。
五、方案 B:源码编译安装(Ubuntu 24.04 等 jammy 以外系统)
5.1 方案说明
官方 APT 仓库仅支持 Ubuntu 22.04,Ubuntu 24.04、Debian 及其他发行版走源码编译:Swift 6.2 工具链 + SwiftPM 拉取依赖 + swift build -c release 产出单二进制,再落地安装并由 systemd 托管。仓库 Dockerfile 定义的官方构建开关有两个:ENABLE_PARQUET=TRUE(启用 Apache Arrow Parquet 支持,需额外依赖)与 MARCH_SKYLAKE=TRUE(按 skylake 指令集编译);本文按最小依赖编译(不启用 Parquet,使用默认 -march=native,适配当前服务器 CPU)。
5.2 安装构建依赖
apt-get update
apt-get install -y binutils git gnupg2 libc6-dev libcurl4-openssl-dev \
libedit2 libgcc-13-dev libsqlite3-0 libstdc++-13-dev libxml2-dev \
libz3-dev pkg-config tzdata unzip zlib1g-dev libnetcdf-dev libeccodes-dev
⚠️ 排障实录:Swift 工具链本体运行还需要 libncurses6(Ubuntu 24.04 最小安装缺它),缺失时报
swift: error while loading shared libraries: libncurses.so.6: cannot open shared object file。补装:
apt-get install -y libncurses6
5.3 安装 Swift 6.2 工具链
1.7.0 的 Package.swift 声明 swift-tools-version:6.2,必须用 6.2 及以上工具链。从 swift.org 官方下载 Ubuntu 24.04 版本(实测 6.2.3-RELEASE):
cd /root
curl -L -o swift.tar.gz "https://download.swift.org/swift-6.2.3-release/ubuntu2404/swift-6.2.3-RELEASE/swift-6.2.3-RELEASE-ubuntu24.04.tar.gz"
tar -xzf swift.tar.gz -C /opt
mv /opt/swift-6.2.3-RELEASE-ubuntu24.04 /opt/swift
export PATH=/opt/swift/usr/bin:$PATH
swift --version
Swift version 6.2.3 (swift-6.2.3-RELEASE)
Target: x86_64-unknown-linux-gnu
⚠️ 下载说明:工具链压缩包约 800 MB。本文实测官方下载站直连可用;若受限,可按「官方源 → 国内镜像站 → 代理」顺序降级(swift.org 官方列有各区域镜像)。为持久生效,建议把
export PATH=/opt/swift/usr/bin:$PATH写入 /etc/profile.d/swift.sh。
5.4 获取 1.7.0 源码
用 git 克隆指定标签(便于核对 commit 与官方发布物同源,也为 5.6 的版本号注入提供 sha):
cd /root
git clone --depth 1 --branch 1.7.0 https://github.com/open-meteo/open-meteo.git
cd open-meteo
git log -1 --format="%H %ci"
92e8d2f9918d73a3a03e0dbba5baead8ee60fd35 2026-10-16 16:09:05 +0200
说明:该 commit 与方案 A 中
version命令输出的 sha 完全一致,可确认源码与官方 1.7.0 发布物同源。注意版本插件读取的是 GitHub Actions 环境变量而非 git 元数据(机制与注入方法见 5.6)。
5.5 编译
export PATH=/opt/swift/usr/bin:$PATH
swift build -c release -j 3
Build complete! (602.35s)
实测口径:6 核 / 18 GB 内存服务器、
-j 3,从依赖拉取到链接完成全流程约 12 分钟(其中依赖 fetch 约 6 分钟,SwiftPM 自报构建耗时 602 秒),全部依赖共 1016 个编译目标,产物二进制约 160 MB。⚠️ 排障实录(两处,均实测遇到):
error: 'open-meteo': posix_spawn error: Permission denied (13)——SwiftPM 把构建清单工具写到系统临时目录执行,若该分区以 noexec 挂载(不少生产服务器对 /tmp 有此加固)就会触发。处理:为构建会话改用可执行目录export TMPDIR=/root/tmp && mkdir -p /root/tmp后重新执行。-j3连写形式在该版本工具链报error: Missing value for '-j <jobs>',改为-j 3(空格分隔)即可。内存与并发:release + 优化编译单任务内存峰值较高,18 GB 机器用
-j 3稳定;内存充裕(32 GB+)可提高并发缩短编译时间。
5.6 落地安装
按官方构建产物的组织方式(仓库 Dockerfile 同布局)安装到 /opt/open-meteo:二进制、时区资源目录、Web 静态资源、数据目录,并创建专用系统用户:
useradd --user-group --create-home --system --home-dir /opt/open-meteo openmeteo
mkdir -p /opt/open-meteo/bin /opt/open-meteo/Resources /opt/open-meteo/data
cp /root/open-meteo/.build/release/openmeteo-api /opt/open-meteo/bin/
cp -r /root/open-meteo/.build/release/SwiftTimeZoneLookup_SwiftTimeZoneLookup.resources /opt/open-meteo/Resources/
cp -r /root/open-meteo/Public /opt/open-meteo/Public
chown -R openmeteo:openmeteo /opt/open-meteo
版本自检:
/opt/open-meteo/bin/openmeteo-api version
openmeteo-api sha=92e8d2f9918d73a3a03e0dbba5baead8ee60fd35 branch=unknown tag=1.7.0
版本号注入:源码构建的
sha/branch/tag由构建期插件 GitVersionPlugin 读取 GitHub Actions 环境变量生成(GITHUB_SHA、GITHUB_REF_TYPE、GITHUB_REF_NAME、GITHUB_HEAD_REF)。直接编译不设这些变量时版本自检显示sha=unknown branch=unknown tag=none;需要与 APT 包一致的自检输出,可在编译前导出变量后增量重建(实测仅 89.93 秒):cd /root/open-meteo touch Package.swift # 触发版本插件重新生成 export GITHUB_SHA=$(git rev-parse HEAD) GITHUB_REF_TYPE=tag GITHUB_REF_NAME=1.7.0 swift build -c release -j 3Build complete! (89.93s)
5.7 systemd 托管
写入 /etc/systemd/system/openmeteo-api.service(每个 Environment 单独一行):
[Unit]
Description=Open-Meteo API (source build)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=openmeteo
Group=openmeteo
WorkingDirectory=/opt/open-meteo
Environment=DATA_DIRECTORY=/opt/open-meteo/data/
Environment=REMOTE_DATA_DIRECTORY=https://openmeteo.s3.amazonaws.com/data/
Environment=CACHE_SIZE=4GB
Environment=LOG_LEVEL=info
ExecStart=/opt/open-meteo/bin/openmeteo-api serve -b 0.0.0.0:8080 --env production
Restart=always
RestartSec=1
LimitNOFILE=infinity
[Install]
WantedBy=multi-user.target
说明:
DATA_DIRECTORY必须以斜杠结尾(源码校验,不以斜杠结尾直接 fatalError);serve -b 0.0.0.0:8080等价于方案 A 的API_BIND="0.0.0.0:8080";--env production对应方案 A 的 VAPOR_ENV。此处 CACHE_SIZE 取 4 GB 以示例多实例差异化配置,生产按访问量调整。
启用并启动:
systemctl daemon-reload
systemctl enable --now openmeteo-api
systemctl is-active openmeteo-api
Created symlink /etc/systemd/system/multi-user.target.wants/openmeteo-api.service → /etc/systemd/system/openmeteo-api.service.
active
5.8 部署验证
systemd 启动日志验证(服务拉起后监听 8080):
journalctl -u openmeteo-api --no-pager -n 5 --output=short-iso
2026-10-28T15:01:18+0000 openmeteo-server systemd[1]: Started openmeteo-api.service - Open-Meteo API (source build).
2026-10-28T15:01:18+0000 openmeteo-server openmeteo-api[11219]: [ NOTICE ] Server started on http://0.0.0.0:8080
数据目录按 DATA_DIRECTORY 指定位置落盘验证(cache.bin 在首次请求时按 CACHE_SIZE=4GB 预分配):
ls -la /opt/open-meteo/data/
total 4194316
drwxr-xr-x 2 openmeteo openmeteo 4096 Oct 28 15:01 .
drwxr-x--- 6 openmeteo openmeteo 4096 Oct 28 14:58 ..
-rw-r--r-- 1 openmeteo openmeteo 4294967040 Oct 28 15:01 cache.bin
本机 elevation 请求验证(源码编译二进制远程缓存模式):
curl "http://127.0.0.1:8080/v1/elevation?latitude=39.9&longitude=116.4"
{"elevation":[49.0]}
本机 forecast 首调与缓存复测同方案 A(冷缓存秒级到数十秒、热缓存毫秒级),此处不再重复回显。
六、方案对比与选择建议
| 维度 | 方案 A:官方 APT 包(Ubuntu 22.04) | 方案 B:源码编译(任意发行版) |
|---|---|---|
| 版本 | 仓库当前版(实测仅 1.7.0 可选) | 任意 git 标签/提交 |
| 是否需联网 | 需要(apt.open-meteo.com + keys.openpgp.org + S3) | 需要(swift.org + GitHub + S3) |
| 安装耗时 | 约 5 分钟 | 约 25 分钟(依赖 + 800 MB 工具链 + 编译,-j 3 实测) |
| systemd 来源 | 包内置 openmeteo-api/openmeteo-sync 单元 | 自建单元 |
| 数据目录 | /var/lib/openmeteo-api/data | 自定义(本文 /opt/open-meteo/data) |
| 同步服务 | openmeteo-sync 开箱即用 | 需自建(可仿 openmeteo-sync 单元执行 sync 命令) |
| 升级方式 | apt 更新 | 重新 checkout 标签 + 重新编译 |
| 适用场景 | Ubuntu 22.04 生产部署首选 | 非 jammy 系统、需要定制修改或多版本并存 |
选择建议:Ubuntu 22.04 一律用方案 A(维护成本最低、自带同步服务);Ubuntu 24.04 及其他发行版用方案 B;有源码修改需求的团队即使能用方案 A 也建议走方案 B 以保持构建链路可控。
七、配置说明
两方案共用同一套环境变量配置面,仅载体不同:方案 A 在 /etc/default/openmeteo-api.env(systemd EnvironmentFile),方案 B 在自建 unit 的 Environment= 行(或同样使用 EnvironmentFile 指向任意路径的 env 文件)。核心项速览:
| 配置项 | 默认值 | 作用 |
|---|---|---|
| API_BIND | 127.0.0.1:8080 | 监听地址与端口(serve -b 参数) |
| VAPOR_ENV | production | 运行环境(development 时错误页带堆栈) |
| LOG_LEVEL | info | 日志级别 |
| DATA_DIRECTORY | ./data/(工作目录相对) | 本地数据目录,必须斜杠结尾 |
| REMOTE_DATA_DIRECTORY | 未设置 | 官方 S3 地址后启用远程缓存模式,必须以 /data/ 结尾 |
| CACHE_SIZE | 10GB | 远程缓存 LRU 容量(cache.bin 预分配) |
| SYNC_ENABLED | false | 是否启用 openmeteo-sync 同步服务 |
| SYNC_DOMAINS / SYNC_VARIABLES | 空 | 同步的模式与变量,逗号分隔 |
| SYNC_PAST_DAYS / SYNC_REPEAT_INTERVAL / SYNC_CONCURRENT | 7 / 10 / 4 | 回溯天数 / 轮询间隔分钟 / 单模式并发 |
逐项语义、取值约束与生效验证实测见本栏《Open-Meteo 1.7.0 配置参数详解》。
八、常见问题(FAQ)
Q1:apt-get update 报 NO_PUBKEY E6D9BD390F8226AE 怎么办?
密钥未成功导入(keyring 文件已创建但为空)。重新执行 4.2 的 gpg --recv-keys 直到回显 imported: 1,再 apt-get update。密钥指纹与官方文档一致:E6D9BD390F8226AE。
Q2:安装后第一次请求服务就崩,journal 里是 Swift Fatal error?
数据目录不存在。安装包不创建 /var/lib/openmeteo-api/data,首次请求触发 OmFileIO.FileSystemCacheError.cannotOpenFile(name: "./data/") 致命错误(进程以 SIGILL 自陷退出,Restart=always 会立刻拉起)。按 4.4 建目录授权即可,属一次性问题。
Q3:源码构建报 posix_spawn error: Permission denied?
系统临时目录被 noexec 挂载。用 export TMPDIR=/root/tmp(目录需存在且可执行)后重新构建,见 5.5 排障实录。
Q4:swift 命令报 libncurses.so.6 缺失?
apt-get install -y libncurses6。Ubuntu 24.04 最小安装默认不带该库,见 5.2。
Q5:日志里反复出现 Could not read content from API_APIKEYS_PATH 是否有害?
无害。API_APIKEYS_PATH 用于指向 API 密钥清单文件,未配置(默认空)时会打印该提示,服务功能不受影响;需要接口鉴权时再配置。
Q6:Failed to enable unit: Unit file openmeteo.slice does not exist. 要处理吗?
可以不处理。包内 slice 单元文件名为 openmeteo.slice.service,与 openmeteo-api.service 中 Slice=openmeteo.slice 的引用名不一致,导致 enable 失败;实测服务仍正常运行,仅 slice 级 MemoryMax=90% 上限未生效。如需严格挂接,可手工补建 /etc/systemd/system/openmeteo.slice 后 daemon-reload。
Q7:首次查询特别慢正常吗? 远程缓存模式下正常:首次请求某区域需从官方 S3 拉取数百个数据块(实测单坐标首调 42.6 秒),缓存命中后同坐标 8 ms、相邻坐标亚秒级。低频单点调用建议直接使用官方公共 API,自托管适合重复请求密集的负载。
Q8:8080 端口被占用怎么办?
改 API_BIND(方案 A,改 /etc/default/openmeteo-api.env 后 systemctl restart openmeteo-api)或 unit 中 serve -b 参数(方案 B)。多实例可用包内置的 openmeteo-api2/api3 单元模板,分别配置不同 API_BIND 与工作目录。
九、卸载与清理
方案 A(保留数据则先备份 /var/lib/openmeteo-api/data):
systemctl stop openmeteo-sync openmeteo-api
apt-get purge -y openmeteo-api
rm -f /etc/apt/sources.list.d/openmeteo-api.list
rm -rf /var/lib/openmeteo-api
方案 B:
systemctl disable --now openmeteo-api
rm -f /etc/systemd/system/openmeteo-api.service
systemctl daemon-reload
rm -rf /opt/open-meteo /root/open-meteo /opt/swift
十、参考链接
- 官方自托管指南(getting-started.md,1.7.0):https://github.com/open-meteo/open-meteo/blob/main/docs/getting-started.md
- 模式数据下载文档(downloading-datasets.md):https://github.com/open-meteo/open-meteo/blob/main/docs/downloading-datasets.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
- Swift 6.2.3 工具链下载:https://www.swift.org/download/
- 官方 APT 仓库:https://apt.open-meteo.com
- 官方开放数据(S3):https://openmeteo.s3.amazonaws.com
- 官方构建产物(ghcr.io):https://github.com/open-meteo/open-meteo/pkgs/container/open-meteo
本栏系列文档: