diff --git a/README.md b/README.md index 282fdcc..0e75887 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,107 @@ Using Alpine.js on the frontend and FastAPI as backend. ## Environment variables -``` +```fish set -x WORD_LIST /path/to/alfagok_wordlist.txt set -x START_DATE 2024-11-02 set -x DICTIONARY_LIST /path/to/dictionary.txt ``` + +In `src/alfagok`, with an active virtualenv with packages installed (`uv pip sync requirements.txt`), run: + +`fastapi dev main.py` + + +## Example configs + +### nginx + +/etc/nginx/sites-enabled/alfagok.example.com.conf + +```nginx +server { + listen [::]:443 ssl; # managed by Certbot + listen 443 ssl; # managed by Certbot + server_name alfagok.example.com; + + real_ip_header X-Forwarded-For; + + access_log /var/log/nginx/access_alfagok.example.com.log; + error_log /var/log/nginx/error_alfagok.example.com.log warn; + + location / { + proxy_pass http://127.0.0.1:8889; + proxy_read_timeout 60; + proxy_connect_timeout 60; + proxy_redirect off; + + # Allow the use of websockets + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } + + ssl_certificate /etc/letsencrypt/live/alfagok.example.com/fullchain.pem; # managed by Certbot + ssl_certificate_key /etc/letsencrypt/live/alfagok.example.com/privkey.pem; # managed by Certbot + include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot + +} +server { + if ($host = alfagok.example.com) { + return 301 https://$host$request_uri; + } # managed by Certbot + + listen [::]:80; + listen 80; + server_name alfagok.example.com; + return 404; # managed by Certbot +} +``` + +### systemd unit file + +/etc/systemd/system/alfagok.service + +```ini +[Unit] +Description=Gunicorn Daemon for alfagok game FastAPI +After=network.target + +[Service] +User=USERNAME (fill in!) +Group=USERGROUP (fill in!) +WorkingDirectory=/srv/www/alfagok.example.com/alfagok/src + +Environment="START_DATE=2024-11-02" +Environment="WORD_LIST=/srv/www_data/alfagok.example.com/wordlist.txt" +Environment="DICTIONARY_LIST=/srv/www_data/alfagok.example.com/dictionary.txt" +Environment="STATIC_DIR=/srv/www/alfagok.example.com/alfagok/src/alfagok/static" +Environment="TEMPLATE_DIR=/srv/www/alfagok.example.com/alfagok/src/alfagok/templates" + +ExecStart=/srv/www/alfagok.example.com/venv/bin/gunicorn -c /srv/www/_webconfig/sites/alfagok.diginaut.net/gunicorn_alfagok_conf.py alfagok.main:app + +[Install] +WantedBy=multi-user.target +``` + +### gunicorn config file + +```python +# gunicorn_conf.py +from multiprocessing import cpu_count + +bind = "127.0.0.1:8889" + +# Worker Options +#workers = cpu_count() + 1 +workers = 1 +worker_class = 'uvicorn.workers.UvicornWorker' + +# Logging Options, dir should be writable for User in systemd unit file +loglevel = 'debug' +accesslog = '/var/log/alfagok/access_log' +errorlog = '/var/log/alfagok/error_log' +```