{
  "title": "سیاست مصنوعات ساخت",
  "slug": "team/devops/standards/build-artifact-policy",
  "url": "/docs/team/devops/standards/build-artifact-policy",
  "frontmatter": {
    "layout": "doc",
    "title": "سیاست مصنوعات ساخت",
    "description": "محتوای ممنوع در Build، .dockerignore، Multi-stage Build و امنیت تصویر",
    "version": "1.0.0",
    "status": "PRIVATE",
    "author": "xoxxel",
    "owner": "xoxxel",
    "created_at": "2026-06-07",
    "updated_at": "2026-06-07",
    "tags": "",
    "reviewers": ""
  },
  "sections": [
    {
      "level": 1,
      "heading": "سیاست مصنوعات ساخت",
      "content": "**Build Artifact Policy**\n\nنسخه 1.0 | الزامی برای همه Docker Imageها و Release Packageها\n\n> **دامنه اعمال:** این پالیسی فقط برای مصنوعات قابل ساخت و استقرار (buildable/deployable artifacts) در مخزن `nons-api/` اعمال می‌شود. برای مخزن مستندات (`dotdive/`) و مستندات تیمی اعمال نمی‌شود.\n\n---"
    },
    {
      "level": 2,
      "heading": "1. اصل اساسی",
      "content": "**مصنوعات ساخت (Build Artifacts) فقط باید شامل فایل‌های مورد نیاز Runtime باشند.**\n\nهیچ فایل توسعه، مستندات، تست یا دمویی نباید وارد تصویر نهایی شود.\n\n---"
    },
    {
      "level": 2,
      "heading": "2. محتوای ممنوع در Build",
      "content": "| پوشه / فایل | دلیل | سرنوشت |\n|---|---|---|\n| `docs/` | مستندات — فقط برای توسعه‌دهندگان | ❌ حذف از Build |\n| `demo/` | پیش‌نمایش — فقط برای همکاری تیمی | ❌ حذف از Build |\n| `tests/` | تست‌ها — فقط در CI اجرا می‌شوند | ❌ حذف از Build |\n| `blueprint/` | طرح اولیه — فقط قبل از توسعه | ❌ حذف از Build |\n| `.git/` | تاریخچه git | ❌ حذف از Build |\n| `.env` | اسرار محیطی | ❌ حذف از Build |\n| `.env.*` (جز `.env.example`) | اسرار محیطی | ❌ حذف از Build |\n| `node_modules/` (در مرحله نهایی) | وابستگی‌های توسعه | ❌ حذف در Multi-stage Build |\n| `*.test.*` | فایل‌های تست | ❌ حذف از Build |\n| `*.spec.*` | فایل‌های تست | ❌ حذف از Build |\n\n---"
    },
    {
      "level": 2,
      "heading": "3. `.dockerignore` — مثال",
      "content": "```dockerignore"
    },
    {
      "level": 1,
      "heading": "Git",
      "content": ".git/\n.gitignore"
    },
    {
      "level": 1,
      "heading": "Development",
      "content": "docs/\ndemo/\ntests/\nblueprint/\n*.test.*\n*.spec.*"
    },
    {
      "level": 1,
      "heading": "Environment",
      "content": ".env\n.env.development\n.env.local"
    },
    {
      "level": 1,
      "heading": "IDE",
      "content": ".vscode/\n.idea/"
    },
    {
      "level": 1,
      "heading": "OS",
      "content": ".DS_Store\nThumbs.db"
    },
    {
      "level": 1,
      "heading": "CI",
      "content": ".github/\n.gitlab-ci.yml\n```\n\n---"
    },
    {
      "level": 2,
      "heading": "4. Docker Multi-stage Build",
      "content": "برای به حداقل رساندن حجم تصویر نهایی، **همیشه از Multi-stage Build** استفاده کنید:\n\n```dockerfile"
    },
    {
      "level": 1,
      "heading": "Stage 1: Build",
      "content": "FROM node:20-alpine AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\nCOPY . .\nRUN npm run build"
    },
    {
      "level": 1,
      "heading": "Stage 2: Runtime — فقط فایل‌های لازم",
      "content": "FROM node:20-alpine\nWORKDIR /app\nCOPY --from=builder /app/dist ./dist\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY --from=builder /app/package.json ./\nCOPY --from=builder /app/.env.example ./\n\nEXPOSE 3000\nCMD [\"node\", \"dist/main.js\"]\n```\n\n---"
    },
    {
      "level": 2,
      "heading": "5. قوانین Release Package",
      "content": "برای انتشارات (GitHub Release, npm, Go module):\n\n| مورد | در Release | خارج از Release |\n|---|---|---|\n| کد کامپایل شده / بیلد شده | ✅ | ❌ |\n| کد منبع | ✅ (در صورت لزوم) | ✅ (در مخزن) |\n| مستندات | ❌ | ✅ (در مخزن) |\n| دمو | ❌ | ✅ (در مخزن) |\n| تست | ❌ | ✅ (در مخزن) |\n| `.env.example` | ✅ | ✅ |\n| `CHANGELOG.md` | ✅ | ✅ |\n\n---"
    },
    {
      "level": 2,
      "heading": "6. CI/CD Pipeline",
      "content": "```mermaid\nflowchart LR\n    A[Commit] --> B[CI: تست‌ها]\n    B --> C[CI: Build]\n    C --> D[ساخت Docker Image]\n    D --> E[Push به Registry]\n    E --> F[استقرار]\n```\n\n**قوانین CI:**\n- Build فقط پس از قبولی همه تست‌ها انجام می‌شود\n- تصویر نهایی همیشه از Multi-stage Build ساخته می‌شود\n- تگ تصویر دقیقاً با نسخه سرویس مطابقت دارد\n- از `docker scan` یا ابزار مشابه برای بررسی امنیتی استفاده کنید\n\n---"
    },
    {
      "level": 2,
      "heading": "7. امنیت Build",
      "content": "| قانون | توضیح |\n|---|---|\n| اسکن امنیتی | تصویر نهایی باید از نظر آسیب‌پذیری اسکن شود |\n| حداقل دسترسی | کاربر Runtime در کانتینر `root` نباشد |\n| حداقل وابستگی | فقط پکیج‌های ضروری در تصویر نهایی باشند |\n| بدون راز | هیچ رازی در تصویر نهایی کدگذاری نشود |\n| Alpine / Slim | از تصاویر پایه حداقلی استفاده شود |\n\n---"
    },
    {
      "level": 2,
      "heading": "8. خلاصه",
      "content": "| مرحله | وضعیت |\n|---|---|\n| حذف `docs/` از Build | اجباری |\n| حذف `demo/` از Build | اجباری |\n| حذف `tests/` از Build | اجباری |\n| حذف `.git/` از Build | اجباری |\n| Multi-stage Build | اجباری |\n| اسکن امنیتی | توصیه شده |\n| کاربر غیر-root | اجباری |"
    }
  ]
}