树莓派 3B+ 部署 TR-069 ACS(自动配置服务器)GenieACS 实录**
手头有一个吃灰的树莓派 3B+,部署GenieACS,作为测试服务器使用。
适用场景 :低负载测试环境(≤30 台 CPE)。不适合生产环境(数百台以上)。
硬件关键限制:
- RAM 仅 1GB:GenieACS + MongoDB 4.4 + Redis + Node.js 总占用易超 800MB → 极易 OOM。
- CPU 单核性能一般,满载易过热。
- microSD 卡磨损严重 → 必须使用外接 USB SSD。
- MongoDB 5.0+ 需要 ARMv8.2-A 指令集,Pi 3B+ 不支持 → 唯一稳定方案:Docker + MongoDB 4.4.18。
- 电源:必须官方 5V/3A+ 适配器 + 散热片 + 风扇(温度控制在 <80°C)。
系统信息验证示例:
bash
cat /etc/os-release # Debian GNU/Linux 12 (bookworm)
uname -m # aarch64
1. 系统准备
1.1下载并刷写镜像:
-
下载官方 Raspberry Pi OS (64-bit) Bookworm Lite(推荐 Lite 版,节省资源):
https://www.raspberrypi.com/software/
2025-11-24-raspios-bookworm-arm64-lite.img.xz
-
使用 Raspberry Pi Imager 烧录:
- 选择 OS → Raspberry Pi OS (64-bit) → Lite 版。
- 高级设置(齿轮图标):
- 设置主机名(如
pi-acs)。 - 启用 SSH(使用密码认证)。
- 设置用户名/密码(默认 pi/raspberry,建议修改)。
- 配置 WiFi(SSID + 密码)。
- 区域设置(语言/时区:zh_CN.UTF-8 / Asia/Shanghai)。
- 设置主机名(如
- 烧录完成后插入 SD 卡,开机即可通过 WiFi SSH 访问(
ssh pi@pi-acs.local或 IP)。
写入:因为使用的系统是win7,故写入使用树莓派镜像烧录器V1.7.5


1.2 SSH连接
因为烧录前已经配置了连接wifi,ssh访问使能等。插入SD卡,启动树莓派连接显示器即可看到WIFI的ip,使用SSH连接。也可以使用ip扫描工具扫描获取。
扫描IP:

SSH连接,

1.3更新系统与基础工具
bash
sudo apt update && sudo apt full-upgrade -y
sudo apt install -y curl htop iotop logrotate ufw nano vim git docker.io docker-compose
sudo usermod -aG docker $USER # 需重新登录生效
sudo reboot
2. 配置交换空间(强烈推荐 1GB)
bash
sudo swapoff -a && sudo rm -f /swapfile
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo swapon --show && free -h
#显示如下
NAME TYPE SIZE USED PRIO
/swapfile file 1024M 0B -2
total used free shared buff/cache available
Mem: 906Mi 167Mi 591Mi 3.3Mi 200Mi 739Mi
Swap: 1.0Gi 0B 1.0Gi
3. 存储优化(必须)
- 优先使用 USB SSD 作为根分区(刷镜像时选择)。
- 启用 TRIM:
bash
sudo systemctl enable fstrim.timer
4. 安装 Node.js 18.x LTS(GenieACS 推荐)
bash
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
node -v # 应显示 v18.x v18.20.8
npm -v # 应显示 ~10.x 10.8.2
5. 安装 MongoDB(Docker + 4.4.18,唯一稳定方案)
确保你的系统已安装(前面已经安装):
- Docker
- Docker Compose
检查安装:
bash
docker --version
docker-compose --version
#输出如下:
Docker version 20.10.24+dfsg1, build 297e128
docker-compose version 1.29.2, build unknown
配置国内源:
bash
# 配置国内 Docker 镜像加速(强烈推荐,加速拉取)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://mirror.ccs.tencentyun.com",
"https://registry.docker-cn.com"
]
}
EOF
重启 Docker 服务(必须操作,否则 daemon.json 不生效):
bash
sudo systemctl restart docker
检查镜像加速是否生效:
bash
docker info | grep -A 10 "Registry Mirrors"
#输出
WARNING: No memory limit support
WARNING: No swap limit support
Registry Mirrors:
https://docker.m.daocloud.io/
https://mirror.ccs.tencentyun.com/
https://registry.docker-cn.com/
Live Restore Enabled: false
推荐使用 docker-compose(便于管理、健康检查、数据持久化):
创建 docker-compose.yml:
bash
# 创建 docker-compose.yml 文件
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
mongodb:
image: mongo:4.4.18
container_name: mongodb
restart: unless-stopped
ports:
- "27017:27017"
volumes:
- ./mongodb_data:/data/db
command: mongod --wiredTigerCacheSizeGB 0.25 # 限制内存使用
healthcheck:
test: ["CMD", "mongo", "--eval", "db.adminCommand({ping:1})"]
interval: 10s
timeout: 5s
retries: 5
EOF
启动:
bash
mkdir -p ~/mongodb_data
docker-compose up -d
docker ps | grep mongodb
docker exec -it mongodb mongo --eval "db.adminCommand({ping:1})" # 应返回 { "ok" : 1 }
#返回信息
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("ea92330d-4093-4268-b4d0-ef82e80a8463") }
MongoDB server version: 4.4.18
{ "ok" : 1 }
6. 安装并优化 Redis(128MB 内存限制)
bash
sudo apt install -y redis-server
sudo systemctl enable --now redis-server
sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.backup
sudo tee /etc/redis/redis.conf <<EOF
bind 127.0.0.1
port 6379
daemonize yes
supervised systemd
maxmemory 128mb
maxmemory-policy allkeys-lru
save ""
appendonly no
tcp-keepalive 60
timeout 0
maxclients 100
loglevel notice
logfile /var/log/redis/redis.log
EOF
sudo mkdir -p /var/log/redis && sudo chown redis:redis /var/log/redis
sudo systemctl restart redis-server
redis-cli ping # 应返回 PONG
redis-cli info memory | grep used_memory_human
7. 安装 GenieACS(固定版本 1.2.13,避免最新版不稳定)
bash
sudo npm install -g genieacs@1.2.13
npm list -g | grep genieacs
which genieacs-cwmp genieacs-fs genieacs-nbi genieacs-ui
#输出
/usr/bin/genieacs-cwmp
/usr/bin/genieacs-fs
/usr/bin/genieacs-nbi
/usr/bin/genieacs-ui
8. 创建专用用户与目录
bash
sudo useradd -r -s /bin/false genieacs
sudo mkdir -p /opt/genieacs/{config,logs,uploads,backups}
sudo chown -R genieacs:genieacs /opt/genieacs
sudo chmod 750 /opt/genieacs/config
sudo chmod 755 /opt/genieacs/{logs,uploads,backups}
# 验证目录结构
ls -la /opt/genieacs/
#输出
total 24
drwxr-xr-x 6 genieacs genieacs 4096 Jan 28 12:14 .
drwxr-xr-x 4 root root 4096 Jan 28 12:14 ..
drwxr-xr-x 2 genieacs genieacs 4096 Jan 28 12:14 backups
drwxr-x--- 2 genieacs genieacs 4096 Jan 28 12:14 config
drwxr-xr-x 2 genieacs genieacs 4096 Jan 28 12:14 logs
drwxr-xr-x 2 genieacs genieacs 4096 Jan 28 12:14 uploads
9. 环境变量文件(/opt/genieacs/genieacs.env)
bash
GENIEACS_UI_JWT_SECRET=$(openssl rand -hex 32)
sudo tee /opt/genieacs/genieacs.env <<EOF
MONGODB_CONNECTION_URL=mongodb://127.0.0.1:27017/genieacs
REDIS_URL=redis://127.0.0.1:6379/0
CWMP_PORT=7547
FS_PORT=7567
NBI_PORT=7557
UI_PORT=3000
GENIEACS_UI_JWT_SECRET=$GENIEACS_UI_JWT_SECRET
DEBUG=genieacs:*
CWMP_WORKER_PROCESSES=1 # 限制并发,适合 Pi 3B+
EOF
sudo chown genieacs:genieacs /opt/genieacs/genieacs.env
sudo chmod 600 /opt/genieacs/genieacs.env
10. Systemd 服务文件
10.1 genieacs-cwmp.service (核心 CWMP 服务)
ini
sudo tee /etc/systemd/system/genieacs-cwmp.service << 'EOF'
[Unit]
Description=GenieACS CWMP Server
After=network.target docker.service redis-server.service
Requires=docker.service redis-server.service
[Service]
Type=simple
User=genieacs
Group=genieacs
EnvironmentFile=/opt/genieacs/genieacs.env
WorkingDirectory=/opt/genieacs
ExecStart=/usr/bin/genieacs-cwmp
Restart=on-failure
RestartSec=10
MemoryMax=300M
MemorySwapMax=500M
CPUQuota=80%
[Install]
WantedBy=multi-user.target
EOF
10.2 genieacs-fs.service (文件服务)
bash
sudo tee /etc/systemd/system/genieacs-fs.service << 'EOF'
[Unit]
Description=GenieACS FS Server
After=network.target docker.service redis-server.service
Requires=docker.service redis-server.service
[Service]
Type=simple
User=genieacs
Group=genieacs
EnvironmentFile=/opt/genieacs/genieacs.env
WorkingDirectory=/opt/genieacs
ExecStart=/usr/bin/genieacs-fs
Restart=on-failure
RestartSec=10
MemoryMax=250M
MemorySwapMax=400M
CPUQuota=60%
[Install]
WantedBy=multi-user.target
EOF
10.3 genieacs-nbi.service (北向接口服务)
bash
sudo tee /etc/systemd/system/genieacs-nbi.service << 'EOF'
[Unit]
Description=GenieACS NBI Server
After=network.target docker.service redis-server.service
Requires=docker.service redis-server.service
[Service]
Type=simple
User=genieacs
Group=genieacs
EnvironmentFile=/opt/genieacs/genieacs.env
WorkingDirectory=/opt/genieacs
ExecStart=/usr/bin/genieacs-nbi
Restart=on-failure
RestartSec=10
MemoryMax=300M
MemorySwapMax=500M
CPUQuota=70%
[Install]
WantedBy=multi-user.target
EOF
10.4 genieacs-ui.service (Web UI 服务)
bash
sudo tee /etc/systemd/system/genieacs-ui.service << 'EOF'
[Unit]
Description=GenieACS UI Server
After=network.target docker.service redis-server.service
Requires=docker.service redis-server.service
[Service]
Type=simple
User=genieacs
Group=genieacs
EnvironmentFile=/opt/genieacs/genieacs.env
WorkingDirectory=/opt/genieacs
ExecStart=/usr/bin/genieacs-ui
Restart=on-failure
RestartSec=10
MemoryMax=200M
MemorySwapMax=300M
CPUQuota=50%
[Install]
WantedBy=multi-user.target
EOF
10.5 加载并启动所有服务(推荐顺序)
加载并启动:
bash
# 重新加载 systemd
sudo systemctl daemon-reload
# 启用开机自启
sudo systemctl enable genieacs-cwmp.service genieacs-fs.service genieacs-nbi.service genieacs-ui.service
# 启动服务
sudo systemctl start genieacs-cwmp.service genieacs-fs.service genieacs-nbi.service genieacs-ui.service
10.6 检查状态(推荐执行)
bash
sudo systemctl status genieacs-cwmp genieacs-fs genieacs-nbi genieacs-ui
#或者一次性查看
sudo systemctl status genieacs-*.service
11. 防火墙与安全
bash
sudo ufw allow 7547/tcp # CWMP
sudo ufw allow 7567/tcp # FS
sudo ufw allow 7557/tcp # NBI
sudo ufw allow 3000/tcp # UI(生产环境建议关闭或加 HTTPS)
sudo ufw allow 22/tcp # SSH
sudo ufw enable
安全建议:
- 立即修改 UI 默认密码(admin/admin)。
- 生产环境启用 HTTPS(Nginx 反向代理 + Let's Encrypt)。
- 限制 JWT 密钥有效期,定期轮换。
- 监控:安装
vnstat、prometheus-node-exporter或使用htop+vcgencmd measure_temp。
12. 测试与监控
-
UI 访问:
http://<Pi-IP>:3000(初始化向导全部勾选 → ABRACADABRA!)
初始化向导说明
这个向导会帮您设置初始配置,各个选项的含义:
- Users, roles and permissions - 创建默认用户、角色和权限
- Presets and provisions - 创建设备预设和配置模板
- Devices predefined search filters - 创建设备搜索过滤器
- Device details page - 创建设备详情页视图
- Devices listing page - 创建设备列表页视图
- Overview page - 创建仪表盘概览页
完整配置
- 全部勾选,点击 "ABRACADABRA!"
使用默认admin/admin登录

-
CPE Connection Request URL:
http://<Pi-IP>:7547/ -
监控命令:
bashhtop docker stats mongodb sudo journalctl -u genieacs-* -f watch -n 5 vcgencmd measure_temp # 监控温度 free -h && docker exec mongodb mongo --eval "db.stats()"
性能提示:
- 内存紧张时可临时停止 UI 服务:
sudo systemctl stop genieacs-ui。 - 定期重启:
sudo reboot(避免内存泄漏)。 - 监控日志:
/opt/genieacs/logs、/var/log/redis、/var/log/syslog。
已验证:该方案在 Pi 3B+ 上低负载稳定运行。如遇问题,请提供具体错误日志(journalctl / docker logs)。
额外推荐:
- 使用 Docker Compose 统一管理服务(GenieACS 也可容器化)。
- 添加温度报警脚本(超过 80°C 发送通知)。