SIP3 2026.2.1 Ubuntu 22.04 安装指南

SIP3 2026.2.1 Ubuntu 22.04 安装指南:repo.sip3.io 源配置、四组件与 MongoDB/InfluxDB/Grafana 安装、激活配置与 SIP 信令采集闭环实测。

SIP3SIPVoIPSIP32026/10/27

SIP3 2026.2.1 Ubuntu 22.04 安装指南

一、环境信息

项目内容
服务器主机名 sip3-server,IP 10.89.59.10(SIP 话务侧另有 10.89.59.1 作为信令源)
操作系统Ubuntu Server 22.04 LTS(x86_64,最小化安装)
SIP3 版本2026.2.1-1(apt 软件源,2026-10-26 实测最新)
Java 运行时sip3-java 25.0.2-10(SIP3 专用 JDK,随组件自动安装)
存储组件MongoDB 7.0.45、InfluxDB 1.8.10、Grafana 13.2.4
网络前提服务器能接收 SIP 流量(本文以 UDP 5060 为例),可访问 repo.sip3.io、repo.mongodb.org、download.influxdata.com、apt.grafana.com
实测日期2026-10-26

本文全程在 root 账号下操作。SIP3 官方安装指南明确 apt 路径仅支持 Debian ≥ 10 与 Ubuntu 20.04/22.04/22.10。

二、安装前准备

SIP3 CE 由四个 Java 组件(Captain/Salto/Twig/Hoof)加三个存储组件(MongoDB/InfluxDB/Grafana)组成。本文采用官方推荐的单机单体部署:四组件与存储全部安装在同一台服务器上,Captain 通过 libpcap 抓取本机网卡上的 SIP 流量。

先更新系统并安装基础工具:

root@sip3-server:~# apt-get update && apt-get install -y gnupg curl ca-certificates nginx libpcap0.8

三、配置 SIP3 软件源

3.1 导入签名密钥

root@sip3-server:~# curl -s https://repo.sip3.io/apt/keyFile | gpg --batch --dearmor -o /usr/share/keyrings/sip3-archive-keyring.gpg

3.2 添加 CE 与 Java 两个源

root@sip3-server:~# echo "deb [ arch=all signed-by=/usr/share/keyrings/sip3-archive-keyring.gpg ] https://repo.sip3.io/apt/ ce contrib" > /etc/apt/sources.list.d/sip3.list
root@sip3-server:~# echo "deb [ signed-by=/usr/share/keyrings/sip3-archive-keyring.gpg ] https://repo.sip3.io/apt/java/ all contrib" > /etc/apt/sources.list.d/sip3-java.list
root@sip3-server:~# apt-get update

刷新后确认可安装版本(2026-10-26 实测):

root@sip3-server:~# apt-cache policy sip3-captain-ce sip3-salto-ce sip3-twig-ce sip3-hoof-ce sip3-java | grep -E "^sip3|Candidate:"
sip3-captain-ce:
  Candidate: 2026.2.1-1
sip3-salto-ce:
  Candidate: 2026.2.1-1
sip3-twig-ce:
  Candidate: 2026.2.1-1
sip3-hoof-ce:
  Candidate: 2026.2.1-1
sip3-java:
  Candidate: 25.0.2-10

四、安装 SIP3 组件

一条命令安装全部四个组件:

root@sip3-server:~# apt-get install -y sip3-captain-ce sip3-salto-ce sip3-twig-ce sip3-hoof-ce

安装完成后核对包与产物布局:

root@sip3-server:~# dpkg -l | grep -E "sip3" | awk '{print $2, $3}'
sip3-captain-ce  2026.2.1-1
sip3-hoof-ce     2026.2.1-1
sip3-java        25.0.2-10
sip3-salto-ce    2026.2.1-1
sip3-twig-ce     2026.2.1-1
root@sip3-server:~# ls /opt/
sip3-captain  sip3-java  sip3-salto  sip3-twig

各组件产物位置:

