Ачааллж байна...
Таны API ажиллаж байна. Гэхдээ зөвхөн таны компьютер дээр.
Browser-ийн хаягийн мөрөнд 127.0.0.1:8000 гэж бичдэг. Бүлэг 1-ийн Хичээл 2-т сурсанчлан тэр хаяг нь "энэ компьютер өөрөө" гэсэн утгатай. Дэлхийн хэн ч таны API руу хандаж чадахгүй. Таны компьютерийг унтраахад API алга болно.
Deployment гэдэг нь түүнийг өөрчлөх ажил юм: программыг интернэтэд гаргаж, дэлхийн хаанаас ч хандах боломжтой болгох.
Энэ хичээл нь ойлголтын хичээл. Бид алхам алхмаар заавар өгөхгүй, гараар хийхгүй. Оронд нь deployment гэж юу болох, юу шаардах, ямар сонголтууд байдгийг ойлгоно.
Шударга тайлбар өгье, учир нь энэ нь зөв асуулт юм.
Нэгд, хэрэгслүүд байнга өөрчлөгддөг. Хостинг үйлчилгээнүүд интерфейсээ жил бүр өөрчилдөг, үнээ өөрчилдөг, зарим нь хаагддаг, шинэ нь гарч ирдэг. Хоёр жилийн өмнөх алхам алхмын заавар өнөөдөр ажиллахгүй байх магадлал өндөр. Ойлголт хуучирдаггүй; заавар хуучирдаг.
Хоёрт, сонголт олон. Арав орчим өөр арга байдаг бөгөөд тус бүр өөр алхамтай. Аль нэгийг сонгож заах нь бусдыг үл тоомсорлох болно.
Гуравт, энэ бол өөр мэргэжлийн хэсэг. Deployment нь ихэвчлэн DevOps гэсэн тусдаа салбарт хамаардаг. Мэргэжлийн орчинд backend хөгжүүлэгч код бичдэг, DevOps инженер түүнийг байрлуулдаг. Хоёулаа мэдэх нь сайн, гэхдээ хоёулаа өөр гүнзгий сэдэв.
Дөрөвт, та бэлэн байх ёстой. Хэрэв та deployment хийхээр шийдвэл — тухайн үеийн албан ёсны баримт бичгийг уншиж, дагах ёстой. Энэ хичээл нь тэр баримт бичгийг ойлгоход таныг бэлтгэнэ.
Курс 2-ын Бүлэг 15-т сурсан мета ур чадвар — албан ёсны баримт бичиг уншиж сурах — энд шууд хэрэгтэй болно.
Та гэртээ маш сайн хоол хийдэг. Найз нөхөддөө үзүүлээд бүгд магтдаг.
Одоо та зоогийн газар нээхээр шийдлээ. Юу өөрчлөгдөх вэ?
Байр хэрэгтэй. Гэрийн гал тогоо биш, олон нийтэд нээлттэй байр. Тэр байр байнга нээлттэй байх ёстой — та унтаж байхад ч зочид ирж болно.
Хаяг хэрэгтэй. Хүмүүс "Дулгуунгийн гэр" гэж хайхгүй; тодорхой гудамж, дугаар хэрэгтэй.
Найдвартай байдал хэрэгтэй. Гэртээ хоол түлэгдвэл дахин хийнэ. Зоогийн газарт гал тогоо ажиллахгүй бол зочид явна.
Хамгаалалт хэрэгтэй. Гэртээ хаалгаа онгорхой орхиж болно. Олон нийтийн газарт болохгүй.
Хэмжээ хэрэгтэй. Гэртээ хоёр хүнд хоол хийдэг. Зоогийн газарт зуун хүн зэрэг ирж болно.
Deployment бол яг тэр шилжилт юм. Таны код өөрчлөгдөхгүй — орчин өөрчлөгдөнө.
Тодорхойлолт өгье.
Deployment гэдэг нь программыг хөгжүүлэлтийн орчноос (таны компьютер) бодит ажиллагааны орчинд (интернэтэд холбогдсон, байнга ажилладаг сервер) шилжүүлэх ажил юм.
Гурван зүйл шаардлагатай.
Компьютер — байнга асаалттай, интернэтэд холбогдсон. Түүнийг сервер гэж нэрлэдэг.
Хаяг — хүмүүс хандах боломжтой нэр (api.minii-nomiin-san.mn) эсвэл IP хаяг.
Тохиргоо — таны программ тэр орчинд зөв ажиллахад шаардлагатай тохируулгууд.
Энэ гурвыг нэг нэгээр нь харцгаая.
Сервер бол зүгээр л компьютер юм. Ямар нэг ид шид биш.
Ялгаа нь:
Байнга асаалттай. Таны зөөврийн компьютер шиг унтардаггүй. Цахилгаан тасрахгүй (нөөц эх үүсвэртэй), интернэт тасрахгүй.
Тогтвортой хаягтай. Таны гэрийн интернэтийн хаяг өдөр бүр өөрчлөгдөж болно; серверийнх өөрчлөгддөггүй.
Дэлгэцгүй. Хэн ч түүн дээр сууж ажилладаггүй. Түүнд алсаас холбогддог — терминалаар (Курс 2-ын Бүлэг 11-т сурсан client/server санаа).
Ихэвчлэн Linux ажиллуулдаг. Windows биш. Учир нь Linux нь сервер ажиллуулахад илүү хөнгөн, илүү тогтвортой, үнэгүй.
Сүүлийн зүйл нь чухал. Таны код Windows дээр ажилладаг; сервер дээр Linux ажиллана. Python код нь хоёуланд ажилладаг — тэр бол Python-ы гол давуу талуудын нэг. Гэхдээ зам бичих хэлбэр (C:\ биш /home/), тушаалууд өөр байдаг.
Одоо 127.0.0.1:8000 руу ханддаг. Тэр нь зөвхөн таны компьютер дотор ажилладаг.
Бодит серверт IP хаяг байдаг — жишээ нь 203.0.113.42. Дэлхийн хэн ч тэр хаяг руу хандаж чадна.
Гэхдээ хүмүүс тоо цээжилдэггүй. Тиймээс домэйн нэр хэрэгтэй: nomiin-san.mn.
Домэйн нь IP хаяг руу заадаг. Тэр холбоог DNS гэсэн систем зохицуулдаг — интернэтийн утасны дэвтэр гэж бодож болно. Хэн нэгэн nomiin-san.mn гэж бичихэд DNS түүнийг 203.0.113.42 болгож хөрвүүлдэг.
Домэйн нэр нь худалдаж авдаг зүйл — жилийн төлбөртэй. .mn домэйныг Монголд бүртгүүлдэг; .com, .app зэргийг олон улсын үйлчилгээгээр авдаг.
Домэйнгүй ч API ажиллана — зөвхөн IP хаягаар. Гэхдээ мэргэжлийн харагдахын тулд домэйн хэрэгтэй.
Одоо http:// гэж бичдэг. Бодит серверт https:// байх ёстой.
Ялгаа нь s — secure, аюулгүй. HTTPS нь өгөгдлийг шифрлэдэг.
Яагаад чухал вэ? HTTP-ээр илгээсэн бүх зүйл — таны API key, хэрэглэгчийн мэдээлэл, бүх JSON — ил текстээр сүлжээгээр явдаг. Замд байгаа хэн ч уншиж чадна: интернэт үйлчилгээ үзүүлэгч, олон нийтийн WiFi-ийн эзэн, халдагч.
Бүлэг 8-т бид API key-ыг header-т илгээж, "хаягт бүү тавь" гэж хэлсэн. Гэхдээ HTTPS-гүйгээр header ч ил байдаг. Тиймээс HTTPS нь бүх хамгаалалтын суурь юм.
Сайн мэдээ: орчин үеийн хостинг үйлчилгээнүүд HTTPS-ыг автоматаар, үнэгүй өгдөг. Та юу ч хийх шаардлагагүй. Хуучин арга (гараар certificate тохируулах) нь одоо ховор.
Бүлэг 9-ийн Хичээл 1-ийн төгсгөлд би нэг зүйлийг амласан: "production-д .env файл байдаггүй, гэхдээ код ижил хэвээр".
Одоо түүнийг тайлбарлая.
Хөгжүүлэлтэд та .env файл ашигладаг. Тэр нь тав тухтай — файл засаад дуусна.
Бодит серверт .env файл ихэвчлэн байдаггүй. Оронд нь environment variable-ыг шууд тохируулдаг: хостинг үйлчилгээний тохиргооны хуудсанд бичдэг.
Яагаад? Учир нь:
Аюулгүй байдал. Файл нь санамсаргүй хуулагдаж, backup-д орж, log-д гарч болно. Хостингийн тохиргоо нь илүү хамгаалагдсан.
Тав тух. Тохиргоо өөрчлөхөд сервер рүү холбогдож файл засах шаардлагагүй — вэб хуудсан дээр товшоод солино.
Багийн ажил. Хэд хэдэн хүн тохиргоо удирдахад файлаас илүү зохион байгуулалттай.
Гэхдээ таны код өөрчлөгдөхгүй. os.getenv("API_KEY") нь хоёр тохиолдолд ижил ажиллана. load_dotenv() нь .env файл олдохгүй бол зүгээр л юу ч хийхгүй, алдаа өгөхгүй.
Энэ бол Бүлэг 9-т сурсан загварын жинхэнэ шалтгаан: нэг код, олон орчим.
Production-д өөрчлөгдөх утгууд
Таны .env файлыг эргэн харъя:
API_KEY=номын-сангийн-нууц-түлхүүр
DATABASE_URL=sqlite:///library.db
ALLOWED_ORIGINS=http://localhost:3000Production-д гурвуулаа өөрчлөгдөнө.
API_KEY — жинхэнэ санамсаргүй, урт, таамаглахад бэрх утга байх ёстой. номын-сангийн-нууц-түлхүүр гэдэг нь туршилтад зүгээр, бодит ертөнцөд аюултай.
DATABASE_URL — SQLite файл эсвэл PostgreSQL хаяг. Доор ярина.
ALLOWED_ORIGINS — localhost биш, жинхэнэ frontend-ийн хаяг: https://nomiin-san.mn.
Бүлэг 1-ийн Хичээл 2-т би нэг амлалт өгсөн: "Бүлэг 15-д, deployment ярихдаа бид uvicorn руу дахин эргэж очно."
Одоо тэр цаг иржээ.
Та fastapi dev main.py гэж ажиллуулдаг. Тэр тушаал нь хөгжүүлэлтэд зориулагдсан:
Файл өөрчлөгдөхөд автоматаар reload хийдэг
Дэлгэрэнгүй алдааны мэдээлэл харуулдаг
Зөвхөн таны компьютер дотор сонсдог
Production-д эдгээр бүгд буруу.
Reload нь хэрэггүй (код өөрчлөгдөхгүй) бөгөөд эрсдэлтэй. Дэлгэрэнгүй алдаа нь аюултай (дотоод мэдээлэл ил гарна). Зөвхөн дотооддоо сонсох нь утгагүй (гаднаас хандах ёстой).
Тиймээс production-д uvicorn-ыг шууд дуудна:
uvicorn main:app --host 0.0.0.0 --port 8000Гурван хэсгийг задалъя.
main:app — main.py файлын app объект. Бүлэг 1-т дурдсан хуучин бичлэг.
--host 0.0.0.0 — "бүх сүлжээний интерфейсээс сонс". 127.0.0.1 бол зөвхөн дотоод; 0.0.0.0 бол гаднаас ирэх хүсэлтийг ч хүлээж авна. Deployment-д заавал.
--port 8000 — порт. Бодит серверт ихэвчлэн 80 (HTTP) эсвэл 443 (HTTPS), эсвэл хостингийн зааж өгсөн порт.
--reload байхгүй гэдгийг анзаараарай. Production-д хэзээ ч.
Ихэнх хостинг үйлчилгээ энэ тушаалыг таны өмнөөс ажиллуулдаг — та зөвхөн зааж өгнө.
Шударга асуулт: таны API SQLite ашигладаг. Тэр нь бодит серверт ажиллах уу?
Заримдаа тийм. Бүлэг 10-ын Хичээл 2-т ярьсанчлан SQLite нь бодит технологи бөгөөд олон программ түүн дээр production-д ажилладаг.
Гэхдээ болгоомжтой байх ёстой.
Асуудал 1: файл алга болж болно. Олон орчин үеийн хостинг үйлчилгээ нь программыг түр зуурын орчинд ажиллуулдаг. Программ дахин эхлэхэд файлын систем цэвэрлэгдэж болно. Тэгвэл таны library.db алга болно — бүх өгөгдөл.
Энэ бол ноцтой занга. Зарим хүн deployment хийгээд хэдэн өдрийн дараа "яагаад бүх өгөгдөл алга болов?" гэж гайхдаг.
Шийдэл: байнгын хадгалалт (persistent volume) тохируулах. Зарим үйлчилгээ түүнийг дэмждэг, зарим нь үгүй.
Асуудал 2: олон хувь ажиллуулах боломжгүй. Хэрэв таны API их ачаалалтай болбол хэд хэдэн хувь зэрэг ажиллуулах шаардлагатай болно. SQLite файл нь нэг машин дээр байдаг тул тэдгээр нь хуваалцаж чадахгүй.
Тиймээс production-д ихэвчлэн PostgreSQL руу шилждэг.
Сайн мэдээ: шилжилт нь хялбар. Бүлэг 12-ын Хичээл 1-т ярьсанчлан таны endpoint-ууд engine-ээс салсан. Шилжихэд:
.env-ийн DATABASE_URL-ыг өөрчлөх
PostgreSQL-ийн драйвер суулгах (pip install psycopg2-binary)
Хүснэгтүүдийг шинэ өгөгдлийн санд үүсгэх
Таны бусад код бараг хэвээр. SQLModel хоёуланд ажиллана.
Энэ бол сайн бүтцийн шагнал: өөрчлөлт нэг газарт хязгаарлагдана.
Одоо ямар сонголтууд байдгийг төрлөөр нь харцгаая. Тодорхой үйлчилгээний нэрийг би энд гүнзгий заахгүй — тэдгээр өөрчлөгддөг. Гэхдээ төрлүүд нь тогтвортой.
1. Platform-as-a-Service (PaaS)
Хамгийн энгийн эхлэл.
Та кодоо тэдэнд өгнө (ихэвчлэн Git-ээр), тэд бусад бүхнийг хийнэ: сервер, HTTPS, домэйн, ажиллуулах.
Давуу тал: хурдан, энгийн, серверийн мэдлэг шаардахгүй. Ихэвчлэн үнэгүй эхлэлтэй.
Сул тал: хяналт бага, өсөхөд үнэтэй болдог, тухайн үйлчилгээнээс хамаарна.
Хэнд тохирох вэ: эхний төсөл, жижиг API, суралцах зорилготой бол. Танд энэ хамгийн тохиромжтой.
2. Виртуал сервер (VPS)
Та бүтэн Linux сервер түрээслэнэ. Бүх зүйлийг өөрөө тохируулна: Python суулгах, uvicorn ажиллуулах, nginx тохируулах, HTTPS certificate авах, галт хана тохируулах.
Давуу тал: бүрэн хяналт, урьдчилан таамаглахуйц үнэ, гүнзгий сурах боломж.
Сул тал: олон зүйл сурах шаардлагатай, өөрөө засварлах ёстой, аюулгүй байдал таны хариуцлага.
Хэнд тохирох вэ: илүү хяналт хүсдэг, Linux сурах хүсэлтэй бол.
3. Container (Docker)
Таны программ болон түүний бүх хамаарлыг нэг "хайрцагт" боож, хаана ч ижилхэн ажиллуулна.
Давуу тал: "миний компьютер дээр ажилладаг байсан шүү дээ" гэсэн асуудал арилна, орчин бүрд ижил.
Сул тал: Docker өөрөө сурах ёстой зүйл.
Хэнд тохирох вэ: багийн ажил, олон орчин, том төсөл.
Энэ бол дараагийн алхам, эхний биш.
4. Serverless
Таны функцүүдийг зөвхөн хүсэлт ирэхэд ажиллуулна. Сервер байнга ажиллахгүй.
Давуу тал: бага ачаалалд маш хямд, автоматаар өргөждөг.
Сул тал: "хүйтэн эхлэл" (эхний хүсэлт удаан), өгөгдлийн сангийн холболт төвөгтэй, бүх framework тохирдоггүй.
Хэнд тохирох вэ: тодорхой төрлийн ачаалалд.
Хэрэв та маргааш deployment хийхээр шийдвэл, миний зөвлөгөө:
PaaS сонго. Хамгийн бага төвөгтэй, хамгийн хурдан үр дүн.
Ерөнхий алхмууд ойролцоогоор ийм байна (тухайн үйлчилгээний баримт бичгээс нарийн заавар авна уу):
1. Кодоо Git-д оруул. Ихэнх үйлчилгээ GitHub-аас шууд авдаг.
2. requirements.txt үүсгэ. Энэ файл нь таны программд ямар package хэрэгтэйг жагсаадаг. Курс 2-ын Бүлэг 1-т сурсан:
pip freeze > requirements.txtСервер тэр файлыг уншиж, ижил package-уудыг суулгана.
3. Ажиллуулах тушаалыг заа:
uvicorn main:app --host 0.0.0.0 --port $PORT$PORT нь хостингийн өгсөн порт (тэдгээр өөрсдөө сонгодог).
4. Environment variable-уудыг тохируул. Вэб хуудсан дээр API_KEY, DATABASE_URL, ALLOWED_ORIGINS бичнэ.
5. Deploy дар. Хэдэн минутын дараа таны API интернэтэд гарна.
6. /docs-ыг шалга. Хэрэв шинэ хаягаар /docs нээгдэж байвал — амжилттай.
Таван зургаан алхам. Эхний удаад хэдэн цаг авч болно (алдаа гарна, засна); дараа нь хэдхэн минут.
Хэрэв та deployment хийх бол дараах зүйлсийг урьдчилан шалгаарай. Энэ жагсаалт нь таны сурсан бүх зүйлийн практик хураангуй юм.
Нууц кодонд байхгүй эсэх. .env файл .gitignore-д байна уу? Git-д нууц орсон уу? (Бүлэг 9)
API key хүчтэй эсэх. Туршилтын түлхүүрийг солисон уу? Урт, санамсаргүй эсэх?
DEBUG горим унтраасан эсэх. echo=True арилгасан уу? Дэлгэрэнгүй алдаа хэрэглэгчид харагдахгүй эсэх? (Бүлэг 9-ийн exception handler)
CORS зөв эсэх. allow_origins=["*"] биш, жинхэнэ хаягууд эсэх? (Бүлэг 13)
Өгөгдлийн сан байнгын эсэх. Дахин эхлэхэд өгөгдөл үлдэх үү?
Backup байгаа эсэх. Өгөгдлийн сан эвдэрвэл сэргээх арга байна уу?
HTTPS эсэх. https:// эсэх?
Pagination хязгаартай эсэх. MAX_PAGE_SIZE тохируулагдсан уу? (Бүлэг 13)
Найман зүйл. Тэдгээр нь бүгд энэ сургалтад үзсэн зүйлс.
Нэг зүйлийг мэдэж байх нь чухал: deployment бол төгсгөл биш, эхлэл.
Программ интернэтэд гарсны дараа шинэ асуудлууд гарч ирнэ.
Хяналт (monitoring). Таны API ажиллаж байгаа эсэхийг хэрхэн мэдэх вэ? Хэрэглэгч гомдоллохоос өмнө асуудлыг олох хэрэгтэй.
Log. Алдаа гарахад юу болсныг хэрхэн мэдэх вэ? Таны print мэдэгдэл хаашаа очих вэ?
Шинэчлэлт. Кодоо өөрчилвөл хэрхэн дахин байрлуулах вэ? Хэрэглэгчид тасалдах уу?
Backup. Өгөгдөл алдагдвал яах вэ?
Ачаалал. Гэнэт мянган хэрэглэгч ирвэл сервер даах уу?
Эдгээр нь бүгд бодит асуудлууд бөгөөд тус бүр өөрийн шийдэлтэй. Тэдгээр нь үйл ажиллагааны (operations) талбар — өөр мэргэжил, өөр гүнзгий сэдэв.
Одоохондоо эдгээрийг мэдэж байх нь хангалттай. Хэрэв та бодит хэрэглэгчидтэй болвол тэдгээр нэг нэгээр нь тулгарна.
Энэ хичээлээс юу авах ёстой вэ?
Deployment бол ид шид биш. Компьютер, хаяг, тохиргоо. Гурван зүйл.
Таны код бэлэн. Бүлэг 9-т тохиргоог кодоос салгасан, Бүлэг 12-т өгөгдлийн санг endpoint-ээс салгасан, Бүлэг 13-т CORS тохируулсан. Эдгээр бүгд deployment-д бэлдэж байсан.
Эхний удаа хэцүү, дараа нь хялбар. Хүн бүр эхний deployment дээр алдаа гаргадаг. Тэр нь хэвийн.
Заавар биш, ойлголт хэрэгтэй. Тодорхой алхмуудыг тухайн үйлчилгээний баримт бичгээс уншина. Энэ хичээл нь тэр баримт бичгийг ойлгоход туслах суурь өгсөн.
Хэрэв та хэзээ ч deployment хийхгүй ч гэсэн — энэ ойлголт нь таныг илүү сайн хөгжүүлэгч болгоно. Учир нь та кодоо "хэзээ нэгэн цагт бодит сервер дээр ажиллана" гэсэн бодолтой бичих болно.
Deployment = программыг таны компьютерээс интернэтэд холбогдсон, байнга ажилладаг серверт шилжүүлэх.
Гурван зүйл: сервер (байнга асаалттай компьютер), хаяг (домэйн + DNS), тохиргоо.
Сервер бол зүгээр л компьютер — байнга асаалттай, дэлгэцгүй, ихэвчлэн Linux.
HTTPS заавал — HTTP-ээр API key болон бүх өгөгдөл ил явдаг. Орчин үеийн хостинг үүнийг үнэгүй өгдөг.
Production-д .env файл биш, environment variable шууд тохируулдаг — гэхдээ код ижил хэвээр.
Production-д fastapi dev биш, uvicorn main:app --host 0.0.0.0 — reload байхгүй.
SQLite production-д эрсдэлтэй — файл алга болж болно, олон хувь ажиллуулж болохгүй. PostgreSQL руу шилжих нь DATABASE_URL өөрчлөх ажил.
Сонголтууд: PaaS (хамгийн энгийн, эхлэхэд тохиромжтой), VPS (бүрэн хяналт), Docker (дараагийн алхам), Serverless (тодорхой ачаалалд).
Deployment-ийн өмнө шалгах: нууц, API key, debug, CORS, өгөгдлийн сан, backup, HTTPS, pagination хязгаар.
Deployment бол эхлэл — дараа нь хяналт, log, шинэчлэлт, ачаалал гарч ирнэ.
Одоо та программаа интернэтэд гаргах нь юу гэсэн үг болохыг ойлголоо. Дараагийн хичээлд бид илүү өргөн зураг харна: цаашдын зам. Энэ сургалт олон зүйлийг заагаагүй — жинхэнэ хэрэглэгчийн нэвтрэлт, PostgreSQL, migration, тест, background task, frontend. Тэдгээр нь дутагдал биш, харин дараагийн алхмууд юм. Бид тус бүрийг нэрлэж, юу болохыг тайлбарлаж, хаанаас эхлэхийг зааж, аль нь танд хэрэгтэйг сонгоход туслах чиглэл өгнө.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.