Commit Graph

90 Commits

Author SHA1 Message Date
8d35d5c2de chore: psycopg 改用 binary extra,精简 Dockerfile 的 apt 依赖
psycopg[binary] 替代并列声明的 psycopg + psycopg-binary。上游的
binary extra 是 psycopg-binary==<同版本> 的精确 pin,而原来两条各自
带范围,没有东西保证它们同步——单独升级其中一个就可能凑出上游没测过
的组合。解析结果不变,requirements.txt 只多了 extra 自带的
implementation_name != 'pypy' 标记。

apt 依赖从 10 个降到 4 个:
- curl / unzip / openssl:全仓库零引用。解压走 Python zipfile,
  健康检查走 xmlrpc,openssl 装的是 CLI 而 Python 要的是 libssl
- libpq5:psycopg_binary.libs 自带 libpq.so.5.18,容器内实测
  psycopg.pq.__impl__ == binary
- libjpeg62-turbo:pillow.libs 自带 libjpeg.so.62
- zlib1g:base 镜像的 CPython 已经带着

保留 ca-certificates(smtplib 走 TLS 时读系统信任库,不是 certifi)、
clang-format(submission/utils.py 调用)、passwd(entrypoint 建账号)、
supervisor。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 23:11:33 -06:00
8557f8a5f5 refactor: python-dateutil 换成标准库
- contest 后台创建/编辑:dateutil.parser.parse 换成
  datetime.fromisoformat。serializer 里 start_time/end_time 声明的是
  DateTimeField,而 validate_serializer 做的是 request.data = s.data,
  即重新序列化一遍,所以视图拿到的必定是 DRF 规范化后的 ISO 8601,
  dateutil 的宽容解析能力在这里从来没用上
- AI 学情统计:relativedelta 换成 shift_months 辅助函数,复刻月末
  收缩语义(1月31日 + 1个月 = 2月28/29日)。_parse_duration 的配置
  由 delta 对象改为 rewind/advance 可调用,周档和月档统一

删除依赖:python-dateutil、six

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 23:05:50 -06:00
989b33d827 refactor: 移除 2FA 功能与三个冗余依赖
2FA 早已是死代码:TOTP 相关端点标注为前端未调用,前端唯一的
two_factor_auth 是硬编码 false,没有任何入口能打开它。

- 删除 TwoFactorAuthAPI、CheckTFARequiredAPI、_totp* 辅助函数、
  TwoFactorAuthCodeSerializer 及各 serializer 的 tfa_code 字段
- 删除管理端写 two_factor_auth/tfa_token 的分支。登录已不再校验
  TOTP,若保留写入路径,置 True 会变成静默的安全降级
- 删除 User.two_factor_auth / tfa_token 字段(迁移 0009)
- 移除 django-dbconn-retry:仅挂在 INSTALLED_APPS,代码零引用。
  DATABASES 未配置 CONN_MAX_AGE(默认 0),本就没有持久连接需要
  重连修复。要开持久连接用 Django 自带的 CONN_HEALTH_CHECKS
- requests 换成 httpx(openai 已经引入):删除废弃的
  ReleaseNotesAPI,judge dispatcher 显式传 timeout=None 以保持
  requests 原本的无超时行为,判题请求是同步等结果的

依赖净减 5 个:otpauth、qrcode、requests、charset-normalizer、
django-dbconn-retry

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 23:00:45 -06:00
92e1c2b75d refactor(deploy): 容器内 nginx 换成 Caddy
TLS 和域名由前面的 Nginx Proxy Manager 负责,容器里这层只做静态文件
和反代,用 Caddy 配置更短,也消掉了两个坑:add_header 不继承、
entrypoint 里 __IP_HEADER__ 的 sed 替换。

- deploy/nginx/ 四个配置文件合并成一个 deploy/caddy/Caddyfile
- Dockerfile 去掉 nginx 包,改从官方镜像拷 Caddy 静态二进制
- supervisord 的 nginx 程序换成 caddy,跑在非特权的 server 账号下
- entrypoint 删掉自签证书、http_locations.conf 软链、IP header sed

行为对齐:body 上限写 200MiB 才等于 nginx 的 200M;心跳和 /assets/
继续不记访问日志;安全头、缓存策略、gzip 覆盖范围保持不变。

两处行为变化:
- 访问日志变成 JSON,路径 /data/log/caddy_access.log
- X-Accel-Buffering 是 nginx 私有头,AI 的 SSE 改由 flush_interval -1
  保证不缓冲,上线需实测

FORCE_HTTPS 和 LOWER_IP_HEADER 两个环境变量随之作废,真实 IP 改由
trusted_proxies + {client_ip} 从 NPM 的 XFF 解析。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 09:50:46 -06:00
8d6f4616b9 perf(nginx): 修复 JS 未压缩,静态资源加不可变缓存
nginx 1.21.1 起 mime.types 把 .js 标成 text/javascript,而 gzip_types
只写了 application/javascript,导致前端 JS 实际一直在裸传。补全类型列表,
并加上 application/json 让 API 响应也走压缩。