组件程序配置目录systemd 单元
Captain/opt/sip3-captain/sip3-captain.jar/etc/sip3-captain/sip3-captain.service(另有 sip3-captain-interface@.service 模板)
Salto/opt/sip3-salto/sip3-salto.jar/etc/sip3-salto/sip3-salto.service
Twig/opt/sip3-twig/sip3-twig.jar/etc/sip3-twig/sip3-twig.service
Hoof/var/www/sip3-hoof(静态文件)—无(由 nginx 托管,见 6.4)

五、安装存储组件

5.1 MongoDB 7.0

root@sip3-server:~# curl -fsSL https://pgp.mongodb.com/server-7.0.asc | gpg --batch --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpg
root@sip3-server:~# echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" > /etc/apt/sources.list.d/mongodb-org-7.0.list
root@sip3-server:~# apt-get update && apt-get install -y mongodb-org

5.2 InfluxDB 1.8.10

SIP3 通过 InfluxDB 的 v1 HTTP API(db 参数)写指标,需要 1.x 版本。实测 Ubuntu 22.04 下 influxdata 源的 influxdb(1.13.1)deb 包安装脚本在最小化系统上会失败,因此改用官方二进制包部署(与 SIP3 官方 Ansible 工程的 v1 布局一致):

root@sip3-server:~# curl -fsSL -o /tmp/influxdb.tar.gz https://download.influxdata.com/influxdb/releases/influxdb-1.8.10_linux_amd64.tar.gz
root@sip3-server:~# tar -C /opt -xzf /tmp/influxdb.tar.gz && rm /tmp/influxdb.tar.gz
root@sip3-server:~# cp /opt/influxdb-1.8.10-1/usr/bin/{influxd,influx,influx_inspect} /usr/bin/
root@sip3-server:~# mkdir -p /etc/influxdb /var/lib/influxdb
root@sip3-server:~# cp /opt/influxdb-1.8.10-1/etc/influxdb/influxdb.conf /etc/influxdb/

创建 systemd 单元:

root@sip3-server:~# cat > /etc/systemd/system/influxdb.service <<'EOF'
[Unit]
Description=InfluxDB 1.8.10 time-series database
After=network.target

[Service]
ExecStart=/usr/bin/influxd -config /etc/influxdb/influxdb.conf
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
root@sip3-server:~# systemctl daemon-reload

5.3 Grafana

root@sip3-server:~# curl -fsSL https://apt.grafana.com/gpg.key | gpg --batch --dearmor -o /usr/share/keyrings/grafana.gpg
root@sip3-server:~# echo "deb [ signed-by=/usr/share/keyrings/grafana.gpg ] https://apt.grafana.com stable main" > /etc/apt/sources.list.d/grafana.list
root@sip3-server:~# apt-get update && apt-get install -y grafana

5.4 启动存储服务并创建数据库

root@sip3-server:~# systemctl enable --now mongod influxdb grafana-server
root@sip3-server:~# systemctl is-active mongod influxdb grafana-server
active
active
active
root@sip3-server:~# influx -execute "CREATE DATABASE sip3"
root@sip3-server:~# influx -execute "SHOW DATABASES" | tail -3
name: databases
name
----
sip3

六、基础配置

重要:apt 包安装后的配置文件采用"全注释"形态,不会自动生效。 三个 Java 组件的 /etc/sip3-*/application.yml 中所有段落默认被注释,JVM 参数文件 /etc/sip3-*/environment.conf 为 0 字节空文件,必须手工写入,否则服务无法正常工作(实测 Salto 在无 Mongo 配置时会因 MongoCollectionManager 空指针反复重启)。

6.1 配置 JVM 参数(三组件统一)

systemd 单元按 $JAVA_HOME/bin/java $JAVA_XMS $JAVA_XMX $JAVA_GC $JAVA_OTHER 启动,全部取自 environment.conf。为四个组件写入相同内容(演示环境下调堆内存):

root@sip3-server:~# for comp in captain salto twig; do
  cat > /etc/sip3-$comp/environment.conf <<'EOF'
JAVA_HOME=/opt/sip3-java
JAVA_XMS=-Xms256m
JAVA_XMX=-Xmx512m
JAVA_GC=-XX:+UseG1GC
EOF
done

6.2 激活 Salto 配置

