แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ Kubernetes-แƒ˜แƒก แƒจแƒ˜แƒ’แƒœแƒ˜แƒ— แƒ“แƒ แƒ’แƒแƒ แƒ”แƒ—

แƒชแƒแƒขแƒ แƒฎแƒœแƒ˜แƒก แƒฌแƒ˜แƒœ แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒ” แƒžแƒแƒกแƒฃแƒฎแƒ˜ Docker-แƒจแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒกแƒ˜แƒชแƒแƒชแƒฎแƒšแƒ˜แƒกแƒ แƒ“แƒ แƒ›แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒ— แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒกแƒแƒ“แƒแƒช แƒ›แƒแƒœ แƒ›แƒแƒ™แƒšแƒ”แƒ“ แƒแƒฆแƒœแƒ˜แƒจแƒœแƒ, แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ แƒ˜แƒกแƒ”, แƒ แƒแƒ› แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ›แƒ แƒ™แƒแƒ แƒ’แƒแƒ“ แƒ˜แƒ›แƒฃแƒจแƒแƒแƒก Kuber-แƒจแƒ˜, แƒแƒ›แƒแƒ˜แƒฆแƒแƒก แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ›แƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒฃแƒšแƒแƒ“ แƒ˜แƒ›แƒฃแƒจแƒแƒแƒก แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“, แƒ—แƒฃแƒœแƒ“แƒแƒช Docker-แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒ—. แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒ แƒ—แƒฃแƒšแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ โ€žแƒ แƒ”แƒชแƒ”แƒžแƒขแƒ˜โ€œ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ•แƒ˜แƒœแƒ›แƒ”แƒก แƒ’แƒแƒ›แƒแƒแƒ“แƒ’แƒ”แƒก :) แƒ™แƒแƒ“แƒ˜ แƒแƒ แƒ˜แƒก แƒžแƒ˜แƒ—แƒแƒœแƒจแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒšแƒแƒ’แƒ˜แƒ™แƒ แƒ”แƒœแƒแƒ–แƒ” แƒแƒ  แƒแƒ แƒ˜แƒก แƒ›แƒ˜แƒ‘แƒ›แƒฃแƒšแƒ˜.

แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ Kubernetes-แƒ˜แƒก แƒจแƒ˜แƒ’แƒœแƒ˜แƒ— แƒ“แƒ แƒ’แƒแƒ แƒ”แƒ—

แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒก แƒกแƒแƒคแƒฃแƒซแƒ•แƒ”แƒšแƒ˜ แƒแƒกแƒ”แƒ—แƒ˜แƒ: แƒแƒ“แƒ”แƒกแƒฆแƒแƒช แƒ˜แƒงแƒ แƒ”แƒ แƒ—แƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜, แƒ—แƒแƒ•แƒ˜แƒ“แƒแƒœ แƒ”แƒก แƒ˜แƒงแƒ แƒžแƒแƒขแƒแƒ แƒ แƒ›แƒแƒœแƒแƒšแƒ˜แƒ—แƒ˜ แƒ™แƒแƒ›แƒฃแƒœแƒแƒšแƒฃแƒ แƒ˜ แƒ“แƒ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜แƒ—, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ“แƒ แƒแƒ—แƒ แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜ แƒ˜แƒก แƒ’แƒแƒ˜แƒ–แƒแƒ แƒ“แƒ, แƒ“แƒแƒงแƒแƒคแƒ˜แƒšแƒ˜ แƒ˜แƒงแƒ แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ”แƒ‘แƒแƒ“, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ—แƒแƒ•แƒ˜แƒก แƒ›แƒฎแƒ แƒ˜แƒ• แƒ“แƒแƒ˜แƒฌแƒงแƒ แƒ›แƒ˜แƒ™แƒ แƒแƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ”แƒ‘แƒแƒ“ แƒ“แƒแƒงแƒแƒคแƒ แƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ›แƒแƒกแƒจแƒขแƒแƒ‘แƒฃแƒ แƒ˜. แƒ—แƒแƒ•แƒ“แƒแƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“, แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ’แƒแƒ™แƒ”แƒ—แƒ“แƒ แƒจแƒ˜แƒจแƒ•แƒ”แƒš VPS-แƒ–แƒ”, แƒ™แƒแƒ“แƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ–แƒ”แƒ“แƒแƒช แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒงแƒ Ansible-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ˜ แƒจแƒ”แƒ“แƒ’แƒ”แƒœแƒ˜แƒšแƒ˜ แƒ˜แƒงแƒ YAML แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒ—, แƒกแƒแƒญแƒ˜แƒ แƒ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒ—, แƒ“แƒ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒงแƒ แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜. แƒšแƒแƒ™แƒแƒšแƒฃแƒ แƒ˜ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ, แƒ แƒแƒช แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒแƒกแƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ˜แƒงแƒ, แƒ แƒแƒ“แƒ’แƒแƒœ .k แƒ”แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ แƒ˜แƒขแƒ•แƒ˜แƒ แƒ—แƒ”แƒ‘แƒ แƒ’แƒšแƒแƒ‘แƒแƒšแƒฃแƒ  แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒแƒ“แƒ’แƒ˜แƒšแƒ˜แƒ“แƒแƒœ.

