首次提交
This commit is contained in:
29
.dockerignore
Normal file
29
.dockerignore
Normal file
@@ -0,0 +1,29 @@
|
||||
# Git相关
|
||||
.git
|
||||
.gitignore
|
||||
|
||||
# Docker相关
|
||||
Dockerfile
|
||||
docker-compose.yml
|
||||
.dockerignore
|
||||
# 保留启动脚本
|
||||
!start.sh
|
||||
|
||||
# 文档
|
||||
README.md
|
||||
*.md
|
||||
|
||||
# 日志文件
|
||||
*.log
|
||||
|
||||
# 临时文件
|
||||
*.tmp
|
||||
*.temp
|
||||
|
||||
# 游戏数据目录(避免复制到镜像中)
|
||||
games/
|
||||
steamcmd_data/
|
||||
|
||||
# 系统文件
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
7
.env
Normal file
7
.env
Normal file
@@ -0,0 +1,7 @@
|
||||
# Steam账户信息
|
||||
# 请将以下值替换为您的实际Steam用户名和密码
|
||||
STEAM_USERNAME=your_steam_username
|
||||
STEAM_PASSWORD=your_steam_password
|
||||
|
||||
# 注意:为了安全起见,建议使用Steam Guard令牌而不是账户密码
|
||||
# 如果启用了Steam Guard,密码应该是您的Steam Guard令牌
|
||||
41
DockerFile/Dockerfile
Normal file
41
DockerFile/Dockerfile
Normal file
@@ -0,0 +1,41 @@
|
||||
# 使用Ubuntu 22.04作为基础镜像
|
||||
FROM ubuntu:22.04
|
||||
|
||||
ENV STEAMCMD_DIR=/opt/steamcmd
|
||||
ENV STEAMCMD_URL=https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get update && apt-get install -y \
|
||||
wget \
|
||||
ca-certificates \
|
||||
lib32gcc-s1 \
|
||||
lib32stdc++6 \
|
||||
libc6-i386 \
|
||||
libcurl4 \
|
||||
libncurses5 \
|
||||
libsdl2-2.0-0 \
|
||||
libtinfo5 \
|
||||
libvorbisfile3 \
|
||||
lib32z1 \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN mkdir -p ${STEAMCMD_DIR}
|
||||
|
||||
COPY install_dayz.sh /opt/install_dayz.sh
|
||||
COPY start.sh /opt/start.sh
|
||||
RUN chmod +x /opt/install_dayz.sh /opt/start.sh
|
||||
|
||||
RUN useradd -m -d /home/steam steam
|
||||
|
||||
RUN mkdir -p /opt/games
|
||||
|
||||
RUN chown -R steam:steam ${STEAMCMD_DIR} && \
|
||||
chown -R steam:steam /home/steam && \
|
||||
chown steam:steam /opt/install_dayz.sh && \
|
||||
chown steam:steam /opt/start.sh && \
|
||||
chown -R steam:steam /opt/games
|
||||
|
||||
WORKDIR ${STEAMCMD_DIR}
|
||||
|
||||
CMD ["/opt/start.sh"]
|
||||
37
DockerFile/install_dayz.sh
Normal file
37
DockerFile/install_dayz.sh
Normal file
@@ -0,0 +1,37 @@
|
||||
#!/bin/bash
|
||||
|
||||
# DayZ服务器安装脚本
|
||||
# 使用环境变量中的Steam用户名和密码
|
||||
|
||||
# 检查环境变量
|
||||
if [ -z "$STEAM_USERNAME" ] || [ -z "$STEAM_PASSWORD" ]; then
|
||||
echo "错误: 请设置 STEAM_USERNAME 和 STEAM_PASSWORD 环境变量"
|
||||
echo "在本目录下执行 vi .env 设置环境变量"
|
||||
echo "示例:"
|
||||
echo "export STEAM_USERNAME=your_username"
|
||||
echo "export STEAM_PASSWORD=your_password"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 切换到SteamCMD目录
|
||||
cd /opt/steamcmd
|
||||
|
||||
# 运行SteamCMD安装DayZ服务器
|
||||
echo "开始安装DayZ服务器..."
|
||||
./steamcmd.sh +login $STEAM_USERNAME $STEAM_PASSWORD +app_update 223350 validate +quit
|
||||
|
||||
# 检查安装结果
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "DayZ服务器安装完成!"
|
||||
else
|
||||
echo "安装失败,请检查用户名和密码是否正确"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 初始化BERcon配置
|
||||
password=$(tr -dc 'A-Za-z0-9!@%^_=+?' < /dev/urandom | head -c 12)
|
||||
cat > /root/Steam/steamapps/common/DayZServer/battleye/beserver_x64.cfg << EOF
|
||||
RConPort 2314
|
||||
RConPassword $password
|
||||
RestrictRCon 0
|
||||
EOF
|
||||
132
DockerFile/start.sh
Normal file
132
DockerFile/start.sh
Normal file
@@ -0,0 +1,132 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e # 遇到错误时退出
|
||||
|
||||
echo "=========================================="
|
||||
echo "SteamCMD容器启动中..."
|
||||
echo "时间: $(date)"
|
||||
echo "=========================================="
|
||||
|
||||
copy_files() {
|
||||
local mod_path=$1
|
||||
local parent_path=$2
|
||||
local lower_addons_path="${mod_path}/addons"
|
||||
local upper_addons_path="${mod_path}/Addons"
|
||||
local lower_keys_path="${mod_path}/keys"
|
||||
local upper_keys_path="${mod_path}/Keys"
|
||||
|
||||
# 处理addons目录
|
||||
if [ -d "$lower_addons_path" ]; then
|
||||
find "$lower_addons_path" -type f -name '*.bisign' -exec cp -dpf {} "$parent_path/addons/" \;
|
||||
elif [ -d "$upper_addons_path" ]; then
|
||||
find "$upper_addons_path" -type f -name '*.bisign' -exec cp -dpf {} "$parent_path/addons/" \;
|
||||
fi
|
||||
|
||||
# 处理keys目录
|
||||
if [ -d "$lower_keys_path" ]; then
|
||||
find "$lower_keys_path" -type f -name '*.bikey' -exec cp -dpf {} "$parent_path/keys/" \;
|
||||
elif [ -d "$upper_keys_path" ]; then
|
||||
find "$upper_keys_path" -type f -name '*.bikey' -exec cp -dpf {} "$parent_path/keys/" \;
|
||||
fi
|
||||
}
|
||||
|
||||
start_dayzserver() {
|
||||
cd /root/Steam/steamapps/common/DayZServer
|
||||
|
||||
# 初始化mod变量
|
||||
client_mods=""
|
||||
server_mods=""
|
||||
|
||||
while IFS= read -r -d $'\0' folder; do
|
||||
echo "处理客户端mod: $folder"
|
||||
copy_files "$folder" "."
|
||||
if [ -n "$client_mods" ]; then
|
||||
client_mods="${client_mods};"
|
||||
fi
|
||||
client_mods="${client_mods}${folder}"
|
||||
done < <(find "./client_mod" -type d -name '@*' -print0)
|
||||
|
||||
while IFS= read -r -d $'\0' folder; do
|
||||
echo "处理服务端mod: $folder"
|
||||
copy_files "$folder" "."
|
||||
if [ -n "$server_mods" ]; then
|
||||
server_mods="${server_mods};"
|
||||
fi
|
||||
server_mods="${server_mods}${folder}"
|
||||
done < <(find "./server_mod" -type d -name '@*' -print0)
|
||||
|
||||
# 崩溃检测和自动重启循环
|
||||
while true; do
|
||||
echo "=========================================="
|
||||
echo "启动DayZServer..."
|
||||
echo "时间: $(date)"
|
||||
echo "端口: ${DAYZ_SERVER_PORT}"
|
||||
echo "CPU核心数: ${DAYZ_CPU_COUNT}"
|
||||
echo "客户端mod: ${client_mods}"
|
||||
echo "服务端mod: ${server_mods}"
|
||||
echo "=========================================="
|
||||
|
||||
echo "执行命令: ./DayZServer -port=${DAYZ_SERVER_PORT} -cpuCount=${DAYZ_CPU_COUNT} -config=serverDZ.cfg -profiles=profiles -mission=./mpmissions/${DAYZ_MISSIONS} -mod=${client_mods} -servermod=${server_mods}"
|
||||
|
||||
# 启动DayZServer并捕获退出状态
|
||||
./DayZServer -port=${DAYZ_SERVER_PORT} -cpuCount=${DAYZ_CPU_COUNT} \
|
||||
"-config=serverDZ.cfg" "-profiles=profiles" \
|
||||
"-mission=./mpmissions/${DAYZ_MISSIONS}" \
|
||||
"-mod=${client_mods}" "-servermod=${server_mods}" &
|
||||
|
||||
# 保存进程ID
|
||||
DAYZ_PID=$!
|
||||
echo "DayZServer进程ID: $DAYZ_PID"
|
||||
|
||||
# 等待进程结束
|
||||
wait $DAYZ_PID
|
||||
EXIT_CODE=$?
|
||||
|
||||
echo "=========================================="
|
||||
echo "DayZServer已退出"
|
||||
echo "退出代码: $EXIT_CODE"
|
||||
echo "时间: $(date)"
|
||||
echo "=========================================="
|
||||
|
||||
# 检查是否正常退出(退出代码0通常表示正常退出)
|
||||
if [ $EXIT_CODE -eq 0 ]; then
|
||||
echo "DayZServer正常退出,将在5秒后重启..."
|
||||
sleep 5
|
||||
echo "重新启动DayZServer..."
|
||||
else
|
||||
echo "DayZServer异常退出,将在5秒后重启..."
|
||||
sleep 5
|
||||
echo "重新启动DayZServer..."
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
# 检查并安装SteamCMD
|
||||
if [ ! -f "/opt/steamcmd/steamcmd.sh" ]; then
|
||||
echo "SteamCMD未安装,开始下载和安装..."
|
||||
echo "下载SteamCMD..."
|
||||
wget -O /opt/steamcmd/steamcmd_linux.tar.gz ${STEAMCMD_URL}
|
||||
echo "解压SteamCMD..."
|
||||
tar xvzf /opt/steamcmd/steamcmd_linux.tar.gz -C /opt/steamcmd
|
||||
echo "清理临时文件..."
|
||||
rm /opt/steamcmd/steamcmd_linux.tar.gz
|
||||
echo "设置执行权限..."
|
||||
chmod +x /opt/steamcmd/steamcmd.sh
|
||||
echo "SteamCMD安装完成!"
|
||||
else
|
||||
echo "SteamCMD已存在,跳过安装"
|
||||
fi
|
||||
|
||||
if [ ! -f "/root/Steam/steamapps/common/DayZServer/DayZServer" ]; then
|
||||
echo "DayZServer未安装,开始安装..."
|
||||
bash /opt/install_dayz.sh
|
||||
else
|
||||
echo "DayZServer已安装,检查更新"
|
||||
# 切换到SteamCMD目录
|
||||
cd /opt/steamcmd
|
||||
./steamcmd.sh +login $STEAM_USERNAME $STEAM_PASSWORD +app_update 223350 validate +quit
|
||||
echo "启动DayZServer..."
|
||||
cd /root/Steam/steamapps/common/DayZServer
|
||||
start_dayzserver
|
||||
fi
|
||||
287
README.md
Normal file
287
README.md
Normal file
@@ -0,0 +1,287 @@
|
||||
# DayZ服务器 Docker 部署项目
|
||||
|
||||
这是一个用于快速部署DayZ服务器的Docker化解决方案。通过Docker容器化技术,您可以轻松地在任何支持Docker的系统上运行DayZ服务器,无需复杂的本地环境配置。
|
||||
|
||||
## 🎯 项目特性
|
||||
|
||||
- **一键部署**: 使用Docker Compose实现一键部署DayZ服务器
|
||||
- **自动安装**: 自动下载并安装SteamCMD和DayZ服务器
|
||||
- **Mod支持**: 支持客户端和服务端Mod的自动加载
|
||||
- **崩溃恢复**: 内置崩溃检测和自动重启机制
|
||||
- **跨平台**: 支持Linux、Windows、macOS等操作系统
|
||||
- **环境隔离**: 使用Docker容器确保环境隔离和一致性
|
||||
- **配置灵活**: 支持通过环境变量自定义服务器配置
|
||||
|
||||
## 📋 系统要求
|
||||
|
||||
- Docker 20.10+
|
||||
- Docker Compose 2.0+
|
||||
- 至少4GB可用内存
|
||||
- 至少10GB可用磁盘空间
|
||||
- 稳定的网络连接(用于下载SteamCMD和DayZ服务器)
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 1. 克隆项目
|
||||
|
||||
```bash
|
||||
git clone <repository-url> ./Docker_DayzServer
|
||||
cd Docker_DayzServer
|
||||
```
|
||||
|
||||
### 2. 设置环境变量
|
||||
|
||||
创建 `.env` 文件并配置您的Steam账户信息:
|
||||
|
||||
```bash
|
||||
# 创建环境变量文件
|
||||
cat > .env << EOF
|
||||
STEAM_USERNAME=your_steam_username
|
||||
STEAM_PASSWORD=your_steam_password
|
||||
DAYZ_MISSIONS=dayzOffline.chernarusplus
|
||||
DAYZ_SERVER_PORT=2302
|
||||
DAYZ_CPU_COUNT=4
|
||||
EOF
|
||||
```
|
||||
|
||||
**重要**: 请确保使用有效的Steam账户,该账户 不需要 拥有DayZ游戏。
|
||||
|
||||
### 3. 运行安装脚本
|
||||
|
||||
```bash
|
||||
# 给安装脚本执行权限
|
||||
chmod +x install.sh
|
||||
|
||||
# 运行安装脚本(需要root权限)
|
||||
sudo ./install.sh
|
||||
```
|
||||
|
||||
安装脚本将自动:
|
||||
- 检测您的操作系统
|
||||
- 安装Docker和Docker Compose
|
||||
- 构建Docker镜像
|
||||
- 启动DayZ服务器
|
||||
|
||||
### 4. 手动部署(可选)
|
||||
|
||||
如果您想手动部署,可以按以下步骤操作:
|
||||
|
||||
```bash
|
||||
# 构建Docker镜像, 如果仓库有更新, 都需要重新 build 一次, 更新不需要 --no-cache
|
||||
docker-compose build --no-cache
|
||||
|
||||
# 运行steamcmd容器进行初始安装
|
||||
docker-compose run --rm steamcmd
|
||||
|
||||
# 启动所有服务
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## ⚙️ 配置说明
|
||||
|
||||
### 环境变量
|
||||
|
||||
| 变量名 | 默认值 | 说明 |
|
||||
|--------|--------|------|
|
||||
| `STEAM_USERNAME` | - | Steam用户名(必需) |
|
||||
| `STEAM_PASSWORD` | - | Steam密码(必需) |
|
||||
| `DAYZ_MISSIONS` | `dayzOffline.chernarusplus` | 服务器地图 |
|
||||
| `DAYZ_SERVER_PORT` | `2302` | 服务器端口 |
|
||||
| `DAYZ_CPU_COUNT` | `4` | 使用的CPU核心数 |
|
||||
|
||||
### 端口映射
|
||||
|
||||
| 容器端口 | 主机端口 | 说明 |
|
||||
|----------|----------|------|
|
||||
| 2302/udp | 2302/udp | DayZ游戏端口 |
|
||||
| 2305/udp | 2305/udp | DayZ查询端口 |
|
||||
| 2314/udp | 2314/udp | BattlEye RCon端口 |
|
||||
|
||||
### 目录结构
|
||||
|
||||
```
|
||||
Docker_DayzServer/
|
||||
├── docker-compose.yml # Docker Compose配置文件
|
||||
├── DockerFile/ # Docker构建文件
|
||||
│ ├── Dockerfile # Docker镜像定义
|
||||
│ ├── install_dayz.sh # DayZ安装脚本
|
||||
│ └── start.sh # 启动脚本
|
||||
├── install.sh # 一键安装脚本
|
||||
└── dayz/ # 数据目录(自动创建)
|
||||
├── .steamcmd/ # SteamCMD数据
|
||||
├── .dayz_server/ # DayZ服务器文件
|
||||
├── client_mod/ # 客户端Mod
|
||||
├── server_mod/ # 服务端Mod
|
||||
├── battleye/ # BattlEye配置
|
||||
├── profiles/ # 服务器配置文件
|
||||
└── mpmissions/ # 地图文件
|
||||
```
|
||||
|
||||
## 🎮 使用说明
|
||||
|
||||
### 启动服务器
|
||||
|
||||
```bash
|
||||
# 启动所有服务
|
||||
docker-compose up -d
|
||||
|
||||
# 查看运行状态
|
||||
docker-compose ps
|
||||
|
||||
# 查看日志
|
||||
docker-compose logs -f steamcmd
|
||||
```
|
||||
|
||||
### 停止服务器
|
||||
|
||||
```bash
|
||||
# 停止所有服务
|
||||
docker-compose down
|
||||
|
||||
# 停止并删除数据卷(谨慎使用)
|
||||
docker-compose down -v
|
||||
```
|
||||
|
||||
### 重启服务器
|
||||
|
||||
```bash
|
||||
# 重启服务
|
||||
docker-compose restart steamcmd
|
||||
```
|
||||
|
||||
### 更新服务器
|
||||
|
||||
```bash
|
||||
# 重新构建镜像并启动
|
||||
docker-compose build --no-cache
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## 🔧 Mod管理
|
||||
|
||||
### 添加客户端Mod
|
||||
|
||||
1. 将Mod文件放入 `dayz/client_mod/` 目录
|
||||
2. Mod文件夹应以 `@` 开头
|
||||
3. 重启服务器以加载新Mod
|
||||
|
||||
### 添加服务端Mod
|
||||
|
||||
1. 将Mod文件放入 `dayz/server_mod/` 目录
|
||||
2. Mod文件夹应以 `@` 开头
|
||||
3. 重启服务器以加载新Mod
|
||||
|
||||
### Mod配置示例
|
||||
|
||||
```
|
||||
dayz/
|
||||
├── client_mod/
|
||||
│ ├── @CF
|
||||
│ └── @DayZExpansion
|
||||
└── server_mod/
|
||||
└── @DayZExpansionServer
|
||||
```
|
||||
|
||||
## 📊 监控和日志
|
||||
|
||||
### 查看实时日志
|
||||
|
||||
```bash
|
||||
# 查看容器日志
|
||||
docker-compose logs -f steamcmd
|
||||
|
||||
# 查看特定时间段的日志
|
||||
docker-compose logs --since="2024-01-01T00:00:00" steamcmd
|
||||
```
|
||||
|
||||
### 服务器状态检查
|
||||
|
||||
```bash
|
||||
# 检查容器状态
|
||||
docker-compose ps
|
||||
|
||||
# 检查资源使用情况
|
||||
docker stats steamcmd
|
||||
```
|
||||
|
||||
## 🔒 安全配置
|
||||
|
||||
### BattlEye配置
|
||||
|
||||
BattlEye配置文件位于 `dayz/battleye/beserver_x64.cfg`,包含:
|
||||
- RCon端口:2314
|
||||
- 自动生成的RCon密码
|
||||
- 远程管理设置
|
||||
|
||||
### 防火墙配置
|
||||
|
||||
确保以下端口在防火墙中开放:
|
||||
- UDP 2302 (游戏端口)
|
||||
- UDP 2305 (查询端口)
|
||||
- UDP 2314 (RCon端口)
|
||||
|
||||
## 🛠️ 故障排除
|
||||
|
||||
### 常见问题
|
||||
|
||||
1. **Steam登录失败**
|
||||
- 检查Steam用户名和密码是否正确
|
||||
- 检查网络连接
|
||||
|
||||
2. **服务器无法启动**
|
||||
- 检查端口是否被占用
|
||||
- 查看容器日志:`docker-compose logs steamcmd`
|
||||
- 确保有足够的磁盘空间
|
||||
|
||||
3. **Mod加载失败**
|
||||
- 检查Mod文件夹名称是否正确(以@开头)
|
||||
- 确保Mod文件完整
|
||||
- 查看启动日志中的Mod加载信息
|
||||
|
||||
### 调试命令
|
||||
|
||||
```bash
|
||||
# 进入容器进行调试
|
||||
docker-compose exec steamcmd bash
|
||||
|
||||
# 查看容器资源使用情况
|
||||
docker stats steamcmd
|
||||
|
||||
# 检查网络连接
|
||||
docker-compose exec steamcmd netstat -tulpn
|
||||
```
|
||||
|
||||
## 📝 更新日志
|
||||
|
||||
### v1.0.0
|
||||
- 初始版本发布
|
||||
- 支持基本的DayZ服务器部署
|
||||
- 集成SteamCMD自动安装
|
||||
- 支持Mod加载
|
||||
- 内置崩溃恢复机制
|
||||
|
||||
## 🤝 贡献
|
||||
|
||||
欢迎提交Issue和Pull Request来改进这个项目!
|
||||
|
||||
## 📄 许可证
|
||||
|
||||
本项目采用MIT许可证。详见LICENSE文件。
|
||||
|
||||
## ⚠️ 免责声明
|
||||
|
||||
- 本项目仅供学习和研究使用
|
||||
- 请确保遵守DayZ和Steam的服务条款
|
||||
- 使用本项目的风险由用户自行承担
|
||||
- 建议在测试环境中先进行验证
|
||||
|
||||
## 📞 支持
|
||||
|
||||
如果您在使用过程中遇到问题,请:
|
||||
1. 查看本文档的故障排除部分
|
||||
2. 检查项目的Issue页面
|
||||
3. 提交新的Issue并提供详细的错误信息
|
||||
|
||||
---
|
||||
|
||||
**祝您游戏愉快!** 🎮
|
||||
24
docker-compose.yml
Normal file
24
docker-compose.yml
Normal file
@@ -0,0 +1,24 @@
|
||||
services:
|
||||
steamcmd:
|
||||
build: ./DockerFile/
|
||||
container_name: steamcmd
|
||||
volumes:
|
||||
- ./dayz/.steamcmd:/root/Steam
|
||||
- ./dayz/.dayz_server:/root/Steam/steamapps/common/DayZServer
|
||||
- ./dayz/.steamcmd_data:/opt/steamcmd
|
||||
- ./dayz/client_mod:/root/Steam/steamapps/common/DayZServer/client_mod
|
||||
- ./dayz/server_mod:/root/Steam/steamapps/common/DayZServer/server_mod
|
||||
- ./dayz/battleye:/root/Steam/steamapps/common/DayZServer/battleye
|
||||
- ./dayz/profiles:/root/Steam/steamapps/common/DayZServer/profiles
|
||||
- ./dayz/mpmissions:/root/Steam/steamapps/common/DayZServer/mpmissions
|
||||
environment:
|
||||
- STEAM_USERNAME=${STEAM_USERNAME:-}
|
||||
- STEAM_PASSWORD=${STEAM_PASSWORD:-}
|
||||
- DAYZ_MISSIONS=dayzOffline.chernarusplus
|
||||
- DAYZ_SERVER_PORT=2302
|
||||
- DAYZ_CPU_COUNT=4
|
||||
ports:
|
||||
- "2302:2302/udp"
|
||||
- "2305:2305/udp"
|
||||
- "2314:2314/udp"
|
||||
restart: unless-stopped
|
||||
276
install.sh
Normal file
276
install.sh
Normal file
@@ -0,0 +1,276 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 打印带颜色的消息
|
||||
print_message() {
|
||||
echo -e "${GREEN}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
# 检测操作系统类型
|
||||
detect_os() {
|
||||
if [ -f /etc/os-release ]; then
|
||||
. /etc/os-release
|
||||
OS=$NAME
|
||||
VER=$VERSION_ID
|
||||
elif type lsb_release >/dev/null 2>&1; then
|
||||
OS=$(lsb_release -si)
|
||||
VER=$(lsb_release -sr)
|
||||
elif [ -f /etc/lsb-release ]; then
|
||||
. /etc/lsb-release
|
||||
OS=$DISTRIB_ID
|
||||
VER=$DISTRIB_RELEASE
|
||||
elif [ -f /etc/debian_version ]; then
|
||||
OS=Debian
|
||||
VER=$(cat /etc/debian_version)
|
||||
elif [ -f /etc/SuSe-release ]; then
|
||||
OS=SuSE
|
||||
elif [ -f /etc/redhat-release ]; then
|
||||
OS=RedHat
|
||||
VER=$(cat /etc/redhat-release | sed 's/.*release \([0-9.]*\).*/\1/')
|
||||
else
|
||||
OS=$(uname -s)
|
||||
VER=$(uname -r)
|
||||
fi
|
||||
|
||||
echo "检测到操作系统: $OS $VER"
|
||||
}
|
||||
|
||||
# 更新包管理器
|
||||
update_package_manager() {
|
||||
print_message "更新包管理器..."
|
||||
|
||||
if [[ "$OS" == *"Ubuntu"* ]] || [[ "$OS" == *"Debian"* ]]; then
|
||||
apt update && apt upgrade -y
|
||||
apt install -y curl wget
|
||||
elif [[ "$OS" == *"CentOS"* ]] || [[ "$OS" == *"Red Hat"* ]] || [[ "$OS" == *"Rocky"* ]] || [[ "$OS" == *"AlmaLinux"* ]]; then
|
||||
if command -v dnf &> /dev/null; then
|
||||
dnf update -y
|
||||
dnf install -y curl wget
|
||||
else
|
||||
yum update -y
|
||||
yum install -y curl wget
|
||||
fi
|
||||
else
|
||||
print_message "使用通用方式安装curl和wget..."
|
||||
# 尝试通用方式安装
|
||||
if command -v apt &> /dev/null; then
|
||||
apt update && apt install -y curl wget
|
||||
elif command -v dnf &> /dev/null; then
|
||||
dnf install -y curl wget
|
||||
elif command -v yum &> /dev/null; then
|
||||
yum install -y curl wget
|
||||
elif command -v zypper &> /dev/null; then
|
||||
zypper install -y curl wget
|
||||
else
|
||||
print_warning "无法自动安装curl和wget,请手动安装"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# 卸载旧版本Docker
|
||||
remove_old_docker() {
|
||||
print_message "检查并卸载旧版本Docker..."
|
||||
|
||||
if [[ "$OS" == *"Ubuntu"* ]] || [[ "$OS" == *"Debian"* ]]; then
|
||||
apt-get remove -y docker docker-engine docker.io containerd runc 2>/dev/null || true
|
||||
elif [[ "$OS" == *"CentOS"* ]] || [[ "$OS" == *"Red Hat"* ]] || [[ "$OS" == *"Rocky"* ]] || [[ "$OS" == *"AlmaLinux"* ]]; then
|
||||
if command -v dnf &> /dev/null; then
|
||||
dnf remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 2>/dev/null || true
|
||||
else
|
||||
yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 2>/dev/null || true
|
||||
fi
|
||||
else
|
||||
print_message "使用通用方式卸载旧版本Docker..."
|
||||
# 通用卸载方式
|
||||
if command -v apt &> /dev/null; then
|
||||
apt-get remove -y docker docker-engine docker.io containerd runc 2>/dev/null || true
|
||||
elif command -v dnf &> /dev/null; then
|
||||
dnf remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 2>/dev/null || true
|
||||
elif command -v yum &> /dev/null; then
|
||||
yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 2>/dev/null || true
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# 安装Docker
|
||||
install_docker() {
|
||||
print_message "安装Docker..."
|
||||
|
||||
# 使用官方的get-docker.sh脚本,它已经做了跨平台兼容
|
||||
curl -fsSL https://get.docker.com -o get-docker.sh
|
||||
sh get-docker.sh
|
||||
rm -f get-docker.sh
|
||||
|
||||
# 启动并启用Docker服务
|
||||
systemctl start docker
|
||||
systemctl enable docker
|
||||
}
|
||||
|
||||
# 安装Docker Compose
|
||||
install_docker_compose() {
|
||||
print_message "安装Docker Compose..."
|
||||
|
||||
# 检查是否已经安装了docker-compose-plugin
|
||||
if docker compose version &> /dev/null; then
|
||||
print_message "Docker Compose 插件已安装"
|
||||
return
|
||||
fi
|
||||
|
||||
# 下载并安装独立版本的Docker Compose
|
||||
COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4)
|
||||
|
||||
# 下载适合当前系统的Docker Compose二进制文件
|
||||
curl -L "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
||||
|
||||
chmod +x /usr/local/bin/docker-compose
|
||||
|
||||
# 创建软链接
|
||||
ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose
|
||||
}
|
||||
|
||||
# 验证安装
|
||||
verify_installation() {
|
||||
print_message "验证安装..."
|
||||
|
||||
if command -v docker &> /dev/null; then
|
||||
print_message "Docker 安装成功"
|
||||
docker --version
|
||||
else
|
||||
print_error "Docker 安装失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if command -v docker-compose &> /dev/null || docker compose version &> /dev/null; then
|
||||
print_message "Docker Compose 安装成功"
|
||||
if command -v docker-compose &> /dev/null; then
|
||||
docker-compose --version
|
||||
else
|
||||
docker compose version
|
||||
fi
|
||||
else
|
||||
print_error "Docker Compose 安装失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 测试Docker服务
|
||||
if systemctl is-active --quiet docker; then
|
||||
print_message "Docker 服务运行正常"
|
||||
else
|
||||
print_error "Docker 服务未运行"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 构建和启动Docker容器
|
||||
build_and_start_containers() {
|
||||
print_message "开始构建和启动Docker容器..."
|
||||
|
||||
# 检查是否存在docker-compose.yml文件
|
||||
if [ ! -f "docker-compose.yml" ]; then
|
||||
print_error "未找到docker-compose.yml文件,请确保在正确的目录中运行此脚本"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 构建Docker镜像(不使用缓存)
|
||||
print_message "构建Docker镜像(不使用缓存)..."
|
||||
if command -v docker-compose &> /dev/null; then
|
||||
docker-compose build --no-cache
|
||||
else
|
||||
docker compose build --no-cache
|
||||
fi
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
print_error "Docker镜像构建失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
print_message "Docker镜像构建成功"
|
||||
|
||||
# 运行steamcmd容器
|
||||
print_message "运行steamcmd容器..."
|
||||
if command -v docker-compose &> /dev/null; then
|
||||
docker-compose run --rm steamcmd
|
||||
else
|
||||
docker compose run --rm steamcmd
|
||||
fi
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
print_warning "steamcmd容器运行失败,但继续启动其他服务"
|
||||
else
|
||||
print_message "steamcmd容器运行完成"
|
||||
fi
|
||||
|
||||
# 启动所有容器
|
||||
print_message "启动所有Docker容器..."
|
||||
if command -v docker-compose &> /dev/null; then
|
||||
docker-compose up -d
|
||||
else
|
||||
docker compose up -d
|
||||
fi
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
print_message "所有Docker容器启动成功"
|
||||
|
||||
# 显示容器状态
|
||||
print_message "容器状态:"
|
||||
if command -v docker-compose &> /dev/null; then
|
||||
docker-compose ps
|
||||
else
|
||||
docker compose ps
|
||||
fi
|
||||
else
|
||||
print_error "Docker容器启动失败"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 主函数
|
||||
main() {
|
||||
print_message "开始安装 Docker 和 Docker Compose..."
|
||||
|
||||
# 检查是否为root用户
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
print_error "此脚本需要root权限运行"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
detect_os
|
||||
update_package_manager
|
||||
remove_old_docker
|
||||
install_docker
|
||||
install_docker_compose
|
||||
verify_installation
|
||||
|
||||
print_message "Docker 和 Docker Compose 安装完成!"
|
||||
|
||||
# 询问是否继续构建和启动容器
|
||||
echo
|
||||
read -p "是否现在构建和启动Docker容器?(y/n): " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
build_and_start_containers
|
||||
print_message "所有操作完成!"
|
||||
else
|
||||
print_message "安装完成!您可以稍后手动运行以下命令:"
|
||||
print_message "1. docker-compose build --no-cache"
|
||||
print_message "2. docker-compose run --rm steamcmd"
|
||||
print_message "3. docker-compose up -d"
|
||||
print_message "运行第二步时,第一次运行会等待steam验证码,需要手动输入"
|
||||
fi
|
||||
}
|
||||
|
||||
# 执行主函数
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user