976 字
5 分钟
记录一下折腾服务器
NOTE

操作系统是阿里云轻型服务器提供的 Debian 12.10,部分内容可能与官方镜像不同。

更新软件包#

Terminal window
sudo apt update
sudo apt upgrade

修改 hostname#

查看

Terminal window
hostname

修改

Terminal window
hostnamectl set-hostname newhostname

设置 swap#

创建 swap#

查看

Terminal window
free -h

创建 swap 文件

Terminal window
sudo fallocate -l 4G /swapfile

swap 大小参考

设置权限

Terminal window
sudo chmod 600 /swapfile

格式化为 swap

Terminal window
sudo mkswap /swapfile

启用 swap

Terminal window
sudo swapon /swapfile

开机启动#

编辑 /etc/fstab

Terminal window
sudo nano /etc/fstab
/etc/fstab
...
/swapfile none swap sw 0 0

调整 swappiness#

查看当前值

Terminal window
cat /proc/sys/vm/swappiness

编辑 /etc/sysctl.conf

Terminal window
sudo nano /etc/sysctl.conf

添加或修改 swappiness 值(10 - 20)

/etc/sysctl.conf
...
vm.swappiness = 10
...

修改 SSH 端口#

CAUTION

在确认新端口能连上之前,不要关闭当前 SSH 会话

查看

Terminal window
sudo ss -tlnp | grep ssh

编辑 /etc/ssh/sshd_config

Terminal window
sudo nano /etc/ssh/sshd_config

先新增端口,确认没问题后再删除 22 端口

/etc/ssh/sshd_config
...
Port 22
Port 2222
...

检查配置是否有误(没有输出就是正常)

Terminal window
sudo sshd -t

重载 SSH 服务

Terminal window
sudo systemctl reload ssh
WARNING

不要使用 restart 防止自己掉线。

测试自己能否成功连接,确认没有问题后就可以把 22 端口的配置注释或者直接删掉。

安装 Docker#

Docker 官方安装教程

普通用户加入 docker 组#

Terminal window
sudo usermod -aG docker youruser
IMPORTANT

加入用户组后需要重启会话才可生效。

配置镜像加速源#

可以在这个网站查看镜像加速源。

修改 /etc/docker/daemon.json

Terminal window
sudo nano /etc/docker/daemon.json
/etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.1panel.live"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "3"
}
}

重启 Docker

Terminal window
sudo systemctl daemon-reexec
sudo systemctl restart docker

测试

Terminal window
docker run --rm hello-world

部署 nginx#

创建目录

Terminal window
sudo mkdir -p /srv/stack/nginx/{conf.d,log,html}
sudo chown -R admin:admin /srv/stack

创建 /srv/stack/docker-compose.yml

Terminal window
nano /srv/stack/docker-compose.yml
/srv/stack/docker-compose.yml
services:
nginx:
image: nginx:1.28-alpine
container_name: nginx
ports:
- "80:80"
environment:
- TZ=Asia/Shanghai
volumes:
- /srv/stack/nginx/conf.d:/etc/nginx/conf.d:ro
- /srv/stack/nginx/log:/var/log/nginx
# - /srv/stack/nginx/html:/usr/share/nginx/html
restart: unless-stopped

创建 nginx 配置

Terminal window
nano /srv/stack/nginx/conf.d/default.conf
/srv/stack/nginx/conf.d/default.conf
server {
listen 80;
server_name _;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

启动

Terminal window
docker compose up -d

使用 lego 申请证书#

新建 /srv/stack/lego/docker-compose.yml

Terminal window
nano /srv/stack/lego/docker-compose.yml
/srv/stack/lego/docker-compose.yml
services:
lego:
image: goacme/lego
container_name: lego
env_file:
- ./config/.env
environment:
- LEGO_PATH=/data
volumes:
- /srv/stack/lego:/data

编写 /srv/stack/lego/config/.env

Terminal window
nano /srv/stack/lego/config/.env
/srv/stack/lego/config/.env
ALICLOUD_ACCESS_KEY=YOUR_ACCESS_KEY_ID
ALICLOUD_SECRET_KEY=YOUR_ACCESS_KEY_SECRET
LEGO_EMAIL=YOUR_EMAIL

首次申请#

Terminal window
docker compose -f /srv/stack/lego/docker-compose.yml run --rm lego --dns alidns -a -d example.com -d *.example.com run

设置定时任务#

Terminal window
crontab -e
...
0 3 * * * cd /srv/stack && docker compose -f ./lego/docker-compose.yml run --rm lego --dns alidns -d example.com -d *.example.com renew && docker compose exec nginx nginx -s reload

nginx 开启 HTTPS#

生成默认证书

Terminal window
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /srv/stack/nginx/cert/default.key -out /srv/stack/nginx/cert/default.crt -subj "/CN=localhost"

修改 /srv/stack/docker-compose.yml

/srv/stack/docker-compose.yml
services:
nginx:
image: nginx:1.28-alpine
container_name: nginx
ports:
- "80:80"
- "443:443"
environment:
- TZ=Asia/Shanghai
volumes:
- /srv/stack/nginx/conf.d:/etc/nginx/conf.d:ro
- /srv/stack/lego/certificates:/ssl/example.com:ro
- /srv/stack/nginx/cert:/ssl/nginx/:ro
- /srv/stack/nginx/log:/var/log/nginx
# - /srv/stack/nginx/html:/usr/share/nginx/html
restart: unless-stopped

修改 /srv/stack/nginx/conf.d/default.conf

/srv/stack/nginx/conf.d/default.conf
server {
listen 80 default_server;
server_name _;
return 444;
}
server {
listen 443 ssl default_server;
server_name _;
ssl_certificate /ssl/nginx/default.crt;
ssl_certificate_key /ssl/nginx/default.key;
return 444;
}

创建 /srv/stack/nginx/conf.d/gitea.conf

Terminal window
nano /srv/stack/nginx/conf.d/gitea.conf
/srv/stack/nginx/conf.d/gitea.conf
server {
listen 80;
server_name git.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name git.example.com;
http2 on;
ssl_certificate /ssl/example.com/example.com.crt;
ssl_certificate_key /ssl/example.com/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location / {
client_max_body_size 512M;
proxy_set_header Connection $http_connection;
proxy_set_header Upgrade $http_upgrade;
proxy_pass http://gitea:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}

重新构建 nginx 容器

Terminal window
docker compose -f /srv/stack/docker-compose.yml up -d --build nginx

部署 Gitea Rootless#

创建目录

Terminal window
mkdir -p /srv/stack/gitea/{config,data}
chown 1000:1000 -R /srv/stack/gitea

编辑 /srv/stack/docker-compose.yml

/srv/stack/docker-compose.yml
services:
nginx:
image: nginx:1.28-alpine
container_name: nginx
ports:
- "80:80"
- "443:443"
environment:
- TZ=Asia/Shanghai
volumes:
- /srv/stack/nginx/conf.d:/etc/nginx/conf.d:ro
- /srv/stack/lego/certificates:/ssl/unknowncat2048.top:ro
- /srv/stack/nginx/cert:/ssl/nginx/:ro
- /srv/stack/nginx/log:/var/log/nginx
# - /srv/stack/nginx/html:/usr/share/nginx/html
restart: unless-stopped
depends_on:
- gitea
gitea:
image: gitea/gitea:1.25-rootless
container_name: gitea
ports:
- "1234:2222"
volumes:
- /srv/stack/gitea/data:/var/lib/gitea
- /srv/stack/gitea/config:/etc/gitea
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
restart: unless-stopped

启动容器

Terminal window
docker compose -f /srv/stack/docker-compose.yml up -d

访问 https://git.example.com 进入 Gitea 安装页面。

安装 fail2ban#

安装

Terminal window
sudo apt update
sudo apt install -y fail2ban

启动

Terminal window
sudo systemctl enable --now fail2ban

查看

Terminal window
sudo fail2ban-client status

查看具体规则

Terminal window
sudo fail2ban-client status xxx

防止 SSH 爆破#

创建 /etc/fail2ban/jail.d/sshd.conf

Terminal window
sudo nano /etc/fail2ban/jail.d/sshd.conf
/etc/fail2ban/jail.d/sshd.conf
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h

根据 nginx 日志屏蔽#

检查自带 filter

Terminal window
ls /etc/fail2ban/filter.d/nginx*

创建 nginx jail

Terminal window
sudo nano /etc/fail2ban/jail.d/nginx.conf
/etc/fail2ban/jail.d/nginx.conf
[nginx-http-auth]
enabled = true
port = http,https
logpath = /srv/stack/nginx/log/error.log
backend = auto
maxretry = 5
findtime = 10m
bantime = 1h
[nginx-botsearch]
enabled = true
port = http,https
logpath = /srv/stack/nginx/log/access.log
backend = auto
maxretry = 2
findtime = 10m
bantime = 12h

根据 Gitea 日志屏蔽#

Gitea 官方教程

重启 fail2ban#

Terminal window
sudo systemctl restart fail2ban

分割 nginx 日志#

使用系统自带的 logrotate

Terminal window
sudo nano /etc/logrotate.d/nginx-docker
/etc/logrotate.d/nginx-docker
/srv/stack/nginx/log/*.log {
daily
rotate 14
size 100M
missingok
notifempty
compress
delaycompress
sharedscripts
copytruncate
}
记录一下折腾服务器
https://blog.unknowncat2048.top/posts/devops/cuustom-server-record/
作者
碌碌无为喵神SAMA
发布于
2026-01-14
许可协议
CC BY-NC-SA 4.0