从零开始在 Windows 11 上自托管 Judge0

星隐

当我决定自托管 Judge0 时,我照着教程一步步操作,但几乎什么都没理解。容器不断重启,数据库崩溃,文档打不开。我一直在问:“到底发生了什么?”

这篇文章,就是我当时希望能看到的那篇指南。

本文将解释:

  • 什么是自托管
  • 为什么必须使用 Docker
  • 为什么要使用 WSL
  • 每条命令在做什么
  • 常见问题为何发生
  • 如何排查并修复问题

没有前置假设,也不会给出模糊解释。


1. Judge0 是什么

Judge0 不是一个网站,而是一个后端代码执行服务。

它的作用是:

  • 接收源代码(Python、C++、Java 等)
  • 在隔离环境中安全执行
  • 返回输出结果、错误信息、运行时间与内存占用

它通常作为在线编译器、刷题平台或面试系统背后的执行引擎存在。

你不会“打开” Judge0。
而是你的应用程序通过 HTTP API 与它通信。


2. 什么是自托管

自托管指的是:服务由你自己运行,而不是依赖第三方服务器。

不自托管的情况:

1
你的应用 → 第三方 API → 对方服务器执行代码 → 返回结果

自托管的情况:

1
你的应用 → 你自己的系统 → Judge0 → 返回结果

优势包括:

  • 没有 API 次数限制
  • 不需要按请求付费
  • 拥有完全控制权
  • 获得真实的后端运维经验

3. 为什么必须使用 Docker

Judge0 会执行“不可信代码”。如果没有隔离机制,这是非常危险的。

Docker 提供了:

  • 进程隔离(沙箱)
  • 资源限制(CPU / 内存)
  • 独立环境
  • 可复现部署

如果不使用 Docker:

  • 代码可能访问你的系统文件
  • 依赖版本可能冲突
  • 环境难以清理
  • 安全风险极高

Docker 是执行代码类服务的基础设施,而不是可选项。


4. Windows 上可以运行 Docker 吗

可以。

Docker 原生运行在 Linux 上。在 Windows 中运行 Linux 工具的最佳方式是:

WSL(Windows Subsystem for Linux)。

本教程使用:

  • WSL2
  • Ubuntu
  • Docker Engine(docker.io)

不使用 Docker Desktop,原因如下:

  • 增加额外抽象层
  • 容易与 Linux 原生 Docker 冲突
  • 对当前场景并非必须

5. 安装 WSL 与 Ubuntu

以管理员身份打开 PowerShell:

1
wsl --install

执行后重启系统。

然后从开始菜单打开 Ubuntu,创建 Linux 用户名与密码。

后续所有操作都在 Ubuntu 终端中完成。


6. 更新 Ubuntu

在 Ubuntu 中执行:

1
sudo apt update && sudo apt upgrade -y

作用:

  • 更新安全补丁
  • 保证软件兼容性
  • 为 Docker 安装准备干净环境

7. 安装 Docker Engine(Linux 原生)

1
2
sudo apt install -y docker.io
sudo apt install -y docker-compose

此时 Docker 安装在 Linux 子系统中,而不是 Windows。

这样做的好处是:

  • 行为更接近真实服务器
  • 避免 Windows 特有问题
  • 与云服务器环境一致

8. 修复 Docker 权限问题

默认情况下,Docker 需要使用 sudo。

为了避免每次输入 sudo:

1
2
sudo usermod -aG docker $USER
newgrp docker

现在当前用户可以直接使用 Docker。


9. 验证 Docker 是否正常工作

1
docker run hello-world

该命令用于测试:

  • Docker 守护进程是否运行
  • 是否可以拉取镜像
  • 是否可以启动容器

这是一项诊断测试。


10. 下载 Judge0

1
2
3
4
wget https://github.com/judge0/judge0/releases/download/v1.13.1/judge0-v1.13.1.zip
sudo apt install -y unzip
unzip judge0-v1.13.1.zip
cd judge0-v1.13.1

解压后你会得到:

  • Docker Compose 配置
  • 多服务架构
  • 类似生产环境的部署结构

11. 配置文件说明

这一部分容易出错。

在 Judge0 v1.13.1 中:

  • .env 文件不会被使用
  • 必须使用 judge0.conf

Docker Compose 文件中明确指定:

1
2
env_file:
- judge0.conf

如果修改了错误的文件,PostgreSQL 会不断重启。


12. 编辑 judge0.conf

1
nano judge0.conf

修改或添加以下内容:

1
2
3
4
5
# Redis
REDIS_PASSWORD=redis123

# PostgreSQL
POSTGRES_PASSWORD=postgres123

保存并退出:

1
2
Ctrl + O → 回车
Ctrl + X

13. 按顺序启动服务

先启动数据库与缓存:

1
2
docker-compose up -d db redis
sleep 15s

原因:数据库必须完成初始化。

然后启动其余服务:

1
2
docker-compose up -d
sleep 5s

14. 常见问题:数据库不断重启

如果执行:

1
docker-compose ps

看到:

1
db   Restarting

说明:

  • PostgreSQL 未读取到必要环境变量
  • 或旧数据与当前配置冲突

解决方法:

1
2
3
4
docker-compose down -v
docker-compose up -d db redis
sleep 15s
docker-compose up -d

-v 会删除旧数据卷。


15. 验证服务状态

1
docker-compose ps

应看到:

1
2
3
4
db      Up
redis Up
server Up
workers Up

16. 访问 Judge0

浏览器打开:

1
http://localhost:2358/docs

该页面是:

  • API 文档
  • 测试接口

它不是用户产品,而是接口验证界面。


17. 你构建了什么

你构建的是一套后端基础设施,而不是一个应用。

Judge0:

  • 接收 HTTP 请求
  • 执行代码
  • 返回 JSON 响应

未来你的后端服务会调用它。


18. 是否需要长期运行

不建议在笔记本上长期运行。

Judge0 会消耗:

  • 内存
  • CPU
  • 后台资源

推荐使用方式:

启动:

1
docker-compose up -d

停止:

1
docker-compose down

个人电脑不是服务器。


19. 为什么云平台无法访问本地 Judge0

如果你将前端部署到:

  • Vercel
  • Render
  • Netlify

它们无法访问你的 localhost

如果需要 24 小时在线运行,必须部署到云服务器(例如 VPS)。

目前不存在真正免费的长期代码执行环境。


20. 实际收获

即使没有公网部署,你已经掌握:

  • Docker 基础
  • 服务编排
  • 环境隔离
  • 容器故障排查
  • 后端系统架构认知

这些经验远比一个可演示的 Demo 更重要。


21. 启动与停止 Judge0

启动:

1
2
cd ~/judge0-v1.13.1
docker-compose up -d

停止:

1
2
cd ~/judge0-v1.13.1
docker-compose down

总结

自托管不会让事情变得免费,而是让它属于你。

Docker 不会消除依赖,而是将依赖隔离起来。

如果你理解了这一点,就真正理解了你刚刚构建的系统。


下一步建议

  • 将 Judge0 集成到 Node.js 后端
  • 部署到云服务器
  • 深入阅读官方文档

即使不进行公网部署,这次实践已经完成了一次完整的后端工程学习过程。

  • 标题: 从零开始在 Windows 11 上自托管 Judge0
  • 作者: 星隐
  • 创建于 : 2026-01-18 10:00:00
  • 更新于 : 2026-03-14 22:19:36
  • 链接: https://www.starin.top/post/6fac9bff0a8b/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。