├── .envrc ├── types ├── nextra.d.ts └── tutorial.ts ├── .prettierignore ├── public ├── og.jpg ├── hero.png ├── og-bg.jpg ├── banner.png ├── dark │ ├── favicon.ico │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── apple-touch-icon.png │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── site.webmanifest │ └── browserconfig.xml ├── light │ ├── favicon.ico │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── apple-touch-icon.png │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── site.webmanifest │ └── browserconfig.xml ├── safari-pinned-tab.svg ├── hero.svg └── logos │ ├── logo-dark.svg │ └── logo-light.svg ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md └── workflows │ ├── builder.yml │ └── dockerhub.yml ├── pages ├── tutorials │ ├── _meta.en-UZ.json │ ├── developing.en-UZ.mdx │ ├── all.en-UZ.mdx │ └── article │ │ ├── cephga-kirish.en-UZ.mdx │ │ ├── openvpn-subnet.en-UZ.mdx │ │ ├── dinamik-to-static.en-UZ.mdx │ │ ├── bind9-nameserver.en-UZ.mdx │ │ └── ansible-terraform.en-UZ.mdx ├── 500.mdx ├── 404.mdx ├── guides │ ├── _meta.en-UZ.json │ ├── ci-cd.en-UZ.mdx │ ├── cloud.en-UZ.mdx │ ├── monitoring.en-UZ.mdx │ ├── web-server.en-UZ.mdx │ ├── konteyner.en-UZ.mdx │ ├── database.en-UZ.mdx │ ├── k8s.en-UZ.mdx │ ├── cloud │ │ ├── _meta.en-UZ.json │ │ └── aws-ecs-ecr-pipeline.en-UZ.mdx │ ├── web-server │ │ ├── _meta.en-UZ.json │ │ └── dinamik-subdomenlar-sozlash.en-UZ.mdx │ ├── monitoring │ │ └── _meta.en-UZ.json │ ├── konteyner │ │ ├── _meta.en-UZ.json │ │ ├── code-server.en-UZ.mdx │ │ ├── docker-registry.en-UZ.mdx │ │ └── dockerga-kirish.en-UZ.mdx │ ├── database │ │ ├── _meta.en-UZ.json │ │ └── postgresql-bilan-ishlash.en-UZ.mdx │ ├── k8s │ │ ├── _meta.en-UZ.json │ │ ├── ha-rke2-setup.en-UZ.mdx │ │ └── troubleshoot-k8s-pods.en-UZ.mdx │ ├── ci-cd │ │ ├── _meta.en-UZ.json │ │ └── dotnet-deployment.en-UZ.mdx │ └── overview.en-UZ.mdx ├── api │ ├── like.ts │ ├── view.ts │ ├── dislike.ts │ ├── init.ts │ └── logic.ts ├── _meta.en-UZ.json ├── _app.tsx ├── _document.tsx └── index.en-UZ.mdx ├── assets └── contributing │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ └── banner.png ├── hooks ├── index.ts ├── useIsMounted.ts └── useLocalStorage.ts ├── components ├── core │ ├── index.ts │ ├── Tutorial │ │ ├── StructuredData.tsx │ │ ├── Card.tsx │ │ └── Header.tsx │ ├── Link.tsx │ ├── SyncedTabs.tsx │ ├── LogoType.tsx │ └── Card │ │ └── index.tsx ├── github-sponsors.tsx └── article-footer.tsx ├── postcss.config.js ├── .npmrc ├── .prettierrc ├── tailwind.config.js ├── next-env.d.ts ├── .gitignore ├── shell.nix ├── .dockerignore ├── middleware.ts ├── styles ├── custom-tabs.css └── globals.css ├── flake.nix ├── tsconfig.json ├── next.config.js ├── flake.lock ├── .gitlab-ci.yml ├── Dockerfile ├── default.nix ├── package.json ├── .eslintrc.js ├── SYSTEM_REQUIREMENTS.md ├── Makefile ├── README.md ├── module.nix ├── theme.config.tsx └── CONTRIBUTING.md /.envrc: -------------------------------------------------------------------------------- 1 | use flake 2 | use flake 3 | -------------------------------------------------------------------------------- /types/nextra.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'nextra/locales'; 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | generated 4 | CHANGELOG.md 5 | -------------------------------------------------------------------------------- /public/og.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/public/og.jpg -------------------------------------------------------------------------------- /public/hero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/public/hero.png -------------------------------------------------------------------------------- /public/og-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/public/og-bg.jpg -------------------------------------------------------------------------------- /public/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/public/banner.png -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | github: [ismoilovdevml] 3 | -------------------------------------------------------------------------------- /pages/tutorials/_meta.en-UZ.json: -------------------------------------------------------------------------------- 1 | { 2 | "all": "Hammasi", 3 | "developing": "DevOps" 4 | } 5 | -------------------------------------------------------------------------------- /public/dark/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/public/dark/favicon.ico -------------------------------------------------------------------------------- /public/light/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/public/light/favicon.ico -------------------------------------------------------------------------------- /assets/contributing/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/assets/contributing/1.png -------------------------------------------------------------------------------- /assets/contributing/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/assets/contributing/2.png -------------------------------------------------------------------------------- /assets/contributing/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/assets/contributing/3.png -------------------------------------------------------------------------------- /assets/contributing/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/assets/contributing/4.png -------------------------------------------------------------------------------- /assets/contributing/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/assets/contributing/5.png -------------------------------------------------------------------------------- /assets/contributing/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/assets/contributing/6.png -------------------------------------------------------------------------------- /assets/contributing/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/assets/contributing/7.png -------------------------------------------------------------------------------- /public/dark/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/public/dark/favicon-16x16.png -------------------------------------------------------------------------------- /public/dark/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/public/dark/favicon-32x32.png -------------------------------------------------------------------------------- /assets/contributing/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/assets/contributing/banner.png -------------------------------------------------------------------------------- /public/light/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/public/light/favicon-16x16.png -------------------------------------------------------------------------------- /public/light/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/public/light/favicon-32x32.png -------------------------------------------------------------------------------- /public/dark/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/public/dark/apple-touch-icon.png -------------------------------------------------------------------------------- /public/light/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/public/light/apple-touch-icon.png -------------------------------------------------------------------------------- /hooks/index.ts: -------------------------------------------------------------------------------- 1 | export { useIsMounted } from './useIsMounted'; 2 | export { useLocalStorage } from './useLocalStorage'; 3 | -------------------------------------------------------------------------------- /components/core/index.ts: -------------------------------------------------------------------------------- 1 | export { LogoType } from './LogoType'; 2 | export { SyncedTab, SyncedTabs } from './SyncedTabs'; 3 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /public/dark/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/public/dark/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/dark/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/public/dark/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/light/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/public/light/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/light/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devopsuzb/book/HEAD/public/light/android-chrome-512x512.png -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | auto-install-peers=true 3 | strict-peer-dependencies=false 4 | resolution-mode=highest 5 | prefer-workspace-packages=true 6 | node-linker=hoisted 7 | -------------------------------------------------------------------------------- /pages/500.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | showFooter: false 3 | --- 4 | import { ServerSideErrorPage } from 'nextra-theme-docs'; 5 | 6 |

500 - Serverda Xatolik

7 | 8 | 9 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "arrowParens": "always", 3 | "endOfLine": "lf", 4 | "printWidth": 80, 5 | "semi": true, 6 | "singleQuote": true, 7 | "tabWidth": 2, 8 | "trailingComma": "all" 9 | } 10 | -------------------------------------------------------------------------------- /pages/404.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | showFooter: false 3 | --- 4 | import { NotFoundPage } from 'nextra-theme-docs'; 5 | 6 |

404 - Siz bu yerlarda nimalar qilib yuribsiz?))

