Skip to content

Repository files navigation

SchulyBackend

Schuly Logo

ASP.NET Core backend powering the Schuly ecosystem

GitHub stars.NETDocumentationWebsite

Clean-architecture C# API serving the Schuly mobile app. Built on ASP.NET Core with CQRS via Mediator, EF Core on PostgreSQL, OIDC authentication, and an extensible plugin runtime.

What's in this repo

  • src/Schuly.API - ASP.NET Core entry point + controllers
  • src/Schuly.Application - CQRS commands/queries + handlers
  • src/Schuly.Domain - entities (School, Class, Exam, Grade, Absence, AgendaEntry, ...)
  • src/Schuly.Infrastructure - EF Core, OIDC, plugin host
  • src/Schuly.Tests - unit + integration tests

Quick start

docker compose -f compose.dev.yml up -d # Postgres + SeaweedFS + SchulwareAPIcd src/Schuly.API
dotnet user-secrets set"ConnectionStrings:SchulyDatabase""Host=localhost;Port=2406;Database=schuly-dev;Username=postgres;Password=d4vpas8w0rd13!!!"
dotnet user-secrets set"Oidc:Authority""http://localhost:8080/realms/schuly"
dotnet run --urls=http://localhost:5033

API reference (Scalar): http://localhost:5033/scalar · OpenAPI document: http://localhost:5033/openapi/v1.json

The connection string and Oidc:Authority are both required - the API stops on startup without the first, and the OpenAPI document fails without the second. Development setup walks through it properly.

Documentation

Full documentation lives at docs.schuly.dev/SchulyBackend.

GuideWhat it covers
Development setupRun the API and its dependencies locally, and the tests.
ConfigurationEvery setting: connection string, OIDC, S3 storage, avatar signing, logging.
Self-hostingStand up the full stack (Caddy, Keycloak, Postgres, SeaweedFS) from published images.
ProductionImage tags, releases, and deployment notes.
ArchitectureProjects, layering rules, request pipeline, document storage.
Plugin managementHow plugins are declared, downloaded, and managed at runtime.
MigrationsCreate and apply EF Core migrations.
ContributingWorkflow, branch and PR conventions.

School systems catalog

Which login systems the app offers is supplied by the loaded plugins, not baked into the backend: each plugin describes the system it serves via its IPluginLogin.SchoolSystem descriptor, and the backend seeds the catalog from those on load (seed-if-missing by Key, so admin edits survive). Install a plugin and its system appears in the picker with no operator config.

Operators can still add or override custom systems through a SchoolSystems config section, which seeds first and therefore wins on a matching Key.

See the plugin contract for the descriptor and a worked example.

The Schuly ecosystem

RepoPurpose
SchulyFlutter mobile app
SchulyBackendASP.NET Core API backend (this repo)
SchulyKeycloakKeycloak image + the schuly realm
SchulyPluginAbstractionsPlugin contract (NuGet)
SchulyPluginsOfficial plugins monorepo
SchulyWebsiteLanding site (schuly.dev)
SchulyDocsDocumentation site (docs.schuly.dev)

About

Schuly backend (API + Application + Domain + Infrastructure + Tests)

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages