parent
8e289c142a
commit
751a4a4440
|
@ -10,4 +10,4 @@ Welcome to the **LibreTime developer manual**, you should find guides to integra
|
|||
|
||||
## Improve and contribute to LibreTime
|
||||
|
||||
- :construction: Work in progress
|
||||
- Learn about the [architecture of LibreTime](./design/architecture.md)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
label: Design
|
|
@ -0,0 +1,108 @@
|
|||
---
|
||||
title: Architecture
|
||||
---
|
||||
|
||||
This document explains the design details and goals for the architecture of LibreTime. It describes the result of a [discussion that happened on Github](https://github.com/libretime/libretime/issues/1610).
|
||||
|
||||
## Previous architecture
|
||||
|
||||
The previous architecture of LibreTime (based on AirTime) was missing a proper separation of concerns. It was build around a legacy MVC app written in PHP, and services in Python to accomplish specific tasks.
|
||||
|
||||
## New architecture
|
||||
|
||||
Below is the new architecture goal of LibreTime, with a proper separation of concerns.
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
users([Users])
|
||||
public([Public])
|
||||
|
||||
subgraph create_schedule[Create the schedule]
|
||||
webapp[Web app]
|
||||
subgraph core[Backend]
|
||||
message_api[Message API]
|
||||
api[Web API]
|
||||
worker[Worker]
|
||||
end
|
||||
end
|
||||
|
||||
subgraph play_schedule[Play the schedule]
|
||||
playout[Playout]
|
||||
liquidsoap[[Liquidsoap]]
|
||||
icecast[[Icecast]]
|
||||
hls[[HLS]]
|
||||
end
|
||||
|
||||
message_queue[[Message Queue]]
|
||||
database[[Database]]
|
||||
storage[[Storage]]
|
||||
|
||||
users --> |Edit| webapp
|
||||
|
||||
webapp --> api
|
||||
api --> database
|
||||
api --> storage
|
||||
api --> message_queue
|
||||
|
||||
message_queue <--> worker
|
||||
worker --> database
|
||||
worker --> storage
|
||||
|
||||
message_queue <--> message_api
|
||||
message_api --> database
|
||||
|
||||
message_queue <--> playout
|
||||
playout <-. via message queue .-> message_api
|
||||
playout --> |e.g. download file| api
|
||||
playout <--> liquidsoap
|
||||
liquidsoap --> icecast
|
||||
liquidsoap --> hls
|
||||
|
||||
public --> webapp
|
||||
public --> |Listen| icecast
|
||||
public --> |Listen| hls
|
||||
```
|
||||
|
||||
The LibreTime architecture is split into 2 main monolithic blocks `Create the schedule` and `Play the schedule`. Both blocks must be able to scale horizontally.
|
||||
|
||||
:::note
|
||||
|
||||
A microservice architecture was rejected as it will not fix or improve any aspect of LibreTime.
|
||||
|
||||
:::
|
||||
|
||||
:::warning
|
||||
|
||||
This document tries to focus on creating and playing a schedule, it does not consider features such as monitoring, logging or archiving.
|
||||
|
||||
:::
|
||||
|
||||
### Create the schedule
|
||||
|
||||
This block contains the following components:
|
||||
|
||||
- a web API,
|
||||
- a worker to run background tasks,
|
||||
- a message API to communicate with the `Play the schedule` block, and other services,
|
||||
- a web app to interface with the users.
|
||||
|
||||
The web API, the worker and the message API rely on the [Django framework](https://www.djangoproject.com/) to handle database, message queue and storage access.
|
||||
|
||||
### Play the schedule
|
||||
|
||||
Since the `Play the schedule` has its own requirements in terms of logic and uptime, it is handled separately from the `Create the schedule` block. This block needs to be able to be duplicated in a high availability context.
|
||||
|
||||
This block contains the following components:
|
||||
|
||||
- a Playout app that communicates with the `Play the schedule` block to gather the schedule,
|
||||
- a Liquisoap app that plays and mixes the scheduled items, and dispatch them to the delivery services,
|
||||
- an Icecast server that delivers a legacy audio stream to the public,
|
||||
- a HLS stream that delivers a modern audio stream to the public.
|
||||
|
||||
### One setup per radio station
|
||||
|
||||
LibreTime is not meant to be used in a multi-tenant architecture, and an entire LibreTime installation should be dedicated to a single radio station. Previous SAAS or multi-tenant features from Airtime should be deprecated or removed.
|
||||
|
||||
### Separation of concerns
|
||||
|
||||
The `Create the schedule` block must only prepare a schedule, and the `Play the schedule` must only play that schedule. A strong separation of concerns is required between the 2 blocks to allow the `Play the schedule` block to meet its uptime requirements while not depending on the `Create the schedule` in case of a failure. Development will be simplified if both blocks share a single and properly defined protocol.
|
Loading…
Reference in New Issue