[{"data":1,"prerenderedAt":1269},["ShallowReactive",2],{"navigation_docs_en":3,"-en-devops-docker-deployment":696,"-en-devops-docker-deployment-surround":1264},[4],{"title":5,"path":6,"stem":7,"children":8,"page":35},"En","\u002Fen","en",[9,36,102,159,210,253,295,326,357,385,412,432,452,479,514,533,556,583,606,628,653,672],{"title":10,"icon":11,"path":12,"stem":13,"children":14,"page":35},"Guides","i-lucide-book-open","\u002Fen\u002Fguides","en\u002F01.guides",[15,20,25,30],{"title":16,"path":17,"stem":18,"icon":19},"Getting Started","\u002Fen\u002Fguides\u002Fgetting-started","en\u002F01.guides\u002F01.getting-started","i-lucide-rocket",{"title":21,"path":22,"stem":23,"icon":24},"Documentation Directory","\u002Fen\u002Fguides\u002Fdirectory","en\u002F01.guides\u002F02.directory","i-lucide-folder-tree",{"title":26,"path":27,"stem":28,"icon":29},"Role-Based Access","\u002Fen\u002Fguides\u002Frole-based-access","en\u002F01.guides\u002F03.role-based-access","i-lucide-users",{"title":31,"path":32,"stem":33,"icon":34},"Support, Error Reporting & Feature Requests","\u002Fen\u002Fguides\u002Fsupport-error-reporting","en\u002F01.guides\u002F04.support-error-reporting","i-lucide-life-buoy",false,{"title":37,"icon":38,"path":39,"stem":40,"children":41,"page":35},"Director Guide","i-lucide-building-2","\u002Fen\u002Fdirector","en\u002F02.director",[42,47,52,57,62,67,72,77,82,87,92,97],{"title":43,"path":44,"stem":45,"icon":46},"Director Dashboard Overview","\u002Fen\u002Fdirector\u002Foverview","en\u002F02.director\u002F01.overview","i-lucide-layout-dashboard",{"title":48,"path":49,"stem":50,"icon":51},"Student Risk Engine & Early Warnings","\u002Fen\u002Fdirector\u002Fstudent-risk","en\u002F02.director\u002F02.student-risk","i-lucide-alert-triangle",{"title":53,"path":54,"stem":55,"icon":56},"Siren & School Bell System","\u002Fen\u002Fdirector\u002Fsiren-management","en\u002F02.director\u002F03.siren-management","i-lucide-bell-ring",{"title":58,"path":59,"stem":60,"icon":61},"Exam Seating & Hall Allocation","\u002Fen\u002Fdirector\u002Fexam-seating","en\u002F02.director\u002F04.exam-seating","i-lucide-grid",{"title":63,"path":64,"stem":65,"icon":66},"Reports, Analytics & Data Health","\u002Fen\u002Fdirector\u002Freports-analytics","en\u002F02.director\u002F05.reports-analytics","i-lucide-bar-chart-3",{"title":68,"path":69,"stem":70,"icon":71},"School Transport & Bus Routes","\u002Fen\u002Fdirector\u002Ftransport","en\u002F02.director\u002F06.transport","i-lucide-bus",{"title":73,"path":74,"stem":75,"icon":76},"School Settings & Policies","\u002Fen\u002Fdirector\u002Fschool-settings","en\u002F02.director\u002F07.school-settings","i-lucide-sliders",{"title":78,"path":79,"stem":80,"icon":81},"Subscription & Billing","\u002Fen\u002Fdirector\u002Fsubscription-billing","en\u002F02.director\u002F08.subscription-billing","i-lucide-credit-card",{"title":83,"path":84,"stem":85,"icon":86},"Credentials & Login Slips","\u002Fen\u002Fdirector\u002Fcredentials-management","en\u002F02.director\u002F09.credentials-management","i-lucide-key-round",{"title":88,"path":89,"stem":90,"icon":91},"Teacher Performance & Evaluation","\u002Fen\u002Fdirector\u002Fteacher-evaluation","en\u002F02.director\u002F10.teacher-evaluation","i-lucide-trophy",{"title":93,"path":94,"stem":95,"icon":96},"PTA Parent Presentation Generator","\u002Fen\u002Fdirector\u002Fparent-presentation","en\u002F02.director\u002F11.parent-presentation","i-lucide-presentation",{"title":98,"path":99,"stem":100,"icon":101},"Data Consistency & Health Audit","\u002Fen\u002Fdirector\u002Fdata-consistency","en\u002F02.director\u002F12.data-consistency","i-lucide-stethoscope",{"title":103,"icon":11,"path":104,"stem":105,"children":106,"page":35},"Teacher Guide","\u002Fen\u002Fteacher","en\u002F03.teacher",[107,111,116,121,126,131,136,141,146,150,155],{"title":108,"path":109,"stem":110,"icon":46},"Teacher Dashboard Overview","\u002Fen\u002Fteacher\u002Foverview","en\u002F03.teacher\u002F01.overview",{"title":112,"path":113,"stem":114,"icon":115},"Attendance Marking","\u002Fen\u002Fteacher\u002Fattendance-marking","en\u002F03.teacher\u002F02.attendance-marking","i-lucide-check-circle-2",{"title":117,"path":118,"stem":119,"icon":120},"Gradebook & Continuous Assessments","\u002Fen\u002Fteacher\u002Fgradebook-entry","en\u002F03.teacher\u002F03.gradebook-entry","i-lucide-award",{"title":122,"path":123,"stem":124,"icon":125},"Lesson Plans & Assignments","\u002Fen\u002Fteacher\u002Flessons-assignments","en\u002F03.teacher\u002F04.lessons-assignments","i-lucide-book-marked",{"title":127,"path":128,"stem":129,"icon":130},"Student Discipline & Behavior Logs","\u002Fen\u002Fteacher\u002Fdiscipline","en\u002F03.teacher\u002F05.discipline","i-lucide-shield-alert",{"title":132,"path":133,"stem":134,"icon":135},"AI Teaching Copilot","\u002Fen\u002Fteacher\u002Fai-copilot","en\u002F03.teacher\u002F06.ai-copilot","i-lucide-sparkles",{"title":137,"path":138,"stem":139,"icon":140},"Risk & Analytics","\u002Fen\u002Fteacher\u002Frisk-analytics","en\u002F03.teacher\u002F07.risk-analytics","i-lucide-chart-line",{"title":142,"path":143,"stem":144,"icon":145},"Early Childhood & KG Care","\u002Fen\u002Fteacher\u002Fearly-childhood-kg","en\u002F03.teacher\u002F08.early-childhood-kg","i-lucide-baby",{"title":147,"path":148,"stem":149,"icon":125},"Curriculum & Textbook Units","\u002Fen\u002Fteacher\u002Fcurriculum-syllabus","en\u002F03.teacher\u002F09.curriculum-syllabus",{"title":151,"path":152,"stem":153,"icon":154},"Period Swaps & AI Substitution","\u002Fen\u002Fteacher\u002Fperiod-swaps","en\u002F03.teacher\u002F10.period-swaps","i-lucide-arrow-left-right",{"title":156,"path":157,"stem":158,"icon":29},"Homeroom & Class Teacher Workspace","\u002Fen\u002Fteacher\u002Fhomeroom-management","en\u002F03.teacher\u002F11.homeroom-management",{"title":160,"icon":161,"path":162,"stem":163,"children":164,"page":35},"Registrar Guide","i-lucide-user-check","\u002Fen\u002Fregistrar","en\u002F04.registrar",[165,169,174,179,183,187,192,197,201,205],{"title":166,"path":167,"stem":168,"icon":46},"Registrar Overview","\u002Fen\u002Fregistrar\u002Foverview","en\u002F04.registrar\u002F01.overview",{"title":170,"path":171,"stem":172,"icon":173},"Student Enrollment","\u002Fen\u002Fregistrar\u002Fenroll-student","en\u002F04.registrar\u002F02.enroll-student","i-lucide-user-plus",{"title":175,"path":176,"stem":177,"icon":178},"Bulk Import & Provisioning","\u002Fen\u002Fregistrar\u002Fbulk-import","en\u002F04.registrar\u002F03.bulk-import","i-lucide-file-spreadsheet",{"title":180,"path":181,"stem":182,"icon":29},"Student Management","\u002Fen\u002Fregistrar\u002Fstudent-management","en\u002F04.registrar\u002F04.student-management",{"title":184,"path":185,"stem":186,"icon":81},"Student ID Cards","\u002Fen\u002Fregistrar\u002Fid-cards","en\u002F04.registrar\u002F05.id-cards",{"title":188,"path":189,"stem":190,"icon":191},"Generate Report Cards","\u002Fen\u002Fregistrar\u002Freport-cards","en\u002F04.registrar\u002F06.report-cards","i-lucide-file-text",{"title":193,"path":194,"stem":195,"icon":196},"Grade Promotion Engine","\u002Fen\u002Fregistrar\u002Fpromotion","en\u002F04.registrar\u002F07.promotion","i-lucide-trending-up",{"title":198,"path":199,"stem":200,"icon":29},"Staff Management","\u002Fen\u002Fregistrar\u002Fstaff-management","en\u002F04.registrar\u002F08.staff-management",{"title":202,"path":203,"stem":204,"icon":120},"Custom Certificate & Transcript Builder","\u002Fen\u002Fregistrar\u002Fcertificate-templates","en\u002F04.registrar\u002F09.certificate-templates",{"title":206,"path":207,"stem":208,"icon":209},"School-Leaving Clearance & Transfer Certificates","\u002Fen\u002Fregistrar\u002Fschool-leaving-clearance","en\u002F04.registrar\u002F10.school-leaving-clearance","i-lucide-file-check",{"title":211,"icon":81,"path":212,"stem":213,"children":214,"page":35},"Finance Guide","\u002Fen\u002Ffinance","en\u002F05.finance",[215,219,224,229,234,239,244,248],{"title":216,"path":217,"stem":218,"icon":46},"Finance Dashboard Overview","\u002Fen\u002Ffinance\u002Foverview","en\u002F05.finance\u002F01.overview",{"title":220,"path":221,"stem":222,"icon":223},"Fee Structures","\u002Fen\u002Ffinance\u002Ffee-structures","en\u002F05.finance\u002F02.fee-structures","i-lucide-list-checks",{"title":225,"path":226,"stem":227,"icon":228},"Installment Plans","\u002Fen\u002Ffinance\u002Finstallment-plans","en\u002F05.finance\u002F03.installment-plans","i-lucide-calendar-clock",{"title":230,"path":231,"stem":232,"icon":233},"Discount Policies","\u002Fen\u002Ffinance\u002Fdiscounts","en\u002F05.finance\u002F04.discounts","i-lucide-tag",{"title":235,"path":236,"stem":237,"icon":238},"Recording a Payment","\u002Fen\u002Ffinance\u002Frecord-payment","en\u002F05.finance\u002F05.record-payment","i-lucide-circle-dollar-sign",{"title":240,"path":241,"stem":242,"icon":243},"Payment Receipts","\u002Fen\u002Ffinance\u002Freceipts","en\u002F05.finance\u002F06.receipts","i-lucide-receipt",{"title":245,"path":246,"stem":247,"icon":51},"Overdue Fee Reports","\u002Fen\u002Ffinance\u002Foverdue-reports","en\u002F05.finance\u002F07.overdue-reports",{"title":249,"path":250,"stem":251,"icon":252},"Staff Payroll & Salaries","\u002Fen\u002Ffinance\u002Fpayroll","en\u002F05.finance\u002F08.payroll","i-lucide-wallet",{"title":254,"icon":255,"path":256,"stem":257,"children":258,"page":35},"Parent & Student Guide","i-lucide-heart-handshake","\u002Fen\u002Fparent","en\u002F06.parent",[259,263,268,272,276,281,286,291],{"title":260,"path":261,"stem":262,"icon":46},"Parent Dashboard Overview","\u002Fen\u002Fparent\u002Foverview","en\u002F06.parent\u002F01.overview",{"title":264,"path":265,"stem":266,"icon":267},"Parent Attendance Monitoring","\u002Fen\u002Fparent\u002Fattendance","en\u002F06.parent\u002F02.attendance","i-lucide-calendar-check",{"title":269,"path":270,"stem":271,"icon":196},"Viewing Grades","\u002Fen\u002Fparent\u002Fgrades","en\u002F06.parent\u002F03.grades",{"title":273,"path":274,"stem":275,"icon":191},"Report Cards","\u002Fen\u002Fparent\u002Freport-cards","en\u002F06.parent\u002F04.report-cards",{"title":277,"path":278,"stem":279,"icon":280},"Student Portal","\u002Fen\u002Fparent\u002Fstudent-portal","en\u002F06.parent\u002F05.student-portal","i-lucide-graduation-cap",{"title":282,"path":283,"stem":284,"icon":285},"Student Timetable","\u002Fen\u002Fparent\u002Ftimetable","en\u002F06.parent\u002F06.timetable","i-lucide-clock",{"title":287,"path":288,"stem":289,"icon":290},"School Bookstore & Uniform Orders","\u002Fen\u002Fparent\u002Funiform-bookstore","en\u002F06.parent\u002F07.uniform-bookstore","i-lucide-shopping-bag",{"title":292,"path":293,"stem":294,"icon":130},"Behavior, Merit Awards & Pastoral Care","\u002Fen\u002Fparent\u002Fdiscipline-merits","en\u002F06.parent\u002F08.discipline-merits",{"title":296,"icon":280,"path":297,"stem":298,"children":299,"page":35},"Student Guide","\u002Fen\u002Fstudent","en\u002F07.student",[300,304,309,313,317,322],{"title":301,"path":302,"stem":303,"icon":46},"Student Portal Overview","\u002Fen\u002Fstudent\u002Foverview","en\u002F07.student\u002F01.overview",{"title":305,"path":306,"stem":307,"icon":308},"Online Examination Portal","\u002Fen\u002Fstudent\u002Fonline-exams","en\u002F07.student\u002F02.online-exams","i-lucide-monitor-check",{"title":310,"path":311,"stem":312,"icon":191},"Assignments & Digital Lessons","\u002Fen\u002Fstudent\u002Fassignments","en\u002F07.student\u002F03.assignments",{"title":314,"path":315,"stem":316,"icon":120},"Grades & Terminal Report Cards","\u002Fen\u002Fstudent\u002Fgrades-report-cards","en\u002F07.student\u002F04.grades-report-cards",{"title":318,"path":319,"stem":320,"icon":321},"Computer-Based Testing (CBT) & Exam Proctoring","\u002Fen\u002Fstudent\u002Fcbt-examination-guide","en\u002F07.student\u002F05.cbt-examination-guide","i-lucide-monitor-play",{"title":323,"path":324,"stem":325,"icon":71},"School Bus & Transport Tracking","\u002Fen\u002Fstudent\u002Ftransport","en\u002F07.student\u002F06.transport",{"title":327,"icon":280,"path":328,"stem":329,"children":330,"page":35},"Academic Management","\u002Fen\u002Facademic","en\u002F08.academic",[331,336,341,345,349,353],{"title":332,"path":333,"stem":334,"icon":335},"Academic Years & Terms","\u002Fen\u002Facademic\u002Facademic-years","en\u002F08.academic\u002F01.academic-years","i-lucide-calendar",{"title":337,"path":338,"stem":339,"icon":340},"Classes & Sections","\u002Fen\u002Facademic\u002Fclasses-sections","en\u002F08.academic\u002F02.classes-sections","i-lucide-shapes",{"title":342,"path":343,"stem":344,"icon":11},"Subjects & Lessons","\u002Fen\u002Facademic\u002Fsubjects","en\u002F08.academic\u002F03.subjects",{"title":346,"path":347,"stem":348,"icon":285},"Timetables","\u002Fen\u002Facademic\u002Ftimetable","en\u002F08.academic\u002F04.timetable",{"title":350,"path":351,"stem":352,"icon":280},"Academic Overview","\u002Fen\u002Facademic\u002Facademic-overview","en\u002F08.academic\u002F05.academic-overview",{"title":354,"path":355,"stem":356,"icon":125},"Curriculum Framework","\u002Fen\u002Facademic\u002Fcurriculum-mapping","en\u002F08.academic\u002F06.curriculum-mapping",{"title":358,"icon":359,"path":360,"stem":361,"children":362,"page":35},"Examinations","i-lucide-pen-tool","\u002Fen\u002Fexams","en\u002F09.exams",[363,367,372,377,381],{"title":364,"path":365,"stem":366,"icon":359},"Examinations & Continuous Assessments","\u002Fen\u002Fexams\u002Fexams-assessments","en\u002F09.exams\u002F01.exams-assessments",{"title":368,"path":369,"stem":370,"icon":371},"Exam Setup & Configuration","\u002Fen\u002Fexams\u002Fexam-setup","en\u002F09.exams\u002F02.exam-setup","i-lucide-settings-2",{"title":373,"path":374,"stem":375,"icon":376},"Online Computer-Based Testing System","\u002Fen\u002Fexams\u002Fonline-exams-system","en\u002F09.exams\u002F03.online-exams-system","i-lucide-laptop",{"title":378,"path":379,"stem":380,"icon":120},"National & Regional Exams","\u002Fen\u002Fexams\u002Fnational-examinations","en\u002F09.exams\u002F04.national-examinations",{"title":382,"path":383,"stem":384,"icon":61},"Exam Seating & Hall Generator","\u002Fen\u002Fexams\u002Fexam-seating-halls","en\u002F09.exams\u002F05.exam-seating-halls",{"title":386,"icon":387,"path":388,"stem":389,"children":390,"page":35},"Inventory & Store Guide","i-lucide-boxes","\u002Fen\u002Finventory","en\u002F10.inventory",[391,395,400,404,408],{"title":392,"path":393,"stem":394,"icon":46},"Inventory & Store Management Overview","\u002Fen\u002Finventory\u002Foverview","en\u002F10.inventory\u002F01.overview",{"title":396,"path":397,"stem":398,"icon":399},"Managing Catalog & Categories","\u002Fen\u002Finventory\u002Fitems-categories","en\u002F10.inventory\u002F02.items-categories","i-lucide-tags",{"title":401,"path":402,"stem":403,"icon":154},"Stock In, Stock Out & Requisitions","\u002Fen\u002Finventory\u002Fstock-transactions","en\u002F10.inventory\u002F03.stock-transactions",{"title":405,"path":406,"stem":407,"icon":290},"School Uniform & Book Store","\u002Fen\u002Finventory\u002Fschool-store","en\u002F10.inventory\u002F04.school-store",{"title":409,"path":410,"stem":411,"icon":290},"Bookstore & Uniform Sales","\u002Fen\u002Finventory\u002Fbookstore-uniforms","en\u002F10.inventory\u002F05.bookstore-uniforms",{"title":413,"icon":414,"path":415,"stem":416,"children":417,"page":35},"Academic Supervisor Guide","i-lucide-clipboard-check","\u002Fen\u002Fsupervisor","en\u002F11.supervisor",[418,422,427],{"title":419,"path":420,"stem":421,"icon":46},"Academic Supervision Overview","\u002Fen\u002Fsupervisor\u002Foverview","en\u002F11.supervisor\u002F01.overview",{"title":423,"path":424,"stem":425,"icon":426},"Lesson Plan Approvals & Feedback","\u002Fen\u002Fsupervisor\u002Flesson-plan-reviews","en\u002F11.supervisor\u002F02.lesson-plan-reviews","i-lucide-file-check-2",{"title":428,"path":429,"stem":430,"icon":431},"Classroom Observations & Rubrics","\u002Fen\u002Fsupervisor\u002Fclassroom-observations","en\u002F11.supervisor\u002F03.classroom-observations","i-lucide-clipboard-signature",{"title":433,"icon":434,"path":435,"stem":436,"children":437,"page":35},"Communication","i-lucide-message-circle","\u002Fen\u002Fcommunication","en\u002F12.communication",[438,443,447],{"title":439,"path":440,"stem":441,"icon":442},"School Announcements & Broadcasts","\u002Fen\u002Fcommunication\u002Fannouncements","en\u002F12.communication\u002F01.announcements","i-lucide-megaphone",{"title":444,"path":445,"stem":446,"icon":434},"Communication Overview","\u002Fen\u002Fcommunication\u002Fcommunication-overview","en\u002F12.communication\u002F02.communication-overview",{"title":448,"path":449,"stem":450,"icon":451},"Digital Communication Book","\u002Fen\u002Fcommunication\u002Fcommunication-book","en\u002F12.communication\u002F03.communication-book","i-lucide-book-heart",{"title":453,"icon":135,"path":454,"stem":455,"children":456,"page":35},"AI Intelligence Suite","\u002Fen\u002Fai","en\u002F13.ai",[457,462,466,470,474],{"title":458,"path":459,"stem":460,"icon":461},"Interactive AI Assistant","\u002Fen\u002Fai\u002Foverview","en\u002F13.ai\u002F01.overview","i-lucide-bot",{"title":463,"path":464,"stem":465,"icon":135},"Autonomous Background Autopilots","\u002Fen\u002Fai\u002Fautonomous-autopilot","en\u002F13.ai\u002F02.autonomous-autopilot",{"title":467,"path":468,"stem":469,"icon":461},"Timetable Substitution Watchdog","\u002Fen\u002Fai\u002Ftimetable-watchdog","en\u002F13.ai\u002F03.timetable-watchdog",{"title":471,"path":472,"stem":473,"icon":255},"Empathetic Parent Dialogue","\u002Fen\u002Fai\u002Fparent-empathy-dialogue","en\u002F13.ai\u002F04.parent-empathy-dialogue",{"title":475,"path":476,"stem":477,"icon":478},"AI Configuration & Settings","\u002Fen\u002Fai\u002Fai-settings","en\u002F13.ai\u002F05.ai-settings","i-lucide-wrench",{"title":480,"icon":481,"path":482,"stem":483,"children":484,"page":35},"Platform Features","i-lucide-settings","\u002Fen\u002Fplatform","en\u002F14.platform",[485,490,495,500,505,509],{"title":486,"path":487,"stem":488,"icon":489},"Language & Localisation","\u002Fen\u002Fplatform\u002Flanguage","en\u002F14.platform\u002F01.language","i-lucide-languages",{"title":491,"path":492,"stem":493,"icon":494},"Ethiopian & Gregorian Calendar","\u002Fen\u002Fplatform\u002Fcalendar","en\u002F14.platform\u002F02.calendar","i-lucide-calendar-days",{"title":496,"path":497,"stem":498,"icon":499},"Offline Mode (PWA)","\u002Fen\u002Fplatform\u002Foffline","en\u002F14.platform\u002F03.offline","i-lucide-wifi-off",{"title":501,"path":502,"stem":503,"icon":504},"Notifications","\u002Fen\u002Fplatform\u002Fnotifications","en\u002F14.platform\u002F04.notifications","i-lucide-bell",{"title":506,"path":507,"stem":508,"icon":504},"Siren \u002F Bell Management","\u002Fen\u002Fplatform\u002Fsiren-management","en\u002F14.platform\u002F05.siren-management",{"title":510,"path":511,"stem":512,"icon":513},"User Profile, 2FA & Account Security","\u002Fen\u002Fplatform\u002Fuser-profile-security","en\u002F14.platform\u002F06.user-profile-security","i-lucide-shield-check",{"title":515,"icon":516,"path":517,"stem":518,"children":519,"page":35},"School Owner & Executive Guide","i-lucide-crown","\u002Fen\u002Fowner","en\u002F15.owner",[520,524,529],{"title":521,"path":522,"stem":523,"icon":46},"School Owner Executive Overview","\u002Fen\u002Fowner\u002Foverview","en\u002F15.owner\u002F01.overview",{"title":525,"path":526,"stem":527,"icon":528},"Multi-Branch & Campus Comparison","\u002Fen\u002Fowner\u002Fmulti-branch","en\u002F15.owner\u002F02.multi-branch","i-lucide-network",{"title":530,"path":531,"stem":532,"icon":528},"Inter-Branch Operations & Consolidation","\u002Fen\u002Fowner\u002Fbranch-transfers-consolidation","en\u002F15.owner\u002F03.branch-transfers-consolidation",{"title":534,"icon":535,"path":536,"stem":537,"children":538,"page":35},"School Operations","i-lucide-building","\u002Fen\u002Foperations","en\u002F16.operations",[539,543,547,551],{"title":540,"path":541,"stem":542,"icon":71},"Transport & Fleet Management","\u002Fen\u002Foperations\u002Ftransport","en\u002F16.operations\u002F01.transport",{"title":544,"path":545,"stem":546,"icon":494},"School Events & Calendar Planner","\u002Fen\u002Foperations\u002Fevents-calendar","en\u002F16.operations\u002F02.events-calendar",{"title":548,"path":549,"stem":550,"icon":513},"Data Quality & Security Logs","\u002Fen\u002Foperations\u002Fdata-quality-audit","en\u002F16.operations\u002F03.data-quality-audit",{"title":552,"path":553,"stem":554,"icon":555},"Timetable Auto-Assignment Engine","\u002Fen\u002Foperations\u002Ftimetable-engine","en\u002F16.operations\u002F04.timetable-engine","i-lucide-cpu",{"title":557,"icon":558,"path":559,"stem":560,"children":561,"page":35},"Mobile App Guide","i-lucide-smartphone","\u002Fen\u002Fmobile","en\u002F17.mobile",[562,566,570,574,579],{"title":563,"path":564,"stem":565,"icon":558},"Mobile App Overview","\u002Fen\u002Fmobile\u002Foverview","en\u002F17.mobile\u002F01.overview",{"title":567,"path":568,"stem":569,"icon":11},"Teacher Mobile Experience","\u002Fen\u002Fmobile\u002Fteacher-mobile","en\u002F17.mobile\u002F02.teacher-mobile",{"title":571,"path":572,"stem":573,"icon":255},"Parent Mobile Experience","\u002Fen\u002Fmobile\u002Fparent-mobile","en\u002F17.mobile\u002F03.parent-mobile",{"title":575,"path":576,"stem":577,"icon":578},"QR & Barcode Attendance Scanning","\u002Fen\u002Fmobile\u002Fqr-attendance","en\u002F17.mobile\u002F04.qr-attendance","i-lucide-qr-code",{"title":580,"path":581,"stem":582,"icon":499},"Mobile Offline Sync Engine","\u002Fen\u002Fmobile\u002Foffline-sync","en\u002F17.mobile\u002F05.offline-sync",{"title":584,"icon":585,"path":586,"stem":587,"children":588,"page":35},"Documents & Compliance","i-lucide-folder-archive","\u002Fen\u002Fdocuments","en\u002F18.documents",[589,593,597,601],{"title":590,"path":591,"stem":592,"icon":585},"Documents & Compliance Overview","\u002Fen\u002Fdocuments\u002Foverview","en\u002F18.documents\u002F01.overview",{"title":594,"path":595,"stem":596,"icon":513},"Student Compliance Tracking","\u002Fen\u002Fdocuments\u002Fstudent-compliance","en\u002F18.documents\u002F02.student-compliance",{"title":598,"path":599,"stem":600,"icon":161},"Parent Uploads & Review Queue","\u002Fen\u002Fdocuments\u002Fparent-submissions","en\u002F18.documents\u002F03.parent-submissions",{"title":602,"path":603,"stem":604,"icon":605},"Institutional Policies & Handbooks","\u002Fen\u002Fdocuments\u002Finstitutional-policies","en\u002F18.documents\u002F04.institutional-policies","i-lucide-files",{"title":607,"icon":130,"path":608,"stem":609,"children":610,"page":35},"Super Admin & Platform Operations","\u002Fen\u002Fsuperadmin","en\u002F19.superadmin",[611,615,619,623],{"title":612,"path":613,"stem":614,"icon":46},"Super Admin Overview","\u002Fen\u002Fsuperadmin\u002Foverview","en\u002F19.superadmin\u002F01.overview",{"title":616,"path":617,"stem":618,"icon":535},"Tenant Provisioning","\u002Fen\u002Fsuperadmin\u002Ftenant-management","en\u002F19.superadmin\u002F02.tenant-management",{"title":620,"path":621,"stem":622,"icon":81},"Subscriptions & Billing","\u002Fen\u002Fsuperadmin\u002Fsubscriptions-billing","en\u002F19.superadmin\u002F03.subscriptions-billing",{"title":624,"path":625,"stem":626,"icon":627},"System Monitoring","\u002Fen\u002Fsuperadmin\u002Fsystem-monitoring","en\u002F19.superadmin\u002F04.system-monitoring","i-lucide-activity",{"title":629,"icon":630,"path":631,"stem":632,"children":633,"page":35},"DevOps & Deployment","i-lucide-server","\u002Fen\u002Fdevops","en\u002F20.devops",[634,638,643,648],{"title":635,"path":636,"stem":637,"icon":528},"Deployment Architecture","\u002Fen\u002Fdevops\u002Foverview","en\u002F20.devops\u002F01.overview",{"title":639,"path":640,"stem":641,"icon":642},"Production Docker Runbook","\u002Fen\u002Fdevops\u002Fdocker-deployment","en\u002F20.devops\u002F02.docker-deployment","i-lucide-box",{"title":644,"path":645,"stem":646,"icon":647},"Development Setup","\u002Fen\u002Fdevops\u002Fdevelopment-setup","en\u002F20.devops\u002F03.development-setup","i-lucide-code-2",{"title":649,"path":650,"stem":651,"icon":652},"Backups & Disaster Recovery","\u002Fen\u002Fdevops\u002Fbackup-disaster-recovery","en\u002F20.devops\u002F04.backup-disaster-recovery","i-lucide-database-backup",{"title":654,"icon":513,"path":655,"stem":656,"children":657,"page":35},"Security & Compliance","\u002Fen\u002Fsecurity","en\u002F21.security",[658,663,668],{"title":659,"path":660,"stem":661,"icon":662},"Security Architecture","\u002Fen\u002Fsecurity\u002Foverview","en\u002F21.security\u002F01.overview","i-lucide-shield",{"title":664,"path":665,"stem":666,"icon":667},"Data Privacy & Compliance","\u002Fen\u002Fsecurity\u002Fdata-privacy-compliance","en\u002F21.security\u002F02.data-privacy-compliance","i-lucide-lock",{"title":669,"path":670,"stem":671,"icon":513},"File Upload Hardening","\u002Fen\u002Fsecurity\u002Ffile-upload-hardening","en\u002F21.security\u002F03.file-upload-hardening",{"title":673,"icon":555,"path":674,"stem":675,"children":676,"page":35},"Hardware & Integrations","\u002Fen\u002Fintegrations","en\u002F22.integrations",[677,682,686,691],{"title":678,"path":679,"stem":680,"icon":681},"Integrations Overview","\u002Fen\u002Fintegrations\u002Foverview","en\u002F22.integrations\u002F01.overview","i-lucide-layers",{"title":683,"path":684,"stem":685,"icon":56},"Smart Siren & Bell","\u002Fen\u002Fintegrations\u002Fsmart-siren-iot","en\u002F22.integrations\u002F02.smart-siren-iot",{"title":687,"path":688,"stem":689,"icon":690},"RFID & NFC Smart Kiosk","\u002Fen\u002Fintegrations\u002Frfid-nfc-kiosk","en\u002F22.integrations\u002F03.rfid-nfc-kiosk","i-lucide-contact",{"title":692,"path":693,"stem":694,"icon":695},"Messaging Gateways","\u002Fen\u002Fintegrations\u002Fmessaging-gateways","en\u002F22.integrations\u002F04.messaging-gateways","i-lucide-messages-square",{"id":697,"title":698,"body":699,"description":1257,"extension":1258,"links":1259,"meta":1260,"navigation":1261,"path":640,"seo":1262,"stem":641,"__hash__":1263},"docs_en\u002Fen\u002F20.devops\u002F02.docker-deployment.md","Production Docker Deployment Runbook",{"type":700,"value":701,"toc":1250},"minimark",[702,706,710,713,718,721,773,775,779,782,843,850,997,999,1003,1006,1028,1031,1045,1048,1056,1058,1062,1065,1128,1130,1134,1137,1206,1209,1246],[703,704,698],"h1",{"id":705},"production-docker-deployment-runbook",[707,708,709],"p",{},"This runbook guides system administrators through deploying YeneSchool into production using the official Docker Compose deployment stack.",[711,712],"hr",{},[714,715,717],"h2",{"id":716},"_1-prerequisites","1. Prerequisites",[707,719,720],{},"Before starting, ensure the host server satisfies these minimum requirements:",[722,723,724,732,738,749,755],"ul",{},[725,726,727,731],"li",{},[728,729,730],"strong",{},"Operating System",": Ubuntu 22.04 LTS, Debian 12, or AlmaLinux 9 (64-bit).",[725,733,734,737],{},[728,735,736],{},"Docker Engine",": Version 24.0+ installed and running.",[725,739,740,743,744,748],{},[728,741,742],{},"Docker Compose",": Plugin version v2.20+ (",[745,746,747],"code",{},"docker compose version",").",[725,750,751,754],{},[728,752,753],{},"Hardware",": Minimum 4 vCPUs, 16 GB RAM, and 50 GB available SSD disk space.",[725,756,757,760,761,764,765,768,769,772],{},[728,758,759],{},"Firewall",": Ports ",[745,762,763],{},"80"," (HTTP), ",[745,766,767],{},"443"," (HTTPS), and ",[745,770,771],{},"22"," (SSH) accessible.",[711,774],{},[714,776,778],{"id":777},"_2-environment-configuration","2. Environment Configuration",[707,780,781],{},"Clone the repository and copy the production environment template:",[783,784,789],"pre",{"className":785,"code":786,"language":787,"meta":788,"style":788},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https:\u002F\u002Fgithub.com\u002Fyour-org\u002FYeneSchool-School-Management-System.git\ncd YeneSchool-School-Management-System\n\n# Copy production environment template\ncp .env.example .env\n","bash","",[745,790,791,807,817,824,831],{"__ignoreMap":788},[792,793,796,800,804],"span",{"class":794,"line":795},"line",1,[792,797,799],{"class":798},"sBMFI","git",[792,801,803],{"class":802},"sfazB"," clone",[792,805,806],{"class":802}," https:\u002F\u002Fgithub.com\u002Fyour-org\u002FYeneSchool-School-Management-System.git\n",[792,808,810,814],{"class":794,"line":809},2,[792,811,813],{"class":812},"s2Zo4","cd",[792,815,816],{"class":802}," YeneSchool-School-Management-System\n",[792,818,820],{"class":794,"line":819},3,[792,821,823],{"emptyLinePlaceholder":822},true,"\n",[792,825,827],{"class":794,"line":826},4,[792,828,830],{"class":829},"sHwdD","# Copy production environment template\n",[792,832,834,837,840],{"class":794,"line":833},5,[792,835,836],{"class":798},"cp",[792,838,839],{"class":802}," .env.example",[792,841,842],{"class":802}," .env\n",[707,844,845,846,849],{},"Edit ",[745,847,848],{},".env"," and configure production secrets:",[783,851,855],{"className":852,"code":853,"language":854,"meta":788,"style":788},"language-env shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Database Credentials\nDB_USER=yene_admin\nDB_PASSWORD=YOUR_STRONG_RANDOM_PASSWORD_HERE\nDB_NAME=yeneschool_production\n\n# Direct and Pooled Connection URLs\nDATABASE_URL=\"postgresql:\u002F\u002Fyene_admin:YOUR_STRONG_RANDOM_PASSWORD_HERE@postgres:5432\u002Fyeneschool_production?schema=public\"\nDATABASE_POOL_URL=\"postgresql:\u002F\u002Fyene_admin:YOUR_STRONG_RANDOM_PASSWORD_HERE@pgbouncer:6432\u002Fyeneschool_production?schema=public\"\n\n# Security & Authentication\nJWT_SECRET=GENERATE_64_CHAR_RANDOM_HEX_STRING\nJWT_EXPIRES_IN=15m\nREFRESH_TOKEN_SECRET=GENERATE_ANOTHER_64_CHAR_RANDOM_HEX_STRING\nREFRESH_TOKEN_EXPIRES_IN=7d\n\n# Cache & Queues\nREDIS_URL=redis:\u002F\u002Fredis:6379\n\n# AI Assistant Providers (OpenRouter \u002F Gemini)\nAI_PROVIDER=gemini\nAI_MODEL=models\u002Fgemini-2.5-flash\nAI_API_KEY=your_gemini_api_key_here\n\n# Base URL for Email & Push Callbacks\nAPP_BASE_URL=https:\u002F\u002Fyeneschool.me\n","env",[745,856,857,862,867,872,877,881,887,893,899,904,910,916,922,928,934,939,945,951,956,962,968,974,980,985,991],{"__ignoreMap":788},[792,858,859],{"class":794,"line":795},[792,860,861],{},"# Database Credentials\n",[792,863,864],{"class":794,"line":809},[792,865,866],{},"DB_USER=yene_admin\n",[792,868,869],{"class":794,"line":819},[792,870,871],{},"DB_PASSWORD=YOUR_STRONG_RANDOM_PASSWORD_HERE\n",[792,873,874],{"class":794,"line":826},[792,875,876],{},"DB_NAME=yeneschool_production\n",[792,878,879],{"class":794,"line":833},[792,880,823],{"emptyLinePlaceholder":822},[792,882,884],{"class":794,"line":883},6,[792,885,886],{},"# Direct and Pooled Connection URLs\n",[792,888,890],{"class":794,"line":889},7,[792,891,892],{},"DATABASE_URL=\"postgresql:\u002F\u002Fyene_admin:YOUR_STRONG_RANDOM_PASSWORD_HERE@postgres:5432\u002Fyeneschool_production?schema=public\"\n",[792,894,896],{"class":794,"line":895},8,[792,897,898],{},"DATABASE_POOL_URL=\"postgresql:\u002F\u002Fyene_admin:YOUR_STRONG_RANDOM_PASSWORD_HERE@pgbouncer:6432\u002Fyeneschool_production?schema=public\"\n",[792,900,902],{"class":794,"line":901},9,[792,903,823],{"emptyLinePlaceholder":822},[792,905,907],{"class":794,"line":906},10,[792,908,909],{},"# Security & Authentication\n",[792,911,913],{"class":794,"line":912},11,[792,914,915],{},"JWT_SECRET=GENERATE_64_CHAR_RANDOM_HEX_STRING\n",[792,917,919],{"class":794,"line":918},12,[792,920,921],{},"JWT_EXPIRES_IN=15m\n",[792,923,925],{"class":794,"line":924},13,[792,926,927],{},"REFRESH_TOKEN_SECRET=GENERATE_ANOTHER_64_CHAR_RANDOM_HEX_STRING\n",[792,929,931],{"class":794,"line":930},14,[792,932,933],{},"REFRESH_TOKEN_EXPIRES_IN=7d\n",[792,935,937],{"class":794,"line":936},15,[792,938,823],{"emptyLinePlaceholder":822},[792,940,942],{"class":794,"line":941},16,[792,943,944],{},"# Cache & Queues\n",[792,946,948],{"class":794,"line":947},17,[792,949,950],{},"REDIS_URL=redis:\u002F\u002Fredis:6379\n",[792,952,954],{"class":794,"line":953},18,[792,955,823],{"emptyLinePlaceholder":822},[792,957,959],{"class":794,"line":958},19,[792,960,961],{},"# AI Assistant Providers (OpenRouter \u002F Gemini)\n",[792,963,965],{"class":794,"line":964},20,[792,966,967],{},"AI_PROVIDER=gemini\n",[792,969,971],{"class":794,"line":970},21,[792,972,973],{},"AI_MODEL=models\u002Fgemini-2.5-flash\n",[792,975,977],{"class":794,"line":976},22,[792,978,979],{},"AI_API_KEY=your_gemini_api_key_here\n",[792,981,983],{"class":794,"line":982},23,[792,984,823],{"emptyLinePlaceholder":822},[792,986,988],{"class":794,"line":987},24,[792,989,990],{},"# Base URL for Email & Push Callbacks\n",[792,992,994],{"class":794,"line":993},25,[792,995,996],{},"APP_BASE_URL=https:\u002F\u002Fyeneschool.me\n",[711,998],{},[714,1000,1002],{"id":1001},"_3-launching-the-production-stack","3. Launching the Production Stack",[707,1004,1005],{},"Build and start all services in detached mode:",[783,1007,1009],{"className":785,"code":1008,"language":787,"meta":788,"style":788},"docker compose up -d --build\n",[745,1010,1011],{"__ignoreMap":788},[792,1012,1013,1016,1019,1022,1025],{"class":794,"line":795},[792,1014,1015],{"class":798},"docker",[792,1017,1018],{"class":802}," compose",[792,1020,1021],{"class":802}," up",[792,1023,1024],{"class":802}," -d",[792,1026,1027],{"class":802}," --build\n",[707,1029,1030],{},"Verify that all service containers are healthy:",[783,1032,1034],{"className":785,"code":1033,"language":787,"meta":788,"style":788},"docker compose ps\n",[745,1035,1036],{"__ignoreMap":788},[792,1037,1038,1040,1042],{"class":794,"line":795},[792,1039,1015],{"class":798},[792,1041,1018],{"class":802},[792,1043,1044],{"class":802}," ps\n",[707,1046,1047],{},"Expected healthy output:",[783,1049,1054],{"className":1050,"code":1052,"language":1053,"meta":788},[1051],"language-text","NAME           IMAGE                      STATUS                   PORTS\nsms_postgres   pgvector\u002Fpgvector:pg16     Up (healthy)             0.0.0.0:5433->5432\u002Ftcp\nsms_redis      redis:7-alpine             Up (healthy)             6379\u002Ftcp\nsms_pgbouncer  edoburu\u002Fpgbouncer          Up (healthy)             6432\u002Ftcp\nsms_backend    yeneschool\u002Fbackend         Up (healthy)             8001\u002Ftcp\nsms_frontend   yeneschool\u002Ffrontend        Up (healthy)             3000\u002Ftcp\nsms_nginx      nginx:alpine               Up (healthy)             0.0.0.0:80->80\u002Ftcp, 0.0.0.0:443->443\u002Ftcp\n","text",[745,1055,1052],{"__ignoreMap":788},[711,1057],{},[714,1059,1061],{"id":1060},"_4-applying-database-migrations","4. Applying Database Migrations",[707,1063,1064],{},"Once the database container is healthy, run Prisma migrations to build the relational schema:",[783,1066,1068],{"className":785,"code":1067,"language":787,"meta":788,"style":788},"# Execute migrations inside the running backend container\ndocker compose exec backend npx prisma migrate deploy\n\n# (Optional) Seed initial system permissions and superadmin user\ndocker compose exec backend npx prisma db seed\n",[745,1069,1070,1075,1099,1103,1108],{"__ignoreMap":788},[792,1071,1072],{"class":794,"line":795},[792,1073,1074],{"class":829},"# Execute migrations inside the running backend container\n",[792,1076,1077,1079,1081,1084,1087,1090,1093,1096],{"class":794,"line":809},[792,1078,1015],{"class":798},[792,1080,1018],{"class":802},[792,1082,1083],{"class":802}," exec",[792,1085,1086],{"class":802}," backend",[792,1088,1089],{"class":802}," npx",[792,1091,1092],{"class":802}," prisma",[792,1094,1095],{"class":802}," migrate",[792,1097,1098],{"class":802}," deploy\n",[792,1100,1101],{"class":794,"line":819},[792,1102,823],{"emptyLinePlaceholder":822},[792,1104,1105],{"class":794,"line":826},[792,1106,1107],{"class":829},"# (Optional) Seed initial system permissions and superadmin user\n",[792,1109,1110,1112,1114,1116,1118,1120,1122,1125],{"class":794,"line":833},[792,1111,1015],{"class":798},[792,1113,1018],{"class":802},[792,1115,1083],{"class":802},[792,1117,1086],{"class":802},[792,1119,1089],{"class":802},[792,1121,1092],{"class":802},[792,1123,1124],{"class":802}," db",[792,1126,1127],{"class":802}," seed\n",[711,1129],{},[714,1131,1133],{"id":1132},"_5-monitoring-logs-operational-verification","5. Monitoring Logs & Operational Verification",[707,1135,1136],{},"Stream logs from specific services to verify normal operation:",[783,1138,1140],{"className":785,"code":1139,"language":787,"meta":788,"style":788},"# Stream backend API logs\ndocker compose logs -f backend\n\n# Stream background queue worker logs\ndocker compose logs -f redis\n\n# Stream Nginx access and error logs\ndocker compose logs -f nginx\n",[745,1141,1142,1147,1162,1166,1171,1184,1188,1193],{"__ignoreMap":788},[792,1143,1144],{"class":794,"line":795},[792,1145,1146],{"class":829},"# Stream backend API logs\n",[792,1148,1149,1151,1153,1156,1159],{"class":794,"line":809},[792,1150,1015],{"class":798},[792,1152,1018],{"class":802},[792,1154,1155],{"class":802}," logs",[792,1157,1158],{"class":802}," -f",[792,1160,1161],{"class":802}," backend\n",[792,1163,1164],{"class":794,"line":819},[792,1165,823],{"emptyLinePlaceholder":822},[792,1167,1168],{"class":794,"line":826},[792,1169,1170],{"class":829},"# Stream background queue worker logs\n",[792,1172,1173,1175,1177,1179,1181],{"class":794,"line":833},[792,1174,1015],{"class":798},[792,1176,1018],{"class":802},[792,1178,1155],{"class":802},[792,1180,1158],{"class":802},[792,1182,1183],{"class":802}," redis\n",[792,1185,1186],{"class":794,"line":883},[792,1187,823],{"emptyLinePlaceholder":822},[792,1189,1190],{"class":794,"line":889},[792,1191,1192],{"class":829},"# Stream Nginx access and error logs\n",[792,1194,1195,1197,1199,1201,1203],{"class":794,"line":895},[792,1196,1015],{"class":798},[792,1198,1018],{"class":802},[792,1200,1155],{"class":802},[792,1202,1158],{"class":802},[792,1204,1205],{"class":802}," nginx\n",[707,1207,1208],{},"To gracefully stop or restart the stack:",[783,1210,1212],{"className":785,"code":1211,"language":787,"meta":788,"style":788},"# Restart stack with zero data loss (volumes remain persistent)\ndocker compose restart\n\n# Shutdown stack\ndocker compose down\n",[745,1213,1214,1219,1228,1232,1237],{"__ignoreMap":788},[792,1215,1216],{"class":794,"line":795},[792,1217,1218],{"class":829},"# Restart stack with zero data loss (volumes remain persistent)\n",[792,1220,1221,1223,1225],{"class":794,"line":809},[792,1222,1015],{"class":798},[792,1224,1018],{"class":802},[792,1226,1227],{"class":802}," restart\n",[792,1229,1230],{"class":794,"line":819},[792,1231,823],{"emptyLinePlaceholder":822},[792,1233,1234],{"class":794,"line":826},[792,1235,1236],{"class":829},"# Shutdown stack\n",[792,1238,1239,1241,1243],{"class":794,"line":833},[792,1240,1015],{"class":798},[792,1242,1018],{"class":802},[792,1244,1245],{"class":802}," down\n",[1247,1248,1249],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":788,"searchDepth":809,"depth":809,"links":1251},[1252,1253,1254,1255,1256],{"id":716,"depth":809,"text":717},{"id":777,"depth":809,"text":778},{"id":1001,"depth":809,"text":1002},{"id":1060,"depth":809,"text":1061},{"id":1132,"depth":809,"text":1133},"Step-by-step runbook for deploying YeneSchool in production using Docker Compose — secrets setup, database migrations, and Nginx SSL configuration.","md",null,{"icon":642},{"title":639,"icon":642},{"title":698,"description":1257},"nnXteFsVrl-x9nSt_xnp-jrL--BnLCpWpDwoi2gB4TM",[1265,1267],{"title":635,"path":636,"stem":637,"description":1266,"icon":528,"children":-1},"Comprehensive architecture overview of YeneSchool's production container topology — PostgreSQL with pgvector, PgBouncer, Redis BullMQ, NestJS, Next.js, and Nginx.",{"title":644,"path":645,"stem":646,"description":1268,"icon":647,"children":-1},"Guide for setting up YeneSchool locally for active development — hot reloading with docker-compose.dev.yml, manual dev servers, and running security tests.",1791357983247]