แƒ—แƒฃแƒ›แƒชแƒ, แƒ›แƒ˜แƒ™แƒ แƒแƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒ–แƒ แƒ“แƒ, แƒ›แƒแƒ—แƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒชแƒ”แƒœแƒขแƒ แƒแƒšแƒ˜แƒ–แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒฎแƒ”-แƒขแƒงแƒ˜แƒก แƒแƒฆแƒ แƒ˜แƒชแƒฎแƒ•แƒ แƒ“แƒ แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜แƒœแƒ’แƒ˜, แƒฃแƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ แƒ›แƒ”แƒขแƒงแƒ•แƒ”แƒšแƒ แƒ™แƒฃแƒ‘แƒ”แƒ แƒจแƒ˜ แƒ’แƒแƒ“แƒแƒกแƒ•แƒšแƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฏแƒ”แƒ  แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ”แƒแƒ‘แƒก. แƒแƒฆแƒœแƒ˜แƒจแƒœแƒฃแƒšแƒ˜ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒญแƒ แƒแƒจแƒ˜ แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒแƒกแƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“, Kubernetes แƒ’แƒ—แƒแƒ•แƒแƒ–แƒแƒ‘แƒ— แƒ˜แƒœแƒคแƒ แƒแƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒก แƒ›แƒแƒ แƒ—แƒ•แƒ˜แƒก แƒ—แƒแƒ•แƒ˜แƒก แƒ›แƒ˜แƒ“แƒ’แƒแƒ›แƒ”แƒ‘แƒก, แƒ›แƒแƒ— แƒจแƒแƒ แƒ˜แƒก แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ”แƒ‘แƒ˜ ะธ แƒ›แƒแƒ—แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒ’แƒ–แƒ”แƒ‘แƒ˜. แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜ แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒฃแƒšแƒ˜ แƒ“แƒ แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒแƒ, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒ›แƒ˜แƒกแƒ˜ แƒแƒ  แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒคแƒแƒฅแƒขแƒ˜แƒฃแƒ แƒแƒ“ แƒชแƒแƒ“แƒ•แƒแƒ! แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ›แƒแƒ•แƒ“แƒ แƒแƒฃแƒšแƒแƒ“, แƒ›แƒกแƒฃแƒ แƒก แƒจแƒ”แƒ•แƒ˜แƒœแƒแƒ แƒฉแƒฃแƒœแƒ แƒฉแƒ”แƒ›แƒ˜ แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒคแƒแƒ แƒ›แƒแƒขแƒ˜ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒแƒกแƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก: แƒฏแƒ”แƒ  แƒ”แƒ แƒ—แƒ˜, แƒ”แƒ แƒ—แƒœแƒแƒ˜แƒ แƒแƒ“ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ แƒ˜แƒ’แƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ›แƒ˜แƒ™แƒ แƒแƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒจแƒ˜ แƒ“แƒ แƒ›แƒ”แƒแƒ แƒ”แƒช, แƒจแƒ”แƒ•แƒซแƒšแƒ แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ• แƒแƒžแƒแƒ แƒแƒขแƒ–แƒ” แƒ”แƒ แƒ—แƒ˜ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—. แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ˜.