Salto 需要显式声明数据接收端口、MongoDB、InfluxDB 与集合分片规则。注意 2026.2.1 的管理端口默认值为 15091(不是旧文档的 15090),该端口必须与 Captain 的 management.uri 一致(见 6.3):

root@sip3-server:~# cat > /etc/sip3-salto/application.yml <<'EOF'
#! Name
name: sip3-salto

#! Server
server:
  uri: udp://0.0.0.0:15060
  buffer_size: 65535

#! Management socket
management:
  uri: udp://0.0.0.0:15091
  expiration_delay: 60000
  expiration_timeout: 120000

#! MongoDB
mongo:
  uri: mongodb://127.0.0.1:27017
  db: sip3
  bulk_size: 1
  update_period: 300000
  collections:
    - prefix: attributes
      indexes:
        hashed: [name]
      max_collections: 30
    - prefix: sip_call_index
      indexes:
        ascending: [created_at, terminated_at, src_addr, dst_addr, caller, callee, state, error_code, duration]
        hashed: [call_id]
      max_collections: 30
    - prefix: sip_call_raw
      indexes:
        ascending: [created_at]
        hashed: [call_id]
      max_collections: 30
    - prefix: unknown_raw
      indexes:
        ascending: [created_at]
        hashed: [call_id]
      max_collections: 30

#! Metrics
metrics:
  influxdb:
    uri: http://127.0.0.1:8086
    db: sip3

#! Application
time_suffix: yyyyMMdd

sip:
  message:
    exclusions:
      - REGISTER
EOF

6.3 激活 Captain 抓包配置

把 dev 指向接收 SIP 流量的网卡(本文 eth0),BPF 过滤器只放行 SIP 端口;sender/management 指向本机 Salto(management 必须是 15091):

root@sip3-server:~# cat > /etc/sip3-captain/application.yml <<'EOF'
#! Name
name: sip3-captain

#! Pcap (libpcap, WinPcap, Npcap)
pcap:
  dev: eth0
  sll: false
  bpf_filter: udp and port 5060
  snaplen: 65535
  buffer_size: 2097152
  timeout_millis: 1

#! Sender
sender:
  uri: udp://127.0.0.1:15060
  reconnection_timeout: 1000

#! ManagementSocket
management:
  uri: udp://127.0.0.1:15091
  register_delay: 60000

#! Metrics
metrics:
  logging:
    step: 5000
EOF

Twig 的 /etc/sip3-twig/application.yml 默认已包含可用配置(8080 端口、/api 上下文、MongoDB 127.0.0.1:27017),无需修改。

6.4 配置 nginx(Hoof 界面)

Hoof 是静态前端,需要 nginx 反代 Twig API 与 Grafana。写入站点配置:

