နားလည်ထားရမယ့် အချက်
AI coding assistant တွေဟာ feature တစ်ခု၊ တစ်ခါတလေ app တစ်ခုလုံးကိုတောင် မိနစ်ပိုင်းအတွင်း ဖန်တီးပေးနိုင်ပါတယ်။ ဒီမြန်ဆန်မှုက အမှန်ပါပဲ၊ ဒါပေမယ့် workflow ထဲက risk ရှိရာနေရာကို ရွှေ့ပေးလိုက်ပါတယ် - code ရေးရာကနေ ကိုယ်ရေးမထားတဲ့ code ကို review လုပ်ရာဆီ။
AI က code ကို ဖန်တီး/ပြောင်းလဲသည်
Feature request တစ်ခု (သို့) prompt တစ်ခုကနေ route၊ component၊ query တွေကို auto ဖန်တီးပေးပါတယ်။
လူတစ်ဦးက အမှန်တကယ် diff ကို review လုပ်သည်
AI ရဲ့ ကိုယ်ပိုင် summary မဟုတ်ဘဲ ပြောင်းလဲထားတဲ့ line တစ်ကြောင်းချင်းကို လူစိမ်း ရေးထားသလို ဖတ်ပါ၊ တကယ့်တကယ် လူစိမ်းရေးထားတာလည်း ဖြစ်ပါတယ်။
Commit လုပ်ပြီး preview deployment ဖွင့်သည်
Production ကို မထိဘဲ production နဲ့ တူညီအောင်ပြုလုပ်ထားတဲ့ isolated environment မှာ ပြောင်းလဲမှု build ဖြစ်ပါတယ်။
Preview ကို အမှန်တကယ် behavior နဲ့ test လုပ်သည်
နှိပ်ကြည့်ပါ၊ failure case တွေကို တမင် ဖြစ်စေကြည့်ပါ၊ working demo တစ်ခုတည်းက မသက်သေပြနိုင်တဲ့ concern တွေကို စစ်ဆေးပါ။
Production ဆီ promote လုပ်သည်
Review နဲ့ preview testing နှစ်ခုလုံး အောင်မြင်မှသာ - 'ငါစမ်းကြည့်တုန်းက အလုပ်ဖြစ်တယ်' ဆိုပြီး မဟုတ်ပါ။
အလုပ်ဖြစ်နေတဲ့ preview က ထင်ထားသလောက် မပြပါ
Secret ပေါက်ကြားနေလား၊ authentication တကယ် enforce ဖြစ်နေလား၊ database permission မှန်ကန်စွာ scope လုပ်ထားလား၊ error/rate limit/cost ကို အမှန်တကယ် traffic အောက်မှာ ကောင်းစွာ ကိုင်တွယ်နိုင်လား - ဒါတွေအကြောင်း ဘာမှ မပြောပါဘူး။
AI-powered app တွေမှာ architecture-specific risk တစ်ခု ထပ်ပေါ်လာပါတယ် - frontend က backend ကို ခေါ်ပြီး backend က AI API (သို့) local model ကို ခေါ်ပါတယ်။ ဒီ service ရဲ့ API key ဟာ browser ဆီ လုံးဝ ရောက်လို့ မရပါဘူး - frontend code ထဲမှာ ထည့်ထားရင် ဘယ်သူမဆို network tab ကနေ ဆွဲထုတ်ပြီး ကိုယ့် account အောက်မှာ အလွဲသုံးစား လုပ်နိုင်ပါတယ်။
Streaming response, အချိန်ကြာမြင့်တဲ့ generation task, request တစ်ခုချင်းစီရဲ့ cost, rate limit - ဒါတွေအားလုံးကို AI feature တစ်ခု production-ready ဖြစ်ခင် ရှင်းလင်းစွာ ကိုင်တွယ်ထားရမယ်၊ live ဖြစ်ပြီးမှ ရှာတွေ့တာ မဟုတ်ပါဘူး။
AI APP DEPLOYMENT ARCHITECTURE
------------------------------
AI APP DEPLOYMENT ARCHITECTURE
-----------------------------------------
[ User's Browser ]
|
v
[ Frontend (React / Next.js) ] <-- no AI API key here, ever
|
v
[ Backend / API server ]
|
|-- holds the AI API key (server-side env var only)
|
+--> [ AI API / local model ] (OpenAI, Anthropic, etc.)
|
+--> [ Managed Database ]
|
+--> [ Vector Store ] (embeddings for RAG)
|
+--> [ Object Storage ] (uploads, generated assets)လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
'chat with your data' feature ထည့်ဖို့ AI assistant ကို သုံးလိုက်တယ်ဆိုပါစို့။ Backend route၊ frontend component၊ database query ကို ဖန်တီးပေးပြီး preview deployment မှာ အားလုံး အလုပ်ဖြစ်နေပါတယ်။ Production မတင်ခင် AI-generated ပြောင်းလဲမှုတိုင်း လိုအပ်တဲ့ review အတိုင်း လိုက်လျှောက်ကြည့်ပါ။
Diff တစ်ခုလုံးကို ဖတ်ပါ
ပြောင်းလဲထားတဲ့ file တိုင်းကို လူစိမ်းရေးထားသလို ဖွင့်ဖတ်ပါ - တကယ်ပဲ လူစိမ်းရေးထားတာပါ။ AI ရဲ့ ကိုယ်ပိုင် summary ကို မမှီခိုပါနဲ့။
API key server-side မှာသာ ရှိကြောင်း သေချာစစ်ပါ
AI API key ကို server-side environment variable ကနေသာ ဖတ်သင့်ပြီး browser ဆီ ship ဖြစ်မယ့် file ဘယ်ခုမှာမှ မပေါ်သင့်ပါ။
Auth တကယ် enforce ဖြစ်လား စစ်ပါ
Route အသစ်ပေါ်က authentication middleware ဟာ request တိုင်းမှာ wire up လုပ်ပြီး ခေါ်နေလား စစ်ပါ၊ တစ်နေရာမှာ define ပြီး မေ့ထားတာ မဟုတ်စေရပါ။
Database query ကို ဘယ်လို scope လုပ်ထားလဲ စစ်ပါ
'user ရဲ့ data ကို fetch ပါ' လို့ တောင်းဆိုရင် assistant က လူတိုင်းရဲ့ data ကို fetch လောက်အောင် ကျယ်ပြန့်တဲ့ query ရေးတတ်ပါတယ်။ Table နာမည်တစ်ခုတည်းမက WHERE clause ကို ဖတ်ပါ။
Failure ကို တမင်ဖြစ်စေပါ
Database ကို ဖြတ်တောက်တာ (သို့) format မမှန်တဲ့ request ပို့ပါ၊ user က stack trace (သို့) internal file path မဟုတ်ဘဲ generic error message ကိုပဲ မြင်ရမလား စစ်ပါ။
Timeout, rate limit, logging ကို စစ်ပါ
AI API call မှာ timeout နဲ့ rate limit ပါကြောင်း၊ log တွေက API key (သို့) user prompt အပြည့်အစုံကို မမှတ်ဘဲ debug လုပ်လောက်အောင် ပြည့်စုံကြောင်း သေချာစေပါ။
ဒီ check တွေအားလုံး အောင်မြင်မှသာ 'preview မှာ အလုပ်ဖြစ်တယ်' ဆိုတာ app က production traffic အတွက် အသင့်ဖြစ်တယ်လို့ တကယ်ဆိုလိုပါတယ်။
AI-Generated App တစ်ခု Deploy မလုပ်ခင်
အတူတူ စမ်းရေးကြည့်မယ်
function reviewGeneratedCode(code) {
const findings = [];
const keyPattern = /(sk-[a-zA-Z0-9]{20,}|api[_-]?key\s*[:=]\s*["'][^"']{10,}["'])/i;
if (keyPattern.test(code)) {
findings.push("Possible hardcoded API key found in code");
}
const callsExternalApi = /fetch\(|axios\.(get|post)/.test(code);
const hasAuthCheck = /requireAuth|isAuthenticated|checkAuth|session\.user/.test(code);
if (callsExternalApi && !hasAuthCheck) {
findings.push("Route calls an external API but has no visible auth check");
}
const leaksStack = /res\.(send|json)\(\s*\{?\s*.*err(or)?\.stack/.test(code);
if (leaksStack) {
findings.push("Error handler sends the raw stack trace to the client");
}
const hasCatch = /catch\s*\(/.test(code);
if (callsExternalApi && !hasCatch) {
findings.push("External API call has no error handling");
}
const hasTimeout = /timeout|AbortController/i.test(code);
if (callsExternalApi && !hasTimeout) {
findings.push("External API call has no timeout configured");
}
return findings.length
? findings
: ["No red flags found - safe to proceed to preview deploy"];
}
const riskySnippet = `
const OPENAI_KEY = "sk-abcdefghijklmnopqrstuvwx1234567890";
app.post("/api/chat", async (req, res) => {
const response = await fetch("https://api.openai.com/v1/chat/completions", {
headers: { Authorization: \`Bearer \${OPENAI_KEY}\` },
method: "POST",
body: JSON.stringify(req.body),
});
const data = await response.json();
res.json(data);
});
`;
const cleanSnippet = `
app.post("/api/chat", requireAuth, async (req, res) => {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 8000);
try {
const response = await fetch("https://api.openai.com/v1/chat/completions", {
headers: { Authorization: \`Bearer \${process.env.OPENAI_API_KEY}\` },
method: "POST",
body: JSON.stringify(req.body),
signal: controller.signal,
});
const data = await response.json();
res.json(data);
} catch (err) {
res.status(500).json({ error: "Something went wrong. Please try again." });
} finally {
clearTimeout(timeoutId);
}
});
`;
console.log("Risky snippet findings:");
console.log(reviewGeneratedCode(riskySnippet));
console.log("\nClean snippet findings:");
console.log(reviewGeneratedCode(cleanSnippet));reviewGeneratedCode() ကို risky snippet နဲ့ clean snippet နှစ်ခုလုံးအပေါ် run ကြည့်တဲ့အခါ -
Risky snippet findings:
[
'Possible hardcoded API key found in code',
'Route calls an external API but has no visible auth check',
'External API call has no error handling',
'External API call has no timeout configured'
]
Clean snippet findings:
[ 'No red flags found - safe to proceed to preview deploy' ]၅ မိနစ် စမ်းကြည့်
reviewGeneratedCode() function ကို ကိုယ်တိုင် ချဲ့ကြည့်ပါ - database query string ထဲမှာ 'SELECT *' ပါနေရင် flag လုပ်မယ့် check တစ်ခု ထပ်ထည့်ပါ။ ပြီးရင် တတိယ snippet တစ်ခု ရေးကြည့်ပါ - auth check ပါပေမယ့် API key ကို frontend component file ထဲမှာ ထားခဲ့တဲ့ snippet ပါ - function က ဒါကို မှန်ကန်စွာ ဖမ်းမိမလား?
သတိလေးတစ်ချက်
Diff ရဲ့ အမှန်တကယ် line တွေကို ဖတ်မယ့်အစား AI ရဲ့ ကိုယ်ပိုင် summary ကိုသာ ယုံကြည်တာ - summary က အရေးကြီးဆုံး line ကို ကျော်ချန်ထားနိုင်ပါတယ်။
Preview မှာ အလုပ်ဖြစ်တဲ့ feature ကို production-ready လို့ ယူဆတာ - preview testing က real load၊ real rate limit၊ real cost ကို ရှားရှားပါးပါး ပဲ စမ်းလေ့ရှိပါတယ်။
The Twelve-Factor App - Config — Cloud & Deployment
Cloud & Deployment Glossary — အသုံးများသော ဝေါဟာရများ
| Term | အဓိပ္ပာယ် |
|---|---|
| Deployment | Code ကို သင့်ကွန်ပျူတာကနေ user တွေ တကယ်သုံးလို့ရမယ့် server ပေါ်မှာ run အောင် ယူဆောင်သွားတဲ့ process။ |
| Production | စစ်မှန်တဲ့ user တွေ အမှန်တကယ် အသုံးပြုနေတဲ့ live environment၊ testing (သို့) development environment နဲ့ ဆန့်ကျင်ဘက်။ |
| Staging | Release မလုပ်ခင် နောက်ဆုံး testing အတွက် သုံးတဲ့၊ production နဲ့ တတ်နိုင်သမျှ တူညီအောင် ပြုလုပ်ထားတဲ့ pre-production environment။ |
| Hosting | Application တစ်ခုကို run နေအောင်၊ online ကနေ ရောက်နိုင်အောင် လိုအပ်တဲ့ server နဲ့ infrastructure ကို ပေးအပ်တဲ့ service။ |
| Server | Software run ပြီး network ပေါ်က client တွေရဲ့ request ကို response ပြန်ပေးတဲ့ ကွန်ပျူတာ (physical သို့ virtual)။ |
| Client | Server ဆီ request ပို့ပြီး response ကို user ကို ပြသတဲ့ program - web browser (သို့) mobile app များ။ |
| Domain | Website တစ်ခုကို ကိုယ်စားပြုတဲ့ example.com လို လူဖတ်လို့ရတဲ့ address၊ numeric IP address အစား သုံးတာ။ |
| Subdomain | Site ရဲ့ အစိတ်အပိုင်းတွေကို စုစည်း/ခွဲခြားဖို့ domain ရှေ့မှာ ထည့်တဲ့ prefix၊ blog.example.com လိုမျိုး။ |
| DNS | Domain name တွေကို IP address အဖြစ် ပြောင်းပေးတဲ့ internet ရဲ့ directory service - Domain Name System။ |
| IP Address | Network ပေါ်က device တစ်ခုကို ခွဲခြားသိစေပြီး data ဘယ်ကို သွားရမလဲ ညွှန်ပြပေးတဲ့ 192.0.2.1 လို ဂဏန်း label။ |
| HTTP | Browser နဲ့ server တို့ web content တောင်းဆို/ပို့ဆောင်ဖို့ သုံးတဲ့ စည်းမျဉ်း - HyperText Transfer Protocol။ |
| HTTPS | TLS နဲ့ encrypt လုပ်ထားတဲ့ HTTP၊ browser နဲ့ server ကြားက data ကို လမ်းကြားမှာ ဖတ်လို့/ပြင်လို့ မရအောင် ကာကွယ်ပေးတယ်။ |
| TLS | Network connection ပေါ်က data ကို လုံခြုံအောင် encrypt လုပ်ပေးတဲ့ protocol - Transport Layer Security။ |
| Certificate | Server ရဲ့ identity ကို သက်သေပြပြီး HTTPS encrypted connection ဖြစ်စေတဲ့ digital file။ |
| Static Site | Request တစ်ခုချင်းစီအတွက် server-side logic မလိုဘဲ ကြိုတင်တည်ဆောက်ထားတဲ့ HTML, CSS, JS file အတိုင်း ဖော်ပြပေးတဲ့ site။ |
| Dynamic Application | Server (သို့) database (သို့) နှစ်ခုလုံးကို သုံးပြီး request တစ်ခုချင်းစီအတွက် content ကို on-the-fly ဖန်တီးပေးတဲ့ app။ |
| Environment Variable | Code အပြင်ဘက်ကနေ သတ်မှတ်ထားတဲ့ configuration value၊ code တစ်ခုတည်းနဲ့ environment အသီးသီးမှာ ကွဲပြားစွာ ပြုမူနိုင်စေတယ်။ |
| Secret | API key (သို့) password လို code (သို့) client-side file ထဲမှာ လုံးဝ ပေါ်လွင်နေလို့ မရတဲ့ sensitive value။ |
| Build | Source code ကို deploy လုပ်မယ့် file အဖြစ် compile/bundle/ပြောင်းလဲပေးတဲ့ step။ |
| Cloud Computing | Physical hardware ပိုင်မယ့်အစား provider ဆီက computing resource - server, storage, database - တွေကို ငှားရမ်းအသုံးပြုတာ။ |
| IaaS | Provider က raw virtual server နဲ့ networking ကို ငှားပေးပြီး ကျန်တာကို ကိုယ့်ဘာသာ manage လုပ်ရတဲ့ Infrastructure as a Service။ |
| PaaS | Provider က server နဲ့ runtime ကို manage လုပ်ပေးလို့ infrastructure မစီမံရဘဲ code ကို deploy လုပ်ရုံပဲရတဲ့ Platform as a Service။ |
| SaaS | Email (သို့) CRM tool လို internet ကတစ်ဆင့် အသင့်သုံးလို့ရတဲ့ application ပြည့်စုံစွာ ပေးအပ်တဲ့ Software as a Service။ |
| VPS | Shared physical hardware ပေါ်က isolated virtual machine တစ်ခုပါ၊ root-level control ရရှိစေတဲ့ Virtual Private Server။ |
| Serverless | Provider manage လုပ်ပေးတဲ့ auto-scaling function ထဲမှာ code run ပြီး execution time အတိုင်းသာ ငွေကျသင့်တဲ့ model။ |
| Edge Computing | Central server တစ်ခုတည်းအစား latency လျှော့ချဖို့ user နဲ့ physically နီးတဲ့ edge location တွေမှာ code run တာ။ |
| CDN | Static content ကို visitor တစ်ဦးချင်းနဲ့ နီးတဲ့နေရာမှာ cache/ဖော်ပြပေးတဲ့ edge server network - Content Delivery Network။ |
| Origin | Content ရဲ့ မူရင်း authoritative version ကို ထားရှိပြီး CDN cache miss ဖြစ်ရင် ပြန်ဆွဲယူတဲ့ မူရင်း server။ |
| Cache | နောက်ထပ် request တွေ မူရင်းအလုပ်ကို ထပ်လုပ်စရာမလိုအောင် လျင်မြန်စွာ ရယူနိုင်တဲ့နေရာမှာ ခေတ္တသိမ်းထားတဲ့ data ကူးချက်။ |
| Object Storage | Filesystem အနေနဲ့ မဟုတ်ဘဲ object တစ်ခုချင်းစီအနေနဲ့ ဝင်ရောက်ရယူရတဲ့ image, video, backup စတဲ့ file များအတွက် storage system။ |
| Persistent Storage | Server ပြန်စ (သို့) container ပြန်ဖန်တီးလိုက်လည်း data ဆက်ရှိနေတဲ့ storage၊ ခေတ္တ in-memory storage နဲ့ မတူ။ |
| Managed Database | Setup, backup, patching, scaling တွေကို provider က ကိုင်တွယ်ပေးထားပြီး အဓိက အသုံးပြုရုံပဲရတဲ့ database။ |
| CI/CD | Code ပြောင်းလဲမှုတွေ push လုပ်တိုင်း automatic testing နဲ့ shipping လုပ်ပေးတဲ့ Continuous Integration/Continuous Deployment။ |
| Preview Deployment | Production မရောက်ခင် ပြောင်းလဲမှုတစ်ခုကို စမ်းသပ်ဖို့ သုံးတဲ့ ယာယီ isolated deployment။ |
| Docker | Application တစ်ခုနဲ့ လိုအပ်သမျှအရာအားလုံးကို portable container image ထဲ ထုပ်ပိုးပေးတဲ့ tool။ |
| Container | App တစ်ခုနဲ့ dependency တွေကို ထုပ်ပိုးပြီး ဘယ်နေရာမှာမဆို အတူတူ run နိုင်စေတဲ့ ပေါ့ပါးတဲ့ isolated package။ |
| Registry | Deploy လုပ်တဲ့အခါ platform တွေ ဆွဲယူတဲ့ container image အတွက် storage service။ |
| Load Balancer | Server တစ်ခုတည်း ပိုအလုပ်များမနေအောင် ဝင်လာတဲ့ request တွေကို server အများကြီးကို ခွဲဝေပေးတဲ့ component။ |
| Horizontal Scaling | Server တစ်ခုကို ပိုကြီးအောင်မလုပ်ဘဲ server instance အရေအတွက် ပိုထည့်ပြီး load ပိုကို ကိုင်တွယ်တာ။ |
| Vertical Scaling | Server ပိုထည့်မယ့်အစား server တစ်ခုတည်းကို CPU, memory, disk ပိုပေးပြီး load ပိုကို ကိုင်တွယ်တာ။ |
| Auto Scaling | Real-time demand အလိုက် server capacity ကို auto ဖြင့် ထပ်ထည့်/ဖြုတ်ချပေးတာ။ |
| Stateless | Server က ယခင် request တွေကို မှတ်မထားတဲ့ design၊ instance ဘယ်ခုမဆို request ဘယ်ခုမဆို ကိုင်တွယ်နိုင်တယ်။ |
| Queue | Request ကို block မလုပ်ဘဲ asynchronous အလုပ်လုပ်ဖို့ process ဖို့စောင့်နေတဲ့ task တွေအတွက် သိမ်းဆည်းနေရာ။ |
| Worker | Queue ကနေ task တွေကို ဆွဲယူပြီး main request-response cycle နဲ့ သီးခြား လုပ်ဆောင်ပေးတဲ့ process။ |
| Webhook | Event တစ်ခု ဖြစ်ပေါ်တဲ့အခါ system တစ်ခုက နောက်တစ်ခုဆီ ပို့တဲ့ automatic HTTP callback။ |
| Idempotency | Operation တစ်ခုကို ထပ်ခါထပ်ခါ လုပ်ဆောင်လည်း တစ်ကြိမ်တည်း လုပ်သလို ရလဒ်တူညီစေတဲ့ property။ |
| Health Check | App run နေပြီး traffic ကို ဆောင်ရွက်နိုင်ကြောင်း အတည်ပြုဖို့ platform က ပို့တဲ့ automatic request။ |
| Monitoring | User တွေ report မလုပ်ခင် ပြဿနာတွေကို မှီအောင်ဖမ်းနိုင်ဖို့ app ရဲ့ health နဲ့ performance ကို အဆက်မပြတ် စောင့်ကြည့်တာ။ |
| Logging | ပြဿနာကို နောက်ပိုင်း ရှာဖွေဖို့ app run နေချိန် event နဲ့ error တွေကို မှတ်တမ်းတင်ထားတာ။ |
| Observability | Log, metric, trace တွေ ပေါင်းစပ်ပြီး system ရဲ့ ပြင်ပ output က တစ်ဆင့် အတွင်းပိုင်း state ကို နားလည်နိုင်တဲ့ ပိုကျယ်ပြန့်တဲ့ စွမ်းရည်။ |
| Metrics | Request count, error rate, response latency လို system ရဲ့ အချိန်နဲ့အမျှ ဂဏန်း တိုင်းတာမှုများ။ |
| Traces | Request တစ်ခုတည်းရဲ့ system တစ်လျှောက် ဖြတ်သန်းလမ်းကြောင်းနဲ့ service တစ်ခုချင်းစီမှာ အချိန်ဘယ်လောက်သုံးခဲ့လဲ ပြသတဲ့ မှတ်တမ်း။ |
| IAM | ဘယ်သူ/ဘယ်အရာက resource ဘယ်ခုကို ဝင်ရောက်နိုင်လဲ ထိန်းချုပ်တဲ့ Identity and Access Management စနစ်။ |
| CORS | Web page တစ်ခုက domain တခြားတွေဆီက data ဘယ်လောက်တောင်းခံလို့ရလဲ ထိန်းချုပ်တဲ့ browser rule - Cross-Origin Resource Sharing။ |
| Rollback | Release ဆိုးတစ်ခုနောက်ပိုင်း အမြန် ပြန်ပြင်ဖို့ deployment ကို ယခင် known-good version ဆီ ပြန်ပြောင်းတာ။ |
| High Availability | Component တစ်ချို့ ချို့ယွင်းသွားလည်း app ဆက်လက် run နေပြီး ရောက်ရှိနိုင်နေအောင် ရည်ရွယ်တဲ့ system design ပန်းတိုင်။ |
| RPO | Outage တစ်ခုပြီးနောက် လက်ခံနိုင်တဲ့ အများဆုံး data ဆုံးရှုံးမှု (အချိန်နဲ့တိုင်းတာ) - Recovery Point Objective။ |
| RTO | Outage တစ်ခုပြီးနောက် service ကို ပြန်လည်ရယူဖို့ လက်ခံနိုင်တဲ့ အများဆုံးအချိန် - Recovery Time Objective။ |
Production Deployment Checklist
| Item | ဘာကြောင့်အရေးကြီးလဲ |
|---|---|
| Build passes | မအောင်မြင်တဲ့ (သို့) warning အများကြီးပါတဲ့ build ဆိုတာ deploy လုပ်မယ့် code က ကိုယ်ထင်ထားတာ မဟုတ်နိုင်ဘူးလို့ ဆိုလိုတယ်။ |
| Tests pass | Test တွေ အောင်မြင်တာဟာ ပြောင်းလဲမှုတစ်ခုက ရှိပြီးသား behavior ကို တိတ်တဆိတ် မဖျက်ဆီးကြောင်း အမြန်ဆုံး signal ဖြစ်တယ်။ |
| Environment variables configured | လိုအပ်တဲ့ env var အားလုံးကို local .env file ထဲမှာသာမက production environment ထဲမှာလည်း သတ်မှတ်ထားရမယ်။ |
| Secrets not committed | Git repository ဆီ push လုပ်လိုက်တဲ့ secret ဟာ နောက်ပိုင်း ဖျက်ချင်ရင်တောင် history ထဲမှာ ပြန်ရှာလို့ရနေဆဲပဲ။ |
| Database migration reviewed | မစစ်ဆေးရသေးတဲ့ migration တစ်ခုက live database ပေါ်မှာ table lock ဖြစ်တာ၊ column ပျက်တာ၊ data ဆုံးရှုံးတာတွေ ဖြစ်စေနိုင်တယ်။ |
| HTTPS configured | HTTPS မပါတဲ့ traffic ကို ကြားဖြတ်ဖမ်းယူ (သို့) ပြင်ဆင်နိုင်ပြီး ခေတ်မီ browser တွေက unsafe အဖြစ် သတိပေးတယ်။ |
| Domain correct | မှားနေတဲ့ DNS record တစ်ခုက production traffic ကို environment မှားဆီ (သို့) ဘယ်နေရာမှမဟုတ်ဘဲ ညွှန်ပြနေနိုင်တယ်။ |
| Error handling exists | မရှိရင် မမျှော်လင့်တဲ့ input တစ်ခုက app ကို crash ဖြစ်စေနိုင်တယ် (သို့) user ဆီ internal detail တွေ ပေါက်ကြားစေနိုင်တယ်။ |
| Logging enabled without secrets | Log ဆိုတာ debug လုပ်ဖို့ မရှိမဖြစ်ပါ၊ ဒါပေမယ့် password (သို့) API key ကို log ချရင် log storage ကိုယ်တိုင် ပေါက်ကြားရာ ဖြစ်သွားနိုင်တယ်။ |
| Monitoring enabled | Monitoring မရှိရင် outage တစ်ခုကို alert ကနေမဟုတ်ဘဲ user တိုင်ကြားလို့သာ သိရနိုင်တယ်။ |
| Backup strategy exists and has been tested | တစ်ခါမှ restore မလုပ်ဖူးသေးတဲ့ backup ဆိုတာ အထောက်အထား မပြည့်စုံသေးဘူး - အရေးပေါ်အခြေအနေမှာ မလိုအပ်ခင် recovery အလုပ်ဖြစ်ကြောင်း စစ်ဆေးထားပါ။ |
| Rollback plan exists | Deploy မလုပ်ခင် ဘယ်လို ပြန်ပြင်ရမလဲ တိကျစွာသိထားတာက release ဆိုးတစ်ခုကို ငါးမိနစ် ပြင်ရုံနဲ့ ဖြေရှင်းစေတယ်၊ လျင်မြန်စွာ လူတွေ အလန့်တကြားမလုပ်ရအောင်။ |
| Rate limits / timeouts configured for external calls | မရှိရင် နှေးကွေးတဲ့ (သို့) အသုံးများလွန်းတဲ့ external dependency တစ်ခုက resource (သို့) ငွေကုန်ကျစရိတ် ကုန်ခန်းစေနိုင်တယ်။ |
| CORS scoped correctly | လွန်ကဲစွာ ခွင့်ပြုထားတဲ့ CORS policy တစ်ခုက website ဘယ်ခုမဆို user ကိုယ်စား authenticated request တွေကို ကိုယ့် API ဆီ လုပ်ဆောင်ခွင့်ပြုနိုင်တယ်။ |