แƒแƒ›แƒแƒกแƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ—, แƒจแƒ”แƒ˜แƒชแƒ•แƒแƒšแƒ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก แƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜, แƒ แƒแƒ—แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒงแƒแƒคแƒ˜แƒšแƒ˜แƒงแƒ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ แƒ แƒแƒ’แƒแƒ แƒช แƒฉแƒ•แƒ”แƒœแƒก แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ  แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒคแƒแƒ˜แƒšแƒ—แƒแƒœ, แƒแƒกแƒ”แƒ•แƒ” Kuber-แƒ˜แƒก แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ”แƒ‘แƒ—แƒแƒœ. แƒฃแƒคแƒ แƒ แƒฎแƒ˜แƒกแƒขแƒ˜ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ แƒแƒกแƒ”แƒ•แƒ” แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒงแƒ แƒ›แƒ”แƒกแƒแƒ›แƒ” แƒžแƒ˜แƒ—แƒแƒœแƒ˜แƒก แƒ”แƒœแƒแƒ–แƒ”, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒœแƒแƒ˜แƒ แƒแƒ“:

Dict[str, Dict[str, Union[str, int, float]]]

แƒแƒœแƒฃ, แƒกแƒแƒ‘แƒแƒšแƒแƒ cogfig แƒแƒ แƒ˜แƒก แƒšแƒ”แƒฅแƒกแƒ˜แƒ™แƒแƒœแƒ˜ แƒ“แƒแƒกแƒแƒฎแƒ”แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒ”แƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ›แƒ”แƒšแƒ—แƒแƒ’แƒแƒœ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒแƒ แƒ˜แƒก แƒšแƒ”แƒฅแƒกแƒ˜แƒ™แƒแƒœแƒ˜ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒขแƒ˜แƒžแƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜แƒ—. แƒ“แƒ แƒกแƒ”แƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒแƒฆแƒฌแƒ”แƒ แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒแƒก แƒ“แƒ แƒฌแƒ•แƒ“แƒแƒ›แƒแƒก แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒขแƒ˜แƒžแƒ˜แƒก แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ–แƒ”. แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜:

adminka:
  django_secret: "ExtraLongAndHardCode"

db_main:
  engine: mysql
  host: 256.128.64.32
  user: cool_user
  password: "SuperHardPassword"

redis:
  host: 256.128.64.32
  pw: "SuperHardPassword"
  port: 26379

smtp:
  server: smtp.gmail.com
  port: 465
  email: [email protected]
  pw: "SuperHardPassword"

แƒแƒ›แƒแƒ•แƒ” แƒ“แƒ แƒแƒก, แƒ•แƒ”แƒšแƒ˜ engine แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ SQLite-แƒ–แƒ” แƒ“แƒ redis แƒ“แƒแƒแƒงแƒ”แƒœแƒ”แƒ— mock, แƒแƒกแƒ”แƒ•แƒ” แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒจแƒ”แƒกแƒแƒœแƒแƒฎแƒ˜ แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜ - แƒ”แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ แƒกแƒฌแƒแƒ แƒแƒ“ แƒแƒ แƒ˜แƒก แƒแƒฆแƒ˜แƒแƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ“แƒ แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜, แƒ แƒแƒช แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒก แƒ™แƒแƒ“แƒ˜แƒก แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒแƒก แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ”แƒ แƒ—แƒ”แƒฃแƒšแƒ˜แƒก แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒกแƒฎแƒ•แƒ แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ”แƒก แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒ˜แƒ— แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜แƒ แƒฉแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ“แƒ’แƒแƒœ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒกแƒฎแƒ•แƒ แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒ - แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ™แƒแƒ“แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒ’แƒแƒœแƒ™แƒฃแƒ—แƒ•แƒœแƒ˜แƒšแƒ˜แƒ แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒแƒœแƒแƒšแƒ˜แƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ’แƒแƒ›แƒแƒ—แƒ•แƒšแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ˜แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒแƒ แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒแƒ แƒ™แƒ”แƒกแƒขแƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒš แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ”แƒ‘แƒ–แƒ”, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ–แƒ” แƒ“แƒ แƒแƒœแƒแƒšแƒ˜แƒขแƒ˜แƒ™แƒแƒกแƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒ›แƒžแƒ˜แƒฃแƒขแƒ”แƒ แƒ”แƒ‘แƒ–แƒ”, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒกแƒแƒช แƒกแƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ. แƒ“แƒ แƒ’แƒแƒ›แƒแƒ แƒ—แƒ”แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒ›แƒžแƒšแƒ”แƒฅแƒกแƒฃแƒ แƒ˜ แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ›แƒแƒจแƒคแƒแƒ—แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”. แƒกแƒฎแƒ•แƒแƒ—แƒ แƒจแƒแƒ แƒ˜แƒก, แƒชแƒฃแƒ“แƒ˜ แƒแƒ  แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ–แƒ˜แƒแƒ แƒ”แƒ‘แƒ, แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœแƒ˜ แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒฎแƒ”แƒšแƒกแƒแƒฌแƒงแƒแƒ”แƒ‘แƒ˜, แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒ“แƒ˜แƒก แƒฉแƒแƒ—แƒ•แƒšแƒ˜แƒ—, แƒ“แƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ setup.py - แƒ”แƒ แƒ—แƒแƒ“ แƒ”แƒก แƒแƒ”แƒ แƒ—แƒ˜แƒแƒœแƒ”แƒ‘แƒก แƒฉแƒ•แƒ”แƒœแƒก แƒ™แƒแƒ“แƒก แƒ”แƒ แƒ— แƒ”แƒ™แƒแƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒจแƒ˜, แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒ˜แƒกแƒ แƒ“แƒ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒกแƒ’แƒแƒœ แƒ“แƒแƒ›แƒแƒฃแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒšแƒแƒ“.

