废旧 MacBook 改造家庭 AI 网关:OpenClaw + 内网穿透

废旧 MacBook 可以改造为一个功能强大的家庭 AI 网关,集成 OpenClaw 本地 AI 服务和内网穿透功能,实现外网访问家庭 AI 服务。本文将详细介绍如何部署和配置这套系统。

一、系统架构

1.1 整体架构

外部设备

家庭网络

废旧 MacBook AI 网关

OpenClaw AI 服务

frp 内网穿透

Home Assistant 智能家居

Nextcloud 私有云

Nginx 反向代理

frp 服务器

外网访问

AI 对话

智能问答

代码生成

灯光控制

温湿度监控

安防监控

文件存储

照片备份

文档共享

SSL 证书

负载均衡

安全防护

移动设备

办公电脑

其他设备

1.2 硬件配置

组件 规格 用途
CPU Intel i5-5257U @ 2.7GHz 运行多个服务
内存 8GB DDR3L 1600MHz 多服务并发
存储 256GB SSD 系统和数据
网络 Wi-Fi + 有线 网络连接
外置存储 2TB+ 硬盘 媒体文件存储

1.3 软件栈

服务 版本 用途
Ubuntu 22.04 LTS 操作系统
Docker 最新版本 容器运行时
Docker Compose 最新版本 容器编排
OpenClaw 最新版本 AI 服务
frp 最新版本 内网穿透
Home Assistant 最新版本 智能家居
Nextcloud 最新版本 私有云
Nginx 最新版本 反向代理
Portainer 最新版本 容器管理

二、系统准备

2.1 安装 Ubuntu

# 下载 Ubuntu 22.04 LTS
wget https://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso

# 制作启动盘
sudo dd if=ubuntu-22.04.3-desktop-amd64.iso of=/dev/sdX bs=4M

# 安装 Ubuntu Server
# 按照安装向导完成安装

2.2 配置网络

# 编辑网络配置
sudo vim /etc/netplan/00-installer-config.yaml

网络配置示例:

network:
  ethernets:
    enx00e04c123456:
      dhcp4: yes
      optional: true
  version: 2

应用网络配置:

sudo netplan apply

2.3 安装 Docker

# 安装 Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker

# 将当前用户添加到 docker 组
sudo usermod -aG docker $USER

三、OpenClaw 部署

3.1 创建工作目录

# 创建工作目录
mkdir -p /opt/home-ai
cd /opt/home-ai

# 创建数据目录
mkdir -p /data/openclaw
mkdir -p /data/homeassistant
mkdir -p /data/nextcloud
mkdir -p /data/nginx
mkdir -p /data/portainer

3.2 创建 docker-compose.yml

vim docker-compose.yml

docker-compose.yml 内容:

version: '3'

services:
  # OpenClaw AI 服务
  openclaw:
    image: openclaw/openclaw:latest
    container_name: openclaw
    restart: always
    ports:
      - "8080:8080"
    volumes:
      - /data/openclaw:/data
      - ./openclaw/.env:/app/.env
    environment:
      - DB_HOST=postgres
      - REDIS_HOST=redis
    depends_on:
      - postgres
      - redis
    networks:
      - home-ai-net

  # PostgreSQL 数据库
  postgres:
    image: postgres:14
    container_name: openclaw-postgres
    restart: always
    volumes:
      - /data/openclaw/postgres:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=openclaw
      - POSTGRES_USER=openclaw
      - POSTGRES_PASSWORD=openclaw123
    networks:
      - home-ai-net

  # Redis 缓存
  redis:
    image: redis:7-alpine
    container_name: openclaw-redis
    restart: always
    volumes:
      - /data/openclaw/redis:/data
    networks:
      - home-ai-net

  # Home Assistant 智能家居
  homeassistant:
    image: homeassistant/home-assistant:latest
    container_name: homeassistant
    restart: always
    ports:
      - "8123:8123"
    volumes:
      - /data/homeassistant:/config
    environment:
      - TZ=Asia/Shanghai
    networks:
      - home-ai-net

  # Nextcloud 私有云
  nextcloud:
    image: nextcloud:latest
    container_name: nextcloud
    restart: always
    ports:
      - "8081:80"
    volumes:
      - /data/nextcloud:/var/www/html
    environment:
      - TZ=Asia/Shanghai
    networks:
      - home-ai-net

  # Nginx 反向代理
  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /data/nginx/nginx.conf:/etc/nginx/nginx.conf
      - /data/nginx/ssl:/etc/nginx/ssl
      - /data/nginx/conf.d:/etc/nginx/conf.d
    networks:
      - home-ai-net

  # frp 客户端
  frpc:
    image: snowdreamtech/frpc:latest
    container_name: frpc
    restart: always
    volumes:
      - ./frpc/frpc.ini:/etc/frp/frpc.ini
    networks:
      - home-ai-net

  # Portainer 容器管理
  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    restart: always
    ports:
      - "9000:9000"
    volumes:
      - /data/portainer:/data
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - home-ai-net

