记录一次关于CTFd搭建所踩的坑

前言

协会的任务罢了~

步骤

  1. 虚拟机搭建
  2. Docker、Docker-composer 安装 Docker swarm 启用
  3. 拉取项目 注意:这里https://github.com/xxxxxx如果因为国内访问吃力,可以换成git://github.com/xxxxxx。
  4. 部署 docker-compose up -d

实践

  1. 看起来很简单对吧,接下来,会遇到版本不匹配、apt-get换源、权限不够、redis地址异常等问题。痛苦的搭建体验。ValueError: Redis URL must specify one of the followingschemes (redis://, rediss://, unix://)

  2. 当然,在搭建官方版还是十分轻松愉快的,拉取镜像后,可能会出现“权限不够的情况”,只需要在docker-composer.yml中的每一个容器添加privileged: true
    就可以直接跑起来了。

    这时可以看看相关的容器情况docker container ls
    (原谅远程windows没有Xshell,XD)
    还可以看看容器运行情况docker stats

《 突 然 成 功 了 》

  1. 写到一半,突然项目就成功运行起来了。
  2. 这里把对ctfd-whale的插件项目安装步骤说明一下。
  3. 前面写的包错都是基于对Dockerfile内的镜像进行了修改才出现的问题,原项目作者的教程是极其细致且准确的。CTFd-Whale 推荐部署实践
  4. 这里将记录下后面搭建成功的流程


  1. 环境:Mac Bigsur 11.5.1,Linux也可。
  2. 使用代理export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890这里用了Clash代理,如果有代理的可以替换相应的端口,无代理可将https替换为git。
  3. 拉取项目 git clone -b single https://github.com/glzjin/CTFd.git
  4. token随机,docker-composer启动容器,最好不要进行更改!!!这里只有两处的修改就是对于requests.txt中的gevent版本进行修改,不然会出现编译失败的情况。具体包错原因这里没有分析,这里通过Google查询到可以对gevent版本进行更新,这是在上面修改了镜像的情况下出现包错的解决方案之一,没想到用到这里了XD。这里是对原有gevent版本进行替换后另外添加了greenlet包。修改为:gevent==1.1.0替换为gevent==1.3.4,添加greenlet==0.4.13
    以及对于Dockerfile中的python版本进行了添加,原有镜像中无法找到python、python-dev的安装包了。将pythonpython-dev更改为python3python3-dev
  5. 这里对项目的修改就结束了,然后就直接docker-composer up -d即可构建docker容器。

成果展示

  1. 成功搭建页面

成功但没完全成功

在安装成功后,发现注册不行,处于无限加载的状态,进docker查看日志发现了报错。

在issue上发现了同样的问题

随后追踪到了frankli0324的项目,在其使用指南中开始从头开始安装。

正式搭建完成

  1. 拉取官方镜像git clone https://github.com/CTFd/CTFd.git
  2. conf下创建frp文件夹mkdir./conf/frp
  3. frp文件夹下,创建frpc.inifrps.ini

    frpc.ini

    [common]
    token = randomme#切记需要更改!!!
    server_addr = 172.1.0.1
    server_port = 6490
    pool_count = 200
    tls_enable = true
    admin_addr = 172.1.0.3
    admin_port = 7400

    frps.ini

    [common]
    bind_port = 6490
    token = randomme #切记需要更改!!!两个文件内token一致
  4. 添加2个虚拟网段,其中一个作为FRPCCTFD两个容器连通,另一个供FRPC访问题目容器。

    networks:
        frp_connect:
    driver: bridge
    internal: true
    ipam:
    config:
    - subnet: 172.1.0.0/16
    frp_containers:
    driver: overlay
    internal: true # 如果允许题目容器访问外网,则可以去掉
    attachable: true
    ipam:
    config:
    - subnet: 172.2.0.0/16
  5. 分别创建FRPC FRPS 2个服务,将新建的网段添加给相应的服务

    services:
        frps:
    image: glzjin/frp
    restart: always
    volumes:
    - ./conf/frp:/conf
    entrypoint:
    - /usr/local/bin/frps
    - -c
    - /conf/frps.ini
    ports:
    - 10000-10100:10000-10100 #映射direct类型题目的端口
    - 8001:8001 # 映射http类型题目的端口
    networks:
    default: # 需要将frps暴露到公网以正常访问题目容器
    frp_connect:
    frpc:
    image: glzjin/frp:latest
    restart: always
    volumes:
    - ./conf/frp:/conf/
    entrypoint:
    - /usr/local/bin/frpc
    - -c
    - /conf/frpc.ini
    depends_on:
    - frps #frps需要先成功运行
    networks:
    frp_containers: # 供frpc访问题目容器
    frp_connect: # 供frpc访问frps, CTFd访问frpc
    ipv4_address: 172.1.0.3
  6. 然后执行命令docker-compose up -d,即可等待搭建完成。

总结

这次搭建花费的总时间还是挺长的,起初的配置glzjin的镜像,后面通过了issue使用了frankli0324插件,最后通过2位大佬的配置文件重新自己配置,whale插件使用的是frankli0324fork的项目,但其frp的配置似乎有些出入。在了解了docker网络配置后,结合glzjinfrp项目,成功搭建CTFd平台以及安装CTFd-whale插件。

本文链接:

https://yuno0n.top/index.php/archives/21/
1 + 6 =
快来做第一个评论的人吧~