{"id":34930347,"url":"https://github.com/rodlukas/up-admin","last_synced_at":"2026-04-02T21:04:57.655Z","repository":{"id":35063063,"uuid":"122991375","full_name":"rodlukas/UP-admin","owner":"rodlukas","description":"ÚPadmin – Web application for the project “Úspěšný prvňáček“","archived":false,"fork":false,"pushed_at":"2026-02-09T20:01:41.000Z","size":29836,"stargazers_count":5,"open_issues_count":0,"forks_count":4,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-09T23:13:15.749Z","etag":null,"topics":["behave","bootstrap","czech","django","django-rest-framework","docker","fit-cvut","flyio","javascript","jwt","postgresql","python","react","react-router","rest-api","selenium","single-page-app","typescript","vanilla-extract","web-application"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rodlukas.png","metadata":{"files":{"readme":"README.cs.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-02-26T15:44:24.000Z","updated_at":"2026-02-09T20:01:44.000Z","dependencies_parsed_at":"2026-02-10T21:00:40.417Z","dependency_job_id":null,"html_url":"https://github.com/rodlukas/UP-admin","commit_stats":null,"previous_names":[],"tags_count":191,"template":false,"template_full_name":null,"purl":"pkg:github/rodlukas/UP-admin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodlukas%2FUP-admin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodlukas%2FUP-admin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodlukas%2FUP-admin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodlukas%2FUP-admin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rodlukas","download_url":"https://codeload.github.com/rodlukas/UP-admin/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodlukas%2FUP-admin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29316366,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-10T20:44:44.282Z","status":"ssl_error","status_checked_at":"2026-02-10T20:44:43.393Z","response_time":65,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["behave","bootstrap","czech","django","django-rest-framework","docker","fit-cvut","flyio","javascript","jwt","postgresql","python","react","react-router","rest-api","selenium","single-page-app","typescript","vanilla-extract","web-application"],"created_at":"2025-12-26T15:34:25.562Z","updated_at":"2026-03-01T12:08:44.624Z","avatar_url":"https://github.com/rodlukas.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./admin/static/admin/android-chrome-192x192.png\" alt=\"ÚPadmin logo\" width=\"72\"\u003e\n\u003c/p\u003e\n\n\u003ch2 align=\"center\"\u003eÚPadmin\u003c/h2\u003e\n\n\u003cp align=\"center\"\u003e\n    Webová aplikace pro projekt \u003cstrong\u003e\u003ca href=\"https://uspesnyprvnacek.cz/\"\u003eÚspěšný prvňáček\u003c/a\u003e\u003c/strong\u003e.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    Read this in other languages: \u003cstrong\u003e\u003ca href=\"README.md\"\u003eEnglish\u003c/a\u003e\u003c/strong\u003e, \u003cstrong\u003e\u003ca href=\"README.cs.md\"\u003eCzech\u003c/a\u003e\u003c/strong\u003e.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/rodlukas/UP-admin/actions/workflows/test.yml\"\u003e\u003cimg alt=\"GitHub Actions\" src=\"https://github.com/rodlukas/UP-admin/actions/workflows/test.yml/badge.svg\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://codecov.io/gh/rodlukas/UP-admin\"\u003e\u003cimg alt=\"Codecov\" src=\"https://img.shields.io/codecov/c/gh/rodlukas/UP-admin.svg?style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"LICENSE\"\u003e\u003cimg alt=\"GitHub license\" src=\"https://img.shields.io/github/license/rodlukas/UP-admin.svg?style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/rodlukas/UP-admin/releases/latest\"\u003e\u003cimg alt=\"GitHub release\" src=\"https://img.shields.io/github/release/rodlukas/UP-admin.svg?style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/rodlukas/UP-admin/releases/latest\"\u003e\u003cimg alt=\"GitHub commits since latest release\" src=\"https://img.shields.io/github/commits-since/rodlukas/UP-admin/latest.svg?style=flat-square\"\u003e\u003c/a\u003e\n    \u003cbr\u003e\n    \u003ca href=\"https://github.com/rodlukas/UP-admin/actions/workflows/codeql.yml\"\u003e\u003cimg alt=\"GitHub CodeQL\" src=\"https://github.com/rodlukas/UP-admin/actions/workflows/codeql.yml/badge.svg\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://observatory.mozilla.org/analyze/uspesnyprvnacek.fly.dev\"\u003e\u003cimg alt=\"Mozilla HTTP Observatory Grade\" src=\"https://img.shields.io/mozilla-observatory/grade-score/uspesnyprvnacek.fly.dev?publish\u0026style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://sonarcloud.io/dashboard?id=rodlukas_UP-admin\"\u003e\u003cimg alt=\"Sonar Quality Gate\" src=\"https://img.shields.io/sonar/quality_gate/rodlukas_UP-admin?server=https%3A%2F%2Fsonarcloud.io\u0026style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://deepscan.io/dashboard#view=project\u0026tid=8194\u0026pid=10346\u0026bid=141965\"\u003e\u003cimg src=\"https://deepscan.io/api/teams/8194/projects/10346/branches/141965/badge/grade.svg\" alt=\"DeepScan grade\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://snyk.io/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Snyk%20security-monitored-purple\" alt=\"Snyk security\"\u003e\u003c/a\u003e\n    \u003cbr\u003e\n    \u003ca href=\"https://stackshare.io/rodlukas/upadmin\"\u003e\u003cimg alt=\"StackShare\" src=\"http://img.shields.io/badge/tech-stack-0690fa.svg?style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/prettier/prettier\"\u003e\u003cimg alt=\"Code style (js): prettier\" src=\"https://img.shields.io/badge/code_style_(js)-prettier-ff69b4.svg?style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/psf/black\"\u003e\u003cimg alt=\"Code style (python): black\" src=\"https://img.shields.io/badge/code_style_(python)-black-000000.svg?style=flat-square\"\u003e\u003c/a\u003e\n    \u003cbr\u003e\n    \u003ca href=\"https://github.com/rodlukas/UP-admin/actions/workflows/deploy.yml\"\u003e\u003cimg alt=\"GitHub Actions\" src=\"https://github.com/rodlukas/UP-admin/actions/workflows/deploy.yml/badge.svg\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://uspesnyprvnacek.fly.dev/\"\u003e\u003cimg alt=\"GitHub deployments\" src=\"https://img.shields.io/github/deployments/rodlukas/UP-admin/uspesnyprvnacek?label=deploy%20%28production%29\u0026style=flat-square\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://uspesnyprvnacek-test.fly.dev/\"\u003e\u003cimg alt=\"GitHub deployments\" src=\"https://img.shields.io/github/deployments/rodlukas/UP-admin/uspesnyprvnacek-testing?label=deploy%20%28testing%29\u0026style=flat-square\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://sentry.io/organizations/rodlukas/issues/?project=1247206\"\u003eSentry\u003c/a\u003e · \n    \u003ca href=\"https://fly.io/dashboard\"\u003eFly.io\u003c/a\u003e · \n    \u003ca href=\"https://app.snyk.io/org/rodlukas/projects?groupBy=targets\u0026searchQuery=UP-admin\"\u003eSnyk\u003c/a\u003e · \n    \u003ca href=\"https://analytics.google.com/analytics/web/#/report-home/a53235943w186065128p183124243\"\u003eGoogle Analytics\u003c/a\u003e\n\u003c/p\u003e\n\n## Obsah\n\n- [Základní informace o aplikaci](#základní-informace-o-aplikaci)\n    - [Klíčové funkce](#klíčové-funkce)\n    - [Použité technologie](#použité-technologie)\n        - [Backend](#backend)\n        - [Frontend](#frontend)\n    - [Nasazené aplikace a nástroje](#nasazené-aplikace-a-nástroje)\n- [Struktura repozitáře](#struktura-repozitáře)\n- [Spuštění aplikace](#spuštění-aplikace)\n    - [Požadavky](#požadavky)\n    - [Instalace \u0026 spuštění](#instalace-\u0026-spuštění)\n    - [Pokročilá instalace bez Docker Compose](#pokročilá-instalace-bez-docker-compose)\n    - [Testování](#testování)\n- [Screenshoty](#screenshoty)\n- [Historie](#historie)\n- [Licence](#licence)\n\n## Základní informace o této aplikaci\n\nWebová aplikace pro projekt **[Úspěšný prvňáček](https://uspesnyprvnacek.cz/)** (mrkněte na\n[jeho stránky](https://uspesnyprvnacek.cz/), také pochází z mé tvorby) – založená na technologiích\nReact (TypeScript), Django (Python), REST API, Django REST Framework.\n\nAplikaci jsem vytvořil v roce 2018 jako **bakalářskou práci na [FIT ČVUT](https://fit.cvut.cz/cs)**\n– vizte [repozitář s textem bakalářské práce](https://github.com/rodlukas/bachelors-thesis). Od té\ndoby je v projektu [Úspěšný prvňáček](https://uspesnyprvnacek.cz/) denně úspěšně používána a její\nrozšiřování a práce na ní stále pokračují ❤️. V roce 2020 jsem se také v **diplomové práci na FIT\nČVUT** věnoval všem dosavadním rozšířením aplikace o nové funkce, technologie a nástroje – vizte\n[repozitář s textem diplomové práce](https://github.com/rodlukas/masters-thesis). A vývoj probíhá i\nnadále.\n\n### Klíčové funkce\n\nV následujícím seznamu jsou nejdůležitější funkce, která aplikace poskytuje (výčet není konečný):\n\n- **evidence klientů a skupin klientů docházejících na lekce kurzů**,\n- **evidence lekcí klientů a skupin včetně předplacených – stav účasti, platba, datum, čas, zrušení,\n  poznámky**,\n- **evidence zájemců o kurzy**,\n- **zobrazení lekcí ve 3 formách: v kartě klienta/skupiny, v diáři a na hlavní stránce v přehledu\n  pro dnešní den**,\n- kontrola časových konfliktů lekcí,\n- automatické rušení lekcí když nikdo nemá přijít,\n- automatické vytváření předplacených náhrad lekcí při omluvě předem/zrušení ze strany lektorky,\n- upozornění, že má klient příště platit,\n- výpočet pořadového čísla lekce s ohledem na účast klientů,\n- vyhledávání klientů (fuzzy vyhledávání),\n- konfigurace kurzů a stavů účasti včetně např. intuitivního nastavení zvolené barvy pro kurz,\n- propojení s API _Fio banky_ – na hlavní stránce se přehledně zobrazují nedávné transakce z účtu,\n- automatický odhad kurzu, data a času pro nově přidávané lekce,\n- respektování a kontrola všech omezení daných danou doménou (např. duplicity),\n- vedení aktivních a neaktivních klientů a skupin.\n\n### Použité technologie\n\nAplikace je rozdělena na **frontend a backend**, ty spolu komunikují přes **REST API** zabezpečené\n**[JWT](https://jwt.io/) autentizací**. Jako databáze se používá\n[PostgreSQL 14](https://www.postgresql.org/).\n\n\u003e **ℹ️ Poznámka:** součástí repozitáře je také diagram nasazení a logický datový model – viz\n\u003e [`docs/README.md`](docs).\n\n#### Backend\n\nObsahuje veškerou logiku a pro klienta vystavuje **REST API**, postaven na těchto technologiích:\n\n- [Python 3.12](https://www.python.org/),\n- [Django 5](https://www.djangoproject.com/),\n- [Django REST framework 3](https://www.django-rest-framework.org/),\n- [djangorestframework-simplejwt](https://github.com/davesque/django-rest-framework-simplejwt),\n- [Pipenv](https://pipenv.pypa.io/en/latest/#install-pipenv-today),\n- [a další...](/Pipfile)\n\nV Djangu jsou pro mnohonásobné zrychlení pokročile **optimalizované komplexní SQL dotazy** (viz\nčlánky [[1]](https://www.revsys.com/tidbits/django-performance-simple-things/),\n[[2]](http://ses4j.github.io/2015/11/23/optimizing-slow-django-rest-framework-performance/)).\nAplikace umožňuje **pokročilé debugování** na lokálním i vzdáleném prostředí díky\n**[Django Debug Toolbar](https://github.com/jazzband/django-debug-toolbar)** a jeho doplňku\n[Django Debug Toolbar Request History](https://github.com/djsutho/django-debug-toolbar-request-history/).\n\nPro **statickou typovou kontrolu** se napříč celým kódem používají typové anotace s použitím modulu\n[typing](https://docs.python.org/3/library/typing.html), pro kontrolu typů se používá\n**[mypy](http://mypy-lang.org/)** a [Pycharm](https://www.jetbrains.com/pycharm/). Pro **eliminaci\nmrtvého kódu** se také používá **[vulture](https://github.com/jendrikseipp/vulture/)**.\n\n#### Frontend\n\nResponzivní JS _([TypeScript](https://www.typescriptlang.org/))_ webová aplikace typu SPA\n([Single-Page-App](https://en.wikipedia.org/wiki/Single-page_application)) postavená na těchto\ntechnologiích:\n\n- [React 19](https://react.dev/),\n- [TypeScript 5](https://www.typescriptlang.org/),\n- [Bootstrap 5](https://getbootstrap.com/) (s [Reactstrap 9](https://reactstrap.github.io/)em),\n- [FontAwesome 5 PRO](https://fontawesome.com/) (publikované do privátních Github Package Registry),\n- [Tanstack Router 5](https://tanstack.com/router/),\n- [Tanstack Query (dříve React Query)](https://tanstack.com/query/)\n- [a další...](/frontend/package.json)\n\nVývoj frontendu je postaven především na:\n\n- [Webpack 5](https://webpack.js.org/) s vlastní konfigurací (lokální i produkční) +\n  [Webpack DevServer](https://webpack.js.org/configuration/dev-server/),\n- [Typescript 5](https://www.typescriptlang.org/) – pro statickou typovou kontrolu,\n- [vanilla-extract](https://vanilla-extract.style/) - typově bezpečná statická CSS,\n- [ESlint 9](https://eslint.org/) – linter pro statickou analýzu kódu,\n- [Babel 7](https://babeljs.io/),\n- [husky](https://github.com/typicode/husky) a [lint-staged](https://github.com/okonet/lint-staged)\n  – pre-commit kontroly (ESlint, Prettier)\n- a [React Refresh](https://github.com/facebook/react/tree/main/packages/react-refresh) – pro\n  [HMR](https://webpack.js.org/guides/hot-module-replacement/).\n\nAplikace je **odolná proti pádům JS** díky\n**[React Error Boundaries](https://reactjs.org/docs/error-boundaries.html)**. Pro **zrychlení\nnačítání** celé aplikace se používá lazy loading\n**[`React.lazy` + `React Suspense`](https://reactjs.org/docs/code-splitting.html)**.\n[Webpack DevServer](https://webpack.js.org/configuration/dev-server/) je při vývoji propojený s\n[Django](https://www.djangoproject.com/) dev serverem a umožňuje tak jednoduchý vývoj bez kompromisů\nvčetně [HMR](https://webpack.js.org/guides/hot-module-replacement/). Globální stav aplikace je\nspravován přes **[React Context](https://reactjs.org/docs/context.html)**. Codebase je postavená nad\nfunkcionálními komponentami a **[React Hooks](https://reactjs.org/docs/hooks-intro.html)**.\n\n### Nasazené aplikace a nástroje\n\nAplikace je nasazena do **2 prostředí na PaaS [Fly.io](https://fly.io/)**, které se liší příslušnou\nnasazenou verzí aplikace, konkrétní instancí databáze a umožňují různé úrovně debugování. Mimo to\nlze samozřejmě aplikaci spustit i v prostředí lokálním u vývojáře. Typ prostředí je také zvýrazněn\nbarevným štítkem v horním menu (kromě produkce).\n\n\u003e **Seznam prostředí:**\n\u003e\n\u003e - **lokální** – pro lokální vývoj,\n\u003e - **testing** – stejná konfigurace jako na produkci, deploy při každém commitu; umožňuje zapnout\n\u003e   debugování,\n\u003e - **produkce** – produkční verze používaná zákazníkem, deploy při release,\n\n- Nasazené aplikace jsou **HTTPS-only** (+ pokročilé zabezpečení, viz\n  [[1]](https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/),\n  [[2]](https://wsvincent.com/django-best-practices/)).\n- Pro **automatické formátování kódů** se používá **[Black](https://github.com/psf/black)** (Python)\n  a **[Prettier](https://prettier.io/)** (TS, TSX, JS, CSS, HTML, JSON, YAML, TOML, MD), oba\n  nástroje jsou napojené na IDE a provádějí automatické úpravy.\n- **Aplikace jsou napojené na další služby:**\n    - **CI a CD** má na starost [GitHub Actions](https://github.com/features/actions) –\n      automatizovaný build, testování i nasazení na různá prostředí, automaticky prováděné\n      pokročilejší skripty např. pro automatické zapsání verze do aplikace, práci s tokeny, nahrání\n      sestaveného frontendu do assetů k releasu na GitHubu, napojení na služby pro výpočet pokrytí\n      kódu a další.\n    - **Automatickou průběžnou analýzu a kontrolu kódu** včetně hodnocení kvality kódu, hledání\n      potenciálních chyb a zranitelností má na starost [GitHub CodeQL](https://codeql.github.com/),\n      [SonarCloud](https://sonarcloud.io/) a [DeepScan](https://deepscan.io/).\n    - **Odchytávání chyb na backendu i frontendu** včetně následné evidence, notifikací a propojení\n      s repozitářem zařizuje [Sentry](https://sentry.io/) (tříděné podle typu prostředí, aktivní na\n      všech nasazených aplikacích). Při chybě na frontendu je možné poslat **zpětnou vazbu vázanou\n      ke konkrétní chybě** díky propojení Sentry a\n      [React Error Boundaries](https://reactjs.org/docs/error-boundaries.html).\n    - **Sledování toku uživatelů** umožňuje napojení na\n      [Google Analytics](https://analytics.google.com/) (přes modul\n      [react-ga](https://github.com/react-ga/react-ga)).\n- [audit-ci](https://github.com/IBM/audit-ci) se používá pro automatizovanou kontrolu zranitelných\n  závislostí projektu na CI.\n- Aplikace **respektuje standardy** [PEP 8](https://pep8.org),\n  [12-Factor App](https://12factor.net/), [ROCA](https://roca-style.org/).\n- Kompletní vývoj aplikace probíhá v IDE\n  _[Pycharm (Professional Edition)](https://www.jetbrains.com/pycharm/)_ (řeší automatickou\n  optimalizaci importů, automatické formátování kódů apod.).\n- **Rozsáhlé testy API i UI (E2E)** jsou důležitou částí aplikace, automaticky se spouští na CI a\n  lze je spustit i na lokálním prostředí. Část frontendu je navíc pokryta **unit testy**.\n    - E2E testování je postaveno na **BDD frameworku [behave](https://github.com/behave/behave)** –\n      testové scénáře jsou psány přirozeným jazykem (Gherkin), podle nich se spouští konkrétní\n      testy.\n    - Unit testy jsou postaveny na **frameworku [Jest](https://jestjs.io/)** a nástrojích\n      **[React Testing Library](https://testing-library.com/docs/react-testing-library/intro)**\n      (jednoduché utility pro testování Reactu),\n      [jest-dom](https://testing-library.com/docs/ecosystem-jest-dom) (custom DOM element matchers\n      pro Jest) a [MSW](https://mswjs.io/) (mockování API).\n    - Pro **testování UI (E2E)** se používá [Selenium](https://github.com/SeleniumHQ/selenium).\n    - **Podrobné informace o testech jsou v [`tests/README.md`](tests)**.\n\n## Struktura repozitáře\n\n```\n├── .github ...... GitHub Actions konfigurace\n├── .idea ........ nastavení pro IDE (Pycharm od Jetbrains)\n├── admin ........ Django aplikace pro webovou aplikaci\n├── api .......... Django aplikace pro REST API\n├── db ........... Dockerfily pro PostgreSQL\n├── docs ......... další dokumentace a soubory k aplikaci včetně diagramů\n├── frontend ..... klientská část webové aplikace\n├── scripts ...... skripty pro CI/CD/PaaS/instalaci\n├── staticfiles .. složka pro statické soubory (prázdná, přesun až na CI)\n├── tests ........ testy API i UI (e2e)\n└── up ........... celý Django projekt\n```\n\n## Spuštění aplikace\n\nAplikaci lze spustit na lokálním prostředí ve dvou režimech. Výchozí režim je klasický vývojový –\nten obsahuje pokročilé debugovací nástroje, spouští se Django vývojový server a také\nwebpack-dev-server pro frontend. Vzhledem k práci s privátními GitHub Package registry (viz\n[níže](#npmpro)) nelze samozřejmě bez příslušných tokenů sestavovat frontend, proto zde budu\npopisovat postup spuštění ve druhém režimu – **manuální produkční verze aplikace**, tedy ta, která\nje nejblíže verzi u zákazníka.\n\n### Požadavky\n\nMinimální požadavky jsou:\n\n- [Git](https://git-scm.com/downloads),\n- [Docker Desktop s Compose V2](https://www.docker.com/products/docker-desktop/).\n\n### Instalace \u0026 spuštění\n\n1.  Nejdříve **naklonujte repozitář**, otevřete jeho složku a nahrajte si **poslední produkční\n    verzi** repozitáře:\n\n    ```bash\n    git clone \"https://github.com/rodlukas/UP-admin.git\" \u0026\u0026 cd UP-admin\n    git checkout $(git describe --tags `git rev-list --tags --max-count=1`)\n    ```\n\n2.  **Vytvořte vaše lokální konfigurační prostředí ze vzorové konfigurace `.env.template`**:\n\n    ```bash\n    cp .env.template .env\n    ```\n\n3.  Použijte Docker Compose V2 pro **spuštění všech kontejnerů** 🚀:\n\n    ```bash\n    docker compose up\n    ```\n\n4.  A když kontejnery běží, ve vedlejším CLI si založte uživatelský účet:\n\n    ```bash\n    docker compose run web python manage.py createsuperuser\n    ```\n\n5.  **Aplikace je nyní dostupná na adrese \u003chttp://localhost:8000/\u003e ✅.**\n\n\u003e **⚠️ Upozornění:** Docker Compose soubor používá Django dev server (ne Gunicorn), je pouze pro\n\u003e lokální testovací účely, nasazená prostředí používají Gunicorn server.\n\n\u003e **ℹ️ Poznámka: otevření aplikace na jiném zařízení v síti** – aplikace je připravena pro použití i\n\u003e z dalších zařízeních v síti (např. z mobilního telefonu), obvykle je potřeba provést tyto 2 kroky:\n\u003e\n\u003e 1.  povolit Python a Node.js ve firewallu (např. na chvíli aktivovat interaktivní režim ESETu),\n\u003e 2.  na mobilním zařízení zadat hostname nebo privátní IP adresu počítače, na kterém běží server.\n\n### Pokročilá instalace bez Docker Compose\n\nAplikaci také můžete spustit pouze s Dockerem bez Docker Compose V2, ale je to o poznání náročnější!\n\n\u003cdetails\u003e\n\u003csummary\u003eUkaž mi alternativní pokročilejší instalaci\u003c/summary\u003e\n\n\u003ca name=\"npmpro\"\u003e\n  \n\u003e **ℹ️ Poznámka:** Node.js ani npm nejsou požadovány, protože ve vlastním prostředí nelze frontend sestavit (je potřeba\n přístup přes token k privátnímu GitHub Package registru pro [FontAwesome PRO](https://fontawesome.com/)). Místo toho zde použijeme \n automaticky sestavenou poslední produkční verzi frontendu z integračního serveru (která se automaticky nahrává do assetů ke každému release).\n \n\u003c/a\u003e\n\n1.  Nejdříve **naklonujte repozitář**, otevřete jeho složku a nahrajte si **poslední produkční\n    verzi** repozitáře:\n\n    ```bash\n    git clone \"https://github.com/rodlukas/UP-admin.git\" \u0026\u0026 cd UP-admin\n    git checkout $(git describe --tags `git rev-list --tags --max-count=1`)\n    ```\n\n2.  Stáhněte již **sestavené zdrojové kódy frontendu** z poslední produkční verze a **rozbalte** je\n    přímo do repozitáře (a `frontend.zip` smažeme):\n\n    ```bash\n    wget https://github.com/rodlukas/UP-admin/releases/latest/download/frontend.zip\n    unzip frontend.zip \u0026\u0026 rm frontend.zip\n    ```\n\n3.  **Vytvořte vaše lokální konfiguraci prostředí ze vzorové konfigurace `.env.template`**:\n\n    ```bash\n    cp .env.template .env\n    ```\n\n4.  Nainstalujeme všechny **závislosti pro backend** a aktivujeme virtuální prostředí Pythonu:\n\n    ```bash\n    pipenv install --dev\n    pipenv shell\n    ```\n\n5.  Vytvoříme docker image a spustíme kontejner s PostgreSQL:\n\n    ```bash\n    source scripts/shell/postgresql_docker.sh\n    ```\n\n6.  **Připravíme celou Django aplikaci na spuštění** ([skript](scripts/shell/release_tasks.sh)\n    nastaví výchozí soubor s nastavením Djanga, připraví statické soubory frontendu a vytvoří\n    databázové schéma):\n\n    ```bash\n    source scripts/shell/release_tasks.sh\n    ```\n\n7.  A vytvoříme **uživatelský účet pro přístup do aplikace** (zadáme libovolné údaje, kterými se\n    poté budeme přihlašovat):\n\n    ```bash\n    python manage.py createsuperuser\n    ```\n\n8.  💡 _(NEPOVINNÉ)_ Na závěr můžeme ještě **naplnit naši databázi\n    [předpřipravenými vzorovými daty](scripts/sql/sample_data.pgsql)**, která ukážou fungování\n    aplikace a usnadní první použití (obsahují několik klientů, skupin, lekcí, zájemců, kurzů a\n    stavů účasti):\n\n    ```bash\n    docker exec postgresql_cz psql --dbname postgres -h localhost -U postgres -f sample_data.pgsql\n    ```\n\n### Spuštění\n\n**Spustíme vývojový server** 🚀:\n\n```bash\npython manage.py runserver 0.0.0.0:8000\n```\n\n**✅ Aplikace je nyní dostupná na adrese \u003chttp://localhost:8000/\u003e.**\n\n\u003c/details\u003e\n\n### Testování\n\nMůžeme také snadno spustit různé testy aplikace, například otestovat, jestli správně funguje API pro\nklienty:\n\n```bash\npython manage.py behave --stage=api --tags=clients\n```\n\nAplikace obsahuje **rozsáhlé API a UI (e2e) testy** – vizte\n[podrobné informace o testech a možnostech spouštění](tests).\n\n## Screenshoty\n\n\u003e **ℹ️ Poznámka:** údaje v aplikaci jsou smyšlené.\n\n### Diář\n\n[![screenshot z diáře](docs/screenshots/diary.png)](https://raw.githubusercontent.com/rodlukas/UP-admin/master/docs/screenshots/diary.png)\n\n### Přehled (hlavní stránka)\n\n[![screenshot z přehledu](docs/screenshots/dashboard.png)](https://raw.githubusercontent.com/rodlukas/UP-admin/master/docs/screenshots/dashboard.png)\n\n### Karta klienta / skupiny\n\n[![screenshot z karty klienta](docs/screenshots/card-client.png)](https://raw.githubusercontent.com/rodlukas/UP-admin/master/docs/screenshots/card-client.png)\n\n[![screenshot z karty skupiny](docs/screenshots/card-group.png)](https://raw.githubusercontent.com/rodlukas/UP-admin/master/docs/screenshots/card-group.png)\n\n### Zájemci o kurzy\n\n[![screenshot ze zájemců o kurzy](docs/screenshots/applications.png)](https://raw.githubusercontent.com/rodlukas/UP-admin/master/docs/screenshots/applications.png)\n\n### Nastavení\n\n[![screenshot z nastavení](docs/screenshots/settings.png)](https://raw.githubusercontent.com/rodlukas/UP-admin/master/docs/screenshots/settings.png)\n\n### Vyhledávání\n\n[![screenshot z vyhledávání](docs/screenshots/search.png)](https://raw.githubusercontent.com/rodlukas/UP-admin/master/docs/screenshots/search.png)\n\n### Výpisy\n\n[![screenshot z výpisu skupin](docs/screenshots/groups.png)](https://raw.githubusercontent.com/rodlukas/UP-admin/master/docs/screenshots/groups.png)\n\n[![screenshot z výpisu klientů](docs/screenshots/clients.png)](https://raw.githubusercontent.com/rodlukas/UP-admin/master/docs/screenshots/clients.png)\n\n### Formuláře\n\n#### Úprava skupinové lekce\n\n[![screenshot formuláře pro úpravu skupinové lekce](docs/screenshots/form-lecture.png)](https://raw.githubusercontent.com/rodlukas/UP-admin/master/docs/screenshots/form-lecture.png)\n\n#### Úprava údajů o skupině\n\n[![screenshot formuláře pro úpravu údajů o skupině](docs/screenshots/form-group.png)](https://raw.githubusercontent.com/rodlukas/UP-admin/master/docs/screenshots/form-group.png)\n\n## Historie\n\n### CI\n\nProjekt původně pro CI \u0026 CD používal [Travis](https://travis-ci.com/), ale v listopadu 2022 došlo k\nmigraci na GitHub Actions.\n\n### Analýza kódu\n\nAutomatickou průběžnou analýzu a kontrolu kódu zajišťoval mj. [LGTM](https://lgtm.com/) až do\nlistopadu 2022, kdy byl nahrazen svým nástupcem [GitHub CodeQL](https://codeql.github.com/).\n\nStejně tak se postupem času měnily další nástroje pro statickou analýzu kódu a některé už i přes\nsvůj přínos zanikly, nebo se z nich staly větší nástroje, např. CodeBeat, DeepCode.\n\n### PaaS\n\nProjekt byl původně nasazen na [Heroku PaaS](https://www.heroku.com/). Zde byly 4 nezávislé běžící\ninstance - `testing` (automatické nasazování z master větve), `staging` (stejné jako produkce),\n`produkce` a `demo` (s veřejnými přístupovými údaji a ukázkovými daty, která byla automaticky a\nperiodicky obnovována přes _Heroku Scheduler_). Kvůli\n[oznámeným změnám cen Heroku](https://blog.heroku.com/next-chapter) bylo učiněno rozhodnutí posunout\nse o dům dál. Nejprve v listopadu 2022 bylo na [Fly.io](https://fly.io/) zmigrováno testing\nprostředí. Krátce nato v prosinci 2022 byla takto přesunuta i celá produkce. Migrace zahrnovala i\nPostgreSQL databázi se všemi daty. Instance `staging` a `demo` byly ukončeny bez náhrady.\n\n### Kontejnerizace\n\nVzhledem k tomu, že aplikace byla původně nasazena na [Heroku PaaS](https://www.heroku.com/) s\npoužitím jejich [Buildpacks](https://devcenter.heroku.com/articles/buildpacks), nepoužívala žádnou\nformu kontejnerizace. Tento přístup měl své výhody i nevýhody. Ale vzhledem k příchodu jiných PaaS\njako [Fly.io](https://fly.io/) byla vyžadována migrace na kontejnery. To vedlo k plně\nkontejnerizované aplikaci založené na Dockeru (a publikovaném obrazu v Github Container Registry). S\npomocí nově vzniklého Docker Compose V2 bylo také možné výrazné zjednodušení tohoto README pro\ninstalaci a spuštění, která nyní zabere jen pár řádků.\n\n## Licence\n\nLicencováno pod [MIT](LICENSE) licencí.\n\nCopyright (c) 2018–2026 [Lukáš Rod](https://lukasrod.cz/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frodlukas%2Fup-admin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frodlukas%2Fup-admin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frodlukas%2Fup-admin/lists"}