1. 禁用 SSH 密码登录
询问了 LLM,告诉我需要编辑/etc/ssh/sshd_config,将其中的对应行改为
PasswordAuthentication no然后执行
sudo systemctl restart ssh
sudo systemctl restart sshd但经过尝试后发现仍然可以使用密码登录,遂 Google 了一下教程,根据指引,在/etc/ssh下执行
sudo grep -r PasswordAuthentication *发现/etc/ssh/sshd_config.d/50-cloud-init.conf这个文件中也有上述字段,需要将其值也改为 no。修改后重启 SSH 服务,此时成功地把密码登录禁用了。
2. 安装 Docker 并配置 Docker Hub 镜像源
由于国内的网络问题,在学校服务器上安装 Docker 和拉取镜像都十分麻烦,参考了一些文档和教程1,终于给配置好了。
安装 Docker
基本和阿里云提供的方法一致,依次执行以下命令:
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
# step 2: 信任 Docker 的 GPG 公钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Step 3: 写入软件源信息
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Step 4: 安装Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin安装完成后,执行这些命令来验证安装:
docker version
docker compose version
sudo systemctl status docker直接执行docker ps这些常用命令是需要sudo的,解决方法是将当前用户添加到 docker 用户组:
sudo usermod -aG docker $USER
newgrp docker运行容器
由于众所周知的原因,国内网络是没法直接拉取 Docker Hub 上的镜像的,而且又在最近这段时间,很多官方的镜像仓库都下架了,经过一番搜寻,发现了 GitHub 上的这个良心仓库 DockerHub,从里面选一个还能用的镜像源,然后在/etc/docker/daemon.json中加入以下字段:
{
"registry-mirrors": [
"<镜像加速器地址>"
]
}然后执行:
sudo systemctl daemon-reload
sudo systemctl restart docker这时候试着跑一个容器,发现可以正常拉取镜像并运行了:
docker run hello-world3. 准备配置文件
在 GPT-5.1-Codex 的帮助下,准备了docker-compose.yml、Dockerfile、nginx.conf和一些必要的脚本。
整个项目一共启动四个容器,处于一个由 Docker 构建的网络内,整个系统由 nginx 统一提供对外访问的接口:
- 数据库服务 使用
postgres:17镜像,都是常规配置,用一个挂载卷来存数据,由于该镜像只认POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DB这三个环境变量,所以还要显示指定; - 后端 从
python:3.11镜像构建,日志目录和.env挂载到容器内,由于用的是 Django 框架,还要重新准备全新的 migration 文件,以及一些前端访问和 jAccount 登录重定向的 endpoint 需要配置; - cron 服务 和后端使用同一个镜像,但启动的是 cron 服务,配置是每天凌晨 4 点时执行清理 Django Simple JWT 的过期令牌表:
python manage.py flushexpiredtokens- 前端 在
node:22镜像中编译产物,然后移动到nginx:stable镜像构建的容器的对应位置,在nginx.conf文件中把/api的请求重定向到子网络内的后端服务,把 HTTP 的 80 端口和主机的 80 端口做个映射(HTTPS 的 443 端口等域名申请下来了再补上)。
这一切繁琐的折磨当然都是为了最后的docker compose up -d!
为了让这东西能正常起来,也是调试了两天才解决,各种烦人的小 bug 好多。贴一张蛮好玩的套娃图(从自己的终端连上服务器,进入数据库的容器内,再进入 PostgresSQL 的交互终端)