Python web server to send notifications.
ess-notify is built with FastAPI.
All variables defined in app/settings.py can be overridden by exporting environment variables.
This can be achieved by setting the variables in a .env file:
$ cat .env
APNS_KEY_ID=my-key
TEAM_ID=my-team
ADMIN_USERS=username
FIREBASE_PROJECT_ID=my-project
GOOGLE_APPLICATION_CREDENTIALS=my-project.jsonNote that as APNS_AUTH_KEY shall contain a private key (on multiple lines) it's not easy to define
it in the .env file.
The dummy default key can be overridden by creating a file and exporting its content:
export APNS_AUTH_KEY="$(cat .apns_auth_key)"To be able to login, at least the following variables shall be overwritten:
- LDAP_HOST
- LDAP_USER_DN
Refer to the default values defined in the Ansible role and in the ess_notify_servers group in CSEntry.
Python >= 3.6 is required. Create a virtual environment and install the requirements:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pip install -e .[tests]When using sqlite, it's not possible to run alembic for database migration
(sqlite doesn't support to drop a column in a table).
Create the database from scratch using:
notify-server create-dbThis is for development only. In production, use postgres and alembic.
Run the application:
uvicorn --reload app.main:appGo to http://127.0.0.1:8000/api/v1/docs and http://127.0.0.1:8000/api/v2/docs to browse the API depending on the version.
Using uvicorn with the --reload parameter will automatically restart the application when a file changes.
Note that the logging configuration assumes that the application is run with gunicorn.
To do so, run:
gunicorn -w 2 -k uvicorn.workers.UvicornWorker --log-level info app.main:appThis will run the application using SQLite.
The application uses PostgreSQL in production. This can be done by updating the SQLALCHEMY_DATABASE_URL variable to point to a postgres database. Using docker, as detailed below, is recommended.
The provided docker-compose.yml file allows you to easily start the application with PostgreSQL.
First time:
- Build the docker image:
docker-compose build - Start postgres:
docker-compose up -d postgres - Run alembic to create the database:
docker-compose run --rm web alembic upgrade head - Start the application:
docker-compose up web
Those commands only need to be run the first time. The docker image shall be rebuilt only if requirements change. After that, start the application by running:
docker-compose up -d postgres
docker-compose up webpytest is used for testing. Create and activate a virtual environment as detailed above.
pytest -v testsDeployment is performed with Ansible and Docker. When pushing to the master branch, the application is automatically deployed to the test server https://notify-test.esss.lu.se.
To deploy to production, tag the branch (git tag -a <version>) and push that tag. At the end of the gitlab-ci pipeline, a manual job is created and shall be triggered manually.
To remove old notifications, you can run the notify-server delete-notifications command.
You can run it inside the ess_notify_web container using the crontab:
/usr/bin/docker exec ess_notify_web notify-server delete-notificationsBy default, only the last 30 days are kept. You can change that value with the --daysoption.