Images and releases
Use this page to see how the server's Docker images are built and published. The API ships as a multi-arch image built from src/Schuly.API/Dockerfile.
Container image
- Build context:
./src. The Dockerfile'sCOPYpaths are relative to it, not to the repo root. - Build stages: the frontend builds with
oven/bun:1.3.5andnode:24-slim, and its output goes intowwwroot. The API builds and publishes onmcr.microsoft.com/dotnet/sdk:10.0. - Runtime:
mcr.microsoft.com/dotnet/aspnet:10.0. The entry point isdotnet Schuly.API.dll. - Version:
Directory.Build.propsnormally reads the version from the repo-rootapplication.properties, but that file isn't in the build context. The image is built with-p:Version=$VERSIONinstead, and the release workflow passes the release version. This keeps the host assembly version aligned with what runtime-loaded plugins bind against. - Plugin folders: the image creates
/app/pluginsand/app/plugins-configfor runtime-loaded plugins and their config.
Versioning and releases
application.properties (<version>) is the single source of truth. src/Directory.Build.props reads it.
Publishing a GitHub release starts docker-publish-release.yaml:
sync-version: compares the release tag, without itsv, toapplication.properties. If they differ, it updates the file and squash-merges arelease-sync/<version>pull request intomain.build-and-push-multiarch: buildslinux/amd64andlinux/arm64from./srcand pushes toghcr.io/schulydev/schulyand<DOCKERHUB_USERNAME>/schuly. The Docker Hub login step iscontinue-on-error.build-and-push-sandbox: builds the sandbox sidecar forlinux/amd64fromsrc/Schuly.Sandbox/Dockerfileand pushes it toghcr.io/schulydev/schuly-sandbox.
Each image gets the tags <semver>, <major>.<minor>, and <major>, plus latest for non-prereleases.
Migrations on startup
The container applies EF Core migrations at startup (ApplyMigrations() in Program.cs calls db.Database.Migrate()) and seeds the school-systems catalog. You don't need a separate migration step when you deploy. Make sure the SchulyDatabase connection string can reach the database. See Migrations and Configuration.
