如今 CTF 比赛很火 ,咱们学校也要搞一个比赛,搭建平台这些活就由我来干了,在这过程当中遇到了一些问题,作个记录,方便之后再搭建的时候操做。html
我选择的是 CTFd 这个框架,网上的资料不少,配上插件,搭建动态靶机靶场很方便。python
一开始的时候是打算手动安装各类环境的,不过当我看到有提供了用 docker 安装的方式后,仍是打算用 docker 了,一是方便,而是之后即便在不一样的环境上搭建,都是同样的操做。linux
项目地址: github, 这是我新建的一个仓库,从分支 修改而来的,能够直接跑起来,主要是修复了一下依赖,原项目有些库已通过时了。git
git clone https://github.com/zaunist/CTFD-single.git
进入刚才下载下来的文件夹内github
cd CTFD-single/
添加 docker hub 镜像,修改 /etc/docker/daemon.json 文件, daemon.json 里能够定义很多参数,我这里只设置了镜像地址和 dns 地址。docker
{ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/", "https://nrbewqda.mirror.aliyuncs.com"], "dns": ["10.200.4.1"] }
设置 docker swarmjson
sudo docker swarm init
构建 dockerbootstrap
sudo docker-compose up -d
到这里就已经构建完成,访问 8000 端口就能够添加题目,添加比赛服务器
这个问题是咱们学校内部致使的,学校强制要求使用学校提供的 dns 服务器,若是使用默认的 dns 解析或者设置成了其它的地址, 构建 docker 镜像时会出错。解决方法就是设置为学校内部的 dns,就是上面的 "10.200.4.1"框架
tcpdump抓包
错误一:
/usr/local/lib/python3.7/importlib/_bootstrap.py:219:RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility
在 CTFd 项目中,使用到了 gevent, 而师傅提供的 single 分支已经好久没有更新了,里面使用的是 1.4 版本,可是 1.4 版本不支持 python3.8, 而基于 alpine 构建 docker 默认就使用 python3.8 ,所以须要对 gevent 进行升级,我更换成了最新的 20.9.0 版本。
错误二:
错误信息找不到了,可是此次是由于缺乏一个库,在 requirements.txt 中添加 Flask-APScheduler==1.11.0
便可。
错误三:
构建 docker 时没有指定 python 版本,从清华源安装包的时候显示包不存在,我去清华镜像站查了一下,须要指定 python2 和 python3 的版本才行,修改以前 dockerfile 文件部份内容
apk update && \ apk add \ python \ python-dev \ linux-headers \ libffi-dev \ gcc \ make \
修改以后
apk update && \ apk add \ python3 \ python3-dev \ linux-headers \ libffi-dev \ gcc \ make \
遇到的问题也就这几个,可是花了一天时间才所有解决,花了最多时间的是 gevent 的兼容问题,一开始觉得本身有哪里配置错了,反复的构建 docker,后来搜索了好久才在一个 github 的 issue 下面看到别人的评论,知道了当前版本 gevent 不支持 python 3.8, 这才解决了问题。善用 github,以前别的问题也是在 issue 下找到的解决方法。
公众号:没有梦想的阿巧 后台回复 "群聊",一块儿学习,一块儿进步