7 | 8 | 9 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | darkMode: 'class', 3 | content: [ 4 | './pages/**/*.{js,ts,jsx,tsx,md,mdx}', 5 | './components/**/*.{js,ts,jsx,tsx,md,mdx}', 6 | './theme.config.js', 7 | ], 8 | }; 9 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /hooks/useIsMounted.ts: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export function useIsMounted() { 4 | const [mounted, setMounted] = React.useState(false); 5 | 6 | React.useEffect(() => setMounted(true), []); 7 | 8 | return mounted; 9 | } 10 | -------------------------------------------------------------------------------- /public/dark/site.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} -------------------------------------------------------------------------------- /public/light/site.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} -------------------------------------------------------------------------------- /public/dark/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #da532c 7 | 8 | 9 | -------------------------------------------------------------------------------- /public/light/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #00a300 7 | 8 | 9 | -------------------------------------------------------------------------------- /pages/guides/_meta.en-UZ.json: -------------------------------------------------------------------------------- 1 | { 2 | "overview": "Asosiy", 3 | "ci-cd": "▶️ CI/CD", 4 | "konteyner": "▶️ Konteynerlash", 5 | "k8s": "▶️ Kubernetes(k8s)", 6 | "database": "▶️ Database", 7 | "web-server": "▶️ Web Serverlar", 8 | "cloud": "▶️ Cloud", 9 | "monitoring": "▶️ Monitoring" 10 | } 11 | -------------------------------------------------------------------------------- /pages/api/like.ts: -------------------------------------------------------------------------------- 1 | import { sql } from '@vercel/postgres'; 2 | 3 | import { factory } from './logic'; 4 | 5 | export default factory( 6 | 'likes', 7 | (path) => sql`INSERT INTO posts (path, likes) VALUES (${path}, 1)`, 8 | (path, post) => 9 | sql`UPDATE posts SET likes = ${post.likes} WHERE path = ${path}`, 10 | ); 11 | -------------------------------------------------------------------------------- /pages/api/view.ts: -------------------------------------------------------------------------------- 1 | import { sql } from '@vercel/postgres'; 2 | 3 | import { factory } from './logic'; 4 | 5 | export default factory( 6 | 'views', 7 | (path) => sql`INSERT INTO posts (path, views) VALUES (${path}, 1)`, 8 | (path, post) => 9 | sql`UPDATE posts SET views = ${post.views} WHERE path = ${path}`, 10 | ); 11 | -------------------------------------------------------------------------------- /pages/api/dislike.ts: -------------------------------------------------------------------------------- 1 | import { sql } from '@vercel/postgres'; 2 | 3 | import { factory } from './logic'; 4 | 5 | export default factory( 6 | 'dislikes', 7 | (path) => sql`INSERT INTO posts (path, dislikes) VALUES (${path}, 1)`, 8 | (path, post) => 9 | sql`UPDATE posts SET dislikes = ${post.dislikes} WHERE path = ${path}`, 10 | ); 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Nodejs and package manager 2 | *.local 3 | .eslintcache 4 | .next 5 | .pnpm-debug.log* 6 | cache 7 | coverage 8 | dist 9 | node_modules 10 | tsconfig.tsbuildinfo 11 | logs 12 | *.log 13 | pnpm-debug.log* 14 | build/ 15 | # local env files 16 | .env 17 | .direnv 18 | 19 | # Nix 20 | /result 21 | 22 | # Editor directories and files 23 | .idea 24 | .DS_Store 25 | *.suo 26 | *.ntvs* 27 | *.njsproj 28 | *.sln 29 | *.sw? 30 | -------------------------------------------------------------------------------- /components/core/Tutorial/StructuredData.tsx: -------------------------------------------------------------------------------- 1 | import Head from 'next/head'; 2 | 3 | import { JsonLd } from 'types/tutorial'; 4 | 5 | export default function StructuredData({ data }: { data: JsonLd }) { 6 | return ( 7 | 8 | 149 | 158 | 159 | ); 160 | }, 161 | sidebar: { 162 | defaultMenuCollapseLevel: 1, 163 | titleComponent: ({ title, type }) => 164 | type === 'separator' ? ( 165 |
166 | 167 | {title} 168 |
169 | ) : ( 170 | <>{title} 171 | ), 172 | }, 173 | editLink: { 174 | text() { 175 | // eslint-disable-next-line react-hooks/rules-of-hooks 176 | const { locale } = useRouter(); 177 | return ( 178 | <> 179 | { 180 | EDIT_LINK_WITH_TRANSLATIONS[ 181 | (locale as keyof typeof EDIT_LINK_WITH_TRANSLATIONS) ?? 'en-UZ' 182 | ] 183 | } 184 | 185 | ); 186 | }, 187 | }, 188 | i18n: [{ locale: 'en-UZ', text: 'O\'zbek' }], 189 | gitTimestamp: ({ timestamp }) => ( 190 | <>Last updated on {timestamp.toLocaleDateString()} 191 | ), 192 | components: { 193 | img: props => 194 | }, 195 | main({ children }) { 196 | // eslint-disable-next-line react-hooks/rules-of-hooks 197 | const { frontMatter: { showFooter } } = useConfig(); 198 | 199 | return <> 200 | {children} 201 | {showFooter != false && } 202 | 203 | } 204 | }; 205 | 206 | export default config; -------------------------------------------------------------------------------- /public/logos/logo-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 21 | 26 | 31 | 34 | 37 | 39 | 41 | 44 | 52 | 56 | 60 | 67 | 75 | 84 | 87 | 95 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /public/logos/logo-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 21 | 26 | 31 | 34 | 37 | 39 | 41 | 44 | 52 | 56 | 60 | 67 | 75 | 84 | 87 | 95 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /pages/guides/ci-cd/dotnet-deployment.en-UZ.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | image: https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/banner.png 3 | description: ".NET Core Deployment: Gitlab CI and Github Actions" 4 | --- 5 | 6 | import { Callout } from "nextra-theme-docs"; 7 | 8 | # .NET Core Deployment: Gitlab CI and Github Actions 9 | 10 | ![dotnet-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/dotnet-deployment/banner.png) 11 | 12 | 13 | ## Kirish 14 | 15 | Ushbu qo'llanmanda **.NET Core** applicationlarini **Gitlab CI** va **Github Actions** yordamida avtomatlashtirilgan holda qanday deploy qilishni ko'rib chiqamiz. Bu qo'llanma **DevOps Engineer**lar va **.NET Developer**lar uchun zarur bo'lgan bilim va ko'nikmalar qamrab oladi. Qo'llanma davomida biz **.NET** loyihalarini qanday tuzlishini, qanday konfiguratsiya qilkishni va secretlar bilan ishlashni ko'rib chiqamiz. 16 | 17 | Shuningdek, biz **Dockerfile** yozishni o'rganamiz va uni samarali ishlashi uchun optimallashtiramiz. Docker asosida konteynerlash jarayonlarini o'zlashtirgach, **GitLab CI/CD** va **GitHub Actions** yordamida CI/CD pipeline'larini sozlash va avtomatlashtirish usullarini ko'rib chiqamiz. 18 | 19 | Ushbu qo'llanma orqali siz **.NET** applicationlari uchun CI/CD jarayonlarini muvaffaqiyatli amalga oshirish bo'yicha amaliy yondashuvga ega bo'lasiz va real loyihalarda bu usullarni qo'llash imkoniyatiga ega bo'lasiz. 20 | 21 | 22 | Ushbu amaliyotda quyidagi **.NET** application kodlaridan foydalanamiz **Gitlab->** [**gitlab.com/ismoilovdev/productapi**](https://gitlab.com/ismoilovdev/productapi), **Github->** [**github.com/devops-journey-uz/productapi**](https://gitlab.com/ismoilovdev/productapi) 23 | 24 | 25 | **.NET** platformasi Microsoft tomonidan ishlab chiqilgan bo'lib, birinchi versiyasi 2002-yilda **.NET Framework** nomi bilan taqdim etilgan. Dastlab, u asosan Windows muhitida ishlash uchun mo'ljallangan edi, vaqt o'tishi bilan, ayniqsa, cloud computing va microservices arxitekturasining rivojlanishi bilan, Microsoft kross-platforma va open-source bo'lgan yangi tizimni yaratishga qaror qildi. Shu tariqa, 2016-yilda **.NET Core 1.0** taqdim etildi. U modullashtirilgan, high-performance va container-friendly texnologiya hisoblanadi. Keyinchalik, **.NET 5** dan boshlab, Microsoft barcha **.NET** versiyalarini birlashgan .NET ekotizimiga aylantirdi va .NET Core nomi .NET deb o'zgartirildi. .NET platformasining yangi versiyalari har yili, odatda noyabr oyida chiqariladi. .NET'ning eng so'nggi versiyasi 2024-yil noyabr oyida chiqarilgan **.NET 9**, joriy **LTS** versiyasi esa **.NET 8** bo'lib, 2023-yil noyabr oyida chiqarilgan. 26 | 27 | **.NET Core** **.NET Framework** ning davomchisi bo'lib, u monolit arxitektura o'rniga mikroservis va cloud-native applicationlarni yaratishga moslashtirilgan. **.NET Framework** faqatgina Windows uchun mo'ljallangan bo'lsa, **.NET Core** platformadan mustaqil bo'lib, **Docker, Kubernetes** va **cloud infratuzilma**lariga moslashgan. 28 | 29 | .NET Core dasturlarining ishlash muhiti quyidagilardan iborat: 30 | 31 | **SDK** (**S**oftware **D**evelopment **K**it) - dasturlarni ishlab chiqish va build qilish uchun kerakli vositalar. 32 | 33 | **Runtime** - kompilyatsiya qilingan ilovani(applicationni) ishga tushirish uchun zaruriy komponentlar. 34 | 35 | **NuGet Package Manager** - .NET Core dasturlarini yaratish va ulash uchun kerakli paketlar. 36 | 37 | .NET Core cross-platform bo'lib, uni Windows, Linux va MacOS da ishlatish mumkin. Linux va MacOS muhitida u bash terminal yoki Docker konteynerlar orqali ishlab chiqilishi mumkin, bu esa uni DevOps va cloud-native yechimlar uchun ideal variantga aylantiradi. 38 | 39 | 40 | ## Loyihani tushunish 41 | 42 | .NET loyihasini muvaffaqiyatli deploy qilish uchun dastlab uning tuzilishini, ishlash prinsipini va muhim konfiguratsiyalarini to'liq tushunish lozim. 43 | .NET loyihasi asosan quyidagi tarkibiy qismlardan iborat: 44 | 45 | Masalan bizning loyihamiz tuzulishi(**.NET 8**): 46 | ```bash 47 | productapi/ 48 | ├── appsettings.json 49 | ├── Dockerfile 50 | ├── ProductApi.csproj 51 | ├── Program.cs 52 | ├── Readme.md 53 | ├── Controllers 54 | │   └── ProductController.cs 55 | ├── Data 56 | │   └── AppDbContext.cs 57 | ├── Migrations 58 | │   ├── 20250212065937_InitialCreate.cs 59 | │   ├── 20250212065937_InitialCreate.Designer.cs 60 | │   └── AppDbContextModelSnapshot.cs 61 | ├── Models 62 | │   └── Product.cs 63 | ├── Properties 64 | │   └── launchSettings.json 65 | └── Services 66 | ├── IProductService.cs 67 | └── ProductService.cs 68 | ``` 69 | Bu loyiha **.NET 8** versiyasida yaratilgan va **Entity Framework Core** yordamida **PostgreSQL** bazasiga ulanadi. Loyiha productlarni manage qilish uchun yaratilgan oddiy **CRUD API** hisoblanadi. Testlash uchun Swaaqer yordamida **Swagger UI** qo'llanilgan. 70 | 71 | **.NET Core** loyihalari odatda quyidagi asosiy papkalar va fayllardan tashkil topgan bo'ladi: 72 | 73 | * `Controllers/` - API yoki MVC ilovalarida so'rovlarni(requestlarni) boshqaruvchi classlar joylashadi. 74 | 75 | * `Models/` - ma'lumotlar strukturasi (model) classlari. 76 | 77 | * `Data/` - kontekst fayli (masalan, `AppDbContext.cs`) va ma'lumotlar bazasi bilan bog'liq logika. 78 | 79 | * `Services/` - biznes logika (servis layerlari). 80 | 81 | * `Migrations/` - Entity Framework orqali generatsiya qilingan migratsiyalar. 82 | 83 | **Program.cs** va **Startup.cs** (yoki **builder.Services** sintaksisi) applicationing asosiy ishga tushirish nuqtasi va konfiguratsiyasi. `appsettings.json`, `appsettings.Development.json` - bu konfiguratsiya fayllari hisoblanadi. 84 | 85 | **ASP.NET Core** quyidagi application turlarini yaratishga imkon beradi: 86 | 87 | * Web API - RESTful API yaratish uchun. 88 | 89 | * MVC (Model-View-Controller) - klassik web-ilovalar uchun. 90 | 91 | * Console Applications - backround servicelar, servislar yoki oddiy dasturlar uchun. 92 | 93 | Konfiguratsiya fayllari orasida eng muhimlaridan biri `appsettings.json` bo'lib, unda connection string, log level, custom konfiguratsiyalar saqlanadi. Har bir environment uchun alohida fayl (appsettings.Development.json, appsettings.Production.json) bo'lishi mumkin. 94 | 95 | Dependency Injection (DI) .NET Core da by-default qo'llab-quvvatlanadi. `Startup.cs` yoki `Program.cs` da `services.AddTransient`, `AddScoped`, `AddSingleton` orqali servislar DI konteynerga qo'shiladi va kontrollerlarda konstruktor orqali chaqiriladi. 96 | 97 | Deployment vaqtida application turli envikronmentlarda ishlashi mumkin (**Development, Staging, Production**), shuning uchun konfiguratsiyalarni `appsettings.{Environment}.json` fayllari orqali ajratib borish tavsiya qilinadi. 98 | 99 | Connection string larni `appsettings.json` yoki Environment Variables orqali boshqarish mumkin. Maxfiy ma'lumotlar (masalan, parollar) Secret Manager, Azure Key Vault, Hashicorp Vault yoki environment variable orqali xavfsiz saqlanishi kerak. 100 | 101 | Logging uchun .NET Core ichki **ILogger** interfeysini qo'llab-quvvatlaydi. Qo'shimcha logging librarylari sifatida **Serilog**, **NLog**, yoki **Application Insights** ishlatilishi mumkin. -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # **DevOps Journey**-ga contributorlik qilish 2 | 3 | Loyihamizga hissa qo'shganingiz uchun tashakkur! Muammolar haqida xabar berish, xatolarni tuzatish yoki yangi funksiyalarni taklif qilish bo'ladimi, biz barchaning hissalarini mamnuniyat bilan qabul qilamiz. To'g'ri hamkorlik qilish uchun quyidagi ko'rsatmalarni ko'rib chiqing. 4 | 5 | 6 | ## Contirbutorlik qilish usullari 7 | * **Xatolar haqida xabar bering(Report Bugs):** Agar biror xato yoki kutilmagan xatti-harakatlarga duch kelsangiz, [github issuesda](https://github.com/ismoilovdevml/devops-journey/issues) issue oching. 8 | * **Xususiyat so'rovlarini yuborish(Feature Request):** Yangi funksiya haqida ajoyib fikringiz bormi? Muammo issue va uni batafsil tavsiflang. 9 | * **Kodga contributorlik qilish:** Kodga contirbutorlikni qadrlaymiz! Ko'rsatmalarimizga amal qilgan holda repositoriyani fork qiling, o'zgartirishlaringizni kiriting va pull requestni yuboring. 10 | * **Hujjatlar:** Matndagi xatolarini tuzatish, misollar qo'shish yoki tushuntirishlarni yaxshilash orqali hujjatlarimizni yaxshilashga yordam bering. 11 | * **Pull Requestlarni ko'rib chiqish:** Pull Requestlarni ko'rib chiqish qimmatlidir. Mavjud pull requestlarni izohlang, sinab ko'ring va yaxshilanishlarni taklif qiling. 12 | 13 | 14 | ### Yangi qo'llanma yoki maqola qo'shish bo'yicha yo'riqnoma 15 | 16 | **1** Github Repositoriyani fork qilib oling va o'zingizni githubingizdan uni `git clone` qilib oling. 17 | 18 | ---- 19 | > Eslatma: Ushbu platforma **Nextra** asosida qurilgan. Nextra 20 | > qo'llanmasi o'qish orqali ham platforma bilan ishlashni 21 | > tushinushingiz mumkin 22 | ---- 23 | 24 | **2** Kodni klon qilib olganingizdan keyin uni birorta IDEA-da ochib oling misol uchun Visual Studio Code(VS Code). `yarn` yoki `pnpm` orqali paketlarni o'rnating va loyihani ishga tushiring 25 | 26 | ```bash 27 | pnpm i 28 | pnpm next dev 29 | ``` 30 | Loyiha muvafqqiytali ishga tushganidan keyin ishni boshlasak bo'ladi. 31 | 32 | ---- 33 | 34 | **3** **Ma'lum bir bo'limlarga mavzular qo'shish** 35 | 36 | Quyidagi bo'limlarga(CI/CD, Konteynerlash,Kubernetes(k8s),Database, Web Serverlar) mavzu qo'shish uchun kodda `/pages/guides` jildida ishlaymiz. 37 | 38 | ![assets](assets/contributing/1.png) 39 | 40 | --- 41 | ![assets](assets/contributing/2.png) 42 | 43 | --- 44 | Ushbu Bo'limlarning kodda ko'rinishi va manzili `pages/guides` 45 | 46 | ![assets](assets/contributing/3.png) 47 | 48 | ------ 49 | 50 | Bo'limlarning koddagi manzillari 51 | 52 | | Saytda Ko'rinishi | Kodda ko'rinishi | 53 | | ------------------- | ------------------------- | 54 | | CI-CD | `pages/guides/ci-cd` | 55 | | Konteynerlash | `pages/guides/konteyner` | 56 | | Kubernetes(k8s) | `pages/guides/k8s` | 57 | | Database | `pages/guides/database` | 58 | | Web Serverlar | `pages/guides/web-server` | 59 | 60 | Har bir bo'lim ichida uning mavzulari va `_meta.en-US.json` fayl bor. 61 | Misol uchun Database(`pages/guides/database`) bo'limi mavzulari. 62 | 63 | ![assets](assets/contributing/4.png) 64 | 65 | Hamma mavzular `_meta.en-US.json` fayliga kiritiladi yangi mavzu qo'shmoqchi bo'lsangiz ham shu faylga yangiu mavzuni qo'shishingiz kerak. 66 | 67 | Misol uchun Kubernetes(k8s)(`pages/guides/k8s`)-ning `_meta.en-US.json` konfigratsiya fayli. 68 | 69 | ```json 70 | { 71 | "k8s-kirish": { 72 | "title": "Kubernetesga Kirish", 73 | "icon": "▶️", 74 | "description": "Kubernetesga ilk qadamlar", 75 | "href": "/guides/k8s/k8s-kirish" 76 | }, 77 | "minikube-wordpress": { 78 | "title": "Kubernetesda Wordpress deploy qilish", 79 | "icon": "▶️", 80 | "description": "Minkubedan foydalanib wordpress ko'tarish", 81 | "href": "/guides/k8s/minikube-wordpress" 82 | }, 83 | "minikube": { 84 | "title": "Minkube", 85 | "icon": "▶️", 86 | "description": "Minkube o'rnatish va sozlash", 87 | "href": "/guides/k8s/minikube" 88 | }, 89 | "minikube-multi-node": { 90 | "title": "Multi-Node Clusterdan foydalanish", 91 | "icon": "▶️", 92 | "description": "Minkubeda Multi-Node Clusterdan foydalanish", 93 | "href": "/guides/k8s/minikube-multi-node" 94 | }, 95 | "k8s-architecture": { 96 | "title": "Kubernetes Arxitekturasi", 97 | "icon": "▶️", 98 | "description": "Kubernetes tarkibiy qismi", 99 | "href": "/guides/k8s/k8s-architecture" 100 | }, 101 | "k8s-objects": { 102 | "title": "Kubernetes Obyektlari", 103 | "icon": "▶️", 104 | "description": "k8s native obyektlari", 105 | "href": "/guides/k8s/k8s-objects" 106 | } 107 | } 108 | ``` 109 | 110 | `_meta.en-US.json` konfiguratsiya faylini tushinish uchun keling **Kubernetesga Kirish** mavzusi konfigratsiyani ko'rib chiqamiz. 111 | 112 | ![assets](assets/contributing/5.png) 113 | 114 | Rasmda ushbu mavzu uchun `k8s-kirish.en-US.mdx` fayli ochilgan siz ham yangi mavzularni shunday ochishingiz kerak. 115 | 116 | ```json 117 | "k8s-kirish": { 118 | "title": "Kubernetesga Kirish", 119 | "icon": "▶️", 120 | "description": "Kubernetesga ilk qadamlar", 121 | "href": "/guides/k8s/k8s-kirish" 122 | } 123 | ``` 124 | 125 | `k8s-kirish` bu fayl nomi hisoblanaadi va bu yerga fayl nomi to'gri kiritilishi kerak. `"title"` esa bu mavzuning sarlavhasi hisoblanadi. `"description"` bu mavzuning qisqachi izohi. `"href"` mavzu joylashgan yo'lni tasvirlaydi. 126 | 127 | ## Sahifalarga ishlov berish 128 | 129 | Hoizr biz sahifalarga ishlov berishni ko'rib chiqamiz. Avval boshdan aytib o'tilganiddek loyiha Nextra ustiga qurilgani uchun bu qismni nextrani rasmiy qo'llanmalaridan o'rganib olishingiz mumkin juda yaxshi tushintirilgan va yoki shu paytgacha yozilgan ishlangan sahifalardan namunlar ko'rib o'rganishingiz mumkin. 130 | 131 | 132 | * [Markdown MDX bilan ishlash](https://nextra.site/docs/guide/markdown) 133 | 134 | * [Kod parchalarini yozish](https://nextra.site/docs/guide/syntax-highlighting) 135 | 136 | * [Linklar bilan ishlash](https://nextra.site/docs/guide/link) 137 | 138 | * [Rasmlar bilan ishlash](https://nextra.site/docs/guide/image) 139 | 140 | * [Jadvallar chizish](https://nextra.site/docs/guide/advanced/table) 141 | 142 | * [Callout Componentlari bilan ishlash](https://nextra.site/docs/guide/built-ins/callout) 143 | 144 | * [Tablar bilan ishlash](https://nextra.site/docs/guide/built-ins/tabs) 145 | 146 | * [Cardlar yasash](https://nextra.site/docs/guide/built-ins/cards) 147 | 148 | * [Bosqich style bilan ishlash](https://nextra.site/docs/guide/built-ins/steps) 149 | 150 | ### Maqollar yozish 151 | 152 | [**Devops Journey**ga maqolalar](https://devops-journey.uz/tutorials/all) yozish uchun alohida bo'lim ajaratilgan. 153 | 154 | 155 | ![assets](assets/contributing/6.png) 156 | 157 | ---- 158 | 159 | Ushbu bo'lim kodda `pages/tutorials/article` qismmida joylashgan. 160 | 161 | ![assets](assets/contributing/7.png) 162 | 163 | Ushbu qismda ham tepada aytib o'tilganidek `_meta.en-US.json` fayli orqali boshqariladi va mavzularni qo'shish uni yozish ham tepada aytib o'tganimizdek bir hil hisoblanadi. 164 | 165 | ---- 166 | 167 | 168 | ### Yordam olish 169 | Agar sizga yordam kerak bo'lsa yoki savollaringiz bo'lsa, ismoilovdev@gmail.com emailiga yoki [telegramdagi communityga](https://t.me/devopsuzb) murojaat qiling. 170 | 171 | > Biz sizning hissalaringizni qadrlaymiz va sizning ishtirokingizni kutamiz! 172 | -------------------------------------------------------------------------------- /pages/guides/konteyner/dockerga-kirish.en-UZ.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | image: https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/container/docker.jpg 3 | description: "Dockerga Kirish" 4 | --- 5 | 6 | import { Callout } from "nextra-theme-docs"; 7 | 8 | # Dockerga Kirish 9 | 10 | ![docker](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/container/docker.jpg) 11 | 12 | ## Docker nima? 13 | 14 | Docker - bu dasturni ishga tushirish uchun zarur bo'lgan barcha narsalarni (kod, kutubxonalar(library), runtime, tizim sozlamalari(system setting) va depencylar) o'z ichiga olgan yengil(lightweight), stand-alone(mustaqil) paketlarni yaratish, deploy qilish va boshqarish imkonini beruvchi tooldir. Bunday paketlar konteynerlar(container) deb ataladi. 15 | 16 | Har bir konteyner alohida kernel(yadro) va operatsion tizimga bog'liq bo'lmasdan, o'z protsessor(CPU), xotira(memory), block I/O, va tarmoq resurslari bilan deploy qilingan. Docker va virtual mashinalarni solishtirish eng oson bo'lishi mumkin bo'lsa-da, ular resurslarni almashish yoki ajratish usullari bilan farqlanadi. 17 | 18 | Docker - konteynerlar deb ataladigan paketlarda dasturiy ta'minotni etkazib berish uchun operatsion tizim darajasidagi virtualizatsiyadan foydalanadigan service sifatidagi platformalar(platforms as a service **(PaaS)**) mahsulotlari. Konteynerlar bir-biridan ajratilgan(izolatsiya qilingan) va o'zlarining dasturiy ta'minoti, kutubxonalari va konfiguratsiya fayllarini birlashtiradi; ular bir-biri bilan aniq belgilangan kanallar orqali muloqot qilishlari mumkin. Barcha konteynerlar bitta operatsion tizim kerneli tomonidan boshqariladi va shuning uchun virtual mashinaga qaraganda kamroq resurslardan foydalanadi. 19 | 20 | ## Docker imagelari 21 | 22 | Bu bir nechta layerlardan tashkil topgan fayl bo'lib, Docker konteynerida kodni bajarish(execute) uchun foydalaniladi. Ular docker konteynerlarini yaratish uchun ishlatiladigan ko'rsatmalar to'plamidir. **Docker Image** - bu dasturni ishga tushirish uchun zarur bo'lgan barcha narsalarni o'z ichiga olgan executable packet. Ushbu image konteyner qanday yaratilishi kerakligi haqida ma'lumot beradi, qaysi dasturiy komponentlar va qanday ishlashini aniqlaydi. Docker Container - bu dasturni ishga tushirish uchun zarur bo'lgan barcha depencylar(bog'liqliklar) bilan dastur kodini birlashtirgan virtual muhit. 23 | 24 | Har bir Docker konteyneri imagedan yaratilgan. Imagelarni Docker registridan (masalan, rasmiy Docker Hub) tortib(pull) olasiz va ulardan konteynerlar yaratish uchun foydalanasiz. Bitta image ko'plab konteynerlarni yaratishi mumkin. Masalan, veb-server konteynerini o'rnatish uchun eng so'nggi(latest) nginx imagesidan foydalanishingiz mumkin. 25 | 26 | ## Docker Konteynerlar 27 | 28 | Docker konteyneri imagening runtime instancedir. Dasturlarga ilovalarni(application) kutubxonalar(library) va boshqa bog'liqliklar(depencylar) kabi barcha kerakli qismlar bilan paketlash imkonini beradi. Konteynerlar ilova uchun zarur bo'lgan to'liq to'plamni o'z ichiga oladi, shuning uchun dastur izolyatsiya qilingan tarzda ishga tushirilishi mumkin. Misol uchun, deylik, NGINX SERVER bilan Ubuntu OS image mavjud bo'lsa, bu image docker run buyrug'i bilan ishga tushirilganda, konteyner yaratiladi va NGINX SERVER Ubuntu OS da ishlaydi. 29 | 30 | ## Dockerfilelar 31 | Dockerfile **DSL (Domain Specific Language)** dan foydalanadi va Docker imageni yaratish bo'yicha ko'rsatmalarni(instruction) o'z ichiga oladi. Dockerfile imageni tezda yaratish jarayonlarini belgilaydi. Ilovangizni yaratishda siz Docker faylini tartibda yaratishingiz kerak, chunki Docker dasturi barcha ko'rsatmalarni yuqoridan pastgacha bajaradi. 32 | 33 | Dockerfile - Bu matn hujjati bo'lib, u bajarilganda Docker imageni yig'ishga yordam beradigan kerakli buyruqlarni o'z ichiga oladi. Docker image Docker fayli yordamida yaratilgan. Dockerfile - bu imagening manba kodi. Dockerfile yozilgach, administrator fayl ichidagi buyruqlar asosida image yaratish uchun `docker build` buyrug'idan foydalanadi. Dockerfile ichidagi buyruqlar va ma'lumotlar izchil va barqaror joylashtirishni ta'minlash uchun maxsus dasturiy ta'minot versiyalari va bog'liqliklardan(dependency) foydalanish uchun sozlanishi mumkin. 34 | 35 | Dockerfile imagelarni yaratish uchun quyidagi buyruqlardan foydalaniladi: 36 | 37 | * `ADD` - fayllarni hostdagi manbadan belgilangan manzildagi konteynerning fayl tizimiga nusxalash. 38 | * `CMD` - konteyner ichida ma'lum bir buyruqni bajarish. 39 | * `ENTRYPOINT` - image bilan konteyner yaratilgan har safar foydalanish uchun standart dasturni o'rnatish. 40 | * `ENV` - environment o'zgaruvchilarini o'rnatish. 41 | * `EXPOSE` - konteyner va tashqi dunyo o'rtasida tarmoq ulanishini yoqish uchun ma'lum bir portni ko'rsatish. 42 | * `FROM` - build jarayonini boshlash uchun ishlatiladigan asosiy imageni aniqlang. 43 | * `MAINTAINER` - image yaratuvchining to'liq ismi va elektron pochta manzilini aniqlang. 44 | * `RUN` - Dockerfilelar uchun markaziy executing directive. 45 | * `USER` - konteynerni ishga tushiradigan UID (foydalanuvchi nomi) ni o'rnating. 46 | * `VOLUME` - konteynerdan host mashinasidagi jildga kirishni yoqish. 47 | * `WORKDIR` - CMD bilan belgilangan buyruq bajariladigan yo'lni(path) o'rnatish. 48 | 49 | Har bir buyruqni ishlatish shart emas. Quyida faqat `MAINTAINER`, `FROM` va `RUN` buyruqlaridan foydalangan holda ishlaydigan Dockerfile misoli keltirilgan: 50 | 51 | 52 | ```dockerfile filename="Dockerfile" /MAINTAINER/ /FROM/ /RUN/ 53 | MAINTAINER Samid Dastanbayev 54 | FROM ubuntu:latest 55 | RUN apt-get -y update && apt-get -y upgrade && apt-get install -y build-essential 56 | ``` 57 | 58 | ## Docker Hub 59 | 60 | Docker Hub - bu repositoriyalar servisi va u cloudga asoslangan service bo'lib, odamlar Docker konteyner imagelarini push qilishadi, shuningdek Docker konteyner imagelarini Docker Hub-dan istalgan vaqtda yoki istalgan joyda internet orqali olishadi. Umuman olganda, bu imagelarni topish va qayta ishlatishni osonlashtiradi. U Docker imagelarini saqlash va almashish mumkin bo'lgan private yoki public registr sifatida imagelaringizni push qilish kabi xususiyatlarni taqdim etadi 61 | 62 | Asosan DevOps jamoasi Docker Hub-dan foydalanadi. Bu open source tool va barcha operatsion tizimlar uchun bepul. Bu biz imagelarni saqlaydigan va kerak bo'lganda imagelarni pull qilib tortib oladigan xotiraga o'xshaydi. Biror kishi Docker Hub-dan imagelarni pull/push-ni xohlasa, u Docker haqida asosiy bilimga ega bo'lishi kerak. 63 | 64 | ## Docker Engine 65 | 66 | Konteynerlarni joylashtiradigan(deploy qiladigan) dastur **Docker Engine** deb ataladi. **Docker Engine** - bu client-serverga asoslangan dastur. Docker engine 3 ta asosiy komponentdan iborat: 67 | 68 | * **Server:** U Docker-da Docker imagelari, konteynerlari, tarmoqlari va volumelarini yaratish va boshqarish uchun javobgardir. Bu daemon process deb ataladi. 69 | * **REST API:** U ilovalarning Server bilan qanday ishlashi mumkinligini belgilaydi va unga nima qilishni buyuradi. 70 | * **Client** Client bu docker command-line interfeysi (CLI) bo'lib, u bizga docker buyruqlari yordamida Docker bilan o'zaro ishlash imkonini beradi. 71 | 72 | 73 | ![docker](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/container/3.webp) 74 | 75 | ## Docker Swarm 76 | 77 | Docker `Docker Swarm` deb nomlangan clusterni yaratish uchun serverlarni birlashtirishni osonlashtiradi. Swarm manageri yoki leaderini yaratganingizdan so'ng va leaderga nodelarni biriktirganingizdan so'ng, konteynerni deploy qilishni kengaytirishingiz mumkin. Leader kerakli holatni(stateni) saqlab qolish uchun vazifalarni(task) qo'shish yoki olib tashlash orqali clusterni avtomatik ravishda moslashtiradi. Node - bu Swarm-da ishtirok etadigan Docker enginening yagona nusxasi. Swarm menejeri Swarmga taqdim etilishi mumkin bo'lgan servicelarni ochish uchun kirish yukini muvozanatlashdan foydalanadi. 78 | -------------------------------------------------------------------------------- /pages/index.en-UZ.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'Asosiy' 3 | showFooter: false 4 | --- 5 | 6 | import Link from '@components/core/Link'; 7 | import { Tabs, Tab } from 'nextra-theme-docs'; 8 | import Card, { Cards } from '@components/core/Card'; 9 | 10 | # DevOpsni birga o'rganamiz 11 | 12 | DevOps bo'yicha bepul ta'lim platformasi bo'lgan **DevOps Journey** ga xush kelibsiz! Barcha mahorat darajalari uchun mo'ljallangan darslar, qo'llanmalar va dokumentatsiyalar to'plamimiz bilan tanishing. Kichik tizimlardan tortib katta tizimlargacha deploy qilishni biz bilan birga o'rganing, o'rganing va rivojlaning. Keling, texnologiya kelajagini shakllantiraylik. 13 | 14 | Hamjamiyat [Telegram 15 | community](https://t.me/devopsuzb) guruhiga qo'shilish 16 | 17 |
18 | 19 | 20 |
21 | DevOps **CI/CD** sayohatini biz bilang boshlang! 22 |
23 |
Qo'llanmalar
24 | 25 | 31 | 37 | 43 | 44 |
45 | Hammasini ko'rish -> 46 |
47 |
48 | 49 |
50 | DevOps sohasinig asosiy qismlaridan biri **Konteynerlash** bo'limiga chuqurroq shong'ing 51 |
52 |
Qo'llanmalar
53 | 54 | 60 | 66 | 72 | 73 |
74 | Hammasini ko'rish -> 75 |
76 |
77 | 78 |
79 | Katta loyihalarni samarali loyihalashtirishda **Kubernetesni(k8s)** qo'llash 80 |
81 |
Qo'llanmalar
82 | 83 | 89 | 95 | 101 | 102 |
103 | Hammasini ko'rish -> 104 |
105 |
106 | 107 |
108 | Ma'lumotlar bazasi bilan ishlash 109 |
110 |
Qo'llanmalar
111 | 112 | 118 | 124 | 130 | 131 |
132 | Hammasini ko'rish -> 133 |
134 |
135 | 136 |
137 | **Web Serverlar** bilan sayohatni boshlang! 138 |
139 |
Qo'llanmalar
140 | 141 | 147 | 153 | 159 | 160 |
161 | Hammasini ko'rish -> 162 |
163 |
164 | 165 |
166 | **Cloud** bilan sayohatni boshlang! 167 |
168 |
Qo'llanmalar
169 | 170 | 176 | 182 | 183 |
184 | Hammasini ko'rish -> 185 |
186 |
187 | 188 |
189 | **Monitoring** bilan kuzatuvni boshlang! 190 |
191 |
Qo'llanmalar
192 | 193 | 199 | 205 | 211 | 212 |
213 | Hammasini ko'rish -> 214 |
215 |
216 |
217 |
218 | -------------------------------------------------------------------------------- /pages/guides/cloud/aws-ecs-ecr-pipeline.en-UZ.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | image: https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/cloud/aws-ecs-ecr/banner.png 3 | description: "Amazon ECS + ECR + Code Pipeline deployment" 4 | --- 5 | 6 | import { Callout } from "nextra-theme-docs"; 7 | 8 | ## Amazon ECS + ECR + Code Pipeline deployment 9 | 10 | ![gitlab-ci](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/cloud/aws-ecs-ecr/banner.png) 11 | 12 | Assalom aleykum 13 | **Amazon Web Service**larini birga ishlatgan holatda web dasturimizni deploy qilishni birma-bir aytib ketish bilan tushuntirib bermoqchiman. Biz qiladigan birinchi ish bu o'zimiz ishlatayotgan servicelarni qanday ishlashi va nimalar bilan ishlay olishi haqida o'rganib chiqish. Quyidagi mavzuda biz **ECS, ECR, Code (Commit , Build, Pipeline)** service lariga chuqurroq kirishamiz. 14 | 15 | **ECS** — bu **E**lastic **C**ontainer **S**ervice bu service . Asosiy 3 qismdan iborat bo'lgan bu service sizdan ketma-ketlik talab qiladi. 16 | ![gitlab-ci](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/cloud/aws-ecs-ecr/1.webp) 17 | 18 | **1->** **Cluster** - 3 xildagi serverlarda ishlashi mumkin **1-EC2, 2-FARGATE, 3-EXTERNAL**(AWS da bo'lmagan boshqa server). Uni o'zining alohida deployment qismida **“Failure detection”** bor. Bu shunday ishlaydi — (**“Turned on, rollback on failures turned on for circuit breaker”**) va unga Service qo'shiladi. 19 | 20 | ![gitlab-ci](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/cloud/aws-ecs-ecr/2.webp) 21 | 22 | **2->** Vaziyat va talabga qarab tanlov qilishingiz mumkin. Service — bu ham Cluster kabi 3 xil server turida va **Capacity provider**da ishlaydi, buni service ochayotganda berib ketiladi va unga qanday Task ishlatishi tanlanadi. 23 | ![gitlab-ci](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/cloud/aws-ecs-ecr/3.webp) 24 | 25 | ![gitlab-ci](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/cloud/aws-ecs-ecr/4.webp) 26 | 27 | **3->** **Task Definition** yozib olinadi va unda siz qaysi va nechta container ishlatmoqchi bo'lganingiz, ularga serverdan qancha **CPU** va **Memory** berishingizni yozib qo'ysangiz bo'ladi.Albatta buni ham qaysi Infrastructurada ishlatishingiz berilishi kerak **(EC2, Fargate, External)**. Bunga keyinroq yana to'xtalib o'tamiz. Agar loyiha kichkina va oddiy bo'ladigan bo'lsa bularni default holatda qoldirsa ham bo'ladi . Agar unga miqdoriy cheklov bermoqchi bo'lsangiz siz u container qanday turdagi server (EC2 , Fargate, External) da turganini bilishingiz kerak. Agar Server CPUsi 4 bo'lib siz container ga 6 beradigan bo'lsangiz service qulashi ham mumkin 28 | 29 | ![gitlab-ci](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/cloud/aws-ecs-ecr/5.webp) 30 | 31 | Task definition ikki xil usul bilan ochsa bo'ladi, Json bu ancha mukammal va tez bo'ladigani. Agar yangi foydalanuvchi bo'lsangiz UI qismi bilan qilish tafsiya beriladi. 32 | 33 | Task definition da yozilgan struktura sizni servicengiz yoki cluster da ishlashida muammo chiqishi mumkin, qachonki siz ularni Infrastructurasini har xil qilgan bo'lsangiz. Nega deysizmi ? Chunki bu container va uni qanday qurilma (OS) da build qilishingizga qarab ishlaydi. 34 | 35 | Masalan siz bironta narsani Docker bilan Windowsda build qilib keyin uni Linux da yoki Mac **(ARM)** da run qilib ko'ring. AWS dagi EC2,FARGATE ham huddi shunday. Albatta EC2 ning ham **g** type — **Graviton** turi bor. bu sizdan ECS da build qiladigan containerni ECR dan keladigan container image ga qo'yiladigan sharti. Ko'p odamlar shu masalada xato qilishadi va tushunmaslikdan vaqt yo'qotiladi. Agar bu narsalarni ochishda bironta mayda detallariga tushunmasangiz **AWS workshop**ga kirib o'rganishingizni tafsiya beraman. 36 | 37 | 38 | **ECR** — bu **E**lastic **C**ontainer **R**egistry, ha bu AWS ga kirmasdan oldin ishlatgan Gitlab Container registery yoki alohida serverga qo'ygan Registery, unchalik ham qiyin emas, ishlash arxitekturasi deyarli bir xil. Nega aynan AWS dagi registery dan foydalanishimiz kerak o'zimizni tayyor registery turganda ? Bunga javob AWS o'zini servise larini ko'pini faqat o'zining servislari bilan ishlatishishni talab qiladi, Albatta hozir qo'shimcha xizmatlari ham qo'shilmoqda — Gitlab, Github, Bitbucketlar ham bor va ularga integratsiya qilsangiz ham bo'ladi. Lekin muammo sizning **SCM(SourceCodeManager)**ning verisyasi — Agar alohida kampaniya uchun ko'tarilgan bo'lsa, va unga har bir repositoriyani ulab chiqish vaqtingiz va ba'zida tushunarsiz muammolar chiqishi bilan bog'liq. Umuman olganda hohishingizga qarab. 39 | 40 | **Code Pipeline** — Bu service turi sizga 2 yoki unda ko'p service larni bir-biri bilan o'rtasida qandaydur doimiy ishni bajarish uchun ishlatiladi,buni Workshop yoki Docslar orqali kerak bo'lgan toollardan foydalansangiz bo'ladi. Bu mavzu uchun **ECR + ECS** . Pipeline structurasi oddiy lekin har bir Pipeline dagi Stage larni bir biriga bog'lovchi ya'ni Artifact lar ni tushunish kerak. Code Pipeline ochishda sizdan 4 ta qadam talab qilinadi. Birinchisi bu Source ya'ni Pipeline qandaydur vazifa bajarish uchun uning o'sha vazifada aytilgan qadamlarni qaysi narsa ustida bajarishi . Masalan siz kitoblaringizni taklash uchun shkaf kerak bo'lganidek. Keyingi Qadam Deploy, ya'ni loyihani ECS ga deploy qilish. Lekin bu 2 Stage bilan ish bitmaydi. Aytganimdek Code Pipeline har bitta qadam o'rtasida kirish va chiqish Artifact talab qiladi. 41 | 42 | **Artifact** — bu 2 xil ko'rinishda (**zip** va **archive**) bo'lib u o'zini ichida har bir qadamda ishlatilgan strukturani qandaydur fayl turida saqlab ketadi va u **S3 bucket**larni ichiga qo'yiladi. 43 | 44 | Har bir Code Pipeline dagi Stagedan Input va Output artifact berilishi talab qilinadi, bu aytganimdek bitta oldingi yoki boshlanish nuqtasi qanday va qaysi holatda amalga oshirishi talab qilinganidek.Bu holatda nima qilamiz ? 45 | 46 | Biz 2 ta Stage ya'ni qadam bilan biz hohlagan natijani ololmaymiz ? Agar ECR dagi imageni ECS ga deploy qilish kerak bo'lsa ) . 47 | Chunki ECS bizdan `.json` formatdagi struktura shakllanga fayl so'raydi, ECR dan chiqgan artifact ham `.json` lekin boshqa sxemadagi. Bir .json ichidagi sxema `{}` bundan qavslar bilan boshlangan bo'lsa bittasi `[]` bundan. Bunda biz nima qilamiz ? 48 | 49 | Stagelar soni ko'paytiramiz. Unga **Code Commit** hamda **CodeBuild** qo'shamiz. Shu bilan bizda 4 ta stage(qadam) paydo bo'ladi . Bu ikki service bizga `{ }` bu turdagi `.json` faylni `[ ]` bu turdagisiga convert qilishimiz uchun. hohlasangiz o'zingiz ishlatadigan CI/CD bilan S3 credentiallarini olib upload qiling, hohlasangiz Code Build orqali. 50 | 51 | Code Commit bu o'zida Fayllar saqlovchi bir repository, unda bizdagi `.yml` fayllar va boshqa hohlagan vazifa uchun fayllar qo'ysangiz bo'ladi va ularni build qilish uchun CodeBuilddan **buildproject** ochiladi. 52 | ![gitlab-ci](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/cloud/aws-ecs-ecr/6.webp) 53 | va bundan chiqgan natija S3 bucketga tashlanishini shu qadamlar orasida berib ketishingiz mumkin. 54 | ![gitlab-ci](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/cloud/aws-ecs-ecr/7.webp) 55 | 56 | Shu ketma-ketlikda biz **CodePipeline**dagi Build Stagega Commit stagedan chiqgan artifactni Deploy stagega artifact sifatida Builddan chiqaradigna artifactimizni beramiz, unga hohlagan nom berishingiz mumkin. 57 | ![gitlab-ci](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/cloud/aws-ecs-ecr/8.webp) 58 | 59 | Hozircha hammasi shu . Agar hamma qadamlar to'g'ri bajarilsa siz hohlagan natijani olasiz ) 60 | 61 | Bu mavzu haqida savol va takliflarni Telegram orqali ham fikr bildirsangiz bo'ladi [**LINK**](https://t.me/nurilloh_an) 62 | 63 | Hammaga rahmat ! 64 | 65 | ## Qo'shimcha 66 | 67 | Qo'shimcha Resurslar 68 | 69 | * [**Azure Virtual Network documentation**](https://learn.microsoft.com/en-us/azure/virtual-network/) 70 | * [**GCP Network sozlash**](https://devops-journey.uz/guides/cloud/gcp-network-sozlash) 71 | 72 | **Sana:** 2023.08.25(2023-yil 25-avgust) 73 | 74 | **Oxirgi yangilanish:** 2024.06.25(2024-yil 25-iyun) 75 | 76 | **Muallif: Nurilloh Anvarjonov** 77 | 78 | | [Telegram](https://t.me/nurilloh_anv) | [Github](https://github.com/nurilloh-an) | [LinkedIn](https://www.linkedin.com/in/nurilloh-anvarjonov/) | 79 | | - | - | - | 80 | 81 | -------------------------------------------------------------------------------- /pages/tutorials/article/ansible-terraform.en-UZ.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | image: https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/article/ansible-terraform/banner.png 3 | description: "Nega Ansible va Terraformni tanladim?" 4 | --- 5 | 6 | import { Callout } from "nextra-theme-docs"; 7 | 8 | # Nega Ansible va Terraformni tanladim? 9 | 10 | ![api-gateway-nima](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/article/ansible-terraform/banner.png) 11 | 12 | ## Kirish 13 | Serverlar ko'pligida har birini qo'lda boshqarish oson emas. Qolaversa, qo'lda konfiguratsiya qilish xatolarga olib kelishi, vaqtni behuda sarflashga va jarayonni murakkablashtirishga sabab bo'ladi. Men infratuzilmani avtomatlashtirish va boshqarish usullarini izlay boshlaganimda, Ansible va Terraform men uchun eng yaxshi tanlov bo'ldi. Bu maqolada nima uchun aynan Ansible va Terraformni tanlaganim, qanday foydalar keltirgani va qanday qilib GitOps orqali boshqarishni tashkil qilganimni tushuntirib beraman. 14 | 15 | Menda bir xil vazifalar ko'payib ketti va serverlar soni ham 100dan ortiq edi, 100dan ortiq serverga manual nimadir install qilib conf qilish juda ko'p vaqt va kuch talab qilardi va eng yomoni OS lar har xil va xatoliklar, anglashilmovchiliklari(nimadir esdan chiqib qoladi) bo'lishishi mumkin edi. 16 | 17 | Serverlar soni ortib borgan sari ularni boshqarish traditional(an'anaviy) yondashuv orqali amalga oshirib bo'lmas darajada qiyinlashadi. Har bir serverni qo'lda config qilish katta vaqt va kuch talab qiladi, bitta kichik xatolik esa butun tizimning ishlamay qolishiga olib kelishi mumkin. Men infra boshqaruvini avtomatlashtirishga qaror qilganimda, Ansible va Terraform yordamida buni kutilganidan tezroq va samaraliroq qilish mumkinligini tushundim. 18 | 19 | **Ansible 2012-yilda Michael DeHaan** tomonidan ishlab chiqilgan. Ansible dastlab **Michael DeHaan** tomonidan yaratilgan bo'lsa-da, keyinchalik **2015-yilda Red Hat** tomonidan sotib olindi. Hozirda Ansible **Red Hat** kompaniyasi va open-source community tomonidan rivojlantirilmoqda.Ansible dastlab IT infratuzilmasini boshqarishni soddalashtirish maqsadida ishlab chiqilgan. Uning maqsadi - serverlarni konfiguratsiya qilish, dasturlarni o'rnatish va ularni boshqarishni avtomatlashtirishdir. Ansible agent o'rnatishni talab qilmaydi va soddaligi bilan ajralib turadi. Uning asosiy maqsadi - xavfsiz, agentiz (agentless) va deklarativ (declarative) konfiguratsiya boshqaruvini ta'minlash. 20 | 21 | **Terraform 2014-yilda Mitchell Hashimoto** va **Armon Dadgar** tomonidan asos solingan **HashiCorp** kompaniyasi tomonidan ishlab chiqarilgan.Terraformni asosiy ishlab chiqaruvchi kompaniya bu **HashiCorp**. Shu bilan birga, community ham open-sourcega hissa qo'shadi. Terraformning asosiy maqsadi — infratuzilmani **"Infrastructure as Code" (IaC)** uslubida boshqarish va avtomatlashtirish. Terraform yordamida foydalanuvchilar cloudda (AWS, Azure, GCP va boshqalar) yoki on-premises infratuzilmasida resurslar yaratishi, boshqarishi va o'zgartirishi mumkin. Terraformning kuchli tomonlari - u turli platformalar bilan ishlay oladi, deklarativ yondashuvga ega va resurslarning holatini boshqarishga yordam beradi. 22 | 23 | 24 | **Ansible** menga infratuzilmani kod orqali boshqarish imkonini berdi. Bu deklarativ yondashuv orqali tizimni ishonchli tarzda boshqarish va qayta tiklash imkoniyatini yaratadi. Ansible yordamida bir necha serverda bir xil konfiguratsiyalarni sozlash va yangilash osonlashdi. Yana bir muhim jihat - Ansible orqali boshqarish GitOps printsiplari bilan mos tushadi. GitOps yondashuvida barcha konfiguratsiyalar gitda saqlanadi va har bir o'zgarish tasdiqlangandan so'ng avtomatik ravishda serverlarga qo'llanadi. Bu nafaqat jarayonlarni xavfsizroq va aniqroq qiladi, balki konfiguratsiyalardagi o'zgarishlarni kuzatish va audit qilishni osonlashtiradi. 25 | 26 | Nima uchun Ansible kerak degan savolga kichik misol keltiraman: Tassavvur qiling sizda 100dan ortiq server bor va ularning OS lari va versiylari har xil(Ubuntu20.04,Ubuntu 22.04,Debian 11, CentOS 7) sizning vazifangiz shu serverlarga misol uchun docker o'rnatib config qilib chiqishingiz kerak, endi tasavvur qiling buncha serverga docker o'rnatib conf qilish uchun qancha vaqt va kuch talab qiladi? bu holda multiple OS ga docker o'rnatadigan ansible playbook yozib barcha serverlaringizga birdaniga docker o'rnatib chiqishingiz mumkin. Ansible qulayligi agentlari yo'q serverlarga ssh orqali ulanib ishlaydi, Siz o'zingizning local desktop kompyuteringizda yoki birorta serverda ansible o'rnatib oldib siz boshqamoqchi bo'lgan serverlarga ssh connection uchun ssh config qilib chiqasiz. 27 | 28 | **Terraform** esa men uchun infratuzilmani boshqarishda eng kuchli vositalardan biri bo'ldi. Terraformning asosiy afzalligi - turli xil cloud platformalari va on-premise infratuzilmalar bilan ishlash imkoniyatidir. Biror infrani kod orqali ta'riflash va uni kerakli joyda bir marta bajarish orqali hamma joyda tatbiq qilish mumkin. Terraform bilan men infratuzilmani bir xil darajada boshqaraman, qayerda bo'lishidan qat'i nazar - AWS, GCP yoki on-premise serverlar. Shu orqali ko'p qirrali infratuzilmalarni boshqarishda katta samaradorlikka erishdim. 29 | 30 | Nima uchun Terraform kerak degan savolga kichik misol keltiraman: Tassavur qiling sizda misol uchun GCP,AWS yoki Azure cloud bor siz infratuzilmagiz arxitekturasi bo'yicha cloudda bir nechta vazifalarni bajarishingiz kerak masalan siz 50dan ortiq VM yaratishingiz Container Registry sozlashingiz VPC network, Firewall sozlashingiz kerak bo'lishi mumkin bu holda siz Cloud UI orqali har bittasi ustida ishlashni bir o'ylab ko'ringaa? bu holda siz Terraform script yozib ishga tuhsirsangiz hammasi avtomatlashtirilgan holda tez va samarali bajariladi siz vaqtdan va kuchdan yutasiz eng asosiysi asablaringizni asraysiz)). 31 | 32 | 33 | 34 | **Ansible** va **Terraform** infratuzilmani avtomatlashtirish uchun ishlatiladi, lekin ularning qo'llanilish sohalari biroz farqlanadi: 35 | 36 | * **Ansible->** Ko'pincha konfiguratsiyalarni boshqarish uchun ishlatiladi. Misol uchun, serverlarga dasturlar o'rnatish, ularni yangilash, config qilish kabi vazifalarni avtomatlashtirishda yordam beradi. Ansible agentga muhtoj emas va mavjud tizimlarga tez integratsiya qilinadi. 37 | 38 | * **Terraform->** Infratuzilmani yaratish va boshqarish uchun ishlatiladi. U **"Infrastructure as Code" (IaC)** tamoyili asosida cloud (AWS, GCP, Azure) yoki on-premises infratuzilmani yaratish va boshqarishni avtomatlashtiradi. Terraform resurslarni yaratish, o'zgartirish va o'chirishni deklarativ tarzda amalga oshiradi. 39 | 40 | 41 | Men o'z ishimda GitOps yondashuvini qo'llab, Ansible va Terraform yordamida infratuzilmani kod orqali boshqarishni amalga oshirdim. GitOps bilan ishlashim infra o'zgarishlarini tezroq va aniqlik bilan joriy qilish imkonini berdi. Yangi o'zgarishlar gitga kiritilib, avtomatik ravishda amalga oshiriladi, bu esa jarayonlarni sezilarli darajada tezlashtiradi va inson xatolarini kamaytiradi. Buning natijasida nafaqat vaqt tejadim, balki jarayonlar aniqroq bo'lib, infratuzilmani yangilash va kengaytirish tezligi oshdi. Ansible playbooklar va Terraform scriptlarni gitda(Gitlab, Github) saqlayman va ularni ishga tushirish uchun CI/CD(Gitlab CI, Github Actions, Jenkins) ishlataman bu mening ishimni yanada yaxshiladi va menda endi git history bor bu bilan qanday o'zgarishlar bo'lganini kuzatib turishim mumkin. 42 | 43 | 44 | Ansible va Terraformga o'tishimning asosiy sababi samaradorlik va xavfsizlikni oshirishdir. Bu vositalar yordamida ko'p vaqt va resurslarni tejash mumkin, shuningdek, infrastrukturani ishonchli boshqarish osonlashadi. Avtomatlashtirish bu zamon talabi, va bu o'tish menga texnologiyalar bilan bir qadam oldinga borish imkoniyatini berdi.GitOps yondashuvi bilan bu vositalarni birlashtirib ishlatish esa o'zgarishlarni kuzatish, infra boshqaruvini tezlashtirish va jarayonlarni yanada xavfsiz qilish imkonini berdi. 45 | 46 | 47 | Men hozirda Ansible va Terraform uchun skriptlar yozib, GitHub'da open-source(public) qilib joylamoqdaman. Maqsadim — infratuzilmani avtomatlashtirish jarayonini soddalashtirish va bu sohada community uchun ko'proq foyda yaratish. Bu yo'lda birga ishlashni va tajriba almashishni taklif qilaman. Biz birgalikda ishlash orqali infratuzilmani avtomatlashtirishni hammaga qulay va oson qila olamiz. Agar siz ham ushbu sohada ishlayotgan bo'lsangiz yoki yordam bera olsangiz, kelajakda yanada katta loyihalarni amalga oshirishda qo'l biriktiraylik. Fikr-mulohazalar va hamkorlikni juda qadrlayman. 48 | 49 | Agar yordam berishni istasangiz yoki takliflaringiz bo'lsa, menga aloqaga chiqishingiz mumkin. 50 | 51 | Github repositoriya -> **[github.com/ismoilovdevml/infra-as-code](https://github.com/ismoilovdevml/infra-as-code)** 52 | 53 | Telegram: **[ismoilovdev](https://t.me/ismoilovdev)** 54 | 55 | 56 | 57 | 58 | 59 | **Sana:** 2024.09.15(2024-yil 15-sentabr) 60 | 61 | **Oxirgi yangilanish:** 2024.10.04(2024-yil 4-oktabr) 62 | 63 | **Muallif: Otabek Ismoilov** 64 | 65 | | [Telegram](https://t.me/Otabek_Ismoilov) | [GitHub](https://github.com/ismoilovdevml) | [LinkedIn](https://www.linkedin.com/in/otabek-ismoilov/) | 66 | | - | - | - | 67 | 68 | --------------------------------------------------------------------------------