gzip_comp_level 此前用的是默认值 1,改为 6,实测 js+css 总量 3.85M → 3.44M。

/assets/ 下的产物文件名带内容 hash,加 immutable 永久缓存,省掉每次进页面
对 32 个 chunk 的条件请求;index.html 反过来设 no-cache,避免发版后刷不到新版。

location 里出现 add_header 会中断 http 级 add_header 的继承,
两个 block 都重新声明了原有的三个安全头。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 09:11:48 -06:00
502078b51b update 2026-08-05 08:18:02 -06:00
1e6041d13d fix 2026-07-02 19:16:09 -06:00
dab6734d03 switch docker image 2026-06-14 09:13:05 -06:00
7974d12475 build: move ruff from dev to main dependencies (needed at runtime for code formatting)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 08:05:12 -06:00
0764946c17 add wc 2026-06-03 07:19:57 -06:00
57c0572fd9 async 2026-05-26 21:25:26 -06:00
8731012f47 use asgi 2026-05-26 07:37:05 -06:00
ed8a2f575f update 2026-05-25 21:57:38 -06:00
ae372b4ee1 fix pip 2026-05-05 07:43:25 -06:00
0fd7dedea6 update deps 2026-05-05 07:23:59 -06:00
f2b046c650 update 2025-12-20 22:04:03 +08:00
22d4a9057b add ws 2025-10-07 17:03:14 +08:00
6e1e3ef0c6 新增AI分析 2025-09-24 01:02:29 +08:00
92adfd5415 update 2025-06-13 18:55:38 +08:00
yuetsh
5a8fb8d81a remove pytz 2024-06-11 15:07:48 +08:00
6cf7087339 update Django to v5 2024-06-05 17:40:45 +08:00
yuetsh
d2dc058af5 remove heartbeat log 2024-06-04 22:25:31 +08:00
2ca96ca228 update python deps 2024-06-04 22:08:31 +08:00
bf906fcf25 update python deps 2024-06-04 18:48:19 +08:00
2d2128fa06 update 2024-05-08 18:32:54 +08:00
Mikucat
c25a314001 fix: sync UID and GID with JudgeServer 2024-04-07 18:06:37 +08:00
Mikucat
954463f9fd chore: update denpendencies 2024-04-04 15:37:43 +08:00
helsonxiao
e009777c6f fix: rundramatiq 2022-05-08 17:13:22 +08:00
Beichi-CHs
af641dd421 fix useless escape symbol 2021-11-19 00:26:42 +08:00
Harry Chen
040fb6fbbd migrate health_check.py to python3 2021-11-18 18:51:29 +08:00
Beichi-CHs
3754fa2542 upgrade build configration 2021-11-18 12:38:49 +08:00
virusdefender
ece38de1d5 database connection retry 2019-03-26 10:02:49 +08:00
virusdefender
a5f0c8eb31 remove celery and use dramatiq 2019-03-11 17:59:24 +08:00
virusdefender
6b7654a0c3 update to django 2.0 2019-03-11 11:25:10 +08:00
virusdefender
5ae50e4e54 设置 gunicorn 和 celery 的 worker 数量,最小是 2 2019-01-05 14:53:55 +08:00
李扬
829591ac05 Update nginx.conf 2018-11-05 08:15:53 +08:00
virusdefender
8403726455 fix old files permission 2018-10-14 21:33:08 +08:00
virusdefender
94baab8570 try to fix permission 2018-10-14 17:49:20 +08:00
zema1
8ee1b514e3 Fixed problems in dispatcher, fixed testcase download error 2018-08-21 15:22:35 +08:00
virusdefender
ee12a1f527 对 testcase 使用 nobody 700 的权限 2018-08-10 08:05:02 +08:00
zimo.zhang
50c8487a50 fix requirement warning 2018-07-15 12:35:14 +08:00
virusdefender
d5468803ba use secret key file 2018-05-05 15:21:53 +08:00
virusdefender
0e83a920b2 fix ip header 2018-01-06 23:58:33 +08:00
zema1
d8221ca8f5 fix cdn host replacement 2018-01-06 22:24:55 +08:00
virusdefender
dbce3e443a redis retry 2018-01-06 14:26:46 +08:00
virusdefender
b50f5404ff update replace static cdn host function 2018-01-05 10:44:19 +08:00
virusdefender
679512e3cc fix FORCE_HTTPS
add ip_header env
2018-01-05 10:44:15 +08:00
virusdefender
41f248091e add replace cdn host function 2017-12-27 22:04:06 +08:00
virusdefender
3c8e6cd9f3 use entrypoint 2017-12-24 11:01:33 +08:00
virusdefender
3c70ecbd19 add sentry 2017-12-24 11:01:33 +08:00