networks:
  home-ai-net:
    driver: bridge

3.3 配置 OpenClaw

# 创建 OpenClaw 配置目录
mkdir -p openclaw

# 复制配置文件
cp .env.example openclaw/.env

# 编辑配置文件
vim openclaw/.env

OpenClaw 配置示例:

# OpenClaw 配置
OPENCLAW_PORT=8080
OPENCLAW_HOST=0.0.0.0

# 数据库配置
DB_HOST=postgres
DB_PORT=5432
DB_NAME=openclaw
DB_USER=openclaw
DB_PASSWORD=openclaw123

# Redis 配置
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=

# AI 模型配置
AI_MODEL_PATH=/data/openclaw/models
AI_MODEL_TYPE=llama

# 数据存储
DATA_PATH=/data/openclaw

# 日志配置
LOG_LEVEL=info
LOG_PATH=/var/log/openclaw

四、frp 内网穿透配置

4.1 配置 frp 服务端

# 创建 frp 配置目录
mkdir -p frps

# 创建配置文件
vim frps/frps.ini

frp 服务端配置:

[common]
bind_port = 7000
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin123
token = your-token
max_pool_count = 5

4.2 配置 frp 客户端

# 创建 frp 客户端配置
vim frpc/frpc.ini

frp 客户端配置:

[common]
server_addr = your-server-ip
server_port = 7000
token = your-token

[openclaw]
type = http
local_ip = 192.168.1.100
local_port = 8080
custom_domains = openclaw.yourdomain.com

[homeassistant]
type = http
local_ip = 192.168.1.100
local_port = 8123
custom_domains = home.yourdomain.com

[nextcloud]
type = http
local_ip = 192.168.1.100
local_port = 8081
custom_domains = cloud.yourdomain.com

[portainer]
type = http
local_ip = 192.168.1.100
local_port = 9000
custom_domains = portainer.yourdomain.com

4.3 启动 frp 服务

# 启动 frp 客户端
docker-compose up -d frpc

# 查看 frp 日志
docker-compose logs -f frpc

五、Nginx 反向代理配置

5.1 配置 Nginx

# 创建 Nginx 配置目录
mkdir -p /data/nginx/conf.d

# 创建主配置文件
vim /data/nginx/nginx.conf

