Azure部署OpenHands指南

前言

在现代软件开发中,自动化和智能化工具的使用变得越来越重要。OpenHands 是一个强大的工具,可以帮助开发者快速部署和管理项目。本指南将详细介绍如何在 Azure 上部署 OpenHands,包括安装 Docker 和 Docker Compose,配置 Azure 的 GPT-4o API 接口,并将服务映射到外网的 80 端口。


步骤 1: 在 Azure 上创建虚拟机

  1. 登录 Azure 门户
  2. 创建一个新的虚拟机,选择以下配置:
    • 操作系统: Ubuntu 20.04 LTS
    • 大小: 至少 2 核 CPU 和 4GB 内存
    • 网络: 确保启用了 HTTP 和 HTTPS 端口。
  3. 启动虚拟机并通过 SSH 连接到它。
ssh azureuser@your-vm-ip

步骤 2: 安装 Docker 和 Docker Compose

在虚拟机中运行以下命令以安装 Docker 和 Docker Compose:

  1. 安装 Docker
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
  1. 安装 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -oP '"tag_name": "\K[^"]+')/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
  1. 验证安装:
docker --version
docker-compose --version
  1. (Optional) 创建 docker 用户组并加入当前用户,上一步验证失败时运行
sudo usermod -aG docker $USER
newgrp docker
sudo systemctl restart docker

步骤 3: 部署 OpenHands

  1. 拉取 OpenHands 镜像文件:
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.25-nikolaik
  1. 启动 OpenHands 服务:
  • Option-1: WSL/Power Shell运行命令:
docker run -it --rm --pull=always \
    -e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.27-nikolaik \
    -e LOG_ALL_EVENTS=true \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v ~/.openhands-state:/.openhands-state \
    -p 80:3000 \
    --add-host host.docker.internal:host-gateway \
    --name openhands-app \
    docker.all-hands.dev/all-hands-ai/openhands:0.27
  • Option-2: 创建docker-compose.yaml文件,并在同目录下运行docker-compose up启动服务. yaml文件内容:
services:
  openhands-app:
    image: docker.all-hands.dev/all-hands-ai/openhands:0.27
    container_name: openhands-app
    environment:
      SANDBOX_RUNTIME_CONTAINER_IMAGE: docker.all-hands.dev/all-hands-ai/runtime:0.27-nikolaik
      LOG_ALL_EVENTS: "true"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ~/.openhands-state:/.openhands-state
    ports:
      - "80:3000"
    extra_hosts:
      - "host.docker.internal:host-gateway"
    tty: true
    stdin_open: true
    restart: "no"
  • Option-3:如需挂载本地文件系统,使用如下docker-compose.yaml文件,并在同目录下运行docker-compose up启动服务即可. yaml文件内容:
services:
  openhands-app:
    image: docker.all-hands.dev/all-hands-ai/openhands:0.25
    container_name: openhands-app
    environment:
      SANDBOX_RUNTIME_CONTAINER_IMAGE: docker.all-hands.dev/all-hands-ai/runtime:0.27-nikolaik
      LOG_ALL_EVENTS: "true"
      SANDBOX_USER_ID: "polly"
      WORKSPACE_MOUNT_PATH: D:\docker_workspace\OpenHands\StartExperiencesApp
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ~/.openhands-state:/.openhands-state
      - D:\docker_workspace\OpenHands\StartExperiencesApp:/opt/workspace_base
    ports:
      - "80:3000"
    extra_hosts:
      - "host.docker.internal:host-gateway"
    tty: true
    stdin_open: true
    restart: "no"
OpenHands 一键安装脚本 (点击展开)
#!/bin/bash
# filepath: install_openhands.sh

# 打印彩色标题
print_title() {
  echo -e "\e[1;36m==================================================\e[0m"
  echo -e "\e[1;36m $1 \e[0m"
  echo -e "\e[1;36m==================================================\e[0m"
}

# 检查脚本是否以root运行
if [ "$(id -u)" -eq 0 ]; then
  echo "警告: 不建议以root用户运行此脚本。请使用普通用户并配合sudo权限。"
  read -p "是否继续? (y/n) " -n 1 -r
  echo
  if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    exit 1
  fi
fi

# 1. 安装Docker
print_title "1. 安装Docker"
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

