Files
TheGrapefruitsDuo/server/README.md
Lucas Jensen 5d67c0c2b2 initial commit
2024-05-01 09:19:01 -07:00

46 lines
1.9 KiB
Markdown

# Backend for The Grapefruits Duo
This is the backend for thegrapefruitsduo.com and is deployed at api.thegrapefruitsduo.com. It is a FastAPI app that serves information about the chamber music, the group's members, and upcoming events. It allows authorized users to modify most information. Data is persisted with MariaDB.
The general flow of this program is as follows, starting from the database layer:
- `python-mysql` is used to interact with the MariaDB database. This happens in `app/db`
- `app/controllers` contains the business logic for the app and consumes the database layer. Each controller is responsible for a different part of the app, with one main controller `app/controllers/controller.py` which imports, instantiates, and uses the other controllers.
- `app/routes` contains the FastAPI routes that consume the single controller. This controller is instantiated in `app/controllers/__init__.py` and passed to the routes.
No formal api specification is provided, but the routes are documented with FastAPI's Swagger UI at `/docs`.
## Basic Usage
Use of [poetry](https://python-poetry.org/docs/) is required. Creating the virtual environment with poetry is easy and should be done in the main project directory. `.venv` should be alongside `pyproject.toml`.
To install dependencies (venv will be created automatically if it doesn't exist):
```bash
poetry install
```
The following steps require proper environment variables to be set. An example can be found in `.env.example`
To seed the mysql database:
```bash
poetry run seed
```
To retrieve a token for testing:
```bash
poetry run token
```
To run the FastAPI app in development mode:
```bash
poetry run dev
```
### Deployment
This app is deployed on a Linode Ubuntu Server instance. NGINX is used as a reverse proxy and the app itself is managed by `systemd` and `uvicorn` as a service, and listens on port 6000. The app is served over HTTPS with a Let's Encrypt certificate.