root@sip3-server:~# cat > /etc/nginx/conf.d/sip3-hoof.conf <<'EOF'
server {
    listen 80 default_server;
    server_name _;

    root /var/www/sip3-hoof;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /api/ {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /grafana/ {
        proxy_pass http://127.0.0.1:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
EOF
root@sip3-server:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@sip3-server:~# systemctl restart nginx

6.5 Grafana 管理密码

将 Grafana 管理账号密码改为本文统一演示口令:

root@sip3-server:~# grafana cli --homepath /usr/share/grafana admin reset-admin-password q1w2e3r4

七、启动与验证

7.1 启动三个 Java 服务

root@sip3-server:~# systemctl enable --now sip3-salto sip3-twig sip3-captain
root@sip3-server:~# systemctl is-active sip3-salto sip3-twig sip3-captain
active
active
active

7.2 端口核验

root@sip3-server:~# ss -lnutp | grep -E "15060|15091|8080|8086|27017|:80 " | awk '{print $1, $5}'
tcp   0.0.0.0:80
tcp   127.0.0.1:27017
udp   0.0.0.0:15060
udp   0.0.0.0:15091
tcp   *:8080
tcp   *:8086

7.3 JVM 参数核验

root@sip3-server:~# ps aux | grep "[j]ava" | grep -oE "^\S+\s+\S+.*-Xms\S+\s+-Xmx\S+" | head -3
sip3     /opt/sip3-java/bin/java -Xms256m -Xmx512m
sip3     /opt/sip3-java/bin/java -Xms256m -Xmx512m
sip3     /opt/sip3-java/bin/java -Xms256m -Xmx512m

7.4 注入 SIP 信令验证采集闭环

从话务侧主机(10.89.59.1)向服务器发一条 SIP INVITE(注意:在本机向本机地址发包走回环口,libpcap 的 eth0 抓不到,必须从外部主机发送):

root@pbx:~# python3 - <<'EOF'
import socket
msg = ("INVITE sip:1002@10.89.59.10 SIP/2.0\r\n"
"Via: SIP/2.0/UDP 10.89.59.1:5060;branch=z9hG4bK-test1\r\n"
"From: <sip:1001@10.89.59.1>;tag=abc123\r\n"
"To: <sip:1002@10.89.59.10>\r\n"
"Call-ID: test-call-001@10.89.59.1\r\n"
"CSeq: 1 INVITE\r\n"
"Contact: <sip:1001@10.89.59.1:5060>\r\n"
"Max-Forwards: 70\r\n"
"Content-Length: 0\r\n\r\n")
socket.socket(socket.AF_INET, socket.SOCK_DGRAM).sendto(msg.encode(), ("10.89.59.10", 5060))
EOF

约 10 秒后在 MongoDB 中确认呼叫被聚合:

root@sip3-server:~# mongosh --quiet sip3 --eval 'db.sip_call_index_20261026.find({}, {call_id:1, caller:1, callee:1, state:1}).limit(3).forEach(printjson)'
{
  _id: ObjectId('6adfefee918919586d5e87eb'),
  call_id: 'test-call-001@10.89.59.1',
  caller: '1001',
  callee: '1002',
  state: 'unknown'
}

集合名按日期分片(sip_call_index_20261026 等),Salto 在收到首条数据时自动创建。

7.5 访问界面与 API

入口地址说明
Hoof 界面http://10.89.59.10/呼叫搜索、呼叫流程图
Grafanahttp://10.89.59.10/grafana/服务指标仪表盘(admin / q1w2e3r4)
Twig OpenAPI 描述http://10.89.59.10/api/v3/api-docsREST API 元数据(实测返回 200)
Twig API(经 nginx)http://10.89.59.10/api/...与 8080 直连等价

八、常见问题

8.1 服务起不来,日志报 MongoCollectionManager 空指针

原因:apt 包默认的 /etc/sip3-salto/application.yml 全部处于注释状态,Mongo 段为空。按 6.2 写入激活配置后 systemctl restart sip3-salto。

8.2 Captain 抓不到包,MongoDB 无呼叫记录

依次排查三点:

  1. management 端口不匹配:2026.2.1 中 Salto 管理端口默认 15091,若 Captain 的 management.uri 仍写旧值 15090,Captain 只能打开数据通道而无法完成注册(实测现象:Sender 连接打开但无呼叫入库)。两侧必须一致。
  2. 流量走了回环口:在本机对本机 IP 发包走 lo,pcap.dev: eth0 抓不到。应从外部主机发送测试流量,或将 dev 改为 lo。
  3. BPF 过滤器:bpf_filter: udp and port 5060 只抓 5060 端口的 UDP;测试环境 SIP 端口不同时要同步调整。

8.3 jps 找不到

sip3-java 是裁剪版 JDK,不含 jps。核验 JVM 参数改用 ps aux | grep java。

8.4 influxdb deb 包安装失败

Ubuntu 22.04 上 influxdata 源的 influxdb 1.13.1 deb 包在最小化系统实测安装脚本报错。改按 5.2 的官方二进制方式部署 1.8.10。

8.5 集合索引未生成(引号写法坑)

若 6.2 配置里 collections 的 indexes 值写成带引号字符串(如 ascending: "[created_at, ...]"),Salto 会静默跳过建索引——getIndexes() 只剩 _id_,检索功能正常但数据量大后全表扫描。必须用 YAML 流式列表写法(ascending: [created_at, ...]),本文 6.2 已按正确写法给出。修复后 systemctl restart sip3-salto,索引会对已存在分片一并补建(实测验证),逐项含义见配置参数详解 3.3 与 10.6。

九、参考链接