Kubernetes pod-แƒ˜แƒก แƒแƒฆแƒฌแƒ”แƒ แƒ แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:

containers:
  - name : enter-api
    image: enter-api:latest
    ports:
      - containerPort: 80
    volumeMounts:
      - name: db-main-secret-volume
        mountPath: /etc/secrets/db-main

volumes:
  - name: db-main-secret-volume
    secret:
      secretName: db-main-secret

แƒแƒœแƒฃ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒ แƒแƒฆแƒฌแƒ”แƒ แƒก แƒ”แƒ แƒ— แƒ›แƒแƒœแƒแƒ™แƒ•แƒ”แƒ—แƒก. แƒ—แƒแƒ•แƒแƒ“ แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ แƒแƒกแƒ”:

apiVersion: v1
kind: Secret
metadata:
  name: db-main-secret
type: Opaque
stringData:
  db_main.yaml: |
    engine: sqlite
    filename: main.sqlite3

แƒ”แƒก แƒ”แƒ แƒ—แƒแƒ“ แƒ˜แƒฌแƒ•แƒ”แƒ•แƒก YAML แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒแƒก แƒ’แƒ–แƒแƒ–แƒ” /etc/secrets/db-main/section_name.yaml

แƒ“แƒ แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒ˜ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒ“แƒ”แƒ‘แƒแƒ แƒ”แƒแƒ‘แƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก root แƒ“แƒ˜แƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜แƒแƒจแƒ˜ แƒแƒœ แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒชแƒ•แƒšแƒแƒ“แƒจแƒ˜ แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ‘แƒ˜แƒšแƒ˜แƒ™แƒ˜แƒก แƒ’แƒแƒกแƒฌแƒ•แƒ แƒ˜แƒ•. แƒแƒ› แƒ›แƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒฃแƒšแƒแƒ‘แƒแƒ–แƒ” แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ™แƒแƒ“แƒ˜ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ˜แƒฎแƒ˜แƒšแƒแƒ— แƒกแƒžแƒแƒ˜แƒšแƒ”แƒ แƒจแƒ˜.

config.py

__author__ = 'AivanF'
__copyright__ = 'Copyright 2020, AivanF'

import os
import yaml

__all__ = ['config']
PROJECT_DIR = os.path.abspath(__file__ + 3 * '/..')
SECRETS_DIR = '/etc/secrets'
KEY_LOG = '_config_log'
KEY_DBG = 'debug'

def is_yes(value):
    if isinstance(value, str):
        value = value.lower()
        if value in ('1', 'on', 'yes', 'true'):
            return True
    else:
        if value in (1, True):
            return True
    return False

def update_config_part(config, key, data):
    if key not in config:
        config[key] = data
    else:
        config[key].update(data)

def parse_big_config(config, filename):
    '''
    Parse YAML config with multiple section
    '''
    if not os.path.isfile(filename):
        return False
    with open(filename) as f:
        config_new = yaml.safe_load(f.read())
        for key, data in config_new.items():
            update_config_part(config, key, data)
        config[KEY_LOG].append(filename)
        return True

