591c151e85
Unlike bytes() which accepts only a string, force_bytes() accept all sort of input type. This is required since SECRET_KEY may be either a string or bytes. |
||
---|---|---|
chat | ||
khaganat | ||
navbar | ||
neluser | ||
nsfw | ||
pages | ||
pwdb | ||
static_extra | ||
.gitignore | ||
LICENSE.txt | ||
manage.py | ||
Pipfile | ||
README.md | ||
utils.py |
Khaganat's web site
Requirements
- Python 3.6 or newer
- pipenv
- git
- gettext
Code formatting
In order to have a single Python coding style, please use black. However, auto-generated files and parts of external projects should not be reformatted.
$ black $(find . -type f -name "*\.py" -not -path "*/migrations/*" -not -path "./static_extra/bulma/*" -print)
Quick-start (development)
$ git clone https://git.khaganat.net/Tycho/khaganat-web.git khaganat-web
$ cd khaganat-web
$ vim .env
$ PIPENV_VENV_IN_PROJECT=1 pipenv --three update
$ pipenv run ./manage.py compilemessages
When editing the .env
file, you should at least set KHAGANAT_SECRET_KEY
to a random value, KHAGANAT_DEBUG
to "True"
and KHAGANAT_HOSTNAMES
to "localhost"
.
To run this web application, you need a database. The simplest way is to download the one from the test server (scp cipra.khaganat.net:/var/www/khaganat-web/db.sqlite3 db.sqlite3
). If you really want to start from scratch, you have to run the following commands:
$ pipenv run ./manage.py migrate
$ pipenv run ./manage.py createsuperuser
In order to display the Khaganat theme, you have to install bulma and build it :
$ pipenv run ./manage.py bulma install
$ pipenv run ./manage.py bulma build
Now that everything has been set-up, you may run Django's internal debug server.
$ pipenv run ./manage.py runserver
If you created the database from scratch, Django will show an error when visiting the home page. To fix it, you need to go to /admin/
and create a page with the default
flag on.
Environment variables
You can set the following variables in the .env
file:
KHAGANAT_SECRET_KEY
(required): Django's secret key, keep it secret (tip: generate one usingpipenv run python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'
).KHAGANAT_DEBUG
: Debug mode, default is false.KHAGANAT_HOSTNAMES
: Allowed hostnames, coma separated.KHAGANAT_LANGUAGE_CODE
: Language code, default isfr
.KHAGANAT_TIME_ZONE
: Time zone, default isEurope/Paris
.KHAGANAT_STATIC_URL
: URL for static files, default is/static/
.KHAGANAT_STATIC_ROOT
: Absolute path to the directory where static files should be collected.KHAGANAT_STATIC_DIRS
: CSV list of additional locations where static files may be found, default is empty.KHAGANAT_LOGS_MIN_DAYS
: Numbers of days before logs are hidden, default is 7.KHAGANAT_LOGS_MAX_DAYS
: Number of days before logs are published, default is 0.KHAGANAT_LOGIN_REDIRECT_URL
: URL to redirect after user login. Will be reversed, default isindex
.KHAGANAT_REGISTER_REQUIRE_VALIDATION
: require email validation upon registration, default is true.KHAGANAT_EMAIL_HOST
: The host to use for sending email, default islocalhost
.KHAGANAT_EMAIL_PORT
: Port to use for the SMTP server, default is25
.KHAGANAT_EMAIL_HOST_USER
: Username to use for the SMTP server, default is empty (no authentication).KHAGANAT_EMAIL_HOST_PASSWORD
: Password to use for the SMTP server, default is empty.KHAGANAT_EMAIL_USE_STARTTLS
: Whether to use STARTTLS to connect to the SMTP server, default isFalse
.KHAGANAT_EMAIL_USE_TLS
: Whether to use a TLS connection to the SMTP server, default isFalse
.KHAGANAT_EMAIL_SUBJECT_PREFIX
: Subject-line prefix for email, default is empty.KHAGANAT_DEFAULT_FROM_EMAIL
: Default email address to use, default isno-reply@localhost
.KHAGANAT_FORCE_HTTPS
: If True, enable the use ofKHAGANAT_HTTPS_HEADER_NAME
andKHAGANAT_HTTPS_HEADER_VALUE
to set theSECURE_PROXY_SSL_HEADER
configuration option. Default isFalse
.KHAGANAT_HTTPS_HEADER_NAME
: Header name forSECURE_PROXY_SSL_HEADER
, default isHTTP_X_FORWARDED_PROTO
.KHAGANAT_HTTPS_HEADER_VALUE
: Header value forSECURE_PROXY_SSL_HEADER
, default ishttps
.KHAGANAT_NSFW_TAGS
: Coma-separated list of words that triggers the content warning in logs, default is\#nsfw
.KHAGANAT_NSFW_NAME
: Name of the cookie holding the NSFW allowance, default isnsfw_allowed
.KHAGANAT_INTERNAL_IPS
: List of IP considered as internal, coma separated, default is127.0.0.1,::1
.KHAGANAT_XMPP_BOSH_URL
: URL of the BOSH server used to contact the XMPP server. Default is empty.KHAGANAT_XMPP_JID
: The JID to use for the XMPP session. Default is empty.KHAGANAT_XMPP_ROOMS
: List of rooms to automatically join when connecting. Default is empty.KHAGANAT_XMPP_WEBSOCKET_URL
: URL of the websocket server used to contact the XMPP server. Default is empty.
Quick update
$ cd khaganat-web
$ git pull
$ pipenv --three update
$ pipenv run ./manage.py migrate
$ pipenv run ./manage.py compilemessages
If you are not in a development environment (runserver), you also have to run pipenv run ./manage.py collectstatic --clear --noinput
and may have to restart the WSGI server.
Nginx + uWSGI on ArchLinux
Before deploying, you may read the following guides:
Install nginx-mainline
, uwsgi
and uwsgi-plugin-python
.
# mkdir -p /srv/http/khaganat/static
# cd /srv/http/khaganat
# git clone https://git.khaganat.net/Tycho/khaganat-web.git app
# cd app
# PIPENV_VENV_IN_PROJECT=1 pipenv --three update
Create /etc/uwsgi/khaganat.ini
with the appropriate environment variables:
[uwsgi]
chdir = /srv/http/khaganat/app
home = /srv/http/khaganat/app/.venv
module = khaganat.wsgi:application
plugins = python
socket = /srv/http/khaganat/uwsgi.sock
uid = http
gid = http
threads = 2
vacuum = True
env = KHAGANAT_SECRET_KEY="generate a new one"
env = KHAGANAT_DEBUG=False
env = KHAGANAT_STATIC_ROOT=/srv/http/khaganat/static
env = KHAGANAT_HOSTNAMES=khaganat.local
Create /etc/systemd/system/multi-user.target.wants/uwsgi@.service
:
[Unit]
Description=uWSGI service unit
After=syslog.target
[Service]
ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/%I.ini
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -INT $MAINPID
Restart=always
Type=notify
StandardError=syslog
NotifyAccess=all
KillSignal=SIGQUIT
[Install]
WantedBy=multi-user.target
Configure nginx :
server {
listen 80;
listen [::]:80;
server_name "khaganat.local";
include custom/headers.conf;
location /static {
root /srv/http/khaganat/;
}
location / {
uwsgi_pass unix:///srv/http/khaganat/uwsgi.sock;
include uwsgi_params;
}
}
Finish the installation:
# cd /srv/http/khaganat/app
# pipenv run ./manage.py migrate
# pipenv run ./manage.py collectstatic --clear --noinput
# pipenv run ./manage.py compilemessages
# pipenv run ./manage.py createsuperuser
# chown -R http:http /srv/http/khaganat/
# systemctl enable uwsgi@khaganat.service
# systemctl start uwsgi@khaganat.service
# systemctl enable nginx.service
# systemctl start nginx.service
Do not forget to check the deployment checklist.