{"data":[{"id":106684,"title":"B\u00e0i 2 C\u00e0i \u0111\u1eb7t MetaTrader 5 v\u00e0 l\u00e0m quen v\u1edbi MetaEditor","slug":"1QLxnmpq4Aw","url":"https:\/\/viblo.asia\/p\/bai-2-cai-dat-metatrader-5-va-lam-quen-voi-metaeditor-1QLxnmpq4Aw","user_id":182653,"moderation":null,"transliterated":"bai-2-cai-dat-metatrader-5-va-lam-quen-voi-metaeditor","contents_short":"MetaTrader 5 (MT5) v\u00e0 ph\u1ea7n m\u1ec1m bi\u00ean d\u1ecbch \u0111i k\u00e8m MetaEditor l\u00e0 kh\u00f4ng gian l\u00e0m vi\u1ec7c c\u1ed1t l\u00f5i b\u1ea1n c\u1ea7n \u0111\u1ec3 ph\u00e1t tri\u1ec3n c\u00e1c h\u1ec7 th\u1ed1ng giao d\u1ecbch MQL5. Qu\u00e1 tr\u00ecnh thi\u1ebft l\u1eadp m\u00f4i tr\u01b0\u1eddng l\u1eadp tr\u00ecnh \u0111\u01b0\u1ee3c th\u1ef1c hi\u1ec7n nhanh ch\u00f3ng qua c\u00e1c b\u01b0\u1edbc sau.\n\nC\u00e0i \u0111\u1eb7t n\u1ec1n t\u1ea3ng MetaTrader 5\n\n-   T\u1ea3i b\u1ed9 c\u00e0i \u0111\u1eb7t MT5 tr\u1ef1c ti\u1ebfp t\u1eeb trang ch\u1ee7 MetaQuotes ho\u1eb7c th\u00f4ng qua website c\u1ee7a s\u00e0n giao d\u1ecbch (Broker) t\u00e0i ch\u00ednh.\n\n-   Kh\u1edfi ch\u1ea1y file ...","contents":"MetaTrader 5 (MT5) v\u00e0 ph\u1ea7n m\u1ec1m bi\u00ean d\u1ecbch \u0111i k\u00e8m MetaEditor l\u00e0 kh\u00f4ng gian l\u00e0m vi\u1ec7c c\u1ed1t l\u00f5i b\u1ea1n c\u1ea7n \u0111\u1ec3 ph\u00e1t tri\u1ec3n c\u00e1c h\u1ec7 th\u1ed1ng giao d\u1ecbch MQL5. Qu\u00e1 tr\u00ecnh thi\u1ebft l\u1eadp m\u00f4i tr\u01b0\u1eddng l\u1eadp tr\u00ecnh \u0111\u01b0\u1ee3c th\u1ef1c hi\u1ec7n nhanh ch\u00f3ng qua c\u00e1c b\u01b0\u1edbc sau.\n\n**C\u00e0i \u0111\u1eb7t n\u1ec1n t\u1ea3ng MetaTrader 5**\n\n-   T\u1ea3i b\u1ed9 c\u00e0i \u0111\u1eb7t MT5 tr\u1ef1c ti\u1ebfp t\u1eeb trang ch\u1ee7 MetaQuotes ho\u1eb7c th\u00f4ng qua website c\u1ee7a s\u00e0n giao d\u1ecbch (Broker) t\u00e0i ch\u00ednh.\n    \n-   Kh\u1edfi ch\u1ea1y file th\u1ef1c thi `.exe`, gi\u1eef nguy\u00ean c\u00e1c thi\u1ebft l\u1eadp m\u1eb7c \u0111\u1ecbnh v\u00e0 ho\u00e0n t\u1ea5t qu\u00e1 tr\u00ecnh c\u00e0i \u0111\u1eb7t.\n    \n-   M\u1edf n\u1ec1n t\u1ea3ng MT5 v\u00e0 \u0111\u0103ng nh\u1eadp v\u00e0o m\u1ed9t t\u00e0i kho\u1ea3n Demo. B\u01b0\u1edbc n\u00e0y b\u1eaft bu\u1ed9c \u0111\u1ec3 h\u1ec7 th\u1ed1ng k\u1ebft n\u1ed1i m\u00e1y ch\u1ee7 v\u00e0 t\u1ea3i v\u1ec1 d\u1eef li\u1ec7u n\u1ebfn (Timeseries) ph\u1ee5c v\u1ee5 cho qu\u00e1 tr\u00ecnh l\u1eadp tr\u00ecnh. Tr\u1ea1ng th\u00e1i k\u1ebft n\u1ed1i th\u00e0nh c\u00f4ng \u0111\u01b0\u1ee3c bi\u1ec3u th\u1ecb b\u1eb1ng bi\u1ec3u t\u01b0\u1ee3ng c\u1ed9t s\u00f3ng m\u00e0u xanh \u1edf g\u00f3c d\u01b0\u1edbi c\u00f9ng b\u00ean ph\u1ea3i m\u00e0n h\u00ecnh.\n    \n\n**Kh\u1edfi \u0111\u1ed9ng v\u00e0 l\u00e0m quen v\u1edbi MetaEditor** MetaEditor l\u00e0 m\u00f4i tr\u01b0\u1eddng ph\u00e1t tri\u1ec3n t\u00edch h\u1ee3p (IDE) chuy\u00ean d\u1ee5ng cho ng\u00f4n ng\u1eef MQL5. T\u1eeb m\u00e0n h\u00ecnh ch\u00ednh c\u1ee7a MT5, b\u1ea1n nh\u1ea5n ph\u00edm t\u1eaft `F4` ho\u1eb7c click v\u00e0o bi\u1ec3u t\u01b0\u1ee3ng IDE tr\u00ean thanh c\u00f4ng c\u1ee5 \u0111\u1ec3 kh\u1edfi ch\u1ea1y ph\u1ea7n m\u1ec1m.\n\nC\u00e1c khu v\u1ef1c ch\u1ee9c n\u0103ng tr\u1ecdng t\u00e2m trong MetaEditor bao g\u1ed3m:\n\n-   **Navigator (Ctrl+D):** C\u00e2y th\u01b0 m\u1ee5c qu\u1ea3n l\u00fd to\u00e0n b\u1ed9 h\u1ec7 th\u1ed1ng d\u1ef1 \u00e1n. C\u00e1c file m\u00e3 ngu\u1ed3n (\u0111\u1ecbnh d\u1ea1ng `.mq5`) \u0111\u01b0\u1ee3c t\u1ed5 ch\u1ee9c b\u1eaft bu\u1ed9c trong th\u01b0 m\u1ee5c g\u1ed1c MQL5, ph\u00e2n chia r\u00f5 r\u00e0ng th\u00e0nh c\u00e1c nh\u00e1nh: MQL5\/Experts (ch\u1ee9a robot giao d\u1ecbch), MQL5\/Indicators (ch\u1ee9a ch\u1ec9 b\u00e1o) v\u00e0 MQL5\/Scripts.\n    \n-   **Workspace (Kh\u00f4ng gian so\u1ea1n th\u1ea3o):** Khu v\u1ef1c vi\u1ebft code ch\u00ednh h\u1ed7 tr\u1ee3 t\u00ednh n\u0103ng t\u1ef1 \u0111\u1ed9ng ho\u00e0n th\u00e0nh m\u00e3 (IntelliSense), highlight c\u00fa ph\u00e1p v\u00e0 g\u1ee3i \u00fd tham s\u1ed1 h\u00e0m t\u01b0\u01a1ng t\u1ef1 c\u00e1c IDE hi\u1ec7n \u0111\u1ea1i.\n    \n-   **Toolbox (Ctrl+T):** N\u1eb1m \u1edf ph\u00eda d\u01b0\u1edbi giao di\u1ec7n. Tab quan tr\u1ecdng nh\u1ea5t t\u1ea1i \u0111\u00e2y l\u00e0 **Errors** \u2013 n\u01a1i ghi nh\u1eadn c\u00e1c th\u00f4ng b\u00e1o l\u1ed7i (Errors), c\u1ea3nh b\u00e1o (Warnings) v\u00e0 th\u1eddi gian th\u1ef1c thi sau m\u1ed7i l\u1ea7n b\u1ea1n th\u1ef1c hi\u1ec7n l\u1ec7nh bi\u00ean d\u1ecbch m\u00e3 ngu\u1ed3n.\n    \n\n**T\u1ea1o file m\u00e3 ngu\u1ed3n \u0111\u1ea7u ti\u00ean**\n\n-   Nh\u1ea5n t\u1ed5 h\u1ee3p ph\u00edm `Ctrl+N` \u0111\u1ec3 k\u00edch ho\u1ea1t tr\u00ecnh kh\u1edfi t\u1ea1o MQL5 Wizard.\n    \n-   L\u1ef1a ch\u1ecdn lo\u1ea1i ch\u01b0\u01a1ng tr\u00ecnh mu\u1ed1n ph\u00e1t tri\u1ec3n (ch\u1ecdn Script ho\u1eb7c Expert Advisor).\n    \n-   \u0110i\u1ec1n t\u00ean file, khai b\u00e1o th\u00f4ng tin t\u00e1c gi\u1ea3 v\u00e0 ch\u1ecdn c\u00e1c h\u00e0m s\u1ef1 ki\u1ec7n m\u1eb7c \u0111\u1ecbnh mu\u1ed1n kh\u1edfi t\u1ea1o s\u1eb5n.\n    \n-   H\u1ec7 th\u1ed1ng s\u1ebd t\u1ef1 \u0111\u1ed9ng sinh ra m\u1ed9t file `.mq5` v\u1edbi c\u1ea5u tr\u00fac khung (boilerplate). B\u1ea1n c\u00f3 th\u1ec3 vi\u1ebft code v\u00e0o kh\u00f4ng gian n\u00e0y, sau \u0111\u00f3 nh\u1ea5n ph\u00edm `F7` \u0111\u1ec3 ti\u1ebfn h\u00e0nh qu\u00e1 tr\u00ecnh bi\u00ean d\u1ecbch (Compile) m\u00e3 ngu\u1ed3n v\u0103n b\u1ea3n th\u00e0nh file th\u1ef1c thi `.ex5` \u0111\u1ec3 ch\u1ea1y tr\u00ean \u0111\u1ed3 th\u1ecb MT5.","published_at":"2026-09-15T00:21:58.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-15T00:28:02.000000Z","edited_at":"2026-09-14T16:25:39.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":3,"points":0,"views_count":3,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/54b9126d-98ab-4082-a1fd-65329aa79811.png","user":{"data":{"id":182653,"url":"https:\/\/viblo.asia\/u\/hhoang","avatar":"6024932a-5822-4ab3-8a0a-67ce58832e70.jpg","name":"C\u00f4 G\u00e1i IT","username":"hhoang","followers_count":173,"reputation":13114,"posts_count":1216,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"chia-se","name":"chia s\u1ebb"}]},"commentators":{"data":[]}},{"id":106721,"title":"MB66","slug":"8X4EjqA1JN2","url":"https:\/\/viblo.asia\/p\/mb66-8X4EjqA1JN2","user_id":214998,"moderation":"discarded","transliterated":"mb66","contents_short":"MB66 kh\u00f4ng ch\u1ec9 l\u00e0 m\u1ed9t nh\u00e0 c\u00e1i, m\u00e0 c\u00f2n l\u00e0 m\u1ed9t c\u1ed9ng \u0111\u1ed3ng l\u1edbn m\u1ea1nh c\u1ee7a nh\u1eefng ng\u01b0\u1eddi y\u00eau th\u00edch c\u00e1 c\u01b0\u1ee3c. Ch\u00fang t\u00f4i th\u01b0\u1eddng xuy\u00ean t\u1ed5 ch\u1ee9c c\u00e1c s\u1ef1 ki\u1ec7n, gi\u1ea3i \u0111\u1ea5u v\u1edbi ph\u1ea7n th\u01b0\u1edfng c\u1ef1c k\u1ef3 h\u1ea5p d\u1eabn, t\u1ea1o s\u00e2n ch\u01a1i s\u00f4i \u0111\u1ed9ng v\u00e0 g\u1eafn k\u1ebft cho c\u00e1c th\u00e0nh vi\u00ean. V\u1edbi c\u00f4ng ngh\u1ec7 hi\u1ec7n \u0111\u1ea1i, MB66 \u0111\u1ea3m b\u1ea3o tr\u1ea3i nghi\u1ec7m ch\u01a1i game m\u01b0\u1ee3t m\u00e0, kh\u00f4ng gi\u1eadt lag tr\u00ean m\u1ecdi n\u1ec1n t\u1ea3ng, t\u1eeb m\u00e1y t\u00ednh \u0111\u1ebfn \u0111i\u1ec7n tho\u1ea1i di \u0111\u1ed9ng. H\u00e3y c\u00f9ng MB66 kh\u00e1m ph\u00e1...","contents":"MB66 kh\u00f4ng ch\u1ec9 l\u00e0 m\u1ed9t nh\u00e0 c\u00e1i, m\u00e0 c\u00f2n l\u00e0 m\u1ed9t c\u1ed9ng \u0111\u1ed3ng l\u1edbn m\u1ea1nh c\u1ee7a nh\u1eefng ng\u01b0\u1eddi y\u00eau th\u00edch c\u00e1 c\u01b0\u1ee3c. Ch\u00fang t\u00f4i th\u01b0\u1eddng xuy\u00ean t\u1ed5 ch\u1ee9c c\u00e1c s\u1ef1 ki\u1ec7n, gi\u1ea3i \u0111\u1ea5u v\u1edbi ph\u1ea7n th\u01b0\u1edfng c\u1ef1c k\u1ef3 h\u1ea5p d\u1eabn, t\u1ea1o s\u00e2n ch\u01a1i s\u00f4i \u0111\u1ed9ng v\u00e0 g\u1eafn k\u1ebft cho c\u00e1c th\u00e0nh vi\u00ean. V\u1edbi c\u00f4ng ngh\u1ec7 hi\u1ec7n \u0111\u1ea1i, MB66 \u0111\u1ea3m b\u1ea3o tr\u1ea3i nghi\u1ec7m ch\u01a1i game m\u01b0\u1ee3t m\u00e0, kh\u00f4ng gi\u1eadt lag tr\u00ean m\u1ecdi n\u1ec1n t\u1ea3ng, t\u1eeb m\u00e1y t\u00ednh \u0111\u1ebfn \u0111i\u1ec7n tho\u1ea1i di \u0111\u1ed9ng. H\u00e3y c\u00f9ng MB66 kh\u00e1m ph\u00e1 nh\u1eefng tr\u00f2 ch\u01a1i m\u1edbi nh\u1ea5t, th\u1eed th\u00e1ch b\u1ea3n th\u00e2n v\u00e0 chinh ph\u1ee5c nh\u1eefng gi\u1ea3i th\u01b0\u1edfng l\u1edbn. \u0110\u1eebng b\u1ecf l\u1ee1 c\u01a1 h\u1ed9i tr\u1edf th\u00e0nh m\u1ed9t ph\u1ea7n c\u1ee7a c\u1ed9ng \u0111\u1ed3ng MB66 ngay h\u00f4m nay!\nWebsite: https:\/\/mb66poker.com\nEmail: support@mb66poker.com\nDia chi: S\u1ed1 18, \u0110\u01b0\u1eddng Cao B\u00e1 Nh\u1ea1, Ph\u01b0\u1eddng Nguy\u1ec5n C\u01b0 Trinh, Qu\u1eadn 1, TP. H\u1ed3 Ch\u00ed Minh\nSDT: 0898765432\nHashtags: #MB66 #NhaCaiMB66 #MB66Casino #GameMB66 #MB66UyTin #LinkMB66 #DangKyMB66 \n\n\nhttps:\/\/x.com\/mb66pokercom\nhttps:\/\/www.youtube.com\/@mb66pokercom\/about\nhttps:\/\/www.pinterest.com\/mb66pokercom\/\nhttps:\/\/www.tumblr.com\/mb66pokercom\nhttps:\/\/www.twitch.tv\/mb66pokercom\/about\nhttps:\/\/blender.community\/wren1\/\nhttps:\/\/www.speedrun.com\/users\/mb66pokercom\nhttps:\/\/partecipa.poliste.com\/profiles\/mb66pokercom\/activity\nhttps:\/\/vc.ru\/id6112139\nhttps:\/\/fortunetelleroracle.com\/profile\/mb66pokercom\nhttps:\/\/archive.org\/editxml\/@wren_cortes\nhttps:\/\/recentstatus.com\/mb66pokercom\nhttps:\/\/app.talkshoe.com\/user\/mb66pokercom\nhttps:\/\/feyenoord.supporters.nl\/profiel\/179230\/mb66pokercom\nhttps:\/\/www.bahamaslocal.com\/userprofile\/1\/325969\/mb66pokercom.html\nhttps:\/\/raovat.nhadat.vn\/members\/mb66pokercom-347452.html\nhttps:\/\/www.thethingsnetwork.org\/u\/mb66pokercom\nhttps:\/\/forum.aceinna.com\/user\/mb66pokercom\nhttps:\/\/its-my.link\/@mb66pokercom\nhttps:\/\/pinshape.com\/users\/9064796-mb66pokercom?tab=designs\nhttps:\/\/hashnode.com\/@mb66pokercom\nhttps:\/\/belgaumonline.com\/profile\/mb66pokercom\/\nhttps:\/\/www.aviacionargentina.net\/user\/mb66pokercom\nhttps:\/\/maanation.com\/mb66pokercom\nhttps:\/\/allmyfaves.com\/mb66pokercom\nhttps:\/\/fanclove.jp\/profile\/L7Bodgy62q\nhttps:\/\/wakelet.com\/@mb66pokercom\nhttps:\/\/booklog.jp\/users\/mb66pokercom\/profile\nhttps:\/\/www.rareconnect.org\/en\/user\/mb66pokercom\nhttps:\/\/www.getlisteduae.com\/listings\/mb66-23\nhttps:\/\/desall.com\/User\/mb66pokercom\/Profile\nhttps:\/\/www.shadertoy.com\/user\/mb66pokercom\nhttps:\/\/rapidapi.com\/user\/wrencortesxyuhy\nhttps:\/\/www.circleme.com\/mb66pokercom\nhttps:\/\/etextpad.com\/6vrabavlid\nhttps:\/\/leetcode.com\/u\/mb66pokercom\/\nhttps:\/\/motion-gallery.net\/users\/1056158\nhttps:\/\/help.orrs.de\/user\/mb66pokercom\nhttps:\/\/aphorismsgalore.com\/users\/mb66pokercom\nhttps:\/\/talkmarkets.com\/profile\/nh%C3%A0-c%C3%A1i-mb66-260914-215358\nhttps:\/\/sparktv.net\/mb66pokercom\nhttps:\/\/sites.google.com\/view\/mb66pokercom\/home\nhttps:\/\/telegra.ph\/MB66-09-14-7\nhttps:\/\/dongnairaovat.com\/members\/mb66pokercom\nhttps:\/\/institutocrecer.edu.co\/profile\/mb66pokercom\/\nhttps:\/\/hmsay.com\/members\/mb66pokercom\nhttps:\/\/backloggery.com\/mb66pokercom\nhttps:\/\/infinitebacklog.net\/users\/mb66pokercom\nhttps:\/\/eo-college.org\/members\/mb66pokercom\/\nhttps:\/\/www.instructorsnearme.com\/author\/mb66pokercom\/\nhttps:\/\/myurls.bio\/mb66pokercom\nhttps:\/\/www.scamadviser.com\/check-website\/mb66poker.com\nhttps:\/\/doodleordie.com\/profile\/mb66pokercom\nhttps:\/\/m.wibki.com\/mb66pokercom\nhttps:\/\/www.chordie.com\/forum\/profile.php?id=2666718\nhttps:\/\/velog.io\/@mb66pokercom\/MB66\nhttps:\/\/www.plotterusati.it\/user\/mb66-15\nhttps:\/\/www.bandlab.com\/mb66pokercom\nhttps:\/\/www.atozed.com\/forums\/user-103765.html\nhttps:\/\/manga-no.com\/@mb66pokercom\/profile\nhttps:\/\/www.databaze-her.cz\/uzivatele\/mb66pokercom\/\nhttps:\/\/connect.garmin.com\/app\/profile\/aa6ece24-98c8-4914-8cd7-f12310ead87d\nhttps:\/\/egl.circlly.com\/users\/mb66pokercom\nhttps:\/\/www.scam-detector.com\/validator\/mb66poker-com-review\/\nhttps:\/\/theamberpost.com\/member\/mb66pokercom\nhttps:\/\/spinninrecords.com\/profile\/mb66pokercom\nhttps:\/\/pictureinbottle.com\/r\/mb66pokercom\nhttps:\/\/baskadia.com\/user\/hjkb\nhttps:\/\/community.greeka.com\/users\/mb66pokercom\nhttps:\/\/zzb.bz\/kMAJi4\nhttps:\/\/www.bigoven.com\/user\/mb66pokercom\nhttps:\/\/timdaily.vn\/members\/mb66pokercom.147189\/#about\nhttps:\/\/official.link\/mb66pokercom\nhttps:\/\/www.diggerslist.com\/mb66pokercom\/about\nhttps:\/\/fabble.cc\/mb66pokercom\nhttps:\/\/www.99freelas.com.br\/user\/mb66pokercom\nhttps:\/\/www.giveawayoftheday.com\/forums\/profile\/2128726\nhttps:\/\/manylink.co\/@mb66pokercom\nhttps:\/\/www.storenvy.com\/mb66pokercom\nhttp:\/\/cv.viblo.asia\/preview-cv\/8ec581d2-3afd-4db4-b7a3-5104ebe1beb9\nhttps:\/\/digiphoto.techbang.com\/users\/mb66pokercom\nhttp:\/\/lifeinsys.com\/user\/mb66pokercom\nhttps:\/\/gourmet-calendar.com\/users\/mb66pokercom\nhttps:\/\/hoo.be\/mb66pokercom\nhttps:\/\/www.mapleprimes.com\/users\/mb66pokercom\nhttps:\/\/freeimage.host\/mb66pokercom\nhttps:\/\/bresdel.com\/mb66pokercom\nhttps:\/\/flipboard.com\/@wrencortes\/mb66-l80iec55y\nhttps:\/\/smartprogress.do\/goal\/439058\/\nhttps:\/\/mikseri.net\/user\/mb66pokercom\nhttps:\/\/youbiz.com\/profile\/mb66pokercom\/\nhttps:\/\/www.vnbadminton.com\/members\/mb66pokercom.100563\/\nhttps:\/\/circleten.org\/a\/438003?postTypeId=whatsNew\nhttps:\/\/noti.st\/mb66pokercom\nhttps:\/\/tesera.ru\/user\/mb66pokercom\nhttps:\/\/beteiligung.amt-huettener-berge.de\/profile\/mb66pokercom\/\nhttps:\/\/www.storeboard.com\/nhacaimb661\nhttps:\/\/www.myebook.com\/user_profile.php?id=mb66pokercom\nhttps:\/\/gitee.com\/moqademm\nhttps:\/\/www.efunda.com\/members\/people\/show_people.cfm?Usr=mb66pokercom\nhttps:\/\/www.goodreads.com\/user\/show\/204314191-nh-c-i-mb66\nhttps:\/\/beteiligung.hafencity.com\/profile\/mb66pokercom\/\nhttps:\/\/justpaste.me\/6DBY1\nhttp:\/\/www.biblesupport.com\/user\/902706-mb66pokercom\/\nhttps:\/\/forums.maxperformanceinc.com\/forums\/member.php?u=262868\nhttps:\/\/protocol.ooo\/ja\/users\/mb66-edd70ba7-cc21-4dd3-b52d-050a9cb51ec9\nhttps:\/\/protospielsouth.com\/user\/175303\nhttps:\/\/truckymods.io\/user\/552141\nhttps:\/\/cadillacsociety.com\/users\/mb66pokercom\/\nhttps:\/\/chaloke.com\/forums\/users\/mb66pokercom\/\nhttp:\/\/forum.modulebazaar.com\/forums\/user\/mb66pokercom\/\nhttps:\/\/promosimple.com\/ps\/50f86\/mb66pokercom\nhttps:\/\/www.dideadesign.com\/forum\/topic\/104238\/mb66\nhttps:\/\/chomikuj.pl\/mb66pokercom\nhttps:\/\/portfolium.com\/WrenCortes\nhttps:\/\/pbase.com\/mb66pokercom\/\nhttps:\/\/lessons.drawspace.com\/post\/422356\/mb66pokercom\nhttps:\/\/www.bangyaimaterial.com\/forum\/topic\/227866\/mb66\nhttps:\/\/discuss.machform.com\/u\/mb66pokercom\nhttps:\/\/codi.ide3.de\/s\/_FcNn4fmO\nhttps:\/\/www.czporadna.cz\/user\/mb66pokercom\nhttps:\/\/pad.libreon.fr\/s\/BlTgffDV85","published_at":"2026-09-14T22:24:24.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T22:24:35.000000Z","edited_at":"2026-09-14T22:24:04.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":5,"points":0,"views_count":0,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/f47fc73a-65c5-4d2b-8503-328002e6ec60.png","user":{"data":{"id":214998,"url":"https:\/\/viblo.asia\/u\/mb66pokercom","avatar":"a17c7957-a0ab-479f-80f4-5bb90cfd9581.jpg","name":"MB","username":"mb66pokercom","followers_count":0,"reputation":0,"posts_count":0,"banned_at":"2026-09-14T22:24:27.000000Z","level_partner":null,"following":false}},"tags":{"data":[{"slug":"mb66","name":"MB66"}]},"commentators":{"data":[]}},{"id":106683,"title":"B\u00e0i 1 MQL5 l\u00e0 g\u00ec? T\u1ed5ng quan v\u1ec1 giao d\u1ecbch t\u1ef1 \u0111\u1ed9ng tr\u00ean MetaTrader 5","slug":"XP4WEd2pL7G","url":"https:\/\/viblo.asia\/p\/bai-1-mql5-la-gi-tong-quan-ve-giao-dich-tu-dong-tren-metatrader-5-XP4WEd2pL7G","user_id":182653,"moderation":null,"transliterated":"bai-1-mql5-la-gi-tong-quan-ve-giao-dich-tu-dong-tren-metatrader-5","contents_short":"Giao d\u1ecbch t\u1ef1 \u0111\u1ed9ng (Algorithmic Trading) gi\u00fap lo\u1ea1i b\u1ecf tri\u1ec7t \u0111\u1ec3 y\u1ebfu t\u1ed1 t\u00e2m l\u00fd con ng\u01b0\u1eddi v\u00e0 t\u1ed1i \u01b0u h\u00f3a t\u1ed1c \u0111\u1ed9 x\u1eed l\u00fd h\u00e0ng ngh\u00ecn t\u00edn hi\u1ec7u th\u1ecb tr\u01b0\u1eddng c\u00f9ng l\u00fac. Trong h\u1ec7 sinh th\u00e1i n\u00e0y, MQL5 \u0111\u00f3ng vai tr\u00f2 l\u00e0 ng\u00f4n ng\u1eef l\u1eadp tr\u00ecnh c\u1ed1t l\u00f5i \u0111\u1ec3 x\u00e2y d\u1ef1ng c\u00e1c c\u00f4ng c\u1ee5 giao d\u1ecbch tr\u00ean n\u1ec1n t\u1ea3ng MetaTrader 5 (MT5).\n\nMQL5 l\u00e0 g\u00ec? MQL5 (MetaQuotes Language 5) l\u00e0 m\u1ed9t ng\u00f4n ng\u1eef l\u1eadp tr\u00ecnh h\u01b0\u1edbng \u0111\u1ed1i t\u01b0\u1ee3ng (OOP) c\u1ea5p cao, \u0111\u01b0\u1ee3c...","contents":"Giao d\u1ecbch t\u1ef1 \u0111\u1ed9ng (Algorithmic Trading) gi\u00fap lo\u1ea1i b\u1ecf tri\u1ec7t \u0111\u1ec3 y\u1ebfu t\u1ed1 t\u00e2m l\u00fd con ng\u01b0\u1eddi v\u00e0 t\u1ed1i \u01b0u h\u00f3a t\u1ed1c \u0111\u1ed9 x\u1eed l\u00fd h\u00e0ng ngh\u00ecn t\u00edn hi\u1ec7u th\u1ecb tr\u01b0\u1eddng c\u00f9ng l\u00fac. Trong h\u1ec7 sinh th\u00e1i n\u00e0y, MQL5 \u0111\u00f3ng vai tr\u00f2 l\u00e0 ng\u00f4n ng\u1eef l\u1eadp tr\u00ecnh c\u1ed1t l\u00f5i \u0111\u1ec3 x\u00e2y d\u1ef1ng c\u00e1c c\u00f4ng c\u1ee5 giao d\u1ecbch tr\u00ean n\u1ec1n t\u1ea3ng MetaTrader 5 (MT5).\n\n**MQL5 l\u00e0 g\u00ec?** MQL5 (MetaQuotes Language 5) l\u00e0 m\u1ed9t ng\u00f4n ng\u1eef l\u1eadp tr\u00ecnh h\u01b0\u1edbng \u0111\u1ed1i t\u01b0\u1ee3ng (OOP) c\u1ea5p cao, \u0111\u01b0\u1ee3c ph\u00e1t tri\u1ec3n ri\u00eang b\u1edfi MetaQuotes Software Corp. C\u00fa ph\u00e1p c\u1ee7a MQL5 \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf d\u1ef1a tr\u00ean ti\u00eau chu\u1ea9n c\u1ee7a C++, mang l\u1ea1i kh\u1ea3 n\u0103ng x\u1eed l\u00fd t\u00ednh to\u00e1n c\u1ef1c nhanh, qu\u1ea3n l\u00fd b\u1ed9 nh\u1edb hi\u1ec7u qu\u1ea3 v\u00e0 c\u1ea5u tr\u00fac m\u00e3 ngu\u1ed3n c\u00f3 t\u00ednh m\u1edf r\u1ed9ng cao. Kh\u00e1c bi\u1ec7t l\u1edbn nh\u1ea5t c\u1ee7a MQL5 so v\u1edbi MQL4 l\u00e0 ki\u1ebfn tr\u00fac h\u01b0\u1edbng s\u1ef1 ki\u1ec7n \u0111a lu\u1ed3ng (multi-threaded), h\u1ed7 tr\u1ee3 ki\u1ec3m th\u1eed backtest ph\u1ee9c t\u1ea1p v\u00e0 x\u1eed l\u00fd kh\u1ed1i l\u01b0\u1ee3ng l\u1edbn d\u1eef li\u1ec7u n\u1ebfn (timeseries) m\u00e0 kh\u00f4ng l\u00e0m ngh\u1ebdn n\u1ec1n t\u1ea3ng.\n\n**C\u00e1c th\u00e0nh ph\u1ea7n giao d\u1ecbch t\u1ef1 \u0111\u1ed9ng tr\u00ean MT5** B\u1eb1ng vi\u1ec7c s\u1eed d\u1ee5ng MQL5, b\u1ea1n c\u00f3 th\u1ec3 l\u1eadp tr\u00ecnh ra ba lo\u1ea1i ch\u01b0\u01a1ng tr\u00ecnh ch\u00ednh, ph\u1ee5c v\u1ee5 cho c\u00e1c m\u1ee5c \u0111\u00edch ph\u00e2n t\u00edch v\u00e0 giao d\u1ecbch kh\u00e1c nhau:\n\n-   **Expert Advisors (EA):** \u0110\u00e2y l\u00e0 c\u00e1c robot giao d\u1ecbch t\u1ef1 \u0111\u1ed9ng ho\u00e0n to\u00e0n. EA ho\u1ea1t \u0111\u1ed9ng li\u00ean t\u1ee5c d\u1ef1a tr\u00ean t\u1eebng bi\u1ebfn \u0111\u1ed9ng gi\u00e1 (tick) c\u1ee7a th\u1ecb tr\u01b0\u1eddng. Ch\u00fang c\u00f3 th\u1ec3 ph\u00e2n t\u00edch xu h\u01b0\u1edbng, t\u1ef1 \u0111\u1ed9ng \u0111\u1eb7t l\u1ec7nh, qu\u1ea3n l\u00fd v\u1ed1n, d\u1eddi Stop Loss (Trailing Stop) v\u00e0 ch\u1ed1t l\u1eddi m\u00e0 kh\u00f4ng c\u1ea7n s\u1ef1 can thi\u1ec7p c\u1ee7a con ng\u01b0\u1eddi.\n    \n-   **Custom Indicators (Ch\u1ec9 b\u00e1o t\u00f9y ch\u1ec9nh):** C\u00e1c ch\u01b0\u01a1ng tr\u00ecnh n\u00e0y chuy\u00ean d\u00f9ng \u0111\u1ec3 ph\u00e2n t\u00edch d\u1eef li\u1ec7u gi\u00e1 v\u00e0 hi\u1ec3n th\u1ecb t\u00edn hi\u1ec7u tr\u1ef1c quan l\u00ean bi\u1ec3u \u0111\u1ed3 (nh\u01b0 \u0111\u01b0\u1eddng trung b\u00ecnh MA, bi\u1ec3u \u0111\u1ed3 Histogram hay c\u00e1c m\u0169i t\u00ean t\u00edn hi\u1ec7u). Kh\u00e1c v\u1edbi EA, Indicator ch\u1ec9 t\u00ednh to\u00e1n d\u1eef li\u1ec7u m\u00e0 kh\u00f4ng c\u00f3 quy\u1ec1n g\u1eedi y\u00eau c\u1ea7u \u0111\u1eb7t l\u1ec7nh l\u00ean m\u00e1y ch\u1ee7 (Broker).\n    \n-   **Scripts:** \u0110\u00e2y l\u00e0 nh\u1eefng \u0111o\u1ea1n m\u00e3 th\u1ef1c thi m\u1ed9t t\u00e1c v\u1ee5 duy nh\u1ea5t, ch\u1ea1y m\u1ed9t l\u1ea7n r\u1ed3i t\u1ef1 \u0111\u1ed9ng k\u1ebft th\u00fac. Scripts th\u01b0\u1eddng \u0111\u01b0\u1ee3c d\u00f9ng \u0111\u1ec3 gi\u1ea3i quy\u1ebft c\u00e1c thao t\u00e1c th\u1ee7 c\u00f4ng m\u1ed9t c\u00e1ch nhanh ch\u00f3ng, v\u00ed d\u1ee5 nh\u01b0 \u0111\u00f3ng h\u00e0ng lo\u1ea1t l\u1ec7nh \u0111ang m\u1edf, m\u1edf l\u01b0\u1edbi l\u1ec7nh r\u1ea3i \u0111\u1ec1u, ho\u1eb7c xu\u1ea5t d\u1eef li\u1ec7u l\u1ecbch s\u1eed gi\u00e1 ra file \u0111\u1ecbnh d\u1ea1ng CSV \u0111\u1ec3 ph\u00e2n t\u00edch b\u00ean ngo\u00e0i.\n    \n\n**T\u1ea1i sao n\u00ean s\u1eed d\u1ee5ng MQL5?** S\u1ee9c m\u1ea1nh th\u1ef1c s\u1ef1 c\u1ee7a MQL5 n\u1eb1m \u1edf tr\u00ecnh Strategy Tester (M\u00e1y ki\u1ec3m tra chi\u1ebfn l\u01b0\u1ee3c) \u0111\u01b0\u1ee3c t\u00edch h\u1ee3p s\u1eb5n trong n\u1ec1n t\u1ea3ng MT5. C\u00f4ng c\u1ee5 n\u00e0y cho ph\u00e9p b\u1ea1n th\u1eed nghi\u1ec7m EA tr\u1ef1c ti\u1ebfp tr\u00ean d\u1eef li\u1ec7u l\u1ecbch s\u1eed tick th\u1ef1c t\u1ebf, \u0111\u1ed3ng th\u1eddi h\u1ed7 tr\u1ee3 t\u1ed1i \u01b0u h\u00f3a h\u00e0ng tri\u1ec7u t\u1ed5 h\u1ee3p th\u00f4ng s\u1ed1 b\u1eb1ng thu\u1eadt to\u00e1n di truy\u1ec1n (Genetic Algorithm) \u0111\u1ec3 t\u00ecm ra b\u1ed9 c\u1ea5u h\u00ecnh t\u1ed1t nh\u1ea5t. H\u01a1n n\u1eefa, MQL5 cung c\u1ea5p b\u1ed9 th\u01b0 vi\u1ec7n ti\u00eau chu\u1ea9n kh\u1ed5ng l\u1ed3, h\u1ed7 tr\u1ee3 k\u1ebft n\u1ed1i API qua WebRequest, t\u01b0\u01a1ng t\u00e1c v\u1edbi c\u01a1 s\u1edf d\u1eef li\u1ec7u SQL v\u00e0 d\u1ec5 d\u00e0ng giao ti\u1ebfp v\u1edbi c\u00e1c n\u1ec1n t\u1ea3ng b\u00ean th\u1ee9 ba nh\u01b0 Telegram ho\u1eb7c Python.\n\nVi\u1ec7c l\u00e0m ch\u1ee7 ng\u00f4n ng\u1eef MQL5 s\u1ebd cung c\u1ea5p cho b\u1ea1n to\u00e0n quy\u1ec1n ki\u1ec3m so\u00e1t logic giao d\u1ecbch, bi\u1ebfn nh\u1eefng chi\u1ebfn l\u01b0\u1ee3c th\u1ee7 c\u00f4ng th\u00e0nh m\u1ed9t c\u1ed7 m\u00e1y ho\u1ea1t \u0111\u1ed9ng k\u1ef7 lu\u1eadt, ch\u00ednh x\u00e1c v\u00e0 kh\u00f4ng bi\u1ebft m\u1ec7t m\u1ecfi tr\u00ean th\u1ecb tr\u01b0\u1eddng t\u00e0i ch\u00ednh.","published_at":"2026-09-14T16:24:07.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-15T00:23:02.000000Z","edited_at":"2026-09-14T16:24:07.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":4,"points":0,"views_count":15,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/235c9604-168f-427e-9cdb-1f4a5cb64335.png","user":{"data":{"id":182653,"url":"https:\/\/viblo.asia\/u\/hhoang","avatar":"6024932a-5822-4ab3-8a0a-67ce58832e70.jpg","name":"C\u00f4 G\u00e1i IT","username":"hhoang","followers_count":173,"reputation":13114,"posts_count":1216,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"chia-se","name":"chia s\u1ebb"}]},"commentators":{"data":[]}},{"id":106679,"title":"\ud83d\ude80 Chapter 5 \u2014 Platform: Ph\u1ea7n J \u2014 Tri\u1ec3n khai Google Online Boutique t\u1eeb Amazon ECR qua GitOps l\u00ean Amazon EKS","slug":"3RL1BoY7Vao","url":"https:\/\/viblo.asia\/p\/chapter-5-platform-phan-j-trien-khai-google-online-boutique-tu-amazon-ecr-qua-gitops-len-amazon-eks-3RL1BoY7Vao","user_id":98940,"moderation":null,"transliterated":"chapter-5-platform-phan-j-trien-khai-google-online-boutique-tu-amazon-ecr-qua-gitops-len-amazon-eks","contents_short":"\u1ede Chapter 5F, ch\u00fang ta \u0111\u00e3 s\u1eed d\u1ee5ng Helm v\u00e0 Argo CD \u0111\u1ec3 qu\u1ea3n l\u00fd ba m\u00f4i tr\u01b0\u1eddng:\n\nTuy nhi\u00ean, image c\u1ee7a c\u00e1c service v\u1eabn ch\u01b0a \u0111\u01b0\u1ee3c k\u1ebft n\u1ed1i ho\u00e0n ch\u1ec9nh v\u1edbi quy tr\u00ecnh CI\/CD.\n\nTrong ph\u1ea7n n\u00e0y, ch\u00fang ta s\u1ebd x\u00e2y d\u1ef1ng flow:\n\nM\u1ee5c ti\u00eau c\u1ee7a ph\u1ea7n n\u00e0y l\u00e0:\n\n* Build Docker image b\u1eb1ng GitHub Actions.\n* Push image l\u00ean Amazon ECR.\n* S\u1eed d\u1ee5ng Git commit SHA l\u00e0m image tag.\n* C\u1eadp nh\u1eadt image tag trong GitOps repository.\n* \u0110\u1ec3...","contents":"\u1ede Chapter 5F, ch\u00fang ta \u0111\u00e3 s\u1eed d\u1ee5ng Helm v\u00e0 Argo CD \u0111\u1ec3 qu\u1ea3n l\u00fd ba m\u00f4i tr\u01b0\u1eddng:\n\n```text\nGitHub GitOps Repository\n          \u2193\n        Argo CD\n          \u2193\n      Amazon EKS\n          \u2193\n   Dev \/ Staging \/ Production\n```\n\nTuy nhi\u00ean, image c\u1ee7a c\u00e1c service v\u1eabn ch\u01b0a \u0111\u01b0\u1ee3c k\u1ebft n\u1ed1i ho\u00e0n ch\u1ec9nh v\u1edbi quy tr\u00ecnh CI\/CD.\n\nTrong ph\u1ea7n n\u00e0y, ch\u00fang ta s\u1ebd x\u00e2y d\u1ef1ng flow:\n\n```text\nDeveloper\n    \u2193\nGitHub Application Repository\n    \u2193\nGitHub Actions\n    \u2193\nDocker Build\n    \u2193\nAmazon ECR\n    \u2193\nUpdate image tag trong GitOps Repository\n    \u2193\nArgo CD\n    \u2193\nAmazon EKS\n    \u2193\nGoogle Online Boutique\n```\n\nM\u1ee5c ti\u00eau c\u1ee7a ph\u1ea7n n\u00e0y l\u00e0:\n\n* Build Docker image b\u1eb1ng GitHub Actions.\n* Push image l\u00ean Amazon ECR.\n* S\u1eed d\u1ee5ng Git commit SHA l\u00e0m image tag.\n* C\u1eadp nh\u1eadt image tag trong GitOps repository.\n* \u0110\u1ec3 Argo CD t\u1ef1 \u0111\u1ed9ng tri\u1ec3n khai image m\u1edbi l\u00ean EKS.\n* Kh\u00f4ng s\u1eed d\u1ee5ng `kubectl apply` tr\u1ef1c ti\u1ebfp t\u1eeb CI\/CD.\n* Gi\u1eef GitOps repository l\u00e0 ngu\u1ed3n d\u1eef li\u1ec7u ch\u00ednh c\u1ee7a deployment.\n\n---\n\n## 1. Ki\u1ebfn tr\u00fac tri\u1ec3n khai\n\nSau khi ho\u00e0n th\u00e0nh Chapter 5J, flow s\u1ebd nh\u01b0 sau:\n\n```text\n                 Application Repository\n                         GitHub\n                           \u2502\n                           \u25bc\n                    GitHub Actions\n                           \u2502\n                 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n                 \u25bc                   \u25bc\n              Test              Docker Build\n                                       \u2502\n                                       \u25bc\n                                Amazon ECR\n                                       \u2502\n                                       \u25bc\n                         Update GitOps Repository\n                                       \u2502\n                                       \u25bc\n                              Git commit image tag\n                                       \u2502\n                                       \u25bc\n                              Argo CD detects change\n                                       \u2502\n                                       \u25bc\n                                  Amazon EKS\n                                       \u2502\n                \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n                \u25bc                      \u25bc                      \u25bc\n              Dev                  Staging               Production\n```\n\nTrong ph\u1ea7n n\u00e0y:\n\n* GitHub Actions ch\u1ecbu tr\u00e1ch nhi\u1ec7m **build v\u00e0 push image**.\n* GitOps repository ch\u1ecbu tr\u00e1ch nhi\u1ec7m **l\u01b0u image version c\u1ea7n deploy**.\n* Argo CD ch\u1ecbu tr\u00e1ch nhi\u1ec7m **\u0111\u1ed3ng b\u1ed9 deployment v\u00e0o EKS**.\n* EKS ch\u1ec9 tri\u1ec3n khai image version \u0111\u01b0\u1ee3c khai b\u00e1o trong GitOps repository.\n\n---\n\n## 2. Chu\u1ea9n b\u1ecb repository\n\nCh\u00fang ta s\u1eed d\u1ee5ng hai repository:\n\n### Application repository\n\nRepository ch\u1ee9a source code c\u1ee7a Online Boutique:\n\n```text\nmicroservices-demo\/\n```\n\nV\u00ed d\u1ee5 service:\n\n```text\nsrc\/\n\u251c\u2500\u2500 frontend\/\n\u251c\u2500\u2500 cartservice\/\n\u251c\u2500\u2500 paymentservice\/\n\u251c\u2500\u2500 checkoutservice\/\n\u2514\u2500\u2500 ...\n```\n\n### GitOps repository\n\nRepository \u0111\u00e3 t\u1ea1o \u1edf Chapter 5F:\n\n```text\nonline-boutique-gitops\/\n```\n\nC\u1ea5u tr\u00fac hi\u1ec7n t\u1ea1i c\u00f3 th\u1ec3 t\u01b0\u01a1ng t\u1ef1:\n\n```text\nonline-boutique-gitops\/\n\u251c\u2500\u2500 helm-chart\/\n\u2502   \u251c\u2500\u2500 Chart.yaml\n\u2502   \u251c\u2500\u2500 values.yaml\n\u2502   \u251c\u2500\u2500 values-dev.yaml\n\u2502   \u251c\u2500\u2500 values-staging.yaml\n\u2502   \u251c\u2500\u2500 values-production.yaml\n\u2502   \u2514\u2500\u2500 templates\/\n\u2502       \u251c\u2500\u2500 frontend.yaml\n\u2502       \u251c\u2500\u2500 cartservice.yaml\n\u2502       \u251c\u2500\u2500 paymentservice.yaml\n\u2502       \u2514\u2500\u2500 ...\n\u2502\n\u2514\u2500\u2500 argocd\/\n    \u251c\u2500\u2500 online-boutique-dev.yaml\n    \u251c\u2500\u2500 online-boutique-staging.yaml\n    \u2514\u2500\u2500 online-boutique-production.yaml\n```\n\n---\n\n## 3. Ki\u1ec3m tra Amazon ECR\n\n\u0110\u1eb7t region s\u1eed d\u1ee5ng trong lab:\n\n```bash\nexport AWS_REGION=ap-northeast-1\n```\n\nKi\u1ec3m tra AWS Identity:\n\n```bash\naws sts get-caller-identity\n```\n\nKi\u1ec3m tra danh s\u00e1ch ECR repository:\n\n```bash\naws ecr describe-repositories \\\n  --region \"$AWS_REGION\" \\\n  --query 'repositories[].repositoryName' \\\n  --output table\n```\n\nK\u1ebft qu\u1ea3 c\u00f3 th\u1ec3 t\u01b0\u01a1ng t\u1ef1:\n\n```text\n--------------------------------\n|       DescribeRepositories   |\n+------------------------------+\n|  online-boutique\/frontend    |\n|  online-boutique\/cartservice |\n|  online-boutique\/paymentservice |\n+------------------------------+\n```\n\nN\u1ebfu ch\u01b0a c\u00f3 repository cho `frontend`, t\u1ea1o repository:\n\n```bash\naws ecr create-repository \\\n  --repository-name online-boutique\/frontend \\\n  --region \"$AWS_REGION\"\n```\n\nKi\u1ec3m tra l\u1ea1i:\n\n```bash\naws ecr describe-repositories \\\n  --repository-names online-boutique\/frontend \\\n  --region \"$AWS_REGION\"\n```\n\nL\u1ea5y AWS Account ID:\n\n```bash\nexport AWS_ACCOUNT_ID=$(aws sts get-caller-identity \\\n  --query Account \\\n  --output text)\n```\n\nT\u1ea1o bi\u1ebfn ECR registry:\n\n```bash\nexport ECR_REGISTRY=\"${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com\"\n```\n\nKi\u1ec3m tra:\n\n```bash\necho \"$ECR_REGISTRY\"\n```\n\nV\u00ed d\u1ee5:\n\n```text\n123456789012.dkr.ecr.ap-northeast-1.amazonaws.com\n```\n\n---\n\n## 4. Ki\u1ec3m tra Docker image c\u1ee7a frontend\n\nDi chuy\u1ec3n \u0111\u1ebfn Application repository:\n\n```bash\ncd microservices-demo\n```\n\nKi\u1ec3m tra th\u01b0 m\u1ee5c frontend:\n\n```bash\nls src\/frontend\n```\n\nKi\u1ec3m tra Dockerfile:\n\n```bash\nfind src\/frontend -maxdepth 2 -name 'Dockerfile' -print\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\nsrc\/frontend\/Dockerfile\n```\n\nBuild th\u1eed image local:\n\n```bash\ndocker build \\\n  -t online-boutique-frontend:test \\\n  .\/src\/frontend\n```\n\nKi\u1ec3m tra image:\n\n```bash\ndocker images | grep online-boutique-frontend\n```\n\nN\u1ebfu build th\u00e0nh c\u00f4ng, ti\u1ebfp t\u1ee5c b\u01b0\u1edbc ti\u1ebfp theo.\n\n---\n\n## 5. Ki\u1ec3m tra image repository trong Helm chart\n\nDi chuy\u1ec3n \u0111\u1ebfn GitOps repository:\n\n```bash\ncd ..\/online-boutique-gitops\n```\n\nT\u00ecm c\u1ea5u h\u00ecnh image hi\u1ec7n t\u1ea1i:\n\n```bash\ngrep -Rni \"image:\" helm-chart\n```\n\nHo\u1eb7c:\n\n```bash\ngrep -Rni \"repository:\" helm-chart\n```\n\nM\u1edf file values c\u1ee7a Dev:\n\n```bash\nnano helm-chart\/values-dev.yaml\n```\n\nTh\u00eam ho\u1eb7c \u0111i\u1ec1u ch\u1ec9nh c\u1ea5u h\u00ecnh frontend:\n\n```yaml\nfrontend:\n  image:\n    repository: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com\/online-boutique\/frontend\n    tag: test\n  replicaCount: 1\n```\n\nThay:\n\n```text\n123456789012\n```\n\nb\u1eb1ng AWS Account ID c\u1ee7a b\u1ea1n.\n\n> T\u00ean field `image.repository` v\u00e0 `image.tag` ph\u1ea3i kh\u1edbp v\u1edbi template Helm hi\u1ec7n t\u1ea1i. N\u1ebfu chart \u0111ang s\u1eed d\u1ee5ng t\u00ean field kh\u00e1c, c\u1ea7n s\u1eeda theo c\u1ea5u tr\u00fac chart c\u1ee7a b\u1ea1n.\n\nKi\u1ec3m tra template frontend:\n\n```bash\ngrep -Rni \"Values.frontend\" helm-chart\/templates\n```\n\nV\u00ed d\u1ee5 template c\u1ea7n c\u00f3 logic t\u01b0\u01a1ng t\u1ef1:\n\n```yaml\nimage: \"{{ .Values.frontend.image.repository }}:{{ .Values.frontend.image.tag }}\"\n```\n\nRender Helm chart:\n\n```bash\nhelm template online-boutique-dev \\\n  .\/helm-chart \\\n  --namespace online-boutique-dev \\\n  -f .\/helm-chart\/values.yaml \\\n  -f .\/helm-chart\/values-dev.yaml\n```\n\nN\u1ebfu kh\u00f4ng c\u00f3 l\u1ed7i, ti\u1ebfp t\u1ee5c.\n\n---\n\n## 6. T\u1ea1o c\u1ea5u h\u00ecnh image cho ba m\u00f4i tr\u01b0\u1eddng\n\nM\u1edf file Dev:\n\n```bash\nnano helm-chart\/values-dev.yaml\n```\n\nV\u00ed d\u1ee5:\n\n```yaml\nfrontend:\n  replicaCount: 1\n  image:\n    repository: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com\/online-boutique\/frontend\n    tag: test\n```\n\nM\u1edf file Staging:\n\n```bash\nnano helm-chart\/values-staging.yaml\n```\n\nV\u00ed d\u1ee5:\n\n```yaml\nfrontend:\n  replicaCount: 2\n  image:\n    repository: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com\/online-boutique\/frontend\n    tag: test\n```\n\nM\u1edf file Production:\n\n```bash\nnano helm-chart\/values-production.yaml\n```\n\nV\u00ed d\u1ee5:\n\n```yaml\nfrontend:\n  replicaCount: 3\n  image:\n    repository: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com\/online-boutique\/frontend\n    tag: test\n```\n\n\u1ede b\u01b0\u1edbc \u0111\u1ea7u, c\u1ea3 ba m\u00f4i tr\u01b0\u1eddng d\u00f9ng tag `test`.\n\nSau n\u00e0y GitHub Actions s\u1ebd thay `test` b\u1eb1ng commit SHA:\n\n```text\na81c92f\n```\n\n---\n\n## 7. Ki\u1ec3m tra Helm chart\n\nCh\u1ea1y:\n\n```bash\nhelm lint .\/helm-chart\n```\n\nRender m\u00f4i tr\u01b0\u1eddng Dev:\n\n```bash\nhelm template online-boutique-dev \\\n  .\/helm-chart \\\n  --namespace online-boutique-dev \\\n  -f .\/helm-chart\/values.yaml \\\n  -f .\/helm-chart\/values-dev.yaml \\\n  > \/tmp\/online-boutique-dev.yaml\n```\n\nKi\u1ec3m tra image:\n\n```bash\ngrep -n \"image:\" \/tmp\/online-boutique-dev.yaml\n```\n\nRender Staging:\n\n```bash\nhelm template online-boutique-staging \\\n  .\/helm-chart \\\n  --namespace online-boutique-staging \\\n  -f .\/helm-chart\/values.yaml \\\n  -f .\/helm-chart\/values-staging.yaml \\\n  > \/tmp\/online-boutique-staging.yaml\n```\n\nRender Production:\n\n```bash\nhelm template online-boutique-production \\\n  .\/helm-chart \\\n  --namespace online-boutique-production \\\n  -f .\/helm-chart\/values.yaml \\\n  -f .\/helm-chart\/values-production.yaml \\\n  > \/tmp\/online-boutique-production.yaml\n```\n\nKi\u1ec3m tra image repository:\n\n```bash\ngrep -n \"online-boutique\/frontend\" \\\n  \/tmp\/online-boutique-dev.yaml\n```\n\n---\n\n## 8. Commit c\u1ea5u h\u00ecnh ECR ban \u0111\u1ea7u\n\nKi\u1ec3m tra thay \u0111\u1ed5i:\n\n```bash\ngit status\n```\n\nCommit:\n\n```bash\ngit add helm-chart\ngit commit -m \"configure ECR image repository for frontend\"\n```\n\nPush:\n\n```bash\ngit push origin chapter-5f-multi-environment\n```\n\nArgo CD s\u1ebd ph\u00e1t hi\u1ec7n thay \u0111\u1ed5i trong GitOps repository v\u00e0 \u0111\u1ed3ng b\u1ed9 l\u1ea1i c\u1ea5u h\u00ecnh.\n\nKi\u1ec3m tra Application:\n\n```bash\nargocd app get online-boutique-dev\n```\n\nKi\u1ec3m tra Deployment:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-dev\n```\n\n---\n\n## 9. T\u1ea1o IAM policy cho GitHub Actions\n\nGitHub Actions c\u1ea7n quy\u1ec1n:\n\n* \u0110\u0103ng nh\u1eadp v\u00e0o Amazon ECR.\n* Push Docker image.\n* Ghi c\u00e1c layer c\u1ee7a image.\n* Ki\u1ec3m tra image t\u1ed3n t\u1ea1i.\n\nT\u1ea1o file policy:\n\n```bash\nnano github-actions-ecr-policy.json\n```\n\nTh\u00eam:\n\n```json\n{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Sid\": \"ECRAuthentication\",\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"ecr:GetAuthorizationToken\"\n      ],\n      \"Resource\": \"*\"\n    },\n    {\n      \"Sid\": \"ECRPush\",\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"ecr:BatchCheckLayerAvailability\",\n        \"ecr:CompleteLayerUpload\",\n        \"ecr:InitiateLayerUpload\",\n        \"ecr:PutImage\",\n        \"ecr:UploadLayerPart\",\n        \"ecr:BatchGetImage\",\n        \"ecr:DescribeRepositories\"\n      ],\n      \"Resource\": \"arn:aws:ecr:ap-northeast-1:123456789012:repository\/online-boutique\/frontend\"\n    }\n  ]\n}\n```\n\nThay:\n\n```text\n123456789012\n```\n\nb\u1eb1ng AWS Account ID c\u1ee7a b\u1ea1n.\n\nT\u1ea1o IAM policy:\n\n```bash\naws iam create-policy \\\n  --policy-name GitHubActionsOnlineBoutiqueECRPush \\\n  --policy-document file:\/\/github-actions-ecr-policy.json\n```\n\n> Trong production, n\u00ean s\u1eed d\u1ee5ng GitHub OIDC thay v\u00ec l\u01b0u AWS Access Key d\u00e0i h\u1ea1n trong GitHub Secrets. Ph\u1ea7n n\u00e0y c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c tri\u1ec3n khai th\u00e0nh m\u1ed9t b\u00e0i n\u00e2ng cao ri\u00eang.\n\n---\n\n## 10. T\u1ea1o GitHub Secrets\n\nTrong Application repository, m\u1edf:\n\n```text\nGitHub\n\u2192 Repository\n\u2192 Settings\n\u2192 Secrets and variables\n\u2192 Actions\n\u2192 New repository secret\n```\n\nT\u1ea1o c\u00e1c secret sau:\n\n```text\nAWS_ACCESS_KEY_ID\nAWS_SECRET_ACCESS_KEY\nAWS_REGION\nAWS_ACCOUNT_ID\nGITOPS_REPO\nGH_PAT\n```\n\nV\u00ed d\u1ee5:\n\n```text\nAWS_REGION=ap-northeast-1\nAWS_ACCOUNT_ID=123456789012\nGITOPS_REPO=Juu-dev\/online-boutique-gitops\n```\n\n`GH_PAT` l\u00e0 GitHub Personal Access Token c\u00f3 quy\u1ec1n ghi v\u00e0o GitOps repository.\n\nToken c\u1ea7n c\u00f3 quy\u1ec1n ph\u00f9 h\u1ee3p \u0111\u1ec3:\n\n* Clone GitOps repository.\n* S\u1eeda file values.\n* Commit.\n* Push branch.\n\nKh\u00f4ng \u0111\u01b0a token tr\u1ef1c ti\u1ebfp v\u00e0o file workflow.\n\n---\n\n## 11. T\u1ea1o GitHub Actions workflow\n\nTrong Application repository:\n\n```bash\nmkdir -p .github\/workflows\n```\n\nT\u1ea1o file:\n\n```bash\nnano .github\/workflows\/build-push-update-gitops.yml\n```\n\nTh\u00eam n\u1ed9i dung:\n\n```yaml\nname: Build, Push to ECR and Update GitOps\n\non:\n  push:\n    branches:\n      - main\n    paths:\n      - \"src\/frontend\/**\"\n      - \".github\/workflows\/build-push-update-gitops.yml\"\n\npermissions:\n  contents: read\n\nenv:\n  AWS_REGION: ${{ secrets.AWS_REGION }}\n  AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }}\n  ECR_REPOSITORY: online-boutique\/frontend\n  SERVICE_NAME: frontend\n  GITOPS_REPOSITORY: ${{ secrets.GITOPS_REPO }}\n  GITOPS_BRANCH: chapter-5f-multi-environment\n\njobs:\n  build-push-update:\n    name: Build, Push and Update GitOps\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout application repository\n        uses: actions\/checkout@v4\n\n      - name: Configure AWS credentials\n        uses: aws-actions\/configure-aws-credentials@v4\n        with:\n          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n          aws-region: ${{ env.AWS_REGION }}\n\n      - name: Login to Amazon ECR\n        id: login-ecr\n        uses: aws-actions\/amazon-ecr-login@v2\n\n      - name: Set image variables\n        id: image\n        shell: bash\n        run: |\n          IMAGE_TAG=\"${GITHUB_SHA::7}\"\n          ECR_REGISTRY=\"${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com\"\n          IMAGE_URI=\"${ECR_REGISTRY}\/${ECR_REPOSITORY}:${IMAGE_TAG}\"\n\n          echo \"IMAGE_TAG=${IMAGE_TAG}\" >> \"$GITHUB_OUTPUT\"\n          echo \"IMAGE_URI=${IMAGE_URI}\" >> \"$GITHUB_OUTPUT\"\n\n      - name: Run frontend tests\n        working-directory: src\/frontend\n        run: |\n          echo \"Run frontend tests here\"\n          # Thay b\u1eb1ng l\u1ec7nh test th\u1ef1c t\u1ebf c\u1ee7a frontend n\u1ebfu c\u00f3\n\n      - name: Build Docker image\n        run: |\n          docker build \\\n            -t \"${{ steps.image.outputs.IMAGE_URI }}\" \\\n            .\/src\/frontend\n\n      - name: Push Docker image to ECR\n        run: |\n          docker push \"${{ steps.image.outputs.IMAGE_URI }}\"\n\n      - name: Checkout GitOps repository\n        uses: actions\/checkout@v4\n        with:\n          repository: ${{ env.GITOPS_REPOSITORY }}\n          ref: ${{ env.GITOPS_BRANCH }}\n          token: ${{ secrets.GH_PAT }}\n          path: gitops\n\n      - name: Update Dev image tag\n        working-directory: gitops\n        run: |\n          python3 - <<'PY'\n          from pathlib import Path\n\n          file_path = Path(\"helm-chart\/values-dev.yaml\")\n          content = file_path.read_text()\n\n          old_tag = \"tag: test\"\n          new_tag = \"tag: ${{ steps.image.outputs.IMAGE_TAG }}\"\n\n          if old_tag not in content:\n              raise SystemExit(\"Could not find the expected image tag in values-dev.yaml\")\n\n          file_path.write_text(content.replace(old_tag, new_tag, 1))\n          PY\n\n      - name: Commit and push GitOps change\n        working-directory: gitops\n        run: |\n          git config user.name \"github-actions[bot]\"\n          git config user.email \"41898282+github-actions[bot]@users.noreply.github.com\"\n\n          git add helm-chart\/values-dev.yaml\n\n          git diff --cached --quiet && {\n            echo \"No GitOps changes detected\"\n            exit 0\n          }\n\n          git commit -m \"deploy frontend ${{ steps.image.outputs.IMAGE_TAG }} to dev\"\n          git push origin \"${{ env.GITOPS_BRANCH }}\"\n```\n\nL\u01b0u \u00fd:\n\n* Workflow tr\u00ean ch\u1ec9 c\u1eadp nh\u1eadt m\u00f4i tr\u01b0\u1eddng `dev`.\n* `staging` v\u00e0 `production` s\u1ebd \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt \u1edf c\u00e1c b\u01b0\u1edbc promotion ti\u1ebfp theo.\n* Ph\u1ea7n thay th\u1ebf `tag: test` c\u1ea7n \u0111\u01b0\u1ee3c \u0111i\u1ec1u ch\u1ec9nh n\u1ebfu file values c\u1ee7a b\u1ea1n \u0111ang d\u00f9ng tag kh\u00e1c.\n\n---\n\n## 12. Ki\u1ec3m tra workflow\n\nKi\u1ec3m tra file:\n\n```bash\ncat .github\/workflows\/build-push-update-gitops.yml\n```\n\nCommit workflow:\n\n```bash\ngit add .github\/workflows\/build-push-update-gitops.yml\ngit commit -m \"add ECR build and GitOps update workflow\"\n```\n\nPush l\u00ean branch `main`:\n\n```bash\ngit push origin main\n```\n\nM\u1edf GitHub:\n\n```text\nRepository\n\u2192 Actions\n\u2192 Build, Push to ECR and Update GitOps\n```\n\nTheo d\u00f5i c\u00e1c b\u01b0\u1edbc:\n\n```text\nCheckout application repository\n        \u2193\nConfigure AWS credentials\n        \u2193\nLogin to Amazon ECR\n        \u2193\nRun frontend tests\n        \u2193\nBuild Docker image\n        \u2193\nPush Docker image to ECR\n        \u2193\nCheckout GitOps repository\n        \u2193\nUpdate Dev image tag\n        \u2193\nCommit and push GitOps change\n```\n\n---\n\n## 13. Ki\u1ec3m tra image tr\u00ean ECR\n\nSau khi workflow th\u00e0nh c\u00f4ng, ch\u1ea1y:\n\n```bash\naws ecr list-images \\\n  --repository-name online-boutique\/frontend \\\n  --region \"$AWS_REGION\"\n```\n\nHo\u1eb7c hi\u1ec3n th\u1ecb image tag:\n\n```bash\naws ecr describe-images \\\n  --repository-name online-boutique\/frontend \\\n  --region \"$AWS_REGION\" \\\n  --query 'imageDetails[].imageTags' \\\n  --output table\n```\n\nK\u1ebft qu\u1ea3 c\u00f3 th\u1ec3 t\u01b0\u01a1ng t\u1ef1:\n\n```text\n----------------\n| imageTags    |\n+--------------+\n| a81c92f       |\n| test          |\n+--------------+\n```\n\nL\u1ea5y image digest:\n\n```bash\naws ecr describe-images \\\n  --repository-name online-boutique\/frontend \\\n  --region \"$AWS_REGION\" \\\n  --query 'imageDetails[].{Tags:imageTags,Digest:imageDigest}' \\\n  --output table\n```\n\n---\n\n## 14. Ki\u1ec3m tra GitOps repository\n\nClone ho\u1eb7c c\u1eadp nh\u1eadt GitOps repository:\n\n```bash\ncd ..\/online-boutique-gitops\ngit pull origin chapter-5f-multi-environment\n```\n\nM\u1edf file:\n\n```bash\ncat helm-chart\/values-dev.yaml\n```\n\nKi\u1ec3m tra tag:\n\n```yaml\nfrontend:\n  image:\n    repository: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com\/online-boutique\/frontend\n    tag: a81c92f\n```\n\nTag `a81c92f` ch\u00ednh l\u00e0 7 k\u00fd t\u1ef1 \u0111\u1ea7u c\u1ee7a Git commit SHA.\n\nKi\u1ec3m tra l\u1ecbch s\u1eed commit:\n\n```bash\ngit log --oneline -5\n```\n\nK\u1ebft qu\u1ea3 c\u00f3 th\u1ec3 t\u01b0\u01a1ng t\u1ef1:\n\n```text\na123456 deploy frontend a81c92f to dev\n```\n\n---\n\n## 15. Ki\u1ec3m tra Argo CD\n\nXem tr\u1ea1ng th\u00e1i Application:\n\n```bash\nargocd app get online-boutique-dev\n```\n\nTheo d\u00f5i qu\u00e1 tr\u00ecnh \u0111\u1ed3ng b\u1ed9:\n\n```bash\nargocd app wait online-boutique-dev \\\n  --sync \\\n  --health\n```\n\nKi\u1ec3m tra Deployment:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-dev\n```\n\nKi\u1ec3m tra Pod:\n\n```bash\nkubectl get pods \\\n  -n online-boutique-dev \\\n  -l app=frontend\n```\n\nKi\u1ec3m tra image th\u1ef1c t\u1ebf \u0111ang ch\u1ea1y:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-dev \\\n  -o jsonpath='{.spec.template.spec.containers[*].image}'\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\n123456789012.dkr.ecr.ap-northeast-1.amazonaws.com\/online-boutique\/frontend:a81c92f\n```\n\nKi\u1ec3m tra image c\u1ee7a Pod:\n\n```bash\nkubectl get pod \\\n  -n online-boutique-dev \\\n  -l app=frontend \\\n  -o jsonpath='{.items[0].status.containerStatuses[*].imageID}'\n```\n\n---\n\n## 16. Ki\u1ec3m tra to\u00e0n b\u1ed9 flow\n\nTh\u1ef1c hi\u1ec7n m\u1ed9t thay \u0111\u1ed5i nh\u1ecf trong frontend:\n\n```bash\ncd ..\/microservices-demo\n```\n\nV\u00ed d\u1ee5 ch\u1ec9nh s\u1eeda m\u1ed9t file frontend:\n\n```bash\nnano src\/frontend\/some-file\n```\n\nCommit:\n\n```bash\ngit add src\/frontend\ngit commit -m \"update frontend\"\n```\n\nPush:\n\n```bash\ngit push origin main\n```\n\nKi\u1ec3m tra flow:\n\n```text\nGit push\n   \u2193\nGitHub Actions\n   \u2193\nDocker Build\n   \u2193\nPush image l\u00ean ECR\n   \u2193\nC\u1eadp nh\u1eadt values-dev.yaml\n   \u2193\nGitOps commit\n   \u2193\nArgo CD sync\n   \u2193\nEKS rollout\n```\n\nTheo d\u00f5i rollout:\n\n```bash\nkubectl rollout status deployment\/frontend \\\n  -n online-boutique-dev\n```\n\nKi\u1ec3m tra ReplicaSet:\n\n```bash\nkubectl get replicasets \\\n  -n online-boutique-dev\n```\n\nKi\u1ec3m tra th\u1eddi gian deploy:\n\n```bash\nkubectl rollout history deployment\/frontend \\\n  -n online-boutique-dev\n```\n\n---\n\n## 17. Ki\u1ec3m tra GitOps drift\n\nTh\u1eed thay \u0111\u1ed5i image tr\u1ef1c ti\u1ebfp trong cluster:\n\n```bash\nkubectl set image deployment\/frontend \\\n  frontend=nginx:latest \\\n  -n online-boutique-dev\n```\n\nKi\u1ec3m tra image:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-dev \\\n  -o jsonpath='{.spec.template.spec.containers[*].image}'\n```\n\nArgo CD s\u1ebd ph\u00e1t hi\u1ec7n tr\u1ea1ng th\u00e1i th\u1ef1c t\u1ebf kh\u00e1c v\u1edbi Git.\n\nKi\u1ec3m tra:\n\n```bash\nargocd app get online-boutique-dev\n```\n\nN\u1ebfu `selfHeal: true` \u0111ang b\u1eadt, Argo CD s\u1ebd \u0111\u01b0a Deployment v\u1ec1 image \u0111\u01b0\u1ee3c khai b\u00e1o trong GitOps repository.\n\nKi\u1ec3m tra l\u1ea1i:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-dev \\\n  -o jsonpath='{.spec.template.spec.containers[*].image}'\n```\n\nK\u1ebft qu\u1ea3 c\u1ea7n quay v\u1ec1:\n\n```text\n123456789012.dkr.ecr.ap-northeast-1.amazonaws.com\/online-boutique\/frontend:a81c92f\n```\n\n---\n\n## 18. T\u00e1ch promotion Dev \u2192 Staging \u2192 Production\n\n\u1ede b\u01b0\u1edbc tr\u01b0\u1edbc, GitHub Actions ch\u1ec9 c\u1eadp nh\u1eadt Dev.\n\nFlow hi\u1ec7n t\u1ea1i:\n\n```text\nBuild image\n    \u2193\nPush ECR\n    \u2193\nUpdate Dev\n    \u2193\nArgo CD deploy Dev\n```\n\nSau khi Dev \u0111\u01b0\u1ee3c ki\u1ec3m tra th\u00e0nh c\u00f4ng, ch\u00fang ta c\u00f3 th\u1ec3 promote c\u00f9ng image tag sang Staging.\n\nV\u00ed d\u1ee5 m\u1edf file:\n\n```bash\nnano helm-chart\/values-staging.yaml\n```\n\nThay:\n\n```yaml\nfrontend:\n  image:\n    tag: test\n```\n\nth\u00e0nh:\n\n```yaml\nfrontend:\n  image:\n    tag: a81c92f\n```\n\nCommit:\n\n```bash\ngit add helm-chart\/values-staging.yaml\ngit commit -m \"promote frontend a81c92f to staging\"\ngit push origin chapter-5f-multi-environment\n```\n\nKi\u1ec3m tra:\n\n```bash\nargocd app get online-boutique-staging\n```\n\nSau khi Staging \u0111\u01b0\u1ee3c ki\u1ec3m tra, promote c\u00f9ng tag sang Production:\n\n```bash\nnano helm-chart\/values-production.yaml\n```\n\nThay:\n\n```yaml\nfrontend:\n  image:\n    tag: test\n```\n\nth\u00e0nh:\n\n```yaml\nfrontend:\n  image:\n    tag: a81c92f\n```\n\nCommit:\n\n```bash\ngit add helm-chart\/values-production.yaml\ngit commit -m \"promote frontend a81c92f to production\"\ngit push origin chapter-5f-multi-environment\n```\n\n\u0110i\u1ec3m quan tr\u1ecdng:\n\n```text\nKh\u00f4ng build l\u1ea1i image cho t\u1eebng m\u00f4i tr\u01b0\u1eddng.\n```\n\nCh\u00fang ta s\u1eed d\u1ee5ng c\u00f9ng m\u1ed9t image:\n\n```text\nfrontend:a81c92f\n```\n\ncho:\n\n```text\nDev\n \u2193\nStaging\n \u2193\nProduction\n```\n\n---\n\n## 19. Ki\u1ec3m tra rollback b\u1eb1ng Git\n\nGi\u1ea3 s\u1eed image m\u1edbi g\u00e2y l\u1ed7i:\n\n```text\nfrontend:a81c92f\n```\n\nT\u00ecm commit tr\u01b0\u1edbc \u0111\u00f3:\n\n```bash\ngit log --oneline -- helm-chart\/values-production.yaml\n```\n\nRollback b\u1eb1ng Git revert:\n\n```bash\ngit revert <COMMIT_ID>\n```\n\nPush:\n\n```bash\ngit push origin chapter-5f-multi-environment\n```\n\nArgo CD s\u1ebd ph\u00e1t hi\u1ec7n commit m\u1edbi v\u00e0 tri\u1ec3n khai l\u1ea1i image version c\u0169.\n\nKi\u1ec3m tra:\n\n```bash\nargocd app get online-boutique-production\n```\n\nKi\u1ec3m tra image:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-production \\\n  -o jsonpath='{.spec.template.spec.containers[*].image}'\n```\n\n---\n\n## 20. Ki\u1ec3m tra cu\u1ed1i c\u00f9ng\n\n### Ki\u1ec3m tra ECR\n\n```bash\naws ecr describe-images \\\n  --repository-name online-boutique\/frontend \\\n  --region \"$AWS_REGION\"\n```\n\n### Ki\u1ec3m tra GitOps\n\n```bash\ngit log --oneline -5\n```\n\n### Ki\u1ec3m tra Argo CD\n\n```bash\nargocd app list\n```\n\n### Ki\u1ec3m tra EKS\n\n```bash\nkubectl get pods -n online-boutique-dev\nkubectl get pods -n online-boutique-staging\nkubectl get pods -n online-boutique-production\n```\n\n### Ki\u1ec3m tra image c\u1ee7a t\u1eebng m\u00f4i tr\u01b0\u1eddng\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-dev \\\n  -o jsonpath='{.spec.template.spec.containers[*].image}'\n```\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-staging \\\n  -o jsonpath='{.spec.template.spec.containers[*].image}'\n```\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-production \\\n  -o jsonpath='{.spec.template.spec.containers[*].image}'\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\nDev        \u2192 frontend:a81c92f\nStaging    \u2192 frontend:a81c92f\nProduction \u2192 frontend:a81c92f\n```\n\n---\n\n## 21. Ki\u1ebfn tr\u00fac cu\u1ed1i Chapter 5J\n\n```text\n                    Developer\n                        \u2502\n                        \u25bc\n                GitHub Application Repo\n                        \u2502\n                        \u25bc\n                 GitHub Actions\n                        \u2502\n             \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n             \u25bc                     \u25bc\n          Test                Docker Build\n                                    \u2502\n                                    \u25bc\n                              Amazon ECR\n                                    \u2502\n                                    \u25bc\n                         Image tag t\u1eeb Git SHA\n                                    \u2502\n                                    \u25bc\n                         GitOps Repository\n                                    \u2502\n                                    \u25bc\n                                Argo CD\n                                    \u2502\n                                    \u25bc\n                              Amazon EKS\n                                    \u2502\n              \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n              \u25bc                     \u25bc                     \u25bc\n             Dev                 Staging              Production\n```\n\n## K\u1ebft qu\u1ea3 \u0111\u1ea1t \u0111\u01b0\u1ee3c\n\nSau Chapter 5J:\n\n* GitHub Actions build Docker image.\n* Docker image \u0111\u01b0\u1ee3c l\u01b0u trong Amazon ECR.\n* Image tag \u0111\u01b0\u1ee3c t\u1ea1o t\u1eeb Git commit SHA.\n* GitOps repository l\u01b0u image version c\u1ea7n tri\u1ec3n khai.\n* Argo CD t\u1ef1 \u0111\u1ed9ng \u0111\u1ed3ng b\u1ed9 thay \u0111\u1ed5i t\u1eeb Git.\n* EKS tri\u1ec3n khai image t\u1eeb ECR.\n* Dev, Staging v\u00e0 Production s\u1eed d\u1ee5ng c\u00f9ng m\u1ed9t artifact.\n* C\u00f3 th\u1ec3 rollback b\u1eb1ng `git revert`.\n* Kh\u00f4ng c\u1ea7n ch\u1ea1y `kubectl apply` tr\u1ef1c ti\u1ebfp t\u1eeb GitHub Actions.\n\n\u0110\u00e2y l\u00e0 flow:\n\n```text\nBuild once\n    \u2193\nStore in ECR\n    \u2193\nPromote through Git\n    \u2193\nDeploy with Argo CD\n```\n\n**L\u01b0u \u00fd:** Trong production th\u1ef1c t\u1ebf, n\u00ean thay AWS Access Key b\u1eb1ng GitHub OIDC, s\u1eed d\u1ee5ng image digest thay v\u00ec ch\u1ec9 image tag, b\u1eadt ECR image scanning, v\u00e0 thi\u1ebft l\u1eadp approval tr\u01b0\u1edbc khi promote Production.","published_at":"2026-09-14T13:04:32.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T23:11:03.000000Z","edited_at":"2026-09-14T13:03:49.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":7,"points":0,"views_count":13,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/c3a35e6b-5754-4706-9346-2265dea86266.png","user":{"data":{"id":98940,"url":"https:\/\/viblo.asia\/u\/Juu-dev","avatar":"25478754-6f7c-425c-a27d-bd61fabc134e.jpg","name":"Th\u1ed1ng PM","username":"Juu-dev","followers_count":82,"reputation":1444,"posts_count":190,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"amazon-ecr","name":"Amazon ECR"},{"slug":"amazon-eks","name":"Amazon EKS"},{"slug":"gitops","name":"gitops"}]},"commentators":{"data":[]}},{"id":106663,"title":"\ud83d\ude80 Chapter 5 \u2014 Platform: Ph\u1ea7n F \u2014 Qu\u1ea3n l\u00fd nhi\u1ec1u m\u00f4i tr\u01b0\u1eddng Dev, Staging v\u00e0 Production b\u1eb1ng Helm v\u00e0 Argo CD tr\u00ean Amazon EKS","slug":"RlL5ePQmLbB","url":"https:\/\/viblo.asia\/p\/chapter-5-platform-phan-f-quan-ly-nhieu-moi-truong-dev-staging-va-production-bang-helm-va-argo-cd-tren-amazon-eks-RlL5ePQmLbB","user_id":98940,"moderation":null,"transliterated":"chapter-5-platform-phan-f-quan-ly-nhieu-moi-truong-dev-staging-va-production-bang-helm-va-argo-cd-tren-amazon-eks","contents_short":"\u1ede Chapter 5E, ch\u00fang ta \u0111\u00e3 tri\u1ec3n khai Google Online Boutique l\u00ean Amazon EKS b\u1eb1ng Argo CD v\u00e0 GitOps.\n\nFlow hi\u1ec7n t\u1ea1i:\n\nTuy nhi\u00ean, h\u1ec7 th\u1ed1ng hi\u1ec7n t\u1ea1i m\u1edbi ch\u1ec9 c\u00f3 m\u1ed9t m\u00f4i tr\u01b0\u1eddng:\n\nTrong h\u1ec7 th\u1ed1ng th\u1ef1c t\u1ebf, ch\u00fang ta th\u01b0\u1eddng c\u1ea7n nhi\u1ec1u m\u00f4i tr\u01b0\u1eddng:\n\nM\u1ed7i m\u00f4i tr\u01b0\u1eddng c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng:\n\n* S\u1ed1 l\u01b0\u1ee3ng replica kh\u00e1c nhau\n* Image tag kh\u00e1c nhau\n* Resource request\/limit kh\u00e1c nhau\n* Domain kh\u00e1c nhau\n* C\u1ea5u h\u00ecnh kh\u00e1c nhau\n* Q...","contents":"\u1ede **Chapter 5E**, ch\u00fang ta \u0111\u00e3 tri\u1ec3n khai Google Online Boutique l\u00ean Amazon EKS b\u1eb1ng Argo CD v\u00e0 GitOps.\n\nFlow hi\u1ec7n t\u1ea1i:\n\n```text\nDeveloper\n    \u2193\nGitHub\n    \u2193\nArgo CD\n    \u2193\nHelm\n    \u2193\nAmazon EKS\n    \u2193\nGoogle Online Boutique\n```\n\nTuy nhi\u00ean, h\u1ec7 th\u1ed1ng hi\u1ec7n t\u1ea1i m\u1edbi ch\u1ec9 c\u00f3 m\u1ed9t m\u00f4i tr\u01b0\u1eddng:\n\n```text\nEKS\n\u2514\u2500\u2500 online-boutique\n```\n\nTrong h\u1ec7 th\u1ed1ng th\u1ef1c t\u1ebf, ch\u00fang ta th\u01b0\u1eddng c\u1ea7n nhi\u1ec1u m\u00f4i tr\u01b0\u1eddng:\n\n```text\nDevelopment\nStaging\nProduction\n```\n\nM\u1ed7i m\u00f4i tr\u01b0\u1eddng c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng:\n\n* S\u1ed1 l\u01b0\u1ee3ng replica kh\u00e1c nhau\n* Image tag kh\u00e1c nhau\n* Resource request\/limit kh\u00e1c nhau\n* Domain kh\u00e1c nhau\n* C\u1ea5u h\u00ecnh kh\u00e1c nhau\n* Quy t\u1eafc tri\u1ec3n khai kh\u00e1c nhau\n\nTrong Chapter 5F, ch\u00fang ta s\u1ebd m\u1edf r\u1ed9ng GitOps t\u1eeb m\u1ed9t m\u00f4i tr\u01b0\u1eddng th\u00e0nh nhi\u1ec1u m\u00f4i tr\u01b0\u1eddng b\u1eb1ng **Helm + Argo CD + Amazon EKS**.\n\n---\n\n## 1. M\u1ee5c ti\u00eau\n\nSau khi ho\u00e0n th\u00e0nh Chapter 5F, ch\u00fang ta s\u1ebd c\u00f3:\n\n* M\u1ed9t Helm chart d\u00f9ng chung cho Online Boutique.\n* Ba m\u00f4i tr\u01b0\u1eddng `dev`, `staging` v\u00e0 `production`.\n* C\u1ea5u h\u00ecnh ri\u00eang cho t\u1eebng m\u00f4i tr\u01b0\u1eddng.\n* M\u1ed9t Argo CD Application cho m\u1ed7i m\u00f4i tr\u01b0\u1eddng.\n* Dev t\u1ef1 \u0111\u1ed9ng \u0111\u1ed3ng b\u1ed9 t\u1eeb Git.\n* Staging v\u00e0 Production c\u00f3 th\u1ec3 y\u00eau c\u1ea7u approval tr\u01b0\u1edbc khi tri\u1ec3n khai.\n* Ki\u1ec3m tra \u0111\u01b0\u1ee3c tr\u1ea1ng th\u00e1i t\u1eebng m\u00f4i tr\u01b0\u1eddng.\n* Thay \u0111\u1ed5i image tag b\u1eb1ng Git.\n* Rollback b\u1eb1ng Git revert.\n\nKi\u1ebfn tr\u00fac cu\u1ed1i Chapter:\n\n```text\n                         GitHub\n                            \u2502\n             \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n             \u25bc              \u25bc              \u25bc\n           Dev           Staging        Production\n             \u2502              \u2502              \u2502\n             \u25bc              \u25bc              \u25bc\n         Argo CD        Argo CD        Argo CD\n             \u2502              \u2502              \u2502\n             \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                            \u25bc\n                       Amazon EKS\n                            \u2502\n             \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n             \u25bc              \u25bc              \u25bc\n          Namespace       Namespace      Namespace\n             dev          staging       production\n```\n\nTrong lab n\u00e0y, ch\u00fang ta s\u1eed d\u1ee5ng **m\u1ed9t EKS cluster v\u1edbi ba namespace** \u0111\u1ec3 ti\u1ebft ki\u1ec7m chi ph\u00ed:\n\n```text\nAmazon EKS\n\u251c\u2500\u2500 online-boutique-dev\n\u251c\u2500\u2500 online-boutique-staging\n\u2514\u2500\u2500 online-boutique-production\n```\n\n> M\u00f4 h\u00ecnh m\u1ed9t cluster, nhi\u1ec1u namespace ph\u00f9 h\u1ee3p cho lab. Trong production th\u1ef1c t\u1ebf, c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng nhi\u1ec1u EKS cluster \u0111\u1ec3 c\u00f4 l\u1eadp c\u00e1c m\u00f4i tr\u01b0\u1eddng.\n\n---\n\n## 2. \u0110i\u1ec1u ki\u1ec7n tr\u01b0\u1edbc khi b\u1eaft \u0111\u1ea7u\n\nB\u1ea1n c\u1ea7n ho\u00e0n th\u00e0nh Chapter 5E v\u00e0 c\u00f3:\n\n* Amazon EKS \u0111ang \u1edf tr\u1ea1ng th\u00e1i `ACTIVE`.\n* `kubectl` k\u1ebft n\u1ed1i \u0111\u01b0\u1ee3c v\u1edbi EKS.\n* Helm \u0111\u00e3 \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t.\n* Argo CD \u0111\u00e3 \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t tr\u00ean EKS.\n* Argo CD CLI \u0111\u00e3 \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t.\n* Google Online Boutique \u0111\u00e3 \u0111\u01b0\u1ee3c tri\u1ec3n khai th\u00e0nh c\u00f4ng.\n* Git \u0111\u00e3 \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t.\n* GitHub repository `online-boutique-gitops`.\n\nKi\u1ec3m tra c\u00f4ng c\u1ee5:\n\n```bash\naws --version\nkubectl version --client\nhelm version\nargocd version --client\ngit --version\n```\n\nKi\u1ec3m tra EKS:\n\n```bash\naws eks describe-cluster \\\n  --name online-boutique-eks \\\n  --region ap-northeast-1 \\\n  --query 'cluster.status' \\\n  --output text\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\nACTIVE\n```\n\nKi\u1ec3m tra node:\n\n```bash\nkubectl get nodes\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\nNAME                                             STATUS   ROLES    AGE   VERSION\nip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal   Ready    <none>   ...   ...\n```\n\nKi\u1ec3m tra Argo CD:\n\n```bash\nkubectl get pods -n argocd\n```\n\nKi\u1ec3m tra Helm chart trong repository:\n\n```bash\ncd online-boutique-gitops\n\nhelm lint .\/helm-chart\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\n1 chart(s) linted, 0 chart(s) failed\n```\n\n---\n\n## 3. Ki\u1ec3m tra c\u1ea5u tr\u00fac repository hi\u1ec7n t\u1ea1i\n\nRepository sau Chapter 5E c\u00f3 th\u1ec3 c\u00f3 c\u1ea5u tr\u00fac:\n\n```text\nonline-boutique-gitops\/\n\u251c\u2500\u2500 helm-chart\/\n\u2502   \u251c\u2500\u2500 Chart.yaml\n\u2502   \u251c\u2500\u2500 values.yaml\n\u2502   \u2514\u2500\u2500 templates\/\n\u2502       \u251c\u2500\u2500 frontend.yaml\n\u2502       \u251c\u2500\u2500 cartservice.yaml\n\u2502       \u251c\u2500\u2500 paymentservice.yaml\n\u2502       \u2514\u2500\u2500 ...\n\u2502\n\u251c\u2500\u2500 environments\/\n\u2502   \u2514\u2500\u2500 dev\/\n\u2502       \u2514\u2500\u2500 values.yaml\n\u2502\n\u2514\u2500\u2500 argocd\/\n    \u2514\u2500\u2500 online-boutique-dev.yaml\n```\n\nTrong Chapter 5F, ch\u00fang ta s\u1ebd m\u1edf r\u1ed9ng th\u00e0nh:\n\n```text\nonline-boutique-gitops\/\n\u251c\u2500\u2500 helm-chart\/\n\u2502   \u251c\u2500\u2500 Chart.yaml\n\u2502   \u251c\u2500\u2500 values.yaml\n\u2502   \u251c\u2500\u2500 values-dev.yaml\n\u2502   \u251c\u2500\u2500 values-staging.yaml\n\u2502   \u251c\u2500\u2500 values-production.yaml\n\u2502   \u2514\u2500\u2500 templates\/\n\u2502       \u251c\u2500\u2500 frontend.yaml\n\u2502       \u251c\u2500\u2500 cartservice.yaml\n\u2502       \u251c\u2500\u2500 paymentservice.yaml\n\u2502       \u251c\u2500\u2500 checkoutservice.yaml\n\u2502       \u2514\u2500\u2500 ...\n\u2502\n\u2514\u2500\u2500 argocd\/\n    \u251c\u2500\u2500 online-boutique-dev.yaml\n    \u251c\u2500\u2500 online-boutique-staging.yaml\n    \u2514\u2500\u2500 online-boutique-production.yaml\n```\n\nTrong ph\u1ea7n n\u00e0y, ch\u00fang ta \u0111\u1eb7t c\u00e1c file values trong th\u01b0 m\u1ee5c `helm-chart` \u0111\u1ec3 Helm v\u00e0 Argo CD d\u1ec5 d\u00e0ng x\u1eed l\u00fd.\n\n---\n\n## 4. T\u1ea1o branch m\u1edbi cho Chapter 5F\n\nDi chuy\u1ec3n v\u00e0o GitOps repository:\n\n```bash\ncd online-boutique-gitops\n```\n\nKi\u1ec3m tra branch hi\u1ec7n t\u1ea1i:\n\n```bash\ngit branch\n```\n\nT\u1ea1o branch m\u1edbi:\n\n```bash\ngit checkout -b chapter-5f-multi-environment\n```\n\n---\n\n## 5. T\u1ea1o file values cho m\u00f4i tr\u01b0\u1eddng Dev\n\nT\u1ea1o file:\n\n```bash\ntouch helm-chart\/values-dev.yaml\n```\n\nM\u1edf file:\n\n```bash\nnano helm-chart\/values-dev.yaml\n```\n\nTh\u00eam n\u1ed9i dung m\u1eabu:\n\n```yaml\nfrontend:\n  replicaCount: 1\n\ncartservice:\n  replicaCount: 1\n\npaymentservice:\n  replicaCount: 1\n```\n\n> C\u00e1c field nh\u01b0 `replicaCount` ph\u1ea3i t\u1ed3n t\u1ea1i trong Helm chart c\u1ee7a b\u1ea1n. N\u1ebfu chart kh\u00f4ng h\u1ed7 tr\u1ee3 field n\u00e0y, c\u1ea7n s\u1eeda template tr\u01b0\u1edbc khi s\u1eed d\u1ee5ng.\n\nKi\u1ec3m tra c\u1ea5u h\u00ecnh hi\u1ec7n t\u1ea1i:\n\n```bash\nhelm show values .\/helm-chart\n```\n\nRender chart:\n\n```bash\nhelm template online-boutique-dev .\/helm-chart \\\n  --namespace online-boutique-dev \\\n  -f .\/helm-chart\/values-dev.yaml\n```\n\nN\u1ebfu kh\u00f4ng c\u00f3 l\u1ed7i, ti\u1ebfp t\u1ee5c b\u01b0\u1edbc ti\u1ebfp theo.\n\n---\n\n## 6. T\u1ea1o file values cho m\u00f4i tr\u01b0\u1eddng Staging\n\nT\u1ea1o file:\n\n```bash\ntouch helm-chart\/values-staging.yaml\n```\n\nM\u1edf file:\n\n```bash\nnano helm-chart\/values-staging.yaml\n```\n\nTh\u00eam n\u1ed9i dung:\n\n```yaml\nfrontend:\n  replicaCount: 2\n\ncartservice:\n  replicaCount: 2\n\npaymentservice:\n  replicaCount: 1\n```\n\nRender chart:\n\n```bash\nhelm template online-boutique-staging .\/helm-chart \\\n  --namespace online-boutique-staging \\\n  -f .\/helm-chart\/values-staging.yaml\n```\n\nKi\u1ec3m tra k\u1ebft qu\u1ea3:\n\n```bash\nhelm template online-boutique-staging .\/helm-chart \\\n  --namespace online-boutique-staging \\\n  -f .\/helm-chart\/values-staging.yaml \\\n  > \/tmp\/online-boutique-staging.yaml\n```\n\nKi\u1ec3m tra s\u1ed1 l\u01b0\u1ee3ng replica:\n\n```bash\ngrep -n \"replicas:\" \/tmp\/online-boutique-staging.yaml\n```\n\n---\n\n## 7. T\u1ea1o file values cho m\u00f4i tr\u01b0\u1eddng Production\n\nT\u1ea1o file:\n\n```bash\ntouch helm-chart\/values-production.yaml\n```\n\nM\u1edf file:\n\n```bash\nnano helm-chart\/values-production.yaml\n```\n\nTh\u00eam n\u1ed9i dung:\n\n```yaml\nfrontend:\n  replicaCount: 3\n\ncartservice:\n  replicaCount: 2\n\npaymentservice:\n  replicaCount: 2\n```\n\nRender chart:\n\n```bash\nhelm template online-boutique-production .\/helm-chart \\\n  --namespace online-boutique-production \\\n  -f .\/helm-chart\/values-production.yaml\n```\n\nKi\u1ec3m tra chart:\n\n```bash\nhelm lint .\/helm-chart\n```\n\nKi\u1ec3m tra c\u1ea3 ba file values:\n\n```bash\nhelm template online-boutique-dev .\/helm-chart \\\n  -f .\/helm-chart\/values-dev.yaml > \/tmp\/dev.yaml\n\nhelm template online-boutique-staging .\/helm-chart \\\n  -f .\/helm-chart\/values-staging.yaml > \/tmp\/staging.yaml\n\nhelm template online-boutique-production .\/helm-chart \\\n  -f .\/helm-chart\/values-production.yaml > \/tmp\/production.yaml\n```\n\nN\u1ebfu c\u1ea3 ba l\u1ec7nh \u0111\u1ec1u ch\u1ea1y th\u00e0nh c\u00f4ng, ti\u1ebfp t\u1ee5c.\n\n---\n\n## 8. T\u1ea1o namespace cho ba m\u00f4i tr\u01b0\u1eddng\n\nCh\u1ea1y:\n\n```bash\nkubectl create namespace online-boutique-dev\n```\n\n```bash\nkubectl create namespace online-boutique-staging\n```\n\n```bash\nkubectl create namespace online-boutique-production\n```\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get namespaces\n```\n\nK\u1ebft qu\u1ea3 c\u1ea7n c\u00f3:\n\n```text\nNAME                       STATUS   AGE\nonline-boutique-dev        Active   ...\nonline-boutique-staging    Active   ...\nonline-boutique-production Active   ...\n```\n\nN\u1ebfu namespace \u0111\u00e3 t\u1ed3n t\u1ea1i, c\u00f3 th\u1ec3 b\u1ecf qua l\u1ed7i.\n\n---\n\n## 9. T\u1ea1o Argo CD Application cho Dev\n\nT\u1ea1o th\u01b0 m\u1ee5c:\n\n```bash\nmkdir -p argocd\n```\n\nT\u1ea1o file:\n\n```bash\ntouch argocd\/online-boutique-dev.yaml\n```\n\nM\u1edf file:\n\n```bash\nnano argocd\/online-boutique-dev.yaml\n```\n\nTh\u00eam n\u1ed9i dung:\n\n```yaml\napiVersion: argoproj.io\/v1alpha1\nkind: Application\nmetadata:\n  name: online-boutique-dev\n  namespace: argocd\nspec:\n  project: default\n\n  source:\n    repoURL: https:\/\/github.com\/<YOUR_GITHUB_USERNAME>\/online-boutique-gitops.git\n    targetRevision: chapter-5f-multi-environment\n    path: helm-chart\n    helm:\n      valueFiles:\n        - values-dev.yaml\n\n  destination:\n    server: https:\/\/kubernetes.default.svc\n    namespace: online-boutique-dev\n\n  syncPolicy:\n    automated:\n      prune: true\n      selfHeal: true\n    syncOptions:\n      - CreateNamespace=true\n```\n\nThay:\n\n```text\n<YOUR_GITHUB_USERNAME>\n```\n\nb\u1eb1ng GitHub username c\u1ee7a b\u1ea1n.\n\nDev s\u1ebd s\u1eed d\u1ee5ng:\n\n```text\nBranch: chapter-5f-multi-environment\nValues: values-dev.yaml\nNamespace: online-boutique-dev\n```\n\n---\n\n## 10. T\u1ea1o Argo CD Application cho Staging\n\nT\u1ea1o file:\n\n```bash\ntouch argocd\/online-boutique-staging.yaml\n```\n\nM\u1edf file:\n\n```bash\nnano argocd\/online-boutique-staging.yaml\n```\n\nTh\u00eam n\u1ed9i dung:\n\n```yaml\napiVersion: argoproj.io\/v1alpha1\nkind: Application\nmetadata:\n  name: online-boutique-staging\n  namespace: argocd\nspec:\n  project: default\n\n  source:\n    repoURL: https:\/\/github.com\/<YOUR_GITHUB_USERNAME>\/online-boutique-gitops.git\n    targetRevision: chapter-5f-multi-environment\n    path: helm-chart\n    helm:\n      valueFiles:\n        - values-staging.yaml\n\n  destination:\n    server: https:\/\/kubernetes.default.svc\n    namespace: online-boutique-staging\n\n  syncPolicy:\n    automated:\n      prune: true\n      selfHeal: true\n    syncOptions:\n      - CreateNamespace=true\n```\n\nStaging s\u1ebd s\u1eed d\u1ee5ng:\n\n```text\nBranch: chapter-5f-multi-environment\nValues: values-staging.yaml\nNamespace: online-boutique-staging\n```\n\n---\n\n## 11. T\u1ea1o Argo CD Application cho Production\n\nT\u1ea1o file:\n\n```bash\ntouch argocd\/online-boutique-production.yaml\n```\n\nM\u1edf file:\n\n```bash\nnano argocd\/online-boutique-production.yaml\n```\n\nTh\u00eam n\u1ed9i dung:\n\n```yaml\napiVersion: argoproj.io\/v1alpha1\nkind: Application\nmetadata:\n  name: online-boutique-production\n  namespace: argocd\nspec:\n  project: default\n\n  source:\n    repoURL: https:\/\/github.com\/<YOUR_GITHUB_USERNAME>\/online-boutique-gitops.git\n    targetRevision: chapter-5f-multi-environment\n    path: helm-chart\n    helm:\n      valueFiles:\n        - values-production.yaml\n\n  destination:\n    server: https:\/\/kubernetes.default.svc\n    namespace: online-boutique-production\n\n  syncPolicy:\n    automated:\n      prune: true\n      selfHeal: true\n    syncOptions:\n      - CreateNamespace=true\n```\n\nProduction s\u1ebd s\u1eed d\u1ee5ng:\n\n```text\nBranch: chapter-5f-multi-environment\nValues: values-production.yaml\nNamespace: online-boutique-production\n```\n\n> Trong ph\u1ea7n lab c\u01a1 b\u1ea3n, Production c\u0169ng \u0111ang b\u1eadt `automated sync`. \u1ede ph\u1ea7n n\u00e2ng cao, ch\u00fang ta s\u1ebd t\u1eaft automated sync \u0111\u1ec3 m\u00f4 ph\u1ecfng quy tr\u00ecnh approval tr\u01b0\u1edbc khi tri\u1ec3n khai Production.\n\n---\n\n## 12. Ki\u1ec3m tra c\u1ea5u h\u00ecnh YAML\n\nKi\u1ec3m tra c\u00e1c file:\n\n```bash\ncat argocd\/online-boutique-dev.yaml\ncat argocd\/online-boutique-staging.yaml\ncat argocd\/online-boutique-production.yaml\n```\n\nN\u1ebfu m\u00e1y \u0111\u00e3 c\u00e0i `yamllint`, c\u00f3 th\u1ec3 ch\u1ea1y:\n\n```bash\nyamllint argocd\/\n```\n\nKi\u1ec3m tra Helm chart:\n\n```bash\nhelm lint .\/helm-chart\n```\n\nKi\u1ec3m tra t\u1eebng environment:\n\n```bash\nhelm template online-boutique-dev .\/helm-chart \\\n  -f .\/helm-chart\/values-dev.yaml \\\n  --namespace online-boutique-dev\n```\n\n```bash\nhelm template online-boutique-staging .\/helm-chart \\\n  -f .\/helm-chart\/values-staging.yaml \\\n  --namespace online-boutique-staging\n```\n\n```bash\nhelm template online-boutique-production .\/helm-chart \\\n  -f .\/helm-chart\/values-production.yaml \\\n  --namespace online-boutique-production\n```\n\n---\n\n## 13. Commit v\u00e0 push GitOps repository\n\nKi\u1ec3m tra thay \u0111\u1ed5i:\n\n```bash\ngit status\n```\n\nTh\u00eam file:\n\n```bash\ngit add helm-chart argocd\n```\n\nCommit:\n\n```bash\ngit commit -m \"add multi-environment GitOps configuration\"\n```\n\nPush branch:\n\n```bash\ngit push -u origin chapter-5f-multi-environment\n```\n\nKi\u1ec3m tra branch tr\u00ean GitHub.\n\nC\u1ea5u tr\u00fac repository hi\u1ec7n t\u1ea1i:\n\n```text\nonline-boutique-gitops\/\n\u251c\u2500\u2500 helm-chart\/\n\u2502   \u251c\u2500\u2500 Chart.yaml\n\u2502   \u251c\u2500\u2500 values.yaml\n\u2502   \u251c\u2500\u2500 values-dev.yaml\n\u2502   \u251c\u2500\u2500 values-staging.yaml\n\u2502   \u251c\u2500\u2500 values-production.yaml\n\u2502   \u2514\u2500\u2500 templates\/\n\u2502\n\u2514\u2500\u2500 argocd\/\n    \u251c\u2500\u2500 online-boutique-dev.yaml\n    \u251c\u2500\u2500 online-boutique-staging.yaml\n    \u2514\u2500\u2500 online-boutique-production.yaml\n```\n\n---\n\n## 14. Apply ba Argo CD Applications\n\nApply Dev:\n\n```bash\nkubectl apply \\\n  -f argocd\/online-boutique-dev.yaml\n```\n\nApply Staging:\n\n```bash\nkubectl apply \\\n  -f argocd\/online-boutique-staging.yaml\n```\n\nApply Production:\n\n```bash\nkubectl apply \\\n  -f argocd\/online-boutique-production.yaml\n```\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get applications -n argocd\n```\n\nK\u1ebft qu\u1ea3 t\u01b0\u01a1ng t\u1ef1:\n\n```text\nNAME                       SYNC STATUS   HEALTH STATUS\nonline-boutique-dev        Synced        Healthy\nonline-boutique-staging    Synced        Healthy\nonline-boutique-production Synced        Healthy\n```\n\nTr\u1ea1ng th\u00e1i ban \u0111\u1ea7u c\u00f3 th\u1ec3 l\u00e0:\n\n```text\nOutOfSync\n```\n\nH\u00e3y \u0111\u1ee3i Argo CD th\u1ef1c hi\u1ec7n qu\u00e1 tr\u00ecnh sync.\n\n---\n\n## 15. Ki\u1ec3m tra b\u1eb1ng Argo CD CLI\n\nDanh s\u00e1ch Application:\n\n```bash\nargocd app list\n```\n\nXem Dev:\n\n```bash\nargocd app get online-boutique-dev\n```\n\nXem Staging:\n\n```bash\nargocd app get online-boutique-staging\n```\n\nXem Production:\n\n```bash\nargocd app get online-boutique-production\n```\n\nTh\u00f4ng tin c\u1ea7n ki\u1ec3m tra:\n\n```text\nProject: default\nServer: https:\/\/kubernetes.default.svc\nNamespace: online-boutique-dev\nSync Status: Synced\nHealth Status: Healthy\n```\n\nKi\u1ec3m tra ri\u00eang t\u1eebng Application:\n\n```bash\nargocd app wait online-boutique-dev \\\n  --sync \\\n  --health\n```\n\n```bash\nargocd app wait online-boutique-staging \\\n  --sync \\\n  --health\n```\n\n```bash\nargocd app wait online-boutique-production \\\n  --sync \\\n  --health\n```\n\n---\n\n## 16. Ki\u1ec3m tra c\u00e1c Deployment trong t\u1eebng m\u00f4i tr\u01b0\u1eddng\n\nDev:\n\n```bash\nkubectl get deployments \\\n  -n online-boutique-dev\n```\n\nStaging:\n\n```bash\nkubectl get deployments \\\n  -n online-boutique-staging\n```\n\nProduction:\n\n```bash\nkubectl get deployments \\\n  -n online-boutique-production\n```\n\nKi\u1ec3m tra Pod:\n\n```bash\nkubectl get pods \\\n  -n online-boutique-dev\n```\n\n```bash\nkubectl get pods \\\n  -n online-boutique-staging\n```\n\n```bash\nkubectl get pods \\\n  -n online-boutique-production\n```\n\nKi\u1ec3m tra Service:\n\n```bash\nkubectl get services \\\n  -n online-boutique-dev\n```\n\n```bash\nkubectl get services \\\n  -n online-boutique-staging\n```\n\n```bash\nkubectl get services \\\n  -n online-boutique-production\n```\n\nKi\u1ec3m tra s\u1ed1 l\u01b0\u1ee3ng replica c\u1ee7a frontend:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-dev\n```\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-staging\n```\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-production\n```\n\nK\u1ebft qu\u1ea3 d\u1ef1 ki\u1ebfn:\n\n```text\nDev        \u2192 1 replica\nStaging    \u2192 2 replicas\nProduction \u2192 3 replicas\n```\n\n---\n\n## 17. Ki\u1ec3m tra ba m\u00f4i tr\u01b0\u1eddng tr\u00ean Argo CD UI\n\nN\u1ebfu Argo CD \u0111ang \u0111\u01b0\u1ee3c port-forward:\n\n```bash\nkubectl port-forward \\\n  svc\/argocd-server \\\n  -n argocd \\\n  8080:443\n```\n\nM\u1edf tr\u00ecnh duy\u1ec7t:\n\n```text\nhttps:\/\/localhost:8080\n```\n\nB\u1ea1n s\u1ebd th\u1ea5y ba Application:\n\n```text\nonline-boutique-dev\nonline-boutique-staging\nonline-boutique-production\n```\n\nM\u1ed7i Application c\u00f3 th\u1ec3 c\u00f3 tr\u1ea1ng th\u00e1i:\n\n```text\nSynced\nHealthy\n```\n\nKi\u1ec3m tra:\n\n* Repository\n* Branch\n* Helm chart path\n* Values file\n* Namespace\n* Sync policy\n* Resource tree\n* Deployment\n* Service\n* Pod\n\n---\n\n## 18. Th\u1eed nghi\u1ec7m thay \u0111\u1ed5i c\u1ea5u h\u00ecnh Dev\n\nM\u1edf file:\n\n```bash\nnano helm-chart\/values-dev.yaml\n```\n\nThay \u0111\u1ed5i:\n\n```yaml\nfrontend:\n  replicaCount: 1\n```\n\nth\u00e0nh:\n\n```yaml\nfrontend:\n  replicaCount: 2\n```\n\nCommit:\n\n```bash\ngit add helm-chart\/values-dev.yaml\n```\n\n```bash\ngit commit -m \"scale frontend in dev environment\"\n```\n\nPush:\n\n```bash\ngit push origin chapter-5f-multi-environment\n```\n\nTheo d\u00f5i Deployment:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-dev \\\n  -w\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\nREADY\n2\/2\n```\n\nKi\u1ec3m tra Pod:\n\n```bash\nkubectl get pods \\\n  -n online-boutique-dev\n```\n\nKi\u1ec3m tra Argo CD:\n\n```bash\nargocd app get online-boutique-dev\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\nSync Status: Synced\nHealth Status: Healthy\n```\n\n---\n\n## 19. Ki\u1ec3m tra t\u00ednh \u0111\u1ed9c l\u1eadp gi\u1eefa c\u00e1c m\u00f4i tr\u01b0\u1eddng\n\nThay \u0111\u1ed5i Dev:\n\n```yaml\nfrontend:\n  replicaCount: 2\n```\n\nKh\u00f4ng thay \u0111\u1ed5i:\n\n```yaml\nfrontend:\n  replicaCount: 3\n```\n\ntrong Production.\n\nKi\u1ec3m tra Dev:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-dev\n```\n\nKi\u1ec3m tra Production:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-production\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\nDev        \u2192 2 replicas\nProduction \u2192 3 replicas\n```\n\n\u0110i\u1ec1u n\u00e0y ch\u1ee9ng minh r\u1eb1ng m\u1ed7i environment c\u00f3 c\u1ea5u h\u00ecnh ri\u00eang nh\u01b0ng v\u1eabn d\u00f9ng chung Helm chart.\n\n---\n\n## 20. Th\u1eed nghi\u1ec7m GitOps drift\n\nThay \u0111\u1ed5i th\u1ee7 c\u00f4ng Deployment trong Dev:\n\n```bash\nkubectl scale deployment frontend \\\n  --replicas=5 \\\n  -n online-boutique-dev\n```\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-dev\n```\n\nK\u1ebft qu\u1ea3 t\u1ea1m th\u1eddi:\n\n```text\n5 replicas\n```\n\nDo Application c\u00f3:\n\n```yaml\nautomated:\n  selfHeal: true\n```\n\nArgo CD s\u1ebd ph\u00e1t hi\u1ec7n tr\u1ea1ng th\u00e1i th\u1ef1c t\u1ebf kh\u00e1c v\u1edbi Git v\u00e0 \u0111\u01b0a Deployment v\u1ec1 c\u1ea5u h\u00ecnh \u0111\u01b0\u1ee3c khai b\u00e1o trong Git.\n\nKi\u1ec3m tra l\u1ea1i:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-dev\n```\n\nK\u1ebft qu\u1ea3 s\u1ebd quay l\u1ea1i gi\u00e1 tr\u1ecb trong Git:\n\n```text\n2 replicas\n```\n\nKi\u1ec3m tra tr\u1ea1ng th\u00e1i:\n\n```bash\nargocd app get online-boutique-dev\n```\n\n---\n\n## 21. T\u1ea1o quy tr\u00ecnh Production th\u1ee7 c\u00f4ng\n\nTrong production th\u1ef1c t\u1ebf, kh\u00f4ng n\u00ean \u0111\u1ec3 m\u1ecdi commit \u0111\u1ec1u t\u1ef1 \u0111\u1ed9ng tri\u1ec3n khai ngay v\u00e0o Production.\n\nCh\u00fang ta s\u1ebd t\u1eaft automated sync cho Production.\n\nM\u1edf file:\n\n```bash\nnano argocd\/online-boutique-production.yaml\n```\n\nThay ph\u1ea7n:\n\n```yaml\nsyncPolicy:\n  automated:\n    prune: true\n    selfHeal: true\n  syncOptions:\n    - CreateNamespace=true\n```\n\nb\u1eb1ng:\n\n```yaml\nsyncPolicy:\n  syncOptions:\n    - CreateNamespace=true\n```\n\nApply l\u1ea1i c\u1ea5u h\u00ecnh:\n\n```bash\nkubectl apply \\\n  -f argocd\/online-boutique-production.yaml\n```\n\nKi\u1ec3m tra:\n\n```bash\nargocd app get online-boutique-production\n```\n\nProduction hi\u1ec7n t\u1ea1i kh\u00f4ng c\u00f2n t\u1ef1 \u0111\u1ed9ng sync.\n\nFlow m\u1edbi:\n\n```text\nDeveloper\n    \u2193\nGitHub\n    \u2193\nArgo CD ph\u00e1t hi\u1ec7n thay \u0111\u1ed5i\n    \u2193\nProduction OutOfSync\n    \u2193\nKi\u1ec3m tra \/ Approval\n    \u2193\nManual Sync\n    \u2193\nProduction\n```\n\n---\n\n## 22. Th\u1eed nghi\u1ec7m thay \u0111\u1ed5i Production\n\nM\u1edf file:\n\n```bash\nnano helm-chart\/values-production.yaml\n```\n\nThay \u0111\u1ed5i:\n\n```yaml\nfrontend:\n  replicaCount: 3\n```\n\nth\u00e0nh:\n\n```yaml\nfrontend:\n  replicaCount: 4\n```\n\nCommit:\n\n```bash\ngit add helm-chart\/values-production.yaml\n```\n\n```bash\ngit commit -m \"scale frontend in production\"\n```\n\nPush:\n\n```bash\ngit push origin chapter-5f-multi-environment\n```\n\nKi\u1ec3m tra Application:\n\n```bash\nargocd app get online-boutique-production\n```\n\nTr\u1ea1ng th\u00e1i d\u1ef1 ki\u1ebfn:\n\n```text\nSync Status: OutOfSync\n```\n\nKi\u1ec3m tra Deployment:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-production\n```\n\nDeployment v\u1eabn gi\u1eef c\u1ea5u h\u00ecnh c\u0169 v\u00ec Production ch\u01b0a \u0111\u01b0\u1ee3c sync.\n\n---\n\n## 23. Manual Sync Production\n\nSau khi ki\u1ec3m tra thay \u0111\u1ed5i, th\u1ef1c hi\u1ec7n sync th\u1ee7 c\u00f4ng:\n\n```bash\nargocd app sync online-boutique-production\n```\n\nTheo d\u00f5i qu\u00e1 tr\u00ecnh:\n\n```bash\nargocd app wait online-boutique-production \\\n  --sync \\\n  --health\n```\n\nKi\u1ec3m tra Deployment:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-production\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\n4 replicas\n```\n\nKi\u1ec3m tra tr\u1ea1ng th\u00e1i:\n\n```bash\nargocd app get online-boutique-production\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\nSync Status: Synced\nHealth Status: Healthy\n```\n\n---\n\n## 24. Rollback Production b\u1eb1ng Git revert\n\nGi\u1ea3 s\u1eed thay \u0111\u1ed5i Production g\u00e2y ra l\u1ed7i.\n\nXem l\u1ecbch s\u1eed commit:\n\n```bash\ngit log --oneline --max-count=5\n```\n\nV\u00ed d\u1ee5:\n\n```text\na81c92f scale frontend in production\nb71d120 add multi-environment GitOps configuration\n```\n\nRollback commit g\u1ea7n nh\u1ea5t:\n\n```bash\ngit revert a81c92f\n```\n\nPush thay \u0111\u1ed5i:\n\n```bash\ngit push origin chapter-5f-multi-environment\n```\n\nKi\u1ec3m tra Application:\n\n```bash\nargocd app get online-boutique-production\n```\n\nN\u1ebfu Production \u0111ang s\u1eed d\u1ee5ng manual sync, th\u1ef1c hi\u1ec7n:\n\n```bash\nargocd app sync online-boutique-production\n```\n\nKi\u1ec3m tra replica:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique-production\n```\n\nProduction s\u1ebd quay l\u1ea1i c\u1ea5u h\u00ecnh tr\u01b0\u1edbc \u0111\u00f3.\n\n> V\u1edbi GitOps, rollback \u0111\u01b0\u1ee3c th\u1ef1c hi\u1ec7n b\u1eb1ng c\u00e1ch rollback c\u1ea5u h\u00ecnh trong Git, sau \u0111\u00f3 \u0111\u1ec3 Argo CD \u0111\u1ed3ng b\u1ed9 tr\u1ea1ng th\u00e1i m\u1edbi v\u00e0o cluster.\n\n---\n\n## 25. Ki\u1ec3m tra to\u00e0n b\u1ed9 h\u1ec7 th\u1ed1ng\n\nKi\u1ec3m tra Application:\n\n```bash\nargocd app list\n```\n\nKi\u1ec3m tra namespace:\n\n```bash\nkubectl get namespaces | grep online-boutique\n```\n\nKi\u1ec3m tra Pod c\u1ee7a Dev:\n\n```bash\nkubectl get pods \\\n  -n online-boutique-dev\n```\n\nKi\u1ec3m tra Pod c\u1ee7a Staging:\n\n```bash\nkubectl get pods \\\n  -n online-boutique-staging\n```\n\nKi\u1ec3m tra Pod c\u1ee7a Production:\n\n```bash\nkubectl get pods \\\n  -n online-boutique-production\n```\n\nKi\u1ec3m tra Deployment:\n\n```bash\nkubectl get deployments \\\n  -A | grep online-boutique\n```\n\nKi\u1ec3m tra Service:\n\n```bash\nkubectl get services \\\n  -A | grep online-boutique\n```\n\nK\u1ebft qu\u1ea3 cu\u1ed1i c\u00f9ng:\n\n```text\nonline-boutique-dev\n    \u251c\u2500\u2500 Helm chart\n    \u251c\u2500\u2500 Argo CD Application\n    \u2514\u2500\u2500 Namespace ri\u00eang\n\nonline-boutique-staging\n    \u251c\u2500\u2500 Helm chart\n    \u251c\u2500\u2500 Argo CD Application\n    \u2514\u2500\u2500 Namespace ri\u00eang\n\nonline-boutique-production\n    \u251c\u2500\u2500 Helm chart\n    \u251c\u2500\u2500 Argo CD Application\n    \u2514\u2500\u2500 Namespace ri\u00eang\n```\n\n---\n\n## 26. Ki\u1ebfn tr\u00fac cu\u1ed1i Chapter 5F\n\n```text\n                         Developer\n                             \u2502\n                             \u25bc\n                          GitHub\n                             \u2502\n                \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n                \u25bc            \u25bc            \u25bc\n             Dev config  Staging config  Production config\n                \u2502            \u2502            \u2502\n                \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                             \u25bc\n                         Helm Chart\n                             \u2502\n                             \u25bc\n                          Argo CD\n                             \u2502\n             \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n             \u25bc               \u25bc               \u25bc\n          Dev App       Staging App      Production App\n             \u2502               \u2502               \u2502\n             \u25bc               \u25bc               \u25bc\n          Namespace       Namespace       Namespace\n             \u2502               \u2502               \u2502\n             \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                             \u25bc\n                        Amazon EKS\n                             \u2502\n                             \u25bc\n                    Google Online Boutique\n```\n\n---\n\n## 27. Nh\u1eefng g\u00ec \u0111\u00e3 \u0111\u1ea1t \u0111\u01b0\u1ee3c\n\nSau Chapter 5F, ch\u00fang ta \u0111\u00e3 chuy\u1ec3n t\u1eeb:\n\n```text\nM\u1ed9t Helm release\n        \u2193\nM\u1ed9t namespace\n        \u2193\nM\u1ed9t m\u00f4i tr\u01b0\u1eddng\n```\n\nsang:\n\n```text\nM\u1ed9t Helm chart\n        \u2193\nNhi\u1ec1u values files\n        \u2193\nNhi\u1ec1u Argo CD Applications\n        \u2193\nNhi\u1ec1u m\u00f4i tr\u01b0\u1eddng\n        \u2193\nM\u1ed9t GitOps Platform\n```\n\nC\u00e1c ki\u1ebfn th\u1ee9c ch\u00ednh:\n\n* Helm values theo m\u00f4i tr\u01b0\u1eddng\n* Argo CD Application\n* Multi-environment deployment\n* Namespace isolation\n* Automated sync\n* Manual sync\n* Self-healing\n* GitOps drift detection\n* Git-based rollback\n* Production deployment control\n\n---\n\n## 28. K\u1ebft lu\u1eadn\n\nTrong Chapter 5E, ch\u00fang ta \u0111\u00e3 chuy\u1ec3n deployment t\u1eeb:\n\n```text\nDeveloper\n    \u2193\nhelm upgrade\n    \u2193\nAmazon EKS\n```\n\nsang:\n\n```text\nDeveloper\n    \u2193\nGitHub\n    \u2193\nArgo CD\n    \u2193\nAmazon EKS\n```\n\nTrong Chapter 5F, ch\u00fang ta ti\u1ebfp t\u1ee5c m\u1edf r\u1ed9ng th\u00e0nh:\n\n```text\nGitHub\n    \u2193\nHelm Chart\n    \u2193\nArgo CD\n    \u251c\u2500\u2500 Dev\n    \u251c\u2500\u2500 Staging\n    \u2514\u2500\u2500 Production\n          \u2193\n       Amazon EKS\n```\n\nT\u1eeb \u0111\u00e2y, Git kh\u00f4ng ch\u1ec9 l\u01b0u source code m\u00e0 c\u00f2n l\u01b0u **desired state c\u1ee7a to\u00e0n b\u1ed9 platform**.\n\n\u0110\u00e2y l\u00e0 n\u1ec1n t\u1ea3ng \u0111\u1ec3 ti\u1ebfp t\u1ee5c x\u00e2y d\u1ef1ng c\u00e1c m\u00f4 h\u00ecnh n\u00e2ng cao h\u01a1n:\n\n* App of Apps\n* ApplicationSet\n* Multi-cluster GitOps\n* ECR image promotion\n* Helm release promotion\n* Progressive delivery\n* Canary deployment\n* Blue\/Green deployment\n* Production approval workflow","published_at":"2026-09-14T13:01:49.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T22:13:02.000000Z","edited_at":"2026-09-14T13:01:43.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":8,"points":0,"views_count":11,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/fa6c7366-739f-4709-bcf3-95a4ac3fe61c.png","user":{"data":{"id":98940,"url":"https:\/\/viblo.asia\/u\/Juu-dev","avatar":"25478754-6f7c-425c-a27d-bd61fabc134e.jpg","name":"Th\u1ed1ng PM","username":"Juu-dev","followers_count":82,"reputation":1444,"posts_count":190,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"amazon-eks","name":"Amazon EKS"}]},"commentators":{"data":[]}},{"id":106678,"title":"C\u00e1c c\u00e2u h\u1ecfi trong k\u1ef3 thi Microsoft AB-730 c\u00f3 th\u1ec3 thay \u0111\u1ed5i c\u00e1ch b\u1ea1n nh\u00ecn nh\u1eadn v\u1ec1 AI trong doanh nghi\u1ec7p kh\u00f4ng?","slug":"AoJe8lzA41j","url":"https:\/\/viblo.asia\/p\/cac-cau-hoi-trong-ky-thi-microsoft-ab-730-co-the-thay-doi-cach-ban-nhin-nhan-ve-ai-trong-doanh-nghiep-khong-AoJe8lzA41j","user_id":181978,"moderation":"discarded","transliterated":"cac-cau-hoi-trong-ky-thi-microsoft-ab-730-co-the-thay-doi-cach-ban-nhin-nhan-ve-ai-trong-doanh-nghiep-khong","contents_short":"H\u1ea7u h\u1ebft m\u1ecdi ng\u01b0\u1eddi m\u1edf m\u1ed9t t\u00e0i li\u1ec7u h\u01b0\u1edbng d\u1eabn \u00f4n thi v\u1edbi mong mu\u1ed1n ch\u1ec9 c\u1ea7n ghi nh\u1edb c\u00e1c kh\u00e1i ni\u1ec7m v\u00e0 ch\u1ecdn \u0111\u00e1p \u00e1n \u0111\u00fang. Nh\u01b0ng \u0111\u00f3 kh\u00f4ng ph\u1ea3i l\u00e0 c\u00e1ch m\u1ecdi th\u1ee9 di\u1ec5n ra v\u1edbi k\u1ef3 thi Microsoft AB-730. Ngay khi nh\u00ecn th\u1ea5y m\u1ed9t c\u00e2u h\u1ecfi, b\u1ea1n nh\u1eadn ra r\u1eb1ng k\u1ef3 thi kh\u00f4ng y\u00eau c\u1ea7u b\u1ea1n ch\u1ec9 \u0111\u1ecbnh ngh\u0129a m\u1ed9t kh\u00e1i ni\u1ec7m. Thay v\u00e0o \u0111\u00f3, b\u1ea1n \u0111\u01b0\u1ee3c \u0111\u1eb7t v\u00e0o m\u1ed9t t\u00ecnh hu\u1ed1ng th\u1ef1c t\u1ebf ph\u1ee9c t\u1ea1p t\u1ea1i n\u01a1i l\u00e0m vi\u1ec7c v\u00e0 \u0111\u01b0\u1ee3c h\u1ecfi: \u201cB\u1ea1n s\u1ebd l\u00e0m ...","contents":"H\u1ea7u h\u1ebft m\u1ecdi ng\u01b0\u1eddi m\u1edf m\u1ed9t t\u00e0i li\u1ec7u h\u01b0\u1edbng d\u1eabn \u00f4n thi v\u1edbi mong mu\u1ed1n ch\u1ec9 c\u1ea7n ghi nh\u1edb c\u00e1c kh\u00e1i ni\u1ec7m v\u00e0 ch\u1ecdn \u0111\u00e1p \u00e1n \u0111\u00fang. Nh\u01b0ng \u0111\u00f3 kh\u00f4ng ph\u1ea3i l\u00e0 c\u00e1ch m\u1ecdi th\u1ee9 di\u1ec5n ra v\u1edbi k\u1ef3 thi Microsoft AB-730. Ngay khi nh\u00ecn th\u1ea5y m\u1ed9t c\u00e2u h\u1ecfi, b\u1ea1n nh\u1eadn ra r\u1eb1ng k\u1ef3 thi kh\u00f4ng y\u00eau c\u1ea7u b\u1ea1n ch\u1ec9 \u0111\u1ecbnh ngh\u0129a m\u1ed9t kh\u00e1i ni\u1ec7m. Thay v\u00e0o \u0111\u00f3, b\u1ea1n \u0111\u01b0\u1ee3c \u0111\u1eb7t v\u00e0o m\u1ed9t t\u00ecnh hu\u1ed1ng th\u1ef1c t\u1ebf ph\u1ee9c t\u1ea1p t\u1ea1i n\u01a1i l\u00e0m vi\u1ec7c v\u00e0 \u0111\u01b0\u1ee3c h\u1ecfi: \u201cB\u1ea1n s\u1ebd l\u00e0m g\u00ec?\u201d S\u1ef1 thay \u0111\u1ed5i nh\u1ecf n\u00e0y l\u00e0m thay \u0111\u1ed5i ho\u00e0n to\u00e0n c\u00e1ch b\u1ea1n h\u1ecdc.\n\nThay v\u00ec xem c\u00e1c c\u00e2u h\u1ecfi thi Microsoft AB-730 nh\u01b0 m\u1ed9t b\u00e0i luy\u1ec7n t\u1eadp \u0111\u01a1n thu\u1ea7n, h\u00e3y nh\u00ecn ch\u00fang nh\u01b0 m\u1ed9t m\u00f4 ph\u1ecfng. M\u1ed7i c\u00e2u h\u1ecfi ph\u1ea3n \u00e1nh m\u1ed9t c\u00e1ch kh\u00e1c nhau \u0111\u1ec3 \u0111\u00e1nh gi\u00e1 AI trong doanh nghi\u1ec7p. N\u00f3 kh\u00f4ng xu\u1ea5t ph\u00e1t t\u1eeb g\u00f3c nh\u00ecn c\u1ee7a s\u00e1ch gi\u00e1o khoa, m\u00e0 t\u1eeb v\u1ecb tr\u00ed c\u1ee7a m\u1ed9t ng\u01b0\u1eddi c\u00f3 \u1ea3nh h\u01b0\u1edfng \u0111\u1ebfn \u0111\u1ed9i ng\u0169 v\u00e0 ng\u00e2n s\u00e1ch th\u1ef1c t\u1ebf. Khi nh\u00ecn c\u00e1c c\u00e2u h\u1ecfi Microsoft AB-730 theo c\u00e1ch n\u00e0y, vi\u1ec7c \u00f4n thi kh\u00f4ng c\u00f2n gi\u1ed1ng m\u1ed9t nhi\u1ec7m v\u1ee5 b\u1eaft bu\u1ed9c m\u00e0 tr\u1edf th\u00e0nh qu\u00e1 tr\u00ecnh r\u00e8n luy\u1ec7n kh\u1ea3 n\u0103ng \u0111\u01b0a ra quy\u1ebft \u0111\u1ecbnh trong th\u1ebf gi\u1edbi th\u1ef1c.\n\n## T\u1eeb \u201cAI c\u00f3 th\u1ec3 l\u00e0m g\u00ec?\u201d \u0111\u1ebfn \u201cDoanh nghi\u1ec7p n\u00ean s\u1eed d\u1ee5ng AI nh\u01b0 th\u1ebf n\u00e0o?\u201d\n\nD\u01b0\u1edbi \u0111\u00e2y l\u00e0 m\u1ed9t v\u00ed d\u1ee5 v\u1ec1 d\u1ea1ng c\u00e2u h\u1ecfi c\u00f3 th\u1ec3 khi\u1ebfn nhi\u1ec1u ng\u01b0\u1eddi b\u1ed1i r\u1ed1i: T\u00f4i c\u00f3 c\u1ea7n hi\u1ec3u bi\u1ebft v\u1ec1 m\u1ecdi th\u1ee9 m\u00e0 AI c\u00f3 th\u1ec3 l\u00e0m kh\u00f4ng? N\u00f3i th\u1eb3ng ra l\u00e0 kh\u00f4ng. Bi\u1ebft c\u00e1ch Copilot c\u00f3 th\u1ec3 t\u00f3m t\u1eaft email cho t\u00f4i l\u00e0 h\u1eefu \u00edch, nh\u01b0ng \u0111\u00f3 kh\u00f4ng ph\u1ea3i \u0111i\u1ec1u \u0111\u01b0\u1ee3c ki\u1ec3m tra trong k\u1ef3 thi Microsoft AI Business Professional. K\u1ef3 thi Microsoft AB-730 \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf \u0111\u1ec3 \u0111\u00e1nh gi\u00e1 kh\u1ea3 n\u0103ng c\u1ee7a b\u1ea1n trong vi\u1ec7c x\u00e1c \u0111\u1ecbnh v\u1ea5n \u0111\u1ec1 kinh doanh, nh\u1eadn di\u1ec7n m\u1ee5c ti\u00eau v\u00e0 sau \u0111\u00f3 suy lu\u1eadn xem k\u1ebft qu\u1ea3 th\u1ef1c s\u1ef1 c\u1ea7n \u0111\u1ea1t \u0111\u01b0\u1ee3c l\u00e0 g\u00ec.\n\nH\u00e3y th\u1eed h\u00ecnh dung theo c\u00e1ch n\u00e0y: C\u00e1c c\u00f4ng ty kh\u00f4ng quy\u1ebft \u0111\u1ecbnh tri\u1ec3n khai AI ch\u1ec9 v\u00ec m\u1ed9t ng\u00e0y n\u00e0o \u0111\u00f3 h\u1ecd nh\u1eadn ra \u0111\u00e2y l\u00e0 c\u00f4ng ngh\u1ec7 m\u1edbi. H\u1ecd tri\u1ec3n khai AI v\u00ec c\u00f3 qu\u00e1 nhi\u1ec1u khi\u1ebfu n\u1ea1i ho\u1eb7c nh\u00e2n vi\u00ean \u0111ang d\u00e0nh qu\u00e1 nhi\u1ec1u th\u1eddi gian cho c\u00e1c c\u00f4ng vi\u1ec7c th\u1ee7 c\u00f4ng. K\u1ef3 thi Microsoft AB-730 bu\u1ed9c b\u1ea1n ph\u1ea3i b\u1eaft \u0111\u1ea7u t\u1eeb \u0111i\u1ec3m kh\u00f3 kh\u0103n \u0111\u00f3 v\u00e0 suy ng\u01b0\u1ee3c l\u1ea1i \u0111\u1ec3 t\u00ecm ra gi\u1ea3i ph\u00e1p AI ph\u00f9 h\u1ee3p. Khi th\u1ef1c hi\u1ec7n \u0111\u01b0\u1ee3c s\u1ef1 thay \u0111\u1ed5i trong t\u01b0 duy n\u00e0y, c\u00e1c \u0111\u00e1p \u00e1n b\u1eaft \u0111\u1ea7u tr\u1edf n\u00ean d\u1ec5 hi\u1ec3u h\u01a1n. B\u1ea1n kh\u00f4ng c\u00f2n \u0111o\u00e1n m\u00f2 m\u00e0 b\u1eaft \u0111\u1ea7u suy lu\u1eadn.\n\n## C\u00e1c c\u00e2u h\u1ecfi Microsoft AB-730 \u0111\u1eb7t AI trong b\u1ed1i c\u1ea3nh kinh doanh nh\u01b0 th\u1ebf n\u00e0o?\n\n\u0110\u00e2y l\u00e0 ph\u1ea7n tr\u1edf n\u00ean th\u00fa v\u1ecb. M\u1ed9t c\u00e2u h\u1ecfi \u0111i\u1ec3n h\u00ecnh trong k\u1ef3 thi AI Business Professional s\u1ebd kh\u00f4ng \u0111\u01b0a cho b\u1ea1n m\u1ed9t v\u1ea5n \u0111\u1ec1 c\u00f4ng ngh\u1ec7 ri\u00eang l\u1ebb. Thay v\u00e0o \u0111\u00f3, c\u00e2u h\u1ecfi \u0111\u1eb7t b\u1ea1n v\u00e0o m\u1ed9t t\u00ecnh hu\u1ed1ng kinh doanh \u0111\u1ea7y \u0111\u1ee7. B\u1ea1n c\u00f3 th\u1ec3 \u0111\u1ecdc v\u1ec1 m\u1ed9t ph\u00f2ng ban \u0111ang g\u1eb7p kh\u00f3 kh\u0103n v\u00ec kh\u1ed1i l\u01b0\u1ee3ng c\u00f4ng vi\u1ec7c, m\u1ed9t qu\u1ea3n l\u00fd lo ng\u1ea1i v\u1ec1 quy\u1ec1n ri\u00eang t\u01b0 d\u1eef li\u1ec7u v\u00e0 m\u1ed9t th\u1eddi h\u1ea1n g\u1ea5p. T\u1ea5t c\u1ea3 nh\u1eefng th\u00f4ng tin \u0111\u00f3 kh\u00f4ng ph\u1ea3i \u0111\u1ec3 l\u00e0m c\u00e2u h\u1ecfi d\u00e0i h\u01a1n; ch\u00fang ch\u00ednh l\u00e0 manh m\u1ed1i. T\u00ecnh hu\u1ed1ng v\u00e0 nh\u1eefng r\u1ee7i ro \u0111\u01b0\u1ee3c \u0111\u1ec1 c\u1eadp \u0111ang \u00e2m th\u1ea7m h\u01b0\u1edbng b\u1ea1n \u0111\u1ebfn quy\u1ebft \u0111\u1ecbnh \u0111\u00fang n\u1ebfu b\u1ea1n bi\u1ebft c\u00e1ch ph\u00e2n t\u00edch ch\u00fang.\n\nThe [Microsoft AB-730 exam questions](https:\/\/www.pass4future.com\/questions\/microsoft\/ab-730) bu\u1ed9c b\u1ea1n ph\u1ea3i c\u00e2n nh\u1eafc nhi\u1ec1u y\u1ebfu t\u1ed1 c\u00f9ng l\u00fac, gi\u1ed1ng nh\u01b0 trong m\u1ed9t cu\u1ed9c h\u1ecdp th\u1ef1c t\u1ebf. D\u01b0\u1edbi \u0111\u00e2y l\u00e0 nh\u1eefng \u0111i\u1ec1u b\u1ea1n c\u1ea7n c\u00e2n b\u1eb1ng trong m\u1ed9t c\u00e2u h\u1ecfi duy nh\u1ea5t:\n\n* M\u1ee5c ti\u00eau kinh doanh: C\u00f4ng ty \u0111ang mu\u1ed1n \u0111\u1ea1t \u0111\u01b0\u1ee3c \u0111i\u1ec1u g\u00ec v\u00e0 gi\u1ea3i ph\u00e1p AI c\u00f3 h\u1ed7 tr\u1ee3 m\u1ee5c ti\u00eau \u0111\u00f3 kh\u00f4ng?\n* T\u00e1c \u0111\u1ed9ng \u0111\u1ebfn ng\u01b0\u1eddi d\u00f9ng: Thay \u0111\u1ed5i n\u00e0y s\u1ebd gi\u00fap c\u00f4ng vi\u1ec7c tr\u1edf n\u00ean d\u1ec5 d\u00e0ng h\u01a1n hay t\u1ea1o ra s\u1ef1 nh\u1ea7m l\u1eabn?\n* N\u0103ng su\u1ea5t v\u00e0 r\u1ee7i ro: M\u1ed9t gi\u1ea3i ph\u00e1p nhanh h\u01a1n c\u00f3 th\u1ec3 r\u1ea5t h\u1ea5p d\u1eabn, nh\u01b0ng \u0111i\u1ec1u g\u00ec x\u1ea3y ra n\u1ebfu n\u00f3 l\u00e0m l\u1ed9 d\u1eef li\u1ec7u nh\u1ea1y c\u1ea3m?\n* AI c\u00f3 tr\u00e1ch nhi\u1ec7m: C\u00f4ng b\u1eb1ng v\u00e0 minh b\u1ea1ch kh\u00f4ng ch\u1ec9 l\u00e0 nh\u1eefng thu\u1eadt ng\u1eef ph\u1ed5 bi\u1ebfn; ch\u00fang c\u00f3 th\u1ec3 l\u00e0 y\u1ebfu t\u1ed1 quy\u1ebft \u0111\u1ecbnh.\n## Khi quy\u1ebft \u0111\u1ecbnh AI \u0111\u00fang kh\u00f4ng ph\u1ea3i l\u00e0 l\u1ef1a ch\u1ecdn r\u00f5 r\u00e0ng nh\u1ea5t\n\nH\u00e3y th\u00e0nh th\u1eadt, m\u1ed9t s\u1ed1 c\u00e2u h\u1ecfi Microsoft AB-730 \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf \u0111\u1ec3 ki\u1ec3m tra kh\u1ea3 n\u0103ng ph\u00e1n \u0111o\u00e1n c\u1ee7a b\u1ea1n. Ch\u00fang \u0111\u01b0a ra hai ho\u1eb7c ba l\u1ef1a ch\u1ecdn m\u00e0 t\u1ea5t c\u1ea3 \u0111\u1ec1u c\u00f3 v\u1ebb ho\u00e0n to\u00e0n h\u1ee3p l\u00fd. M\u1ed9t l\u1ef1a ch\u1ecdn c\u00f3 th\u1ec3 l\u00e0 c\u00f4ng c\u1ee5 AI m\u1ea1nh m\u1ebd nh\u1ea5t. M\u1ed9t l\u1ef1a ch\u1ecdn kh\u00e1c c\u00f3 th\u1ec3 \u0111\u01a1n gi\u1ea3n h\u01a1n nh\u01b0ng an to\u00e0n h\u01a1n. L\u1ef1a ch\u1ecdn th\u1ee9 ba c\u00f3 th\u1ec3 c\u00f3 chi ph\u00ed th\u1ea5p nh\u1ea5t. Nh\u00ecn b\u1ec1 ngo\u00e0i, b\u1ea5t k\u1ef3 l\u1ef1a ch\u1ecdn n\u00e0o c\u0169ng c\u00f3 th\u1ec3 ph\u00f9 h\u1ee3p. K\u1ef3 thi ch\u1ee9ng ch\u1ec9 Microsoft AB-730 mu\u1ed1n bi\u1ebft li\u1ec7u b\u1ea1n c\u00f3 th\u1ec3 nh\u00ecn xa h\u01a1n l\u1ef1a ch\u1ecdn n\u1ed5i b\u1eadt nh\u1ea5t v\u00e0 t\u1ef1 h\u1ecfi: \u0110i\u1ec1u n\u00e0y c\u00f3 th\u1ef1c s\u1ef1 ph\u00f9 h\u1ee3p v\u1edbi nhu c\u1ea7u c\u1ee5 th\u1ec3 c\u1ee7a doanh nghi\u1ec7p v\u00e0o th\u1eddi \u0111i\u1ec3m hi\u1ec7n t\u1ea1i kh\u00f4ng?\n\n\u0110\u00e2y l\u00e0 l\u00fac kh\u1ea3 n\u0103ng ph\u00e2n t\u00edch s\u00e2u h\u01a1n ph\u00e1t huy t\u00e1c d\u1ee5ng. B\u1ea1n b\u1eaft \u0111\u1ea7u nh\u1eadn ra r\u1eb1ng m\u1ed9t quy\u1ebft \u0111\u1ecbnh AI t\u1ed1t kh\u00f4ng nh\u1ea5t thi\u1ebft n\u1eb1m \u1edf vi\u1ec7c c\u00f3 nhi\u1ec1u t\u00ednh n\u0103ng nh\u1ea5t, m\u00e0 \u1edf vi\u1ec7c hi\u1ec3u \u0111\u01b0\u1ee3c gi\u1edbi h\u1ea1n c\u1ee7a t\u1ed5 ch\u1ee9c, c\u00e2n nh\u1eafc nh\u1eefng ng\u01b0\u1eddi b\u1ecb \u1ea3nh h\u01b0\u1edfng v\u00e0 \u0111\u1ed3ng th\u1eddi gi\u1ea3i quy\u1ebft \u0111\u00fang v\u1ea5n \u0111\u1ec1. C\u00e1ch t\u01b0 duy n\u00e0y c\u00f3 th\u1ec3 d\u1ea7n tr\u1edf th\u00e0nh ph\u1ea3n x\u1ea1 m\u1eb7c \u0111\u1ecbnh c\u1ee7a b\u1ea1n trong m\u1ecdi cu\u1ed9c th\u1ea3o lu\u1eadn v\u1ec1 AI trong s\u1ef1 nghi\u1ec7p.\n\n## \u0110i\u1ec1u n\u00e0y thay \u0111\u1ed5i c\u00e1ch b\u1ea1n ti\u1ebfp c\u1eadn AI trong doanh nghi\u1ec7p nh\u01b0 th\u1ebf n\u00e0o?\n\nV\u1eady \u0111i\u1ec1u g\u00ec x\u1ea3y ra sau khi b\u1ea1n x\u1eed l\u00fd h\u00e0ng ch\u1ee5c c\u00e2u h\u1ecfi Microsoft AB-730 d\u1ef1a tr\u00ean t\u00ecnh hu\u1ed1ng? M\u1ed9t s\u1ef1 thay \u0111\u1ed5i tinh t\u1ebf nh\u01b0ng m\u1ea1nh m\u1ebd b\u1eaft \u0111\u1ea7u di\u1ec5n ra trong t\u01b0 duy c\u1ee7a b\u1ea1n. B\u1ea1n kh\u00f4ng c\u00f2n nh\u00ecn AI ch\u1ec9 nh\u01b0 m\u1ed9t c\u00f4ng ngh\u1ec7 kh\u00e1c trong danh m\u1ee5c s\u1ea3n ph\u1ea9m c\u1ee7a nh\u00e0 cung c\u1ea5p. Thay v\u00e0o \u0111\u00f3, b\u1ea1n nh\u00ecn AI nh\u01b0 m\u1ed9t c\u00f4ng c\u1ee5 h\u1ed7 tr\u1ee3 ra quy\u1ebft \u0111\u1ecbnh, m\u1ed9t ph\u1ea7n c\u1ee7a chi\u1ebfn l\u01b0\u1ee3c kinh doanh. B\u1ea1n b\u1eaft \u0111\u1ea7u \u0111\u1eb7t ra nh\u1eefng c\u00e2u h\u1ecfi th\u00f4ng minh h\u01a1n trong c\u00e1c cu\u1ed9c h\u1ecdp th\u1ef1c t\u1ebf: \u201cTr\u01b0\u1edbc ti\u00ean ch\u00fang ta \u0111ang gi\u1ea3i quy\u1ebft v\u1ea5n \u0111\u1ec1 g\u00ec?\u201d v\u00e0 \u201cCh\u00fang ta c\u00f3 \u0111ang th\u1ef1c hi\u1ec7n \u0111i\u1ec1u n\u00e0y m\u1ed9t c\u00e1ch c\u00f3 tr\u00e1ch nhi\u1ec7m kh\u00f4ng?\u201d \u0110\u00e2y kh\u00f4ng ph\u1ea3i l\u00e0 nh\u1eefng m\u1eb9o l\u00e0m b\u00e0i thi; \u0111\u00f3 l\u00e0 nh\u1eefng ph\u1ea3n x\u1ea1 b\u1ea1n x\u00e2y d\u1ef1ng th\u00f4ng qua vi\u1ec7c luy\u1ec7n t\u1eadp \u0111\u00fang c\u00e1ch.\n\nN\u1ebfu mu\u1ed1n x\u00e2y d\u1ef1ng ph\u1ea3n x\u1ea1 \u0111\u00f3 tr\u01b0\u1edbc ng\u00e0y thi, ch\u1ea5t l\u01b0\u1ee3ng t\u00e0i li\u1ec7u luy\u1ec7n t\u1eadp Microsoft AB-730 r\u1ea5t quan tr\u1ecdng. Vi\u1ec7c l\u00e0m quen v\u1edbi c\u00e1c c\u00e2u h\u1ecfi Microsoft AB-730 th\u1ef1c t\u1ebf, d\u1ef1a tr\u00ean t\u00ecnh hu\u1ed1ng s\u1ebd t\u1ea1o ra s\u1ef1 kh\u00e1c bi\u1ec7t gi\u1eefa vi\u1ec7c ghi nh\u1edb \u0111\u00e1p \u00e1n v\u00e0 th\u1ef1c s\u1ef1 hi\u1ec3u logic ph\u00eda sau ch\u00fang. \u0110\u00e2y l\u00e0 l\u00fac Pass4Future tr\u1edf th\u00e0nh m\u1ed9t ngu\u1ed3n t\u00e0i li\u1ec7u luy\u1ec7n t\u1eadp h\u1eefu \u00edch. N\u1ec1n t\u1ea3ng cung c\u1ea5p c\u00e1c c\u00e2u h\u1ecfi Microsoft AB-730 \u0111\u01b0\u1ee3c s\u1eafp x\u1ebfp r\u00f5 r\u00e0ng v\u00e0 m\u00f4 ph\u1ecfng th\u1ef1c t\u1ebf, gi\u00fap b\u1ea1n r\u00e8n luy\u1ec7n c\u00e1ch t\u01b0 duy m\u00e0 m\u00f4i tr\u01b0\u1eddng doanh nghi\u1ec7p th\u1ef1c t\u1ebf y\u00eau c\u1ea7u. H\u00e3y th\u1eed tr\u1ea3i nghi\u1ec7m, l\u00e0m qua c\u00e1c t\u00ecnh hu\u1ed1ng v\u00e0 b\u1ea1n c\u00f3 th\u1ec3 thay \u0111\u1ed5i c\u00e1ch nh\u00ecn c\u1ee7a m\u00ecnh v\u1ec1 AI trong doanh nghi\u1ec7p.","published_at":"2026-09-14T11:55:45.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T12:26:03.000000Z","edited_at":"2026-09-14T11:53:02.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":9,"points":0,"views_count":2,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/efb1a8b1-74e7-464b-9587-20a56973f9a6.png","user":{"data":{"id":181978,"url":"https:\/\/viblo.asia\/u\/adamlucas","avatar":"52480af0-a32f-455d-aa94-74f3200434d9.jpg","name":"Adam Lucas","username":"adamlucas","followers_count":0,"reputation":0,"posts_count":4,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"ab730exam","name":"ab730exam"},{"slug":"exampreparation","name":"exampreparation"}]},"commentators":{"data":[]}},{"id":106667,"title":"Ph\u00e1t \u00e2m thanh b\u00e1o khi Claude Code th\u1eadt s\u1ef1 ho\u00e0n t\u1ea5t","slug":"2vJPdlWlJeK","url":"https:\/\/viblo.asia\/p\/phat-am-thanh-bao-khi-claude-code-that-su-hoan-tat-2vJPdlWlJeK","user_id":17813,"moderation":null,"transliterated":"phat-am-thanh-bao-khi-claude-code-that-su-hoan-tat","contents_short":"M\u1ed9t s\u1ed1 t\u00e1c v\u1ee5 trong Claude Code ch\u1ea1y kh\u00e1 l\u00e2u. B\u1ea1n kh\u1edfi \u0111\u1ed9ng m\u1ed9t c\u00e1i, r\u1ed3i ng\u1ed3i ch\u1edd \u2014\nnh\u00ecn terminal, \u0111\u1ee3i n\u00f3 ng\u1eebng cu\u1ed9n. Chuy\u1ec7n nh\u1ecf th\u00f4i, nh\u01b0ng l\u00e0m c\u1ea3 ng\u00e0y th\u00ec m\u1ecfi. M\u1eaft\nb\u1ea1n d\u00e1n v\u00e0o m\u1ed9t m\u00e0n h\u00ecnh ph\u1ea7n l\u1edbn th\u1eddi gian ch\u1eb3ng thay \u0111\u1ed5i, ch\u1ec9 \u0111\u1ec3 bi\u1ebft \u0111\u00fang l\u00fac n\u00e0o\nt\u1edbi l\u01b0\u1ee3t m\u00ecnh.\n\nC\u00e1ch t\u00f4i ch\u1ed1t l\u1ea1i r\u1ea5t \u0111\u01a1n gi\u1ea3n: ph\u00e1t m\u1ed9t \u00e2m thanh khi Claude xong. R\u1ed3i t\u00f4i c\u00f3 th\u1ec3\nr\u1eddi m\u1eaft h\u1eb3n \u2014 \u0111\u1ecdc g\u00ec \u0111\u00f3, \u0111i pha c\u00e0 ph\u00ea \u2014 v\u00e0 tai ...","contents":"M\u1ed9t s\u1ed1 t\u00e1c v\u1ee5 trong Claude Code ch\u1ea1y kh\u00e1 l\u00e2u. B\u1ea1n kh\u1edfi \u0111\u1ed9ng m\u1ed9t c\u00e1i, r\u1ed3i ng\u1ed3i ch\u1edd \u2014\nnh\u00ecn terminal, \u0111\u1ee3i n\u00f3 ng\u1eebng cu\u1ed9n. Chuy\u1ec7n nh\u1ecf th\u00f4i, nh\u01b0ng l\u00e0m c\u1ea3 ng\u00e0y th\u00ec m\u1ecfi. M\u1eaft\nb\u1ea1n d\u00e1n v\u00e0o m\u1ed9t m\u00e0n h\u00ecnh ph\u1ea7n l\u1edbn th\u1eddi gian ch\u1eb3ng thay \u0111\u1ed5i, ch\u1ec9 \u0111\u1ec3 bi\u1ebft \u0111\u00fang l\u00fac n\u00e0o\nt\u1edbi l\u01b0\u1ee3t m\u00ecnh.\n\nC\u00e1ch t\u00f4i ch\u1ed1t l\u1ea1i r\u1ea5t \u0111\u01a1n gi\u1ea3n: **ph\u00e1t m\u1ed9t \u00e2m thanh khi Claude xong.** R\u1ed3i t\u00f4i c\u00f3 th\u1ec3\nr\u1eddi m\u1eaft h\u1eb3n \u2014 \u0111\u1ecdc g\u00ec \u0111\u00f3, \u0111i pha c\u00e0 ph\u00ea \u2014 v\u00e0 tai s\u1ebd b\u00e1o t\u00f4i bi\u1ebft khi n\u00e0o quay l\u1ea1i.\n\u0110i\u1ec3m m\u1ea5u ch\u1ed1t, c\u0169ng l\u00e0 ph\u1ea7n th\u00fa v\u1ecb c\u1ee7a b\u00e0i n\u00e0y, l\u00e0 l\u00e0m cho ch\u1eef \"xong\" mang ngh\u0129a\n*th\u1eadt s\u1ef1* xong khi \u0111ang c\u00f3 nhi\u1ec1u agent ch\u1ea1y song song.\n\n## V\u1ea5n \u0111\u1ec1: canh ch\u1eebng r\u1ea5t t\u1ed1n k\u00e9m\n\nCh\u1edd m\u1ed9t t\u00e1c v\u1ee5 d\u00e0i c\u00f3 c\u00e1i gi\u00e1 th\u1eadt s\u1ef1:\n\n- **N\u00f3 chi\u1ebfm s\u1ef1 t\u1eadp trung c\u1ee7a b\u1ea1n.** B\u1ea1n kh\u00f4ng th\u1ec3 chuy\u1ec3n h\u1eb3n sang vi\u1ec7c kh\u00e1c, v\u00ec \u0111ang\n  n\u1eeda m\u1eaft canh xem t\u00e1c v\u1ee5 xong ch\u01b0a. Th\u1ebf l\u00e0 b\u1ea1n nh\u1eadn c\u1ea3 hai c\u00e1i t\u1ec7: m\u1eaft kh\u00f4ng \u0111\u01b0\u1ee3c\n  ngh\u1ec9, m\u00e0 vi\u1ec7c kia c\u0169ng ch\u1eb3ng th\u1eadt s\u1ef1 l\u00e0m.\n- **B\u1ea1n ki\u1ec3m tra qu\u00e1 th\u01b0\u1eddng xuy\u00ean.** C\u1ee9 20 gi\u00e2y l\u1ea1i li\u1ebfc v\u1ec1 terminal. Ch\u1eb3ng c\u00f3 g\u00ec\n  thay \u0111\u1ed5i. Ch\u00ednh c\u00e1i li\u1ebfc li\u00ean t\u1ee5c \u0111\u00f3 b\u00e0o m\u00f2n b\u1ea1n qua m\u1ed9t ng\u00e0y.\n- **\"Xong\" r\u1ea5t m\u1eadp m\u1edd khi c\u00f3 subagent.** Khi m\u1ed9t t\u00e1c v\u1ee5 sinh ra v\u00e0i agent ch\u1ea1y song\n  song, ph\u1ea7n tr\u1ea3 l\u1eddi ch\u00ednh c\u00f3 th\u1ec3 im \u1eafng trong khi c\u00e1c agent n\u1ec1n v\u1eabn \u0111ang l\u00e0m. N\u00ean\n  \"n\u00f3 ng\u1eebng in ra\" kh\u00f4ng \u0111\u00e1ng tin l\u00e0 \"n\u00f3 \u0111\u00e3 xong\".\n\nT\u00f4i mu\u1ed1n th\u00f4i *nh\u00ecn* v\u00e0 b\u1eaft \u0111\u1ea7u *nghe* \u2014 nh\u01b0ng ch\u1ec9 nghe m\u1ed9t t\u00edn hi\u1ec7u m\u00e0 t\u00f4i tin \u0111\u01b0\u1ee3c.\n\n## Vi\u00ean g\u1ea1ch n\u1ec1n: hook Stop\n\nClaude Code c\u00f3 th\u1ec3 ch\u1ea1y m\u1ed9t l\u1ec7nh shell khi c\u00f3 s\u1ef1 ki\u1ec7n x\u1ea3y ra. \u0110\u00f3 l\u00e0 c\u00e1c **hook**, v\u00e0\nb\u1ea1n c\u1ea5u h\u00ecnh ch\u00fang trong `settings.json`. C\u00e1i t\u00f4i quan t\u00e2m \u1edf \u0111\u00e2y l\u00e0 `Stop` \u2014 n\u00f3 k\u00edch\nho\u1ea1t khi Claude k\u1ebft th\u00fac m\u1ed9t l\u01b0\u1ee3t v\u00e0 tr\u1ea3 quy\u1ec1n l\u1ea1i cho b\u1ea1n.\n\nPhi\u00ean b\u1ea3n \u0111\u01a1n gi\u1ea3n nh\u1ea5t ch\u1ec9 vi\u1ec7c ph\u00e1t \u00e2m thanh khi stop:\n\n```json\n\"Stop\": [\n  { \"hooks\": [\n    { \"type\": \"command\",\n      \"command\": \"paplay \/usr\/share\/sounds\/freedesktop\/stereo\/complete.oga\" }\n  ]}\n]\n```\n\n(`paplay` l\u00e0 tr\u00ecnh ph\u00e1t c\u1ee7a PulseAudio tr\u00ean Linux; tr\u00ean macOS b\u1ea1n d\u00f9ng `afplay`, c\u00f2n\nWindows th\u00ec m\u1ed9t d\u00f2ng PowerShell.) V\u1edbi c\u00e1c t\u00e1c v\u1ee5 \u0111\u01a1n gi\u1ea3n, c\u00e1i n\u00e0y \u0111\u00e3 h\u1eefu \u00edch r\u1ed3i.\nNgh\u1ecbch th\u1eed n\u0103m ph\u00fat l\u00e0 th\u1ea5y tuy\u1ec7t \u2014 cho t\u1edbi c\u00e1i ng\u00e0y n\u00f3 n\u00f3i d\u1ed1i b\u1ea1n.\n\n## V\u00ec sao b\u1ea3n \u0111\u01a1n gi\u1ea3n ch\u01b0a \u0111\u1ee7\n\nS\u1ef1 ki\u1ec7n `Stop` c\u00f3 th\u1ec3 k\u00edch ho\u1ea1t trong khi c\u00f4ng vi\u1ec7c n\u1ec1n v\u1eabn \u0111ang ch\u1ea1y. N\u1ebfu t\u00e1c v\u1ee5 c\u1ee7a\nb\u1ea1n \u0111\u00e3 bung ra c\u00e1c subagent song song, ho\u1eb7c kh\u1edfi \u0111\u1ed9ng m\u1ed9t l\u1ec7nh shell d\u00e0i \u1edf ch\u1ebf \u0111\u1ed9\nn\u1ec1n, th\u00ec l\u01b0\u1ee3t \u0111\u00f3 c\u00f3 th\u1ec3 \"d\u1eebng\" \u1edf ti\u1ec1n c\u1ea3nh trong khi nh\u1eefng th\u1ee9 kia v\u1eabn ti\u1ebfp t\u1ee5c. C\u00e1i\nhook ng\u00e2y th\u01a1 ph\u00e1t ra \u00e2m thanh vui v\u1ebb c\u1ee7a n\u00f3, b\u1ea1n quay l\u1ea1i \u2014 v\u00e0 Claude v\u1eabn \u0111ang b\u1eadn.\n\nM\u1ed9t \u00e2m b\u00e1o \"xong\" m\u00e0 b\u1ea1n kh\u00f4ng tin \u0111\u01b0\u1ee3c th\u00ec c\u00f2n t\u1ec7 h\u01a1n l\u00e0 kh\u00f4ng c\u00f3, v\u00ec gi\u1edd b\u1ea1n l\u1ea1i\nho\u00e0i nghi n\u00f3 v\u00e0 v\u1eabn ph\u1ea3i nh\u00ecn m\u00e0n h\u00ecnh. N\u00ean m\u1ee5c ti\u00eau th\u1eadt s\u1ef1 kh\u00f4ng ph\u1ea3i l\u00e0 \"ph\u00e1t \u00e2m\nthanh khi stop\". M\u00e0 l\u00e0 **ch\u1ec9 ph\u00e1t \u00e2m thanh khi m\u1ecdi th\u1ee9 th\u1eadt s\u1ef1 \u0111\u00e3 xong.**\n\nNgh\u0129a l\u00e0 t\u1ea1i th\u1eddi \u0111i\u1ec3m stop ph\u1ea3i tr\u1ea3 l\u1eddi hai c\u00e2u h\u1ecfi:\n\n1. C\u00f2n **subagent** n\u00e0o \u0111ang ch\u1ea1y kh\u00f4ng?\n2. C\u00f2n **l\u1ec7nh shell n\u1ec1n** n\u00e0o \u0111ang ch\u1ea1y kh\u00f4ng?\n\nN\u1ebfu m\u1ed9t trong hai l\u00e0 \"c\u00f2n\", h\u00e3y im l\u1eb7ng. Ch\u1ec9 khi c\u1ea3 hai \u0111\u1ec1u \"h\u1ebft\" th\u00ec m\u1edbi an to\u00e0n \u0111\u1ec3\nk\u00eau.\n\n## \u0110\u1ebfm agent b\u1eb1ng hook\n\nSubagent ch\u1ea1y *b\u00ean trong* ti\u1ebfn tr\u00ecnh Claude, n\u00ean ch\u00fang kh\u00f4ng hi\u1ec7n ra nh\u01b0 nh\u1eefng ch\u01b0\u01a1ng\ntr\u00ecnh ri\u00eang \u0111\u1ec3 b\u1ea1n t\u00ecm. T\u00f4i t\u1ef1 theo d\u00f5i ch\u00fang b\u1eb1ng m\u1ed9t b\u1ed9 \u0111\u1ebfm nh\u1ecf \u2014 m\u1ed9t file t\u1ea1m cho\nm\u1ed7i phi\u00ean \u2014 \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt b\u1edfi ba hook n\u1eefa:\n\n- **`UserPromptSubmit`** \u0111\u1eb7t l\u1ea1i b\u1ed9 \u0111\u1ebfm v\u1ec1 `0` \u1edf \u0111\u1ea7u m\u1ed7i l\u01b0\u1ee3t.\n- **`PreToolUse` tr\u00ean c\u00f4ng c\u1ee5 `Agent`** c\u1ed9ng m\u1ed9t m\u1ed7i khi m\u1ed9t agent b\u1eaft \u0111\u1ea7u.\n- **`SubagentStop`** tr\u1eeb m\u1ed9t m\u1ed7i khi m\u1ed9t agent k\u1ebft th\u00fac.\n\n```json\n\"UserPromptSubmit\": [{ \"hooks\": [{ \"type\": \"command\",\n  \"command\": \"sid=$(cat | jq -r '.session_id'); echo 0 > \/tmp\/claude-agents-$sid.count\" }]}],\n\n\"PreToolUse\": [{ \"matcher\": \"Agent\", \"hooks\": [{ \"type\": \"command\",\n  \"command\": \"sid=$(cat | jq -r '.session_id'); f=\/tmp\/claude-agents-$sid.count; echo $(( $(cat $f) + 1 )) > $f\" }]}],\n\n\"SubagentStop\": [{ \"hooks\": [{ \"type\": \"command\",\n  \"command\": \"sid=$(cat | jq -r '.session_id'); f=\/tmp\/claude-agents-$sid.count; echo $(( $(cat $f) - 1 )) > $f\" }]}]\n```\n\nGi\u1edd, t\u1ea1i b\u1ea5t k\u1ef3 th\u1eddi \u0111i\u1ec3m n\u00e0o, file \u0111\u00f3 gi\u1eef s\u1ed1 agent c\u00f2n \u0111ang ch\u1ea1y. N\u1ebfu n\u00f3 l\u1edbn h\u01a1n 0\nl\u00fac l\u01b0\u1ee3t d\u1eebng l\u1ea1i, t\u1ee9c l\u00e0 c\u00f2n vi\u1ec7c s\u1eafp t\u1edbi.\n\n## Script \"ng\u01b0\u1eddi g\u00e1c c\u1ed5ng\"\n\nThay v\u00ec ph\u00e1t \u00e2m thanh tr\u1ef1c ti\u1ebfp, hook `Stop` c\u1ee7a t\u00f4i g\u1ecdi m\u1ed9t script nh\u1ecf \u0111\u1ec3 *quy\u1ebft\n\u0111\u1ecbnh* c\u00f3 n\u00ean ph\u00e1t hay kh\u00f4ng. Script tr\u1ea3 v\u1ec1 `0` ngh\u0129a l\u00e0 \"c\u1ee9 ch\u1ea1y \u0111i\" v\u00e0 `1` ngh\u0129a l\u00e0\n\"im l\u1eb7ng\", v\u00e0 hook ch\u1ec9 ph\u00e1t \u00e2m thanh khi nh\u1eadn `0`:\n\n```bash\nsid=$(cat | jq -r '.session_id')\necho idle > \/tmp\/claude-sl-$sid.state\n~\/.claude\/hooks\/notify-done.sh \"$sid\" && paplay ...\/complete.oga 2>\/dev\/null || true\n```\n\nB\u1ea3n th\u00e2n script ch\u1ea1y hai l\u1ea7n ki\u1ec3m tra. \u0110\u1ea7u ti\u00ean l\u00e0 b\u1ed9 \u0111\u1ebfm agent:\n\n```bash\nn=$(cat \"\/tmp\/claude-agents-$sid.count\" 2>\/dev\/null)\n[ \"${n:-0}\" -gt 0 ] && exit 1     # c\u00f2n agent ch\u1ea1y -> im l\u1eb7ng\n```\n\nTh\u1ee9 hai l\u00e0 c\u00e1c l\u1ec7nh shell n\u1ec1n. Kh\u00e1c v\u1edbi agent, c\u00e1c l\u1ec7nh `bash` n\u1ec1n *l\u00e0* ti\u1ebfn tr\u00ecnh\ncon th\u1eadt c\u1ee7a Claude CLI, n\u00ean script duy\u1ec7t c\u00e2y ti\u1ebfn tr\u00ecnh: n\u00f3 t\u00ecm ti\u1ebfn tr\u00ecnh Claude,\nr\u1ed3i t\u00ecm b\u1ea5t k\u1ef3 ti\u1ebfn tr\u00ecnh con `bash` n\u00e0o c\u00f2n s\u00f3t l\u1ea1i (c\u1ea9n th\u1eadn b\u1ecf qua ch\u00ednh n\u00f3). N\u1ebfu\nt\u00ecm th\u1ea5y, t\u1ee9c l\u00e0 v\u1eabn c\u00f2n vi\u1ec7c \u0111ang ch\u1ea1y:\n\n```bash\n# (r\u00fat g\u1ecdn) v\u1edbi m\u1ed7i ti\u1ebfn tr\u00ecnh c\u00f3 cha l\u00e0 Claude CLI:\n#   n\u1ebfu n\u00f3 l\u00e0 m\u1ed9t shell bash kh\u00f4ng ph\u1ea3i ch\u00ednh ta -> vi\u1ec7c n\u1ec1n c\u00f2n s\u1ed1ng -> exit 1\n```\n\nN\u1ebfu c\u1ea3 hai l\u1ea7n ki\u1ec3m tra \u0111\u1ec1u \"s\u1ea1ch\" \u2014 b\u1ed9 \u0111\u1ebfm b\u1eb1ng 0, kh\u00f4ng c\u00f2n shell n\u1ec1n l\u1ea1c l\u00f5ng n\u00e0o \u2014\nscript tr\u1ea3 v\u1ec1 `0`, v\u00e0 \u00e2m thanh vang l\u00ean. Gi\u1edd ti\u1ebfng chu\u00f4ng mang \u0111\u00fang ngh\u0129a t\u00f4i mu\u1ed1n:\n**m\u1ecdi th\u1ee9 \u0111\u00e3 xong, quay l\u1ea1i \u0111i.**\n\nScript c\u0169ng ghi l\u1ea1i m\u1ed7i quy\u1ebft \u0111\u1ecbnh v\u00e0o m\u1ed9t file t\u1ea1m, n\u00ean n\u1ebfu c\u00f3 l\u00fac n\u00f3 im l\u1eb7ng trong\nkhi t\u00f4i mong c\u00f3 \u00e2m thanh, t\u00f4i c\u00f3 th\u1ec3 xem t\u1ea1i sao: \"agent counter=2\" hay \"background\nbash alive\" cho t\u00f4i bi\u1ebft n\u00f3 \u0111\u00e3 \u0111\u00fang khi ch\u1edd.\n\n## Kh\u00f4ng ch\u1ec9 l\u00e0 \u00e2m thanh\n\nM\u1ed9t khi b\u1ea1n c\u00f3 m\u1ed9t t\u00edn hi\u1ec7u \"xong\" \u0111\u00e1ng tin, \u00e2m thanh ch\u1ec9 l\u00e0 m\u1ed9t trong nhi\u1ec1u th\u1ee9 b\u1ea1n\nc\u00f3 th\u1ec3 l\u00e0m v\u1edbi n\u00f3. C\u0169ng ch\u00ednh hook \u0111\u00f3 c\u00f3 th\u1ec3 b\u1eadt m\u1ed9t th\u00f4ng b\u00e1o desktop (`notify-send`\ntr\u00ean Linux, `osascript` tr\u00ean macOS), ch\u1edbp nh\u00e1y terminal, ho\u1eb7c g\u1eedi tin nh\u1eafn t\u1edbi \u0111i\u1ec7n\ntho\u1ea1i. T\u00f4i th\u00edch \u00e2m thanh v\u00ec n\u00f3 \u1edf d\u1ea1ng n\u1ec1n \u2014 t\u00f4i th\u1eadm ch\u00ed kh\u00f4ng c\u1ea7n \u0111ang nh\u00ecn \u0111\u00fang\nm\u00e0n h\u00ecnh.\n\n## V\u00e0i \u0111i\u1ec3m c\u1ea7n l\u01b0u \u00fd\n\n- **Ch\u1ecdn tr\u00ecnh ph\u00e1t h\u1ee3p v\u1edbi h\u1ec7 \u0111i\u1ec1u h\u00e0nh.** `paplay` l\u00e0 c\u1ee7a Linux\/PulseAudio. macOS\n  c\u00f3 `afplay`, Windows c\u00f3 PowerShell. H\u00e3y ch\u1ecdn m\u1ed9t file \u00e2m thanh th\u1eadt s\u1ef1 t\u1ed3n t\u1ea1i tr\u00ean\n  m\u00e1y b\u1ea1n.\n- **Ch\u1ea1y headless ho\u1eb7c qua SSH c\u00f3 th\u1ec3 kh\u00f4ng c\u00f3 \u00e2m thanh.** C\u00e1i `|| true` \u1edf cu\u1ed1i gi\u00fap\n  m\u1ed9t tr\u00ecnh ph\u00e1t b\u1ecb thi\u1ebfu kh\u00f4ng bi\u1ebfn th\u00e0nh l\u1ed7i \u2014 \u0111\u00e1ng \u0111\u1ec3 gi\u1eef l\u1ea1i.\n- **Gi\u1eef c\u00e1c b\u01b0\u1edbc ki\u1ec3m tra r\u1ebb.** C\u00e1i n\u00e0y ch\u1ea1y \u1edf m\u1ed7i l\u1ea7n stop, n\u00ean script c\u1ea7n nhanh v\u00e0\n  kh\u00f4ng g\u1ecdi m\u1ea1ng. \u0110\u1ecdc m\u1ed9t file \u0111\u1ebfm v\u00e0 qu\u00e9t `\/proc` l\u00e0 \u0111\u1ee7 nhanh.\n\n## K\u1ebft l\u1ea1i\n\nM\u1eb7c \u0111\u1ecbnh ng\u01b0\u1eddi ta cho r\u1eb1ng b\u1ea1n s\u1ebd nh\u00ecn m\u00e0n h\u00ecnh \u0111\u1ec3 bi\u1ebft khi n\u00e0o Claude xong. V\u1edbi c\u00e1c\nt\u00e1c v\u1ee5 d\u00e0i, \u0111\u00f3 l\u00e0 m\u1ed9t kho\u1ea3n thu\u1ebf \u0111\u00e1nh v\u00e0o m\u1eaft v\u00e0 s\u1ef1 t\u1eadp trung c\u1ee7a b\u1ea1n. M\u1ed9t hook `Stop`\nph\u00e1t \u00e2m thanh s\u1ebd g\u1ee1 b\u1ecf kho\u1ea3n thu\u1ebf \u0111\u00f3 \u2014 mi\u1ec5n l\u00e0 \u00e2m thanh trung th\u1ef1c. To\u00e0n b\u1ed9 m\u1eb9o l\u00e0\nl\u00e0m cho \"xong\" ngh\u0129a l\u00e0 *t\u1ea5t c\u1ea3* agent v\u00e0 vi\u1ec7c n\u1ec1n \u0111\u00e3 k\u1ebft th\u00fac, ch\u1ee9 kh\u00f4ng ch\u1ec9 l\u00e0 ti\u1ec1n\nc\u1ea3nh \u0111\u00e3 im. \u0110\u1ebfm agent b\u1eb1ng m\u1ed9t b\u1ed9 \u0111\u1ebfm, ki\u1ec3m tra c\u00e1c shell n\u1ec1n c\u00f2n s\u00f3t, r\u1ed3i m\u1edbi k\u00eau.\nSau \u0111\u00f3, b\u1ea1n c\u00f3 th\u1ec3 r\u1eddi m\u1eaft v\u00e0 tin v\u00e0o tai m\u00ecnh.\n\n## Link tham kh\u1ea3o\n> B\u00e0i vi\u1ebft g\u1ed1c (ti\u1ebfng Anh): [Play a Sound When Claude Code Is Actually Done](https:\/\/ledangtuanbk.vercel.app\/article\/play-a-sound-when-claude-code-is-actually-done)","published_at":"2026-09-14T10:28:28.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T21:19:02.000000Z","edited_at":"2026-09-14T10:28:57.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":8,"points":0,"views_count":17,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/6fd9d7e3-2520-4cec-9a75-f2e815a26cb4.png","user":{"data":{"id":17813,"url":"https:\/\/viblo.asia\/u\/ledangtuanbk","avatar":"e02df47b-f399-41da-a99a-de361ea4567d.jpeg","name":"Tommy Le","username":"ledangtuanbk","followers_count":77,"reputation":1839,"posts_count":60,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"claude-ai-code","name":"Claude AI code"}]},"commentators":{"data":[]}},{"id":106662,"title":"\ud83d\ude80 Chapter 5 \u2014 Platform: Ph\u1ea7n E \u2014 Tri\u1ec3n khai Google Online Boutique tr\u00ean Amazon EKS b\u1eb1ng Argo CD v\u00e0 GitOps","slug":"7Z4DEgGlJnX","url":"https:\/\/viblo.asia\/p\/chapter-5-platform-phan-e-trien-khai-google-online-boutique-tren-amazon-eks-bang-argo-cd-va-gitops-7Z4DEgGlJnX","user_id":98940,"moderation":null,"transliterated":"chapter-5-platform-phan-e-trien-khai-google-online-boutique-tren-amazon-eks-bang-argo-cd-va-gitops","contents_short":"\u1ede Chapter 5D, ch\u00fang ta \u0111\u00e3 s\u1eed d\u1ee5ng Helm \u0111\u1ec3 tri\u1ec3n khai Google Online Boutique l\u00ean Amazon EKS b\u1eb1ng c\u00e1c l\u1ec7nh:\n\nC\u00e1ch n\u00e0y \u0111\u00e3 t\u1ed1t h\u01a1n vi\u1ec7c s\u1eed d\u1ee5ng nhi\u1ec1u Kubernetes manifest ri\u00eang l\u1ebb. Tuy nhi\u00ean, qu\u00e1 tr\u00ecnh deploy v\u1eabn ph\u1ee5 thu\u1ed9c v\u00e0o m\u00e1y c\u00e1 nh\u00e2n c\u1ee7a developer.\n\nTrong Chapter 5E, ch\u00fang ta s\u1ebd ti\u1ebfp t\u1ee5c s\u1eed d\u1ee5ng:\n\n* Google Online Boutique\n* Amazon EKS t\u1eeb Chapter 5B\n* Helm chart t\u1eeb Chapter 5D\n* Amazon ECR t\u1eeb Cha...","contents":"\u1ede **Chapter 5D**, ch\u00fang ta \u0111\u00e3 s\u1eed d\u1ee5ng Helm \u0111\u1ec3 tri\u1ec3n khai Google Online Boutique l\u00ean Amazon EKS b\u1eb1ng c\u00e1c l\u1ec7nh:\n\n```bash\nhelm install\nhelm upgrade\nhelm rollback\n```\n\nC\u00e1ch n\u00e0y \u0111\u00e3 t\u1ed1t h\u01a1n vi\u1ec7c s\u1eed d\u1ee5ng nhi\u1ec1u Kubernetes manifest ri\u00eang l\u1ebb. Tuy nhi\u00ean, qu\u00e1 tr\u00ecnh deploy v\u1eabn ph\u1ee5 thu\u1ed9c v\u00e0o m\u00e1y c\u00e1 nh\u00e2n c\u1ee7a developer.\n\nTrong Chapter 5E, ch\u00fang ta s\u1ebd ti\u1ebfp t\u1ee5c s\u1eed d\u1ee5ng:\n\n* Google Online Boutique\n* Amazon EKS t\u1eeb Chapter 5B\n* Helm chart t\u1eeb Chapter 5D\n* Amazon ECR t\u1eeb Chapter 4 n\u1ebfu \u0111\u00e3 s\u1eed d\u1ee5ng\n* GitHub\n* Argo CD\n\nM\u1ee5c ti\u00eau l\u00e0 chuy\u1ec3n t\u1eeb:\n\n```text\nDeveloper\n    \u2193\nhelm upgrade\n    \u2193\nAmazon EKS\n```\n\nsang:\n\n```text\nDeveloper\n    \u2193\nGitHub\n    \u2193\nArgo CD\n    \u2193\nHelm\n    \u2193\nAmazon EKS\n```\n\n> **Git tr\u1edf th\u00e0nh n\u01a1i l\u01b0u tr\u1eef tr\u1ea1ng th\u00e1i mong mu\u1ed1n c\u1ee7a h\u1ec7 th\u1ed1ng. Argo CD s\u1ebd t\u1ef1 \u0111\u1ed9ng \u0111\u1ed3ng b\u1ed9 tr\u1ea1ng th\u00e1i \u0111\u00f3 v\u00e0o Amazon EKS.**\n\n---\n\n## 1. M\u1ee5c ti\u00eau\n\nSau khi ho\u00e0n th\u00e0nh Chapter 5E, ch\u00fang ta s\u1ebd c\u00f3:\n\n* Argo CD \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t tr\u00ean Amazon EKS.\n* Argo CD k\u1ebft n\u1ed1i \u0111\u01b0\u1ee3c v\u1edbi GitHub.\n* Online Boutique \u0111\u01b0\u1ee3c qu\u1ea3n l\u00fd b\u1eb1ng Helm th\u00f4ng qua Argo CD.\n* Thay \u0111\u1ed5i c\u1ea5u h\u00ecnh b\u1eb1ng Git thay v\u00ec ch\u1ea1y `helm upgrade` th\u1ee7 c\u00f4ng.\n* T\u1ef1 \u0111\u1ed9ng \u0111\u1ed3ng b\u1ed9 deployment t\u1eeb GitHub v\u00e0o EKS.\n* Ki\u1ec3m tra tr\u1ea1ng th\u00e1i `Synced`, `OutOfSync` v\u00e0 `Healthy`.\n* Th\u1eed nghi\u1ec7m c\u01a1 ch\u1ebf t\u1ef1 s\u1eeda drift b\u1eb1ng `selfHeal`.\n* Th\u1eed rollback b\u1eb1ng Git revert.\n\nKi\u1ebfn tr\u00fac cu\u1ed1i Chapter:\n\n```text\nDeveloper\n    \u2502\n    \u25bc\nGitHub Repository\n    \u2502\n    \u25bc\nHelm Chart \/ GitOps Configuration\n    \u2502\n    \u25bc\nArgo CD\n    \u2502\n    \u25bc\nAmazon EKS\n    \u2502\n    \u25bc\nGoogle Online Boutique\n```\n\n---\n\n## 2. \u0110i\u1ec1u ki\u1ec7n tr\u01b0\u1edbc khi b\u1eaft \u0111\u1ea7u\n\nChapter n\u00e0y n\u1ed1i ti\u1ebfp Chapter 5D.\n\nB\u1ea1n c\u1ea7n c\u00f3:\n\n* Amazon EKS cluster \u0111ang \u1edf tr\u1ea1ng th\u00e1i `ACTIVE`.\n* `kubectl` \u0111\u00e3 k\u1ebft n\u1ed1i \u0111\u01b0\u1ee3c v\u1edbi EKS.\n* Helm \u0111\u00e3 \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t.\n* Google Online Boutique \u0111\u00e3 \u0111\u01b0\u1ee3c tri\u1ec3n khai th\u00e0nh c\u00f4ng \u1edf Chapter 5D.\n* C\u00f3 t\u00e0i kho\u1ea3n GitHub.\n* C\u00f3 Git \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t tr\u00ean m\u00e1y local.\n\nKi\u1ec3m tra c\u00e1c c\u00f4ng c\u1ee5:\n\n```bash\naws --version\nkubectl version --client\nhelm version\ngit --version\n```\n\nKi\u1ec3m tra EKS:\n\n```bash\naws eks describe-cluster \\\n  --name online-boutique-eks \\\n  --region ap-northeast-1 \\\n  --query 'cluster.status' \\\n  --output text\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\nACTIVE\n```\n\nKi\u1ec3m tra node:\n\n```bash\nkubectl get nodes\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\nNAME                                            STATUS   ROLES    AGE   VERSION\nip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal   Ready    <none>   ...   ...\n```\n\nKi\u1ec3m tra namespace:\n\n```bash\nkubectl get namespace online-boutique\n```\n\nKi\u1ec3m tra c\u00e1c Pod:\n\n```bash\nkubectl get pods -n online-boutique\n```\n\nKi\u1ec3m tra Helm release:\n\n```bash\nhelm list -n online-boutique\n```\n\nK\u1ebft qu\u1ea3 c\u1ea7n c\u00f3 release t\u01b0\u01a1ng t\u1ef1:\n\n```text\nNAME             NAMESPACE          STATUS\nonline-boutique  online-boutique    deployed\n```\n\n---\n\n## 3. Ki\u1ec3m tra tr\u1ea1ng th\u00e1i \u1ee9ng d\u1ee5ng hi\u1ec7n t\u1ea1i\n\nKi\u1ec3m tra Deployment:\n\n```bash\nkubectl get deployments -n online-boutique\n```\n\nKi\u1ec3m tra Service:\n\n```bash\nkubectl get services -n online-boutique\n```\n\nKi\u1ec3m tra frontend:\n\n```bash\nkubectl get service frontend -n online-boutique\n```\n\nL\u1ea5y \u0111\u1ecba ch\u1ec9 frontend:\n\n```bash\nexport FRONTEND_URL=$(\n  kubectl get service frontend \\\n    -n online-boutique \\\n    -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'\n)\n```\n\nKi\u1ec3m tra:\n\n```bash\necho \"$FRONTEND_URL\"\n```\n\nTest:\n\n```bash\ncurl -I \"http:\/\/$FRONTEND_URL\"\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\nHTTP\/1.1 200 OK\n```\n\nM\u1edf tr\u00ecnh duy\u1ec7t:\n\n```text\nhttp:\/\/<FRONTEND_URL>\n```\n\nN\u1ebfu \u1ee9ng d\u1ee5ng v\u1eabn ho\u1ea1t \u0111\u1ed9ng, ch\u00fang ta c\u00f3 th\u1ec3 b\u1eaft \u0111\u1ea7u c\u00e0i \u0111\u1eb7t Argo CD.\n\n---\n\n## 4. Argo CD l\u00e0 g\u00ec?\n\nArgo CD l\u00e0 m\u1ed9t c\u00f4ng c\u1ee5 GitOps d\u00e0nh cho Kubernetes.\n\nArgo CD theo d\u00f5i tr\u1ea1ng th\u00e1i mong mu\u1ed1n trong Git v\u00e0 so s\u00e1nh v\u1edbi tr\u1ea1ng th\u00e1i th\u1ef1c t\u1ebf trong Kubernetes.\n\n```text\nGit\n \u2514\u2500\u2500 Desired State\n          \u2502\n          \u25bc\n       Argo CD\n          \u2502\n          \u25bc\n   Kubernetes Cluster\n```\n\nV\u00ed d\u1ee5:\n\nTrong Git, frontend c\u00f3:\n\n```yaml\nreplicas: 2\n```\n\nNh\u01b0ng trong EKS, frontend ch\u1ec9 c\u00f3:\n\n```text\nreplicas: 1\n```\n\nArgo CD s\u1ebd ph\u00e1t hi\u1ec7n s\u1ef1 kh\u00e1c bi\u1ec7t:\n\n```text\nGit desired state: 2 replicas\nCluster state:     1 replica\n```\n\nTr\u1ea1ng th\u00e1i \u1ee9ng d\u1ee5ng c\u00f3 th\u1ec3 tr\u1edf th\u00e0nh:\n\n```text\nOutOfSync\n```\n\nN\u1ebfu b\u1eadt automated sync v\u00e0 self-healing, Argo CD c\u00f3 th\u1ec3 t\u1ef1 \u0111\u1ed9ng \u0111\u01b0a cluster v\u1ec1 tr\u1ea1ng th\u00e1i \u0111\u01b0\u1ee3c khai b\u00e1o trong Git.\n\n---\n\n## 5. T\u1ea1o namespace cho Argo CD\n\nT\u1ea1o namespace:\n\n```bash\nkubectl create namespace argocd\n```\n\nN\u1ebfu namespace \u0111\u00e3 t\u1ed3n t\u1ea1i, c\u00f3 th\u1ec3 b\u1ecf qua l\u1ed7i:\n\n```bash\nkubectl get namespace argocd\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\nNAME      STATUS   AGE\nargocd    Active   ...\n```\n\n---\n\n## 6. C\u00e0i \u0111\u1eb7t Argo CD tr\u00ean Amazon EKS\n\nC\u00e0i Argo CD b\u1eb1ng manifest ch\u00ednh th\u1ee9c:\n\n```bash\nkubectl apply \\\n  -n argocd \\\n  -f https:\/\/raw.githubusercontent.com\/argoproj\/argo-cd\/stable\/manifests\/install.yaml\n```\n\nKi\u1ec3m tra c\u00e1c Pod:\n\n```bash\nkubectl get pods -n argocd\n```\n\nTheo d\u00f5i qu\u00e1 tr\u00ecnh kh\u1edfi \u0111\u1ed9ng:\n\n```bash\nkubectl get pods -n argocd -w\n```\n\nD\u1eebng theo d\u00f5i b\u1eb1ng:\n\n```text\nCtrl + C\n```\n\nC\u00e1c Pod ch\u00ednh c\u1ea7n chuy\u1ec3n sang tr\u1ea1ng th\u00e1i `Running`:\n\n```text\nargocd-application-controller\nargocd-repo-server\nargocd-server\nargocd-redis\nargocd-dex-server\n```\n\nKi\u1ec3m tra chi ti\u1ebft:\n\n```bash\nkubectl get pods -n argocd -o wide\n```\n\nN\u1ebfu Pod g\u1eb7p l\u1ed7i:\n\n```bash\nkubectl describe pod <POD_NAME> -n argocd\n```\n\nXem logs:\n\n```bash\nkubectl logs <POD_NAME> -n argocd\n```\n\n---\n\n## 7. Ki\u1ec3m tra c\u00e1c Service c\u1ee7a Argo CD\n\nCh\u1ea1y:\n\n```bash\nkubectl get services -n argocd\n```\n\nB\u1ea1n s\u1ebd th\u1ea5y Service t\u01b0\u01a1ng t\u1ef1:\n\n```text\nNAME                                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)\nargocd-applicationset-controller         ClusterIP   ...\nargocd-dex-server                         ClusterIP   ...\nargocd-metrics                            ClusterIP   ...\nargocd-notifications-controller-metrics  ClusterIP   ...\nargocd-redis                              ClusterIP   ...\nargocd-repo-server                        ClusterIP   ...\nargocd-server                             ClusterIP   ...\nargocd-server-metrics                    ClusterIP   ...\n```\n\nM\u1eb7c \u0111\u1ecbnh, `argocd-server` th\u01b0\u1eddng s\u1eed d\u1ee5ng `ClusterIP`.\n\n\u0110\u1ec3 truy c\u1eadp Argo CD t\u1eeb m\u00e1y local, ch\u00fang ta s\u1ebd s\u1eed d\u1ee5ng port forwarding.\n\n---\n\n## 8. Truy c\u1eadp giao di\u1ec7n Argo CD b\u1eb1ng port-forward\n\nM\u1edf m\u1ed9t terminal m\u1edbi v\u00e0 ch\u1ea1y:\n\n```bash\nkubectl port-forward \\\n  svc\/argocd-server \\\n  -n argocd \\\n  8080:443\n```\n\nK\u1ebft qu\u1ea3 t\u01b0\u01a1ng t\u1ef1:\n\n```text\nForwarding from 127.0.0.1:8080 -> 8080\nForwarding from [::1]:8080 -> 8080\n```\n\nGi\u1eef terminal n\u00e0y lu\u00f4n m\u1edf.\n\nM\u1edf tr\u00ecnh duy\u1ec7t:\n\n```text\nhttps:\/\/localhost:8080\n```\n\nTr\u00ecnh duy\u1ec7t c\u00f3 th\u1ec3 hi\u1ec3n th\u1ecb c\u1ea3nh b\u00e1o ch\u1ee9ng ch\u1ec9 do Argo CD s\u1eed d\u1ee5ng certificate m\u1eb7c \u0111\u1ecbnh. Ch\u1ecdn ti\u1ebfp t\u1ee5c truy c\u1eadp trong m\u00f4i tr\u01b0\u1eddng lab.\n\n---\n\n## 9. L\u1ea5y m\u1eadt kh\u1ea9u admin ban \u0111\u1ea7u\n\nArgo CD t\u1ea1o m\u1eadt kh\u1ea9u ban \u0111\u1ea7u trong Secret:\n\n```bash\nkubectl -n argocd get secret argocd-initial-admin-secret\n```\n\nL\u1ea5y m\u1eadt kh\u1ea9u:\n\n```bash\nkubectl -n argocd get secret \\\n  argocd-initial-admin-secret \\\n  -o jsonpath=\"{.data.password}\" \\\n  | base64 -d\n```\n\nL\u01b0u l\u1ea1i m\u1eadt kh\u1ea9u \u0111\u01b0\u1ee3c tr\u1ea3 v\u1ec1.\n\nTh\u00f4ng tin \u0111\u0103ng nh\u1eadp:\n\n```text\nUsername: admin\nPassword: <PASSWORD_FROM_COMMAND>\n```\n\n\u0110\u0103ng nh\u1eadp v\u00e0o:\n\n```text\nhttps:\/\/localhost:8080\n```\n\nSau khi \u0111\u0103ng nh\u1eadp th\u00e0nh c\u00f4ng, b\u1ea1n s\u1ebd th\u1ea5y giao di\u1ec7n Argo CD.\n\n---\n\n## 10. C\u00e0i \u0111\u1eb7t Argo CD CLI\n\n### 10.1. Tr\u00ean macOS\n\nN\u1ebfu s\u1eed d\u1ee5ng Homebrew:\n\n```bash\nbrew install argocd\n```\n\nKi\u1ec3m tra:\n\n```bash\nargocd version --client\n```\n\n### 10.2. Tr\u00ean Ubuntu\n\nT\u1ea3i Argo CD CLI:\n\n```bash\ncurl -sSL \\\n  -o argocd-linux-amd64 \\\n  https:\/\/github.com\/argoproj\/argo-cd\/releases\/latest\/download\/argocd-linux-amd64\n```\n\nC\u1ea5p quy\u1ec1n th\u1ef1c thi:\n\n```bash\nchmod +x argocd-linux-amd64\n```\n\nDi chuy\u1ec3n binary:\n\n```bash\nsudo mv argocd-linux-amd64 \/usr\/local\/bin\/argocd\n```\n\nKi\u1ec3m tra:\n\n```bash\nargocd version --client\n```\n\n---\n\n## 11. \u0110\u0103ng nh\u1eadp Argo CD b\u1eb1ng CLI\n\nV\u00ec Argo CD \u0111ang \u0111\u01b0\u1ee3c truy c\u1eadp th\u00f4ng qua port-forward, m\u1edf m\u1ed9t terminal kh\u00e1c v\u00e0 ch\u1ea1y:\n\n```bash\nargocd login localhost:8080 \\\n  --username admin \\\n  --password '<ARGOCD_ADMIN_PASSWORD>' \\\n  --insecure\n```\n\nThay:\n\n```text\n<ARGOCD_ADMIN_PASSWORD>\n```\n\nb\u1eb1ng m\u1eadt kh\u1ea9u l\u1ea5y \u1edf b\u01b0\u1edbc tr\u01b0\u1edbc.\n\nKi\u1ec3m tra phi\u00ean \u0111\u0103ng nh\u1eadp:\n\n```bash\nargocd account get-user-info\n```\n\nK\u1ebft qu\u1ea3 c\u1ea7n hi\u1ec3n th\u1ecb user:\n\n```text\nLogged In: true\nUsername: admin\n```\n\n---\n\n## 12. Ki\u1ec3m tra cluster m\u00e0 Argo CD \u0111ang qu\u1ea3n l\u00fd\n\nCh\u1ea1y:\n\n```bash\nargocd cluster list\n```\n\nArgo CD th\u01b0\u1eddng \u0111\u00e3 c\u00f3 cluster n\u1ed9i b\u1ed9:\n\n```text\nhttps:\/\/kubernetes.default.svc\n```\n\nCluster n\u00e0y ch\u00ednh l\u00e0 Kubernetes cluster n\u01a1i Argo CD \u0111ang ch\u1ea1y.\n\nK\u1ebft qu\u1ea3 t\u01b0\u01a1ng t\u1ef1:\n\n```text\nSERVER                         NAME        VERSION   STATUS\nhttps:\/\/kubernetes.default.svc in-cluster  v1.xx     Successful\n```\n\nCh\u00fang ta s\u1ebd deploy Online Boutique v\u00e0o ch\u00ednh cluster n\u00e0y.\n\n---\n\n## 13. T\u1ea1o GitOps repository\n\nKh\u00f4ng n\u00ean d\u00f9ng tr\u1ef1c ti\u1ebfp repository source code c\u1ee7a Online Boutique \u0111\u1ec3 l\u01b0u to\u00e0n b\u1ed9 c\u1ea5u h\u00ecnh GitOps trong lab \u0111\u1ea7u ti\u00ean.\n\nT\u1ea1o m\u1ed9t repository m\u1edbi tr\u00ean GitHub.\n\nV\u00ed d\u1ee5 t\u00ean repository:\n\n```text\nonline-boutique-gitops\n```\n\nRepository c\u00f3 th\u1ec3 c\u00f3 c\u1ea5u tr\u00fac:\n\n```text\nonline-boutique-gitops\/\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 charts\/\n\u2502   \u2514\u2500\u2500 online-boutique\/\n\u2514\u2500\u2500 environments\/\n    \u2514\u2500\u2500 dev\/\n        \u2514\u2500\u2500 values.yaml\n```\n\nTrong Chapter 5E, ch\u00fang ta s\u1ebd s\u1eed d\u1ee5ng Helm chart \u0111\u00e3 c\u00f3 t\u1eeb Chapter 5D.\n\nC\u00f3 hai c\u00e1ch t\u1ed5 ch\u1ee9c:\n\n### Ph\u01b0\u01a1ng \u00e1n A \u2014 L\u01b0u Helm chart v\u00e0o GitOps repository\n\n```text\nonline-boutique-gitops\/\n\u2514\u2500\u2500 helm-chart\/\n    \u251c\u2500\u2500 Chart.yaml\n    \u251c\u2500\u2500 values.yaml\n    \u2514\u2500\u2500 templates\/\n```\n\n### Ph\u01b0\u01a1ng \u00e1n B \u2014 S\u1eed d\u1ee5ng Helm chart t\u1eeb repository Online Boutique\n\n```text\nGoogle Online Boutique Repository\n        \u2193\nhelm-chart\/\n        \u2193\nArgo CD\n        \u2193\nAmazon EKS\n```\n\n\u0110\u1ec3 d\u1ec5 ki\u1ec3m so\u00e1t c\u1ea5u h\u00ecnh v\u00e0 ph\u1ee5c v\u1ee5 m\u1ee5c \u0111\u00edch h\u1ecdc GitOps, Chapter n\u00e0y s\u1eed d\u1ee5ng **Ph\u01b0\u01a1ng \u00e1n A**.\n\n---\n\n## 14. Clone repository GitOps v\u1ec1 m\u00e1y local\n\nThay \u0111\u1ed5i URL repository b\u00ean d\u01b0\u1edbi th\u00e0nh repository c\u1ee7a b\u1ea1n:\n\n```bash\ngit clone https:\/\/github.com\/<YOUR_GITHUB_USERNAME>\/online-boutique-gitops.git\n```\n\nDi chuy\u1ec3n v\u00e0o th\u01b0 m\u1ee5c:\n\n```bash\ncd online-boutique-gitops\n```\n\nT\u1ea1o th\u01b0 m\u1ee5c Helm chart:\n\n```bash\nmkdir -p helm-chart\n```\n\n---\n\n## 15. Copy Helm chart t\u1eeb Chapter 5D\n\nN\u1ebfu Helm chart \u0111ang n\u1eb1m trong repository `microservices-demo`, quay l\u1ea1i th\u01b0 m\u1ee5c source:\n\n```bash\ncd ..\/microservices-demo\n```\n\nKi\u1ec3m tra:\n\n```bash\nls helm-chart\n```\n\nCopy Helm chart sang GitOps repository:\n\n```bash\ncp -R helm-chart ..\/online-boutique-gitops\/\n```\n\nQuay l\u1ea1i GitOps repository:\n\n```bash\ncd ..\/online-boutique-gitops\n```\n\nKi\u1ec3m tra:\n\n```bash\nfind helm-chart -maxdepth 2 -type f\n```\n\nK\u1ebft qu\u1ea3 t\u01b0\u01a1ng t\u1ef1:\n\n```text\nhelm-chart\/Chart.yaml\nhelm-chart\/values.yaml\nhelm-chart\/templates\/...\n```\n\n> N\u1ebfu b\u1ea1n \u0111\u00e3 t\u1ef1 x\u00e2y d\u1ef1ng Helm chart ri\u00eang trong Chapter 5D, h\u00e3y copy chart c\u1ee7a b\u1ea1n thay v\u00ec copy chart m\u1eb7c \u0111\u1ecbnh.\n\n---\n\n## 16. Ki\u1ec3m tra Helm chart trong GitOps repository\n\nCh\u1ea1y:\n\n```bash\nhelm lint .\/helm-chart\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\n1 chart(s) linted, 0 chart(s) failed\n```\n\nRender chart:\n\n```bash\nhelm template online-boutique .\/helm-chart \\\n  --namespace online-boutique\n```\n\nN\u1ebfu chart s\u1eed d\u1ee5ng \u0111\u01b0\u1ee3c, ti\u1ebfp t\u1ee5c ki\u1ec3m tra b\u1eb1ng l\u1ec7nh:\n\n```bash\nhelm template online-boutique .\/helm-chart \\\n  --namespace online-boutique \\\n  > \/tmp\/online-boutique-gitops-rendered.yaml\n```\n\nKi\u1ec3m tra resource:\n\n```bash\ngrep '^kind:' \/tmp\/online-boutique-gitops-rendered.yaml\n```\n\n---\n\n## 17. T\u1ea1o file values cho m\u00f4i tr\u01b0\u1eddng dev\n\nT\u1ea1o th\u01b0 m\u1ee5c:\n\n```bash\nmkdir -p environments\/dev\n```\n\nT\u1ea1o file:\n\n```bash\ntouch environments\/dev\/values.yaml\n```\n\nM\u1edf file:\n\n```bash\nnano environments\/dev\/values.yaml\n```\n\nTh\u00eam c\u00e1c c\u1ea5u h\u00ecnh override ph\u00f9 h\u1ee3p v\u1edbi Helm chart c\u1ee7a b\u1ea1n.\n\nV\u00ed d\u1ee5:\n\n```yaml\nfrontend:\n  replicaCount: 2\n```\n\nL\u01b0u \u00fd:\n\n* Ch\u1ec9 s\u1eed d\u1ee5ng field th\u1ef1c s\u1ef1 t\u1ed3n t\u1ea1i trong `helm-chart\/values.yaml`.\n* Kh\u00f4ng t\u1ef1 t\u1ea1o `replicaCount` n\u1ebfu chart kh\u00f4ng h\u1ed7 tr\u1ee3 field n\u00e0y.\n* Ki\u1ec3m tra b\u1eb1ng:\n\n```bash\nhelm show values .\/helm-chart\n```\n\nSau \u0111\u00f3 ki\u1ec3m tra render:\n\n```bash\nhelm template online-boutique .\/helm-chart \\\n  --namespace online-boutique \\\n  -f environments\/dev\/values.yaml\n```\n\n---\n\n## 18. Commit v\u00e0 push GitOps repository\n\nKi\u1ec3m tra c\u00e1c file:\n\n```bash\ngit status\n```\n\nTh\u00eam file:\n\n```bash\ngit add helm-chart environments\n```\n\nCommit:\n\n```bash\ngit commit -m \"add Online Boutique Helm chart for dev\"\n```\n\nPush:\n\n```bash\ngit push origin main\n```\n\nKi\u1ec3m tra repository tr\u00ean GitHub.\n\nC\u1ea5u tr\u00fac cu\u1ed1i c\u00f9ng:\n\n```text\nonline-boutique-gitops\/\n\u251c\u2500\u2500 helm-chart\/\n\u2502   \u251c\u2500\u2500 Chart.yaml\n\u2502   \u251c\u2500\u2500 values.yaml\n\u2502   \u2514\u2500\u2500 templates\/\n\u2502\n\u2514\u2500\u2500 environments\/\n    \u2514\u2500\u2500 dev\/\n        \u2514\u2500\u2500 values.yaml\n```\n\n---\n\n## 19. T\u1ea1o Argo CD Application\n\nArgo CD s\u1eed d\u1ee5ng resource `Application` \u0111\u1ec3 m\u00f4 t\u1ea3:\n\n* Git repository n\u00e0o c\u1ea7n theo d\u00f5i.\n* Branch ho\u1eb7c revision n\u00e0o.\n* Th\u01b0 m\u1ee5c Helm chart n\u00e0o.\n* Deploy v\u00e0o cluster n\u00e0o.\n* Deploy v\u00e0o namespace n\u00e0o.\n* C\u00f3 t\u1ef1 \u0111\u1ed9ng sync hay kh\u00f4ng.\n\nT\u1ea1o file:\n\n```bash\nmkdir -p argocd\ntouch argocd\/online-boutique-dev.yaml\n```\n\nM\u1edf file:\n\n```bash\nnano argocd\/online-boutique-dev.yaml\n```\n\nTh\u00eam n\u1ed9i dung:\n\n```yaml\napiVersion: argoproj.io\/v1alpha1\nkind: Application\nmetadata:\n  name: online-boutique-dev\n  namespace: argocd\nspec:\n  project: default\n\n  source:\n    repoURL: https:\/\/github.com\/<YOUR_GITHUB_USERNAME>\/online-boutique-gitops.git\n    targetRevision: main\n    path: helm-chart\n    helm:\n      valueFiles:\n        - ..\/environments\/dev\/values.yaml\n\n  destination:\n    server: https:\/\/kubernetes.default.svc\n    namespace: online-boutique\n\n  syncPolicy:\n    automated:\n      prune: true\n      selfHeal: true\n    syncOptions:\n      - CreateNamespace=true\n```\n\nThay:\n\n```text\n<YOUR_GITHUB_USERNAME>\n```\n\nb\u1eb1ng GitHub username c\u1ee7a b\u1ea1n.\n\n### \u00dd ngh\u0129a c\u00e1c field ch\u00ednh\n\n```yaml\nrepoURL\n```\n\nRepository GitOps m\u00e0 Argo CD s\u1ebd theo d\u00f5i.\n\n```yaml\ntargetRevision: main\n```\n\nBranch \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng.\n\n```yaml\npath: helm-chart\n```\n\nTh\u01b0 m\u1ee5c ch\u1ee9a Helm chart.\n\n```yaml\nvalueFiles\n```\n\nFile values override d\u00e0nh cho m\u00f4i tr\u01b0\u1eddng dev.\n\n```yaml\ndestination.server\n```\n\nCluster \u0111\u00edch. Gi\u00e1 tr\u1ecb:\n\n```text\nhttps:\/\/kubernetes.default.svc\n```\n\nngh\u0129a l\u00e0 cluster n\u01a1i Argo CD \u0111ang ch\u1ea1y.\n\n```yaml\ndestination.namespace\n```\n\nNamespace deploy Online Boutique.\n\n```yaml\nautomated\n```\n\nCho ph\u00e9p Argo CD t\u1ef1 \u0111\u1ed9ng \u0111\u1ed3ng b\u1ed9.\n\n```yaml\nprune: true\n```\n\nCho ph\u00e9p Argo CD x\u00f3a resource kh\u00f4ng c\u00f2n \u0111\u01b0\u1ee3c khai b\u00e1o trong Git.\n\n```yaml\nselfHeal: true\n```\n\nCho ph\u00e9p Argo CD t\u1ef1 s\u1eeda nh\u1eefng thay \u0111\u1ed5i th\u1ee7 c\u00f4ng tr\u00ean cluster.\n\n```yaml\nCreateNamespace=true\n```\n\nT\u1ef1 t\u1ea1o namespace n\u1ebfu namespace ch\u01b0a t\u1ed3n t\u1ea1i.\n\n---\n\n## 20. Ki\u1ec3m tra \u0111\u01b0\u1eddng d\u1eabn values c\u1ee7a Helm\n\nTr\u01b0\u1edbc khi apply Application, c\u1ea7n ki\u1ec3m tra Helm c\u00f3 \u0111\u1ecdc \u0111\u01b0\u1ee3c file values hay kh\u00f4ng.\n\nCh\u1ea1y:\n\n```bash\nhelm template online-boutique .\/helm-chart \\\n  --namespace online-boutique \\\n  -f environments\/dev\/values.yaml\n```\n\nN\u1ebfu Helm b\u00e1o l\u1ed7i:\n\n```text\nfile not found\n```\n\nth\u00ec c\u1ea7n ki\u1ec3m tra l\u1ea1i c\u1ea5u tr\u00fac repository.\n\nM\u1ed9t c\u00e1ch t\u1ed5 ch\u1ee9c \u0111\u01a1n gi\u1ea3n h\u01a1n l\u00e0 \u0111\u1eb7t file values b\u00ean trong chart:\n\n```text\nhelm-chart\/\n\u251c\u2500\u2500 Chart.yaml\n\u251c\u2500\u2500 values.yaml\n\u251c\u2500\u2500 values-dev.yaml\n\u2514\u2500\u2500 templates\/\n```\n\nKhi \u0111\u00f3 Application c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng:\n\n```yaml\nsource:\n  repoURL: https:\/\/github.com\/<YOUR_GITHUB_USERNAME>\/online-boutique-gitops.git\n  targetRevision: main\n  path: helm-chart\n  helm:\n    valueFiles:\n      - values-dev.yaml\n```\n\nN\u1ebfu s\u1eed d\u1ee5ng c\u00e1ch n\u00e0y, file `values-dev.yaml` ph\u1ea3i n\u1eb1m trong th\u01b0 m\u1ee5c `helm-chart`.\n\n---\n\n## 21. T\u1ea1o Application tr\u00ean EKS\n\nCommit file Application:\n\n```bash\ngit add argocd\/online-boutique-dev.yaml\n```\n\nCommit:\n\n```bash\ngit commit -m \"add Argo CD application for Online Boutique\"\n```\n\nPush:\n\n```bash\ngit push origin main\n```\n\nSau \u0111\u00f3 apply Application v\u00e0o Argo CD:\n\n```bash\nkubectl apply \\\n  -f argocd\/online-boutique-dev.yaml\n```\n\nKi\u1ec3m tra Application:\n\n```bash\nkubectl get applications -n argocd\n```\n\nK\u1ebft qu\u1ea3 t\u01b0\u01a1ng t\u1ef1:\n\n```text\nNAME                  SYNC STATUS   HEALTH STATUS\nonline-boutique-dev   OutOfSync     Missing\n```\n\nTr\u1ea1ng th\u00e1i ban \u0111\u1ea7u c\u00f3 th\u1ec3 l\u00e0 `OutOfSync` v\u00ec Argo CD ch\u01b0a \u0111\u1ed3ng b\u1ed9 resource.\n\n---\n\n## 22. Ki\u1ec3m tra Application b\u1eb1ng Argo CD CLI\n\nCh\u1ea1y:\n\n```bash\nargocd app list\n```\n\nK\u1ebft qu\u1ea3 c\u00f3 th\u1ec3 t\u01b0\u01a1ng t\u1ef1:\n\n```text\nNAME                  CLUSTER                         NAMESPACE          PROJECT  STATUS     HEALTH\nargocd\/online-boutique-dev  https:\/\/kubernetes.default.svc  online-boutique  default  OutOfSync   Missing\n```\n\nXem chi ti\u1ebft:\n\n```bash\nargocd app get online-boutique-dev\n```\n\nTh\u00f4ng tin c\u1ea7n ki\u1ec3m tra:\n\n```text\nProject: default\nServer: https:\/\/kubernetes.default.svc\nNamespace: online-boutique\nSync Status: OutOfSync\nHealth Status: Missing\n```\n\n---\n\n## 23. \u0110\u1ed3ng b\u1ed9 Application l\u1ea7n \u0111\u1ea7u\n\nN\u1ebfu mu\u1ed1n sync th\u1ee7 c\u00f4ng l\u1ea7n \u0111\u1ea7u:\n\n```bash\nargocd app sync online-boutique-dev\n```\n\nTheo d\u00f5i qu\u00e1 tr\u00ecnh:\n\n```bash\nargocd app wait online-boutique-dev\n```\n\nKi\u1ec3m tra l\u1ea1i:\n\n```bash\nargocd app get online-boutique-dev\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\nSync Status: Synced\nHealth Status: Healthy\n```\n\nKi\u1ec3m tra b\u1eb1ng Kubernetes:\n\n```bash\nkubectl get deployments -n online-boutique\n```\n\n```bash\nkubectl get pods -n online-boutique\n```\n\n```bash\nkubectl get services -n online-boutique\n```\n\n---\n\n## 24. Ki\u1ec3m tra giao di\u1ec7n Argo CD\n\nM\u1edf:\n\n```text\nhttps:\/\/localhost:8080\n```\n\nTrong giao di\u1ec7n Argo CD, b\u1ea1n s\u1ebd th\u1ea5y Application:\n\n```text\nonline-boutique-dev\n```\n\nApplication c\u00f3 th\u1ec3 hi\u1ec3n th\u1ecb c\u00e2y resource:\n\n```text\nonline-boutique-dev\n\u251c\u2500\u2500 Deployment\/frontend\n\u251c\u2500\u2500 Deployment\/cartservice\n\u251c\u2500\u2500 Deployment\/paymentservice\n\u251c\u2500\u2500 Deployment\/checkoutservice\n\u251c\u2500\u2500 Service\/frontend\n\u251c\u2500\u2500 Service\/cartservice\n\u251c\u2500\u2500 Service\/paymentservice\n\u2514\u2500\u2500 ...\n```\n\nC\u00e1c tr\u1ea1ng th\u00e1i quan tr\u1ecdng:\n\n| Tr\u1ea1ng th\u00e1i    | \u00dd ngh\u0129a                                  |\n| ------------- | ---------------------------------------- |\n| `Synced`      | Cluster kh\u1edbp v\u1edbi Git                     |\n| `OutOfSync`   | Cluster kh\u00e1c v\u1edbi Git                     |\n| `Healthy`     | Resource \u0111ang ho\u1ea1t \u0111\u1ed9ng b\u00ecnh th\u01b0\u1eddng      |\n| `Progressing` | Resource \u0111ang trong qu\u00e1 tr\u00ecnh tri\u1ec3n khai |\n| `Degraded`    | Resource c\u00f3 v\u1ea5n \u0111\u1ec1                       |\n| `Missing`     | Resource ch\u01b0a t\u1ed3n t\u1ea1i tr\u00ean cluster       |\n\n---\n\n## 25. Ki\u1ec3m tra frontend sau khi Argo CD deploy\n\nL\u1ea5y Service frontend:\n\n```bash\nkubectl get service frontend -n online-boutique\n```\n\nL\u1ea5y hostname:\n\n```bash\nexport FRONTEND_URL=$(\n  kubectl get service frontend \\\n    -n online-boutique \\\n    -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'\n)\n```\n\nKi\u1ec3m tra:\n\n```bash\necho \"$FRONTEND_URL\"\n```\n\nTest:\n\n```bash\ncurl -I \"http:\/\/$FRONTEND_URL\"\n```\n\nM\u1edf tr\u00ecnh duy\u1ec7t:\n\n```text\nhttp:\/\/<FRONTEND_URL>\n```\n\nKi\u1ec3m tra c\u00e1c ch\u1ee9c n\u0103ng:\n\n* Hi\u1ec3n th\u1ecb s\u1ea3n ph\u1ea9m.\n* Th\u00eam s\u1ea3n ph\u1ea9m v\u00e0o gi\u1ecf h\u00e0ng.\n* Xem gi\u1ecf h\u00e0ng.\n* Th\u1ef1c hi\u1ec7n checkout.\n* Ki\u1ec3m tra c\u00e1c microservice giao ti\u1ebfp v\u1edbi nhau.\n\n---\n\n## 26. Th\u1eed nghi\u1ec7m thay \u0111\u1ed5i c\u1ea5u h\u00ecnh b\u1eb1ng Git\n\nB\u00e2y gi\u1edd ch\u00fang ta s\u1ebd kh\u00f4ng ch\u1ea1y:\n\n```bash\nhelm upgrade\n```\n\nth\u1ee7 c\u00f4ng n\u1eefa.\n\nThay v\u00e0o \u0111\u00f3, thay \u0111\u1ed5i c\u1ea5u h\u00ecnh trong Git.\n\nM\u1edf file:\n\n```bash\nnano environments\/dev\/values.yaml\n```\n\nV\u00ed d\u1ee5 thay \u0111\u1ed5i s\u1ed1 replica n\u1ebfu chart h\u1ed7 tr\u1ee3:\n\n```yaml\nfrontend:\n  replicaCount: 2\n```\n\nL\u01b0u file.\n\nRender \u0111\u1ec3 ki\u1ec3m tra:\n\n```bash\nhelm template online-boutique .\/helm-chart \\\n  --namespace online-boutique \\\n  -f environments\/dev\/values.yaml\n```\n\nCommit:\n\n```bash\ngit add environments\/dev\/values.yaml\n```\n\n```bash\ngit commit -m \"scale frontend in dev\"\n```\n\nPush:\n\n```bash\ngit push origin main\n```\n\n---\n\n## 27. Theo d\u00f5i Argo CD t\u1ef1 \u0111\u1ed9ng sync\n\nKi\u1ec3m tra Application:\n\n```bash\nargocd app get online-boutique-dev\n```\n\nTheo d\u00f5i tr\u1ea1ng th\u00e1i:\n\n```bash\nargocd app wait online-boutique-dev\n```\n\nKi\u1ec3m tra Deployment:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique\n```\n\nKi\u1ec3m tra replica:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique \\\n  -o jsonpath='{.spec.replicas}'\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\n2\n```\n\nKi\u1ec3m tra Pod:\n\n```bash\nkubectl get pods -n online-boutique\n```\n\nKhi \u0111\u00f3 flow \u0111\u00e3 tr\u1edf th\u00e0nh:\n\n```text\nGit change\n    \u2193\ngit push\n    \u2193\nArgo CD detects change\n    \u2193\nHelm render\n    \u2193\nKubernetes apply\n    \u2193\nEKS updated\n```\n\n---\n\n## 28. Th\u1eed nghi\u1ec7m tr\u1ea1ng th\u00e1i OutOfSync\n\n\u0110\u1ec3 ki\u1ec3m tra GitOps, ch\u00fang ta s\u1ebd thay \u0111\u1ed5i tr\u1ef1c ti\u1ebfp resource tr\u00ean EKS.\n\nCh\u1ea1y:\n\n```bash\nkubectl scale deployment frontend \\\n  -n online-boutique \\\n  --replicas=1\n```\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique\n```\n\nN\u1ebfu trong Git v\u1eabn khai b\u00e1o:\n\n```yaml\nfrontend:\n  replicaCount: 2\n```\n\nth\u00ec tr\u1ea1ng th\u00e1i th\u1ef1c t\u1ebf \u0111\u00e3 kh\u00e1c tr\u1ea1ng th\u00e1i mong mu\u1ed1n.\n\nKi\u1ec3m tra Argo CD:\n\n```bash\nargocd app get online-boutique-dev\n```\n\nN\u1ebfu chart render \u0111\u01b0\u1ee3c field replica, Application c\u00f3 th\u1ec3 chuy\u1ec3n sang:\n\n```text\nOutOfSync\n```\n\n---\n\n## 29. Ki\u1ec3m tra self-healing\n\nV\u00ec Application \u0111\u00e3 c\u1ea5u h\u00ecnh:\n\n```yaml\nsyncPolicy:\n  automated:\n    prune: true\n    selfHeal: true\n```\n\nArgo CD s\u1ebd c\u1ed1 g\u1eafng \u0111\u01b0a cluster v\u1ec1 tr\u1ea1ng th\u00e1i \u0111\u01b0\u1ee3c khai b\u00e1o trong Git.\n\nTheo d\u00f5i Deployment:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique \\\n  -w\n```\n\nSau \u0111\u00f3 ki\u1ec3m tra replica:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique \\\n  -o jsonpath='{.spec.replicas}'\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i sau khi Argo CD \u0111\u1ed3ng b\u1ed9 l\u1ea1i:\n\n```text\n2\n```\n\nKi\u1ec3m tra Application:\n\n```bash\nargocd app get online-boutique-dev\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\nSync Status: Synced\nHealth Status: Healthy\n```\n\n> N\u1ebfu `selfHeal` kh\u00f4ng ho\u1ea1t \u0111\u1ed9ng, ki\u1ec3m tra xem resource c\u00f3 th\u1ef1c s\u1ef1 \u0111\u01b0\u1ee3c Helm chart qu\u1ea3n l\u00fd hay kh\u00f4ng v\u00e0 ki\u1ec3m tra logs c\u1ee7a Argo CD Application Controller.\n\n---\n\n## 30. Ki\u1ec3m tra l\u1ecbch s\u1eed \u0111\u1ed3ng b\u1ed9\n\nXem l\u1ecbch s\u1eed sync:\n\n```bash\nargocd app history online-boutique-dev\n```\n\nK\u1ebft qu\u1ea3 c\u00f3 th\u1ec3 t\u01b0\u01a1ng t\u1ef1:\n\n```text\nID    DATE                     REVISION\n0     2026-09-14 10:00:00      abc123\n1     2026-09-14 10:15:00      def456\n```\n\nXem th\u00f4ng tin sync trong Kubernetes:\n\n```bash\nkubectl describe application \\\n  online-boutique-dev \\\n  -n argocd\n```\n\n---\n\n## 31. Rollback b\u1eb1ng Git revert\n\nTrong GitOps, rollback n\u00ean th\u1ef1c hi\u1ec7n b\u1eb1ng c\u00e1ch thay \u0111\u1ed5i Git v\u1ec1 phi\u00ean b\u1ea3n tr\u01b0\u1edbc \u0111\u00f3.\n\nKh\u00f4ng n\u00ean \u01b0u ti\u00ean ch\u1ea1y tr\u1ef1c ti\u1ebfp:\n\n```bash\nhelm rollback\n```\n\nv\u00ec thay \u0111\u1ed5i \u0111\u00f3 s\u1ebd kh\u00f4ng \u0111\u01b0\u1ee3c ghi nh\u1eadn trong Git.\n\nXem l\u1ecbch s\u1eed commit:\n\n```bash\ngit log --oneline --max-count=5\n```\n\nV\u00ed d\u1ee5:\n\n```text\ndef4567 scale frontend in dev\nabc1234 add Argo CD application\n```\n\nRollback commit g\u1ea7n nh\u1ea5t:\n\n```bash\ngit revert def4567\n```\n\nPush thay \u0111\u1ed5i:\n\n```bash\ngit push origin main\n```\n\nArgo CD s\u1ebd ph\u00e1t hi\u1ec7n commit m\u1edbi v\u00e0 \u0111\u1ed3ng b\u1ed9 c\u1ea5u h\u00ecnh c\u0169 tr\u1edf l\u1ea1i EKS.\n\nKi\u1ec3m tra:\n\n```bash\nargocd app get online-boutique-dev\n```\n\nTheo d\u00f5i:\n\n```bash\nargocd app wait online-boutique-dev\n```\n\nKi\u1ec3m tra Deployment:\n\n```bash\nkubectl get deployment frontend \\\n  -n online-boutique\n```\n\n---\n\n## 32. Ki\u1ec3m tra Argo CD logs khi deployment l\u1ed7i\n\n### 32.1. Application Controller\n\n```bash\nkubectl logs \\\n  -n argocd \\\n  deployment\/argocd-application-controller \\\n  --tail=100\n```\n\n### 32.2. Repo Server\n\n```bash\nkubectl logs \\\n  -n argocd \\\n  deployment\/argocd-repo-server \\\n  --tail=100\n```\n\n### 32.3. Argo CD Server\n\n```bash\nkubectl logs \\\n  -n argocd \\\n  deployment\/argocd-server \\\n  --tail=100\n```\n\n### 32.4. Xem chi ti\u1ebft Application\n\n```bash\nargocd app get online-boutique-dev\n```\n\n### 32.5. Xem c\u00e1c resource b\u1ecb l\u1ed7i\n\n```bash\nkubectl get all -n online-boutique\n```\n\nN\u1ebfu Pod l\u1ed7i:\n\n```bash\nkubectl describe pod <POD_NAME> \\\n  -n online-boutique\n```\n\nXem logs:\n\n```bash\nkubectl logs <POD_NAME> \\\n  -n online-boutique\n```\n\n---\n\n## 33. C\u00e1c l\u1ed7i th\u01b0\u1eddng g\u1eb7p\n\n### L\u1ed7i 1: Argo CD kh\u00f4ng truy c\u1eadp \u0111\u01b0\u1ee3c GitHub\n\nKi\u1ec3m tra URL repository:\n\n```yaml\nrepoURL: https:\/\/github.com\/<YOUR_GITHUB_USERNAME>\/online-boutique-gitops.git\n```\n\nKi\u1ec3m tra repository c\u00f3 public hay kh\u00f4ng.\n\nN\u1ebfu repository private, c\u1ea7n c\u1ea5u h\u00ecnh repository credentials trong Argo CD.\n\n---\n\n### L\u1ed7i 2: Helm chart kh\u00f4ng t\u00ecm th\u1ea5y values file\n\nKi\u1ec3m tra c\u1ea5u tr\u00fac:\n\n```bash\nfind . -maxdepth 3 -type f\n```\n\nKi\u1ec3m tra `valueFiles` trong Application.\n\n\u0110\u1ea3m b\u1ea3o file values n\u1eb1m trong ph\u1ea1m vi m\u00e0 Helm\/Argo CD c\u00f3 th\u1ec3 truy c\u1eadp.\n\n---\n\n### L\u1ed7i 3: Application \u1edf tr\u1ea1ng th\u00e1i `OutOfSync`\n\nCh\u1ea1y:\n\n```bash\nargocd app diff online-boutique-dev\n```\n\nSau \u0111\u00f3 ki\u1ec3m tra:\n\n```bash\nargocd app get online-boutique-dev\n```\n\nN\u1ebfu mu\u1ed1n sync th\u1ee7 c\u00f4ng:\n\n```bash\nargocd app sync online-boutique-dev\n```\n\n---\n\n### L\u1ed7i 4: Application \u1edf tr\u1ea1ng th\u00e1i `Degraded`\n\nKi\u1ec3m tra Pod:\n\n```bash\nkubectl get pods -n online-boutique\n```\n\nKi\u1ec3m tra Pod l\u1ed7i:\n\n```bash\nkubectl describe pod <POD_NAME> \\\n  -n online-boutique\n```\n\nXem logs:\n\n```bash\nkubectl logs <POD_NAME> \\\n  -n online-boutique\n```\n\n---\n\n### L\u1ed7i 5: Frontend kh\u00f4ng c\u00f3 External IP\n\nKi\u1ec3m tra Service:\n\n```bash\nkubectl get service frontend \\\n  -n online-boutique\n```\n\nTheo d\u00f5i:\n\n```bash\nkubectl get service frontend \\\n  -n online-boutique \\\n  -w\n```\n\nKi\u1ec3m tra AWS Load Balancer Controller n\u1ebfu Service kh\u00f4ng t\u1ea1o \u0111\u01b0\u1ee3c Load Balancer.\n\n---\n\n## 34. So s\u00e1nh tr\u01b0\u1edbc v\u00e0 sau Chapter 5E\n\n### Tr\u01b0\u1edbc Chapter 5E\n\n```text\nDeveloper\n    \u2193\nhelm upgrade\n    \u2193\nAmazon EKS\n```\n\nC\u00e1c v\u1ea5n \u0111\u1ec1:\n\n* Ph\u1ee5 thu\u1ed9c v\u00e0o m\u00e1y developer.\n* Kh\u00f3 bi\u1ebft ai \u0111\u00e3 deploy.\n* Thay \u0111\u1ed5i c\u00f3 th\u1ec3 kh\u00f4ng \u0111\u01b0\u1ee3c commit v\u00e0o Git.\n* Kh\u00f3 ki\u1ec3m tra s\u1ef1 kh\u00e1c bi\u1ec7t gi\u1eefa Git v\u00e0 cluster.\n* Kh\u00f3 t\u1ef1 \u0111\u1ed9ng s\u1eeda drift.\n\n### Sau Chapter 5E\n\n```text\nDeveloper\n    \u2193\ngit push\n    \u2193\nGitHub\n    \u2193\nArgo CD\n    \u2193\nHelm\n    \u2193\nAmazon EKS\n```\n\nL\u1ee3i \u00edch:\n\n* Git l\u01b0u tr\u1eef desired state.\n* Deployment c\u00f3 l\u1ecbch s\u1eed commit.\n* Argo CD hi\u1ec3n th\u1ecb tr\u1ea1ng th\u00e1i sync.\n* C\u00f3 th\u1ec3 ph\u00e1t hi\u1ec7n drift.\n* C\u00f3 th\u1ec3 t\u1ef1 \u0111\u1ed9ng s\u1eeda drift.\n* Rollback b\u1eb1ng Git revert.\n* Kh\u00f4ng c\u1ea7n ch\u1ea1y `helm upgrade` th\u1ee7 c\u00f4ng cho m\u1ed7i thay \u0111\u1ed5i.\n\n---\n\n## 35. Ki\u1ec3m tra cu\u1ed1i Chapter\n\nCh\u1ea1y l\u1ea7n l\u01b0\u1ee3t:\n\n```bash\nkubectl get pods -n argocd\n```\n\n```bash\nargocd app list\n```\n\n```bash\nargocd app get online-boutique-dev\n```\n\n```bash\nkubectl get deployments -n online-boutique\n```\n\n```bash\nkubectl get pods -n online-boutique\n```\n\n```bash\nkubectl get services -n online-boutique\n```\n\nTr\u1ea1ng th\u00e1i mong \u0111\u1ee3i:\n\n```text\nArgo CD Pods       Running\nApplication        Synced\nApplication Health Healthy\nOnline Boutique    Running\nFrontend           Accessible\n```\n\n---\n\n## 36. Ki\u1ebfn tr\u00fac sau Chapter 5E\n\n```text\n                         Developer\n                             \u2502\n                             \u25bc\n                          GitHub\n                             \u2502\n                \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n                \u2502                         \u2502\n                \u25bc                         \u25bc\n        Application Code            GitOps Repository\n                \u2502                         \u2502\n                \u25bc                         \u25bc\n        GitHub Actions              Helm Chart\n                \u2502                         \u2502\n                \u25bc                         \u25bc\n             ECR                    Argo CD\n                \u2502                         \u2502\n                \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                             \u25bc\n                        Amazon EKS\n                             \u2502\n                             \u25bc\n                    Google Online Boutique\n```\n\n### K\u1ebft qu\u1ea3 \u0111\u1ea1t \u0111\u01b0\u1ee3c\n\n\u1ede cu\u1ed1i Chapter 5E, ch\u00fang ta \u0111\u00e3 chuy\u1ec3n Online Boutique t\u1eeb m\u00f4 h\u00ecnh:\n\n```text\nManual Helm Deployment\n```\n\nsang:\n\n```text\nGitOps Deployment with Argo CD\n```\n\n\u0110\u00e2y l\u00e0 n\u1ec1n t\u1ea3ng \u0111\u1ec3 ti\u1ebfp t\u1ee5c m\u1edf r\u1ed9ng \u1edf c\u00e1c ph\u1ea7n sau:\n\n* Multi-environment: Dev, Staging, Production.\n* App of Apps.\n* ApplicationSet.\n* GitOps k\u1ebft h\u1ee3p Amazon ECR.\n* Qu\u1ea3n l\u00fd nhi\u1ec1u microservice.\n* Qu\u1ea3n l\u00fd nhi\u1ec1u EKS cluster.\n* Self-service deployment platform.","published_at":"2026-09-14T09:17:54.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T22:13:01.000000Z","edited_at":"2026-09-14T09:17:36.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":13,"points":0,"views_count":10,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/eae8b105-1c65-45ab-95e2-003c86138bff.png","user":{"data":{"id":98940,"url":"https:\/\/viblo.asia\/u\/Juu-dev","avatar":"25478754-6f7c-425c-a27d-bd61fabc134e.jpg","name":"Th\u1ed1ng PM","username":"Juu-dev","followers_count":82,"reputation":1444,"posts_count":190,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"gitops","name":"gitops"},{"slug":"argo-cd","name":"Argo CD"}]},"commentators":{"data":[]}},{"id":106660,"title":"\ud83d\ude80 Chapter 5 \u2014 Platform: Ph\u1ea7n D \u2014 Qu\u1ea3n l\u00fd Google Online Boutique tr\u00ean Amazon EKS b\u1eb1ng Helm","slug":"OQJwzmbb4MP","url":"https:\/\/viblo.asia\/p\/chapter-5-platform-phan-d-quan-ly-google-online-boutique-tren-amazon-eks-bang-helm-OQJwzmbb4MP","user_id":98940,"moderation":null,"transliterated":"chapter-5-platform-phan-d-quan-ly-google-online-boutique-tren-amazon-eks-bang-helm","contents_short":"\u1ede Chapter 5B, ch\u00fang ta \u0111\u00e3:\n\n* T\u1ea1o Amazon EKS cluster.\n* T\u1ea1o managed node group.\n* K\u1ebft n\u1ed1i kubectl v\u1edbi EKS.\n* Deploy Google Online Boutique b\u1eb1ng Kubernetes manifest.\n* Expose frontend th\u00f4ng qua AWS Load Balancer.\n\nTuy nhi\u00ean, c\u00e1ch tri\u1ec3n khai b\u1eb1ng m\u1ed9t file manifest l\u1edbn v\u1eabn c\u00f3 m\u1ed9t s\u1ed1 h\u1ea1n ch\u1ebf:\n\n* Kh\u00f3 thay \u0111\u1ed5i c\u1ea5u h\u00ecnh theo t\u1eebng m\u00f4i tr\u01b0\u1eddng.\n* Kh\u00f3 qu\u1ea3n l\u00fd nhi\u1ec1u phi\u00ean b\u1ea3n.\n* Kh\u00f3 t\u00e1i s\u1eed d\u1ee5ng c\u1ea5u h\u00ecnh.\n*...","contents":"\u1ede **Chapter 5B**, ch\u00fang ta \u0111\u00e3:\n\n* T\u1ea1o Amazon EKS cluster.\n* T\u1ea1o managed node group.\n* K\u1ebft n\u1ed1i `kubectl` v\u1edbi EKS.\n* Deploy Google Online Boutique b\u1eb1ng Kubernetes manifest.\n* Expose `frontend` th\u00f4ng qua AWS Load Balancer.\n\nTuy nhi\u00ean, c\u00e1ch tri\u1ec3n khai b\u1eb1ng m\u1ed9t file manifest l\u1edbn v\u1eabn c\u00f3 m\u1ed9t s\u1ed1 h\u1ea1n ch\u1ebf:\n\n* Kh\u00f3 thay \u0111\u1ed5i c\u1ea5u h\u00ecnh theo t\u1eebng m\u00f4i tr\u01b0\u1eddng.\n* Kh\u00f3 qu\u1ea3n l\u00fd nhi\u1ec1u phi\u00ean b\u1ea3n.\n* Kh\u00f3 t\u00e1i s\u1eed d\u1ee5ng c\u1ea5u h\u00ecnh.\n* Kh\u00f3 thay \u0111\u1ed5i s\u1ed1 l\u01b0\u1ee3ng replicas cho t\u1eebng service.\n* Kh\u00f3 chu\u1ea9n h\u00f3a deployment cho nhi\u1ec1u microservice.\n\nTrong Chapter 5D, ch\u00fang ta s\u1ebd s\u1eed d\u1ee5ng **Helm** \u0111\u1ec3 qu\u1ea3n l\u00fd Online Boutique tr\u00ean Amazon EKS.\n\n## 1. M\u1ee5c ti\u00eau\n\nSau khi ho\u00e0n th\u00e0nh Chapter n\u00e0y, ch\u00fang ta s\u1ebd c\u00f3:\n\n```text\nGoogle Online Boutique\n        \u2193\nHelm Chart\n        \u2193\nhelm install \/ helm upgrade\n        \u2193\nAmazon EKS\n        \u2193\nOnline Boutique\n```\n\nCh\u00fang ta s\u1ebd th\u1ef1c hi\u1ec7n:\n\n1. C\u00e0i \u0111\u1eb7t Helm.\n2. Ki\u1ec3m tra EKS cluster t\u1eeb Chapter 5B.\n3. Clone source code Online Boutique.\n4. Ki\u1ec3m tra Helm chart c\u00f3 s\u1eb5n.\n5. X\u00f3a deployment c\u0169 b\u1eb1ng manifest.\n6. Ki\u1ec3m tra Helm chart.\n7. Render Kubernetes manifest b\u1eb1ng Helm.\n8. Deploy Online Boutique b\u1eb1ng Helm.\n9. Ki\u1ec3m tra c\u00e1c resource.\n10. Thay \u0111\u1ed5i c\u1ea5u h\u00ecnh b\u1eb1ng Helm.\n11. Th\u1ef1c hi\u1ec7n Helm upgrade.\n12. Ki\u1ec3m tra Helm history.\n13. Rollback phi\u00ean b\u1ea3n.\n14. X\u00f3a Helm release v\u00e0 t\u00e0i nguy\u00ean li\u00ean quan.\n\n> Trong Chapter n\u00e0y, ch\u00fang ta v\u1eabn s\u1eed d\u1ee5ng **Amazon EKS hi\u1ec7n t\u1ea1i t\u1eeb Chapter 5B**. Kh\u00f4ng t\u1ea1o cluster m\u1edbi.\n\n---\n\n## 2. Ki\u1ebfn tr\u00fac sau khi ho\u00e0n th\u00e0nh\n\n```text\n                         Internet\n                            \u2502\n                            \u25bc\n                 AWS Load Balancer\n                            \u2502\n                            \u25bc\n                    frontend Service\n                            \u2502\n                            \u25bc\n                      frontend Pod\n                            \u2502\n          \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n          \u25bc                 \u25bc                 \u25bc\n    cartservice     productcatalogservice   checkoutservice\n          \u2502                 \u2502                 \u2502\n          \u25bc                 \u25bc                 \u25bc\n      cart Pod       productcatalog Pod   checkout Pod\n          \u2502\n          \u25bc\n    C\u00e1c microservice kh\u00e1c\n```\n\nHelm s\u1ebd qu\u1ea3n l\u00fd to\u00e0n b\u1ed9 Kubernetes resources:\n\n```text\nHelm Release\n     \u2502\n     \u251c\u2500\u2500 Deployments\n     \u251c\u2500\u2500 Services\n     \u251c\u2500\u2500 ConfigMaps\n     \u2514\u2500\u2500 C\u00e1c Kubernetes resources kh\u00e1c\n```\n\n---\n\n## 3. Ki\u1ec3m tra m\u00f4i tr\u01b0\u1eddng t\u1eeb Chapter 5B\n\n### 3.1. Ki\u1ec3m tra AWS CLI\n\n```bash\naws --version\n```\n\nKi\u1ec3m tra AWS account:\n\n```bash\naws sts get-caller-identity\n```\n\nKi\u1ec3m tra Region:\n\n```bash\naws configure get region\n```\n\nTrong lab n\u00e0y, ch\u00fang ta s\u1eed d\u1ee5ng Region Tokyo:\n\n```bash\nap-northeast-1\n```\n\nN\u1ebfu ch\u01b0a c\u1ea5u h\u00ecnh:\n\n```bash\naws configure set region ap-northeast-1\n```\n\n---\n\n### 3.2. \u0110\u1eb7t bi\u1ebfn m\u00f4i tr\u01b0\u1eddng\n\n```bash\nexport AWS_REGION=ap-northeast-1\nexport CLUSTER_NAME=online-boutique-eks\n```\n\nKi\u1ec3m tra:\n\n```bash\necho \"$AWS_REGION\"\necho \"$CLUSTER_NAME\"\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\nap-northeast-1\nonline-boutique-eks\n```\n\n---\n\n### 3.3. Ki\u1ec3m tra EKS cluster\n\n```bash\naws eks describe-cluster \\\n  --name \"$CLUSTER_NAME\" \\\n  --region \"$AWS_REGION\" \\\n  --query 'cluster.status' \\\n  --output text\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\nACTIVE\n```\n\n---\n\n### 3.4. Ki\u1ec3m tra k\u1ebft n\u1ed1i kubectl\n\n```bash\nkubectl get nodes\n```\n\nT\u1ea5t c\u1ea3 node c\u1ea7n c\u00f3 tr\u1ea1ng th\u00e1i:\n\n```text\nReady\n```\n\nKi\u1ec3m tra namespace:\n\n```bash\nkubectl get namespaces\n```\n\nN\u1ebfu namespace `online-boutique` \u0111\u00e3 t\u1ed3n t\u1ea1i t\u1eeb Chapter 5B:\n\n```bash\nkubectl get namespace online-boutique\n```\n\nN\u1ebfu ch\u01b0a t\u1ed3n t\u1ea1i, t\u1ea1o namespace:\n\n```bash\nkubectl create namespace online-boutique\n```\n\n\u0110\u1eb7t namespace m\u1eb7c \u0111\u1ecbnh cho context hi\u1ec7n t\u1ea1i:\n\n```bash\nkubectl config set-context --current \\\n  --namespace=online-boutique\n```\n\nKi\u1ec3m tra:\n\n```bash\nkubectl config view --minify \\\n  --output 'jsonpath={..namespace}'\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\nonline-boutique\n```\n\n---\n\n## 4. C\u00e0i \u0111\u1eb7t Helm\n\n### 4.1. Ki\u1ec3m tra Helm\n\n```bash\nhelm version\n```\n\nN\u1ebfu Helm \u0111\u00e3 \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t, k\u1ebft qu\u1ea3 s\u1ebd t\u01b0\u01a1ng t\u1ef1:\n\n```text\nversion.BuildInfo{Version:\"v3.x.x\", ...}\n```\n\n---\n\n### 4.2. C\u00e0i \u0111\u1eb7t Helm tr\u00ean macOS\n\nN\u1ebfu b\u1ea1n s\u1eed d\u1ee5ng macOS v\u00e0 \u0111\u00e3 c\u00f3 Homebrew:\n\n```bash\nbrew install helm\n```\n\nKi\u1ec3m tra:\n\n```bash\nhelm version\n```\n\n---\n\n### 4.3. C\u00e0i \u0111\u1eb7t Helm tr\u00ean Ubuntu\n\nC\u00e0i \u0111\u1eb7t c\u00e1c package c\u1ea7n thi\u1ebft:\n\n```bash\nsudo apt update\n\nsudo apt install -y curl gpg\n```\n\nTh\u00eam Helm repository:\n\n```bash\ncurl https:\/\/baltocdn.com\/helm\/signing.asc \\\n  | gpg --dearmor \\\n  | sudo tee \/usr\/share\/keyrings\/helm.gpg > \/dev\/null\n```\n\nTh\u00eam repository v\u00e0o APT:\n\n```bash\necho \"deb [arch=$(dpkg --print-architecture) \\\nsigned-by=\/usr\/share\/keyrings\/helm.gpg] \\\nhttps:\/\/baltocdn.com\/helm\/stable\/debian\/ \\\nall main\" \\\n| sudo tee \/etc\/apt\/sources.list.d\/helm-stable-debian.list\n```\n\nC\u00e0i \u0111\u1eb7t Helm:\n\n```bash\nsudo apt update\nsudo apt install -y helm\n```\n\nKi\u1ec3m tra:\n\n```bash\nhelm version\n```\n\n---\n\n## 5. Clone source code Google Online Boutique\n\nN\u1ebfu \u0111\u00e3 clone repository trong Chapter 5B, chuy\u1ec3n \u0111\u1ebfn th\u01b0 m\u1ee5c source code:\n\n```bash\ncd microservices-demo\n```\n\nN\u1ebfu ch\u01b0a clone:\n\n```bash\ngit clone https:\/\/github.com\/GoogleCloudPlatform\/microservices-demo.git\ncd microservices-demo\n```\n\nKi\u1ec3m tra source code:\n\n```bash\nls\n```\n\nB\u1ea1n s\u1ebd th\u1ea5y c\u00e1c th\u01b0 m\u1ee5c t\u01b0\u01a1ng t\u1ef1:\n\n```text\nREADME.md\nsrc\nrelease\nhelm-chart\nprotos\nterraform\n```\n\nKi\u1ec3m tra Helm chart:\n\n```bash\nls -la helm-chart\n```\n\nM\u1ed9t Helm chart th\u00f4ng th\u01b0\u1eddng s\u1ebd c\u00f3 c\u1ea5u tr\u00fac t\u01b0\u01a1ng t\u1ef1:\n\n```text\nhelm-chart\/\n\u251c\u2500\u2500 Chart.yaml\n\u251c\u2500\u2500 values.yaml\n\u2514\u2500\u2500 templates\/\n```\n\nKi\u1ec3m tra c\u00e1c file:\n\n```bash\nfind helm-chart -maxdepth 2 -type f\n```\n\n---\n\n## 6. Ki\u1ec3m tra deployment hi\u1ec7n t\u1ea1i t\u1eeb Chapter 5B\n\n\u1ede Chapter 5B, \u1ee9ng d\u1ee5ng \u0111\u01b0\u1ee3c tri\u1ec3n khai b\u1eb1ng Kubernetes manifest.\n\nKi\u1ec3m tra c\u00e1c Deployment:\n\n```bash\nkubectl get deployments \\\n  -n online-boutique\n```\n\nKi\u1ec3m tra c\u00e1c Pod:\n\n```bash\nkubectl get pods \\\n  -n online-boutique\n```\n\nKi\u1ec3m tra c\u00e1c Service:\n\n```bash\nkubectl get services \\\n  -n online-boutique\n```\n\nKi\u1ec3m tra frontend:\n\n```bash\nkubectl get service frontend \\\n  -n online-boutique\n```\n\nN\u1ebfu frontend \u0111ang ch\u1ea1y, b\u1ea1n c\u00f3 th\u1ec3 th\u1ea5y:\n\n```text\nNAME       TYPE           EXTERNAL-IP\nfrontend   LoadBalancer   xxx.elb.amazonaws.com\n```\n\nL\u01b0u \u00fd l\u1ea1i \u0111\u1ecba ch\u1ec9 frontend:\n\n```bash\nexport FRONTEND_URL=$(kubectl get service frontend \\\n  -n online-boutique \\\n  -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')\n```\n\nKi\u1ec3m tra:\n\n```bash\necho \"$FRONTEND_URL\"\n```\n\n---\n\n## 7. X\u00f3a deployment c\u0169 b\u1eb1ng manifest\n\nTr\u01b0\u1edbc khi tri\u1ec3n khai b\u1eb1ng Helm, c\u1ea7n x\u00f3a resources \u0111\u01b0\u1ee3c t\u1ea1o b\u1edfi manifest \u1edf Chapter 5B.\n\n> Kh\u00f4ng x\u00f3a EKS cluster. Ch\u1ec9 x\u00f3a c\u00e1c resource c\u1ee7a Online Boutique.\n\nCh\u1ea1y:\n\n```bash\nkubectl delete \\\n  -f release\/kubernetes-manifests.yaml \\\n  -n online-boutique\n```\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get all \\\n  -n online-boutique\n```\n\nN\u1ebfu namespace kh\u00f4ng c\u00f2n resource c\u1ee7a Online Boutique, ch\u00fang ta c\u00f3 th\u1ec3 ti\u1ebfp t\u1ee5c.\n\nKi\u1ec3m tra l\u1ea1i namespace:\n\n```bash\nkubectl get namespace online-boutique\n```\n\nN\u1ebfu namespace \u0111\u00e3 b\u1ecb x\u00f3a trong qu\u00e1 tr\u00ecnh cleanup tr\u01b0\u1edbc \u0111\u00f3, t\u1ea1o l\u1ea1i:\n\n```bash\nkubectl create namespace online-boutique\n```\n\n---\n\n## 8. Ki\u1ec3m tra Helm chart\n\nDi chuy\u1ec3n v\u1ec1 th\u01b0 m\u1ee5c g\u1ed1c c\u1ee7a repository:\n\n```bash\ncd microservices-demo\n```\n\nKi\u1ec3m tra th\u00f4ng tin chart:\n\n```bash\nhelm show chart .\/helm-chart\n```\n\nKi\u1ec3m tra file c\u1ea5u h\u00ecnh m\u1eb7c \u0111\u1ecbnh:\n\n```bash\nhelm show values .\/helm-chart\n```\n\nL\u01b0u c\u1ea5u h\u00ecnh m\u1eb7c \u0111\u1ecbnh v\u00e0o file \u0111\u1ec3 d\u1ec5 \u0111\u1ecdc:\n\n```bash\nhelm show values .\/helm-chart \\\n  > \/tmp\/online-boutique-values.yaml\n```\n\nM\u1edf file:\n\n```bash\nless \/tmp\/online-boutique-values.yaml\n```\n\nT\u00ecm c\u00e1c c\u1ea5u h\u00ecnh li\u00ean quan \u0111\u1ebfn image:\n\n```bash\ngrep -n \"image\" \/tmp\/online-boutique-values.yaml\n```\n\nT\u00ecm c\u00e1c c\u1ea5u h\u00ecnh li\u00ean quan \u0111\u1ebfn replica:\n\n```bash\ngrep -n -i \"replica\" \/tmp\/online-boutique-values.yaml\n```\n\nT\u00ecm c\u1ea5u h\u00ecnh frontend:\n\n```bash\ngrep -n -i \"frontend\" \/tmp\/online-boutique-values.yaml\n```\n\n> T\u00ean c\u00e1c field trong `values.yaml` c\u00f3 th\u1ec3 thay \u0111\u1ed5i theo phi\u00ean b\u1ea3n repository. V\u00ec v\u1eady, c\u1ea7n ki\u1ec3m tra file th\u1ef1c t\u1ebf tr\u01b0\u1edbc khi override c\u1ea5u h\u00ecnh.\n\n---\n\n## 9. Ki\u1ec3m tra Helm chart b\u1eb1ng helm lint\n\nCh\u1ea1y:\n\n```bash\nhelm lint .\/helm-chart\n```\n\nK\u1ebft qu\u1ea3 th\u00e0nh c\u00f4ng s\u1ebd t\u01b0\u01a1ng t\u1ef1:\n\n```text\n==> Linting .\/helm-chart\n1 chart(s) linted, 0 chart(s) failed\n```\n\nN\u1ebfu c\u00f3 l\u1ed7i, \u0111\u1ecdc th\u00f4ng b\u00e1o v\u00e0 s\u1eeda chart tr\u01b0\u1edbc khi deploy.\n\n---\n\n## 10. Render manifest b\u1eb1ng Helm\n\nTr\u01b0\u1edbc khi c\u00e0i \u0111\u1eb7t th\u1eadt, s\u1eed d\u1ee5ng `helm template` \u0111\u1ec3 xem Helm s\u1ebd t\u1ea1o ra nh\u1eefng Kubernetes resources n\u00e0o.\n\n```bash\nhelm template online-boutique .\/helm-chart \\\n  --namespace online-boutique\n```\n\nL\u01b0u k\u1ebft qu\u1ea3 ra file:\n\n```bash\nhelm template online-boutique .\/helm-chart \\\n  --namespace online-boutique \\\n  > \/tmp\/online-boutique-rendered.yaml\n```\n\nKi\u1ec3m tra c\u00e1c lo\u1ea1i resource:\n\n```bash\ngrep '^kind:' \/tmp\/online-boutique-rendered.yaml\n```\n\nKi\u1ec3m tra c\u00e1c Deployment:\n\n```bash\ngrep -n 'kind: Deployment' \\\n  \/tmp\/online-boutique-rendered.yaml\n```\n\nKi\u1ec3m tra c\u00e1c Service:\n\n```bash\ngrep -n 'kind: Service' \\\n  \/tmp\/online-boutique-rendered.yaml\n```\n\nKi\u1ec3m tra image:\n\n```bash\ngrep -n 'image:' \\\n  \/tmp\/online-boutique-rendered.yaml\n```\n\n\u1ede b\u01b0\u1edbc n\u00e0y, Helm ch\u01b0a t\u1ea1o resource tr\u00ean EKS. L\u1ec7nh `helm template` ch\u1ec9 render YAML.\n\n---\n\n## 11. Deploy Online Boutique b\u1eb1ng Helm\n\n### 11.1. C\u00e0i \u0111\u1eb7t Helm release\n\nCh\u1ea1y:\n\n```bash\nhelm install online-boutique .\/helm-chart \\\n  --namespace online-boutique \\\n  --create-namespace\n```\n\nTrong \u0111\u00f3:\n\n```text\nonline-boutique       T\u00ean Helm release\n.\/helm-chart          \u0110\u01b0\u1eddng d\u1eabn Helm chart\n--namespace           Namespace tri\u1ec3n khai\n--create-namespace    T\u1ea1o namespace n\u1ebfu ch\u01b0a t\u1ed3n t\u1ea1i\n```\n\nKi\u1ec3m tra Helm release:\n\n```bash\nhelm list \\\n  --namespace online-boutique\n```\n\nK\u1ebft qu\u1ea3 t\u01b0\u01a1ng t\u1ef1:\n\n```text\nNAME             NAMESPACE          STATUS\nonline-boutique  online-boutique    deployed\n```\n\n---\n\n### 11.2. Ki\u1ec3m tra tr\u1ea1ng th\u00e1i Helm release\n\n```bash\nhelm status online-boutique \\\n  --namespace online-boutique\n```\n\nK\u1ebft qu\u1ea3 c\u1ea7n c\u00f3:\n\n```text\nSTATUS: deployed\n```\n\n---\n\n## 12. Ki\u1ec3m tra c\u00e1c Kubernetes resources\n\n### 12.1. Ki\u1ec3m tra Deployment\n\n```bash\nkubectl get deployments \\\n  -n online-boutique\n```\n\nTheo d\u00f5i rollout:\n\n```bash\nkubectl rollout status deployment\/frontend \\\n  -n online-boutique\n```\n\n---\n\n### 12.2. Ki\u1ec3m tra Pod\n\n```bash\nkubectl get pods \\\n  -n online-boutique\n```\n\nTheo d\u00f5i realtime:\n\n```bash\nkubectl get pods \\\n  -n online-boutique \\\n  -w\n```\n\nD\u1eebng theo d\u00f5i:\n\n```text\nCtrl + C\n```\n\nC\u00e1c Pod c\u1ea7n chuy\u1ec3n sang tr\u1ea1ng th\u00e1i:\n\n```text\nRunning\n```\n\nN\u1ebfu Pod kh\u00f4ng ch\u1ea1y:\n\n```bash\nkubectl describe pod <POD_NAME> \\\n  -n online-boutique\n```\n\nXem logs frontend:\n\n```bash\nkubectl logs deployment\/frontend \\\n  -n online-boutique\n```\n\n---\n\n### 12.3. Ki\u1ec3m tra Service\n\n```bash\nkubectl get services \\\n  -n online-boutique\n```\n\nKi\u1ec3m tra frontend:\n\n```bash\nkubectl get service frontend \\\n  -n online-boutique\n```\n\nFrontend c\u1ea7n c\u00f3:\n\n```text\nTYPE: LoadBalancer\n```\n\nC\u00e1c microservice n\u1ed9i b\u1ed9 th\u01b0\u1eddng c\u00f3:\n\n```text\nTYPE: ClusterIP\n```\n\n---\n\n## 13. L\u1ea5y \u0111\u1ecba ch\u1ec9 truy c\u1eadp frontend\n\nBan \u0111\u1ea7u, AWS Load Balancer c\u00f3 th\u1ec3 \u0111ang \u1edf tr\u1ea1ng th\u00e1i:\n\n```text\nEXTERNAL-IP: <pending>\n```\n\nTheo d\u00f5i:\n\n```bash\nkubectl get service frontend \\\n  -n online-boutique \\\n  -w\n```\n\nKhi Load Balancer \u0111\u01b0\u1ee3c t\u1ea1o xong, l\u1ea5y hostname:\n\n```bash\nexport FRONTEND_URL=$(kubectl get service frontend \\\n  -n online-boutique \\\n  -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')\n```\n\nKi\u1ec3m tra:\n\n```bash\necho \"$FRONTEND_URL\"\n```\n\nTest b\u1eb1ng `curl`:\n\n```bash\ncurl -I \"http:\/\/$FRONTEND_URL\"\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\nHTTP\/1.1 200 OK\n```\n\nM\u1edf tr\u00ecnh duy\u1ec7t:\n\n```text\nhttp:\/\/<EXTERNAL-HOSTNAME>\n```\n\n---\n\n## 14. Ki\u1ec3m tra Helm release \u0111\u00e3 qu\u1ea3n l\u00fd resources\n\nLi\u1ec7t k\u00ea c\u00e1c resource thu\u1ed9c Helm release:\n\n```bash\nkubectl get all \\\n  -n online-boutique \\\n  -l app.kubernetes.io\/managed-by=Helm\n```\n\nXem th\u00f4ng tin Helm release:\n\n```bash\nhelm get all online-boutique \\\n  --namespace online-boutique\n```\n\nXem values \u0111ang \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng:\n\n```bash\nhelm get values online-boutique \\\n  --namespace online-boutique\n```\n\nXem to\u00e0n b\u1ed9 values, bao g\u1ed3m c\u1ea3 gi\u00e1 tr\u1ecb m\u1eb7c \u0111\u1ecbnh:\n\n```bash\nhelm get values online-boutique \\\n  --namespace online-boutique \\\n  --all\n```\n\nXem manifest m\u00e0 Helm \u0111\u00e3 tri\u1ec3n khai:\n\n```bash\nhelm get manifest online-boutique \\\n  --namespace online-boutique\n```\n\n---\n\n## 15. T\u1ea1o file c\u1ea5u h\u00ecnh ri\u00eang cho lab\n\nKh\u00f4ng n\u00ean s\u1eeda tr\u1ef1c ti\u1ebfp file `values.yaml` g\u1ed1c c\u1ee7a repository.\n\nT\u1ea1o file override ri\u00eang:\n\n```bash\nmkdir -p helm-overrides\ntouch helm-overrides\/lab-values.yaml\n```\n\nM\u1edf file:\n\n```bash\nnano helm-overrides\/lab-values.yaml\n```\n\nN\u1ed9i dung file s\u1ebd ph\u1ee5 thu\u1ed9c v\u00e0o c\u1ea5u tr\u00fac th\u1ef1c t\u1ebf c\u1ee7a `helm-chart\/values.yaml`.\n\nV\u00ed d\u1ee5, n\u1ebfu chart h\u1ed7 tr\u1ee3 c\u1ea5u h\u00ecnh replicas theo d\u1ea1ng sau:\n\n```yaml\nfrontend:\n  replicaCount: 2\n\ncartservice:\n  replicaCount: 2\n```\n\nth\u00ec file override c\u00f3 th\u1ec3 l\u00e0:\n\n```yaml\nfrontend:\n  replicaCount: 2\n\ncartservice:\n  replicaCount: 2\n```\n\n> Ch\u1ec9 s\u1eed d\u1ee5ng c\u00e1c field th\u1ef1c s\u1ef1 t\u1ed3n t\u1ea1i trong chart. Ki\u1ec3m tra `helm show values .\/helm-chart` tr\u01b0\u1edbc khi th\u00eam c\u1ea5u h\u00ecnh.\n\n---\n\n## 16. Ki\u1ec3m tra c\u1ea5u h\u00ecnh override tr\u01b0\u1edbc khi upgrade\n\nS\u1eed d\u1ee5ng `helm template` v\u1edbi file override:\n\n```bash\nhelm template online-boutique .\/helm-chart \\\n  --namespace online-boutique \\\n  -f helm-overrides\/lab-values.yaml \\\n  > \/tmp\/online-boutique-custom.yaml\n```\n\nKi\u1ec3m tra c\u1ea5u h\u00ecnh replicas:\n\n```bash\ngrep -n -A3 -B3 \"replicas:\" \\\n  \/tmp\/online-boutique-custom.yaml\n```\n\nN\u1ebfu manifest render \u0111\u00fang, ti\u1ebfp t\u1ee5c th\u1ef1c hi\u1ec7n upgrade.\n\n---\n\n## 17. Th\u1ef1c hi\u1ec7n Helm upgrade\n\nCh\u1ea1y:\n\n```bash\nhelm upgrade online-boutique .\/helm-chart \\\n  --namespace online-boutique \\\n  -f helm-overrides\/lab-values.yaml\n```\n\nKi\u1ec3m tra tr\u1ea1ng th\u00e1i:\n\n```bash\nhelm status online-boutique \\\n  --namespace online-boutique\n```\n\nKi\u1ec3m tra Deployment:\n\n```bash\nkubectl get deployments \\\n  -n online-boutique\n```\n\nKi\u1ec3m tra Pod:\n\n```bash\nkubectl get pods \\\n  -n online-boutique\n```\n\nKi\u1ec3m tra rollout frontend:\n\n```bash\nkubectl rollout status deployment\/frontend \\\n  -n online-boutique\n```\n\n---\n\n## 18. Ki\u1ec3m tra Helm history\n\nHelm l\u01b0u l\u1ea1i l\u1ecbch s\u1eed c\u00e1c l\u1ea7n c\u00e0i \u0111\u1eb7t v\u00e0 upgrade.\n\nCh\u1ea1y:\n\n```bash\nhelm history online-boutique \\\n  --namespace online-boutique\n```\n\nK\u1ebft qu\u1ea3 t\u01b0\u01a1ng t\u1ef1:\n\n```text\nREVISION  STATUS       DESCRIPTION\n1         superseded   Install complete\n2         deployed     Upgrade complete\n```\n\nL\u1ea5y revision hi\u1ec7n t\u1ea1i:\n\n```bash\nhelm list \\\n  --namespace online-boutique\n```\n\n---\n\n## 19. Th\u1eed rollback Helm release\n\nN\u1ebfu phi\u00ean b\u1ea3n m\u1edbi c\u00f3 v\u1ea5n \u0111\u1ec1, c\u00f3 th\u1ec3 rollback v\u1ec1 revision tr\u01b0\u1edbc \u0111\u00f3.\n\nTr\u01b0\u1edbc ti\u00ean xem history:\n\n```bash\nhelm history online-boutique \\\n  --namespace online-boutique\n```\n\nRollback v\u1ec1 revision `1`:\n\n```bash\nhelm rollback online-boutique 1 \\\n  --namespace online-boutique\n```\n\nKi\u1ec3m tra tr\u1ea1ng th\u00e1i:\n\n```bash\nhelm status online-boutique \\\n  --namespace online-boutique\n```\n\nKi\u1ec3m tra rollout:\n\n```bash\nkubectl rollout status deployment\/frontend \\\n  -n online-boutique\n```\n\nKi\u1ec3m tra c\u00e1c Pod:\n\n```bash\nkubectl get pods \\\n  -n online-boutique\n```\n\nKi\u1ec3m tra l\u1ea1i frontend:\n\n```bash\nkubectl get service frontend \\\n  -n online-boutique\n```\n\n---\n\n## 20. Ki\u1ec3m tra giao ti\u1ebfp gi\u1eefa c\u00e1c microservice\n\nKi\u1ec3m tra c\u00e1c Service:\n\n```bash\nkubectl get services \\\n  -n online-boutique\n```\n\nV\u00ed d\u1ee5 c\u00e1c service n\u1ed9i b\u1ed9:\n\n```text\ncartservice\nproductcatalogservice\ncheckoutservice\npaymentservice\nshippingservice\n```\n\nKubernetes cung c\u1ea5p DNS n\u1ed9i b\u1ed9 cho c\u00e1c Service.\n\nV\u00ed d\u1ee5:\n\n```text\ncartservice:7070\nproductcatalogservice:3550\ncheckoutservice:5050\n```\n\nKi\u1ec3m tra Endpoint:\n\n```bash\nkubectl get endpoints \\\n  -n online-boutique\n```\n\nHo\u1eb7c:\n\n```bash\nkubectl get endpointslices \\\n  -n online-boutique\n```\n\nKi\u1ec3m tra logs frontend:\n\n```bash\nkubectl logs deployment\/frontend \\\n  -n online-boutique \\\n  --tail=100\n```\n\nN\u1ebfu giao di\u1ec7n hi\u1ec3n th\u1ecb \u0111\u01b0\u1ee3c s\u1ea3n ph\u1ea9m, gi\u1ecf h\u00e0ng v\u00e0 checkout, c\u00e1c microservice ch\u00ednh \u0111ang giao ti\u1ebfp th\u00e0nh c\u00f4ng.\n\n---\n\n## 21. So s\u00e1nh c\u00e1ch tri\u1ec3n khai tr\u01b0\u1edbc v\u00e0 sau Helm\n\n### Tr\u01b0\u1edbc Chapter 5D\n\n```text\nKubernetes Manifest\n        \u2193\nkubectl apply\n        \u2193\nAmazon EKS\n```\n\nThay \u0111\u1ed5i c\u1ea5u h\u00ecnh:\n\n```text\nS\u1eeda YAML th\u1ee7 c\u00f4ng\n        \u2193\nkubectl apply\n```\n\n## Sau Chapter 5D\n\n```text\nHelm Chart\n    +\nvalues.yaml\n        \u2193\nhelm install \/ helm upgrade\n        \u2193\nAmazon EKS\n```\n\nRollback:\n\n```text\nhelm rollback\n```\n\nKi\u1ec3m tra l\u1ecbch s\u1eed:\n\n```text\nhelm history\n```\n\nXem c\u1ea5u h\u00ecnh:\n\n```text\nhelm get values\n```\n\n---\n\n## 22. X\u00f3a Helm release\n\nN\u1ebfu ch\u1ec9 mu\u1ed1n x\u00f3a Online Boutique nh\u01b0ng gi\u1eef l\u1ea1i EKS cluster:\n\n```bash\nhelm uninstall online-boutique \\\n  --namespace online-boutique\n```\n\nKi\u1ec3m tra:\n\n```bash\nhelm list \\\n  --namespace online-boutique\n```\n\nKi\u1ec3m tra c\u00e1c resource:\n\n```bash\nkubectl get all \\\n  -n online-boutique\n```\n\nN\u1ebfu kh\u00f4ng c\u00f2n s\u1eed d\u1ee5ng namespace:\n\n```bash\nkubectl delete namespace online-boutique\n```\n\n> Kh\u00f4ng ch\u1ea1y b\u01b0\u1edbc n\u00e0y n\u1ebfu b\u1ea1n mu\u1ed1n ti\u1ebfp t\u1ee5c Chapter 5E ho\u1eb7c Chapter 5F tr\u00ean c\u00f9ng namespace.\n\n---\n\n## 23. Cleanup to\u00e0n b\u1ed9 EKS cluster\n\nN\u1ebfu kh\u00f4ng c\u1ea7n s\u1eed d\u1ee5ng EKS cluster n\u1eefa, quay l\u1ea1i ph\u1ea7n cleanup c\u1ee7a Chapter 5B.\n\n\u0110\u1eb7t l\u1ea1i bi\u1ebfn:\n\n```bash\nexport AWS_REGION=ap-northeast-1\nexport CLUSTER_NAME=online-boutique-eks\n```\n\nX\u00f3a cluster:\n\n```bash\neksctl delete cluster \\\n  --name \"$CLUSTER_NAME\" \\\n  --region \"$AWS_REGION\"\n```\n\nKi\u1ec3m tra:\n\n```bash\neksctl get cluster \\\n  --region \"$AWS_REGION\"\n```\n\nNgo\u00e0i EKS Console, c\u1ea7n ki\u1ec3m tra th\u00eam:\n\n* EC2.\n* Load Balancers.\n* Auto Scaling Groups.\n* CloudFormation.\n* VPC.\n* NAT Gateway.\n* Elastic IP.\n\n\u0110\u1eb7c bi\u1ec7t, c\u1ea7n ki\u1ec3m tra **NAT Gateway**, v\u00ec t\u00e0i nguy\u00ean n\u00e0y c\u00f3 th\u1ec3 ti\u1ebfp t\u1ee5c ph\u00e1t sinh chi ph\u00ed.\n\n---\n\n## 24. K\u1ebft qu\u1ea3 \u0111\u1ea1t \u0111\u01b0\u1ee3c\n\nSau Chapter 5B:\n\n```text\nAmazon EKS\n    \u2514\u2500\u2500 kubectl apply\n          \u2514\u2500\u2500 Online Boutique\n```\n\nSau Chapter 5D:\n\n```text\nAmazon EKS\n    \u2514\u2500\u2500 Helm Release\n          \u251c\u2500\u2500 Helm Chart\n          \u251c\u2500\u2500 values.yaml\n          \u251c\u2500\u2500 Deployments\n          \u251c\u2500\u2500 Services\n          \u2514\u2500\u2500 Online Boutique\n```\n\nCh\u00fang ta \u0111\u00e3 c\u00f3 th\u1ec3:\n\n* \u0110\u00f3ng g\u00f3i deployment b\u1eb1ng Helm.\n* Render manifest tr\u01b0\u1edbc khi tri\u1ec3n khai.\n* C\u00e0i \u0111\u1eb7t application b\u1eb1ng `helm install`.\n* C\u1eadp nh\u1eadt b\u1eb1ng `helm upgrade`.\n* Theo d\u00f5i l\u1ecbch s\u1eed b\u1eb1ng `helm history`.\n* Rollback b\u1eb1ng `helm rollback`.\n* T\u00e1ch c\u1ea5u h\u00ecnh kh\u1ecfi Helm chart g\u1ed1c.\n* Qu\u1ea3n l\u00fd nhi\u1ec1u microservice b\u1eb1ng m\u1ed9t Helm release.\n\n---\n\n## 25. Ki\u1ebfn tr\u00fac k\u1ebft th\u00fac Chapter 5D\n\n```text\nDeveloper\n    \u2502\n    \u25bc\nGitHub\n    \u2502\n    \u25bc\nHelm Chart\n    \u2502\n    \u251c\u2500\u2500 Chart.yaml\n    \u251c\u2500\u2500 values.yaml\n    \u2514\u2500\u2500 templates\/\n    \u2502\n    \u25bc\nhelm install \/ helm upgrade\n    \u2502\n    \u25bc\nAmazon EKS\n    \u2502\n    \u251c\u2500\u2500 frontend\n    \u251c\u2500\u2500 cartservice\n    \u251c\u2500\u2500 checkoutservice\n    \u251c\u2500\u2500 paymentservice\n    \u251c\u2500\u2500 productcatalogservice\n    \u251c\u2500\u2500 recommendationservice\n    \u251c\u2500\u2500 shippingservice\n    \u2514\u2500\u2500 C\u00e1c microservice kh\u00e1c\n```\n\n\u1ede Chapter ti\u1ebfp theo, ch\u00fang ta s\u1ebd ti\u1ebfp t\u1ee5c chuy\u1ec3n t\u1eeb:\n\n```text\nDeveloper\n    \u2193\nhelm upgrade\n    \u2193\nEKS\n```\n\nsang:\n\n```text\nDeveloper\n    \u2193\nGitHub\n    \u2193\nGitOps Repository\n    \u2193\nArgo CD\n    \u2193\nAmazon EKS\n```\n\n\u0110\u00f3 s\u1ebd l\u00e0 b\u01b0\u1edbc \u0111\u1ea7u ti\u00ean \u0111\u1ec3 x\u00e2y d\u1ef1ng **GitOps Platform** cho Online Boutique.","published_at":"2026-09-14T09:10:09.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T22:13:02.000000Z","edited_at":"2026-09-14T09:09:51.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":9,"points":0,"views_count":8,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/c3eb80eb-e4c9-4ea7-ac75-bca21bba2d9d.png","user":{"data":{"id":98940,"url":"https:\/\/viblo.asia\/u\/Juu-dev","avatar":"25478754-6f7c-425c-a27d-bd61fabc134e.jpg","name":"Th\u1ed1ng PM","username":"Juu-dev","followers_count":82,"reputation":1444,"posts_count":190,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"amazon-eks","name":"Amazon EKS"},{"slug":"helm","name":"helm"}]},"commentators":{"data":[]}},{"id":106661,"title":"T\u1ed1i \u01b0u phantam.top t\u1eeb GitHub ADHD v\u00e0 Social skills","slug":"yZJZlPg8Vjm","url":"https:\/\/viblo.asia\/p\/toi-uu-phantamtop-tu-github-adhd-va-social-skills-yZJZlPg8Vjm","user_id":208264,"moderation":null,"transliterated":"toi-uu-phantamtop-tu-github-adhd-va-social-skills","contents_short":"Khi ph\u00e1t tri\u1ec3n m\u1ed9t n\u1ec1n t\u1ea3ng n\u1ed9i dung c\u00e1 nh\u00e2n, b\u00e0i to\u00e1n l\u1edbn nh\u1ea5t kh\u00f4ng n\u1eb1m \u1edf vi\u1ec7c vi\u1ebft bao nhi\u00eau d\u00f2ng code, m\u00e0 \u1edf kh\u1ea3 n\u0103ng duy tr\u00ec h\u1ec7 th\u1ed1ng v\u00e0 t\u1ed1i \u01b0u tr\u1ea3i nghi\u1ec7m \u0111\u1ecdc. Vi\u1ec7c nghi\u00ean c\u1ee9u hai m\u00e3 ngu\u1ed3n m\u1edf l\u00e0 social-media-skills v\u00e0 i-have-adhd \u0111\u00e3 g\u1ee3i m\u1edf cho t\u00f4i m\u1ed9t h\u01b0\u1edbng \u0111i m\u1edbi trong vi\u1ec7c x\u00e2y d\u1ef1ng ki\u1ebfn tr\u00fac cho phantam.top.\n\nB\u00e0i vi\u1ebft n\u00e0y ph\u00e2n t\u00edch s\u00e2u d\u01b0\u1edbi g\u00f3c \u0111\u1ed9 k\u1ef9 thu\u1eadt v\u1ec1 hai t\u01b0 duy tr\u00e1i ng\u01b0\u1ee3c nh\u01b0ng ...","contents":"Khi ph\u00e1t tri\u1ec3n m\u1ed9t n\u1ec1n t\u1ea3ng n\u1ed9i dung c\u00e1 nh\u00e2n, b\u00e0i to\u00e1n l\u1edbn nh\u1ea5t kh\u00f4ng n\u1eb1m \u1edf vi\u1ec7c vi\u1ebft bao nhi\u00eau d\u00f2ng code, m\u00e0 \u1edf kh\u1ea3 n\u0103ng duy tr\u00ec h\u1ec7 th\u1ed1ng v\u00e0 t\u1ed1i \u01b0u tr\u1ea3i nghi\u1ec7m \u0111\u1ecdc. Vi\u1ec7c nghi\u00ean c\u1ee9u hai m\u00e3 ngu\u1ed3n m\u1edf l\u00e0 **social-media-skills** v\u00e0 **i-have-adhd** \u0111\u00e3 g\u1ee3i m\u1edf cho t\u00f4i m\u1ed9t h\u01b0\u1edbng \u0111i m\u1edbi trong vi\u1ec7c x\u00e2y d\u1ef1ng ki\u1ebfn tr\u00fac cho phantam.top.\n\nB\u00e0i vi\u1ebft n\u00e0y ph\u00e2n t\u00edch s\u00e2u d\u01b0\u1edbi g\u00f3c \u0111\u1ed9 k\u1ef9 thu\u1eadt v\u1ec1 hai t\u01b0 duy tr\u00e1i ng\u01b0\u1ee3c nh\u01b0ng l\u1ea1i b\u1ed5 tr\u1ee3 ho\u00e0n h\u1ea3o cho nhau: m\u1ed9t b\u00ean t\u1eadp trung v\u00e0o t\u1ef1 \u0111\u1ed9ng h\u00f3a lu\u1ed3ng ph\u00e2n ph\u1ed1i, b\u00ean c\u00f2n l\u1ea1i t\u1ed1i \u01b0u h\u00f3a s\u1ef1 t\u1eadp trung tuy\u1ec7t \u0111\u1ed1i cho ng\u01b0\u1eddi d\u00f9ng.\n\n## Ph\u00e2n t\u00edch d\u1ef1 \u00e1n social-media-skills: T\u1ef1 \u0111\u1ed9ng h\u00f3a ph\u00e2n ph\u1ed1i n\u1ed9i dung\n\nD\u1ef1 \u00e1n **social-media-skills** cung c\u1ea5p m\u1ed9t t\u1eadp h\u1ee3p c\u00e1c k\u1ef9 n\u0103ng v\u00e0 k\u1ecbch b\u1ea3n gi\u00fap \u0111\u00f3ng g\u00f3i n\u1ed9i dung \u0111\u1ec3 ph\u00e1t h\u00e0nh tr\u00ean nhi\u1ec1u n\u1ec1n t\u1ea3ng truy\u1ec1n th\u00f4ng kh\u00e1c nhau. M\u00e3 ngu\u1ed3n t\u1eadp trung v\u00e0o vi\u1ec7c chu\u1ea9n h\u00f3a \u0111\u1ecbnh d\u1ea1ng d\u1eef li\u1ec7u \u0111\u1ea7u v\u00e0o v\u00e0 chuy\u1ec3n \u0111\u1ed5i linh ho\u1ea1t sang c\u00e1c d\u1ea1ng \u0111\u1ea7u ra t\u01b0\u01a1ng th\u00edch v\u1edbi API c\u1ee7a c\u00e1c m\u1ea1ng x\u00e3 h\u1ed9i.\n\n### \u01afu \u0111i\u1ec3m c\u1ed1t l\u00f5i trong x\u1eed l\u00fd lu\u1ed3ng c\u00f4ng vi\u1ec7c\n\n\u0110i\u1ec3m m\u1ea1nh nh\u1ea5t c\u1ee7a d\u1ef1 \u00e1n l\u00e0 t\u00ednh m\u00f4-\u0111un h\u00f3a cao. M\u1ed7i k\u1ef9 n\u0103ng ph\u00e2n ph\u1ed1i \u0111\u01b0\u1ee3c t\u00e1ch bi\u1ec7t th\u00e0nh m\u1ed9t h\u00e0m x\u1eed l\u00fd \u0111\u1ed9c l\u1eadp, gi\u00fap vi\u1ec7c t\u00edch h\u1ee3p v\u00e0o c\u00e1c \u0111\u01b0\u1eddng \u1ed1ng t\u1ef1 \u0111\u1ed9ng h\u00f3a tr\u1edf n\u00ean d\u1ec5 d\u00e0ng. H\u1ec7 th\u1ed1ng x\u1eed l\u00fd chu\u1ea9n h\u00f3a chu\u1ed7i d\u1eef li\u1ec7u r\u1ea5t hi\u1ec7u qu\u1ea3, gi\u1ea3m thi\u1ec3u l\u1ed7i \u0111\u1ecbnh d\u1ea1ng khi \u0111\u1ea9y d\u1eef li\u1ec7u sang b\u00ean th\u1ee9 ba.\n\n### Gi\u1edbi h\u1ea1n k\u1ef9 thu\u1eadt c\u1ea7n l\u01b0u \u00fd\n\nM\u1eb7c d\u00f9 logic x\u1eed l\u00fd t\u1ed1t, d\u1ef1 \u00e1n v\u1eabn ph\u1ee5 thu\u1ed9c nhi\u1ec1u v\u00e0o c\u1ea5u tr\u00fac API c\u1ee7a c\u00e1c n\u1ec1n t\u1ea3ng ngu\u1ed3n. Khi c\u00e1c b\u00ean thay \u0111\u1ed5i c\u01a1 ch\u1ebf x\u00e1c th\u1ef1c ho\u1eb7c \u0111\u1ecbnh d\u1ea1ng d\u1eef li\u1ec7u truy\u1ec1n t\u1ea3i, h\u1ec7 th\u1ed1ng d\u1ec5 r\u01a1i v\u00e0o tr\u1ea1ng th\u00e1i ngh\u1ebdn lu\u1ed3ng n\u1ebfu kh\u00f4ng c\u00f3 c\u01a1 ch\u1ebf fallback t\u1ef1 \u0111\u1ed9ng.\n\n**\u26a1 T\u00f3m t\u1eaft ki\u1ebfn tr\u00fac social-media-skills:**\n- \u0110\u00f3ng g\u00f3i logic chuy\u1ec3n \u0111\u1ed5i n\u1ed9i dung theo d\u1ea1ng pipeline.\n- D\u1ec5 d\u00e0ng t\u00edch h\u1ee3p v\u1edbi c\u00e1c t\u00e1c v\u1ee5 ch\u1ea1y ng\u1ea7m cronjob ho\u1eb7c webhook.\n- Thi\u1ebfu c\u01a1 ch\u1ebf qu\u1ea3n l\u00fd l\u1ed7i ch\u1ee7 \u0111\u1ed9ng khi API b\u00ean th\u1ee9 ba thay \u0111\u1ed5i c\u1ea5u tr\u00fac.\n\n## Ph\u00e2n t\u00edch d\u1ef1 \u00e1n i-have-adhd: Tri\u1ebft l\u00fd thi\u1ebft k\u1ebf t\u1ed1i gi\u1ea3n nh\u1eadn th\u1ee9c\n\nTr\u00e1i ng\u01b0\u1ee3c v\u1edbi vi\u1ec7c m\u1edf r\u1ed9ng lu\u1ed3ng d\u1eef li\u1ec7u c\u1ee7a d\u1ef1 \u00e1n tr\u00ean, **i-have-adhd** ti\u1ebfp c\u1eadn b\u00e0i to\u00e1n d\u01b0\u1edbi g\u00f3c nh\u00ecn t\u1ed1i \u01b0u h\u00f3a giao di\u1ec7n ng\u01b0\u1eddi d\u00f9ng. D\u1ef1 \u00e1n t\u1eadp trung gi\u1ea3i quy\u1ebft v\u1ea5n \u0111\u1ec1 ph\u00e2n t\u00e1n ch\u00fa \u00fd b\u1eb1ng c\u00e1ch lo\u1ea1i b\u1ecf tri\u1ec7t \u0111\u1ec3 c\u00e1c th\u00e0nh ph\u1ea7n giao di\u1ec7n g\u00e2y nhi\u1ec5u th\u1ecb gi\u00e1c.\n\n![Ki\u1ebfn tr\u00fac giao di\u1ec7n t\u1ed1i gi\u1ea3n nh\u1eadn th\u1ee9c](https:\/\/res.cloudinary.com\/phantamht\/image\/upload\/v1789204950\/ahmfhyi0pq3xeqnlmypj.png)\n\n### \u0110i\u1ec3m s\u00e1ng trong t\u01b0 duy giao di\u1ec7n ng\u01b0\u1eddi d\u00f9ng\n\nD\u1ef1 \u00e1n \u00e1p d\u1ee5ng quy chu\u1ea9n ph\u00e2n c\u1ea5p th\u1ecb gi\u00e1c c\u1ef1c k\u1ef3 nghi\u00eam ng\u1eb7t. \u0110\u1ed9 t\u01b0\u01a1ng ph\u1ea3n m\u00e0u s\u1eafc, kho\u1ea3ng tr\u1ed1ng gi\u1eefa c\u00e1c kh\u1ed1i v\u0103n b\u1ea3n v\u00e0 vi\u1ec7c gi\u1edbi h\u1ea1n s\u1ed1 l\u01b0\u1ee3ng h\u00e0nh \u0111\u1ed9ng tr\u00ean m\u1ed9t m\u00e0n h\u00ecnh gi\u00fap ng\u01b0\u1eddi \u0111\u1ecdc duy tr\u00ec tr\u1ea1ng th\u00e1i lu\u1ed3ng l\u00e0m vi\u1ec7c m\u00e0 kh\u00f4ng b\u1ecb ki\u1ec7t s\u1ee9c nh\u1eadn th\u1ee9c.\n\n### M\u1eb7t h\u1ea1n ch\u1ebf khi m\u1edf r\u1ed9ng quy m\u00f4\n\nVi\u1ec7c c\u1eaft gi\u1ea3m qu\u00e1 nhi\u1ec1u th\u00e0nh ph\u1ea7n giao di\u1ec7n khi\u1ebfn d\u1ef1 \u00e1n g\u1eb7p kh\u00f3 kh\u0103n trong vi\u1ec7c hi\u1ec3n th\u1ecb c\u00e1c lu\u1ed3ng th\u00f4ng tin ph\u1ee9c t\u1ea1p. \u0110\u1ed1i v\u1edbi c\u00e1c b\u00e0i vi\u1ebft k\u1ef9 thu\u1eadt \u0111\u00f2i h\u1ecfi t\u00ednh t\u01b0\u01a1ng t\u00e1c cao ho\u1eb7c ch\u1ee9a nhi\u1ec1u b\u1ea3ng d\u1eef li\u1ec7u, c\u1ea5u tr\u00fac n\u00e0y t\u1ecf ra thi\u1ebfu linh ho\u1ea1t.\n\n| Ti\u00eau ch\u00ed | social-media-skills | i-have-adhd |\n| --- | --- | --- |\n| **M\u1ee5c ti\u00eau ch\u00ednh** | T\u1ef1 \u0111\u1ed9ng h\u00f3a lu\u1ed3ng ph\u00e2n ph\u1ed1i | Gi\u1ea3m t\u1ea3i nh\u1eadn th\u1ee9c ng\u01b0\u1eddi d\u00f9ng |\n| **Tr\u1ecdng t\u00e2m k\u1ef9 thu\u1eadt** | X\u1eed l\u00fd d\u1eef li\u1ec7u backend & API | T\u1ed1i \u01b0u UI\/UX & Typography |\n| **Kh\u1ea3 n\u0103ng linh ho\u1ea1t** | Cao (chuy\u1ec3n \u0111\u1ed5i \u0111a d\u1ea1ng) | Th\u1ea5p (b\u1ecb gi\u1edbi h\u1ea1n khung hi\u1ec3n th\u1ecb) |\n\n## Th\u1ef1c t\u1ebf \u1ee9ng d\u1ee5ng ki\u1ebfn tr\u00fac k\u1ebft h\u1ee3p tr\u00ean phantam.top\n\nT\u1ea1i phantam.top, t\u00f4i kh\u00f4ng \u00e1p d\u1ee5ng nguy\u00ean m\u1eabu m\u1ed9t m\u00e3 ngu\u1ed3n n\u00e0o m\u00e0 ch\u1ecdn ph\u01b0\u01a1ng \u00e1n lai gh\u00e9p. H\u1ec7 th\u1ed1ng backend k\u1ebf th\u1eeba t\u01b0 duy c\u1ee7a **social-media-skills** \u0111\u1ec3 t\u1ef1 \u0111\u1ed9ng b\u0103m nh\u1ecf b\u00e0i vi\u1ebft th\u00e0nh c\u00e1c \u0111o\u1ea1n t\u00f3m t\u1eaft ng\u1eafn. Sau \u0111\u00f3, giao di\u1ec7n frontend hi\u1ec3n th\u1ecb c\u00e1c \u0111o\u1ea1n n\u1ed9i dung n\u00e0y theo \u0111\u00fang quy chu\u1ea9n gi\u1ea3m t\u1ea3i th\u1ecb gi\u00e1c l\u1ea5y t\u1eeb **i-have-adhd**.\n\nQuy tr\u00ecnh n\u00e0y gi\u00fap n\u1ed9i dung sau khi xu\u1ea5t b\u1ea3n \u0111\u01b0\u1ee3c t\u1ef1 \u0111\u1ed9ng t\u1ed1i \u01b0u h\u00f3a cho \u0111\u1ecdc nhanh, \u0111\u1ed3ng th\u1eddi s\u1eb5n s\u00e0ng \u0111\u1ea9y sang c\u00e1c k\u00eanh v\u1ec7 tinh m\u00e0 kh\u00f4ng t\u1ed1n c\u00f4ng bi\u00ean t\u1eadp l\u1ea1i. B\u1ea1n c\u00f3 th\u1ec3 tham kh\u1ea3o th\u00eam c\u00e1c g\u00f3c nh\u00ecn v\u1ec1 t\u1ed1i \u01b0u h\u1ec7 th\u1ed1ng t\u1ea1i danh m\u1ee5c [l\u1eadp tr\u00ecnh h\u1ec7 th\u1ed1ng](https:\/\/phantam.top\/category\/goc-ky-thuat) c\u1ee7a blog.\n\n![S\u01a1 \u0111\u1ed3 k\u1ebft h\u1ee3p backend v\u00e0 frontend](https:\/\/res.cloudinary.com\/phantamht\/image\/upload\/v1789204926\/lc42y9ctwrbrmkjsonsa.png)","published_at":"2026-09-14T09:03:47.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T22:13:02.000000Z","edited_at":"2026-09-14T09:03:41.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":5,"points":0,"views_count":13,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/fff04f87-2ce3-4b96-a711-2d997f8169ed.png","user":{"data":{"id":208264,"url":"https:\/\/viblo.asia\/u\/phantam38","avatar":"18d00783-dbc1-4a67-b5bb-6206f7641a62.jpg","name":"Phan T\u00e2m","username":"phantam38","followers_count":0,"reputation":4,"posts_count":2,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"search-engine","name":"#Search Engine"}]},"commentators":{"data":[]}},{"id":106636,"title":"\ud83d\ude80 Chapter 5 \u2014 Platform: Ph\u1ea7n B \u2014 Deploy Google Online Boutique l\u00ean Amazon EKS","slug":"bNVQGlOmJvR","url":"https:\/\/viblo.asia\/p\/chapter-5-platform-phan-b-deploy-google-online-boutique-len-amazon-eks-bNVQGlOmJvR","user_id":98940,"moderation":null,"transliterated":"chapter-5-platform-phan-b-deploy-google-online-boutique-len-amazon-eks","contents_short":"\u1ede Chapter 4G, ch\u00fang ta \u0111\u00e3 ho\u00e0n th\u00e0nh quy tr\u00ecnh Production Governance:\n\nTuy nhi\u00ean, h\u1ec7 th\u1ed1ng hi\u1ec7n t\u1ea1i v\u1eabn ch\u01b0a s\u1eed d\u1ee5ng Kubernetes. Trong Chapter 5B, ch\u00fang ta s\u1ebd t\u1ea1o m\u1ed9t Amazon EKS cluster v\u00e0 deploy \u1ee9ng d\u1ee5ng Google Online Boutique l\u00ean \u0111\u00f3.\n\n1. M\u1ee5c ti\u00eau\n\nSau khi ho\u00e0n th\u00e0nh Chapter n\u00e0y, ch\u00fang ta s\u1ebd c\u00f3:\n\nCh\u00fang ta s\u1ebd th\u1ef1c hi\u1ec7n:\n\n* C\u00e0i \u0111\u1eb7t c\u00e1c c\u00f4ng c\u1ee5 c\u1ea7n thi\u1ebft.\n* T\u1ea1o Amazon EKS cluster.\n* T\u1ea1o managed n...","contents":"\u1ede Chapter 4G, ch\u00fang ta \u0111\u00e3 ho\u00e0n th\u00e0nh quy tr\u00ecnh Production Governance:\n\n```text\nGitHub\n   \u2193\nGitHub Actions\n   \u2193\nTest\n   \u2193\nDocker Build\n   \u2193\nAmazon ECR\n   \u2193\nSecurity Gate\n   \u2193\nArtifact Promotion\n   \u2193\nProduction Approval\n```\n\nTuy nhi\u00ean, h\u1ec7 th\u1ed1ng hi\u1ec7n t\u1ea1i v\u1eabn ch\u01b0a s\u1eed d\u1ee5ng Kubernetes. Trong Chapter 5B, ch\u00fang ta s\u1ebd t\u1ea1o m\u1ed9t **Amazon EKS cluster** v\u00e0 deploy \u1ee9ng d\u1ee5ng **Google Online Boutique** l\u00ean \u0111\u00f3.\n\n## 1. M\u1ee5c ti\u00eau\n\nSau khi ho\u00e0n th\u00e0nh Chapter n\u00e0y, ch\u00fang ta s\u1ebd c\u00f3:\n\n```text\nDeveloper\n    \u2193\nGitHub\n    \u2193\nAmazon EKS\n    \u2193\nKubernetes Deployments\n    \u2193\nGoogle Online Boutique\n```\n\nCh\u00fang ta s\u1ebd th\u1ef1c hi\u1ec7n:\n\n* C\u00e0i \u0111\u1eb7t c\u00e1c c\u00f4ng c\u1ee5 c\u1ea7n thi\u1ebft.\n* T\u1ea1o Amazon EKS cluster.\n* T\u1ea1o managed node group.\n* K\u1ebft n\u1ed1i `kubectl` v\u1edbi EKS.\n* Clone source code Google Online Boutique.\n* Deploy c\u00e1c microservice l\u00ean EKS.\n* Expose frontend ra Internet.\n* Ki\u1ec3m tra tr\u1ea1ng th\u00e1i c\u00e1c Pod.\n* Ki\u1ec3m tra giao ti\u1ebfp gi\u1eefa c\u00e1c microservice.\n* X\u00f3a t\u00e0i nguy\u00ean \u0111\u1ec3 tr\u00e1nh ph\u00e1t sinh chi ph\u00ed.\n\n> Trong Chapter 5B, ch\u00fang ta s\u1eed d\u1ee5ng Kubernetes manifests tr\u1ef1c ti\u1ebfp. Helm s\u1ebd \u0111\u01b0\u1ee3c gi\u1edbi thi\u1ec7u \u1edf Chapter ti\u1ebfp theo.\n\n---\n\n## 2. Ki\u1ebfn tr\u00fac sau khi ho\u00e0n th\u00e0nh\n\n```text\n                         Internet\n                            \u2502\n                            \u25bc\n                 AWS LoadBalancer Service\n                            \u2502\n                            \u25bc\n                    frontend Service\n                            \u2502\n                            \u25bc\n                      frontend Pod\n                            \u2502\n        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n        \u25bc                   \u25bc                   \u25bc\n  cartservice       productcatalogservice   checkoutservice\n        \u2502                   \u2502                   \u2502\n        \u25bc                   \u25bc                   \u25bc\n  cartservice Pod    productcatalog Pod     checkoutservice Pod\n        \u2502\n        \u25bc\n  C\u00e1c microservice kh\u00e1c\n```\n\nAmazon EKS s\u1ebd qu\u1ea3n l\u00fd Kubernetes control plane. C\u00e1c workload c\u1ee7a Online Boutique s\u1ebd ch\u1ea1y tr\u00ean worker nodes thu\u1ed9c managed node group.\n\n---\n\n# 3. Chu\u1ea9n b\u1ecb m\u00f4i tr\u01b0\u1eddng\n\n### 3.1. Y\u00eau c\u1ea7u\n\nB\u1ea1n c\u1ea7n c\u00f3:\n\n* AWS Account.\n* AWS CLI \u0111\u00e3 c\u1ea5u h\u00ecnh.\n* Quy\u1ec1n t\u1ea1o EKS, EC2, VPC, IAM v\u00e0 CloudFormation.\n* Git.\n* `kubectl`.\n* `eksctl`.\n* M\u1ed9t m\u00e1y local ho\u1eb7c EC2 d\u00f9ng \u0111\u1ec3 ch\u1ea1y l\u1ec7nh qu\u1ea3n tr\u1ecb cluster.\n\n> Amazon EKS c\u00f3 th\u1ec3 t\u1ea1o cluster b\u1eb1ng AWS Console, AWS CLI ho\u1eb7c `eksctl`. Trong lab n\u00e0y, ch\u00fang ta s\u1eed d\u1ee5ng `eksctl` \u0111\u1ec3 gi\u1ea3m s\u1ed1 l\u01b0\u1ee3ng b\u01b0\u1edbc c\u1ea5u h\u00ecnh th\u1ee7 c\u00f4ng.\n\n### 3.2. Ki\u1ec3m tra AWS CLI\n\n```bash\naws --version\n```\n\nKi\u1ec3m tra AWS Account:\n\n```bash\naws sts get-caller-identity\n```\n\nV\u00ed d\u1ee5 k\u1ebft qu\u1ea3:\n\n```text\n{\n    \"UserId\": \"AIDAXXXXXXXXXXXXX\",\n    \"Account\": \"123456789012\",\n    \"Arn\": \"arn:aws:iam::123456789012:user\/dev-user\"\n}\n```\n\nC\u1ea5u h\u00ecnh Region:\n\n```bash\naws configure set region ap-northeast-1\n```\n\nKi\u1ec3m tra:\n\n```bash\naws configure get region\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\nap-northeast-1\n```\n\nTrong Chapter n\u00e0y, ch\u00fang ta s\u1eed d\u1ee5ng Region:\n\n```text\nap-northeast-1\n```\n\n\u0110\u00e2y l\u00e0 Region Tokyo.\n\n---\n\n# 4. C\u00e0i \u0111\u1eb7t kubectl\n\n### 4.1. Ki\u1ec3m tra kubectl\n\n```bash\nkubectl version --client\n```\n\nN\u1ebfu \u0111\u00e3 c\u00e0i \u0111\u1eb7t, b\u1ea1n s\u1ebd th\u1ea5y th\u00f4ng tin t\u01b0\u01a1ng t\u1ef1:\n\n```text\nClient Version: v1.xx.x\n```\n\n### 4.2. C\u00e0i \u0111\u1eb7t kubectl tr\u00ean Linux\n\nT\u1ea3i phi\u00ean b\u1ea3n stable:\n\n```bash\ncurl -LO \"https:\/\/dl.k8s.io\/release\/$(curl -L -s https:\/\/dl.k8s.io\/release\/stable.txt)\/bin\/linux\/amd64\/kubectl\"\n```\n\nC\u1ea5p quy\u1ec1n th\u1ef1c thi:\n\n```bash\nchmod +x kubectl\n```\n\nDi chuy\u1ec3n binary:\n\n```bash\nsudo mv kubectl \/usr\/local\/bin\/kubectl\n```\n\nKi\u1ec3m tra:\n\n```bash\nkubectl version --client\n```\n\n> N\u1ebfu b\u1ea1n s\u1eed d\u1ee5ng macOS Apple Silicon, h\u00e3y t\u1ea3i binary `darwin\/arm64` thay v\u00ec `linux\/amd64`.\n\n---\n\n# 5. C\u00e0i \u0111\u1eb7t eksctl\n\n### 5.1. T\u1ea3i eksctl tr\u00ean Linux x86_64\n\n```bash\nARCH=amd64\nPLATFORM=$(uname -s)_$ARCH\n```\n\n```bash\ncurl -sL \"https:\/\/github.com\/eksctl-io\/eksctl\/releases\/latest\/download\/eksctl_$PLATFORM.tar.gz\" \\\n  | tar xz -C \/tmp\n```\n\n```bash\nsudo mv \/tmp\/eksctl \/usr\/local\/bin\n```\n\nKi\u1ec3m tra:\n\n```bash\neksctl version\n```\n\nK\u1ebft qu\u1ea3 s\u1ebd t\u01b0\u01a1ng t\u1ef1:\n\n```text\n0.xxx.x\n```\n\n### 5.2. Ki\u1ec3m tra c\u00e1c c\u00f4ng c\u1ee5\n\n```bash\naws --version\nkubectl version --client\neksctl version\n```\n\n---\n\n# 6. T\u1ea1o Amazon EKS cluster\n\n### 6.1. \u0110\u1eb7t bi\u1ebfn m\u00f4i tr\u01b0\u1eddng\n\n```bash\nexport AWS_REGION=ap-northeast-1\nexport CLUSTER_NAME=online-boutique-eks\n```\n\nKi\u1ec3m tra:\n\n```bash\necho \"$AWS_REGION\"\necho \"$CLUSTER_NAME\"\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\nap-northeast-1\nonline-boutique-eks\n```\n\n### 6.2. T\u1ea1o cluster v\u00e0 managed node group\n\nCh\u1ea1y:\n\n```bash\neksctl create cluster \\\n  --name \"$CLUSTER_NAME\" \\\n  --region \"$AWS_REGION\" \\\n  --nodegroup-name online-boutique-ng \\\n  --node-type t3.medium \\\n  --nodes 2 \\\n  --nodes-min 1 \\\n  --nodes-max 3 \\\n  --managed\n```\n\nGi\u1ea3i th\u00edch c\u00e1c tham s\u1ed1:\n\n```text\n--name              T\u00ean EKS cluster\n--region            AWS Region\n--nodegroup-name    T\u00ean managed node group\n--node-type         EC2 instance type\n--nodes             S\u1ed1 node ban \u0111\u1ea7u\n--nodes-min         S\u1ed1 node t\u1ed1i thi\u1ec3u\n--nodes-max         S\u1ed1 node t\u1ed1i \u0111a\n--managed           S\u1eed d\u1ee5ng EKS managed node group\n```\n\nQu\u00e1 tr\u00ecnh t\u1ea1o cluster c\u00f3 th\u1ec3 m\u1ea5t nhi\u1ec1u ph\u00fat.\n\nK\u1ebft qu\u1ea3 cu\u1ed1i c\u00f9ng s\u1ebd t\u01b0\u01a1ng t\u1ef1:\n\n```text\n[\u2713]  EKS cluster \"online-boutique-eks\" in \"ap-northeast-1\" region is ready\n```\n\n> `t3.medium` \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng v\u00ec Online Boutique c\u00f3 nhi\u1ec1u microservice. N\u1ebfu ch\u1ec9 mu\u1ed1n ki\u1ec3m tra nhanh, b\u1ea1n c\u00f3 th\u1ec3 th\u1eed `t3.small`, nh\u01b0ng c\u00f3 th\u1ec3 g\u1eb7p t\u00ecnh tr\u1ea1ng thi\u1ebfu CPU ho\u1eb7c memory khi ch\u1ea1y to\u00e0n b\u1ed9 \u1ee9ng d\u1ee5ng.\n\n---\n\n# 7. Ki\u1ec3m tra EKS cluster\n\n### 7.1. Ki\u1ec3m tra cluster b\u1eb1ng AWS CLI\n\n```bash\naws eks describe-cluster \\\n  --name \"$CLUSTER_NAME\" \\\n  --region \"$AWS_REGION\" \\\n  --query 'cluster.status' \\\n  --output text\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\nACTIVE\n```\n\n### 7.2. Ki\u1ec3m tra node\n\n```bash\nkubectl get nodes\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME                                             STATUS   ROLES    AGE   VERSION\nip-192-168-10-101.ap-northeast-1.compute.internal Ready    <none>   5m    v1.xx.x\nip-192-168-20-102.ap-northeast-1.compute.internal Ready    <none>   5m    v1.xx.x\n```\n\nT\u1ea5t c\u1ea3 node c\u1ea7n c\u00f3 tr\u1ea1ng th\u00e1i:\n\n```text\nReady\n```\n\n### 7.3. Ki\u1ec3m tra system Pods\n\n```bash\nkubectl get pods -n kube-system\n```\n\nC\u00e1c Pod h\u1ec7 th\u1ed1ng th\u01b0\u1eddng bao g\u1ed3m:\n\n```text\ncoredns\nkube-proxy\naws-node\n```\n\nKi\u1ec3m tra service m\u1eb7c \u0111\u1ecbnh:\n\n```bash\nkubectl get svc\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\nNAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)\nkubernetes   ClusterIP   10.xxx.x.x    <none>        443\/TCP\n```\n\n---\n\n# 8. T\u1ea1o namespace cho Online Boutique\n\nT\u1ea1o namespace:\n\n```bash\nkubectl create namespace online-boutique\n```\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get namespaces\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\nNAME              STATUS\ndefault           Active\nkube-system       Active\nkube-public       Active\nkube-node-lease   Active\nonline-boutique   Active\n```\n\n\u0110\u1eb7t namespace m\u1eb7c \u0111\u1ecbnh cho context hi\u1ec7n t\u1ea1i:\n\n```bash\nkubectl config set-context --current \\\n  --namespace=online-boutique\n```\n\nKi\u1ec3m tra context:\n\n```bash\nkubectl config view --minify --output 'jsonpath={..namespace}'\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\nonline-boutique\n```\n\n---\n\n# 9. Clone Google Online Boutique\n\nClone repository:\n\n```bash\ngit clone https:\/\/github.com\/GoogleCloudPlatform\/microservices-demo.git\n```\n\nDi chuy\u1ec3n v\u00e0o th\u01b0 m\u1ee5c:\n\n```bash\ncd microservices-demo\n```\n\nKi\u1ec3m tra source code:\n\n```bash\nls\n```\n\nB\u1ea1n s\u1ebd th\u1ea5y c\u00e1c th\u01b0 m\u1ee5c v\u00e0 file t\u01b0\u01a1ng t\u1ef1:\n\n```text\nREADME.md\nsrc\nrelease\nhelm-chart\nprotos\nterraform\n```\n\nKi\u1ec3m tra Kubernetes manifest:\n\n```bash\nls -l release\/\n```\n\nManifest ch\u00ednh c\u1ee7a \u1ee9ng d\u1ee5ng:\n\n```text\nrelease\/kubernetes-manifests.yaml\n```\n\nFile n\u00e0y ch\u1ee9a c\u00e1c Kubernetes resources \u0111\u1ec3 deploy Online Boutique.\n\n---\n\n# 10. Ki\u1ec3m tra manifest tr\u01b0\u1edbc khi deploy\n\nKi\u1ec3m tra c\u00e1c resource trong manifest:\n\n```bash\ngrep '^kind:' release\/kubernetes-manifests.yaml\n```\n\nB\u1ea1n s\u1ebd th\u1ea5y c\u00e1c lo\u1ea1i resource nh\u01b0:\n\n```text\nkind: Deployment\nkind: Service\n```\n\nKi\u1ec3m tra image \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng:\n\n```bash\ngrep 'image:' release\/kubernetes-manifests.yaml\n```\n\nOnline Boutique s\u1eed d\u1ee5ng c\u00e1c image \u0111\u00e3 \u0111\u01b0\u1ee3c build s\u1eb5n cho c\u00e1c microservice.\n\n> \u1ede b\u01b0\u1edbc n\u00e0y, ch\u00fang ta deploy b\u1ea3n Online Boutique sample \u0111\u1ec3 ki\u1ec3m tra EKS v\u00e0 Kubernetes. Vi\u1ec7c thay th\u1ebf to\u00e0n b\u1ed9 image b\u1eb1ng image \u0111\u00e3 \u0111\u01b0\u1ee3c governance trong ECR s\u1ebd \u0111\u01b0\u1ee3c tri\u1ec3n khai \u1edf ph\u1ea7n GitOps\/ECR integration sau.\n\n---\n\n# 11. Deploy Online Boutique l\u00ean EKS\n\n### 11.1. Apply manifest\n\nN\u1ebfu b\u1ea1n \u0111ang \u1edf namespace `online-boutique`, ch\u1ea1y:\n\n```bash\nkubectl apply -f release\/kubernetes-manifests.yaml\n```\n\nN\u1ebfu mu\u1ed1n ch\u1ec9 r\u00f5 namespace:\n\n```bash\nkubectl apply \\\n  -n online-boutique \\\n  -f release\/kubernetes-manifests.yaml\n```\n\nK\u1ebft qu\u1ea3 t\u01b0\u01a1ng t\u1ef1:\n\n```text\ndeployment.apps\/emailservice created\nservice\/emailservice created\ndeployment.apps\/checkoutservice created\nservice\/checkoutservice created\ndeployment.apps\/paymentservice created\nservice\/paymentservice created\ndeployment.apps\/productcatalogservice created\nservice\/productcatalogservice created\ndeployment.apps\/cartservice created\nservice\/cartservice created\ndeployment.apps\/frontend created\nservice\/frontend created\n```\n\n---\n\n# 12. Ki\u1ec3m tra c\u00e1c Deployment\n\n```bash\nkubectl get deployments\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME                    READY   UP-TO-DATE   AVAILABLE   AGE\nadservice               1\/1     1            1           2m\ncartservice             1\/1     1            1           2m\ncheckoutservice         1\/1     1            1           2m\ncurrencyservice         1\/1     1            1           2m\nemailservice            1\/1     1            1           2m\nfrontend                1\/1     1            1           2m\npaymentservice          1\/1     1            1           2m\nproductcatalogservice   1\/1     1            1           2m\nrecommendationservice   1\/1     1            1           2m\nshippingservice         1\/1     1            1           2m\n```\n\nTr\u1ea1ng th\u00e1i mong \u0111\u1ee3i:\n\n```text\nREADY = AVAILABLE\n```\n\n---\n\n# 13. Ki\u1ec3m tra c\u00e1c Pod\n\n```bash\nkubectl get pods\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME                                      READY   STATUS    RESTARTS   AGE\nadservice-xxxxxxxxxx-xxxxx                1\/1     Running   0          3m\ncartservice-xxxxxxxxxx-xxxxx              1\/1     Running   0          3m\ncheckoutservice-xxxxxxxxxx-xxxxx          1\/1     Running   0          3m\ncurrencyservice-xxxxxxxxxx-xxxxx          1\/1     Running   0          3m\nemailservice-xxxxxxxxxx-xxxxx             1\/1     Running   0          3m\nfrontend-xxxxxxxxxx-xxxxx                 1\/1     Running   0          3m\npaymentservice-xxxxxxxxxx-xxxxx           1\/1     Running   0          3m\nproductcatalogservice-xxxxxxxxxx-xxxxx    1\/1     Running   0          3m\nrecommendationservice-xxxxxxxxxx-xxxxx    1\/1     Running   0          3m\nshippingservice-xxxxxxxxxx-xxxxx          1\/1     Running   0          3m\n```\n\nTheo d\u00f5i realtime:\n\n```bash\nkubectl get pods -w\n```\n\nD\u1eebng theo d\u00f5i b\u1eb1ng:\n\n```text\nCtrl + C\n```\n\nN\u1ebfu Pod kh\u00f4ng \u1edf tr\u1ea1ng th\u00e1i `Running`, ki\u1ec3m tra:\n\n```bash\nkubectl describe pod <POD_NAME>\n```\n\nV\u00ed d\u1ee5:\n\n```bash\nkubectl describe pod frontend-xxxxxxxxxx-xxxxx\n```\n\nXem logs:\n\n```bash\nkubectl logs deployment\/frontend\n```\n\n---\n\n# 14. Ki\u1ec3m tra c\u00e1c Service\n\n```bash\nkubectl get services\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME                    TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)\nadservice               ClusterIP      10.xxx.x.x      <none>        9555\/TCP\ncartservice             ClusterIP      10.xxx.x.x      <none>        7070\/TCP\ncheckoutservice         ClusterIP      10.xxx.x.x      <none>        5050\/TCP\ncurrencyservice         ClusterIP      10.xxx.x.x      <none>        7000\/TCP\nemailservice            ClusterIP      10.xxx.x.x      <none>        8080\/TCP\nfrontend                LoadBalancer   10.xxx.x.x      <pending>     80:xxxxx\/TCP\npaymentservice          ClusterIP      10.xxx.x.x      <none>        50051\/TCP\nproductcatalogservice   ClusterIP      10.xxx.x.x      <none>        3550\/TCP\nrecommendationservice   ClusterIP      10.xxx.x.x      <none>        8080\/TCP\nshippingservice         ClusterIP      10.xxx.x.x      <none>        50051\/TCP\n```\n\n\u0110i\u1ec3m c\u1ea7n ch\u00fa \u00fd:\n\n```text\nfrontend                LoadBalancer\nC\u00e1c service c\u00f2n l\u1ea1i    ClusterIP\n```\n\n\u0110i\u1ec1u n\u00e0y c\u00f3 ngh\u0129a:\n\n* `frontend` c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c truy c\u1eadp t\u1eeb b\u00ean ngo\u00e0i cluster.\n* C\u00e1c microservice kh\u00e1c ch\u1ec9 \u0111\u01b0\u1ee3c truy c\u1eadp n\u1ed9i b\u1ed9 trong Kubernetes cluster.\n\n---\n\n# 15. L\u1ea5y \u0111\u1ecba ch\u1ec9 truy c\u1eadp Online Boutique\n\nCh\u1ea1y:\n\n```bash\nkubectl get service frontend\n```\n\nBan \u0111\u1ea7u, `EXTERNAL-IP` c\u00f3 th\u1ec3 hi\u1ec3n th\u1ecb:\n\n```text\n<pending>\n```\n\nAWS c\u1ea7n m\u1ed9t kho\u1ea3ng th\u1eddi gian \u0111\u1ec3 t\u1ea1o Load Balancer.\n\nTheo d\u00f5i li\u00ean t\u1ee5c:\n\n```bash\nkubectl get service frontend -w\n```\n\nKhi ho\u00e0n t\u1ea5t, k\u1ebft qu\u1ea3 s\u1ebd t\u01b0\u01a1ng t\u1ef1:\n\n```text\nNAME       TYPE           CLUSTER-IP     EXTERNAL-IP\nfrontend   LoadBalancer   10.xxx.x.x      xxx.ap-northeast-1.elb.amazonaws.com\n```\n\nL\u1ea5y ri\u00eang \u0111\u1ecba ch\u1ec9 Load Balancer:\n\n```bash\nkubectl get service frontend \\\n  -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'\n```\n\nL\u01b0u k\u1ebft qu\u1ea3 v\u00e0o bi\u1ebfn:\n\n```bash\nexport FRONTEND_URL=$(kubectl get service frontend \\\n  -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')\n```\n\nKi\u1ec3m tra:\n\n```bash\necho \"$FRONTEND_URL\"\n```\n\nM\u1edf tr\u00ean tr\u00ecnh duy\u1ec7t:\n\n```text\nhttp:\/\/<EXTERNAL-HOSTNAME>\n```\n\nHo\u1eb7c ki\u1ec3m tra b\u1eb1ng `curl`:\n\n```bash\ncurl -I \"http:\/\/$FRONTEND_URL\"\n```\n\nK\u1ebft qu\u1ea3 mong \u0111\u1ee3i:\n\n```text\nHTTP\/1.1 200 OK\n```\n\n---\n\n# 16. Ki\u1ec3m tra giao ti\u1ebfp gi\u1eefa c\u00e1c microservice\n\nKubernetes cung c\u1ea5p DNS n\u1ed9i b\u1ed9 cho c\u00e1c Service.\n\nV\u00ed d\u1ee5, `frontend` c\u00f3 th\u1ec3 g\u1ecdi:\n\n```text\ncartservice:7070\nproductcatalogservice:3550\ncheckoutservice:5050\n```\n\nKi\u1ec3m tra DNS Service:\n\n```bash\nkubectl get svc cartservice\nkubectl get svc productcatalogservice\nkubectl get svc checkoutservice\n```\n\nKi\u1ec3m tra endpoint:\n\n```bash\nkubectl get endpoints\n```\n\nHo\u1eb7c:\n\n```bash\nkubectl get endpointslice\n```\n\nKi\u1ec3m tra th\u00f4ng tin c\u1ee7a frontend:\n\n```bash\nkubectl describe deployment frontend\n```\n\nKi\u1ec3m tra logs frontend:\n\n```bash\nkubectl logs deployment\/frontend --tail=100\n```\n\nN\u1ebfu frontend c\u00f3 th\u1ec3 hi\u1ec3n th\u1ecb danh s\u00e1ch s\u1ea3n ph\u1ea9m, gi\u1ecf h\u00e0ng v\u00e0 checkout, \u0111i\u1ec1u \u0111\u00f3 cho th\u1ea5y c\u00e1c service n\u1ed9i b\u1ed9 \u0111ang giao ti\u1ebfp th\u00e0nh c\u00f4ng.\n\n---\n\n# 17. Ki\u1ec3m tra resource usage\n\nKi\u1ec3m tra CPU v\u00e0 memory c\u1ee7a node:\n\n```bash\nkubectl top nodes\n```\n\nKi\u1ec3m tra resource usage c\u1ee7a Pod:\n\n```bash\nkubectl top pods\n```\n\nN\u1ebfu nh\u1eadn \u0111\u01b0\u1ee3c l\u1ed7i:\n\n```text\nerror: Metrics API not available\n```\n\nth\u00ec cluster ch\u01b0a c\u00f3 Metrics Server. Metrics Server s\u1ebd \u0111\u01b0\u1ee3c tri\u1ec3n khai \u1edf ph\u1ea7n n\u00e2ng cao sau.\n\n---\n\n# 18. Test scale m\u1ed9t microservice\n\nV\u00ed d\u1ee5 scale `frontend` l\u00ean 2 replicas:\n\n```bash\nkubectl scale deployment frontend --replicas=2\n```\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get deployment frontend\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\nNAME       READY   UP-TO-DATE   AVAILABLE\nfrontend   2\/2     2            2\n```\n\nKi\u1ec3m tra Pod:\n\n```bash\nkubectl get pods -l app=frontend\n```\n\nScale l\u1ea1i v\u1ec1 1 replica:\n\n```bash\nkubectl scale deployment frontend --replicas=1\n```\n\n> \u0110\u00e2y ch\u1ec9 l\u00e0 thao t\u00e1c scale th\u1ee7 c\u00f4ng. \u1ede c\u00e1c ph\u1ea7n sau, ch\u00fang ta s\u1ebd qu\u1ea3n l\u00fd replica count b\u1eb1ng Helm ho\u1eb7c GitOps thay v\u00ec thay \u0111\u1ed5i tr\u1ef1c ti\u1ebfp b\u1eb1ng `kubectl`.\n\n---\n\n# 19. Ki\u1ec3m tra rollout\n\nXem l\u1ecbch s\u1eed rollout:\n\n```bash\nkubectl rollout history deployment\/frontend\n```\n\nKi\u1ec3m tra tr\u1ea1ng th\u00e1i rollout:\n\n```bash\nkubectl rollout status deployment\/frontend\n```\n\nXem c\u1ea5u h\u00ecnh Deployment:\n\n```bash\nkubectl get deployment frontend -o yaml\n```\n\nKi\u1ec3m tra image \u0111ang ch\u1ea1y:\n\n```bash\nkubectl get deployment frontend \\\n  -o jsonpath='{.spec.template.spec.containers[*].image}'\n```\n\n---\n\n# 20. Th\u1eed c\u1eadp nh\u1eadt Deployment\n\nV\u00ed d\u1ee5 thay \u0111\u1ed5i s\u1ed1 replicas:\n\n```bash\nkubectl edit deployment frontend\n```\n\nT\u00ecm:\n\n```yaml\nspec:\n  replicas: 1\n```\n\n\u0110\u1ed5i th\u00e0nh:\n\n```yaml\nspec:\n  replicas: 2\n```\n\nL\u01b0u file v\u00e0 ki\u1ec3m tra:\n\n```bash\nkubectl rollout status deployment\/frontend\n```\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get pods\n```\n\n> Thay \u0111\u1ed5i tr\u1ef1c ti\u1ebfp b\u1eb1ng `kubectl edit` ch\u1ec9 nh\u1eb1m m\u1ee5c \u0111\u00edch h\u1ecdc Kubernetes. Khi chuy\u1ec3n sang GitOps, m\u1ecdi thay \u0111\u1ed5i s\u1ebd \u0111\u01b0\u1ee3c th\u1ef1c hi\u1ec7n trong Git repository.\n\n---\n\n# 21. Ki\u1ec3m tra to\u00e0n b\u1ed9 h\u1ec7 th\u1ed1ng\n\nCh\u1ea1y l\u1ea7n l\u01b0\u1ee3t:\n\n```bash\nkubectl get nodes\n```\n\n```bash\nkubectl get deployments\n```\n\n```bash\nkubectl get pods\n```\n\n```bash\nkubectl get services\n```\n\n```bash\nkubectl get events --sort-by=.metadata.creationTimestamp\n```\n\nM\u1ed9t h\u1ec7 th\u1ed1ng ho\u1ea1t \u0111\u1ed9ng b\u00ecnh th\u01b0\u1eddng c\u1ea7n c\u00f3:\n\n```text\nNodes       \u2192 Ready\nDeployments \u2192 Available\nPods        \u2192 Running\nServices    \u2192 \u0110\u01b0\u1ee3c t\u1ea1o th\u00e0nh c\u00f4ng\nfrontend    \u2192 C\u00f3 External Load Balancer\n```\n\n---\n\n# 22. X\u00f3a Online Boutique\n\nN\u1ebfu ch\u1ec9 mu\u1ed1n x\u00f3a \u1ee9ng d\u1ee5ng nh\u01b0ng gi\u1eef l\u1ea1i EKS cluster:\n\n```bash\nkubectl delete \\\n  -f release\/kubernetes-manifests.yaml \\\n  -n online-boutique\n```\n\nX\u00f3a namespace:\n\n```bash\nkubectl delete namespace online-boutique\n```\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get all -n online-boutique\n```\n\n---\n\n# 23. X\u00f3a EKS cluster \u0111\u1ec3 tr\u00e1nh chi ph\u00ed\n\nN\u1ebfu \u0111\u00e3 ho\u00e0n th\u00e0nh lab v\u00e0 kh\u00f4ng c\u1ea7n gi\u1eef cluster:\n\n```bash\neksctl delete cluster \\\n  --name \"$CLUSTER_NAME\" \\\n  --region \"$AWS_REGION\"\n```\n\nTheo d\u00f5i qu\u00e1 tr\u00ecnh x\u00f3a:\n\n```bash\neksctl get cluster \\\n  --region \"$AWS_REGION\"\n```\n\nKhi cluster kh\u00f4ng c\u00f2n trong danh s\u00e1ch, qu\u00e1 tr\u00ecnh x\u00f3a \u0111\u00e3 ho\u00e0n t\u1ea5t.\n\nKi\u1ec3m tra th\u00eam trong AWS Console:\n\n* EKS\n* EC2\n* Load Balancers\n* Auto Scaling Groups\n* CloudFormation\n* VPC\n* NAT Gateway\n* Elastic IP\n\n\u0110\u1eb7c bi\u1ec7t c\u1ea7n ki\u1ec3m tra **NAT Gateway**, v\u00ec NAT Gateway c\u00f3 th\u1ec3 ph\u00e1t sinh chi ph\u00ed ngay c\u1ea3 khi kh\u00f4ng c\u00f3 workload \u0111ang ch\u1ea1y.\n\n---\n\n# 24. K\u1ebft qu\u1ea3 \u0111\u1ea1t \u0111\u01b0\u1ee3c\n\nSau Chapter 5B, ch\u00fang ta \u0111\u00e3 chuy\u1ec3n Online Boutique t\u1eeb m\u00f4 h\u00ecnh container \u0111\u01a1n l\u1ebb sang Kubernetes:\n\n```text\nTr\u01b0\u1edbc Chapter 5B:\n\nEC2\n \u2514\u2500\u2500 Docker Compose\n      \u2514\u2500\u2500 Online Boutique\n```\n\nSau Chapter 5B:\n\n```text\nAmazon EKS\n \u251c\u2500\u2500 Deployment\n \u251c\u2500\u2500 Pod\n \u251c\u2500\u2500 Service\n \u2514\u2500\u2500 LoadBalancer\n       \u2514\u2500\u2500 Online Boutique\n```\n\nCh\u00fang ta \u0111\u00e3 h\u1ecdc \u0111\u01b0\u1ee3c:\n\n* T\u1ea1o Amazon EKS cluster.\n* S\u1eed d\u1ee5ng managed node group.\n* K\u1ebft n\u1ed1i `kubectl` v\u1edbi EKS.\n* T\u1ea1o Kubernetes namespace.\n* Deploy nhi\u1ec1u microservice.\n* Ki\u1ec3m tra Pod v\u00e0 Deployment.\n* S\u1eed d\u1ee5ng Kubernetes Service.\n* Expose frontend qua AWS Load Balancer.\n* Scale Deployment.\n* Ki\u1ec3m tra rollout.\n* X\u00f3a t\u00e0i nguy\u00ean Kubernetes v\u00e0 EKS.\n\nTuy nhi\u00ean, quy tr\u00ecnh hi\u1ec7n t\u1ea1i v\u1eabn c\u00f2n m\u1ed9t s\u1ed1 h\u1ea1n ch\u1ebf:\n\n```text\nDeveloper\n    \u2193\nkubectl apply\n    \u2193\nEKS\n```\n\nC\u00e1c v\u1ea5n \u0111\u1ec1 c\u00f2n t\u1ed3n t\u1ea1i:\n\n* Manifest ch\u01b0a \u0111\u01b0\u1ee3c \u0111\u00f3ng g\u00f3i b\u1eb1ng Helm.\n* Deployment v\u1eabn th\u1ef1c hi\u1ec7n th\u1ee7 c\u00f4ng.\n* Ch\u01b0a c\u00f3 GitOps.\n* Ch\u01b0a c\u00f3 Argo CD.\n* Ch\u01b0a c\u00f3 c\u01a1 ch\u1ebf t\u1ef1 \u0111\u1ed9ng \u0111\u1ed3ng b\u1ed9 t\u1eeb Git.\n* Ch\u01b0a qu\u1ea3n l\u00fd nhi\u1ec1u environment.\n* Ch\u01b0a k\u1ebft n\u1ed1i ho\u00e0n ch\u1ec9nh image promotion t\u1eeb ECR \u0111\u1ebfn EKS.\n\n\u1ede ph\u1ea7n ti\u1ebfp theo, ch\u00fang ta s\u1ebd gi\u1ea3i quy\u1ebft v\u1ea5n \u0111\u1ec1 qu\u1ea3n l\u00fd nhi\u1ec1u YAML file b\u1eb1ng **Helm Chart**.\n\n```text\nKubernetes YAML\n      \u2193\nHelm Chart\n      \u2193\nhelm install \/ helm upgrade\n      \u2193\nAmazon EKS\n```","published_at":"2026-09-14T08:51:10.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T23:00:08.000000Z","edited_at":"2026-09-14T08:52:27.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":8,"points":0,"views_count":12,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/117ee78e-9b3e-497a-9254-ebcc5804ab5b.png","user":{"data":{"id":98940,"url":"https:\/\/viblo.asia\/u\/Juu-dev","avatar":"25478754-6f7c-425c-a27d-bd61fabc134e.jpg","name":"Th\u1ed1ng PM","username":"Juu-dev","followers_count":82,"reputation":1444,"posts_count":190,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"amazon-eks","name":"Amazon EKS"}]},"commentators":{"data":[]}},{"id":106658,"title":"M\u1ed9t AI \u0110\u01b0a T\u00f4i 6 M\u1eabu Ho\u00e1 \u0110\u01a1n \"Th\u1eadt\". 5 C\u00e1i Ho\u00e0n To\u00e0n L\u00e0 B\u1ecba.","slug":"vbLbj0XlLnk","url":"https:\/\/viblo.asia\/p\/mot-ai-dua-toi-6-mau-hoa-don-that-5-cai-hoan-toan-la-bia-vbLbj0XlLnk","user_id":214789,"moderation":null,"transliterated":"mot-ai-dua-toi-6-mau-hoa-don-that-5-cai-hoan-toan-la-bia","contents_short":"T\u00f4i \u0111ang x\u00e2y 1 c\u00f4ng c\u1ee5 \u0111\u1ecdc file XML ho\u00e1 \u0111\u01a1n \u0111i\u1ec7n t\u1eed VAT \u2014 lo\u1ea1i file m\u00e0 ph\u00e1p lu\u1eadt Vi\u1ec7t Nam b\u1eaft bu\u1ed9c ph\u1ea3i c\u00f3 cho m\u1ecdi ho\u00e1 \u0111\u01a1n \u0111i\u1ec7n t\u1eed h\u1ee3p l\u1ec7, b\u1ea5t k\u1ec3 ai ph\u00e1t h\u00e0nh. M\u1ee5c ti\u00eau: \u0111\u1ecdc \u0111\u01b0\u1ee3c file t\u1eeb b\u1ea5t k\u1ef3 nh\u00e0 cung c\u1ea5p n\u00e0o, chu\u1ea9n ho\u00e1 v\u1ec1 \u0111\u00fang 1 \u0111\u1ecbnh d\u1ea1ng JSON.\n\n\u0110\u1ec3 test cho ch\u1eafc tr\u01b0\u1edbc khi d\u00f9ng th\u1eadt, t\u00f4i nh\u1edd 1 AI kh\u00e1c gom gi\u00fap v\u00e0i file XML m\u1eabu \u2014 m\u1ed7i file g\u1eafn nh\u00e3n 1 nh\u00e0 cung c\u1ea5p ho\u00e1 \u0111\u01a1n \u0111i\u1ec7n t\u1eed l\u1edbn \u1edf Vi\u1ec7t Nam,...","contents":"T\u00f4i \u0111ang x\u00e2y 1 c\u00f4ng c\u1ee5 \u0111\u1ecdc file XML ho\u00e1 \u0111\u01a1n \u0111i\u1ec7n t\u1eed VAT \u2014 lo\u1ea1i file m\u00e0 ph\u00e1p lu\u1eadt Vi\u1ec7t Nam b\u1eaft bu\u1ed9c ph\u1ea3i c\u00f3 cho m\u1ecdi ho\u00e1 \u0111\u01a1n \u0111i\u1ec7n t\u1eed h\u1ee3p l\u1ec7, b\u1ea5t k\u1ec3 ai ph\u00e1t h\u00e0nh. M\u1ee5c ti\u00eau: \u0111\u1ecdc \u0111\u01b0\u1ee3c file t\u1eeb b\u1ea5t k\u1ef3 nh\u00e0 cung c\u1ea5p n\u00e0o, chu\u1ea9n ho\u00e1 v\u1ec1 \u0111\u00fang 1 \u0111\u1ecbnh d\u1ea1ng JSON.\n\n\u0110\u1ec3 test cho ch\u1eafc tr\u01b0\u1edbc khi d\u00f9ng th\u1eadt, t\u00f4i nh\u1edd 1 AI kh\u00e1c gom gi\u00fap v\u00e0i file XML m\u1eabu \u2014 m\u1ed7i file g\u1eafn nh\u00e3n 1 nh\u00e0 cung c\u1ea5p ho\u00e1 \u0111\u01a1n \u0111i\u1ec7n t\u1eed l\u1edbn \u1edf Vi\u1ec7t Nam, c\u1ed9ng th\u00eam 1 file \"chu\u1ea9n chung\" \u2014 t\u1ed5ng c\u1ed9ng 6 file.\n\nT\u00f4i ch\u1ea1y th\u1eed code v\u1edbi c\u1ea3 6 file. N\u00f3 t\u1eeb ch\u1ed1i th\u1eb3ng 5 c\u00e1i.\n\nPh\u1ea3n \u1ee9ng \u0111\u1ea7u ti\u00ean: ch\u1ebft r\u1ed3i, code h\u1ecfng ngay t\u1eeb ng\u00e0y \u0111\u1ea7u, 5 nh\u00e0 cung c\u1ea5p kh\u00e1c nhau, 5 ki\u1ec3u l\u1ed7i kh\u00e1c nhau. V\u00e0i ph\u00fat sau, t\u00f4i nh\u1eadn ra \u0111\u00e2y th\u1ef1c ra l\u00e0 k\u1ebft qu\u1ea3 *\u0111\u00fang* \u2014 v\u00e0 t\u00ecm hi\u1ec3u v\u00ec sao l\u1ea1i d\u1eabn t\u00f4i t\u1edbi 1 ch\u1ed7 t\u00f4i kh\u00f4ng ng\u1edd t\u1edbi.\n\n## C\u00fa l\u1eadt k\u00e8o\n\nTr\u01b0\u1edbc khi v\u1ed9i k\u1ebft lu\u1eadn code sai, t\u00f4i l\u00e0m 1 vi\u1ec7c r\u1ea5t \"ch\u00e1n\": \u0111\u1ecdc README m\u00e0 ch\u00ednh AI kia vi\u1ebft k\u00e8m b\u1ed9 file m\u1eabu. C\u00f3 1 d\u00f2ng quan tr\u1ecdng:\n\n> \"d\u1eef li\u1ec7u b\u00ean trong (t\u00ean c\u00f4ng ty, m\u00e3 s\u1ed1 thu\u1ebf, s\u1ed1 ti\u1ec1n) l\u00e0 d\u1eef li\u1ec7u gi\u1ea3 l\u1eadp cho ki\u1ec3m th\u1eed, kh\u00f4ng ph\u1ea3i ho\u00e1 \u0111\u01a1n th\u1ef1c \u0111\u00e3 ph\u00e1t h\u00e0nh... l\u1ea5y t\u1eeb 1 kho m\u00e3 ngu\u1ed3n m\u1edf.\"\n\nGi\u1ea3 l\u1eadp. Kh\u00f4ng ph\u1ea3i \"g\u1ea7n gi\u1ed1ng th\u1eadt\". Gi\u1ea3 l\u1eadp b\u1edfi 1 l\u1eadp tr\u00ecnh vi\u00ean ch\u01b0a t\u1eebng th\u1ea5y ho\u00e1 \u0111\u01a1n Vi\u1ec7t Nam th\u1eadt, vi\u1ebft ra \u0111\u1ec3 test cho 1 d\u1ef1 \u00e1n ho\u00e0n to\u00e0n kh\u00e1c c\u1ee7a h\u1ecd tr\u00ean GitHub \u2014 r\u1ed3i \u0111\u01b0\u1ee3c 1 AI gom l\u1ea1i th\u00e0nh \"m\u1eabu ho\u00e1 \u0111\u01a1n\" v\u00ec tr\u00f4ng \u0111\u00fang h\u00ecnh d\u1ea1ng c\u1ea7n t\u00ecm.\n\nTh\u1ebf l\u00e0 thay v\u00ec tin v\u00e0o ch\u00ednh b\u1ed9 test c\u1ee7a m\u00ecnh, t\u00f4i quay l\u1ea1i \u0111\u1ed1i chi\u1ebfu t\u00ean th\u1ebb XML v\u1edbi v\u0103n b\u1ea3n ph\u00e1p lu\u1eadt g\u1ed1c.\n\n\u0110i\u1ec1u \u0111\u00e1ng n\u00f3i v\u1ec1 ho\u00e1 \u0111\u01a1n \u0111i\u1ec7n t\u1eed Vi\u1ec7t Nam: t\u1eeb 2022, **m\u1ecdi** nh\u00e0 cung c\u1ea5p \u0111\u1ec1u b\u1eaft bu\u1ed9c d\u00f9ng \u0111\u00fang 1 c\u1ea5u tr\u00fac th\u1ebb XML do T\u1ed5ng c\u1ee5c Thu\u1ebf quy \u0111\u1ecbnh. Kh\u00f4ng ph\u1ea3i \"t\u01b0\u01a1ng t\u1ef1 nhau\" \u2014 m\u00e0 l\u00e0 **gi\u1ed1ng h\u1ec7t**. `TTChung`, `NBan`, `NMua`, `MST`, `DChi` \u2014 to\u00e0n b\u1ed9 l\u00e0 ch\u1eef vi\u1ebft t\u1eaft ti\u1ebfng Vi\u1ec7t, quy \u0111\u1ecbnh b\u1eb1ng ngh\u1ecb \u0111\u1ecbnh, v\u00ec ch\u00ednh h\u1ec7 th\u1ed1ng c\u1ee7a c\u01a1 quan thu\u1ebf ph\u1ea3i \u0111\u1ecdc \u0111\u01b0\u1ee3c ho\u00e1 \u0111\u01a1n t\u1eeb b\u1ea5t k\u1ef3 ai ph\u00e1t h\u00e0nh.\n\n5 trong 6 file \"m\u1eabu\" c\u1ee7a t\u00f4i d\u00f9ng t\u00ean th\u1ebb ki\u1ec3u `<SellerInfo>`, `<BuyerTaxCode>`, `<InvoiceNumber>` \u2014 t\u00ean ti\u1ebfng Anh r\u1ea5t g\u1ecdn g\u00e0ng, r\u1ea5t h\u1ee3p l\u00fd n\u1ebfu nh\u00ecn tho\u00e1ng qua.\n\nNh\u01b0ng theo t\u00f4i t\u00ecm hi\u1ec3u, **kh\u00f4ng c\u00f3 ho\u00e1 \u0111\u01a1n \u0111i\u1ec7n t\u1eed VN th\u1eadt n\u00e0o t\u1eebng d\u00f9ng nh\u1eefng t\u00ean th\u1ebb \u0111\u00f3**. Kh\u00f4ng ai \u1edf Vi\u1ec7t Nam \u0111\u01b0\u1ee3c ph\u00e9p t\u1ef1 \u0111\u1eb7t t\u00ean th\u1ebb ri\u00eang \u2014 \u0111\u00f3 ch\u00ednh l\u00e0 m\u1ee5c \u0111\u00edch c\u1ee7a vi\u1ec7c ra quy \u0111\u1ecbnh th\u1ed1ng nh\u1ea5t. Code c\u1ee7a t\u00f4i kh\u00f4ng h\u1ec1 h\u1ecfng. N\u00f3 \u0111\u00e3 nh\u1eadn di\u1ec7n \u0111\u00fang 5 file l\u00e0 h\u01b0 c\u1ea5u (d\u00f9 r\u1ea5t \"t\u1ef1 tin\" v\u00e0 nh\u1ea5t qu\u00e1n n\u1ed9i b\u1ed9), v\u00e0 ch\u1ec9 ch\u1ea5p nh\u1eadn \u0111\u00fang 1 file duy nh\u1ea5t d\u00f9ng c\u1ea5u tr\u00fac th\u1eadt theo lu\u1eadt.\n\n## T\u00f4i \u0111\u00e3 kh\u00f4ng l\u00e0m g\u00ec\n\nT\u00f4i c\u00f3 th\u1ec3 \"d\u1ea1y kh\u00f4n\" cho code \u0111\u1ec3 n\u00f3 c\u0169ng nh\u1eadn ra 5 t\u00ean th\u1ebb b\u1ecba kia, cho ra k\u1ebft qu\u1ea3 \u0111\u1eb9p h\u01a1n \u2014 6\/6 thay v\u00ec 1\/6. T\u00f4i kh\u00f4ng l\u00e0m v\u1eady. D\u1ea1y cho code ch\u1ea5p nh\u1eadn 1 \u0111\u1ecbnh d\u1ea1ng kh\u00f4ng t\u1ed3n t\u1ea1i trong th\u1ef1c t\u1ebf kh\u00f4ng ph\u1ea3i l\u00e0 \"linh ho\u1ea1t h\u01a1n\" \u2014 \u0111\u00f3 ch\u1ec9 l\u00e0 1 c\u00e1ch ph\u1ee9c t\u1ea1p h\u01a1n \u0111\u1ec3 sai, k\u00e8m th\u00eam s\u1ef1 t\u1ef1 tin kh\u00f4ng \u0111\u00e1ng c\u00f3. V\u00e0 khi ho\u00e1 \u0111\u01a1n th\u1eadt \u0111\u1ea7u ti\u00ean t\u1edbi, n\u00f3 s\u1ebd ph\u1ea3i \"chen ch\u00e2n\" qua \u0111\u1ed1ng nhi\u1ec5u \u0111\u00f3 thay v\u00ec kh\u1edbp th\u1eb3ng.\n\nN\u00ean t\u00f4i gi\u1eef nguy\u00ean code theo \u0111\u00fang chu\u1ea9n ph\u00e1p lu\u1eadt, ch\u1ec9 gi\u1eef l\u1ea1i \u0111\u00fang 1 file m\u1eabu kh\u1edbp th\u1eadt, r\u1ed3i ch\u1edd d\u1eef li\u1ec7u th\u1eadt.\n\n## R\u1ed3i ho\u00e1 \u0111\u01a1n th\u1eadt b\u1eaft \u0111\u1ea7u t\u1edbi\n\nV\u00e0i ng\u00e0y sau, ng\u01b0\u1eddi t\u00f4i x\u00e2y c\u00f4ng c\u1ee5 n\u00e0y cho b\u1eaft \u0111\u1ea7u t\u1ef1 \u0111\u00e0o l\u1ea1i email v\u00e0 c\u1ed5ng tra c\u1ee9u c\u1ee7a h\u1ecd \u2014 1 ho\u00e1 \u0111\u01a1n ti\u1ec1n \u0111i\u1ec7n, v\u00e0i ho\u00e1 \u0111\u01a1n mua h\u00e0ng online, 1 ho\u00e1 \u0111\u01a1n ph\u00f2ng kh\u00e1m, 1 ho\u00e1 \u0111\u01a1n logistics c\u0169 t\u1eeb 2021, v\u00e0 cu\u1ed1i c\u00f9ng l\u00e0 1 ho\u00e1 \u0111\u01a1n giao d\u1ecbch gi\u1eefa 2 doanh nghi\u1ec7p th\u1eadt.\n\n3 l\u1ed7i l\u1ed9 ra. Kh\u00f4ng l\u1ed7i n\u00e0o trong s\u1ed1 \u0111\u00f3 xu\u1ea5t hi\u1ec7n \u1edf b\u1ea5t k\u1ef3 file \"m\u1eabu\" n\u00e0o c\u1ee7a AI kia \u2014 v\u00ec ch\u1ec9 c\u00f3 ch\u1ea1m v\u00e0o d\u1eef li\u1ec7u th\u1eadt m\u1edbi t\u00ecm ra \u0111\u01b0\u1ee3c.\n\n**L\u1ed7i 1 \u2014 r\u00f2 r\u1ec9 th\u00f4ng tin c\u00e1 nh\u00e2n.** Code c\u00f3 th\u00eam 1 ch\u1ebf \u0111\u1ed9 \"d\u1eef li\u1ec7u th\u00f4\": ngo\u00e0i k\u1ebft qu\u1ea3 \u0111\u00e3 chu\u1ea9n ho\u00e1 s\u1ea1ch s\u1ebd, n\u00f3 c\u00f2n xu\u1ea5t k\u00e8m to\u00e0n b\u1ed9 c\u1eb7p th\u1ebb\/gi\u00e1 tr\u1ecb \u0111\u1ecdc \u0111\u01b0\u1ee3c, \u0111\u1ec3 kh\u00f4ng ai m\u1ea5t d\u1eef li\u1ec7u v\u00ec t\u00f4i l\u1ee1 qu\u00ean map 1 tr\u01b0\u1eddng n\u00e0o \u0111\u00f3. T\u00f4i c\u0169ng c\u00f3 1 t\u00ednh n\u0103ng b\u1ea3o v\u1ec7 ri\u00eang t\u01b0: n\u1ebfu ng\u01b0\u1eddi mua kh\u00f4ng c\u00f3 m\u00e3 s\u1ed1 thu\u1ebf (d\u1ea5u hi\u1ec7u l\u00e0 c\u00e1 nh\u00e2n, kh\u00f4ng ph\u1ea3i doanh nghi\u1ec7p), t\u00ean v\u00e0 \u0111\u1ecba ch\u1ec9 c\u1ee7a h\u1ecd s\u1ebd b\u1ecb \u1ea9n kh\u1ecfi k\u1ebft qu\u1ea3. \u1ea8n kh\u1ecfi k\u1ebft qu\u1ea3 *\u0111\u00e3 chu\u1ea9n ho\u00e1* \u2014 \u0111\u00fang v\u1eady. Kh\u00f4ng ai b\u00e1o cho ph\u1ea7n \"d\u1eef li\u1ec7u th\u00f4\" bi\u1ebft v\u1ec1 quy t\u1eafc \u0111\u00f3. Ho\u00e1 \u0111\u01a1n th\u1eadt \u0111\u1ea7u ti\u00ean t\u00f4i test \u2014 1 ho\u00e1 \u0111\u01a1n ti\u1ec1n \u0111i\u1ec7n \u2014 \u0111\u1ec3 l\u1ed9 th\u1eb3ng t\u00ean th\u1eadt, \u0111\u1ecba ch\u1ec9 nh\u00e0, v\u00e0 email c\u1ee7a ng\u01b0\u1eddi mua qua \u0111\u00fang c\u00e1i tr\u01b0\u1eddng \"debug\" t\u00f4i th\u00eam v\u00e0o cho ti\u1ec7n. 2 t\u00ednh n\u0103ng (b\u1ea3o v\u1ec7 ri\u00eang t\u01b0 v\u00e0 xu\u1ea5t d\u1eef li\u1ec7u th\u00f4) ch\u01b0a bao gi\u1edd \u0111\u01b0\u1ee3c \"n\u00f3i chuy\u1ec7n\" v\u1edbi nhau.\n\n**L\u1ed7i 2 \u2014 m\u1ea5t t\u00ean ng\u01b0\u1eddi mua trong im l\u1eb7ng.** Chu\u1ea9n th\u1eadt c\u00f3 2 t\u00ean th\u1ebb kh\u00e1c nhau cho \"ai l\u00e0 ng\u01b0\u1eddi mua\": 1 th\u1ebb d\u00f9ng khi l\u00e0 t\u1ed5 ch\u1ee9c\/c\u00f4ng ty, 1 th\u1ebb kh\u00e1c khi l\u00e0 c\u00e1 nh\u00e2n. T\u00f4i ch\u1ec9 bi\u1ebft t\u1edbi th\u1ebb d\u00e0nh cho t\u1ed5 ch\u1ee9c \u2014 kh\u00f4ng file m\u1eabu gi\u1ea3 n\u00e0o t\u1eebng d\u00f9ng th\u1ebb c\u00f2n l\u1ea1i, v\u00ec ng\u01b0\u1eddi vi\u1ebft ra ch\u00fang c\u0169ng kh\u00f4ng bi\u1ebft n\u00f3 t\u1ed3n t\u1ea1i. Ho\u00e1 \u0111\u01a1n th\u1eadt t\u1eeb ng\u01b0\u1eddi mua c\u00e1 nh\u00e2n b\u1eaft \u0111\u1ea7u t\u1edbi, d\u00f9ng \u0111\u00fang c\u00e1i th\u1ebb th\u1ee9 2 \u0111\u00f3. Code \u0111\u1ecdc, kh\u00f4ng t\u00ecm th\u1ea5y g\u00ec d\u01b0\u1edbi th\u1ebb n\u00f3 \u0111ang t\u00ecm, v\u00e0 vui v\u1ebb b\u00e1o c\u00e1o \"x\u1eed l\u00fd xong, kh\u00f4ng c\u00f3 v\u1ea5n \u0111\u1ec1 g\u00ec\". N\u00f3 kh\u00f4ng n\u00f3i d\u1ed1i \u2014 n\u00f3 ch\u1ec9 kh\u00f4ng bi\u1ebft nh\u1eefng g\u00ec n\u00f3 kh\u00f4ng bi\u1ebft.\n\n**L\u1ed7i 3 \u2014 l\u1ed7i khi\u1ebfn t\u00f4i lo nh\u1ea5t.** 1 ho\u00e1 \u0111\u01a1n t\u1eeb 2021 t\u1edbi, d\u00f9ng phi\u00ean b\u1ea3n chu\u1ea9n c\u0169 h\u01a1n m\u1ecdi th\u1ee9 t\u00f4i t\u1eebng test. C\u1ea5u tr\u00fac t\u1ed5ng th\u1ec3 gi\u1ed1ng nhau, nh\u01b0ng s\u1ed1 ho\u00e1 \u0111\u01a1n v\u00e0 ng\u00e0y l\u1eadp \u2014 2 tr\u01b0\u1eddng quan tr\u1ecdng nh\u1ea5t \u0111\u1ec3 \u0111\u1ecbnh danh\/ch\u1ed1ng tr\u00f9ng 1 ho\u00e1 \u0111\u01a1n \u2014 n\u1eb1m d\u01b0\u1edbi t\u00ean th\u1ebb ho\u00e0n to\u00e0n kh\u00e1c. Code l\u1ea1i b\u00e1o \"th\u00e0nh c\u00f4ng ho\u00e0n to\u00e0n\" trong khi \u00e2m th\u1ea7m tr\u1ea3 v\u1ec1 r\u1ed7ng cho c\u1ea3 2 tr\u01b0\u1eddng.\n\n\u0110\u00e2y l\u00e0 l\u1ed7i khi\u1ebfn t\u00f4i ph\u1ea3i \u0111\u1ed5i c\u00e1ch to\u00e0n b\u1ed9 h\u1ec7 th\u1ed1ng b\u00e1o l\u1ed7i. Kh\u00f4ng th\u1ec3 ch\u1ec9 ki\u1ec3m tra \"c\u00f3 t\u00ecm th\u1ea5y \u0111\u00fang kh\u1ed1i c\u1ea5u tr\u00fac l\u1edbn hay kh\u00f4ng\" \u2014 t\u00f4i ph\u1ea3i ki\u1ec3m tra th\u00eam \"c\u00f3 th\u1ef1c s\u1ef1 l\u1ea5y \u0111\u01b0\u1ee3c gi\u00e1 tr\u1ecb cho nh\u1eefng tr\u01b0\u1eddng quan tr\u1ecdng hay kh\u00f4ng\", v\u00e0 b\u00e1o r\u00f5 r\u00e0ng khi kh\u00f4ng c\u00f3 \u2014 thay v\u00ec 1 d\u1ea5u t\u00edch xanh che gi\u1ea5u 1 gi\u00e1 tr\u1ecb r\u1ed7ng.\n\n## \u0110i\u1ec1u t\u00f4i c\u1ee9 ngh\u0129 m\u00e3i\n\nB\u1ed9 d\u1eef li\u1ec7u gi\u1ea3 kia kh\u00f4ng h\u1ec1 c\u00f3 \u00e1c \u00fd, v\u00e0 ch\u00ednh AI t\u1ea1o ra n\u00f3 c\u0169ng \u0111\u00e3 n\u00f3i th\u1eb3ng \u0111\u00f3 l\u00e0 d\u1eef li\u1ec7u gi\u1ea3 l\u1eadp \u2014 ch\u1ec9 l\u00e0 t\u00f4i ho\u00e0n to\u00e0n c\u00f3 th\u1ec3 \u0111\u00e3 kh\u00f4ng ki\u1ec3m tra k\u1ef9. N\u00f3 c\u0169ng **v\u00f4 d\u1ee5ng nh\u01b0 1 \"\u0111\u1ed1i th\u1ee7\" \u0111\u1ec3 r\u00e8n luy\u1ec7n code**. 1 file test h\u1ecfng th\u1eadt s\u1ef1 s\u1ebd b\u00e1o l\u1ed7i r\u00f5 r\u00e0ng, \u1ea7m \u0129. C\u00f2n 1 file \"tr\u00f4ng c\u00f3 v\u1ebb \u0111\u00fang nh\u01b0ng l\u00e0 h\u01b0 c\u1ea5u\" th\u00ec l\u1eb7ng l\u1ebd pass qua, v\u00e0 kh\u00f4ng d\u1ea1y cho b\u1ea1n \u0111\u01b0\u1ee3c g\u00ec \u2014 v\u00ec n\u00f3 \u0111\u01b0\u1ee3c t\u1ea1o ra \u0111\u1ec3 t\u1ed1i \u01b0u cho vi\u1ec7c \"tr\u00f4ng gi\u1ed1ng ho\u00e1 \u0111\u01a1n Vi\u1ec7t Nam\", ch\u1ee9 kh\u00f4ng ph\u1ea3i \"l\u00e0 1 ho\u00e1 \u0111\u01a1n Vi\u1ec7t Nam\".\n\nD\u1eef li\u1ec7u th\u1eadt th\u00ec kh\u00f4ng c\u00f3 v\u1ea5n \u0111\u1ec1 \u0111\u00f3. N\u00f3 kh\u00f4ng quan t\u00e2m c\u00f3 \"h\u1ee3p l\u00fd\" hay kh\u00f4ng. N\u00f3 c\u1ee9 l\u00e0 ch\u00ednh n\u00f3 \u2014 k\u1ec3 c\u1ea3 2 t\u00ean th\u1ebb t\u00f4i ch\u01b0a t\u1eebng nghe, v\u00e0 1 phi\u00ean b\u1ea3n chu\u1ea9n c\u0169 t\u00f4i kh\u00f4ng ng\u1edd v\u1eabn c\u00f2n t\u1ed3n t\u1ea1i ngo\u00e0i \u0111\u1eddi.\n\nT\u00f4i kh\u00f4ng ngh\u0129 b\u00e0i h\u1ecdc \u1edf \u0111\u00e2y l\u00e0 \"\u0111\u1eebng d\u00f9ng d\u1eef li\u1ec7u test do AI t\u1ea1o ra\". T\u00f4i v\u1eabn d\u00f9ng AI cho r\u1ea5t nhi\u1ec1u ph\u1ea7n c\u1ee7a d\u1ef1 \u00e1n n\u00e0y, k\u1ec3 c\u1ea3 vi\u1ec7c nh\u1edd gom b\u1ed9 m\u1eabu \u0111\u1ea7u ti\u00ean \u0111\u00f3. B\u00e0i h\u1ecdc h\u1eb9p h\u01a1n: khi b\u1ea1n \u0111ang ki\u1ec3m ch\u1ee9ng v\u1edbi 1 chu\u1ea9n b\u00ean ngo\u00e0i, do lu\u1eadt ph\u00e1p quy \u0111\u1ecbnh, kh\u00f4ng n\u1eb1m trong t\u1ea7m ki\u1ec3m so\u00e1t c\u1ee7a b\u1ea1n \u2014 th\u00ec \"t\u1ea1o ra 1 file v\u01b0\u1ee3t qua \u0111\u01b0\u1ee3c test c\u1ee7a ch\u00ednh m\u00ecnh\" v\u00e0 \"kh\u1edbp v\u1edbi th\u1ef1c t\u1ebf\" l\u00e0 2 tuy\u00ean b\u1ed1 kh\u00e1c nhau ho\u00e0n to\u00e0n. V\u00e0 ch\u1ec9 1 trong 2 c\u00e1i \u0111\u00f3 ki\u1ec3m ch\u1ee9ng \u0111\u01b0\u1ee3c \u2014 b\u1eb1ng c\u00e1ch quay l\u1ea1i \u0111\u00fang ngu\u1ed3n g\u1ed1c ph\u00e1p l\u00fd, thay v\u00ec tin v\u00e0o file m\u1eabu.\n\n## V\u00e0i c\u00e2u h\u1ecfi t\u00f4i t\u1ef1 \u0111\u1eb7t ra n\u1ebfu l\u00e0 ng\u01b0\u1eddi \u0111\u1ecdc\n\n**V\u1eady d\u1eef li\u1ec7u test do AI t\u1ea1o c\u00f3 \"t\u1ec7\" kh\u00f4ng?** Kh\u00f4ng h\u1eb3n \u2014 n\u00f3 \u0111\u01b0\u1ee3c ghi ch\u00fa th\u1eb3ng l\u00e0 d\u1eef li\u1ec7u gi\u1ea3 l\u1eadp, v\u00e0 v\u1eabn h\u1eefu \u00edch nh\u01b0 1 h\u00ecnh m\u1eabu ban \u0111\u1ea7u. N\u1ebfu c\u00f3 sai th\u00ec l\u00e0 do t\u00f4i d\u1eebng ki\u1ec3m tra qu\u00e1 s\u1edbm, kh\u00f4ng ph\u1ea3i l\u1ed7i c\u1ee7a c\u00f4ng c\u1ee5.\n\n**Gi\u1edd khi g\u1eb7p 1 t\u00ean th\u1ebb ch\u01b0a t\u1eebng th\u1ea5y, code l\u00e0m g\u00ec?** N\u00f3 kh\u00f4ng \u0111o\u00e1n m\u00f2. N\u00f3 b\u00e1o \u0111\u00fang nh\u1eefng g\u00ec \u0111\u1ecdc \u0111\u01b0\u1ee3c, \u0111\u00e1nh d\u1ea5u r\u00f5 tr\u01b0\u1eddng n\u00e0o \u0111ang r\u1ed7ng d\u00f9 \u0111\u00e1ng l\u1ebd ph\u1ea3i c\u00f3, v\u00e0 k\u00e8m theo d\u1eef li\u1ec7u th\u00f4 \u0111\u1ec3 ng\u01b0\u1eddi d\u00f9ng t\u1ef1 \u0111\u1ed1i chi\u1ebfu \u2014 thay v\u00ec tr\u1ea3 v\u1ec1 1 gi\u00e1 tr\u1ecb `null` \u00e2m th\u1ea7m.\n\n**Sao kh\u00f4ng \"d\u1ea1y\" code nh\u1eadn lu\u00f4n m\u1ecdi bi\u1ebfn th\u1ec3 t\u00ean th\u1ebb g\u1eb7p \u0111\u01b0\u1ee3c?** V\u1edbi t\u00ean th\u1ebb b\u1ecba, ho\u00e0n to\u00e0n kh\u00f4ng ngh\u1ecbch l\u00fd \u2014 ch\u1ea5p nh\u1eadn \u0111\u1ed3ng ngh\u0129a v\u1edbi vi\u1ec7c tin h\u01b0 c\u1ea5u nh\u01b0 lu\u1eadt th\u1eadt. V\u1edbi bi\u1ebfn th\u1ec3 th\u1eadt thu\u1ed9c 1 phi\u00ean b\u1ea3n chu\u1ea9n c\u0169 nh\u01b0ng v\u1eabn h\u1ee3p ph\u00e1p th\u00ec c\u00f3 \u2014 v\u00e0 \u0111\u00f3 ch\u00ednh x\u00e1c l\u00e0 chuy\u1ec7n \u0111\u00e3 x\u1ea3y ra \u1edf l\u1ed7i s\u1ed1 3.\n\n**\u0110\u00e2y c\u00f3 ph\u1ea3i v\u1ea5n \u0111\u1ec1 ri\u00eang c\u1ee7a Vi\u1ec7t Nam kh\u00f4ng?** T\u00ean th\u1ebb c\u1ee5 th\u1ec3 th\u00ec \u0111\u00fang l\u00e0 ri\u00eang. Nh\u01b0ng c\u00e1i khu\u00f4n m\u1eabu \u2014 d\u1eef li\u1ec7u test do AI t\u1ea1o ra, \u0111\u1ee7 \"h\u1ee3p l\u00fd\" \u0111\u1ec3 v\u01b0\u1ee3t qua b\u00e0i test c\u1ee7a ch\u00ednh m\u00ecnh m\u00e0 kh\u00f4ng th\u1ef1c s\u1ef1 kh\u1edbp v\u1edbi chu\u1ea9n b\u00ean ngo\u00e0i b\u1ea1n \u0111ang nh\u1eafm t\u1edbi \u2014 th\u00ec kh\u00f4ng ri\u00eang g\u00ec Vi\u1ec7t Nam.\n\n---\n\n*C\u00f4ng c\u1ee5 \u0111\u00e3 l\u00ean Apify Store d\u01b0\u1edbi t\u00ean [Vietnam E-Invoice XML Normalizer](https:\/\/apify.com\/donerightlabs\/vn-einvoice-xml-normalizer) \u2014 g\u1ecdi tr\u1ef1c ti\u1ebfp \u0111\u01b0\u1ee3c qua MCP n\u1ebfu b\u1ea1n \u0111ang x\u00e2y AI Agent l\u00e0m s\u1ed5 s\u00e1ch c\u1ea7n \u0111\u1ecdc ho\u00e1 \u0111\u01a1n \u0111i\u1ec7n t\u1eed VN.*","published_at":"2026-09-14T08:02:23.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T22:13:02.000000Z","edited_at":"2026-09-14T07:44:52.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":12,"points":0,"views_count":20,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/f54f440b-2668-4a54-b452-b9f955d31d44.png","user":{"data":{"id":214789,"url":"https:\/\/viblo.asia\/u\/donerightlabs","avatar":"0f5e7d44-4bf3-4452-a42b-f32743a59ea0.png","name":"donerightlabs","username":"donerightlabs","followers_count":0,"reputation":0,"posts_count":1,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"hoa-don-dien-tu","name":"H\u00f3a \u0111\u01a1n \u0111i\u1ec7n t\u1eed"},{"slug":"xml","name":"XML"},{"slug":"ai-api","name":"AI API"},{"slug":"automation","name":"Automation"},{"slug":"data-procress","name":"data procress"}]},"commentators":{"data":[]}},{"id":106657,"title":"Stop Using final-final.png: Track Generated Assets with YAML","slug":"18J2eoje4YK","url":"https:\/\/viblo.asia\/p\/stop-using-final-finalpng-track-generated-assets-with-yaml-18J2eoje4YK","user_id":207484,"moderation":null,"transliterated":"stop-using-final-finalpng-track-generated-assets-with-yaml","contents_short":"Ten minutes before a fictional caf\u00e9 website goes live, someone asks:\n\nWhich banner is final?\n\nThe project folder offers four answers:\n\nThey look similar. Nobody remembers which one was approved, whether it used a reference photo, or if the mobile crop was checked.\n\nThe problem is not the filename. The file has lost its history.\n\nA short YAML manifest can keep that history beside the asset.\n\nRec...","contents":"Ten minutes before a fictional caf\u00e9 website goes live, someone asks:\n\n> Which banner is final?\n\nThe project folder offers four answers:\n\n```text\nhero-final.png\nhero-final-2.png\nhero-new.png\nhero-use-this.png\n```\n\nThey look similar. Nobody remembers which one was approved, whether it used a reference photo, or if the mobile crop was checked.\n\nThe problem is not the filename. The file has lost its history.\n\nA short YAML manifest can keep that history beside the asset.\n\n## Record What the Team Needs\n\nThe caf\u00e9 banner shows a coffee cup beside a rainy window. A developer opening it next month may need to know:\n\n* Where will the image appear?\n* Which model was used?\n* Can the original task still be found?\n* Were reference files involved?\n* What has been checked?\n* What still needs approval?\n\nThe manifest can stay small:\n\n```yaml\nexample_only: true\n\nasset_id: cafe-hero-03\nfile: cafe-hero-03.png\nplacement: homepage_header\nstatus: staging_only\n\ncreated:\n  date: 2026-09-14\n  prompt_version: v4\n\nsource:\n  model_label: \"<copy from task screen>\"\n  task_id: \"<save if available>\"\n\nreferences:\n  used: true\n  files:\n    - cafe-cup-reference.jpg\n  rights: review_required\n\nchecks:\n  desktop_crop: pass\n  mobile_crop: pass\n  product_details: review_required\n  publication_rights: review_required\n\nnotes: \"Leave space on the left for the heading.\"\n```\n\nUse `review_required` when something is uncertain. A blank field or a guess can easily be mistaken for approval.\n\nThe `staging_only` status also matters. The file may be ready for layout testing while its references or publication rights still need review.\n\n## Explain Why a Version Was Rejected\n\nThere is no need to document every draft. Record only why the closest alternatives were rejected:\n\n```yaml\nrejected:\n  - file: cafe-hero-01.png\n    reason: \"Cup handle changes shape.\"\n\n  - file: cafe-hero-02.png\n    reason: \"Heading covers the cup on mobile.\"\n```\n\nThis prevents the same comparison from being repeated.\n\nIf the team works with [ZMS AI](https:\/\/zms.com\/) or another shared model workspace, copy the model name and relevant settings shown for the task. Do not rely on memory because names, controls, and available options may change.\n\nAvoid storing private tokens or signed download links in the manifest. A task ID is usually enough to locate the source without exposing temporary access details.\n\n## Test It in the Real Layout\n\nA banner can look fine by itself and fail inside the page.\n\nCheck it on the actual website:\n\n* Is the subject visible on a phone?\n* Does text cover an important detail?\n* Is there enough contrast behind the heading?\n* Is the file too large?\n* Do labels, hands, reflections, or product details look wrong?\n\nIn the caf\u00e9 example, the cup sits neatly on the right in the desktop layout. The mobile crop removes half of it. \u201cImage approved\u201d is therefore not enough; the manifest should record which placements passed.\n\nFor video, check the thumbnail, first frame, last frame, captions, and sound timing as separate items.\n\n## Approval Is More Than Appearance\n\nA polished asset may still be unsuitable for publication.\n\nBefore it reaches production:\n\n* Confirm that every reference may be uploaded, processed, and reused for the project.\n* Remove names, addresses, access codes, private locations, and unreleased client material.\n* Review recognizable people, logos, copyrighted characters, packaging, and generated text.\n* Verify factual and product details with reliable sources.\n\nA generated product shot does not prove that the real product has the same appearance or performance. A generated action is not a safety demonstration.\n\nIf viewers could mistake the result for a real person, place, event, or product test, label it as illustrative.\n\n## Keep the Names Boring\n\nOnce the useful context lives in the manifest, filenames can stay simple:\n\n```text\ncafe-hero-01.png\ncafe-hero-02.png\ncafe-hero-03.png\ncafe-hero-03.yaml\n```\n\nThat is easier to maintain than another folder full of files called `final-final`, and it removes the guesswork around which asset was approved.","published_at":"2026-09-14T07:33:26.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T23:00:08.000000Z","edited_at":"2026-09-14T07:33:15.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":2,"points":0,"views_count":12,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/07a8a8aa-cdcc-4bd1-8a69-313a38fff024.png","user":{"data":{"id":207484,"url":"https:\/\/viblo.asia\/u\/emily.jones","avatar":"3bffd972-7730-4fb7-b931-2c4f663bb47b.png","name":"emily jones","username":"emily.jones","followers_count":0,"reputation":0,"posts_count":7,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"ai","name":"AI"},{"slug":"video","name":"video"}]},"commentators":{"data":[]}},{"id":106654,"title":"Sumclub World","slug":"y0VGwgG0VPA","url":"https:\/\/viblo.asia\/p\/sumclub-world-y0VGwgG0VPA","user_id":214782,"moderation":"discarded","transliterated":"sumclub-world","contents_short":"Sumclub l\u00e0 n\u1ec1n t\u1ea3ng gi\u1ea3i tr\u00ed tr\u1ef1c tuy\u1ebfn quy t\u1ee5 nhi\u1ec1u d\u00f2ng game nh\u01b0 game b\u00e0i, slot, b\u1eafn c\u00e1 v\u00e0 casino. V\u1edbi thi\u1ebft k\u1ebf hi\u1ec7n \u0111\u1ea1i, danh m\u1ee5c tr\u00f2 ch\u01a1i \u0111a d\u1ea1ng c\u00f9ng kh\u1ea3 n\u0103ng truy c\u1eadp thu\u1eadn ti\u1ec7n tr\u00ean \u0111i\u1ec7n tho\u1ea1i v\u00e0 m\u00e1y t\u00ednh, Sumclub mang \u0111\u1ebfn kh\u00f4ng gian gi\u1ea3i tr\u00ed phong ph\u00fa.\nTh\u00f4ng tin:\nWebsite: https:\/\/sumclub.world\/\nEmail: contact@sumclub.world\nS\u0110T: 0532983423\n\u0110\u1ecba ch\u1ec9: 151 \u0110. An B\u00ecnh, D\u0129 An, H\u1ed3 Ch\u00ed Minh, Vi\u1ec7...","contents":"Sumclub l\u00e0 n\u1ec1n t\u1ea3ng gi\u1ea3i tr\u00ed tr\u1ef1c tuy\u1ebfn quy t\u1ee5 nhi\u1ec1u d\u00f2ng game nh\u01b0 game b\u00e0i, slot, b\u1eafn c\u00e1 v\u00e0 casino. V\u1edbi thi\u1ebft k\u1ebf hi\u1ec7n \u0111\u1ea1i, danh m\u1ee5c tr\u00f2 ch\u01a1i \u0111a d\u1ea1ng c\u00f9ng kh\u1ea3 n\u0103ng truy c\u1eadp thu\u1eadn ti\u1ec7n tr\u00ean \u0111i\u1ec7n tho\u1ea1i v\u00e0 m\u00e1y t\u00ednh, Sumclub mang \u0111\u1ebfn kh\u00f4ng gian gi\u1ea3i tr\u00ed phong ph\u00fa.\nTh\u00f4ng tin:\nWebsite: https:\/\/sumclub.world\/\nEmail: contact@sumclub.world\nS\u0110T: 0532983423\n\u0110\u1ecba ch\u1ec9: 151 \u0110. An B\u00ecnh, D\u0129 An, H\u1ed3 Ch\u00ed Minh, Vi\u1ec7t Nam\nHastag: #sumclub #sumclubcasino #sumclubgame #sumclubtrangchu #sumclublink","published_at":"2026-09-14T07:12:57.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T07:13:04.000000Z","edited_at":"2026-09-14T07:12:50.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":0,"points":0,"views_count":0,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/fdd282ac-b2d3-4205-89f2-90e6a55ff5d8.png","user":{"data":{"id":214782,"url":"https:\/\/viblo.asia\/u\/linksumclubworld","avatar":"3f65dfc3-380b-41ec-b09a-4a93a5131d5f.jpg","name":"linksumclubworld","username":"linksumclubworld","followers_count":0,"reputation":0,"posts_count":0,"banned_at":"2026-09-14T07:12:58.000000Z","level_partner":null,"following":false}},"tags":{"data":[{"slug":"100-cau-hoi-phong-van","name":"100 c\u00e2u h\u1ecfi ph\u1ecfng v\u1ea5n"}]},"commentators":{"data":[]}},{"id":106652,"title":"Why AI Music Drafts Should Be Treated as a Test Layer in Video and Podcast Production","slug":"13VM9lqWVY7","url":"https:\/\/viblo.asia\/p\/why-ai-music-drafts-should-be-treated-as-a-test-layer-in-video-and-podcast-production-13VM9lqWVY7","user_id":214773,"moderation":null,"transliterated":"why-ai-music-drafts-should-be-treated-as-a-test-layer-in-video-and-podcast-production","contents_short":"Why AI Music Drafts Should Be Treated as a Test Layer in Video and Podcast Production\n\nMost creators do not discover that their music is wrong when they generate it. They discover it after the edit is almost finished.\n\nA track may sound impressive on its own but compete with narration, hide a dialogue transition, place its strongest section under the wrong scene, or create too much energy durin...","contents":"# Why AI Music Drafts Should Be Treated as a Test Layer in Video and Podcast Production\n\nMost creators do not discover that their music is wrong when they generate it. They discover it after the edit is almost finished.\n\nA track may sound impressive on its own but compete with narration, hide a dialogue transition, place its strongest section under the wrong scene, or create too much energy during a quiet explanation. By that point, replacing the music usually means reopening the timeline and changing several decisions that were already considered final.\n\nThis is why AI-generated music is often more useful as a testing layer than as a final production asset.\n\nThe goal is not to generate a perfect song immediately. The goal is to test whether a musical direction works before spending more time on arrangement, recording, licensing, or post-production.\n\n## Test the timeline, not just the song\n\nA music draft should be evaluated inside the actual project.\n\nFor a video, the important questions are usually practical:\n\n* Does the opening create enough energy in the first few seconds?\n* Does the music leave space for speech?\n* Does the transition happen before or after the visual cut?\n* Does the most emotional section support the scene, or distract from it?\n* Can the track be shortened without sounding incomplete?\n\nA song that works during casual listening may fail completely when combined with voice-over and fast visual changes. The timeline is the real test environment.\n\nBefore generating anything, write down a few constraints:\n\n* approximate duration;\n* target tempo or tempo range;\n* instrumental or vocal direction;\n* emotional intensity;\n* scene changes or important dialogue points;\n* whether the music should lead the audience or remain in the background.\n\nThese constraints make it easier to compare drafts. Without them, every generation becomes a different idea and the evaluation becomes subjective.\n\n## A better prompt describes production conditions\n\nA weak prompt might look like this:\n\n> Cinematic emotional music for a video.\n\nThis describes a mood but not a usable production requirement.\n\nA more useful prompt could be:\n\n> 72-second instrumental track for a technology tutorial, around 92 BPM, restrained electronic pulse, warm pads, minimal percussion, no dramatic drop, leave space for continuous narration, gradual increase in energy during the final 15 seconds.\n\nThe second prompt gives the generator information about duration, tempo, instrumentation, structure, and the relationship between music and speech.\n\nThis does not guarantee that the output will be suitable. It simply creates a better starting point for testing.\n\nA prompt-based tool such as [onlymusic.ai](https:\/\/onlymusic.ai\/) can be used at this stage to create several early variations. The useful comparison is not \u201cWhich track is the most beautiful?\u201d but \u201cWhich version creates the fewest problems in the edit?\u201d\n\n## Mix a rough draft under narration\n\nYou do not need a finished mix to evaluate a draft. A simple temporary mix is usually enough.\n\nFor example, you can combine a narration file and a music draft with FFmpeg:\n\n```bash\nffmpeg -i narration.wav -i music-draft.mp3 \\\n-filter_complex \"[1:a]volume=0.18[music];[0:a][music]amix=inputs=2:duration=longest:dropout_transition=2[mix]\" \\\n-map \"[mix]\" review-mix.wav\n```\n\nThe music volume in this example is intentionally conservative. The purpose is not to produce a final master, but to hear whether the voice remains understandable while the music is present.\n\nWhen reviewing the result, listen at normal playback volume rather than only with headphones at high volume. Also check the first few seconds, the densest narration section, and every major transition.\n\nA track may appear acceptable during a quiet introduction but become distracting when the speaker explains a complex idea.\n\n## Use versions instead of endless regeneration\n\nA common mistake is to generate dozens of tracks without recording why each one was rejected.\n\nA simple version table is more useful:\n\n| Version | What changed                  | Result                                     |\n| ------- | ----------------------------- | ------------------------------------------ |\n| A       | More percussion               | Energetic, but masks speech                |\n| B       | Fewer high-frequency elements | Better for narration                       |\n| C       | Slower tempo                  | Fits the introduction, weak for the ending |\n\nThis approach turns generation into an evaluation process. It also prevents the team from returning to the same failed direction several times.\n\nAt some point, regeneration stops being productive. If the structure is already usable, editing may be faster:\n\n* cut an unnecessary introduction;\n* lower the music before important dialogue;\n* add a short fade before a scene change;\n* remove a vocal section under narration;\n* automate volume instead of generating another track.\n\nThe best draft is often the one that needs the least repair, not the one with the most impressive isolated moment.\n\n## Human review is still part of the workflow\n\nAI generation can accelerate exploration, but it does not decide whether a track belongs in a specific project.\n\nA human reviewer should check:\n\n1. whether the music supports the intended scene;\n2. whether the voice remains clear;\n3. whether the structure matches the edit;\n4. whether any lyrics are appropriate and authorized;\n5. whether the intended use is allowed under the relevant service terms;\n6. whether external samples, references, or source material create additional rights concerns.\n\nIf lyrics are used, they should be written by the project team or used with permission. A generated result should not automatically be treated as copyright-free or commercially unrestricted. The project owner should verify the current terms of the chosen service and keep a record of the source material and editing decisions.\n\n## The practical role of an AI music draft\n\nThe most valuable result of an AI music workflow is not always an audio file. Sometimes it is a decision.\n\nA draft can reveal that:\n\n* the scene needs instrumental music instead of vocals;\n* the narration requires a slower harmonic rhythm;\n* the opening needs less energy;\n* the final section needs a stronger transition;\n* the project should commission a custom score instead of continuing with generated material.\n\nThat information can save more time than another polished track.\n\nAI music is therefore best understood as a creative test layer. It helps creators evaluate timing, mood, density, and direction before the final production decision is made. Used this way, it supports composers, editors, and producers rather than pretending to replace them.\n\n*Disclosure: This article includes a reference to onlymusic.ai, a service with which the author has a professional connection.*","published_at":"2026-09-14T06:26:06.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T22:13:02.000000Z","edited_at":"2026-09-14T06:25:30.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":4,"points":0,"views_count":9,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/069ef9cb-8950-44b7-89f2-70d22f44a2fc.png","user":{"data":{"id":214773,"url":"https:\/\/viblo.asia\/u\/onlymusic","avatar":"58e9ebbe-619b-44ee-8778-8be637c8f727.png","name":"link","username":"onlymusic","followers_count":0,"reputation":0,"posts_count":1,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"audio-processing","name":"Audio Processing"},{"slug":"music","name":"music"}]},"commentators":{"data":[]}},{"id":106653,"title":"Con Tr\u1ecf (Pointers) Trong Go (Golang): B\u1ea3n Ch\u1ea5t, \u00dd Ngh\u0129a Trong Backend V\u00e0 C\u1ea1m B\u1eaby Th\u1ef1c Chi\u1ebfn","slug":"PoL7exdk4vk","url":"https:\/\/viblo.asia\/p\/con-tro-pointers-trong-go-golang-ban-chat-y-nghia-trong-backend-va-cam-bay-thuc-chien-PoL7exdk4vk","user_id":182653,"moderation":null,"transliterated":"con-tro-pointers-trong-go-golang-ban-chat-y-nghia-trong-backend-va-cam-bay-thuc-chien","contents_short":"Trong Golang, con tr\u1ecf (pointer) \u0111\u01b0\u1ee3c \u0111\u1ea1i di\u1ec7n b\u1edfi k\u00fd hi\u1ec7u * l\u00e0 m\u1ed9t bi\u1ebfn \u0111\u1eb7c bi\u1ec7t d\u00f9ng \u0111\u1ec3 l\u01b0u tr\u1eef \u0111\u1ecba ch\u1ec9 b\u1ed9 nh\u1edb c\u1ee7a m\u1ed9t bi\u1ebfn kh\u00e1c, thay v\u00ec l\u01b0u tr\u1eef gi\u00e1 tr\u1ecb th\u1ef1c t\u1ebf c\u1ee7a bi\u1ebfn \u0111\u00f3. V\u00ec Go m\u1eb7c \u0111\u1ecbnh truy\u1ec1n d\u1eef li\u1ec7u theo ki\u1ec3u \"Pass by Value\" (t\u1ea1o ra m\u1ed9t b\u1ea3n sao khi truy\u1ec1n v\u00e0o h\u00e0m), con tr\u1ecf l\u00e0 c\u01a1 ch\u1ebf duy nh\u1ea5t \u0111\u1ec3 c\u00e1c h\u00e0m c\u00f3 th\u1ec3 chia s\u1ebb v\u00e0 thay \u0111\u1ed5i chung m\u1ed9t v\u00f9ng nh\u1edb m\u00e0 kh\u00f4ng c\u1ea7n nh\u00e2n b\u1ea3n d\u1eef li\u1ec7u.\n\n1. B\u1ea3n C...","contents":"Trong Golang, con tr\u1ecf (*pointer*) \u0111\u01b0\u1ee3c \u0111\u1ea1i di\u1ec7n b\u1edfi k\u00fd hi\u1ec7u `*` l\u00e0 m\u1ed9t bi\u1ebfn \u0111\u1eb7c bi\u1ec7t d\u00f9ng \u0111\u1ec3 l\u01b0u tr\u1eef \u0111\u1ecba ch\u1ec9 b\u1ed9 nh\u1edb c\u1ee7a m\u1ed9t bi\u1ebfn kh\u00e1c, thay v\u00ec l\u01b0u tr\u1eef gi\u00e1 tr\u1ecb th\u1ef1c t\u1ebf c\u1ee7a bi\u1ebfn \u0111\u00f3. V\u00ec Go m\u1eb7c \u0111\u1ecbnh truy\u1ec1n d\u1eef li\u1ec7u theo ki\u1ec3u \"Pass by Value\" (t\u1ea1o ra m\u1ed9t b\u1ea3n sao khi truy\u1ec1n v\u00e0o h\u00e0m), con tr\u1ecf l\u00e0 c\u01a1 ch\u1ebf duy nh\u1ea5t \u0111\u1ec3 c\u00e1c h\u00e0m c\u00f3 th\u1ec3 chia s\u1ebb v\u00e0 thay \u0111\u1ed5i chung m\u1ed9t v\u00f9ng nh\u1edb m\u00e0 kh\u00f4ng c\u1ea7n nh\u00e2n b\u1ea3n d\u1eef li\u1ec7u.\n\n---\n\n## 1. B\u1ea3n Ch\u1ea5t C\u1ee7a K\u00fd Hi\u1ec7u `*` V\u00e0 `&`\n\n\u0110\u1ec3 l\u00e0m ch\u1ee7 con tr\u1ecf trong Go, b\u1ea1n ch\u1ec9 c\u1ea7n ph\u00e2n \u0111\u1ecbnh r\u1ea1ch r\u00f2i hai to\u00e1n t\u1eed n\u00e0y:\n\n*   **`&` (Address-of):** L\u1ea5y \u0111\u1ecba ch\u1ec9 b\u1ed9 nh\u1edb c\u1ee7a m\u1ed9t bi\u1ebfn \u0111ang c\u00f3. V\u00ed d\u1ee5: `&user` s\u1ebd tr\u1ea3 v\u1ec1 \u0111\u1ecba ch\u1ec9 \u00f4 nh\u1edb c\u1ee7a bi\u1ebfn `user`.\n*   **`*` (Dereference \/ Pointer Type):** C\u00f3 hai t\u00e1c d\u1ee5ng t\u00f9y v\u00e0o ng\u1eef c\u1ea3nh:\n    *   *Khi khai b\u00e1o ki\u1ec3u:* \u0110\u1ecbnh ngh\u0129a \u0111\u00e2y l\u00e0 m\u1ed9t bi\u1ebfn con tr\u1ecf (v\u00ed d\u1ee5: `var p *int` - `p` l\u00e0 con tr\u1ecf tr\u1ecf t\u1edbi v\u00f9ng nh\u1edb ch\u1ee9a s\u1ed1 nguy\u00ean).\n    *   *Khi truy xu\u1ea5t:* Tr\u00edch xu\u1ea5t ho\u1eb7c ghi \u0111\u00e8 gi\u00e1 tr\u1ecb n\u1eb1m t\u1ea1i \u0111\u1ecba ch\u1ec9 b\u1ed9 nh\u1edb m\u00e0 con tr\u1ecf \u0111ang gi\u1eef (v\u00ed d\u1ee5: `*p = 10` - g\u00e1n gi\u00e1 tr\u1ecb 10 v\u00e0o \u00f4 nh\u1edb \u0111\u00f3).\n\n---\n\n## 2. T\u1ea1i Sao L\u1ea1i C\u1ea7n Con Tr\u1ecf Trong H\u1ec7 Th\u1ed1ng Backend?\n\n*   **Thay \u0111\u1ed5i tr\u1ea1ng th\u00e1i d\u1eef li\u1ec7u g\u1ed1c (Mutation):** Khi b\u1ea1n truy\u1ec1n m\u1ed9t struct `Order` v\u00e0o h\u00e0m `processPayment()`, n\u1ebfu kh\u00f4ng d\u00f9ng con tr\u1ecf, h\u00e0m s\u1ebd ch\u1ec9 thao t\u00e1c tr\u00ean b\u1ea3n copy. M\u1ecdi thay \u0111\u1ed5i tr\u1ea1ng th\u00e1i nh\u01b0 `order.Status = \"PAID\"` s\u1ebd bi\u1ebfn m\u1ea5t khi tho\u00e1t h\u00e0m. D\u00f9ng `*Order` \u0111\u1ea3m b\u1ea3o d\u1eef li\u1ec7u g\u1ed1c \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt.\n*   **T\u1ed1i \u01b0u hi\u1ec7u n\u0103ng b\u1ed9 nh\u1edb (Performance):** Truy\u1ec1n m\u1ed9t struct ch\u1ee9a h\u00e0ng tr\u0103m field (v\u00ed d\u1ee5: m\u1ed9t payload JSON l\u1edbn) qua l\u1ea1i gi\u1eefa c\u00e1c h\u00e0m s\u1ebd li\u00ean t\u1ee5c copy d\u1eef li\u1ec7u, l\u00e0m ph\u00ecnh RAM v\u00e0 t\u1ed1n CPU. Truy\u1ec1n con tr\u1ecf (ch\u1ec9 n\u1eb7ng \u0111\u00fang 8 bytes tr\u00ean h\u1ec7 th\u1ed1ng 64-bit) gi\u00fap ti\u1ebft ki\u1ec7m t\u00e0i nguy\u00ean tuy\u1ec7t \u0111\u1ed1i.\n*   **Ph\u00e2n bi\u1ec7t gi\u00e1 tr\u1ecb Zero v\u00e0 Null (Nil Semantics):** Trong Go, ki\u1ec3u `int` m\u1eb7c \u0111\u1ecbnh l\u00e0 `0`, ki\u1ec3u `string` m\u1eb7c \u0111\u1ecbnh l\u00e0 `\"\"`. N\u1ebfu b\u1ea1n truy v\u1ea5n Database v\u00e0 m\u1ed9t tr\u01b0\u1eddng b\u1ecb b\u1ecf tr\u1ed1ng, l\u00e0m sao bi\u1ebft ng\u01b0\u1eddi d\u00f9ng c\u1ed1 t\u00ecnh nh\u1eadp s\u1ed1 0 hay h\u1ecd kh\u00f4ng nh\u1eadp g\u00ec? D\u00f9ng con tr\u1ecf `*int`. N\u1ebfu ng\u01b0\u1eddi d\u00f9ng kh\u00f4ng nh\u1eadp, bi\u1ebfn s\u1ebd mang gi\u00e1 tr\u1ecb `nil`. N\u1ebfu nh\u1eadp 0, bi\u1ebfn s\u1ebd tr\u1ecf \u0111\u1ebfn \u00f4 nh\u1edb ch\u1ee9a s\u1ed1 0.\n\n---\n\n## 3. Minh H\u1ecda B\u1eb1ng M\u00e3 Ngu\u1ed3n\n\n```go\npackage main\n\nimport \"fmt\"\n\n\/\/ H\u00e0m n\u00e0y nh\u1eadn v\u00e0o B\u1ea2N SAO (Pass by Value) -> Kh\u00f4ng thay \u0111\u1ed5i \u0111\u01b0\u1ee3c d\u1eef li\u1ec7u g\u1ed1c\nfunc failUpdate(age int) {\n    age = 30\n}\n\n\/\/ H\u00e0m n\u00e0y nh\u1eadn v\u00e0o \u0110\u1ecaA CH\u1ec8 B\u1ed8 NH\u1eda (Pass by Reference)\nfunc successUpdate(age *int) {\n    *age = 30 \/\/ D\u00f9ng * \u0111\u1ec3 can thi\u1ec7p tr\u1ef1c ti\u1ebfp v\u00e0o gi\u00e1 tr\u1ecb t\u1ea1i \u00f4 nh\u1edb\n}\n\nfunc main() {\n    myAge := 22\n    \n    failUpdate(myAge)\n    fmt.Println(\"Sau khi failUpdate:\", myAge) \/\/ V\u1eabn in ra 22\n    \n    successUpdate(&myAge) \/\/ Truy\u1ec1n \u0111\u1ecba ch\u1ec9 c\u1ee7a bi\u1ebfn myAge\n    fmt.Println(\"Sau khi successUpdate:\", myAge) \/\/ In ra 30\n}\n```\n\n---\n\n## 4. C\u1ea1m B\u1eaby C\u1ea7n Tr\u00e1nh Khi D\u00f9ng Con Tr\u1ecf\n\n*   **Tr\u00e1nh d\u00f9ng cho Slice v\u00e0 Map:** Slice v\u00e0 Map trong Go b\u1ea3n ch\u1ea5t b\u00ean d\u01b0\u1edbi \u0111\u00e3 l\u00e0 c\u00e1c tham chi\u1ebfu (*reference types*) ch\u1ee9a con tr\u1ecf. Vi\u1ec7c truy\u1ec1n `*[]int` hay `*map[string]string` l\u00e0 th\u1eeba th\u00e3i v\u00e0 g\u00e2y r\u1ed1i r\u1eafm m\u00e3 ngu\u1ed3n.\n*   **G\u00e1nh n\u1eb7ng b\u1ed9 d\u1ecdn r\u00e1c (Garbage Collection Overhead):** \u0110\u1eebng l\u1ea1m d\u1ee5ng con tr\u1ecf cho c\u00e1c bi\u1ebfn qu\u00e1 nh\u1ecf b\u00e9 (nh\u01b0 s\u1ed1 nguy\u00ean `int` th\u00f4ng th\u01b0\u1eddng ch\u1ea1y v\u00f2ng l\u1eb7p). Bi\u1ebfn th\u00f4ng th\u01b0\u1eddng \u0111\u01b0\u1ee3c c\u1ea5p ph\u00e1t tr\u00ean b\u1ed9 nh\u1edb Stack si\u00eau nhanh. Khi d\u00f9ng con tr\u1ecf kh\u00f4ng h\u1ee3p l\u00fd, Go c\u00f3 th\u1ec3 \u00e9p c\u1ea5p ph\u00e1t b\u1ed9 nh\u1edb tr\u00ean Heap (*Escape Analysis*), l\u00e0m ch\u1eadm ch\u01b0\u01a1ng tr\u00ecnh do Garbage Collector ph\u1ea3i d\u1ecdn d\u1eb9p li\u00ean t\u1ee5c.","published_at":"2026-09-14T06:25:46.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T23:00:08.000000Z","edited_at":"2026-09-14T06:25:46.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":3,"points":1,"views_count":20,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/76d068b2-cf19-44c7-a83b-424777d5ea30.png","user":{"data":{"id":182653,"url":"https:\/\/viblo.asia\/u\/hhoang","avatar":"6024932a-5822-4ab3-8a0a-67ce58832e70.jpg","name":"C\u00f4 G\u00e1i IT","username":"hhoang","followers_count":173,"reputation":13114,"posts_count":1216,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"array-golang","name":"Array golang"}]},"commentators":{"data":[]}},{"id":106650,"title":"SO S\u00c1NH = V\u00c0 := TRONG GOLANG: RANH GI\u1edaI GI\u1eeeA G\u00c1N V\u00c0 KHAI B\u00c1O","slug":"oKLnqrKGJQO","url":"https:\/\/viblo.asia\/p\/so-sanh-va-trong-golang-ranh-gioi-giua-gan-va-khai-bao-oKLnqrKGJQO","user_id":182653,"moderation":null,"transliterated":"so-sanh-va-trong-golang-ranh-gioi-giua-gan-va-khai-bao","contents_short":"trong Golang, s\u1ef1 kh\u00e1c bi\u1ec7t gi\u1eefa = v\u00e0 := kh\u00f4ng ch\u1ec9 n\u1eb1m \u1edf c\u00fa ph\u00e1p vi\u1ebft t\u1eaft cho g\u1ecdn tay, m\u00e0 n\u00f3 quy\u1ebft \u0111\u1ecbnh tr\u1ef1c ti\u1ebfp \u0111\u1ebfn v\u00f2ng \u0111\u1eddi, ph\u1ea1m vi ho\u1ea1t \u0111\u1ed9ng (scope) v\u00e0 c\u00e1ch b\u1ed9 bi\u00ean d\u1ecbch c\u1ea5p ph\u00e1t b\u1ed9 nh\u1edb cho bi\u1ebfn. Hi\u1ec3u sai hai to\u00e1n t\u1eed n\u00e0y l\u00e0 nguy\u00ean nh\u00e2n h\u00e0ng \u0111\u1ea7u d\u1eabn \u0111\u1ebfn l\u1ed7i \"Shadowing\" kh\u00e9t ti\u1ebfng khi x\u1eed l\u00fd c\u00e1c lu\u1ed3ng gRPC hay truy v\u1ea5n database.\n\nD\u01b0\u1edbi \u0111\u00e2y l\u00e0 b\u00e0i vi\u1ebft m\u1ed5 x\u1ebb chi ti\u1ebft b\u1ea3n ch\u1ea5t v\u00e0 c\u00e1ch ph\u00e2n bi\u1ec7t h...","contents":"trong Golang, s\u1ef1 kh\u00e1c bi\u1ec7t gi\u1eefa = v\u00e0 := kh\u00f4ng ch\u1ec9 n\u1eb1m \u1edf c\u00fa ph\u00e1p vi\u1ebft t\u1eaft cho g\u1ecdn tay, m\u00e0 n\u00f3 quy\u1ebft \u0111\u1ecbnh tr\u1ef1c ti\u1ebfp \u0111\u1ebfn v\u00f2ng \u0111\u1eddi, ph\u1ea1m vi ho\u1ea1t \u0111\u1ed9ng (scope) v\u00e0 c\u00e1ch b\u1ed9 bi\u00ean d\u1ecbch c\u1ea5p ph\u00e1t b\u1ed9 nh\u1edb cho bi\u1ebfn. Hi\u1ec3u sai hai to\u00e1n t\u1eed n\u00e0y l\u00e0 nguy\u00ean nh\u00e2n h\u00e0ng \u0111\u1ea7u d\u1eabn \u0111\u1ebfn l\u1ed7i \"Shadowing\" kh\u00e9t ti\u1ebfng khi x\u1eed l\u00fd c\u00e1c lu\u1ed3ng gRPC hay truy v\u1ea5n database.\n\nD\u01b0\u1edbi \u0111\u00e2y l\u00e0 b\u00e0i vi\u1ebft m\u1ed5 x\u1ebb chi ti\u1ebft b\u1ea3n ch\u1ea5t v\u00e0 c\u00e1ch ph\u00e2n bi\u1ec7t hai to\u00e1n t\u1eed n\u00e0y.\n\nTrong ng\u00f4n ng\u1eef Go (Golang), vi\u1ec7c ph\u00e2n \u0111\u1ecbnh r\u1ea1ch r\u00f2i gi\u1eefa kh\u1edfi t\u1ea1o v\u00f9ng nh\u1edb m\u1edbi (`:=`) v\u00e0 c\u1eadp nh\u1eadt d\u1eef li\u1ec7u (`=`) l\u00e0 b\u01b0\u1edbc ki\u1ec3m so\u00e1t b\u1ed9 nh\u1edb n\u1ec1n t\u1ea3ng. Trong c\u00e1c d\u1ef1 \u00e1n microservices, vi\u1ec7c l\u1ea1m d\u1ee5ng `:=` b\u1eeba b\u00e3i trong c\u00e1c v\u00f2ng l\u1eb7p ho\u1eb7c kh\u1ed1i l\u1ec7nh r\u1ebd nh\u00e1nh l\u00e0 nguy\u00ean nh\u00e2n h\u00e0ng \u0111\u1ea7u g\u00e2y ra r\u00f2 r\u1ec9 d\u1eef li\u1ec7u logic m\u00e0 tr\u00ecnh bi\u00ean d\u1ecbch kh\u00f4ng h\u1ec1 c\u1ea3nh b\u00e1o.\n\n---\n\n## 1. `:=` (Short Variable Declaration - Khai b\u00e1o v\u00e0 kh\u1edfi t\u1ea1o ng\u1eafn g\u1ecdn)\n\nTo\u00e1n t\u1eed `:=` th\u1ef1c ch\u1ea5t l\u00e0 m\u1ed9t \"c\u00fa l\u1eeba\" c\u00fa ph\u00e1p (*syntactic sugar*) k\u1ebft h\u1ee3p hai h\u00e0nh \u0111\u1ed9ng c\u00f9ng l\u00fac: Khai b\u00e1o m\u1ed9t bi\u1ebfn ho\u00e0n to\u00e0n m\u1edbi v\u00e0 g\u00e1n gi\u00e1 tr\u1ecb kh\u1edfi t\u1ea1o cho n\u00f3. Go s\u1ebd t\u1ef1 \u0111\u1ed9ng n\u1ed9i suy ki\u1ec3u d\u1eef li\u1ec7u (*Type Inference*) d\u1ef1a tr\u00ean gi\u00e1 tr\u1ecb \u0111\u01b0\u1ee3c g\u00e1n.\n\n*   **T\u00ednh ch\u1ea5t c\u1ed1t l\u00f5i:** B\u1eaft bu\u1ed9c ph\u1ea3i t\u1ea1o ra \u00edt nh\u1ea5t m\u1ed9t bi\u1ebfn M\u1edaI \u1edf ph\u00eda b\u00ean tr\u00e1i.\n*   **Ph\u1ea1m vi gi\u1edbi h\u1ea1n:** Ch\u1ec9 \u0111\u01b0\u1ee3c ph\u00e9p s\u1eed d\u1ee5ng b\u00ean trong th\u00e2n h\u00e0m (*function body*). Tuy\u1ec7t \u0111\u1ed1i kh\u00f4ng \u0111\u01b0\u1ee3c d\u00f9ng \u1edf c\u1ea5p \u0111\u1ed9 package (*Global scope*).\n\n```go\nfunc fetchUserData() {\n    \/\/ Khai b\u00e1o bi\u1ebfn m\u1edbi 'userID' v\u00e0 g\u00e1n gi\u00e1 tr\u1ecb 105 (Go t\u1ef1 hi\u1ec3u \u0111\u00e2y l\u00e0 int)\n    userID := 105 \n    \n    \/\/ Khai b\u00e1o nhi\u1ec1u bi\u1ebfn c\u00f9ng l\u00fac\n    name, age := \"Hieu\", 22 \n}\n```\n\n---\n\n## 2. `=` (Assignment Operator - To\u00e1n t\u1eed g\u00e1n)\n\nTo\u00e1n t\u1eed `=` ch\u1ec9 l\u00e0m \u0111\u00fang m\u1ed9t nhi\u1ec7m v\u1ee5 duy nh\u1ea5t: C\u1eadp nh\u1eadt gi\u00e1 tr\u1ecb m\u1edbi cho m\u1ed9t bi\u1ebfn \u0110\u00c3 T\u1ed2N T\u1ea0I t\u1eeb tr\u01b0\u1edbc. N\u00f3 ho\u00e0n to\u00e0n kh\u00f4ng c\u00f3 kh\u1ea3 n\u0103ng sinh ra v\u00f9ng nh\u1edb hay bi\u1ebfn m\u1edbi.\n\n*   **T\u00ednh ch\u1ea5t c\u1ed1t l\u00f5i:** Bi\u1ebfn \u1edf ph\u00eda b\u00ean tr\u00e1i b\u1eaft bu\u1ed9c ph\u1ea3i \u0111\u01b0\u1ee3c khai b\u00e1o tr\u01b0\u1edbc \u0111\u00f3 (th\u00f4ng qua t\u1eeb kh\u00f3a `var` ho\u1eb7c \u0111\u00e3 d\u00f9ng `:=` tr\u01b0\u1edbc \u0111\u00f3).\n*   **Ph\u1ea1m vi:** C\u00f3 th\u1ec3 d\u00f9ng \u1edf b\u1ea5t c\u1ee9 \u0111\u00e2u (trong h\u00e0m ho\u1eb7c ngo\u00e0i h\u00e0m \u0111\u1ec3 g\u00e1n gi\u00e1 tr\u1ecb cho bi\u1ebfn global).\n\n```go\nvar globalStatus string = \"INIT\" \/\/ Khai b\u00e1o r\u00f5 r\u00e0ng v\u1edbi var v\u00e0 =\n\nfunc updateStatus() {\n    var count int\n    count = 10 \/\/ C\u1eadp nh\u1eadt bi\u1ebfn \u0111\u00e3 t\u1ed3n t\u1ea1i b\u1eb1ng =\n\n    name := \"Admin\"\n    name = \"SuperAdmin\" \/\/ C\u1eadp nh\u1eadt l\u1ea1i gi\u00e1 tr\u1ecb b\u1eb1ng =\n}\n```\n\n---\n\n## 3. B\u1ea3ng So S\u00e1nh Nhanh\n\n| Ti\u00eau ch\u00ed | `:=` (Khai b\u00e1o ng\u1eafn) | `=` (G\u00e1n gi\u00e1 tr\u1ecb) |\n| :--- | :--- | :--- |\n| **B\u1ea3n ch\u1ea5t** | Khai b\u00e1o bi\u1ebfn m\u1edbi + G\u00e1n gi\u00e1 tr\u1ecb | C\u1eadp nh\u1eadt gi\u00e1 tr\u1ecb cho bi\u1ebfn c\u0169 |\n| **Bi\u1ebfn b\u00ean tr\u00e1i** | Ph\u1ea3i c\u00f3 \u00edt nh\u1ea5t 1 bi\u1ebfn CH\u01afA t\u1ed3n t\u1ea1i trong scope hi\u1ec7n t\u1ea1i | B\u1eaft bu\u1ed9c ph\u1ea3i \u0110\u00c3 t\u1ed3n t\u1ea1i |\n| **N\u1ed9i suy ki\u1ec3u d\u1eef li\u1ec7u** | C\u00f3 (T\u1ef1 \u0111\u1ed9ng nh\u1eadn di\u1ec7n `int`, `string`,...) | Kh\u00f4ng (Bi\u1ebfn \u0111\u00e3 b\u1ecb fix c\u1ee9ng ki\u1ec3u t\u1eeb tr\u01b0\u1edbc) |\n| **V\u1ecb tr\u00ed s\u1eed d\u1ee5ng** | Ch\u1ec9 d\u00f9ng b\u00ean trong h\u00e0m | D\u00f9ng \u0111\u01b0\u1ee3c \u1edf m\u1ecdi n\u01a1i |\n\n---\n\n## 4. B\u1eaby T\u1eed Th\u1ea7n Trong Th\u1ef1c Chi\u1ebfn: Variable Shadowing V\u1edbi Bi\u1ebfn `err`\n\nKhi x\u1eed l\u00fd c\u00e1c logic backend ph\u1ee9c t\u1ea1p, c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean Go r\u1ea5t hay d\u00f9ng `:=` \u0111\u1ec3 h\u1ee9ng l\u1ed7i t\u1eeb c\u00e1c h\u00e0m tr\u1ea3 v\u1ec1 nhi\u1ec1u k\u1ebft qu\u1ea3. N\u1ebfu kh\u00f4ng c\u1ea9n th\u1eadn, b\u1ea1n s\u1ebd v\u00f4 t\u00ecnh t\u1ea1o ra m\u1ed9t bi\u1ebfn `err` c\u1ee5c b\u1ed9 che khu\u1ea5t (*shadow*) bi\u1ebfn `err` g\u1ed1c b\u00ean ngo\u00e0i, d\u1eabn \u0111\u1ebfn vi\u1ec7c h\u00e0m lu\u00f4n b\u00e1o th\u00e0nh c\u00f4ng d\u00f9 b\u00ean trong th\u1ef1c ch\u1ea5t \u0111\u00e3 b\u1ecb l\u1ed7i.\n\n### V\u00ed d\u1ee5 m\u1ed9t \u0111o\u1ea1n code l\u1ed7i kinh \u0111i\u1ec3n:\n```go\nfunc processTransaction(txID string) error {\n    var err error \/\/ Bi\u1ebfn err g\u1ed1c (scope c\u1ee7a to\u00e0n h\u00e0m processTransaction)\n\n    if txID != \"\" {\n        \/\/ \ud83d\udca5 B\u1eaaY CH\u1ebeT NG\u01af\u1edcI T\u1ea0I \u0110\u00c2Y:\n        \/\/ D\u00f9ng := b\u00ean trong block 'if' s\u1ebd t\u1ea1o ra m\u1ed9t bi\u1ebfn 'result' M\u1edaI \n        \/\/ v\u00e0 m\u1ed9t bi\u1ebfn 'err' M\u1edaI tinh ch\u1ec9 s\u1ed1ng b\u00ean trong kh\u1ed1i 'if' n\u00e0y.\n        result, err := queryDatabase(txID) \n        if err != nil {\n            log.Println(\"L\u1ed7i query:\", err)\n            \/\/ Bi\u1ebfn err c\u1ee5c b\u1ed9 n\u00e0y s\u1ebd bi\u1ebfn m\u1ea5t khi tho\u00e1t kh\u1ecfi kh\u1ed1i if!\n        }\n        _ = result\n    }\n\n    \/\/ Bi\u1ebfn err g\u1ed1c b\u00ean ngo\u00e0i ch\u01b0a t\u1eebng b\u1ecb ch\u1ea1m t\u1edbi, gi\u00e1 tr\u1ecb v\u1eabn l\u00e0 nil!\n    return err \n}\n```\n\n### C\u00e1ch kh\u1eafc ph\u1ee5c:\n\u0110\u1ec3 s\u1eeda l\u1ed7i tr\u00ean, b\u1ea1n ph\u1ea3i khai b\u00e1o bi\u1ebfn `result` t\u1eeb tr\u01b0\u1edbc, sau \u0111\u00f3 d\u00f9ng to\u00e1n t\u1eed `=` \u0111\u1ec3 \u00e9p Go t\u00e1i s\u1eed d\u1ee5ng bi\u1ebfn `err` g\u1ed1c b\u00ean ngo\u00e0i kh\u1ed1i `if`.\n\n```go\nfunc processTransaction(txID string) error {\n    var err error \n    var result string \/\/ Khai b\u00e1o tr\u01b0\u1edbc\n\n    if txID != \"\" {\n        \/\/ D\u00f9ng = \u0111\u1ec3 c\u1eadp nh\u1eadt bi\u1ebfn \u0111\u00e3 t\u1ed3n t\u1ea1i, kh\u00f4ng sinh bi\u1ebfn m\u1edbi\n        result, err = queryDatabase(txID) \n        \/\/ ...\n    }\n    return err \n}\n```","published_at":"2026-09-14T04:48:34.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T23:00:08.000000Z","edited_at":"2026-09-14T04:48:33.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":3,"points":1,"views_count":25,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/dcae9b49-6773-4186-9b16-7eab60741281.png","user":{"data":{"id":182653,"url":"https:\/\/viblo.asia\/u\/hhoang","avatar":"6024932a-5822-4ab3-8a0a-67ce58832e70.jpg","name":"C\u00f4 G\u00e1i IT","username":"hhoang","followers_count":173,"reputation":13114,"posts_count":1216,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"array-golang","name":"Array golang"}]},"commentators":{"data":[]}},{"id":106646,"title":"ll88gbnet","slug":"kNLr3nvOVgA","url":"https:\/\/viblo.asia\/p\/ll88gbnet-kNLr3nvOVgA","user_id":214741,"moderation":"discarded","transliterated":"ll88gbnet","contents_short":"LL88 l\u00e0 nh\u00e0 c\u00e1i uy t\u00edn h\u00e0ng \u0111\u1ea7u Vi\u1ec7t Nam, cung c\u1ea5p c\u00e1 c\u01b0\u1ee3c th\u1ec3 thao, casino, b\u1eafn c\u00e1, x\u1ed5 s\u1ed1, slot, \u0111\u00e1 g\u00e0, n\u1ea1p r\u00fat nhanh, b\u1ea3o m\u1eadt SSL, \u0111\u0103ng k\u00fd nh\u1eadn 88K c\u00f9ng lo\u1ea1t khuy\u1ebfn m\u00e3i h\u1ea5p d\u1eabn kh\u00e1c.\n\u0110\u1ecba Ch\u1ec9: 249 C\u1ed9ng H\u00f2a, T\u00e2n B\u00ecnh, H\u1ed3 Ch\u00ed Minh, Vi\u1ec7t Nam\nEmail: admin@ll88.gb.net\nWebsite: https:\/\/ll88.gb.net\/\n\u0110i\u1ec7n Tho\u1ea1i: 0998678888\nHashtags, tag: #ll88 #ll888 #ll88com #ll88gbnet #linkll88 #nhacaill88 #trangchu...","contents":"LL88 l\u00e0 nh\u00e0 c\u00e1i uy t\u00edn h\u00e0ng \u0111\u1ea7u Vi\u1ec7t Nam, cung c\u1ea5p c\u00e1 c\u01b0\u1ee3c th\u1ec3 thao, casino, b\u1eafn c\u00e1, x\u1ed5 s\u1ed1, slot, \u0111\u00e1 g\u00e0, n\u1ea1p r\u00fat nhanh, b\u1ea3o m\u1eadt SSL, \u0111\u0103ng k\u00fd nh\u1eadn 88K c\u00f9ng lo\u1ea1t khuy\u1ebfn m\u00e3i h\u1ea5p d\u1eabn kh\u00e1c.\n\u0110\u1ecba Ch\u1ec9: 249 C\u1ed9ng H\u00f2a, T\u00e2n B\u00ecnh, H\u1ed3 Ch\u00ed Minh, Vi\u1ec7t Nam\nEmail: admin@ll88.gb.net\nWebsite: https:\/\/ll88.gb.net\/\n\u0110i\u1ec7n Tho\u1ea1i: 0998678888\nHashtags, tag: #ll88 #ll888 #ll88com #ll88gbnet #linkll88 #nhacaill88 #trangchull88\u00a0\n\n\n\nhttps:\/\/ll88.gb.net\/\nhttps:\/\/ll88.gb.net\/gioi-thieu-ll88\/\nhttps:\/\/ll88.gb.net\/chinh-sach-bao-mat-ll88\/\nhttps:\/\/ll88.gb.net\/dieu-khoan-su-dung-ll88\/\nhttps:\/\/ll88.gb.net\/lien-he-ll88\/\nhttps:\/\/ll88.gb.net\/khuyen-mai-ll88\/\nhttps:\/\/ll88.gb.net\/dang-ky-ll88\/\nhttps:\/\/ll88.gb.net\/dang-nhap-ll88\/\nhttps:\/\/ll88.gb.net\/nap-tien-ll88\/\nhttps:\/\/ll88.gb.net\/rut-tien-ll88\/\nhttps:\/\/ll88.gb.net\/tai-app-ll88\/\nhttps:\/\/ll88.gb.net\/sitemap_index.xml\nhttps:\/\/twitter.com\/ll88gbnet\nhttps:\/\/www.pinterest.com\/ll88gbnet\nhttps:\/\/www.youtube.com\/@ll88gbnet\nhttps:\/\/500px.com\/p\/ll88gbnet\nhttps:\/\/qiita.com\/ll88gbnet\nhttps:\/\/pubhtml5.com\/homepage\/icxdm\/\nhttps:\/\/www.twitch.tv\/ll88gbnet\/about\nhttps:\/\/www.speedrun.com\/users\/ll88gbnet\nhttps:\/\/stocktwits.com\/ll88gbnet\nhttps:\/\/ll88gbnet.blogspot.com\/2026\/08\/ll88-la-nha-cai-uy-tin-hang-au-viet-nam.html\nhttps:\/\/gravatar.com\/ll88gbnet\nhttps:\/\/www.tumblr.com\/ll88gbnet\nhttps:\/\/vimeo.com\/ll88gbnet\nhttps:\/\/medium.com\/@ll88gbnet\/about","published_at":"2026-09-14T04:12:43.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T04:12:52.000000Z","edited_at":"2026-09-14T04:12:18.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":1,"points":0,"views_count":0,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/b837f3cf-9ff1-4523-b544-3c25e7fdb0ae.png","user":{"data":{"id":214741,"url":"https:\/\/viblo.asia\/u\/ll88gbnet","avatar":"8e7bb07a-c666-4881-99ac-b6a01ee2d0fe.png","name":"ll gbnet","username":"ll88gbnet","followers_count":0,"reputation":0,"posts_count":0,"banned_at":"2026-09-14T04:12:46.000000Z","level_partner":null,"following":false}},"tags":{"data":[{"slug":"ll88gbnet","name":"ll88gbnet"}]},"commentators":{"data":[]}},{"id":106644,"title":"X\u1eec L\u00dd D\u1eee LI\u1ec6U M\u1ea4T C\u00c2N B\u1eb0NG V\u00c0 T\u1ed0I \u01afU H\u00d3A M\u00d4 H\u00ccNH D\u1ef0 B\u00c1O R\u1ee6I RO KINH DOANH","slug":"Nj4vgG60J6r","url":"https:\/\/viblo.asia\/p\/xu-ly-du-lieu-mat-can-bang-va-toi-uu-hoa-mo-hinh-du-bao-rui-ro-kinh-doanh-Nj4vgG60J6r","user_id":190335,"moderation":"discarded","transliterated":"xu-ly-du-lieu-mat-can-bang-va-toi-uu-hoa-mo-hinh-du-bao-rui-ro-kinh-doanh","contents_short":"Trong c\u00e1c b\u00e0i to\u00e1n kinh doanh tr\u1ecdng y\u1ebfu c\u1ee7a doanh nghi\u1ec7p nh\u01b0 Th\u1ea9m \u0111\u1ecbnh t\u00edn d\u1ee5ng ng\u00e2n h\u00e0ng (Credit Scoring), Ph\u00e1t hi\u1ec7n gian l\u1eadn thanh to\u00e1n (Fraud Detection) hay D\u1ef1 \u0111o\u00e1n kh\u00e1ch h\u00e0ng r\u1eddi b\u1ecf d\u1ecbch v\u1ee5 (Customer Churn), th\u00e1ch th\u1ee9c l\u1edbn nh\u1ea5t m\u00e0 c\u00e1c chuy\u00ean gia d\u1eef li\u1ec7u ph\u1ea3i \u0111\u1ed1i m\u1eb7t ch\u00ednh l\u00e0 hi\u1ec7n t\u01b0\u1ee3ng m\u1ea5t c\u00e2n b\u1eb1ng d\u1eef li\u1ec7u nghi\u00eam tr\u1ecdng (Imbalanced Datasets).\n\nTrong th\u1ef1c t\u1ebf, s\u1ed1 l\u01b0\u1ee3ng giao d\u1ecbch gian l\u1eadn ho\u1eb7c ...","contents":"Trong c\u00e1c b\u00e0i to\u00e1n kinh doanh tr\u1ecdng y\u1ebfu c\u1ee7a doanh nghi\u1ec7p nh\u01b0 Th\u1ea9m \u0111\u1ecbnh t\u00edn d\u1ee5ng ng\u00e2n h\u00e0ng (Credit Scoring), Ph\u00e1t hi\u1ec7n gian l\u1eadn thanh to\u00e1n (Fraud Detection) hay D\u1ef1 \u0111o\u00e1n kh\u00e1ch h\u00e0ng r\u1eddi b\u1ecf d\u1ecbch v\u1ee5 (Customer Churn), th\u00e1ch th\u1ee9c l\u1edbn nh\u1ea5t m\u00e0 c\u00e1c chuy\u00ean gia d\u1eef li\u1ec7u ph\u1ea3i \u0111\u1ed1i m\u1eb7t ch\u00ednh l\u00e0 hi\u1ec7n t\u01b0\u1ee3ng m\u1ea5t c\u00e2n b\u1eb1ng d\u1eef li\u1ec7u nghi\u00eam tr\u1ecdng (Imbalanced Datasets).\n\nTrong th\u1ef1c t\u1ebf, s\u1ed1 l\u01b0\u1ee3ng giao d\u1ecbch gian l\u1eadn ho\u1eb7c s\u1ed1 l\u01b0\u1ee3ng kh\u00e1ch h\u00e0ng b\u00f9ng n\u1ee3 th\u01b0\u1eddng ch\u1ec9 chi\u1ebfm d\u01b0\u1edbi 1% \u0111\u1ebfn 3% t\u1ed5ng s\u1ed1 b\u1ea3n ghi. N\u1ebfu \u00e1p d\u1ee5ng m\u00e1y m\u00f3c c\u00e1c thu\u1eadt to\u00e1n h\u1ecdc m\u00e1y ti\u00eau chu\u1ea9n m\u00e0 kh\u00f4ng c\u00f3 chi\u1ebfn l\u01b0\u1ee3c x\u1eed l\u00fd chuy\u00ean s\u00e2u, b\u1ea1n s\u1ebd t\u1ea1o ra m\u1ed9t m\u00f4 h\u00ecnh c\u00f3 v\u1ebb r\u1ea5t ho\u00e0n h\u1ea3o tr\u00ean b\u00e1o c\u00e1o l\u00fd thuy\u1ebft nh\u01b0ng l\u1ea1i g\u00e2y thi\u1ec7t h\u1ea1i t\u00e0i ch\u00ednh h\u00e0ng t\u1ef7 \u0111\u1ed3ng cho t\u1ed5 ch\u1ee9c.\n\nB\u00e0i vi\u1ebft n\u00e0y s\u1ebd ph\u00e2n t\u00edch chi ti\u1ebft b\u1ea3n ch\u1ea5t c\u1ee7a b\u00e0i to\u00e1n m\u1ea5t c\u00e2n b\u1eb1ng, k\u1ef9 thu\u1eadt l\u1ea5y m\u1eabu n\u00e2ng cao, t\u01b0 duy h\u1ecdc t\u1ed1i \u01b0u chi ph\u00ed v\u00e0 c\u00e1ch li\u00ean k\u1ebft k\u1ebft qu\u1ea3 d\u1ef1 b\u00e1o v\u1edbi ch\u1ec9 s\u1ed1 P&L c\u1ee7a doanh nghi\u1ec7p.\n\n## 1. C\u1ea1m B\u1eaby C\u1ee7a Ch\u1ec9 S\u1ed1 Accuracy V\u00e0 T\u01b0 Duy Cost-Sensitive Learning\n\nSai l\u1ea7m s\u01a1 \u0111\u1eb3ng nh\u1ea5t c\u1ee7a ng\u01b0\u1eddi l\u00e0m d\u1eef li\u1ec7u thi\u1ebfu kinh nghi\u1ec7m l\u00e0 s\u1eed d\u1ee5ng \u0111\u1ed9 ch\u00ednh x\u00e1c t\u1ed5ng th\u1ec3 (Accuracy) \u0111\u1ec3 \u0111\u00e1nh gi\u00e1 m\u00f4 h\u00ecnh ph\u00e2n lo\u1ea1i m\u1ea5t c\u00e2n b\u1eb1ng.\n![image.png](https:\/\/images.viblo.asia\/9dc8432a-39ee-4520-b397-cbf17e207510.png)\n\nH\u00e3y ph\u00e2n t\u00edch m\u1ed9t k\u1ecbch b\u1ea3n th\u1ef1c t\u1ebf:\n\nM\u1ed9t ng\u00e2n h\u00e0ng c\u00f3 t\u1eadp d\u1eef li\u1ec7u g\u1ed3m 100.000 giao d\u1ecbch th\u1ebb t\u00edn d\u1ee5ng, trong \u0111\u00f3 ch\u1ec9 c\u00f3 500 giao d\u1ecbch gian l\u1eadn (chi\u1ebfm t\u1ef7 l\u1ec7 0.5%).\n\nN\u1ebfu m\u1ed9t m\u00f4 h\u00ecnh \u0111\u01a1n gi\u1ea3n \u0111o\u00e1n to\u00e0n b\u1ed9 100.000 giao d\u1ecbch \u0111\u1ec1u l\u00e0 \"B\u00ecnh th\u01b0\u1eddng\", m\u00f4 h\u00ecnh \u0111\u00f3 s\u1ebd \u0111\u1ea1t \u0111\u1ed9 ch\u00ednh x\u00e1c Accuracy l\u00ean t\u1edbi 99.5%.\n\nTuy nhi\u00ean, gi\u00e1 tr\u1ecb th\u1ef1c t\u1ebf c\u1ee7a m\u00f4 h\u00ecnh n\u00e0y \u0111\u1ed1i v\u1edbi ng\u00e2n h\u00e0ng b\u1eb1ng 0, b\u1edfi v\u00ec to\u00e0n b\u1ed9 500 k\u1ebb gian l\u1eadn \u0111\u00e3 l\u1ecdt qua tr\u00f3t l\u1ecdt, g\u00e2y th\u1ea5t tho\u00e1t t\u00e0i s\u1ea3n nghi\u00eam tr\u1ecdng.\n\nDo \u0111\u00f3, t\u01b0 duy c\u1ed1t l\u00f5i c\u1ee7a m\u1ed9t chuy\u00ean gia d\u1eef li\u1ec7u l\u00e0 chuy\u1ec3n d\u1ecbch t\u1eeb vi\u1ec7c t\u1ed1i \u01b0u h\u00f3a \u0111\u1ed9 ch\u00ednh x\u00e1c sang Cost-Sensitive Learning (H\u1ecdc c\u00f3 t\u00ednh to\u00e1n chi ph\u00ed r\u1ee7i ro). B\u1ea1n ph\u1ea3i x\u00e1c \u0111\u1ecbnh r\u00f5 ma tr\u1eadn chi ph\u00ed sai s\u00f3t:\n\nChi ph\u00ed c\u1ee7a m\u1ed9t l\u1ed7i False Positive (C\u1ea3nh b\u00e1o nh\u1ea7m m\u1ed9t kh\u00e1ch h\u00e0ng t\u1ed1t l\u00e0 gian l\u1eadn): Ng\u00e2n h\u00e0ng ch\u1ec9 m\u1ea5t m\u1ed9t cu\u1ed9c g\u1ecdi ch\u0103m s\u00f3c kh\u00e1ch h\u00e0ng ho\u1eb7c g\u00e2y m\u1ed9t ch\u00fat phi\u1ec1n to\u00e1i nh\u1ecf cho ng\u01b0\u1eddi d\u00f9ng.\n\nChi ph\u00ed c\u1ee7a m\u1ed9t l\u1ed7i False Negative (B\u1ecf l\u1ecdt m\u1ed9t k\u1ebb gian l\u1eadn th\u1eadt): Ng\u00e2n h\u00e0ng m\u1ea5t tr\u1eafng to\u00e0n b\u1ed9 s\u1ed1 ti\u1ec1n c\u1ee7a h\u1ea1n m\u1ee9c th\u1ebb t\u00edn d\u1ee5ng v\u00e0 ph\u1ea3i b\u1ed3i th\u01b0\u1eddng thi\u1ec7t h\u1ea1i.\n\nTrong tr\u01b0\u1eddng h\u1ee3p n\u00e0y, chi ph\u00ed c\u1ee7a l\u1ed7i False Negative \u0111\u1eaft g\u1ea5p h\u00e0ng ch\u1ee5c l\u1ea7n so v\u1edbi l\u1ed7i False Positive. M\u00f4 h\u00ecnh c\u1ee7a b\u1ea1n ph\u1ea3i \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf \u0111\u1ec3 \u01b0u ti\u00ean t\u1ed1i \u0111a \u0111\u1ed9 nh\u1ea1y (Recall) cho nh\u00f3m r\u1ee7i ro, ch\u1ea5p nh\u1eadn \u0111\u00e1nh \u0111\u1ed5i m\u1ed9t t\u1ef7 l\u1ec7 sai s\u1ed1 ch\u1ea5p nh\u1eadn \u0111\u01b0\u1ee3c \u1edf nh\u00f3m th\u00f4ng th\u01b0\u1eddng.\n![image.png](https:\/\/images.viblo.asia\/5f4c9d4a-d6e6-40dc-bdba-78d8749319a0.png)\n\n## 2. C\u00e1c K\u1ef9 Thu\u1eadt X\u1eed L\u00fd M\u1ea5t C\u00e2n B\u1eb1ng D\u1eef Li\u1ec7u Chuy\u00ean S\u00e2u\n\n\u0110\u1ec3 thu\u1eadt to\u00e1n h\u1ecdc m\u00e1y kh\u00f4ng b\u1ecb thi\u00ean l\u1ec7ch v\u1ec1 ph\u00eda nh\u00f3m chi\u1ebfm \u0111a s\u1ed1, k\u1ef9 s\u01b0 d\u1eef li\u1ec7u c\u1ea7n \u00e1p d\u1ee5ng c\u00e1c chi\u1ebfn l\u01b0\u1ee3c t\u00e1i c\u00e2n b\u1eb1ng c\u1ea5u tr\u00fac m\u1eabu:\n\nK\u1ef9 thu\u1eadt t\u1ed5ng h\u1ee3p m\u1eabu thi\u1ec3u s\u1ed1 (SMOTE & Borderline-SMOTE): Thay v\u00ec nh\u00e2n b\u1ea3n \u0111\u01a1n thu\u1ea7n c\u00e1c b\u1ea3n ghi r\u1ee7i ro v\u1ed1n d\u1ec5 d\u1eabn \u0111\u1ebfn hi\u1ec7n t\u01b0\u1ee3ng h\u1ecdc v\u1eb9t, thu\u1eadt to\u00e1n SMOTE t\u1ea1o ra c\u00e1c \u0111i\u1ec3m d\u1eef li\u1ec7u nh\u00e2n t\u1ea1o b\u1eb1ng c\u00e1ch n\u1ed9i suy gi\u1eefa c\u00e1c \u0111i\u1ec3m d\u1eef li\u1ec7u thi\u1ec3u s\u1ed1 l\u00e2n c\u1eadn trong kh\u00f4ng gian vector \u0111a chi\u1ec1u. Phi\u00ean b\u1ea3n n\u00e2ng cao Borderline-SMOTE ch\u1ec9 t\u1eadp trung t\u1ea1o m\u1eabu nh\u00e2n t\u1ea1o xung quanh ranh gi\u1edbi quy\u1ebft \u0111\u1ecbnh gi\u1eefa hai l\u1edbp, n\u01a1i c\u00e1c m\u00f4 h\u00ecnh d\u1ec5 b\u1ecb nh\u1ea7m l\u1eabn nh\u1ea5t.\n\nK\u1ef9 thu\u1eadt c\u1eaft t\u1ec9a m\u1eabu \u0111a s\u1ed1 b\u1eb1ng Tomek Links: Lo\u1ea1i b\u1ecf c\u00e1c c\u1eb7p \u0111i\u1ec3m d\u1eef li\u1ec7u thu\u1ed9c hai l\u1edbp kh\u00e1c nhau nh\u01b0ng l\u1ea1i n\u1eb1m qu\u00e1 s\u00e1t nhau trong kh\u00f4ng gian \u0111\u1eb7c tr\u01b0ng. Vi\u1ec7c lo\u1ea1i b\u1ecf b\u1ea3n ghi \u0111a s\u1ed1 trong c\u1eb7p n\u00e0y gi\u00fap \u0111\u01b0\u1eddng bi\u00ean ph\u00e2n c\u00e1ch gi\u1eefa hai nh\u00f3m tr\u1edf n\u00ean th\u00f4ng tho\u00e1ng v\u00e0 r\u00f5 r\u00e0ng h\u01a1n.\n\nHi\u1ec7u ch\u1ec9nh tr\u1ecdng s\u1ed1 ph\u00e2n l\u1edbp tr\u1ef1c ti\u1ebfp trong h\u00e0m m\u1ee5c ti\u00eau (Class Weights Balancing): \u0110\u00e2y l\u00e0 ph\u01b0\u01a1ng ph\u00e1p t\u1ed1i \u01b0u v\u00e0 ti\u1ebft ki\u1ec7m t\u00e0i nguy\u00ean nh\u1ea5t khi l\u00e0m vi\u1ec7c v\u1edbi d\u1eef li\u1ec7u quy m\u00f4 l\u1edbn. Thay v\u00ec thay \u0111\u1ed5i k\u00edch th\u01b0\u1edbc v\u1eadt l\u00fd c\u1ee7a t\u1eadp d\u1eef li\u1ec7u, b\u1ea1n truy\u1ec1n tham s\u1ed1 tr\u1ecdng s\u1ed1 ph\u1ea1t v\u00e0o thu\u1eadt to\u00e1n (v\u00ed d\u1ee5: tham s\u1ed1 scale_pos_weight trong XGBoost ho\u1eb7c class_weight='balanced' trong Scikit-Learn). Khi thu\u1eadt to\u00e1n \u0111o\u00e1n sai m\u1ed9t m\u1eabu r\u1ee7i ro, h\u00e0m m\u1ea5t m\u00e1t s\u1ebd ph\u1ea1t n\u1eb7ng g\u1ea5p 20 ho\u1eb7c 50 l\u1ea7n so v\u1edbi vi\u1ec7c \u0111o\u00e1n sai m\u1ed9t m\u1eabu th\u00f4ng th\u01b0\u1eddng.\n![image.png](https:\/\/images.viblo.asia\/80fdb8ed-bfe5-4cc0-bbb6-4a52dea03ba0.png)\n\n## 3. Tr\u00edch Xu\u1ea5t \u0110\u1eb7c Tr\u01b0ng H\u00e0nh Vi Kinh Doanh Cho B\u00e0i To\u00e1n D\u1ef1 B\u00e1o\n\nThu\u1eadt to\u00e1n ch\u1ec9 l\u00e0 c\u00f4ng c\u1ee5 t\u00ednh to\u00e1n, ch\u00ednh nh\u1eefng \u0111\u1eb7c tr\u01b0ng ph\u1ea3n \u00e1nh \u0111\u01b0\u1ee3c b\u1ea3n ch\u1ea5t h\u00e0nh vi ng\u01b0\u1eddi d\u00f9ng m\u1edbi quy\u1ebft \u0111\u1ecbnh kh\u1ea3 n\u0103ng ph\u00e2n lo\u1ea1i r\u1ee7i ro c\u1ee7a h\u1ec7 th\u1ed1ng.\n\nM\u1ed9t s\u1ed1 nh\u00f3m \u0111\u1eb7c tr\u01b0ng mang l\u1ea1i hi\u1ec7u qu\u1ea3 \u0111\u1ed9t ph\u00e1 trong c\u00e1c b\u00e0i to\u00e1n d\u1ef1 b\u00e1o r\u1ee7i ro:\n\n\u0110\u1eb7c tr\u01b0ng bi\u1ebfn \u0111\u1ed9ng theo c\u1eeda s\u1ed5 th\u1eddi gian (Rolling Trend Features): So s\u00e1nh t\u1ea7n su\u1ea5t v\u00e0 gi\u00e1 tr\u1ecb giao d\u1ecbch c\u1ee7a \u0111\u1ed1i t\u01b0\u1ee3ng trong 3 ng\u00e0y ho\u1eb7c 7 ng\u00e0y g\u1ea7n nh\u1ea5t so v\u1edbi m\u1ee9c trung b\u00ecnh trong 90 ng\u00e0y qu\u00e1 kh\u1ee9. M\u1ed9t s\u1ef1 t\u0103ng v\u1ecdt \u0111\u1ed9t ng\u1ed9t v\u1ec1 t\u1ea7n su\u1ea5t giao d\u1ecbch v\u00e0o l\u00fac \u0111\u00eam mu\u1ed9n ch\u00ednh l\u00e0 d\u1ea5u hi\u1ec7u c\u1ea3nh b\u00e1o \u0111\u1ecf c\u1ee7a h\u00e0nh vi gian l\u1eadn.\n![image.png](https:\/\/images.viblo.asia\/3e39aa8e-2caa-46ed-a96a-92381b62f8bb.png)\n\n\u0110\u1eb7c tr\u01b0ng kho\u1ea3ng c\u00e1ch th\u1eddi gian k\u1ec3 t\u1eeb s\u1ef1 ki\u1ec7n cu\u1ed1i (Recency Metrics): T\u00ednh s\u1ed1 ng\u00e0y ho\u1eb7c s\u1ed1 gi\u1edd tr\u00f4i qua k\u1ec3 t\u1eeb l\u1ea7n \u0111\u0103ng nh\u1eadp cu\u1ed1i, l\u1ea7n thanh to\u00e1n h\u00f3a \u0111\u01a1n cu\u1ed1i ho\u1eb7c l\u1ea7n t\u01b0\u01a1ng t\u00e1c g\u1ea7n nh\u1ea5t v\u1edbi b\u1ed9 ph\u1eadn h\u1ed7 tr\u1ee3. \u0110\u1ed1i v\u1edbi b\u00e0i to\u00e1n d\u1ef1 b\u00e1o kh\u00e1ch h\u00e0ng r\u1eddi b\u1ecf, s\u1ef1 gi\u00e3n c\u00e1ch b\u1ea5t th\u01b0\u1eddng gi\u1eefa c\u00e1c phi\u00ean ho\u1ea1t \u0111\u1ed9ng l\u00e0 ch\u1ec9 b\u00e1o s\u1edbm quan tr\u1ecdng nh\u1ea5t.\n\n\u0110\u1eb7c tr\u01b0ng t\u01b0\u01a1ng t\u00e1c t\u1ef7 l\u1ec7 (Interaction Ratios): T\u1ea1o c\u00e1c ch\u1ec9 s\u1ed1 \u0111o l\u01b0\u1eddng t\u1ef7 l\u1ec7 n\u1ee3 tr\u00ean thu nh\u1eadp, t\u1ef7 l\u1ec7 s\u1ed1 d\u01b0 kh\u1ea3 d\u1ee5ng tr\u00ean h\u1ea1n m\u1ee9c \u0111\u01b0\u1ee3c c\u1ea5p, ho\u1eb7c t\u1ef7 l\u1ec7 gi\u1eefa s\u1ed1 ti\u1ec1n ho\u00e0n tr\u1ea3 so v\u1edbi t\u1ed5ng gi\u00e1 tr\u1ecb \u0111\u00e3 mua s\u1eafm.\n![image.png](https:\/\/images.viblo.asia\/406fffc8-221d-428d-8d6a-4eb9927de601.png)\n\n## 4. L\u00e0m Ch\u1ee7 Thu\u1eadt To\u00e1n Ensemble Boosting V\u00e0 \u0110\u00e1nh Gi\u00e1 \u0110a Chi\u1ec1u\n\n\u0110\u1ed1i v\u1edbi d\u1eef li\u1ec7u d\u1ea1ng b\u1ea3ng trong doanh nghi\u1ec7p, c\u00e1c m\u00f4 h\u00ecnh c\u00e2y t\u0103ng c\u01b0\u1eddng \u0111\u1ed9 d\u1ed1c (Gradient Boosting Trees) lu\u00f4n gi\u1eef v\u1eefng v\u1ecb tr\u00ed th\u1ed1ng tr\u1ecb nh\u1edd kh\u1ea3 n\u0103ng x\u1eed l\u00fd phi tuy\u1ebfn t\u00ednh tuy\u1ec7t v\u1eddi v\u00e0 \u0111\u1ed9 b\u1ec1n b\u1ec9 tr\u01b0\u1edbc c\u00e1c \u0111i\u1ec3m d\u1eef li\u1ec7u nhi\u1ec5u.\n\nQuy tr\u00ecnh hu\u1ea5n luy\u1ec7n v\u00e0 \u0111\u00e1nh gi\u00e1 chu\u1ea9n m\u1ef1c:\n\nTh\u1eed nghi\u1ec7m c\u00e1c thu\u1eadt to\u00e1n h\u00e0ng \u0111\u1ea7u: Tri\u1ec3n khai \u0111\u1ed1i so\u00e1t song song gi\u1eefa XGBoost (t\u00ednh to\u00e1n chu\u1ea9n x\u00e1c), LightGBM (t\u1ed1c \u0111\u1ed9 x\u1eed l\u00fd si\u00eau nhanh tr\u00ean t\u1eadp d\u1eef li\u1ec7u h\u00e0ng ch\u1ee5c tri\u1ec7u d\u00f2ng) v\u00e0 CatBoost (x\u1eed l\u00fd t\u1ef1 \u0111\u1ed9ng bi\u1ebfn ph\u00e2n lo\u1ea1i xu\u1ea5t s\u1eafc m\u00e0 kh\u00f4ng c\u1ea7n nhi\u1ec1u b\u01b0\u1edbc ti\u1ec1n x\u1eed l\u00fd).\n\n\u0110\u00e1nh gi\u00e1 tr\u00ean \u0111\u01b0\u1eddng cong Precision-Recall Curve (PR-AUC): Khi d\u1eef li\u1ec7u m\u1ea5t c\u00e2n b\u1eb1ng nghi\u00eam tr\u1ecdng, ch\u1ec9 s\u1ed1 ROC-AUC c\u00f3 th\u1ec3 mang l\u1ea1i c\u1ea3m gi\u00e1c l\u1ea1c quan gi\u1ea3 t\u1ea1o do s\u1ed1 l\u01b0\u1ee3ng m\u1eabu \u00e2m t\u00ednh qu\u00e1 l\u1edbn. Chuy\u00ean gia d\u1eef li\u1ec7u b\u1eaft bu\u1ed9c ph\u1ea3i s\u1eed d\u1ee5ng bi\u1ec3u \u0111\u1ed3 Precision-Recall Curve v\u00e0 t\u00ednh di\u1ec7n t\u00edch d\u01b0\u1edbi \u0111\u01b0\u1eddng cong PR-AUC \u0111\u1ec3 \u0111o l\u01b0\u1eddng ch\u00ednh x\u00e1c s\u1ef1 \u0111\u00e1nh \u0111\u1ed5i gi\u1eefa \u0111\u1ed9 ch\u00ednh x\u00e1c v\u00e0 \u0111\u1ed9 bao ph\u1ee7 c\u1ee7a l\u1edbp thi\u1ec3u s\u1ed1.\n\nHi\u1ec7u ch\u1ec9nh ng\u01b0\u1ee1ng ph\u00e2n lo\u1ea1i (Probability Threshold Tuning): Ng\u01b0\u1ee1ng ph\u00e2n lo\u1ea1i m\u1eb7c \u0111\u1ecbnh c\u1ee7a c\u00e1c thu\u1eadt to\u00e1n lu\u00f4n l\u00e0 0.5. Tuy nhi\u00ean, trong b\u00e0i to\u00e1n r\u1ee7i ro, vi\u1ec7c h\u1ea1 ng\u01b0\u1ee1ng ph\u00e2n lo\u1ea1i xu\u1ed1ng 0.2 ho\u1eb7c 0.3 c\u00f3 th\u1ec3 gi\u00fap b\u1ea1n b\u1eaft tr\u1ecdn 90% s\u1ed1 l\u01b0\u1ee3ng kh\u00e1ch h\u00e0ng c\u00f3 nguy c\u01a1 b\u00f9ng n\u1ee3, mang l\u1ea1i gi\u00e1 tr\u1ecb b\u1ea3o to\u00e0n v\u1ed1n t\u1ed1i \u0111a cho doanh nghi\u1ec7p.\n![image.png](https:\/\/images.viblo.asia\/9bf812ec-efa4-4bbb-8c3e-a031b3e58b75.png)\n\n\u0110\u1ec3 t\u1ef1 tay l\u00e0m ch\u1ee7 to\u00e0n b\u1ed9 c\u00e1c k\u1ef9 thu\u1eadt ph\u00e2n t\u00edch r\u1ee7i ro n\u00e2ng cao n\u00e0y tr\u00ean c\u00e1c t\u1eadp d\u1eef li\u1ec7u t\u00e0i ch\u00ednh th\u1ef1c t\u1ebf v\u00e0 s\u1edf h\u1eefu ph\u01b0\u01a1ng ph\u00e1p lu\u1eadn chu\u1ea9n x\u00e1c t\u1eeb chuy\u00ean gia, vi\u1ec7c [tham gia ch\u01b0\u01a1ng tr\u00ecnh Data Science](https:\/\/cole.vn\/san-pham\/khoa-hoc-du-lieu-data-science-895) n\u00e0y s\u1ebd mang l\u1ea1i cho b\u1ea1n m\u00f4i tr\u01b0\u1eddng th\u1ef1c h\u00e0nh to\u00e0n di\u1ec7n, gi\u00fap b\u1ea1n nhanh ch\u00f3ng chuy\u1ec3n h\u00f3a t\u01b0 duy k\u1ef9 thu\u1eadt th\u00e0nh c\u00e1c gi\u1ea3i ph\u00e1p kinh doanh mang l\u1ea1i l\u1ee3i nhu\u1eadn th\u1ef1c t\u1ebf.\n\n\n> Gi\u1ea3i quy\u1ebft b\u00e0i to\u00e1n d\u1eef li\u1ec7u m\u1ea5t c\u00e2n b\u1eb1ng kh\u00f4ng ph\u1ea3i l\u00e0 m\u1ed9t th\u1ee7 thu\u1eadt to\u00e1n h\u1ecdc \u0111\u01a1n thu\u1ea7n, m\u00e0 l\u00e0 s\u1ef1 k\u1ebft h\u1ee3p nhu\u1ea7n nhuy\u1ec5n gi\u1eefa t\u01b0 duy qu\u1ea3n tr\u1ecb r\u1ee7i ro kinh doanh, k\u1ef9 thu\u1eadt tr\u00edch xu\u1ea5t \u0111\u1eb7c tr\u01b0ng s\u1eafc b\u00e9n v\u00e0 s\u1ef1 am hi\u1ec3u s\u00e2u s\u1eafc v\u1ec1 h\u00e0nh vi c\u1ee7a thu\u1eadt to\u00e1n. N\u1eafm v\u1eefng ph\u01b0\u01a1ng ph\u00e1p lu\u1eadn Cost-Sensitive Learning ch\u00ednh l\u00e0 v\u0169 kh\u00ed m\u1ea1nh nh\u1ea5t gi\u00fap b\u1ea1n t\u1ea1o ra nh\u1eefng t\u00e1c \u0111\u1ed9ng kinh t\u1ebf \u0111o l\u01b0\u1eddng \u0111\u01b0\u1ee3c cho t\u1ed5 ch\u1ee9c.\n\nH\u00e3y r\u00e0 so\u00e1t l\u1ea1i ngay c\u00e1c m\u00f4 h\u00ecnh ph\u00e2n lo\u1ea1i hi\u1ec7n t\u1ea1i c\u1ee7a b\u1ea1n: B\u1ea1n c\u00f3 \u0111ang b\u1ecb \u0111\u00e1nh l\u1eeba b\u1edfi ch\u1ec9 s\u1ed1 Accuracy? B\u1ea1n \u0111\u00e3 th\u1eed nghi\u1ec7m vi\u1ec7c \u0111i\u1ec1u ch\u1ec9nh ng\u01b0\u1ee1ng ph\u00e2n lo\u1ea1i theo ma tr\u1eadn chi ph\u00ed t\u00e0i ch\u00ednh ch\u01b0a? H\u00e3y \u00e1p d\u1ee5ng ngay nh\u1eefng chi\u1ebfn l\u01b0\u1ee3c tr\u00ean v\u00e0o d\u1ef1 \u00e1n th\u1ef1c t\u1ebf \u0111\u1ec3 t\u1ed1i \u01b0u h\u00f3a hi\u1ec7u qu\u1ea3 v\u1eadn h\u00e0nh v\u00e0 kh\u1eb3ng \u0111\u1ecbnh n\u0103ng l\u1ef1c chuy\u00ean m\u00f4n v\u01b0\u1ee3t tr\u1ed9i c\u1ee7a m\u00ecnh!","published_at":"2026-09-14T03:40:29.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T03:41:03.000000Z","edited_at":"2026-09-14T03:39:41.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":12,"points":0,"views_count":1,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/9bf812ec-efa4-4bbb-8c3e-a031b3e58b75.png","user":{"data":{"id":190335,"url":"https:\/\/viblo.asia\/u\/quochuy247","avatar":"b789db50-333f-4d2d-807b-10acb2832e63.jpg","name":"Huy Qu\u1ed1c","username":"quochuy247","followers_count":6,"reputation":89,"posts_count":58,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"data-science","name":"data science"}]},"commentators":{"data":[]}},{"id":106643,"title":"T\u1ea1i sao Go (Golang) kh\u00f4ng t\u00edch h\u1ee3p s\u1eb5n m\u1ed9t DI Container","slug":"ymJXDWEqJkq","url":"https:\/\/viblo.asia\/p\/tai-sao-go-golang-khong-tich-hop-san-mot-di-container-ymJXDWEqJkq","user_id":182653,"moderation":null,"transliterated":"tai-sao-go-golang-khong-tich-hop-san-mot-di-container","contents_short":"Ng\u00f4n ng\u1eef Go (Golang) kh\u00f4ng t\u00edch h\u1ee3p s\u1eb5n m\u1ed9t DI Container \"ho\u00e0nh tr\u00e1ng\" nh\u01b0 Spring Framework (Java) hay NestJS (TypeScript) v\u00ec \u0111i\u1ec1u n\u00e0y \u0111i ng\u01b0\u1ee3c l\u1ea1i ho\u00e0n to\u00e0n v\u1edbi tri\u1ebft l\u00fd c\u1ed1t l\u00f5i c\u1ee7a ng\u00f4n ng\u1eef: \u01afu ti\u00ean s\u1ef1 t\u01b0\u1eddng minh, \u0111\u01a1n gi\u1ea3n v\u00e0 hi\u1ec7u n\u0103ng cao.\n\nTrong Go, c\u1ed9ng \u0111\u1ed3ng th\u01b0\u1eddng \u01b0a chu\u1ed9ng vi\u1ec7c t\u1ef1 tay k\u1ebft n\u1ed1i c\u00e1c th\u00e0nh ph\u1ea7n ph\u1ee5 thu\u1ed9c (Explicit\/Manual DI) thay v\u00ec \u0111\u1ec3 m\u1ed9t b\u1ed9 khung (framework) t\u1ef1 \u0111\u1ed9ng \"ph\u00e9p ...","contents":"Ng\u00f4n ng\u1eef Go (Golang) kh\u00f4ng t\u00edch h\u1ee3p s\u1eb5n m\u1ed9t DI Container \"ho\u00e0nh tr\u00e1ng\" nh\u01b0 Spring Framework (Java) hay NestJS (TypeScript) v\u00ec \u0111i\u1ec1u n\u00e0y \u0111i ng\u01b0\u1ee3c l\u1ea1i ho\u00e0n to\u00e0n v\u1edbi tri\u1ebft l\u00fd c\u1ed1t l\u00f5i c\u1ee7a ng\u00f4n ng\u1eef: \u01afu ti\u00ean s\u1ef1 t\u01b0\u1eddng minh, \u0111\u01a1n gi\u1ea3n v\u00e0 hi\u1ec7u n\u0103ng cao.\n\nTrong Go, c\u1ed9ng \u0111\u1ed3ng th\u01b0\u1eddng \u01b0a chu\u1ed9ng vi\u1ec7c t\u1ef1 tay k\u1ebft n\u1ed1i c\u00e1c th\u00e0nh ph\u1ea7n ph\u1ee5 thu\u1ed9c (Explicit\/Manual DI) thay v\u00ec \u0111\u1ec3 m\u1ed9t b\u1ed9 khung (framework) t\u1ef1 \u0111\u1ed9ng \"ph\u00e9p thu\u1eadt\" l\u00e0m h\u1ed9.\n\n---\n\n## 1. Tri\u1ebft l\u00fd thi\u1ebft k\u1ebf c\u1ee7a Go tr\u00e1i ng\u01b0\u1ee3c v\u1edbi Magic (Ph\u00e9p thu\u1eadt)\n\nC\u00e1c DI Container ho\u00e0nh tr\u00e1ng th\u01b0\u1eddng ho\u1ea1t \u0111\u1ed9ng d\u1ef1a tr\u00ean c\u01a1 ch\u1ebf Runtime Reflection (ph\u1ea3n chi\u1ebfu l\u00fac ch\u1ea1y) ho\u1eb7c qu\u00e9t m\u00e3 ngu\u1ed3n \u0111\u1ec3 t\u1ef1 \u0111\u1ed9ng t\u00ecm v\u00e0 ti\u00eam (inject) c\u00e1c bean\/service.\n\n*   **T\u01b0\u1eddng minh t\u1ed1t h\u01a1n \u1ea9n gi\u1ea5u (*Explicit is better than implicit*):** Go mu\u1ed1n b\u1ea1n nh\u00ecn v\u00e0o h\u00e0m `main()` l\u00e0 bi\u1ebft ngay service n\u00e0o \u0111ang d\u00f9ng repository n\u00e0o, c\u01a1 s\u1edf d\u1eef li\u1ec7u n\u00e0o \u0111ang \u0111\u01b0\u1ee3c truy\u1ec1n v\u00e0o \u0111\u00e2u. Vi\u1ec7c gi\u1ea5u c\u00e1c m\u1ed1i li\u00ean k\u1ebft n\u00e0y v\u00e0o m\u1ed9t chi\u1ebfc \"h\u1ed9p \u0111en\" (DI Container) khi\u1ebfn code tr\u1edf n\u00ean kh\u00f3 \u0111\u1ecdc v\u00e0 kh\u00f3 d\u00f2 l\u1ed7i (debug) h\u01a1n \u0111\u1ed1i v\u1edbi m\u1ed9t l\u1eadp tr\u00ecnh vi\u00ean Go.\n*   **L\u1ed7i l\u00fac bi\u00ean d\u1ecbch t\u1ed1t h\u01a1n l\u1ed7i l\u00fac ch\u1ea1y:** N\u1ebfu b\u1ea1n qu\u00ean c\u1ea5u h\u00ecnh m\u1ed9t bean trong Spring, \u1ee9ng d\u1ee5ng c\u00f3 th\u1ec3 v\u1eabn build th\u00e0nh c\u00f4ng nh\u01b0ng s\u1ebd s\u1eadp ngay khi kh\u1edfi \u0111\u1ed9ng (Runtime crash). V\u1edbi Go, vi\u1ec7c truy\u1ec1n thi\u1ebfu tham s\u1ed1 trong h\u00e0m kh\u1edfi t\u1ea1o (Constructor) s\u1ebd b\u1ecb tr\u00ecnh bi\u00ean d\u1ecbch ch\u1eb7n l\u1ea1i ngay l\u1eadp t\u1ee9c.\n\n---\n\n## 2. Tr\u00e1nh suy gi\u1ea3m hi\u1ec7u n\u0103ng kh\u00f4ng c\u1ea7n thi\u1ebft\n\n*   **Chi ph\u00ed c\u1ee7a Reflection:** Vi\u1ec7c qu\u00e9t c\u00e1c struct v\u00e0 dynamic type l\u00fac runtime \u0111\u1ec3 t\u1ef1 \u0111\u1ed9ng ti\u00eam service ti\u00eau t\u1ed1n r\u1ea5t nhi\u1ec1u t\u00e0i nguy\u00ean h\u1ec7 th\u1ed1ng v\u00e0 l\u00e0m ch\u1eadm t\u1ed1c \u0111\u1ed9 kh\u1edfi \u0111\u1ed9ng c\u1ee7a \u1ee9ng d\u1ee5ng.\n*   **Th\u1eddi gian bi\u00ean d\u1ecbch si\u00eau t\u1ed1c:** M\u1ed9t trong nh\u1eefng ni\u1ec1m t\u1ef1 h\u00e0o c\u1ee7a Go l\u00e0 t\u1ed1c \u0111\u1ed9 build t\u00ednh b\u1eb1ng mili-gi\u00e2y. Vi\u1ec7c th\u00eam c\u00e1c b\u1ed9 ti\u1ec1n x\u1eed l\u00fd ho\u1eb7c container ph\u1ee9c t\u1ea1p v\u00e0o l\u00f5i ng\u00f4n ng\u1eef s\u1ebd l\u00e0m m\u1ea5t \u0111i l\u1ee3i th\u1ebf n\u00e0y.\n\n---\n\n## 3. H\u1ec7 th\u1ed1ng Type v\u00e0 Interface c\u1ee7a Go c\u1ef1c k\u1ef3 t\u1ed1i gi\u1ea3n\n\nGo kh\u00f4ng \u0111\u1ecbnh ngh\u0129a kh\u00e1i ni\u1ec7m \"Bean\" hay \"Service\" \u1edf t\u1ea7ng ng\u00f4n ng\u1eef nh\u01b0 Java. Thay v\u00e0o \u0111\u00f3, Go s\u1eed d\u1ee5ng c\u01a1 ch\u1ebf Implicit Interfaces (Duck typing).\n\nCh\u00ednh nh\u1edd vi\u1ec7c m\u1ed9t struct t\u1ef1 \u0111\u1ed9ng th\u1ecfa m\u00e3n m\u1ed9t interface m\u00e0 kh\u00f4ng c\u1ea7n t\u1eeb kh\u00f3a `implements`, l\u1eadp tr\u00ecnh vi\u00ean Go c\u00f3 th\u1ec3 d\u1ec5 d\u00e0ng vi\u1ebft m\u00e3 ki\u1ec3m th\u1eed (Unit Test) b\u1eb1ng c\u00e1ch mock interface ngay l\u1eadp t\u1ee9c m\u00e0 kh\u00f4ng c\u1ea7n \u0111\u1ebfn s\u1ef1 tr\u1ee3 gi\u00fap c\u1ee7a m\u1ed9t DI Container c\u1ed3ng k\u1ec1nh [cite: 1, 2, 3].\n\n---\n\n## So s\u00e1nh c\u00e1ch ti\u1ebfp c\u1eadn gi\u1eefa Go v\u00e0 c\u00e1c Framework truy\u1ec1n th\u1ed1ng\n\n| \u0110\u1eb7c \u0111i\u1ec3m | Go (Manual DI) | Java\/TS (DI Container\/Framework) |\n| :--- | :--- | :--- |\n| **C\u00e1ch k\u1ebft n\u1ed1i** | Kh\u1edfi t\u1ea1o t\u01b0\u1eddng minh b\u1eb1ng code `NewService(db)` | T\u1ef1 \u0111\u1ed9ng qu\u00e9t th\u00f4ng qua `@Autowired`, `@Inject` |\n| **Th\u1eddi \u0111i\u1ec3m ph\u00e1t hi\u1ec7n l\u1ed7i** | Ngay khi vi\u1ebft code \/ Bi\u00ean d\u1ecbch (*Compile-time*) | Khi \u1ee9ng d\u1ee5ng ch\u1ea1y (*Run-time*) |\n| **\u0110\u1ed9 t\u01b0\u1eddng minh** | R\u1ea5t cao, d\u1ec5 trace code b\u1eb1ng IDE | Th\u1ea5p, c\u00e1c li\u00ean k\u1ebft b\u1ecb \u1ea9n b\u00ean trong container |\n| **T\u1ed1c \u0111\u1ed9 kh\u1edfi \u0111\u1ed9ng** | G\u1ea7n nh\u01b0 ngay l\u1eadp t\u1ee9c | M\u1ea5t v\u00e0i gi\u00e2y \u0111\u1ebfn v\u00e0i ph\u00fat \u0111\u1ec3 qu\u00e9t c\u1ea5u h\u00ecnh |\n\n---\n\n## C\u00e1c gi\u1ea3i ph\u00e1p thay th\u1ebf n\u1ebfu d\u1ef1 \u00e1n Go qu\u00e1 l\u1edbn\n\nN\u1ebfu h\u1ec7 th\u1ed1ng c\u1ee7a b\u1ea1n ph\u00e1t tri\u1ec3n l\u00ean \u0111\u1ebfn h\u00e0ng tr\u0103m service v\u00e0 vi\u1ec7c vi\u1ebft tay `NewService()` trong h\u00e0m main tr\u1edf th\u00e0nh m\u1ed9t c\u01a1n \u00e1c m\u1ed9ng c\u1ef1c nh\u1ecdc, c\u1ed9ng \u0111\u1ed3ng Go c\u00f3 s\u1eb5n c\u00e1c th\u01b0 vi\u1ec7n b\u00ean th\u1ee9 ba gi\u00fap gi\u1ea3i quy\u1ebft v\u1ea5n \u0111\u1ec1 n\u00e0y theo \u0111\u00fang \"gu\" c\u1ee7a Go:\n\n*   **Google Wire:** \u0110\u00e2y l\u00e0 c\u00f4ng c\u1ee5 \u0111\u01b0\u1ee3c \u01b0a chu\u1ed9ng nh\u1ea5t v\u00ec n\u00f3 \u00e1p d\u1ee5ng ph\u01b0\u01a1ng ph\u00e1p Compile-time DI. B\u1ea1n ch\u1ec9 c\u1ea7n \u0111\u1ecbnh ngh\u0129a c\u00e1c nh\u00e0 cung c\u1ea5p (Providers), Wire s\u1ebd t\u1ef1 \u0111\u1ed9ng sinh ra m\u00e3 ngu\u1ed3n Go (*code generation*) k\u1ebft n\u1ed1i c\u00e1c service m\u1ed9t c\u00e1ch t\u01b0\u1eddng minh. Code v\u1eabn ch\u1ea1y m\u01b0\u1ee3t m\u00e0, kh\u00f4ng d\u00f9ng reflection v\u00e0 l\u1ed7i v\u1eabn \u0111\u01b0\u1ee3c b\u1eaft ngay khi build.\n*   **Uber Dig ho\u1eb7c Uber Fx:** B\u1ed9 \u0111\u00f4i th\u01b0 vi\u1ec7n m\u1ea1nh m\u1ebd t\u1eeb Uber s\u1eed d\u1ee5ng c\u01a1 ch\u1ebf Reflection d\u00e0nh cho c\u00e1c \u1ee9ng d\u1ee5ng c\u00f3 h\u1ec7 sinh th\u00e1i service si\u00eau l\u1edbn, gi\u00fap qu\u1ea3n l\u00fd to\u00e0n b\u1ed9 v\u00f2ng \u0111\u1eddi (*lifecycle*) c\u1ee7a \u1ee9ng d\u1ee5ng m\u1ed9t c\u00e1ch t\u1ef1 \u0111\u1ed9ng.\n\n---\n\n## \ud83d\udca1 L\u1eddi K\u1ebft\n\nT\u00f3m l\u1ea1i, Go kh\u00f4ng thi\u1ebfu DI Container v\u00ec h\u1ecd \"qu\u00ean\" l\u00e0m, m\u00e0 v\u00ec h\u1ecd ch\u1ee7 \u0111\u1ed9ng t\u1eeb ch\u1ed1i s\u1ef1 c\u1ed3ng k\u1ec1nh \u0111\u1ec3 gi\u1eef cho m\u00e3 ngu\u1ed3n c\u1ee7a b\u1ea1n lu\u00f4n s\u1ea1ch s\u1ebd, r\u00f5 r\u00e0ng v\u00e0 ch\u1ea1y nhanh nh\u1ea5t c\u00f3 th\u1ec3.","published_at":"2026-09-14T03:33:52.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-09-14T23:00:08.000000Z","edited_at":"2026-09-14T03:34:06.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":4,"points":1,"views_count":27,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/b064cf41-1100-485c-8f9e-2fde2ad284e3.png","user":{"data":{"id":182653,"url":"https:\/\/viblo.asia\/u\/hhoang","avatar":"6024932a-5822-4ab3-8a0a-67ce58832e70.jpg","name":"C\u00f4 G\u00e1i IT","username":"hhoang","followers_count":173,"reputation":13114,"posts_count":1216,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"container","name":"container"}]},"commentators":{"data":[]}}],"meta":{"pagination":{"total":50565,"count":20,"per_page":20,"current_page":1,"total_pages":2529,"links":{"next":"http:\/\/viblo.asia\/posts?page=2"}}}}