175 lines
4.8 KiB
Bash
Executable File
175 lines
4.8 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
# 服务器初始化脚本
|
|
# 在腾讯云服务器上执行此脚本以完成基础设施部署
|
|
|
|
echo "========================================"
|
|
echo " gch3n.online 服务器初始化脚本"
|
|
echo "========================================"
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
|
|
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
|
log_step() { echo -e "${BLUE}[STEP]${NC} $1"; }
|
|
|
|
# 检查 root 权限
|
|
if [ "$EUID" -ne 0 ]; then
|
|
log_error "请使用 root 权限运行此脚本"
|
|
exit 1
|
|
fi
|
|
|
|
# ========== 1. 系统更新 ==========
|
|
log_step "1/8 更新系统软件包..."
|
|
apt-get update && apt-get upgrade -y
|
|
|
|
# ========== 2. 安装必要工具 ==========
|
|
log_step "2/8 安装必要工具..."
|
|
apt-get install -y \
|
|
curl \
|
|
wget \
|
|
git \
|
|
vim \
|
|
htop \
|
|
net-tools \
|
|
certbot \
|
|
python3-certbot-nginx \
|
|
ufw \
|
|
fail2ban
|
|
|
|
# ========== 3. 安装 Docker ==========
|
|
log_step "3/8 安装 Docker..."
|
|
if ! command -v docker &> /dev/null; then
|
|
curl -fsSL https://get.docker.com | sh
|
|
systemctl enable docker
|
|
systemctl start docker
|
|
log_info "Docker 安装完成"
|
|
else
|
|
log_warn "Docker 已安装,跳过"
|
|
fi
|
|
|
|
# 将当前用户添加到 docker 组
|
|
usermod -aG docker nplx 2>/dev/null || true
|
|
|
|
# ========== 4. 安装 Docker Compose ==========
|
|
log_step "4/8 安装 Docker Compose..."
|
|
if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then
|
|
COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
|
|
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
|
|
log_info "Docker Compose 安装完成"
|
|
else
|
|
log_warn "Docker Compose 已安装,跳过"
|
|
fi
|
|
|
|
# ========== 5. 配置防火墙 ==========
|
|
log_step "5/8 配置防火墙..."
|
|
ufw --force reset
|
|
ufw default deny incoming
|
|
ufw default allow outgoing
|
|
ufw allow 22/tcp # SSH
|
|
ufw allow 80/tcp # HTTP
|
|
ufw allow 443/tcp # HTTPS
|
|
ufw allow 11022/tcp # 自定义 SSH 端口
|
|
ufw allow 2222/tcp # Gitea SSH
|
|
ufw --force enable
|
|
log_info "防火墙配置完成"
|
|
|
|
# ========== 6. 配置 Fail2ban ==========
|
|
log_step "6/8 配置 Fail2ban..."
|
|
systemctl enable fail2ban
|
|
systemctl start fail2ban
|
|
log_info "Fail2ban 配置完成"
|
|
|
|
# ========== 7. 创建项目目录 ==========
|
|
log_step "7/8 创建项目目录..."
|
|
PROJECT_DIR="/home/nplx/gch3n-infra"
|
|
mkdir -p "$PROJECT_DIR"
|
|
mkdir -p "$PROJECT_DIR/data/gitea"
|
|
mkdir -p "$PROJECT_DIR/data/certbot/conf"
|
|
mkdir -p "$PROJECT_DIR/data/certbot/www"
|
|
mkdir -p "$PROJECT_DIR/data/letsencrypt"
|
|
|
|
# 设置权限
|
|
chown -R nplx:nplx "$PROJECT_DIR"
|
|
log_info "项目目录创建完成: $PROJECT_DIR"
|
|
|
|
# ========== 8. 申请 SSL 证书 ==========
|
|
log_step "8/8 申请 SSL 证书..."
|
|
log_warn "请确保域名 gch3n.online 和 git.gch3n.online 已解析到本服务器 IP: $(curl -s ifconfig.me)"
|
|
log_warn "按回车继续申请证书,或按 Ctrl+C 取消..."
|
|
read
|
|
|
|
# 创建临时 nginx 配置用于证书验证
|
|
cat > /tmp/nginx-cert.conf << 'EOF'
|
|
server {
|
|
listen 80;
|
|
server_name gch3n.online git.gch3n.online app.gch3n.online;
|
|
|
|
location /.well-known/acme-challenge/ {
|
|
root /var/www/certbot;
|
|
}
|
|
|
|
location / {
|
|
return 200 "Certbot validation server";
|
|
}
|
|
}
|
|
EOF
|
|
|
|
# 启动临时 nginx
|
|
docker run -d --name temp-nginx \
|
|
-p 80:80 \
|
|
-v /tmp/nginx-cert.conf:/etc/nginx/conf.d/default.conf:ro \
|
|
-v "$PROJECT_DIR/data/certbot/www:/var/www/certbot" \
|
|
nginx:alpine
|
|
|
|
# 等待 nginx 启动
|
|
sleep 3
|
|
|
|
# 申请证书
|
|
certbot certonly --webroot \
|
|
-w /var/www/certbot \
|
|
-d gch3n.online \
|
|
-d git.gch3n.online \
|
|
-d app.gch3n.online \
|
|
--agree-tos \
|
|
--non-interactive \
|
|
--email admin@gch3n.online \
|
|
|| {
|
|
log_error "证书申请失败,请检查域名解析"
|
|
docker stop temp-nginx && docker rm temp-nginx
|
|
exit 1
|
|
}
|
|
|
|
# 停止临时 nginx
|
|
docker stop temp-nginx && docker rm temp-nginx
|
|
|
|
# 复制证书到项目目录
|
|
cp -r /etc/letsencrypt/live "$PROJECT_DIR/data/certbot/conf/"
|
|
chown -R nplx:nplx "$PROJECT_DIR/data/certbot"
|
|
|
|
log_info "SSL 证书申请完成"
|
|
|
|
echo ""
|
|
echo "========================================"
|
|
echo " 服务器初始化完成!"
|
|
echo "========================================"
|
|
echo ""
|
|
echo "下一步:"
|
|
echo "1. 将项目文件复制到 $PROJECT_DIR"
|
|
echo "2. 切换到 nplx 用户: su - nplx"
|
|
echo "3. 进入项目目录: cd ~/gch3n-infra"
|
|
echo "4. 启动服务: docker-compose up -d"
|
|
echo ""
|
|
echo "访问地址:"
|
|
echo "- Git 服务器: https://git.gch3n.online"
|
|
echo "- 应用: https://app.gch3n.online"
|
|
echo ""
|