skip to content

Search

在学校服务器上部署科创平台

5 min read

暑假和同学一起开发了科创平台,老师申请下来云服务器后,开始进行部署的工作。

# deploy
Not in series

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

3. 准备配置文件

在 GPT-5.1-Codex 的帮助下,准备了docker-compose.ymlDockerfilenginx.conf和一些必要的脚本。

整个项目一共启动四个容器,处于一个由 Docker 构建的网络内,整个系统由 nginx 统一提供对外访问的接口:

  1. 数据库服务 使用postgres:17镜像,都是常规配置,用一个挂载卷来存数据,由于该镜像只认POSTGRES_USERPOSTGRES_PASSWORDPOSTGRES_DB这三个环境变量,所以还要显示指定;
  2. 后端python:3.11镜像构建,日志目录和.env挂载到容器内,由于用的是 Django 框架,还要重新准备全新的 migration 文件,以及一些前端访问和 jAccount 登录重定向的 endpoint 需要配置;
  3. cron 服务 和后端使用同一个镜像,但启动的是 cron 服务,配置是每天凌晨 4 点时执行清理 Django Simple JWT 的过期令牌表:
python manage.py flushexpiredtokens
  1. 前端node:22镜像中编译产物,然后移动到nginx:stable镜像构建的容器的对应位置,在nginx.conf文件中把/api的请求重定向到子网络内的后端服务,把 HTTP 的 80 端口和主机的 80 端口做个映射(HTTPS 的 443 端口等域名申请下来了再补上)。

这一切繁琐的折磨当然都是为了最后的docker compose up -d

为了让这东西能正常起来,也是调试了两天才解决,各种烦人的小 bug 好多。贴一张蛮好玩的套娃图(从自己的终端连上服务器,进入数据库的容器内,再进入 PostgresSQL 的交互终端)

shell in shell

Footnotes

  1. Install Docker Engine on Ubuntu, 利用国内网络丝滑的安装 Docker, 阿里云 Docker CE 镜像