Deployment¶
构建、部署和运行 Osmedeus 于各种环境
本指南涵盖在各种环境中构建、部署和运行 Osmedeus。
先决条件¶
- Go 1.21+(用于本地构建)
- Docker 20.10+(用于容器化部署)
- Docker Compose 2.0+(用于分布式模式)
快速开始¶
# 本地构建并运行
make build
./build/bin/osmedeus serve
# Docker 单容器
docker build -t osmedeus:latest -f build/docker/Dockerfile .
docker run -p 8001:8001 osmedeus:latest
# 使用 Docker Compose 的分布式模式
docker-compose -f build/docker/docker-compose.yml up -d
构建¶
本地构建¶
# 为当前平台构建
make build
# 跨平台构建
make build-all # 所有平台
make build-linux # Linux amd64
make build-darwin # macOS amd64 + arm64
make build-windows # Windows amd64
# 输出位置
./build/bin/osmedeus
Docker 构建¶
docker build -t osmedeus:latest -f build/docker/Dockerfile .
# 开发镜像(带热重载)
docker build -t osmedeus:dev -f build/docker/Dockerfile.dev .
# 自定义版本
docker build --build-arg VERSION=5.1.0 -t osmedeus:5.1.0 -f build/docker/Dockerfile .
部署模式¶
单主机¶
直接二进制¶
# 运行服务器
./build/bin/osmedeus serve --port 8001
# 禁用身份验证运行(仅开发环境)
./build/bin/osmedeus serve -A
# 运行扫描
./build/bin/osmedeus scan -f general -t example.com
Docker 容器¶
# 基础服务器
docker run -d \
--name osmedeus \
-p 8001:8001 \
-v osmedeus-data:/root/osmedeus-base \
-v workspaces:/root/workspaces-osmedeus \
osmedeus:latest
# 使用自定义工作流
docker run -d \
--name osmedeus \
-p 8001:8001 \
-v /path/to/workflows:/root/osmedeus-base/workflows \
-v /path/to/workspaces:/root/workspaces-osmedeus \
osmedeus:latest
分布式模式(主/从)¶
分布式模式允许通过使用 Redis 作为消息队列,在多个工作节点上扩展扫描工作负载。
体系结构¶
┌─────────────┐
│ 客户端 │
└──────┬──────┘
│ REST API
┌──────▼──────┐
│ 主节点 │
│ (服务器) │
└──────┬──────┘
│
┌──────▼──────┐
│ Redis │
│ (队列) │
└──────┬──────┘
┌────────────┼────────────┐
│ │ │
┌─────▼────┐ ┌─────▼────┐ ┌─────▼────┐
│ 工作节点1│ │ 工作节点2│ │ 工作节点N│
└──────────┘ └──────────┘ └──────────┘
Docker Compose 设置¶
# 启动 2 个工作节点(默认)
docker-compose -f build/docker/docker-compose.yml up -d
# 扩展到 5 个工作节点
docker-compose -f build/docker/docker-compose.yml up -d --scale worker=5
# 查看日志
docker-compose -f build/docker/docker-compose.yml logs -f
# 停止所有服务
docker-compose -f build/docker/docker-compose.yml down
# 停止并移除卷
docker-compose -f build/docker/docker-compose.yml down -v
手动分布式设置¶
如果不使用 Docker Compose:
# 1. 启动 Redis
docker run -d --name redis -p 6379:6379 redis:7-alpine
# 2. 启动主节点
./build/bin/osmedeus serve --master --port 8001
# 3. 启动工作节点(在同一台或不同机器上)
./build/bin/osmedeus worker join --redis-url redis://localhost:6379
提交分布式扫描¶
# 提交扫描到分布式队列
./build/bin/osmedeus scan -f general -t example.com -D
# 使用自定义 Redis URL
./build/bin/osmedeus scan -f general -t example.com -D --redis-url redis://redis-host:6379
# 检查工作节点状态
./build/bin/osmedeus worker status
设置¶
配置文件¶
默认位置:~/osmedeus-base/osm-settings.yaml
base_folder: ~/osmedeus-base
environments:
binaries_path: "{{base_folder}}/binaries"
data: "{{base_folder}}/data"
workspaces: ~/workspaces-osmedeus
workflows: "{{base_folder}}/workflows"
server:
host: 0.0.0.0
port: 8001
# 分布式模式必需
redis:
host: localhost
port: 6379
password: "" # 可选
db: 0
database:
db_engine: sqlite # 或 postgresql
db_path: "{{base_folder}}/osm-data.db"
client:
username: admin
password: admin
jwt:
secret: "change-this-in-production"
expiration_minutes: 60
scan_tactic:
aggressive: 40
default: 10
gently: 5
环境变量¶
| 变量 | 描述 | 默认值 |
|---|---|---|
REDIS_HOST |
Redis 主机名 | localhost |
REDIS_PORT |
Redis 端口 | 6379 |
OSM_BASE_FOLDER |
基础文件夹路径 | \~/osmedeus-base |
命令行覆盖¶
# 覆盖基础文件夹
osmedeus -b /custom/path scan -f general -t example.com
# 覆盖工作流文件夹
osmedeus -F /custom/workflows workflow list
# 覆盖 Redis URL(分布式模式)
osmedeus scan -f general -t example.com -D --redis-url redis://user:pass@host:6379/0
Docker Compose 参考¶
包含的 build/docker/docker-compose.yml 提供了完整的分布式设置:
服务¶
| 服务 | 用途 | 端口 |
|---|---|---|
redis |
任务队列与协调 | 6379 |
master |
API 服务器与任务分发器 | 8001 |
worker |
任务执行器(可扩展) | - |
卷¶
| 卷 | 用途 |
|---|---|
redis-data |
Redis 持久化 |
osmedeus-data |
工作流与配置 |
workspaces |
扫描输出数据 |
扩展¶
# 动态扩展工作节点
docker-compose -f build/docker/docker-compose.yml up -d --scale worker=10
# 查看运行中的容器
docker-compose -f build/docker/docker-compose.yml ps
生产环境注意事项¶
安全¶
- 身份验证:切勿在生产环境中使用
-A(无认证) - JWT Secret:更改配置中的默认 JWT secret
- TLS:使用反向代理(nginx, traefik)实现 HTTPS
- 网络:将 Redis 访问限制在内部网络
资源限制¶
docker-compose.yml 中的工作节点资源限制:
根据工作流需求调整。
健康检查¶
Docker 镜像包含内置健康检查:
日志¶
# 查看主节点日志
docker logs osmedeus-master -f
# 查看所有工作节点日志
docker-compose -f build/docker/docker-compose.yml logs -f worker
# 日志级别由 --verbose/-v 标志控制
./build/bin/osmedeus -v serve
数据库选项¶
对于生产环境,考虑使用 PostgreSQL 替代 SQLite:
database:
db_engine: postgresql
db_host: postgres-host
db_port: 5432
db_name: osmedeus
db_user: osmedeus
db_password: secure-password
备份¶
# 备份卷
docker run --rm \
-v osmedeus-data:/data \
-v $(pwd):/backup \
alpine tar czf /backup/osmedeus-backup.tar.gz /data
# 备份工作空间
docker run --rm \
-v workspaces:/data \
-v $(pwd):/backup \
alpine tar czf /backup/workspaces-backup.tar.gz /data
Ansible 部署¶
使用 Ansible 在 Ubuntu/Debian 服务器上部署 Osmedeus。使用官方安装脚本、SQLite 存储,无需 Redis——专为简单的单主机设置设计。
先决条件¶
- 控制机器:Ansible 2.12+
- 目标服务器:Ubuntu 20.04+ 或 Debian 11+
- 具有 root 或 sudo 权限的 SSH 访问
快速开始¶
cd build/infra
# 1. 复制并编辑清单
cp inventory.example.ini inventory.ini
# 编辑 inventory.ini,填入服务器 IP/主机名
# 2. 使用安全凭据部署
ansible-playbook -i inventory.ini deploy.yaml \
-e osm_admin_password=YourSecurePassword \
-e osm_jwt_secret=$(openssl rand -base64 32)
# 3. 试运行(预览更改而不应用)
ansible-playbook -i inventory.ini deploy.yaml --check
执行内容¶
- 安装系统依赖(curl, tmux, git, chromium 等)
- 通过
curl -fsSL https://www.osmedeus.org/install.sh | bash安装 Osmedeus - 部署配置为 SQLite(无 Redis)的
osm-settings.yaml - 运行
osmedeus health验证安装 - 设置 systemd 服务以实现开机自启
Playbook 文件¶
build/infra/
├── deploy.yaml # 主 playbook
├── inventory.example.ini # 示例清单
└── templates/
├── osm-settings.yaml.j2 # 设置配置模板
└── osmedeus.service.j2 # Systemd 单元模板
变量¶
| 变量 | 默认值 | 描述 |
|---|---|---|
osm_server_port |
8002 |
API 服务器端口 |
osm_admin_user |
admin |
管理员用户名 |
osm_admin_password |
CHANGE_ME_ADMIN_PASSWORD |
管理员密码 |
osm_jwt_secret |
CHANGE_ME_JWT_SECRET_MIN_32_CHARS |
JWT 签名密钥 |
osm_jwt_expiration_minutes |
1440 |
令牌过期时间(24小时) |
osm_threads_aggressive |
50 |
激进扫描线程数 |
osm_threads_default |
20 |
默认扫描线程数 |
osm_threads_gently |
5 |
温和扫描线程数 |
osm_enable_service |
true |
安装 systemd 服务 |
osm_telegram_enabled |
false |
启用 Telegram 通知 |
osm_telegram_bot_token |
"" |
Telegram 机器人令牌 |
osm_telegram_chat_id |
"" |
Telegram 聊天 ID |
osm_global_variables |
[] |
工作流的额外环境变量 |
自定义¶
在部署时使用 -e 覆盖任何变量:
# 自定义端口和线程设置
ansible-playbook -i inventory.ini deploy.yaml \
-e osm_server_port=9090 \
-e osm_threads_default=30
# 带 Telegram 通知
ansible-playbook -i inventory.ini deploy.yaml \
-e osm_telegram_enabled=true \
-e osm_telegram_bot_token=your_bot_token \
-e osm_telegram_chat_id=your_chat_id
# 跳过 systemd 服务设置
ansible-playbook -i inventory.ini deploy.yaml \
-e osm_enable_service=false
部署后¶
# 检查服务状态
ssh root@YOUR_SERVER systemctl status osmedeus
# 运行扫描
ssh root@YOUR_SERVER osmedeus run -f general -t example.com
# 查看日志
ssh root@YOUR_SERVER journalctl -u osmedeus -f
故障排除¶
常见问题¶
工作节点无法连接:
扫描未执行:
端口冲突: