NOTE操作系统是阿里云轻型服务器提供的
Debian 12.10,部分内容可能与官方镜像不同。
更新软件包
sudo apt updatesudo apt upgrade修改 hostname
查看
hostname修改
hostnamectl set-hostname newhostname设置 swap
创建 swap
查看
free -h创建 swap 文件
sudo fallocate -l 4G /swapfile设置权限
sudo chmod 600 /swapfile格式化为 swap
sudo mkswap /swapfile启用 swap
sudo swapon /swapfile开机启动
编辑 /etc/fstab
sudo nano /etc/fstab.../swapfile none swap sw 0 0调整 swappiness
查看当前值
cat /proc/sys/vm/swappiness编辑 /etc/sysctl.conf
sudo nano /etc/sysctl.conf添加或修改 swappiness 值(10 - 20)
...vm.swappiness = 10...修改 SSH 端口
CAUTION在确认新端口能连上之前,不要关闭当前 SSH 会话。
查看
sudo ss -tlnp | grep ssh编辑 /etc/ssh/sshd_config
sudo nano /etc/ssh/sshd_config先新增端口,确认没问题后再删除 22 端口
...Port 22Port 2222...检查配置是否有误(没有输出就是正常)
sudo sshd -t重载 SSH 服务
sudo systemctl reload sshWARNING不要使用
restart防止自己掉线。
测试自己能否成功连接,确认没有问题后就可以把 22 端口的配置注释或者直接删掉。
安装 Docker
普通用户加入 docker 组
sudo usermod -aG docker youruserIMPORTANT加入用户组后需要重启会话才可生效。
配置镜像加速源
可以在这个网站查看镜像加速源。
修改 /etc/docker/daemon.json
sudo nano /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
sudo systemctl daemon-reexecsudo systemctl restart docker测试
docker run --rm hello-world部署 nginx
创建目录
sudo mkdir -p /srv/stack/nginx/{conf.d,log,html}sudo chown -R admin:admin /srv/stack创建 /srv/stack/docker-compose.yml
nano /srv/stack/docker-compose.ymlservices: 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 配置
nano /srv/stack/nginx/conf.d/default.confserver { 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; }}启动
docker compose up -d使用 lego 申请证书
新建 /srv/stack/lego/docker-compose.yml
nano /srv/stack/lego/docker-compose.ymlservices: 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
nano /srv/stack/lego/config/.envALICLOUD_ACCESS_KEY=YOUR_ACCESS_KEY_IDALICLOUD_SECRET_KEY=YOUR_ACCESS_KEY_SECRET
LEGO_EMAIL=YOUR_EMAIL首次申请
docker compose -f /srv/stack/lego/docker-compose.yml run --rm lego --dns alidns -a -d example.com -d *.example.com run设置定时任务
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 reloadnginx 开启 HTTPS
生成默认证书
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
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
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
nano /srv/stack/nginx/conf.d/gitea.confserver { 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 容器
docker compose -f /srv/stack/docker-compose.yml up -d --build nginx部署 Gitea Rootless
创建目录
mkdir -p /srv/stack/gitea/{config,data}chown 1000:1000 -R /srv/stack/gitea编辑 /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启动容器
docker compose -f /srv/stack/docker-compose.yml up -d访问 https://git.example.com 进入 Gitea 安装页面。
安装 fail2ban
安装
sudo apt updatesudo apt install -y fail2ban启动
sudo systemctl enable --now fail2ban查看
sudo fail2ban-client status查看具体规则
sudo fail2ban-client status xxx防止 SSH 爆破
创建 /etc/fail2ban/jail.d/sshd.conf
sudo nano /etc/fail2ban/jail.d/sshd.conf[sshd]enabled = trueport = sshlogpath = %(sshd_log)sbackend = systemd
maxretry = 5findtime = 10mbantime = 1h根据 nginx 日志屏蔽
检查自带 filter
ls /etc/fail2ban/filter.d/nginx*创建 nginx jail
sudo nano /etc/fail2ban/jail.d/nginx.conf[nginx-http-auth]enabled = trueport = http,httpslogpath = /srv/stack/nginx/log/error.logbackend = auto
maxretry = 5findtime = 10mbantime = 1h
[nginx-botsearch]enabled = trueport = http,httpslogpath = /srv/stack/nginx/log/access.logbackend = auto
maxretry = 2findtime = 10mbantime = 12h根据 Gitea 日志屏蔽
重启 fail2ban
sudo systemctl restart fail2ban分割 nginx 日志
使用系统自带的 logrotate
sudo nano /etc/logrotate.d/nginx-docker/srv/stack/nginx/log/*.log { daily rotate 14 size 100M missingok notifempty compress delaycompress sharedscripts copytruncate}