def parse_tiny_config(config, key, filename):
    '''
    Parse YAML config with a single section
    '''
    with open(filename) as f:
        config_tiny = yaml.safe_load(f.read())
        update_config_part(config, key, config_tiny)
        config[KEY_LOG].append(filename)

def combine_config():
    config = {
        # To debug config load code
        KEY_LOG: [],
        # To debug other code
        KEY_DBG: is_yes(os.environ.get('DEBUG')),
    }
    # For simple local runs
    CONFIG_SIMPLE = os.path.join(PROJECT_DIR, 'config.yaml')
    parse_big_config(config, CONFIG_SIMPLE)
    # For container's tests
    CONFIG_ENVVAR = os.environ.get('CONFIG')
    if CONFIG_ENVVAR is not None:
        if not parse_big_config(config, CONFIG_ENVVAR):
            raise ValueError(
                f'No config file from EnvVar:n'
                f'{CONFIG_ENVVAR}'
            )
    # For K8s secrets
    for path, dirs, files in os.walk(SECRETS_DIR):
        depth = path[len(SECRETS_DIR):].count(os.sep)
        if depth > 1:
            continue
        for file in files:
            if file.endswith('.yaml'):
                filename = os.path.join(path, file)
                key = file.rsplit('.', 1)[0]
                parse_tiny_config(config, key, filename)
    return config

def build_config():
    config = combine_config()
    # Preprocess
    for key, data in config.items():
        if key.startswith('db_'):
            if data['engine'] == 'sqlite':
                data['filename'] = os.path.join(PROJECT_DIR, data['filename'])
    # To verify correctness
    if config[KEY_DBG]:
        print(f'** Loaded config:n{yaml.dump(config)}')
    else:
        print(f'** Loaded config from: {config[KEY_LOG]}')
    return config

config = build_config()

แƒšแƒแƒ’แƒ˜แƒ™แƒ แƒแƒฅ แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ: แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ— แƒ“แƒ˜แƒ“ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ”แƒ‘แƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ“แƒ˜แƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜แƒแƒ“แƒแƒœ แƒ“แƒ แƒ‘แƒ˜แƒšแƒ˜แƒ™แƒ”แƒ‘แƒก แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒชแƒ•แƒšแƒแƒ“แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—, แƒ“แƒ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒชแƒ˜แƒ แƒ” แƒกแƒ”แƒฅแƒชแƒ˜แƒ”แƒ‘แƒก Kuber-แƒ˜แƒก แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ˜แƒ“แƒแƒœ, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ™แƒ˜ แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ  แƒ•แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ— แƒ›แƒแƒ—. แƒžแƒšแƒฃแƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒชแƒ•แƒšแƒแƒ“แƒ˜. แƒ›แƒ” แƒแƒฆแƒ•แƒœแƒ˜แƒจแƒœแƒแƒ•, แƒ แƒแƒ› แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒซแƒ˜แƒ”แƒ‘แƒ˜แƒกแƒแƒก แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒกแƒ˜แƒฆแƒ แƒ›แƒ˜แƒก แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ, แƒ แƒแƒ“แƒ’แƒแƒœ K8s แƒฅแƒ›แƒœแƒ˜แƒก แƒ“แƒแƒ›แƒแƒšแƒฃแƒš แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒก แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒจแƒ˜, แƒกแƒแƒ“แƒแƒช แƒ—แƒแƒ•แƒแƒ“ แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ˜แƒœแƒแƒฎแƒ”แƒ‘แƒ แƒ“แƒ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ‘แƒ›แƒฃแƒšแƒ˜ แƒ›แƒ“แƒ”แƒ‘แƒแƒ แƒ”แƒแƒ‘แƒก แƒฃแƒคแƒ แƒ แƒ›แƒแƒฆแƒแƒš แƒ“แƒแƒœแƒ”แƒ–แƒ”.