Nginx 主配置文件:

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/conf.d/*.conf;
}

5.2 配置反向代理

# 创建 OpenClaw 反向代理配置
vim /data/nginx/conf.d/openclaw.conf

OpenClaw 反向代理配置:

upstream openclaw {
    server openclaw:8080;
}

server {
    listen 80;
    server_name openclaw.yourdomain.com;

    location / {
        proxy_pass http://openclaw;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

创建 Home Assistant 反向代理配置:

vim /data/nginx/conf.d/homeassistant.conf

Home Assistant 反向代理配置:

upstream homeassistant {
    server homeassistant:8123;
}

server {
    listen 80;
    server_name home.yourdomain.com;

    location / {
        proxy_pass http://homeassistant;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

六、家庭 AI 网关工作流程

为了确保家庭 AI 网关稳定运行,我们需要建立一套完整的工作流程。以下是家庭 AI 网关的工作流程图:

正常

异常

运行中

未运行

运行中

未运行

运行中

未运行

运行中

未运行

运行中

未运行

正常

CPU 高

内存高

磁盘高

开始工作流程

检查网络连接

检查 OpenClaw 服务

检查网络配置

网络配置正确?

重启网络服务

修改网络配置

网络恢复?

检查物理连接

物理连接正常?

检查路由器

更换网线

检查 frp 服务

启动 OpenClaw

启动成功?

检查 OpenClaw 配置

重启 OpenClaw

检查 Home Assistant

启动 frp

启动成功?

检查 frp 配置

重启 frp

检查 Nextcloud

启动 Home Assistant

启动成功?

检查 Home Assistant 配置

重启 Home Assistant

检查 Nginx

启动 Nextcloud

启动成功?

检查 Nextcloud 配置

重启 Nextcloud

检查系统资源

启动 Nginx

启动成功?

检查 Nginx 配置

重启 Nginx

工作流程完成

优化 CPU

优化内存

清理磁盘

优化成功?

限制资源

优化成功?

重启服务

清理成功?

扩容存储

记录工作日志

生成状态报告

结束

6.1 创建工作流程脚本

#!/bin/bash

LOG_FILE="/var/log/home-ai-gateway.log"
ALERT_EMAIL="admin@example.com"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}

send_alert() {
    local subject=$1
    local message=$2
    echo "$message" | mail -s "$subject" $ALERT_EMAIL
}

check_network() {
    log "Checking network connection..."
    ping -c 4 8.8.8.8 > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        log "Network connection is normal"
        return 0
    else
        log "Network connection failed"
        return 1
    fi
}

check_openclaw() {
    log "Checking OpenClaw service..."
    cd /opt/home-ai
    if docker-compose ps | grep -q "openclaw.*Up"; then
        log "OpenClaw service is running"
        return 0
    else
        log "OpenClaw service is not running"
        return 1
    fi
}

check_frp() {
    log "Checking frp service..."
    cd /opt/home-ai
    if docker-compose ps | grep -q "frpc.*Up"; then
        log "frp service is running"
        return 0
    else
        log "frp service is not running"
        return 1
    fi
}

check_homeassistant() {
    log "Checking Home Assistant service..."
    cd /opt/home-ai
    if docker-compose ps | grep -q "homeassistant.*Up"; then
        log "Home Assistant service is running"
        return 0
    else
        log "Home Assistant service is not running"
        return 1
    fi
}

check_nextcloud() {
    log "Checking Nextcloud service..."
    cd /opt/home-ai
    if docker-compose ps | grep -q "nextcloud.*Up"; then
        log "Nextcloud service is running"
        return 0
    else
        log "Nextcloud service is not running"
        return 1
    fi
}

check_nginx() {
    log "Checking Nginx service..."
    cd /opt/home-ai
    if docker-compose ps | grep -q "nginx.*Up"; then
        log "Nginx service is running"
        return 0
    else
        log "Nginx service is not running"
        return 1
    fi
}

check_system_resources() {
    log "Checking system resources..."
    
    # 检查 CPU 使用率
    local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
    log "CPU Usage: ${cpu_usage}%"
    
    if (( $(echo "$cpu_usage > 80" | bc -l) )); then
        log "High CPU usage detected: ${cpu_usage}%"
        send_alert "High CPU Usage" "CPU usage is ${cpu_usage}% on MacBook"
    fi
    
    # 检查内存使用率
    local mem_usage=$(free | grep Mem | awk '{printf("%.0f"), $3/$2 * 100.0}')
    log "Memory Usage: ${mem_usage}%"
    
    if [ $mem_usage -gt 80 ]; then
        log "High memory usage detected: ${mem_usage}%"
        sync && echo 3 > /proc/sys/vm/drop_caches
        send_alert "High Memory Usage" "Memory usage is ${mem_usage}% on MacBook"
    fi
    
    # 检查磁盘使用率
    local disk_usage=$(df -h /data | tail -1 | awk '{print $5}' | cut -d'%' -f1)
    log "Disk Usage: ${disk_usage}%"
    
    if [ $disk_usage -gt 80 ]; then
        log "High disk usage detected: ${disk_usage}%"
        docker system prune -f
        send_alert "High Disk Usage" "Disk usage is ${disk_usage}% on MacBook"
    fi
}

restart_openclaw() {
    log "Restarting OpenClaw service..."
    cd /opt/home-ai
    docker-compose restart openclaw
    sleep 30
    
    if check_openclaw; then
        log "OpenClaw service restarted successfully"
        return 0
    else
        log "Failed to restart OpenClaw service"
        return 1
    fi
}

restart_frp() {
    log "Restarting frp service..."
    cd /opt/home-ai
    docker-compose restart frpc
    sleep 10
    
    if check_frp; then
        log "frp service restarted successfully"
        return 0
    else
        log "Failed to restart frp service"
        return 1
    fi
}

restart_homeassistant() {
    log "Restarting Home Assistant service..."
    cd /opt/home-ai
    docker-compose restart homeassistant
    sleep 30
    
    if check_homeassistant; then
        log "Home Assistant service restarted successfully"
        return 0
    else
        log "Failed to restart Home Assistant service"
        return 1
    fi
}

restart_nextcloud() {
    log "Restarting Nextcloud service..."
    cd /opt/home-ai
    docker-compose restart nextcloud
    sleep 30
    
    if check_nextcloud; then
        log "Nextcloud service restarted successfully"
        return 0
    else
        log "Failed to restart Nextcloud service"
        return 1
    fi
}

restart_nginx() {
    log "Restarting Nginx service..."
    cd /opt/home-ai
    docker-compose restart nginx
    sleep 10
    
    if check_nginx; then
        log "Nginx service restarted successfully"
        return 0
    else
        log "Failed to restart Nginx service"
        return 1
    fi
}

main() {
    log "=== Home AI Gateway Workflow Started ==="
    
    check_network
    if [ $? -ne 0 ]; then
        log "Network check failed, attempting to fix..."
        sudo systemctl restart networking
        sleep 10
        check_network
    fi
    
    check_openclaw
    if [ $? -ne 0 ]; then
        log "OpenClaw check failed, restarting..."
        restart_openclaw
    fi
    
    check_frp
    if [ $? -ne 0 ]; then
        log "frp check failed, restarting..."
        restart_frp
    fi
    
    check_homeassistant
    if [ $? -ne 0 ]; then
        log "Home Assistant check failed, restarting..."
        restart_homeassistant
    fi
    
    check_nextcloud
    if [ $? -ne 0 ]; then
        log "Nextcloud check failed, restarting..."
        restart_nextcloud
    fi
    
    check_nginx
    if [ $? -ne 0 ]; then
        log "Nginx check failed, restarting..."
        restart_nginx
    fi
    
    check_system_resources
    
    log "=== Home AI Gateway Workflow Completed ==="
}

main

添加执行权限:

sudo chmod +x /usr/local/bin/home-ai-gateway.sh

配置定时任务:

crontab -e

# 添加每 10 分钟执行一次工作流程
*/10 * * * * /usr/local/bin/home-ai-gateway.sh

