🖥️ 服务器搭建与运维

从零开始搭建团队内部服务器,
提供代码托管、CI/CD、文件共享等服务

项目背景

随着团队规模扩大,我们需要一个内部服务器来:

  • 托管 Git 仓库(代码管理)
  • 自动化构建与测试(CI/CD)
  • 共享文件和文档
  • 部署内部工具和服务

于是我主导搭建了一套基于 Linux 的服务器系统。

硬件配置

服务器主机

  • CPU:Intel i7-10700
  • 内存:32GB DDR4
  • 存储:512GB SSD + 2TB HDD
  • 网络:千兆以太网

网络拓扑

1
2
3
4
5
6
7
8
校园网

路由器(端口映射)

服务器(内网 IP)
├── Git服务(端口 3000)
├── CI/CD(端口 8080)
└── 文件服务(端口 445)

系统架构

操作系统

Ubuntu Server 22.04 LTS

  • 稳定性好
  • 社区支持完善
  • 软件包丰富

服务组件

1. Git 代码托管 - Gitea

1
2
3
4
# 安装 Gitea
wget -O gitea https://dl.gitea.io/gitea/1.19/gitea-1.19-linux-amd64
chmod +x gitea
./gitea web

功能:

  • 私有仓库管理
  • 权限控制
  • WebHook 支持
  • Issue 跟踪

2. CI/CD - Jenkins

自动化构建流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'make build'
}
}
stage('Test') {
steps {
sh 'make test'
}
}
stage('Deploy') {
steps {
sh 'make deploy'
}
}
}
}

3. 文件共享 - Samba

提供 Windows 风格的文件共享:

1
2
3
4
5
[shared]
path = /data/shared
read only = no
browseable = yes
valid users = @team

4. 容器化 - Docker

使用 Docker 部署各类服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# docker-compose.yml
version: '3'
services:
gitea:
image: gitea/gitea:latest
ports:
- "3000:3000"
volumes:
- ./data:/data

jenkins:
image: jenkins/jenkins:lts
ports:
- "8080:8080"
volumes:
- ./jenkins_home:/var/jenkins_home

安全加固

1. 防火墙配置

1
2
3
4
5
# 只开放必要端口
ufw allow 22/tcp # SSH
ufw allow 3000/tcp # Gitea
ufw allow 8080/tcp # Jenkins
ufw enable

2. SSH 密钥认证

禁用密码登录,只允许密钥:

1
2
3
# /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes

3. 定期更新

1
2
3
4
5
6
# 每周自动更新
cat > /etc/cron.weekly/apt-update << EOF
#!/bin/bash
apt update && apt upgrade -y
EOF
chmod +x /etc/cron.weekly/apt-update

4. Fail2ban 防暴力破解

1
2
apt install fail2ban
systemctl enable fail2ban

备份策略

自动备份脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# backup.sh - 每日备份

BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR

# 备份 Git 仓库
tar -czf $BACKUP_DIR/gitea.tar.gz /data/gitea

# 备份数据库
mysqldump -u root -p$DB_PASS --all-databases > $BACKUP_DIR/db.sql

# 删除30天前的备份
find /backup -type d -mtime +30 -exec rm -rf {} \;

异地备份

使用 rsync 同步到远程服务器:

1
rsync -avz /backup/ user@remote:/backup/

监控与告警

系统监控 - Prometheus + Grafana

1
2
3
4
5
# prometheus.yml
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']

监控指标:

  • CPU 使用率
  • 内存使用率
  • 磁盘 I/O
  • 网络流量

告警通知

当系统异常时,通过邮件/微信告警:

1
2
3
4
def check_disk_usage():
usage = psutil.disk_usage('/').percent
if usage > 80:
send_alert(f"磁盘使用率过高: {usage}%")

性能优化

1. SSD 加速

  • 系统盘:SSD
  • 数据盘:HDD
  • 使用 LVM 管理

2. 内存优化

1
2
3
4
# 调整swap大小
dd if=/dev/zero of=/swapfile bs=1G count=8
mkswap /swapfile
swapon /swapfile

3. 网络优化

1
2
3
# 增大TCP缓冲区
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216

使用统计

经过半年运行:

  • 代码仓库:45个
  • 团队成员:18人
  • CI/CD构建:600+ 次
  • 平均正常运行时间:99.5%

运维经验

踩过的坑

  1. 端口冲突

    • 多个服务使用相同端口导致冲突
    • 解决:统一规划端口分配
  2. 权限问题

    • Docker容器内外权限不一致
    • 解决:使用统一的UID/GID
  3. 磁盘满了

    • 日志文件占满磁盘
    • 解决:配置日志轮转

最佳实践

  • 一切配置皆代码(Infrastructure as Code)
  • 定期演练故障恢复
  • 文档化所有操作流程
  • 使用版本控制管理配置文件

后续计划

  • 迁移到 Kubernetes 集群
  • 添加对象存储服务(MinIO)
  • 搭建内部知识库(Wiki.js)
  • 实现高可用架构

服务器运维是一门实践性很强的技术,需要不断学习和总结经验。欢迎交流!

avatar
c10
机器人开发者 / 技术分享 / 摄影爱好者
Follow Me
Announcement
欢迎来到我的技术博客!🚀
这里记录我的机器人项目和技术心得。
持续更新中...