FERKO is a modernized, production-oriented rewrite path of the historical JCMS/FERKO academic platform used at the Faculty of Electrical Engineering and Computing (FER), University of Zagreb.
This repository now runs as a Java 21 + Spring Boot + PostgreSQL + Docker system with seeded FERKO academic workflows visible immediately in the browser.
When you start the app and open http://localhost:8080, you get a role-based FERKO portal, not a blank CRUD demo.
Implemented browser surface includes:
- Login page with FERKO branding and role-aware redirect.
- Role dashboards for:
STUDENTLECTURERASSISTANTSTUSLU(student office)ADMIN
- Core academic modules:
- semester lifecycle
- course/staff/group management
- student enrollment + JMBAG-centric records
- lecture/lab schedules
- points + grading overview
- exam organization + publishing
- group exchange workflow
- sync operation visibility
The portal is pre-initialized with modern seed data and enriched with imported historical datasets from course-isvu-data and noviPodatci.
./scripts/dev-up.sh- UI:
http://localhost:8080 - OpenAPI docs:
http://localhost:8080/swagger-ui/index.html - Health:
http://localhost:8080/actuator/health
./scripts/dev-down.sh./scripts/dev-reset.shAll demo users use password ferko123.
student.analecturer.markoassistant.ivastuslu.saraadmin.ferko
Intel CPU is not required.
- Docker setup and GHCR pipeline are multi-arch (
linux/amd64,linux/arm64). - Local Apple Silicon flow works with the standard commands above.
backend/
ferko-domain/ # Domain model and core business value objects
ferko-application/ # Use cases and ports (hexagonal application layer)
ferko-infrastructure/ # JDBC adapters and persistence implementations
ferko-security/ # Security module boundary
ferko-web-api/ # Spring Boot app, REST API, portal web UI, Flyway
ferko-architecture-tests/ # ArchUnit rules for module boundaries
build-tools/
checkstyle/
dependency-check/
docs/
getting-started/
architecture/
operations/
modernization/
legacy/
scripts/
.github/workflows/
- Java 21
- Maven multi-module build
- Spring Boot 3
- Spring Security (JWT/OIDC resource-server model)
- PostgreSQL 16 (docker), Flyway migrations
- OpenAPI (springdoc)
- Actuator health endpoints
- Docker multi-stage image
Flyway migrations initialize:
todo_taskstodo_audit_loglegacy_bootstrap_*import tables for historical datasets
Migrations are under:
backend/ferko-web-api/src/main/resources/db/migration
At startup, application ingests packaged dataset resources:
bootstrap/course-isvu-data/*bootstrap/noviPodatci/*.txt
Imported into DB tables:
legacy_bootstrap_courselegacy_bootstrap_enrollmentlegacy_bootstrap_schedulelegacy_bootstrap_examlegacy_bootstrap_raw_line
Portal service merges imported legacy data into visible FERKO workspace:
- course catalog expansion
- student enrollments/groups
- schedule entries
- exam terms
- additional grading and exchange activity
Result: app starts in a realistic, non-empty academic state.
All runtime config is unified in:
backend/ferko-web-api/src/main/resources/application.yml
Profiles:
- default: local/dev baseline (H2 fallback + bootstrap enabled)
docker: PostgreSQL container profilestaging/prod: hardened mode (no dev token fallback, no HMAC fallback)
- Database:
FERKO_DB_URLFERKO_DB_USERNAMEFERKO_DB_PASSWORDFERKO_DB_DRIVER
- Security/JWT:
FERKO_OIDC_ISSUER_URIFERKO_OIDC_JWK_SET_URIFERKO_JWT_HMAC_SECRETFERKO_JWT_ALLOW_HMAC_DECODERFERKO_DEV_TOKEN_ENABLED
- Repository adapters:
FERKO_TODO_REPOSITORYFERKO_AUDIT_REPOSITORY
- Bootstrap controls:
FERKO_BOOTSTRAP_LEGACY_ENABLEDFERKO_PORTAL_BOOTSTRAP_ENABLEDFERKO_PORTAL_BOOTSTRAP_MAX_COURSESFERKO_PORTAL_BOOTSTRAP_MAX_STUDENTSFERKO_PORTAL_BOOTSTRAP_MAX_SCHEDULE_ENTRIESFERKO_PORTAL_BOOTSTRAP_MAX_EXAM_ENTRIES
- ToDo API endpoints are protected by OAuth2 resource-server JWT validation.
- Principal identity is derived from authenticated JWT claims (not userId query params).
- Privileged ToDo actions and denied attempts are audit-logged in DB.
- Staging/prod guardrail enforces startup failure if OIDC/JWK decoder config is missing.
- Dev token issuing endpoint is restricted to non-staging/non-prod profiles.
./mvnw -B -ntp verifyThis runs tests, formatting, static checks, architecture tests, and coverage checks.
- Spotless + Checkstyle + JaCoCo
- OWASP dependency vulnerability scan
- Dependency inventory artifacts
- Container smoke tests
- Container vulnerability scan (Trivy)
- staging auth hardening smoke guardrail
- GHCR release publishing with semantic + immutable SHA tags
Workflows:
/.github/workflows/maven-phase1.yml/.github/workflows/release-image-ghcr.yml
Start here:
docs/README.mddocs/getting-started/QUICKSTART.mddocs/getting-started/INSTALLATION.mddocs/getting-started/DATA_INITIALIZATION.md
Legacy translated references:
docs/legacy/HOW_TO_INSTALL_EN.mddocs/legacy/INITIALIZE_ALL_DATA_EN.mddocs/legacy/LOAD_DATA_EN.md
- Default
docker-composestartsferko-app+postgres. - Optional profiles include
redisandmailhog. - App is served from a single Spring Boot process with static frontend assets.
- For production-style deployment, prefer externalized secrets + OIDC/JWK config + hardened profile.
See LICENSE and NOTICE.