⛳
CTFdをDockerを使わずにホストする
はじめに
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を動かすために以下を実行しました。
以下のリンクを参照
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番ポートでアクセス可能です。
以下のリンクを参照
TMPDIR="${PWD}/tmp" pip install -r requirements.txt
gunicorn 'CTFd:create_app()' --bind '0.0.0.0:8000' --worker-class gevent
画像のドメインは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
以下のリンクを参照
/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
画像のドメインはhostsで書き換えているものです。
アクセスできました!
Discussion