mirror of
				https://github.com/owncast/owncast.git
				synced 2025-10-31 10:08:10 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			189 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Owncast Backend Architecture
 | |
| 
 | |
| This is a work in progress document detailing the future backend architecture of Owncast. It should be seen as a living document until a refactor of the backend is complete.
 | |
| 
 | |
| ## Dependencies
 | |
| 
 | |
| Dependencies are services that are required across the application. This can be things like the chat service or a data repository for config values or user data.
 | |
| 
 | |
| Note: A better name that "dependencies" might be clearer. Perhaps "services" or "providers".
 | |
| 
 | |
| TODO: Have a complete list of dependencies.
 | |
| 
 | |
| ### Data Repositories
 | |
| 
 | |
| The repository pattern provides a layer of abstraction between the application and the data store, allowing the application to interact with the data store through a well-defined interface, rather than directly accessing the data store. This helps to decouple the application from the data store.
 | |
| 
 | |
| TODO: List out the repositories and what they do.
 | |
| 
 | |
| Learn more about the [repository pattern](https://techinscribed.com/different-approaches-to-pass-database-connection-into-controllers-in-golang/).
 | |
| 
 | |
| ### Application Controller
 | |
| 
 | |
| The `AppController` has references to all the dependencies and serves as an arbiter between consumers of these services and the services themselves.
 | |
| 
 | |
| A reference to the `AppController` is passed in to the all the core functionality in the application and each package would have its own interface that `AppController` implements. This can include getting access to dependency services like getting access to the chat service, getting access to the config repository values or knowing application state such as if a stream is live or how many viewers are watching via metrics.
 | |
| 
 | |
| TODO: Show examples of how the application is passed in to packages and how to reference dependencies through it.
 | |
| 
 | |
| ## Diagram
 | |
| 
 | |
| ```mermaid
 | |
| %% Owncast backend architecture.
 | |
| %% See https://jojozhuang.github.io/tutorial/mermaid-cheat-sheet/
 | |
| %% for a cheat sheet on creating this diagram.
 | |
| %% Paste this document in https://mermaid.live as a quick way to edit.
 | |
| 
 | |
| %% TODO: Add links between nodes and the actual code.
 | |
| 
 | |
| %% This is a graph style diagram, Top Down.
 | |
| graph TD
 | |
| 
 | |
| 
 | |
| %% Define Nodes and Subgraphs
 | |
| 
 | |
| subgraph VideoPipeline[Video Pipeline]
 | |
|     VideoTranscoder(fa:fa-video Video Transcoder)
 | |
|     RTMPService[fa:fa-video RTMP Service]
 | |
| end
 | |
| 
 | |
| subgraph ChatService[fa:fa-comment Chat\nService]
 | |
| end
 | |
| 
 | |
| subgraph Dependencies
 | |
| 
 | |
|     App{AppController}
 | |
|     ChatService--->App
 | |
|     Webhooks--->App
 | |
|     ActivityPubOutboundHandlers[fa:fa-hashtag ActivityPub\nOutbound]--->App
 | |
| 
 | |
|     ConfigRepository(fa:fa-hard-drive Config\nRepository)--->App
 | |
|     UserRepository(fa:fa-hard-drive User\nRepository)--->App
 | |
|     NotificationsRepository(fa:fa-hard-drive Notifications\nRepository)--->App
 | |
|     ChatRepository(fa:fa-hard-drive Chat\nRepository)
 | |
|     APRepository(fa:fa-hard-drive ActivityPub\nRepository)
 | |
| 
 | |
|     Database(fa:fa-hard-drive Database)--->ConfigRepository
 | |
|     Database--->UserRepository
 | |
|     Database--->APRepository
 | |
|     Database--->NotificationsRepository
 | |
| 
 | |
|     ChatRepository-->ChatService
 | |
| 
 | |
|     ApplicationState(fa:fa-list Application\nState)--->App
 | |
|     GeoIP(fa:fa-globe GeoIP\nLookup)--->App
 | |
|     Statistics(fa:fa-list Statistics)--->App
 | |
|     OutboundWebhooks[Outbound\nWebhooks]--->App
 | |
| 
 | |
| end
 | |
| 
 | |
| subgraph VideoStorageProviders[Video Storage Providers]
 | |
|     LocalStorage((fa:fa-hard-drive Local\nStorage))
 | |
|     S3Storage((fa:fa-hard-drive S3\nStorage))
 | |
| end
 | |
| 
 | |
| subgraph Authentication[Chat Authentication]
 | |
|     IndieAuth[fa:fa-key IndieAuth]
 | |
|     FediAuth[fa:fa-key FediAuth]
 | |
| end
 | |
| 
 | |
| subgraph Notifications[External Notifications]
 | |
|     DiscordNotifier[fa:fa-comment Discord]
 | |
|     BrowserNotifier[fa:fa-browser Browser]
 | |
| end
 | |
| 
 | |
| subgraph WebServer[Web Server]
 | |
|     ActivityPubHandlers[fa:fa-file ActivityPub\nHandlers]
 | |
| 
 | |
|     subgraph WebAssets[Web Assets]
 | |
|         EmbeddedStaticFiles((fa:fa-file Embedded\nStatic Assets))
 | |
|         OnDiskStaticFiles((fa:fa-file On Disk\nStatic Assets))
 | |
|         WebApplication[fa:fa-file  Web\nApplication]
 | |
|         PublicFiles[fa:fa-file Public\nDirectory]
 | |
|     end
 | |
| 
 | |
|     subgraph HTTPHandlers[fa:fa-browser HTTP Handlers]
 | |
|         AdminAPIs[Admin\nAPIs]
 | |
|         ThirdPartyAPIs[3rd Party\nAPIs]
 | |
|         WebSocket[WebSocket]
 | |
|         subgraph ChatAPIs[Chat\nAPIs]
 | |
|             ChatUserRegistration[Chat User\nRegistration]
 | |
|             Emoji[Emojis]
 | |
|             subgraph ChatAuthAPIs[Chat\nAuthentication]
 | |
|                 FediAuth
 | |
|                 IndieAuth
 | |
|             end
 | |
|         end
 | |
|         subgraph VideoAPIs[fa:fa-video Video APIs]
 | |
|             ViewerPing[Viewer\nPing]
 | |
|             PlaybackMetrics[Playback\nHealth Metrics]
 | |
|         end
 | |
|         ActivityPubHandlers
 | |
|         ApplicationConfig[Application\nConfig]
 | |
|         ApplicationStatus[Application\nStatus]
 | |
|         Directory[Directory\nAPI]
 | |
|         Followers[Followers]
 | |
|     end
 | |
| end
 | |
| 
 | |
| subgraph Streamer
 | |
|     BroadcastingSoftware>fa:fa-video Broadcasting\nSoftware]
 | |
| end
 | |
| 
 | |
| %% All the services and packages require access
 | |
| %% to dependencies through a Application reference.
 | |
| App-.->HTTPHandlers
 | |
| App-.->VideoPipeline
 | |
| App-.->ActivityPub
 | |
| App-.->Authentication
 | |
| App-.->Notifications
 | |
| App-.->DirectoryNotifier[Owncast\nDirectory]
 | |
| 
 | |
| LocalStorage--HLS-->OnDiskStaticFiles
 | |
| 
 | |
| RTMPService>RTMP Ingest]--RTMP-->VideoTranscoder
 | |
| VideoTranscoder--HLS-->VideoStorageProviders
 | |
| 
 | |
| %% Streamers
 | |
| BroadcastingSoftware--RTMP-->RTMPService
 | |
| 
 | |
| %% Style the nodes
 | |
| 
 | |
| %% Define reusable styles for node types
 | |
| classDef bigtext font-weight:bold,font-size:40px
 | |
| classDef repository fill:#4F625B,color:#fff
 | |
| classDef webservice fill:#6082B6,color:#fff
 | |
| classDef rtmp fill:#608200, color:#fff
 | |
| classDef inbound fill:#6544e9,stoke:#fff,color:#fff
 | |
| classDef outboundservice fill:#2386e2,stroke:green,color:#fff
 | |
| classDef storage fill:#42bea6,color:#fff
 | |
| 
 | |
| %% Assign styles to nodes
 | |
| class App bigtext
 | |
| class UserRepository repository
 | |
| class ConfigRepository repository
 | |
| class APRepository repository
 | |
| class NotificationsRepository repository
 | |
| class ChatRepository repository
 | |
| 
 | |
| class HTTPHandlers inbound
 | |
| class ActivityPubInboundHandlers inbound
 | |
| class InboundWebhooks inbound
 | |
| 
 | |
| class ActivityPubOutboundHandlers outboundservice
 | |
| class DiscordNotifier outboundservice
 | |
| class BrowserNotifier outboundservice
 | |
| class OutboundWebhooks outboundservice
 | |
| class DirectoryNotifier outboundservice
 | |
| 
 | |
| class BroadcastingSoftware rtmp
 | |
| class RTMPService rtmp
 | |
| 
 | |
| class Database storage
 | |
| class LocalStorage storage
 | |
| class S3Storage storage
 | |
| 
 | |
| %% Customize the theme styles
 | |
| %%{init: {'theme':'base', 'themeVariables': {'darkMode': true, 'lineColor': '#c3dafe', 'tertiaryTextColor': 'white', 'clusterBkg': '#2d3748', 'primaryTextColor': '#39373d', "edgeLabelBackground": "white", "fontFamily": "monospace", "fontSize": "30px"}}}%%
 | |
| ```
 | 
