树莓派 3B+ 部署 TR-069 ACS(自动配置服务器)GenieACS 实录

树莓派 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 密钥有效期,定期轮换。
  • 监控:安装 vnstatprometheus-node-exporter 或使用 htop + vcgencmd measure_temp

12. 测试与监控

  • UI 访问:http://<Pi-IP>:3000(初始化向导全部勾选 → ABRACADABRA!)

    初始化向导说明

    这个向导会帮您设置初始配置,各个选项的含义:

    1. Users, roles and permissions - 创建默认用户、角色和权限
    2. Presets and provisions - 创建设备预设和配置模板
    3. Devices predefined search filters - 创建设备搜索过滤器
    4. Device details page - 创建设备详情页视图
    5. Devices listing page - 创建设备列表页视图
    6. Overview page - 创建仪表盘概览页

    完整配置

    • 全部勾选,点击 "ABRACADABRA!"

    使用默认admin/admin登录

  • CPE Connection Request URL:http://<Pi-IP>:7547/

  • 监控命令:

    bash 复制代码
    htop
    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 发送通知)。
相关推荐
扫地生大鹏2 小时前
阿里云大模型服务器安装SNMP包启发
运维·服务器
2601_949613022 小时前
flutter_for_openharmony家庭药箱管理app实战+用药提醒列表实现
服务器·前端·flutter
今晚打佬虎2 小时前
精准阻断 Docker 容器映射端口:流量路径诊断与 iptables 配置
运维·docker·容器
honsor2 小时前
机房/档案室专用以太网温湿度传感器:智能监控赋能环境安全
运维·网络·物联网·安全
小白郭莫搞科技2 小时前
鸿蒙跨端框架Flutter学习:ListView卡片样式详解
linux·服务器·windows
晚风吹长发2 小时前
初步了解Linux中的信号捕捉
linux·运维·服务器·c++·算法·进程·x信号
码农学院2 小时前
Windows 服务中获取本机的 IP 地址
网络·网络协议·tcp/ip
herinspace2 小时前
管家婆分销软件中如何进行现金流量分配
运维·服务器·数据库·学习·电脑
(Charon)3 小时前
【网络编程】从零开始理解 io_uring:Linux 网络编程的“核动力”引擎
linux·运维·服务器