# Odevzdávací Systém Matematické Olympiády

OSMO je webová aplikace pro účastníky i organizátory Matematické olympiády,
která obstarává většinu agendy okolo chodu soutěže: přihlášky, zadávání úloh,
odevzdávání řešení, bodování, sestavování výsledkových listin atd.

OSMO primárně vzniklo pro českou Matematickou olympiádu, ale po menších úpravách
ho lze používat i pro jiné, podobné soutěže. Není v našich silách provozovat
další instance OSMO, ale pokud chcete s úpravami a provozem systému poradit,
ozvěte se nám na adrese <osmo@mo.mff.cuni.cz>.

OSMO můžete používat a distribuovat pod licencí GNU Affero General Public
License verze 3 nebo novější (viz soubor LICENSE).

## Autoři

	Martin Mareš <mj@ucw.cz>
	Jiří Kalvoda
	Jan Prachař
	Jiří Setnička

## Instalace vývojového prostředí

	python3 -m venv venv
	. venv/bin/activate
	pip install wheel
	pip install -c constraints.txt --editable .
	# vytvořit mo/config.py podle etc/config.py.example
	bin/init-data-dir

	bin/flask run

	# Po běžných úpravách není potřeba balíček přeinstalovávat

## Instalace na produkční server

	# Pro systém s jádrem < 5.4 zvýšit net.core.somaxconn (jako root)
	[ "`cat /proc/sys/net/core/somaxconn`" -lt 4096 ] && echo net.core.somaxconn=4096 >> /etc/sysctl.conf && sysctl -p

	# Založit účet mo-web (jako root)
	adduser --system mo-web --shell /bin/bash
	loginctl enable-linger mo-web

	# Založit databázi (jako správce PostgreSQL)
	psql -c 'CREATE ROLE mo_osmo'
	psql -c 'CREATE ROLE "mo-web" LOGIN'
	psql -c 'GRANT mo_osmo TO "mo-web"'	# a případně dalším uživatelům
	psql -c 'CREATE DATABASE mo_osmo_test WITH OWNER=mo_osmo'

	# Inicializovat databázi (už jako mo-web)
	psql mo_osmo_test <db/db.ddl

	# Založit adresář pro instanci
	mkdir /akce/mo/osmo-test
	chmod 770 /akce/mo/osmo-test
	setfacl -m u:mo-web:rwx -m g:mo:rwx /akce/mo/osmo-test
	setfacl -d -m u:mo-web:rwx -m g:mo:rwx /akce/mo/osmo-test

	# Zbytek jako uživatel mo-web v /akce/mo/osmo-test
	git clone <repozitář> src

	# Vytvořit etc/config.py podle src/etc/config.py.example
	# Vytvořit etc/uwsgi.ini podle src/etc/uwsgi.ini.example
	cd src
	bin/deploy

	# Zpřístupnit socket Nginxu
	setfacl -m u:www-data:x /akce/mo/osmo-test /akce/mo/osmo-test/var

	# Inicializovat regiony v DB
	# Obstarat si extra/ruian/ a extra/schools/parsed/ z jiné instance (nebo je znovu stáhnout)
	. ../venv/bin/activate
	bin/test-init mo_osmo_test data		# případně podmnožinu

	# Případně ručně otestovat, že uwsgi funguje
	# uwsgi --ini etc/osmo.ini

	# Založit ~/.config/systemd/user/osmo_test.service podle etc/osmo.service.example
	systemctl --user daemon-reload
	systemctl --user enable osmo_test.service
	systemctl --user start osmo_test.service
	systemctl --user status osmo_test.service

	# Nastavit nginx:
	location /osmo-test {
		include uwsgi_params;
		uwsgi_pass unix:/akce/mo/osmo-test/var/osmo.sock;
	}

	# Na instalaci nové verze pak stačí spustit bin/deploy

## Mražení závislostí

	pip freeze | grep -v '^osmo=' >constraints.txt

## Testovací prostředí

	# Umíme automaticky založit testovací prostředí se soutěžemi, uživateli
	# a jejich rolemi. Obvykle na to používáme samostatnou databázi a datový
	# adresář.

	# Do mo/config.py připsat:
	SQLALCHEMY_DATABASE_URI = ... připojení k databázi mo_osmo_test
	DATA_DIR = "data-test"
	CURRENT_YEAR = 42
	INSECURE_TEST_LOGIN = True

	# Vytvoření prostředí
	bin/test-init mo_osmo_test data-test

	# Spuštění webových prohlížečů pro testovací uživatele
	bin/test-browser garanti

	# Přepnutí soutěží do konkrétního stavu
	bin/test-state running