Files
val-blog/gch3n-infra/init-server.sh
T

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 ""