# 2. 安装Docker Compose
print_title "2. 安装Docker Compose"
DOCKER_COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep -oP '"tag_name": "\K[^"]+')
echo "安装Docker Compose版本: $DOCKER_COMPOSE_VERSION"
sudo curl -L "https://github.com/docker/compose/releases/download/$DOCKER_COMPOSE_VERSION/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 3. 将当前用户添加到docker组
print_title "3. 配置Docker权限"
sudo usermod -aG docker $USER
echo "已将当前用户添加到docker组,这可能需要重新登录才能生效"

# 即时生效权限的几种方法
print_title "3.1 使Docker权限即时生效"
echo "使用newgrp命令获取新的docker组权限"
if [ -z "$SUDO_USER" ]; then
  # 直接以普通用户运行脚本的情况
  exec sg docker -c "bash -c \"
  echo '✅ 已成功切换到docker组环境';
  docker --version;
  \""
else
  # 通过sudo运行脚本的情况
  echo "脚本通过sudo运行,请在脚本完成后重新登录或执行 'newgrp docker' 以应用权限"
fi

# 4. 验证安装
print_title "4. 验证Docker安装"
docker --version || echo "Docker安装可能有问题,请退出并重新登录后再验证"
docker-compose --version || echo "Docker Compose安装可能有问题"

# 5. 创建工作目录和配置文件
print_title "5. 设置OpenHands环境"

# 创建工作目录
HOME_DIR=$HOME
WORKSPACE_DIR="$HOME_DIR/AICoder_Workspace"
mkdir -p "$WORKSPACE_DIR"
echo "工作目录已创建: $WORKSPACE_DIR"

# 创建docker-compose.yaml
cat > "$HOME_DIR/docker-compose.yaml" << EOL
services:
  openhands-app:
    image: docker.all-hands.dev/all-hands-ai/openhands:latest
    container_name: openhands-app
    environment:
      SANDBOX_RUNTIME_CONTAINER_IMAGE: docker.all-hands.dev/all-hands-ai/runtime:0.27-nikolaik
      LOG_ALL_EVENTS: "true"
      SANDBOX_USER_ID: "polly"
      WORKSPACE_MOUNT_PATH: /home/openhands/workspace
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ~/.openhands-state:/.openhands-state
      - $WORKSPACE_DIR:/home/openhands/workspace
    ports:
      - "80:3000"
    extra_hosts:
      - "host.docker.internal:host-gateway"
    tty: true
    stdin_open: true
    restart: unless-stopped
EOL

echo "docker-compose.yaml 已创建: $HOME_DIR/docker-compose.yaml"

# 6. 尝试启动Docker服务
print_title "6. 启动OpenHands服务"
cd "$HOME_DIR"

# 检查用户是否在docker组中
if groups $USER | grep -q '\bdocker\b'; then
  docker-compose up -d
  echo "OpenHands服务已启动"
else
  echo "当前会话中用户不在docker组,尝试使用新组权限启动服务"
  # 使用newgrp命令在当前会话中获取docker组权限
  echo "请在看到此消息后手动执行以下命令:"
  echo -e "\e[1;33mnewgrp docker\e[0m"
  echo -e "\e[1;33mcd $HOME_DIR && docker-compose up -d\e[0m"
fi

# 7. 展示使用信息
print_title "7. 使用说明"
echo "OpenHands服务启动成功后,可通过浏览器访问: http://localhost:80"
echo ""
echo "可用命令:"
echo "启动服务: cd $HOME_DIR && docker-compose up -d"
echo "停止服务: cd $HOME_DIR && docker-compose down"
echo "查看日志: cd $HOME_DIR && docker-compose logs -f"
echo "重启服务: cd $HOME_DIR && docker-compose restart"
echo ""
echo "工作目录: $WORKSPACE_DIR"
echo "该目录已挂载到OpenHands容器内部的/home/openhands/workspace"

print_title "安装完成"
echo "注意:如果出现权限问题,请尝试注销并重新登录,或重启系统"

PS:确保 Azure 网络安全组 (NSG) 中允许 HTTP (80) 流量。

步骤 4: 配置 Azure 的 LLM API Service 接口

参考文章:Azure部署DeepSeek/GPT大模型服务

步骤 5: OpenHands 中配置LLM API 接口

  1. 浏览器访问 http://<your-azure-server-ip>,打开OpenHands首页 OpenHands Homepage

  2. 点击左下角“设置”按钮,配置LLM API Servie OpenHands Configuration

  3. 开启你的AI Coding旅程 OpenHands Coding

结语

通过以上步骤,您已经成功在 Azure 上部署了 OpenHands,并配置了 GPT-4o API 接口。现在,您可以通过外网访问您的服务,并充分利用 OpenHands 的强大功能来提升开发效率。

留言与讨论