แƒ•แƒ˜แƒ›แƒ”แƒ“แƒแƒ•แƒœแƒ”แƒ‘, แƒ แƒแƒช แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜แƒ แƒ•แƒ˜แƒœแƒ›แƒ”แƒกแƒ—แƒ•แƒ˜แƒก แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ :) แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜ แƒ“แƒ แƒ แƒ”แƒ™แƒแƒ›แƒ”แƒœแƒ“แƒแƒชแƒ˜แƒ แƒฃแƒกแƒแƒคแƒ แƒ—แƒฎแƒแƒ”แƒ‘แƒ˜แƒก แƒแƒœ แƒ’แƒแƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ”แƒ‘แƒ˜แƒก แƒกแƒฎแƒ•แƒ แƒกแƒคแƒ”แƒ แƒแƒ”แƒ‘แƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ— แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒ. แƒกแƒแƒ–แƒแƒ’แƒแƒ“แƒแƒ”แƒ‘แƒ˜แƒก แƒแƒ–แƒ แƒ˜แƒช แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒแƒ, แƒ˜แƒฅแƒœแƒ”แƒ‘ แƒฆแƒ˜แƒ แƒก ConfigMaps-แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ (แƒฉแƒ•แƒ”แƒœแƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜ แƒ›แƒแƒ— แƒฏแƒ”แƒ  แƒแƒ  แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก) แƒ“แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ›แƒแƒฅแƒ•แƒ”แƒงแƒœแƒ”แƒ‘แƒ GitHub / PyPI-แƒ–แƒ”? แƒžแƒ˜แƒ แƒแƒ“แƒแƒ“ แƒ›แƒ” แƒ•แƒคแƒ˜แƒฅแƒ แƒแƒ‘, แƒ แƒแƒ› แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒ แƒแƒ› แƒซแƒแƒšแƒ˜แƒแƒœ แƒ˜แƒœแƒ“แƒ˜แƒ•แƒ˜แƒ“แƒฃแƒแƒšแƒฃแƒ แƒ˜แƒ แƒ˜แƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜ แƒ˜แƒงแƒแƒก แƒฃแƒœแƒ˜แƒ•แƒ”แƒ แƒกแƒแƒšแƒฃแƒ แƒ˜, แƒ“แƒ แƒชแƒแƒขแƒ แƒ—แƒ•แƒแƒšแƒ˜ แƒ’แƒแƒ•แƒฃแƒกแƒฌแƒแƒ แƒ แƒกแƒฎแƒ•แƒ แƒแƒ“แƒแƒ›แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ”แƒ‘แƒก, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ แƒแƒฅ แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜, แƒ“แƒ แƒœแƒ˜แƒฃแƒแƒœแƒกแƒ”แƒ‘แƒ˜แƒก, แƒ แƒฉแƒ”แƒ•แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒกแƒแƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒ, แƒ แƒแƒกแƒแƒช แƒ•แƒ˜แƒ›แƒ”แƒ“แƒแƒ•แƒœแƒ”แƒ‘, แƒ•แƒ˜แƒฎแƒ˜แƒšแƒแƒ• แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒจแƒ˜. , แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜แƒ ๐Ÿ˜‰

แƒ’แƒแƒ›แƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒแƒจแƒ˜ แƒ›แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒแƒ‘แƒ แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒแƒ— แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ“แƒแƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒš แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ”แƒ‘แƒก. แฒจแƒ”แƒ‘แƒ แƒซแƒแƒœแƒ“แƒ˜แƒ—แƒ’แƒ—แƒฎแƒแƒ•แƒ—

แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ›แƒแƒ•แƒแƒฅแƒ•แƒ”แƒงแƒœแƒ แƒ แƒแƒ’แƒแƒ แƒช แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜/แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ?

  • 0,0%แƒ“แƒ˜แƒแƒฎ, แƒ›แƒ” แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ“แƒ˜ /contribution0

  • 33,3%แƒ“แƒ˜แƒแƒฎ, แƒ›แƒจแƒ•แƒ”แƒœแƒ˜แƒ•แƒ แƒแƒ“ แƒŸแƒฆแƒ”แƒ แƒก4

  • 41,7%แƒแƒ แƒ, แƒ•แƒ˜แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒก แƒ”แƒก แƒกแƒแƒ™แƒฃแƒ—แƒแƒ  แƒคแƒแƒ แƒ›แƒแƒขแƒจแƒ˜ แƒ“แƒ แƒ—แƒแƒ•แƒ˜แƒกแƒ˜ แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ“5

  • 25,0%แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ’แƒแƒœ แƒ—แƒแƒ•แƒก แƒจแƒ”แƒ•แƒ˜แƒ™แƒแƒ•แƒ”แƒ‘3

แƒ›แƒ˜แƒกแƒชแƒ แƒฎแƒ›แƒ 12 แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ›แƒ. 3 แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ›แƒ แƒ—แƒแƒ•แƒ˜ แƒจแƒ”แƒ˜แƒ™แƒแƒ•แƒ.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