七、启动所有服务

7.1 启动服务

# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f

7.2 验证服务

# 验证 OpenClaw
curl http://localhost:8080/api/health

# 验证 Home Assistant
curl http://localhost:8123

# 验证 Nextcloud
curl http://localhost:8081

# 验证 Portainer
curl http://localhost:9000

八、总结

通过以上步骤,我们成功将废旧 MacBook 改造为家庭 AI 网关,集成 OpenClaw 和内网穿透功能。

8.1 主要功能

  1. AI 服务:OpenClaw 提供智能对话服务
  2. 内网穿透:frp 实现外网访问
  3. 智能家居:Home Assistant 控制智能设备
  4. 私有云:Nextcloud 提供文件存储和共享
  5. 反向代理:Nginx 提供负载均衡和安全防护
  6. 容器管理:Portainer 提供容器管理界面

8.2 使用场景

场景 使用服务 功能描述
外网 AI 对话 OpenClaw + frp 随时随地使用 AI
智能家居控制 Home Assistant + frp 远程控制家庭设备
文件访问 Nextcloud + frp 外网访问家庭文件
系统管理 Portainer + frp 远程管理容器
家庭监控 Home Assistant + frp 远程查看家庭状态

8.3 优化建议

  1. 性能优化:根据实际使用情况调整资源配置
  2. 安全加固:配置防火墙、SSL 证书、访问控制
  3. 备份策略:定期备份重要数据和配置
  4. 监控告警:配置系统监控和告警机制
  5. 自动化:配置自动化任务和场景

8.4 后续扩展

可以进一步扩展功能:

  • 添加更多 AI 模型
  • 集成更多智能家居设备
  • 添加更多媒体服务
  • 添加更多自动化场景
  • 添加语音控制功能

希望这篇教程能帮助大家成功将废旧 MacBook 改造为家庭 AI 网关!

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