+ Od veřejného cloudu přes on-premise až po serverless, se vším vám poradím.
+
+
+
+
+
+
+ >
+ )
+}
diff --git a/content/training/argocd.md b/content/training/argocd.md
new file mode 100644
index 0000000..aa52061
--- /dev/null
+++ b/content/training/argocd.md
@@ -0,0 +1,39 @@
+---
+name: ArgoCD
+priceOpen: 5900
+priceCompany: 24000
+logo: /images/logos/argo.png
+description: "ArgoCD je GitOps nastroj kterym nasazujeme aplikace do Kubernetes. Pracuje na zaklade deklaraticnich konfiguracnich souboru, ktete si stahuje z Gitu. To znamena, ze vse co commitneme do repozitare, se na nasadi do Kubernetes. O vsech zmenach: co, kdy, kdo udelal budeme mit prehledne zaznami v Gitu."
+days: 1
+new: true
+weight: 49
+---
+
+# Popis technologie
+
+ArgoCD je GitOps nastroj kterym nasazujeme aplikace do Kubernetes. Pracuje na zaklade deklaraticnich konfiguracnich souboru, ktete si stahuje z Gitu. To znamena, ze vse co commitneme do repozitare, se na nasadi do Kubernetes. O vsech zmenach: co, kdy, kdo udelal budeme mit prehledne zaznami v Gitu.
+
+# Co Vás naučím
+
+- Uvod do CD
+- Co je ArgoCD
+- Instalace a konfigurace
+- GitOps
+ - Plain Kubernetes manifests
+ - Helm packages
+ - Kustomize
+ - Jsonnet
+- Rollbacks
+- Best Practices
+- User Management
+
+# Pro koho je školení určeno
+
+Školení je určeno pro vývojáře a DevOpsáky, kteří chteji automaticky nasazovat do Kubernetes podle GitOps principu.
+
+# Předchozí znalosti
+
+Zakladni znalost Kubernetes
+Technické požadavky
+Webový prohlížeč
+Přístup na internet
diff --git a/content/training/git.md b/content/training/git.md
new file mode 100644
index 0000000..624f9a2
--- /dev/null
+++ b/content/training/git.md
@@ -0,0 +1,42 @@
+---
+name: Git
+priceOpen: 5900
+priceCompany: 24000
+logo: /images/logos/git.png
+description: "Git je moderní verzovaci nástroj, který se stal de facto standardem mezi vývojáři. Používají jej na denní bázy jednotlivci, startupy i korporace. Git vám nabízí jednoduchou kolaboraci na projektu s více lidmi a práci na více částech současně aniž byste si zasahovali do rozdělaných věcí nebo je jinak narušovali. Spolupráci na vývoji projektu ještě zlepšuje Gitlab, což je kolaborativni platforma na návrh, vývoj a provozování software (více o Gitlabu v samostatném kurzu)."
+days: 1
+weight: 1
+---
+
+# Co je to Git?
+
+Git je moderní verzovaci nástroj, který se stal de facto standardem mezi vývojáři. Používají jej na denní bázy jednotlivci, startupy i korporace. Git vám nabízí jednoduchou kolaboraci na projektu s více lidmi a práci na více částech současně aniž byste si zasahovali do rozdělaných věcí nebo je jinak narušovali. Spolupráci na vývoji projektu ještě zlepšuje Gitlab, což je kolaborativni platforma na návrh, vývoj a provozování software (více o Gitlabu v samostatném kurzu).
+
+# Jak školení probíhá
+
+Na školení formou workshopu si vysvětlíme proč je dobré Git používat, jak funguje (proč dnes nemá konkurenty) a best practice. Ukážeme si vše od instalace a základního nastavení Gitu, přes jednoduchou práci na jedné větvi až po práci v teamu a s více větvemi za pomoci různých mergovacích strategií (merge, rebase). Ukážeme si výhody a nevýhody obou z nich a je pak na Vás jak to budete dělat. Také si ukážeme jak se dostat ze špatných situací, jako omylem jsem si všechno smazal a podobně.
+
+# Co Vás naučím
+
+Konfigirace GITu
+Vytvořit nový repozitář
+Základní ovládání GITu
+Práce v jedné větvi
+Práce ve větvích - merge, rebase (silná stránka Gitu)
+Práce se vzdálenými repozitáři
+Záchrana smazaných dat z repozitáře
+
+# Pro koho je školení určeno
+
+Školení je určeno primárně pro vývojáře, kteří neverzují vůbec nebo nepoužívají Git. Zároveň je vhodné i pro ty, kteří Git nevyužívají na 100% (git commit, git pull, git push). Ať jde o malé weby nebo velké projekty, Git si najde uplatnění. Dále je kurz vhodný i pro ty, kteří nepíšou kód tak často, ale občas potřebují něco zaverzovat, například nějaké migrační skripty DB anebo konfiguraci serveru. Git pomůže i DBA nebo DevOps.
+
+## Předchozí znalosti
+
+Základy programování
+Základy práce v terminálu výhodou
+Základní znalost Gitu výhodou
+
+## Technické požadavky
+
+Nainstalovaný Git
+Přístup na internet - ideálně bez korporátní proxy, případně nastavenou proxy v prohlížeči
diff --git a/content/training/kubernetes.md b/content/training/kubernetes.md
new file mode 100644
index 0000000..270b230
--- /dev/null
+++ b/content/training/kubernetes.md
@@ -0,0 +1,42 @@
+---
+name: Kubernetes
+priceOpen: 11900
+priceCompany: 44000
+logo: /images/logos/kubernetes.png
+description: "Kubernetes jsou dnes nejrozšířenější platformou na hostování Docker kontejnerů a jsou podporovány velkými hráči na trhu (Google, Amazon, Microsoft) skrz Cloud Native Computing Foundation. Kubernetes pro provoz používají všechny velikosti firem, od startupu po korporace."
+days: 2
+featured: true
+weight: 50
+---
+
+# Popis technologie
+
+Kubernetes jsou dnes nejrozšířenější platformou na hostování Docker kontejnerů a jsou podporovány velkými hráči na trhu (Google, Amazon, Microsoft) skrz Cloud Native Computing Foundation. Kubernetes pro provoz používají všechny velikosti firem, od startupu po korporace.
+
+# Jak školení probíhá
+
+Školeni probíhá formou workshopů, vše si prakticky vyzkoušíme a osaháme. Ukážeme jak spustit Kubernetes lokálně (pro vývoj) a na cloudové platformě DigitalOcean. Dozvíme se základní strukturu Kubernetes a projdeme si jeho komponenty. Naučíme se jak napsat Kubernetes manifest a jak jim nasadit aplikaci v Dockeru. Dále si ukážeme jak pracovat s právama v Kubernetes a jak používat (a psát) Kubernetes balíčky v Helmu.
+
+# Co Vás naučím
+
+- Teoretický úvod do Kubernetes
+- Instalace Minikube a kubectl (pro ty kteří nenainstalovali doma)
+- Popis Kubernetes komponent
+- Deployment do Kubernetes
+- Práce s právy v Kubernetes clusteru
+- Teoretický úvod do Helm balíčku
+- Instalace / Deployment pomocí Helmu
+- Psaní vlastního Helm balíčku
+
+# Pro koho je školení určeno
+
+Školení je určeno pro lidi (vývojáři a devops), kteří mají zájem provozovat své Docker aplikace v Kubernetes.
+
+# Předchozí znalosti
+
+Základy práce s Dockerem
+Základy práce s Linuxem
+Základy práce v terminálu
+Technické požadavky
+Nainstalovaný Kubernetes
+Přístup na internet - ideálně bez korporátní proxy, případně nastavenou proxy v prohlížeči
diff --git a/content/training/terraform.md b/content/training/terraform.md
new file mode 100644
index 0000000..061c210
--- /dev/null
+++ b/content/training/terraform.md
@@ -0,0 +1,49 @@
+---
+name: Terraform
+priceOpen: 5900
+priceCompany: 24000
+logo: /images/logos/terraform.png
+description: "ArgoCD je GitOps nastroj kterym nasazujeme aplikace do Kubernetes. Pracuje na zaklade deklaraticnich konfiguracnich souboru, ktete si stahuje z Gitu. To znamena, ze vse co commitneme do repozitare, se na nasadi do Kubernetes. O vsech zmenach: co, kdy, kdo udelal budeme mit prehledne zaznami v Gitu."
+days: 1
+featured: true
+weight: 31
+---
+
+# Co to je Terraform a k čemu se používá?
+
+Terraform je nástroj, který se používá ke správě infrastruktury v cloudu, jak veřejném (AWS, Azure, GCP), tak privátním (OpenStack, VMware vSphere).
+
+Terraform Vám umožní spravovat infrastruktutru jako kód, to znamená verzovanou v Gitu, přidávání resources pomocí merge (pull) requestů a mnoho dalších výhod. Infrastrukturu můžete dále nasadit do testovacího prostředí přesně tak, jako je v produkci bez zbytečného úsilí. O všech komponentách máte přehled a můžete predikovat ceny. Konec klikání infrastruktury, zkuste Terraform.
+
+Terraform umožnuje spravovat více cloudových providerů současne, zároveň umožnuje pracovat s hibridními cloudy (část v privátním cloudu, část ve veřejném).
+
+# Jak školení probíhá
+
+Školení je formou workshopu, všechno si podrobně vyzkoušíme a vysvětlíme. Ukážeme si jak Terraform pracuje, jak jej používat v teamu a jak jím spravovat infrastukturu. Uděláme si příklad infrastruktury jednoduché aplikace, kde nastavíme vše - od DNS, přes Kubernetes cluster po S3 file storage.
+
+# Co Vás naučím
+
+- Základní koncept Terraformu
+- Výhody Terraformu proti Ansible, Puppetu, ...
+- Konfigurace Terraformu pro práci v teamu
+- Ovládání Terraform CLI
+- Úvod do Terraform Configuration Language (HCL)
+- Terraform Providers - napojení na cloudy
+- Práce s resources v Terraformu
+- Terraform moduly
+- Best Practice
+
+# Pro koho je školení určeno
+
+Školení je určeno pro DevOps a adminy, kteří chtějí lépe a efektivněji spravovat infrastrukturu. Zároveň také pro vývojáře, kteří se starají o nejakou infrastrukturu v cloudech.
+
+# Předchozí znalosti
+
+Základní znalost veřejných cloudů (AWS, DigitalOcean, Azure, ...)
+Základy práce v terminálu
+
+# Technické požadavky
+
+Nainstalovaný Terraform
+Přístup na internet (ideálně bez korporatni proxy)
+Vlastní účet v DigitalOceanu výhodou
diff --git a/lib/cms/training.ts b/lib/cms/training.ts
new file mode 100644
index 0000000..6968087
--- /dev/null
+++ b/lib/cms/training.ts
@@ -0,0 +1,52 @@
+import fs from 'fs'
+import { join } from 'path'
+import matter from 'gray-matter'
+
+const trainingDir = join(process.cwd(), 'content/training')
+
+export const getTrainingSlugs = () => {
+ return fs.readdirSync(trainingDir)
+}
+
+export const getTrainingBySlug = (slug: string, fields: string[] = []) => {
+ const realSlug = slug.replace(/\.md$/, '')
+ const fullPath = join(trainingDir, `${realSlug}.md`)
+ const fileContents = fs.readFileSync(fullPath, 'utf8')
+ const { data, content } = matter(fileContents)
+
+ type Items = {
+ [key: string]: string
+ }
+
+ const items: Items = {}
+
+ // Ensure only the minimal needed data is exposed
+ fields.forEach((field) => {
+ if (field === 'slug') {
+ items[field] = realSlug
+ }
+ if (field === 'content') {
+ items[field] = content
+ }
+
+ if (typeof data[field] !== 'undefined') {
+ items[field] = data[field]
+ }
+ })
+
+ return items
+
+}
+
+export const getAllTraining = (fields: string[] = []) => {
+ const slugs = getTrainingSlugs()
+ const trainingList = slugs
+ .map((slug) => getTrainingBySlug(slug, fields))
+ .sort((tr1, tr2) => {
+ const tr1w = parseInt(tr1.weight)
+ const tr2w = parseInt(tr2.weight)
+ return tr1w > tr2w ? -1 : 1
+ })
+
+ return trainingList
+}
diff --git a/lib/markdownToHTML.ts b/lib/markdownToHTML.ts
new file mode 100644
index 0000000..48f1bbb
--- /dev/null
+++ b/lib/markdownToHTML.ts
@@ -0,0 +1,9 @@
+import { remark } from 'remark'
+import html from 'remark-html'
+
+const markdownToHTML = async (markdown: string) => {
+ const result = await remark().use(html).process(markdown)
+ return result.toString()
+}
+
+export default markdownToHTML
diff --git a/pages/skoleni/[slug].tsx b/pages/skoleni/[slug].tsx
new file mode 100644
index 0000000..ae8468c
--- /dev/null
+++ b/pages/skoleni/[slug].tsx
@@ -0,0 +1,92 @@
+import Head from "next/head"
+import { useRouter } from "next/router"
+import ErrorPage from "next/error"
+
+import TrainingType from "@/types/training"
+import { getAllTraining, getTrainingBySlug } from "@/lib/cms/training"
+import markdownToHTML from "@/lib/markdownToHTML"
+import { Header } from "@/components/Header"
+import { Footer } from "@/components/Footer"
+import { Training } from "@/components/Training"
+
+type Props = {
+ training: TrainingType
+ featuredTrainingList: TrainingType[]
+}
+
+const TrainingPage = ({ training, featuredTrainingList}: Props) => {
+ const router = useRouter()
+ console.log(!router.isFallback)
+ console.log(!training?.slug)
+ console.log(typeof training.draft === 'undefined')
+ // if ((!router.isFallback && !training?.slug) || typeof training.draft === 'undefined') {
+ // return
+ // }
+
+ return (
+ <>
+
+ Školení {training.name} | Vojtěch Mareš - DevOps konzultant, lektor, engineer
+
+
+
+
+
+
+
+
+ >
+ )
+}
+
+export default TrainingPage
+
+type Params = {
+ params: {
+ slug: string
+ }
+}
+
+export const getStaticProps = async ({ params }: Params) => {
+ const training = getTrainingBySlug(params.slug, [
+ 'name',
+ 'content',
+ 'priceOpen',
+ 'priceCompany',
+ 'days',
+ 'logo',
+ 'content',
+ 'draft',
+ 'new',
+ 'featured',
+ ])
+
+ const content = await markdownToHTML(training.content || '')
+
+ return {
+ props: {
+ training: {
+ ...training,
+ content,
+ }
+ }
+ }
+}
+
+export const getStaticPaths = async () => {
+ const trainingList = getAllTraining(['slug'])
+
+ return {
+ paths: trainingList.map((training) => {
+ return {
+ params: {
+ slug: training.slug,
+ }
+ }
+ }),
+ fallback: false,
+ }
+}
diff --git a/pages/skoleni/index.tsx b/pages/skoleni/index.tsx
index 6c54bcb..968047c 100644
--- a/pages/skoleni/index.tsx
+++ b/pages/skoleni/index.tsx
@@ -2,8 +2,36 @@ import Head from "next/head";
import { Header } from "@/components/Header"
import { Footer } from '@/components/Footer'
+import { getAllTraining } from "@/lib/cms/training";
+import TrainingType from "@/types/training";
+import { TrainingListGrid } from "@/components/TrainingListGrid";
+
+export const getStaticProps = async () => {
+ const allTraining = getAllTraining([
+ 'name',
+ 'slug',
+ 'logo',
+ 'description',
+ 'days',
+ 'weight',
+ 'featured',
+ 'new',
+ 'draft',
+ ])
+
+ return {
+ props: { allTraining },
+ }
+}
+
+type Props = {
+ allTraining: TrainingType[]
+}
+
+const TrainingList = ({ allTraining }: Props) => {
+ // remove drafts
+ const trainingList = allTraining.filter((val) => !val.draft)
-export default function Home() {
return (
<>
@@ -16,9 +44,11 @@ export default function Home() {
-
Připravuji
+
>
);
}
+
+export default TrainingList
diff --git a/public/images/logos/argo.png b/public/images/logos/argo.png
new file mode 100644
index 0000000..6d1819b
Binary files /dev/null and b/public/images/logos/argo.png differ
diff --git a/public/images/logos/git.png b/public/images/logos/git.png
new file mode 100644
index 0000000..51f4ae5
Binary files /dev/null and b/public/images/logos/git.png differ
diff --git a/public/images/logos/kubernetes.png b/public/images/logos/kubernetes.png
new file mode 100644
index 0000000..1a9f546
Binary files /dev/null and b/public/images/logos/kubernetes.png differ
diff --git a/public/images/logos/terraform.png b/public/images/logos/terraform.png
new file mode 100644
index 0000000..8028d50
Binary files /dev/null and b/public/images/logos/terraform.png differ
diff --git a/types/training.ts b/types/training.ts
new file mode 100644
index 0000000..6724335
--- /dev/null
+++ b/types/training.ts
@@ -0,0 +1,18 @@
+type TrainingType = {
+ name: string
+ slug: string
+ priceOpen: number
+ priceCompany: number
+ logo: string
+ days: number
+ description: string
+ content: string
+
+ trainingHubId?: string
+ draft?: true
+ new?: true
+ featured?: true
+ weight: number // custom sorting
+}
+
+export default TrainingType