CTFdをDockerを使わずにホストする

2024/03/25に公開

はじめに

Dockerを使わずにデプロイすることになったのでメモ
ドキュメント上でも基本的にDockerで動かすことが前提となっているように見えます。

以下を立てればよさそうです。

  • WSGI server
  • Database server
  • Caching server

追加でnginxも立てます。

EC2

AWS EC2を使います。今回はこのEC2に全部インストールします。
t4g.nanoでEBSに50GB割り当てました。
パブリックサブネットに配置し、tcp80/8000のみ自身のIPからのみアクセスできるようにしておきます。8000は途中の確認用です。
セッションマネージャーでアクセスするのでSSHは不要です。

Amazon Linux2023でpython3.11を動かすために以下を実行しました。
以下のリンクを参照
https://github.com/pyenv/pyenv/wiki#suggested-build-environment
https://github.com/pyenv/pyenv?tab=readme-ov-file#unixmacos

sudo dnf install gcc make patch zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel xz-devel
sudo dnf install git
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
cd ~/.pyenv && src/configure && make -C src
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
exec "$SHELL"
git clone https://github.com/CTFd/CTFd.git
cd CTFd
pyenv install -l
TMPDIR="${PWD}/tmp" pyenv install 3.11.8
pyenv local 3.11.8
python -V

WSGI server

ドキュメントに記載があるgunicornとgeventを使います。
必要なパッケージはrequirements.txtにあるのでそれをインストールして、起動します。
この時点でEC2のグローバルIPに8000番ポートでアクセス可能です。
以下のリンクを参照
https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/deploying/gunicorn.html

TMPDIR="${PWD}/tmp" pip install -r requirements.txt
gunicorn 'CTFd:create_app()' --bind '0.0.0.0:8000' --worker-class gevent

8000アクセス
画像のドメインはhostsで書き換えているものです。

Database server

mariadbを使います。

sudo dnf install mariadb105-server
sudo systemctl start mariadb
sudo systemctl enable mariadb
sudo mysql_secure_installation
sudo mysql -u root -p

docker-compose.ymlの設定と同じようにしています。

CREATE DATABASE ctfd;
CREATE USER 'ctfd'@'localhost' IDENTIFIED BY 'ctfd';
GRANT ALL PRIVILEGES ON ctfd.* TO 'ctfd'@'localhost';
FLUSH PRIVILEGES;
EXIT;

CTFd用に環境変数を設定します。

export DATABASE_URL=mysql+pymysql://ctfd:ctfd@localhost/ctfd

Caching server

redisを使います。

sudo dnf install redis6
sudo systemctl start redis6
sudo systemctl enable redis6
export REDIS_URL=redis://localhost:6379

Nginx

sudo dnf install nginx
sudo systemctl start nginx
sudo systemctl enable nginx

以下のリンクを参照
https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/deploying/nginx.html

/etc/nginx/nginx.conf
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen 80;
         server_name _;
        types_hash_max_size 4096;
        location / {
            proxy_pass http://127.0.0.1:8000/;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Prefix /;
        }
    }
}
sudo nginx -t
sudo nginx -s reload

Nginxが追加されたので、REVERSE_PROXYをtrueにしてCTFdを再起動

export REVERSE_PROXY=true
gunicorn 'CTFd:create_app()' --bind '0.0.0.0:8000' --worker-class gevent

80アクセス
画像のドメインはhostsで書き換えているものです。

アクセスできました!

Discussion