Języki: Polski (domyślny) · English · Українська
Platforma edukacyjna dla szkół (panel WWW + API dla aplikacji mobilnej).
Więcej dokumentacji (w tym flow użytkowników, rola/ekrany oraz API/Swagger) znajdziesz w docs/README.md.
- Ruby:
3.4.6(patrz.ruby-version) - PostgreSQL: 13+ (zalecane 15+)
- Node.js + Yarn (repo używa
yarn@3.2.0, patrzpackage.json) - Elasticsearch 8.x (opcjonalne, ale zalecane dla wyszukiwania „School videos”)
- FFmpeg (opcjonalne; automatyczne
duration_sec+ miniatury do wideo) - Redis + Sidekiq (opcjonalne w dev; wymagane jeśli uruchamiasz joby przez Sidekiq jak na prod)
- PostgreSQL 15+
- Node.js (dla assetów:
esbuild/sass) - Elasticsearch 8.x (opcjonalnie)
Domyślne ustawienia są w config/settings.yml (część wartości ma fallbacki do ENV).
Najczęściej używane zmienne środowiskowe:
DATABASE_URLlub standardowe zmienne PG (host/user/password)DEVISE_JWT_SECRET_KEY(sekret do JWT; w dev ma domyślną wartość wconfig/settings.yml)ELASTICSEARCH_URL(jeśli używasz ES; domyślniehttp://localhost:9200)TWILIO_*/SMTP_*/YOUTUBE_*(opcjonalnie – integracje)
bin/rails db:prepareJeśli chcesz wgrać dane przykładowe (dev):
bin/rails db:seedbundle exec rspecTesty end-to-end symulują rzeczywiste interakcje użytkownika w przeglądarce.
Wymagania:
- Node.js + Yarn (Puppeteer zainstalowany automatycznie)
- Uruchomiona aplikacja na
localhost:3000 - Dane testowe w bazie (
rake db:seed)
Uruchomienie wszystkich testów:
# Tryb headless (szybki, bez widocznej przeglądarki)
rake test
# Tryb GUI (z widoczną przeglądarką i kursorem)
rake test:guiUruchomienie pojedynczego testu:
# Headless
rake test[superadmin-menu]
# Z widoczną przeglądarką
rake test[superadmin-menu,gui]Dostępne testy:
| Test | Opis |
|---|---|
superadmin-menu |
Nawigacja menu panelu superadmina |
superadmin-users |
Zarządzanie użytkownikami (filtrowanie, edycja) |
superadmin-content |
Zarządzanie treściami (przedmioty, moduły) |
principal-dashboard |
Menu panelu dyrektora |
principal-management |
Zarządzanie klasami, nauczycielami, uczniami |
teacher-dashboard |
Menu panelu nauczyciela |
teacher-dashboard-full |
Pełny test funkcji nauczyciela |
student-dashboard |
Menu panelu ucznia |
student-dashboard-full |
Pełny test funkcji ucznia |
theme-switcher |
Przełączanie tematu jasny/ciemny |
dashboard-switcher |
Przełączanie nauczyciel↔dyrektor |
subjects-dragdrop |
Drag & drop przedmiotów |
Szczegóły w e2e/README.md.
- Zainstaluj zależności Ruby:
bundle install- Zainstaluj zależności JS:
corepack enable
yarn install- Przygotuj bazę i uruchom dev (Rails + watchery JS/CSS):
bin/setupAlternatywnie (bez bin/setup):
bin/rails db:prepare
bin/devUI jest dostępne pod /api-docs/index.html i serwuje plik docs/swagger/v1/swagger.yaml.
Regenerowanie dokumentacji:
bundle exec rake rswag:specs:swaggerizeFFmpeg jest potrzebny do automatycznego przetwarzania wideo (wykrywanie czasu trwania, generowanie miniatur).
macOS:
brew install ffmpegUbuntu/Debian:
sudo apt-get install ffmpeg mediainfoCentOS/RHEL:
sudo yum install ffmpegGdy uczeń wgrywa wideo:
ProcessVideoJobis automatically enqueued- FFmpeg wyciąga
duration_sec - FFmpeg generuje miniaturę (klatka z 1 sekundy lub ze środka dla krótkich filmów)
- Miniatura jest zapisywana przez uploader CarrierWave
Jeśli FFmpeg nie jest zainstalowany, upload nadal zadziała, ale bez automatycznego czasu trwania/miniatur.
Aplikacja używa Elasticsearch do wyszukiwania pełnotekstowego (funkcja „School videos”).
Instancja ES jest współdzielona między projektami – indeksy mają prefiks akademy2_{environment}.
W config/settings.yml:
elasticsearch:
url: http://localhost:9200
index_prefix: akademy2Albo przez zmienną środowiskową:
export ELASTICSEARCH_URL=http://localhost:9200{prefix}_{environment}_{model}
Przykłady:
akademy2_development_student_videosakademy2_staging_student_videosakademy2_production_student_videos
# Start Rails console
rails c
# Reindex all StudentVideo records
StudentVideo.reindex
# Check index name
StudentVideo.searchkick_index.name
# => "akademy2_production_student_videos"
# Check if index exists
StudentVideo.searchkick_index.exists?
# Delete and recreate index
StudentVideo.reindex(force: true)
# Reindex asynchronously (via Sidekiq)
StudentVideo.reindex(async: true)# Basic search
StudentVideo.search("keyword")
# Search with filters
StudentVideo.search("keyword", where: { status: "approved", subject_id: "uuid" })
# Search with pagination
StudentVideo.search("keyword", page: 1, per_page: 20)- Sidekiq – przetwarzanie zadań w tle (w produkcji; w development domyślnie joby mogą działać inline)
- Elasticsearch – wyszukiwanie pełnotekstowe dla „School videos”
- SMTP – wysyłka e-maili (powiadomienia Devise)
Wdrożenia są realizowane przez Capistrano:
cap staging deploy
cap production deploy