ΠΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΠΌ Π΄Π° Π³ΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΠ΅ ΡΡΠ°Π½ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΎΠ΄ ΠΈΠ·Π²Π΅ΡΡΠ°ΡΠΎΡ Π½Π° ΠΠ»Π΅ΠΊΡΠ°Π½Π΄Π°Ρ Π‘ΠΈΠ³Π°ΡΠ΅Π² ΠΎΠ΄ Inventos βΠΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·Π²ΠΎΡ ΠΈ ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ ΡΠΎ Docker + Gitlab CIβ
ΠΠ½ΠΈΠ΅ ΠΊΠΎΠΈ ΡΡΠΎΡΡΠΊΡ ΠΏΠΎΡΠ½ΡΠ²Π°Π°Ρ Π΄Π° Π³ΠΎ ΡΠΏΡΠΎΠ²Π΅Π΄ΡΠ²Π°Π°Ρ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΡΠ°Π·Π²ΠΎΡ ΠΈ ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° Docker + Gitlab CI ΡΠ΅ΡΡΠΎ ΠΏΠΎΡΡΠ°Π²ΡΠ²Π°Π°Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΠΏΡΠ°ΡΠ°ΡΠ°. ΠΠ°Π΄Π΅ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΡΠ½Π΅? ΠΠ°ΠΊΠΎ Π΄Π° ΡΠ΅ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°ΡΠ΅? ΠΠ°ΠΊΠΎ Π΄Π° ΡΠ΅ ΡΠ΅ΡΡΠΈΡΠ°?
ΠΠ²ΠΎΡ ΠΈΠ·Π²Π΅ΡΡΠ°Ρ Π΅ Π΄ΠΎΠ±Π°Ρ Π·Π°ΡΠΎΠ° ΡΡΠΎ Π½Π° ΡΡΡΡΠΊΡΡΡΠΈΡΠ°Π½ Π½Π°ΡΠΈΠ½ Π·Π±ΠΎΡΡΠ²Π° Π·Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΡΠ°Π·Π²ΠΎΡ ΠΈ ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° Docker ΠΈ Gitlab CI. Π‘Π°ΠΌΠΈΠΎΡ ΠΈΠ·Π²Π΅ΡΡΠ°Ρ Π΅ ΠΎΠ΄ 2017 Π³ΠΎΠ΄ΠΈΠ½Π°. ΠΠΈΡΠ»Π°ΠΌ Π΄Π΅ΠΊΠ° ΠΎΠ΄ ΠΎΠ²ΠΎΡ ΠΈΠ·Π²Π΅ΡΡΠ°Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ ΡΠΎΠ±Π΅ΡΠ΅ΡΠ΅ ΠΎΡΠ½ΠΎΠ²ΠΈΡΠ΅, ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡΠ°ΡΠ°, ΠΈΠ΄Π΅ΡΠ°ΡΠ° ΠΈ ΠΈΡΠΊΡΡΡΠ²ΠΎΡΠΎ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅.
ΠΠΎΡ ΡΠ΅ Π³ΡΠΈΠΆΠΈ, Π²Π΅ ΠΌΠΎΠ»Π°ΠΌ ΠΏΠΎΠ΄ ΠΌΠ°ΡΠΊΠ°ΡΠ°.
ΠΠ°Ρ ΡΠ΅ Π²ΠΈΠΊΠ°ΠΌ ΠΠ»Π΅ΠΊΡΠ°Π½Π΄Π°Ρ Π‘ΠΈΠ³Π°ΡΠ΅Π². Π Π°Π±ΠΎΡΠ°ΠΌ Π·Π° Inventos. ΠΠ΅ Π²ΠΈ ΠΊΠ°ΠΆΠ°ΠΌ Π·Π° ΠΌΠΎΠ΅ΡΠΎ ΠΈΡΠΊΡΡΡΠ²ΠΎ ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° Docker ΠΈ ΠΊΠ°ΠΊΠΎ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½ΠΎ Π³ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌΠ΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π²ΠΎ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΠ°ΡΠ°.
Π’Π΅ΠΌΠ° Π½Π° ΠΈΠ·Π²Π΅ΡΡΠ°ΡΠΎΡ: ΠΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·Π²ΠΎΡ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° Docker ΠΈ Gitlab CI.
ΠΠ²Π° Π΅ ΠΌΠΎΡΠΎΡ Π²ΡΠΎΡ ΡΠ°Π·Π³ΠΎΠ²ΠΎΡ Π·Π° ΠΠΎΠΊΠ΅Ρ. ΠΠΎ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΏΡΠ²ΠΈΠΎΡ ΠΈΠ·Π²Π΅ΡΡΠ°Ρ, Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠ΅Π²ΠΌΠ΅ Docker ΡΠ°ΠΌΠΎ Π²ΠΎ ΡΠ°Π·Π²ΠΎΡΠΎΡ Π½Π° ΠΌΠ°ΡΠΈΠ½ΠΈΡΠ΅ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈ. ΠΡΠΎΡΠΎΡ Π½Π° Π²ΡΠ°Π±ΠΎΡΠ΅Π½ΠΈ ΠΊΠΎΠΈ ΠΊΠΎΡΠΈΡΡΠ΅Π»Π΅ Docker Π±ΠΈΠ» ΠΎΠΊΠΎΠ»Ρ 2-3 Π»ΠΈΡΠ°. ΠΠΎΡΡΠ΅ΠΏΠ΅Π½ΠΎ ΡΠ΅ ΡΡΠ΅ΠΊΠ½Π° ΠΈΡΠΊΡΡΡΠ²ΠΎ ΠΈ ΠΎΡΠΈΠ΄ΠΎΠ²ΠΌΠ΅ ΠΌΠ°Π»ΠΊΡ ΠΏΠΎΠ΄Π°Π»Π΅ΠΊΡ. ΠΠΈΠ½ΠΊ Π΄ΠΎ Π½Π°ΡΠ°ΡΠ°
Π¨ΡΠΎ ΡΠ΅ ΠΈΠΌΠ° Π²ΠΎ ΠΎΠ²ΠΎΡ ΠΈΠ·Π²Π΅ΡΡΠ°Ρ? ΠΠ΅ Π³ΠΎ ΡΠΏΠΎΠ΄Π΅Π»ΠΈΠΌΠ΅ Π½Π°ΡΠ΅ΡΠΎ ΠΈΡΠΊΡΡΡΠ²ΠΎ Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠ²ΠΈ Π³ΡΠ΅Π±Π»Π° ΡΠΎΠ±ΡΠ°Π²ΠΌΠ΅, ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠ΅ΡΠΈΠ²ΠΌΠ΅. ΠΠ΅ Π±Π΅ΡΠ΅ Π½Π°ΡΠ΅ΠΊΠ°Π΄Π΅ ΡΠ±Π°Π²ΠΎ, Π½ΠΎ Π½ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π΄Π° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌΠ΅ ΠΏΠΎΠ½Π°ΡΠ°ΠΌΡ.
ΠΠ°ΡΠ΅ΡΠΎ ΠΌΠΎΡΠΎ: ΠΏΡΠΈΠΊΠ»ΡΡΠ΅ΡΠ΅ Π³ΠΎ ΡΠ΅ΡΠΎ ΠΎΠ½Π° ΡΡΠΎ Π½ΠΈ Π΄ΠΎΠ°ΡΠ° Π²ΠΎ ΡΠ°ΠΊΠ°.
ΠΠΎΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π³ΠΈ ΡΠ΅ΡΠ°Π²Π°ΠΌΠ΅?
ΠΠΎΠ³Π° Π΅Π΄Π½Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΠ° ΠΈΠΌΠ° Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΠΈΠΌΠΎΠ²ΠΈ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΎΡ Π΅ Π·Π°Π΅Π΄Π½ΠΈΡΠΊΠΈ ΡΠ΅ΡΡΡΡ. ΠΠΎΡΡΠΎΡΠ°Ρ ΡΠ°Π·ΠΈ ΠΊΠΎΠ³Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΎΡ Π΅ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ ΠΎΠ΄ Π΅Π΄Π΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ Π΄Π°Π΄Π΅Π½ Π½Π° Π΄ΡΡΠ³ ΠΏΡΠΎΠ΅ΠΊΡ Π½Π° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅.
ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΎΡ Π±ΡΠ·ΠΎ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅, ΡΠΎΡ ΡΡΠ΅Π±Π° ΡΡΠΎ ΠΏΠΎΠ±ΡΠ·ΠΎ Π΄Π° Π³ΠΎ ΠΏΡΠ΅Π·Π΅ΠΌΠ΅ ΠΈΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ ΡΡΠ΅Π΄ΠΈΠ½Π°, ΡΡΠΎ ΡΠ΅ ΠΌΡ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° Π½Π°ΠΏΡΠ΅Π΄ΡΠ²Π° Π²ΠΎ ΡΠ΅ΡΠ°Π²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ Π½Π° ΠΎΠ²ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ.
ΠΠ±ΠΈΡΠ½ΠΎ, Π°ΠΊΠΎ ΠΏΠΎΡΠ½Π΅ΡΠ΅ ΠΎΠ΄ Π½ΡΠ»Π°, ΠΈΠΌΠ° ΠΌΠ°Π»Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π²ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ. Π‘Π°ΠΌΠΎ ΠΎΠ»Π΄ΡΠ°ΡΠΌΠ΅ΡΠΈΡΠ΅ ΠΈΠΌΠ°Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ ΠΏΠΎΡΡΠ°Π²Π°Ρ. ΠΡΠ°Π±ΠΎΡΠ΅Π½ΠΈΡΠ΅ ΡΠ°ΠΌΠΈ Π³ΠΎ ΠΏΠΎΡΡΠ°Π²ΡΠ²Π°Π°Ρ ΡΠ²ΠΎΠ΅ΡΠΎ ΡΠ°Π±ΠΎΡΠ½ΠΎ ΠΌΠ΅ΡΡΠΎ Π·Π° Π΅Π΄Π΅Π½ ΠΈΠ»ΠΈ Π΄Π²Π° Π΄Π΅Π½Π°. ΠΠ° Π΄Π° Π³ΠΎ Π·Π°Π±ΡΠ·Π°ΠΌΠ΅ ΠΎΠ²Π°, Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠ΅Π²ΠΌΠ΅ Docker.
Π‘Π»Π΅Π΄Π½Π°ΡΠ° ΠΏΡΠΈΡΠΈΠ½Π° Π΅ ΡΡΠ°Π½Π΄Π°ΡΠ΄ΠΈΠ·Π°ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΏΠΎΡΡΠ°Π²ΠΊΠΈΡΠ΅ Π²ΠΎ Development. Π‘ΠΏΠΎΡΠ΅Π΄ ΠΌΠΎΠ΅ΡΠΎ ΠΈΡΠΊΡΡΡΠ²ΠΎ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈΡΠ΅ ΡΠ΅ΠΊΠΎΠ³Π°Ρ ΠΏΡΠ΅Π·Π΅ΠΌΠ°Π°Ρ ΠΈΠ½ΠΈΡΠΈΡΠ°ΡΠΈΠ²Π°. ΠΠΎ ΡΠ΅ΠΊΠΎΡ ΠΏΠ΅ΡΡΠΈ ΡΠ»ΡΡΠ°Ρ ΡΠ΅ Π²Π½Π΅ΡΡΠ²Π° ΡΠΎΠΏΡΡΠ²Π΅Π½ Π΄ΠΎΠΌΠ΅Π½, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ vasya.dev. ΠΠΎ ΠΌΠ΅Π½Π΅ ΡΠ΅Π΄ΠΈ ΠΌΠΎΡΠΎΡ ΡΠΎΡΠ΅Π΄ ΠΠ΅ΡΡΠ°, ΡΠΈΡ Π΄ΠΎΠΌΠ΅Π½ Π΅ petya.dev. Π’ΠΈΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π°Π°Ρ Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΠ° ΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΡΠ° ΡΠΈΡΡΠ΅ΠΌΡΠΊΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΎ ΠΎΠ²Π° ΠΈΠΌΠ΅ Π½Π° Π΄ΠΎΠΌΠ΅Π½.
ΠΠΎΠ³Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΡΠ°ΡΡΠ΅ ΠΈ ΠΎΠ²ΠΈΠ΅ ΠΈΠΌΠΈΡΠ° Π½Π° Π΄ΠΎΠΌΠ΅Π½ΠΈ ΠΏΠΎΡΠ½ΡΠ²Π°Π°Ρ Π΄Π° ΡΠ΅ Π²ΠΊΠ»ΡΡΡΠ²Π°Π°Ρ Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ°, ΡΠ΅ ΠΏΠΎΡΠ°Π²ΡΠ²Π° ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡ Π²ΠΎ ΠΎΠΊΠΎΠ»ΠΈΠ½ΠΈΡΠ΅ Π·Π° ΡΠ°Π·Π²ΠΎΡ ΠΈ ΠΏΠ°ΡΠ΅ΠΊΠ°ΡΠ° Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΏΡΠ΅ΠΏΠΈΡΡΠ²Π°.
ΠΡΡΠΎΡΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π° ΠΈ ΡΠΎ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈΡΠ΅ Π·Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠ΅ΠΊΠΎΠΈ Π»ΡΡΠ΅ Π½Π΅ ΡΠ΅ ΠΌΠ°ΡΠ°Ρ ΡΠΎ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡΠ° ΠΈ ΡΠ°Π±ΠΎΡΠ°Ρ ΡΠΎ ΠΏΡΠ°Π·Π½Π° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ° Π·Π° root. ΠΠΎ ΡΠ°Π·Π°ΡΠ° Π½Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΠ°, MySQL ΠΏΠΎΠ±Π°ΡΠ° Π½Π΅ΠΊΠΎΠ³ΠΎ Π»ΠΎΠ·ΠΈΠ½ΠΊΠ° ΠΈ Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°ΡΠ° ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ° Π΄Π΅ΠΊΠ° Π΅ 123. Π§Π΅ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΏΠΎΡΡΠΎΡΠ°Π½ΠΎ Π΄Π° ΡΠ΅ ΠΌΠ΅Π½ΡΠ²Π° Π²ΠΎ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ ΠΎΠ΄ ΠΏΠΎΡΠ²Π΅ΡΠ΅Π½ΠΎΡΡΠ° Π½Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΎΡ. ΠΠ΅ΠΊΠΎΡ ΡΠ° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°Π», Π½Π΅ΠΊΠΎΡ Π½Π΅ ΡΠ° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°Π» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ°. ΠΠΌΠ°ΡΠ΅ ΡΡΠΈΠΊΠΎΠ²ΠΈ ΠΊΠΎΠ³Π° ΡΡΠ°Π²ΠΈΠ²ΠΌΠ΅ ΡΠ΅ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° .gitignore
ΠΈ ΡΠ΅ΠΊΠΎΡ ΡΠ°Π·Π²ΠΈΠ²Π°Ρ ΠΌΠΎΡΠ°ΡΠ΅ Π΄Π° ΡΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠ²Π° Π³ΠΎ ΠΎΡΠ΅ΠΆΠ½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° Π·Π°ΠΏΠΎΡΠ½ΡΠ²Π°ΡΠ΅. ΠΠ΅ΡΡ Π΄ΡΡΠ³ΠΎΡΠΎ, ΡΡΠ΅Π±Π° Π΄Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΠ΅ ΠΈ Π·Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠ°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΌΠΎΡΠ° Π΄Π° ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·ΠΈΡΠ°, Π΄Π° ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°, Π΄Π° ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ, Π΄Π° ΡΠ΅ ΠΊΡΠ΅ΠΈΡΠ° Π·Π½Π°ΠΊ ΠΈΡΠ½.
ΠΡΡΠ³ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ Π²Π΅ΡΠ·ΠΈΠΈ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΡΠ΅. Π§Π΅ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅Ρ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ. ΠΠΌΠ° ΠΏΡΠΎΠ΅ΠΊΡ Legacy, ΠΊΠΎΡ Π·Π°ΠΏΠΎΡΠ½Π° ΠΏΡΠ΅Π΄ ΠΏΠ΅Ρ Π³ΠΎΠ΄ΠΈΠ½ΠΈ (ΠΎΠ΄ 2017 Π³ΠΎΠ΄ΠΈΠ½Π° - Π·Π°Π±Π΅Π»Π΅ΡΠΊΠ° Π½Π° ΡΡΠ΅Π΄Π½ΠΈΠΊΠΎΡ). ΠΠ° ΠΏΠΎΡΠ΅ΡΠΎΠΊΠΎΡ Π·Π°ΠΏΠΎΡΠ½Π°Π²ΠΌΠ΅ ΡΠΎ MySQL 5.5. ΠΠΌΠ° ΠΈ ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΡΠ΅ ΠΎΠ±ΠΈΠ΄ΡΠ²Π°ΠΌΠ΅ Π΄Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎΠΌΠΎΠ΄Π΅ΡΠ½ΠΈ Π²Π΅ΡΠ·ΠΈΠΈ Π½Π° MySQL, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ 5.7 ΠΈΠ»ΠΈ ΠΏΠΎΡΡΠ°ΡΠΈ (Π²ΠΎ 2017 Π³ΠΎΠ΄ΠΈΠ½Π° - Π·Π°Π±Π΅Π»Π΅ΡΠΊΠ° Π½Π° ΡΡΠ΅Π΄Π½ΠΈΠΊΠΎΡ)
Π‘Π΅ΠΊΠΎΡ ΠΊΠΎΡ ΡΠ°Π±ΠΎΡΠΈ ΡΠΎ MySQL Π·Π½Π°Π΅ Π΄Π΅ΠΊΠ° ΠΎΠ²ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π½ΠΎΡΠ°Ρ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ. ΠΡΠΈΠ»ΠΈΡΠ½ΠΎ Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Π°Ρ 2 Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π°Π΅Π΄Π½ΠΎ. ΠΠΎ Π½Π°ΡΠΌΠ°Π»Π° ΡΠ°ΠΊΠ°, ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Ρ ΡΡΠ°ΡΠΈΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ ΡΠΎ Π½ΠΎΠ²Π°ΡΠ° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠ²Π° ΠΏΠ°ΠΊ ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΡΠ²Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ.
Π‘Π»Π΅Π΄Π½ΠΈΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π΅ ΠΊΠΎΠ³Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΎΡ ΡΠ°Π±ΠΎΡΠΈ Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°, ΡΠΎΡ ΠΊΠΎΡΠΈΡΡΠΈ Π»ΠΎΠΊΠ°Π»Π½ΠΈ ΡΠ΅ΡΡΡΡΠΈ, Π»ΠΎΠΊΠ°Π»Π½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ, Π»ΠΎΠΊΠ°Π»Π½Π° RAM ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°. Π¦Π΅Π»Π°ΡΠ° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ° Π²ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΡ Π½Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ ΡΠ΅ Π²ΡΡΠΈ Π²ΠΎ ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠ°ΠΊΡΠΎΡ Π΄Π΅ΠΊΠ° ΡΠ°Π±ΠΎΡΠΈ Π½Π° Π΅Π΄Π½Π° ΠΌΠ°ΡΠΈΠ½Π°. ΠΡΠΈΠΌΠ΅Ρ Π±ΠΈ Π±ΠΈΠ» ΠΊΠΎΠ³Π° ΠΈΠΌΠ°ΠΌΠ΅ Π·Π°Π΄Π½ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΈ Π²ΠΎ Production 3, Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΎΡ Π³ΠΈ Π·Π°ΡΡΠ²ΡΠ²Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈΡΠ΅ Π²ΠΎ root Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ ΠΈ ΠΎΠ΄ ΡΠ°ΠΌΡ nginx Π³ΠΈ Π·Π΅ΠΌΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈΡΠ΅ Π·Π° Π΄Π° ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠΈ Π½Π° Π±Π°ΡΠ°ΡΠ΅ΡΠΎ. ΠΠΎΠ³Π° ΡΠ°ΠΊΠΎΠ² ΠΊΠΎΠ΄ ΡΠ΅ Π²Π»Π΅Π·Π΅ Π²ΠΎ Production, ΠΈΠ·Π»Π΅Π³ΡΠ²Π° Π΄Π΅ΠΊΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° Π΅ ΠΏΡΠΈΡΡΡΠ½Π° Π½Π° Π΅Π΄Π΅Π½ ΠΎΠ΄ 3-ΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠΈ.
ΠΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ² ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π° Π½Π°ΡΠΎΠΊΠ°ΡΠ° Π½Π° ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΈΡΠ΅. ΠΠΎΠ³Π° Π³ΠΈ Π΄Π΅Π»ΠΈΠΌΠ΅ Π½Π°ΡΠΈΡΠ΅ Π³ΠΎΠ»Π΅ΠΌΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π½Π° Π½Π΅ΠΊΠΎΠΈ ΠΌΠ°Π»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΠΊΠΎΠΈ ΠΊΠΎΠΌΡΠ½ΠΈΡΠΈΡΠ°Π°Ρ Π΅Π΄Π½ΠΈ ΡΠΎ Π΄ΡΡΠ³ΠΈ. ΠΠ²Π° Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π·Π° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΠΊΡΠΏ Π·Π°Π΄Π°ΡΠΈ. ΠΠ²Π° ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΡΠ° ΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΠΈ ΠΎΠ±Π»Π°ΡΡΠ° Π½Π° ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ½ΠΎΡΡ ΠΏΠΎΠΌΠ΅ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈΡΠ΅.
Π Π°Π·Π²ΠΈΠ²Π°Ρ Π½Π° ΠΏΡΠ΅Π΄Π΅Π½ Π΄Π΅Π», ΠΊΠΎΡ ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π° Π²ΠΎ JS, ΠΏΡΠ°ΠΊΡΠΈΡΠ½ΠΎ Π½Π΅ΠΌΠ° Π½ΠΈΠΊΠ°ΠΊΠ²ΠΎ Π²Π»ΠΈΡΠ°Π½ΠΈΠ΅ Π²ΡΠ· Π·Π°Π΄Π½ΠΈΠΎΡ Π΄Π΅Π». Π Π°Π·Π²ΠΈΠ²Π°ΡΠΎΡ Π½Π° Π·Π°Π΄Π½ΠΈΠ½Π°ΡΠ°, ΠΏΠ°ΠΊ, ΡΠ°Π·Π²ΠΈΠ²Π°, Π²ΠΎ Π½Π°ΡΠΈΠΎΡ ΡΠ»ΡΡΠ°Ρ, Ruby on Rails ΠΈ Π½Π΅ ΡΠ΅ ΠΌΠ΅ΡΠ° ΡΠΎ Frondend. ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΈΠ·Π²Π΅Π΄ΡΠ²Π° ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° API.
ΠΠ°ΠΊΠΎ Π±ΠΎΠ½ΡΡ, ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΎ Docker, ΠΌΠΎΠΆΠ΅Π²ΠΌΠ΅ Π΄Π° ΡΠ΅ΡΠΈΠΊΠ»ΠΈΡΠ°ΠΌΠ΅ ΡΠ΅ΡΡΡΡΠΈ Π½Π° Staging. Π‘Π΅ΠΊΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ, ΠΏΠΎΡΠ°Π΄ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠΈ, Π±Π°ΡΠ°ΡΠ΅ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ. Π€ΠΈΠ·ΠΈΡΠΊΠΈ, Π±Π΅ΡΠ΅ Π½Π΅ΠΎΠΏΡ ΠΎΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΠΈ ΠΈΠ»ΠΈ Π²ΠΈΡΡΡΠ΅Π»Π΅Π½ ΡΠ΅ΡΠ²Π΅Ρ ΠΈ Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π°Ρ ΠΎΠ΄Π΄Π΅Π»Π½ΠΎ, ΠΈΠ»ΠΈ Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄Π΅Π»ΠΈ Π½Π΅ΠΊΠΎΡ Π²ΠΈΠ΄ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΡΡΠ΅Π΄ΠΈΠ½Π° ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π²Π»ΠΈΡΠ°Π°Ρ Π΅Π΄Π΅Π½ Π½Π° Π΄ΡΡΠ³, Π²ΠΎ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ ΠΎΠ΄ Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΡΠ΅.
ΠΠ»Π°ΡΠΊΠΈ. Π¨ΡΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅?
- Π‘Π°ΠΌΠΈΠΎΡ ΠΠΎΠΊΠ΅Ρ. Dockerfile Π³ΠΈ ΠΎΠΏΠΈΡΡΠ²Π° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Π΅Π΄Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°.
- Docker-compose Π΅ ΠΏΠ°ΠΊΠ΅Ρ ΡΡΠΎ ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π½Π°ΡΠΈ Docker Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ.
- ΠΠΈΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ GitLab Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΈΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄.
- ΠΠΈΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ GitLab-CI Π·Π° ΡΠΈΡΡΠ΅ΠΌΡΠΊΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ°.
ΠΠ·Π²Π΅ΡΡΠ°ΡΠΎΡ ΡΠ΅ ΡΠΎΡΡΠΎΠΈ ΠΎΠ΄ Π΄Π²Π° Π΄Π΅Π»Π°.
ΠΡΠ²ΠΈΠΎΡ Π΄Π΅Π» ΡΠ΅ Π²ΠΈ ΠΊΠ°ΠΆΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ ΡΡΠ°ΡΡΡΠ²Π°ΡΠ΅ Docker Π½Π° ΠΌΠ°ΡΠΈΠ½ΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈΡΠ΅.
ΠΡΠΎΡΠΈΠΎΡ Π΄Π΅Π» ΡΠ΅ Π·Π±ΠΎΡΡΠ²Π° Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΊΠΎΠΌΡΠ½ΠΈΡΠΈΡΠ°ΡΠ΅ ΡΠΎ GitLab, ΠΊΠ°ΠΊΠΎ Π³ΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π°ΠΌΠ΅ ΡΠ΅ΡΡΠΎΠ²ΠΈΡΠ΅ ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΡΠ»ΠΈΠΌΠ΅ Π½Π° Staging.
Docker Π΅ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ° ΠΊΠΎΡΠ° ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° (ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π΅Π½ ΠΏΡΠΈΡΡΠ°ΠΏ) Π΄Π° Π³ΠΈ ΠΎΠΏΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ. ΠΠ²Π° Π΅ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Dockerfile. ΠΠ²Π΄Π΅ ΠΈΠ·ΡΠ°Π²ΡΠ²Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π°ΠΌΠ΅ ΠΎΠ΄ ΠΎΡΠΈΡΠΈΡΠ°Π»Π½Π°ΡΠ° Docker ΡΠ»ΠΈΠΊΠ° Π½Π° Ruby:2.3.0. Π‘ΠΎΠ΄ΡΠΆΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° Ruby 2.3. ΠΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π° ΡΠΊΠ»ΠΎΠΏΡΠ²Π°ΡΠ΅ ΠΈ NodeJS. ΠΠΏΠΈΡΡΠ²Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΠΎΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ /app
. ΠΠΎ Π΄ΠΎΠ΄Π΅Π»ΡΠ²Π°ΠΌΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΊΠ°ΠΊΠΎ ΡΠ°Π±ΠΎΡΠ΅Π½ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ. ΠΠΎ ΠΎΠ²ΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ Π³ΠΎ ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈΠΎΡ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ Gemfile ΠΈ Gemfile.lock. ΠΠΎΡΠΎΠ° Π³ΡΠ°Π΄ΠΈΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΊΠΎΠΈ ΡΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π°Ρ ΠΎΠ²Π°Π° ΡΠ»ΠΈΠΊΠ° Π·Π° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ. ΠΠΎΡΠΎΡΡΠ²Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ Π·Π° ΡΠ»ΡΡΠ°ΡΠ΅ Π½Π° Π½Π°Π΄Π²ΠΎΡΠ΅ΡΠ½Π°ΡΠ° ΠΏΠΎΡΡΠ° 3000. ΠΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΡΡΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΡΠ° ΡΡΠ°ΡΡΡΠ²Π° Π½Π°ΡΠ°ΡΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°. ΠΠΊΠΎ ΡΠ° ΠΈΠ·Π²ΡΡΠΈΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ, Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ΅ ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π΅ Π΄Π° ΡΠ° ΠΈΠ·Π²ΡΡΠΈ ΠΈ ΠΈΠ·Π²ΡΡΠΈ Π½Π°Π²Π΅Π΄Π΅Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°.
ΠΠ²Π° Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΡΠΎ Π΄ΠΎΠΊΠ΅Ρ-ΠΊΠΎΠΌΠΏΠΎΠ½ΠΈΡΠ°ΡΠ΅. ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΠΏΠΎΠΊΠ°ΠΆΡΠ²Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΏΠΎΡΡΠΎΠΈ Π²ΡΡΠΊΠ° ΠΏΠΎΠΌΠ΅ΡΡ Π΄Π²Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ. ΠΠ²Π° Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π²ΠΎ ΡΡΠ»ΡΠ³Π°ΡΠ° Π·Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈ Π²Π΅Π±-ΡΡΠ»ΡΠ³Π°ΡΠ°. ΠΠ°ΡΠΈΡΠ΅ Π²Π΅Π±-Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π²ΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΠ»ΡΡΠ°ΠΈ Π±Π°ΡΠ°Π°Ρ Π½Π΅ΠΊΠ°ΠΊΠ²Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΊΠ°ΠΊΠΎ Π·Π°Π΄Π½ΠΈΠ½Π° Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠΈΠ΄Π΅ΡΡΠΈ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ MySQL, ΠΏΡΠΈΠΌΠ΅ΡΠΎΡ Π΅ ΡΠΎ MySQL - Π½ΠΎ Π½ΠΈΡΡΠΎ Π½Π΅ Π½Π΅ ΡΠΏΡΠ΅ΡΡΠ²Π° Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ Π½Π΅ΠΊΠΎΡΠ° Π΄ΡΡΠ³Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ (PostgreSQL, Redis).
ΠΠ° Π·Π΅ΠΌΠ°ΠΌΠ΅ ΡΠ»ΠΈΠΊΠ°ΡΠ° MySQL 5.7.14 Π±Π΅Π· ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΠΎΠ΄ ΠΎΡΠΈΡΠΈΡΠ°Π»Π½ΠΈΠΎΡ ΠΈΠ·Π²ΠΎΡ ΠΎΠ΄ ΡΠ΅Π½ΡΠ°ΡΠΎΡ Π½Π° Docker. Π‘Π»ΠΈΠΊΠ°ΡΠ° ΡΡΠΎ Π΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ½Π° Π·Π° Π½Π°ΡΠ°ΡΠ° Π²Π΅Π±-Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΡΠ° ΡΠΎΠ±ΠΈΡΠ°ΠΌΠ΅ ΠΎΠ΄ ΡΠ΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ. ΠΠ° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΡΠ²ΠΎΡΠΎ Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅, ΡΠΎΡ ΡΠΎΠ±ΠΈΡΠ° ΡΠ»ΠΈΠΊΠ° Π·Π° Π½Π°Ρ. ΠΠΎΡΠΎΠ° ΡΠ° ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΡΡΠΎ ΡΠ° ΠΈΠ·Π²ΡΡΡΠ²Π°ΠΌΠ΅ ΠΎΠ²Π΄Π΅. ΠΠΊΠΎ ΡΠ΅ Π²ΡΠ°ΡΠΈΠΌΠ΅ Π½Π°Π·Π°Π΄, ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π·Π° Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅ Π΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½Π° ΠΏΡΠ΅ΠΊΡ Puma. ΠΡΠΌΠ° Π΅ ΡΡΠ»ΡΠ³Π° Π½Π°ΠΏΠΈΡΠ°Π½Π° Π²ΠΎ Π ΡΠ±ΠΈ. ΠΠΎ Π²ΡΠΎΡΠΈΠΎΡ ΡΠ»ΡΡΠ°Ρ Π½ΠΈΠ΅ ΠΏΡΠ΅ΡΠΊΠΎΠΊΠ½ΡΠ²Π°ΠΌΠ΅. ΠΠ²Π°Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½Π° Π²ΠΎ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ ΠΎΠ΄ Π½Π°ΡΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈ ΠΈΠ»ΠΈ Π·Π°Π΄Π°ΡΠΈ.
ΠΠΈΠ΅, ΠΈΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΎΠΏΠΈΡΡΠ²Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΡΠ΅Π±Π° Π΄Π° ΡΠ° ΠΏΡΠ΅ΠΏΡΠ°ΡΠΈΠΌΠ΅ ΠΏΠΎΡΡΠ°ΡΠ° Π½Π° Π½Π°ΡΠ°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°-Π΄ΠΎΠΌΠ°ΡΠΈΠ½ Π½Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΈΡΠ΅ ΠΎΠ΄ 3000 Π΄ΠΎ 3000 ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΡΠΊΠ° ΠΏΠΎΡΡΠ°. ΠΠ²Π° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ iptables ΠΈ ΡΠΎΠΏΡΡΠ²Π΅Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ, ΠΊΠΎΡ Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π²Π³ΡΠ°Π΄Π΅Π½ Π²ΠΎ Docker.
ΠΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΎΡ ΠΌΠΎΠΆΠ΅, ΠΊΠ°ΠΊΠΎ ΠΈ Π΄ΠΎΡΠ΅Π³Π°, Π΄Π° ΠΏΡΠΈΡΡΠ°ΠΏΠΈ Π΄ΠΎ ΠΊΠΎΡΠ° Π±ΠΈΠ»ΠΎ Π΄ΠΎΡΡΠ°ΠΏΠ½Π° IP Π°Π΄ΡΠ΅ΡΠ°, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, 127.0.0.1 Π»ΠΎΠΊΠ°Π»Π½Π° ΠΈΠ»ΠΈ Π½Π°Π΄Π²ΠΎΡΠ΅ΡΠ½Π° IP Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΌΠ°ΡΠΈΠ½Π°ΡΠ°.
ΠΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° Π»ΠΈΠ½ΠΈΡΠ° Π²Π΅Π»ΠΈ Π΄Π΅ΠΊΠ° Π²Π΅Π±-ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ Π·Π°Π²ΠΈΡΠΈ ΠΎΠ΄ db ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ. ΠΠΎΠ³Π° ΡΠ΅ Π³ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ°ΠΌΠ΅ Π²Π΅Π±-ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΡΠ²Π°, docker-compose ΠΏΡΠ²ΠΎ ΡΠ΅ ΡΠ° ΡΡΠ°ΡΡΡΠ²Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° Π½Π°Ρ. ΠΠ΅ΡΠ΅ ΠΏΠΎ ΠΏΠΎΡΠ΅ΡΠΎΠΊΠΎΡ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ (Π²ΡΡΡΠ½ΠΎΡΡ, ΠΏΠΎ Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ! ΠΠ²Π° Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ° ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ΠΎΡΡ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ) ΡΠ°Π° ΡΠ΅ ΡΠ° ΡΡΠ°ΡΡΡΠ²Π° Π½Π°ΡΠ°ΡΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°, Π½Π°ΡΠΈΠΎΡ Π·Π°Π΄Π½ΠΈΠ½Π°.
ΠΠ²Π° Π½ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΠΌΠ΅ Π³ΡΠ΅ΡΠΊΠΈ ΠΊΠΎΠ³Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½Π΅ Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½Π° ΠΈ Π½ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° Π·Π°ΡΡΠ΅Π΄ΠΈΠΌΠ΅ ΡΠ΅ΡΡΡΡΠΈ ΠΊΠΎΠ³Π° Π³ΠΎ Π·Π°ΠΏΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ ΡΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, Π° ΡΠΎ ΡΠΎΠ° ΠΎΡΠ»ΠΎΠ±ΠΎΠ΄ΡΠ²Π° ΡΠ΅ΡΡΡΡΠΈ Π·Π° Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ.
Π¨ΡΠΎ Π½ΠΈ Π΄Π°Π²Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ΡΠΎ Π½Π° Π΄ΠΎΠΊΠ΅ΡΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡ? ΠΠ° ΡΠ½ΠΈΠΌΠ°ΠΌΠ΅ Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° MySQL Π·Π° ΡΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈ. ΠΠ²Π° Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΡΠ΅ Π½Π΅ΠΊΠΎΠΈ Π³ΡΠ΅ΡΠΊΠΈ ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ°Π²Π°Ρ ΠΊΠΎΠ³Π° Π²Π΅ΡΠ·ΠΈΠΈΡΠ΅ ΡΠ΅ ΡΠ°Π·ΠΌΠΈΠ½ΡΠ²Π°Π°Ρ, ΠΊΠΎΠ³Π° ΡΠ΅ ΠΌΠ΅Π½ΡΠ²Π°Π°Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠ°ΡΠ°, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° ΠΈ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈΡΠ΅ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ. ΠΠ²Π° Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° Π½Π°Π²Π΅Π΄Π΅ΡΠ΅ Π·Π°Π΅Π΄Π½ΠΈΡΠΊΠΎ ΠΈΠΌΠ΅ Π½Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ Π·Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, Π½Π°ΡΠ°Π²Π°, Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°. Π‘Π΅ ΠΎΠ΄Π΄Π°Π»Π΅ΡΡΠ²Π°ΠΌΠ΅ ΠΎΠ΄ Π·ΠΎΠΎΠ»ΠΎΡΠΊΠ°ΡΠ° Π³ΡΠ°Π΄ΠΈΠ½Π° Π½Π° ΠΈΠΌΠΈΡΠ° ΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΈ Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠΈΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΡΡΠΎ ΠΏΠΎΡΡΠΎΠ΅Π»Π΅ ΠΏΠΎΡΠ°Π½ΠΎ.
ΠΠΌΠ°ΠΌΠ΅ ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΏΠΎΠΎΠΏΡΠΈΠΌΠ°Π»Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π·Π° ΡΠ°Π·Π²ΠΎΡΠ½Π°ΡΠ° ΠΎΠΊΠΎΠ»ΠΈΠ½Π°, ΠΊΠΎΡΠ° ΡΠ΅ ΡΠ΅ ΡΠ°Π·Π»ΠΈΠΊΡΠ²Π° ΠΎΠ΄ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½Π°ΡΠ°. MySQL Π΅ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ Π·Π° ΡΠ»Π°Π±ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈ Π½Π°Π΄Π²ΠΎΡ ΠΎΠ΄ ΠΊΡΡΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ Π½ΠΈΡΠΊΠΈ.
Docker Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ Python, Ruby, NodeJS, PHP ΡΠΎΠ»ΠΊΡΠ²Π°Ρ Π½Π° ΡΠ°ΠΊΠ°Π½Π°ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ°. Π‘Π΅ ΠΎΡΠ»ΠΎΠ±ΠΎΠ΄ΡΠ²Π°ΠΌΠ΅ ΠΎΠ΄ ΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ Π½Π΅ΠΊΠΎΡ Π²ΠΈΠ΄ ΠΌΠ΅Π½Π°ΡΠ΅Ρ Π½Π° Π²Π΅ΡΠ·ΠΈΠΈ. ΠΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΎ, Π·Π° Ruby ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ ΠΏΠ°ΠΊΠ΅Ρ Π²ΡΡΠ΅ΠΆΠΈ Π²ΠΎ ΠΌΠΈΠ½ΡΡΠ°, ΡΡΠΎ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π΄Π° ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° Π²ΠΎ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ ΠΎΠ΄ ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ Docker, ΠΎΠ²Π° ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π½Π΅ΠΏΡΠ΅ΡΠ΅Π½ΠΎ Π΄Π° Π³ΠΎ ΠΌΠΈΠ³ΡΠΈΡΠ°ΡΠ΅ ΠΊΠΎΠ΄ΠΎΡ ΠΈ Π΄Π° Π³ΠΎ Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° Π·Π°Π΅Π΄Π½ΠΎ ΡΠΎ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈΡΠ΅. ΠΠ΅ΠΌΠ°ΠΌΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π΄Π° ΡΠ° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΠ΅ Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° ΠΈ Π½Π° ΡΠΎΠ»ΠΊΡΠ²Π°ΡΠΎΡ ΠΈ Π½Π° ΠΊΠΎΠ΄ΠΎΡ. ΠΠ° Π΄Π° ΡΠ° Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅ Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ°, ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΎ ΡΠΏΡΡΡΠΈΡΠ΅ ΡΡΠ°ΡΠΈΠΎΡ ΡΠ°Π΄ ΠΈ Π΄Π° Π³ΠΎ ΠΏΠΎΠ΄ΠΈΠ³Π½Π΅ΡΠ΅ Π½ΠΎΠ²ΠΈΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ. ΠΠΊΠΎ Π½Π΅ΡΡΠΎ ΡΡΠ³Π½Π΅ Π½Π°ΠΎΠΏΠ°ΠΊΡ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΡΠΏΡΡΡΠΈΠΌΠ΅ Π½ΠΎΠ²ΠΈΠΎΡ ΡΠ°Π΄, Π΄Π° Π³ΠΎ ΠΏΠΎΠ΄ΠΈΠ³Π½Π΅ΠΌΠ΅ ΡΡΠ°ΡΠΈΠΎΡ ΡΠ°Π΄.
ΠΠΎ ΠΈΠ·Π³ΡΠ°Π΄Π±Π°ΡΠ° Π½Π° ΡΠ»ΠΈΠΊΠ°ΡΠ°, ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈΡΠ΅ ΠΈ Π²ΠΎ ΡΠ°Π·Π²ΠΎΡ ΠΈ Π²ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ ΡΠ΅ Π±ΠΈΠ΄Π°Ρ ΠΈΡΡΠΈ. ΠΠ²Π° Π΅ ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΡΠΎΡΠ½ΠΎ Π·Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΠΈ.
ΠΠ° Frontend ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ JavaScipt ΠΈ NodeJS.
Π‘Π΅Π³Π° Π³ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π½Π°ΡΠΈΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄Π΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ Π½Π° ReacJS. ΠΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΎΡ Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅ ΡΓ¨ Π²ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ ΠΈ Π³ΠΎ ΡΠ°Π·Π²ΠΈ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° Π²ΡΠΈΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΠΎΠΏΠ»ΠΎ.
Π‘Π»Π΅Π΄Π½ΠΎ, Π·Π°Π΄Π°ΡΠ°ΡΠ° Π·Π° ΡΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ JavaScipt Π΅ Π»Π°Π½ΡΠΈΡΠ°Π½Π° ΠΈ ΡΡΠ°ΡΠΈΡΠΊΠΈ ΡΠΎΡΡΠ°Π²Π΅Π½ΠΈΠΎΡ ΠΊΠΎΠ΄ ΡΠ΅ ΠΈΡΠΏΡΠ°ΡΠ° ΠΏΡΠ΅ΠΊΡ nginx, Π·Π°ΡΡΠ΅Π΄ΡΠ²Π°ΡΡΠΈ ΡΠ΅ΡΡΡΡΠΈ.
ΠΠ²Π΄Π΅ Π΄Π°Π΄ΠΎΠ² Π΄ΠΈΡΠ°Π³ΡΠ°ΠΌ Π½Π° Π½Π°ΡΠΈΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄Π΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ.
ΠΠΎΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π³ΠΈ ΡΠ΅ΡΠΈΠ²ΡΠ΅? ΠΠΌΠ°Π²ΠΌΠ΅ ΠΏΠΎΡΡΠ΅Π±Π° Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΠΌΠ΅ ΡΠΈΡΡΠ΅ΠΌ ΡΠΎ ΠΊΠΎΡ ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈΡΠ΅ ΡΡΠ΅Π΄ΠΈ ΠΊΠΎΠΌΡΠ½ΠΈΡΠΈΡΠ°Π°Ρ. Π’ΠΈΠ΅ Π΄ΠΎΠ±ΠΈΠ²Π°Π°Ρ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠ΄Π½Π° ΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π΅ Π΄Π° ΠΈΡΠΏΡΠ°ΡΠ°ΡΠ΅ push ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°ΡΠ° Π½Π° ΠΎΠ²ΠΎΡ ΡΡΠ΅Π΄.
Π¨ΡΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠ²ΠΌΠ΅ Π·Π° ΠΎΠ²Π°?
ΠΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ° ΠΏΠΎΠ΄Π΅Π»ΠΈΠ²ΠΌΠ΅ Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ: Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΈΠ²Π΅Π½ Π΄Π΅Π» Π²ΠΎ JS, Π·Π°Π΄Π½ΠΈΠ½Π° ΡΡΠΎ ΡΠ°Π±ΠΎΡΠΈ ΠΏΡΠ΅ΠΊΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ REST ΠΏΠΎΠ΄ Ruby on Rails. ΠΠ°Π΄Π½ΠΈΠ½Π°ΡΠ° Π΅ Π²ΠΎ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. Π Π΅Π·ΡΠ»ΡΠ°ΡΠΎΡ ΡΡΠΎ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΌΡ ΡΠ΅ Π΄Π°Π²Π° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΡ. ΠΠ΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΡΠΊΠΈΠΎΡ ΠΏΠ°Π½Π΅Π» Π΅ Π²ΠΎ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΎ Π·Π°Π΄Π½ΠΈΠΎΡ Π΄Π΅Π» ΠΈ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΏΡΠ΅ΠΊΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ REST.
ΠΠΌΠ°Π²ΠΌΠ΅ ΠΏΠΎΡΡΠ΅Π±Π° ΠΈ Π΄Π° ΠΈΡΠΏΡΠ°ΡΠ°ΠΌΠ΅ Push ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°ΡΠ°. ΠΡΠ΅Π΄ ΠΎΠ²Π° ΠΈΠΌΠ°Π²ΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡ Π²ΠΎ ΠΊΠΎΡ Π±Π΅ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ ΠΊΠΎΡ Π±Π΅ΡΠ΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ΅Π½ Π·Π° Π΄ΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°ΡΠ° Π΄ΠΎ ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈΡΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ.
ΠΠ° ΡΠ°Π·Π²ΠΈΠ²ΠΌΠ΅ ΡΠ»Π΅Π΄Π½Π°Π²Π° ΡΠ΅ΠΌΠ°: ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΡ ΠΎΠ΄ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°ΡΠΎΡ ΠΊΠΎΠΌΡΠ½ΠΈΡΠΈΡΠ° ΡΠΎ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΡΠΊΠΈΠΎΡ ΠΏΠ°Π½Π΅Π», Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΈΠ²Π½ΠΈΠΎΡ ΠΏΠ°Π½Π΅Π» ΠΊΠΎΠΌΡΠ½ΠΈΡΠΈΡΠ° ΡΠΎ Π·Π°Π΄Π½ΠΈΠΎΡ Π΄Π΅Π», Π·Π°Π΄Π°ΡΠ°ΡΠ° Π΅ Π΄Π° ΠΈΡΠΏΡΠ°ΡΠ° ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°ΡΠ° Π·Π° Push.
Push ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°ΡΠ°ΡΠ° ΠΊΠΎΠΌΡΠ½ΠΈΡΠΈΡΠ°Π°Ρ ΡΠΎ Π΄ΡΡΠ³Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΡΡΠΎ Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π° Π²ΠΎ NodeJS.
Π Π΅Π΄ΠΈΡΠΈΡΠ΅ ΡΠ΅ Π³ΡΠ°Π΄Π°Ρ ΠΈ ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°ΡΠ°ΡΠ° ΡΠ΅ ΠΈΡΠΏΡΠ°ΡΠ°Π°Ρ ΡΠΏΠΎΡΠ΅Π΄ ΡΠΎΠΏΡΡΠ²Π΅Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ.
Π’ΡΠΊΠ° ΡΠ΅ Π½Π°ΡΡΡΠ°Π½ΠΈ Π΄Π²Π΅ Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΎ Docker, ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ 2 Π½Π΅Π·Π°Π²ΠΈΡΠ½ΠΈ Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΊΠΎΠΈ Π½Π° Π½ΠΈΠΊΠ°ΠΊΠΎΠ² Π½Π°ΡΠΈΠ½ Π½Π΅ ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ Π΅Π΄Π½Π° ΡΠΎ Π΄ΡΡΠ³Π°. ΠΠΎΠΊΡΠ°Ρ ΡΠ°ΠΊΡΠΎΡ Π΄Π΅ΠΊΠ° ΡΠΈΠ΅ ΠΈΠΌΠ°Π°Ρ Π·Π°Π΅Π΄Π½ΠΈΡΠΊΠ° Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΠΌΡΠ΅ΠΆΠ°, Π° ΡΠΈΠ·ΠΈΡΠΊΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π°Ρ Π²ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΈ Π½Π° ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΎΡ.
ΠΡΡΠΎΡΠΎ Π½ΠΎ Π²ΠΎ Π±ΡΠΎΡΠΊΠΈ. ΠΠΎΠ²ΡΠΎΡΠ½Π°ΡΠ° ΡΠΏΠΎΡΡΠ΅Π±Π° Π½Π° ΠΊΠΎΠ΄ΠΎΡ Π΅ Π²Π°ΠΆΠ½Π° ΠΎΠ²Π΄Π΅.
ΠΠΊΠΎ ΠΏΠΎΡΠ°Π½ΠΎ Π·Π±ΠΎΡΡΠ²Π°Π²ΠΌΠ΅ Π·Π° ΠΏΠΎΠ²ΡΠΎΡΠ½Π° ΡΠΏΠΎΡΡΠ΅Π±Π° Π½Π° ΠΊΠΎΠ΄ Π²ΠΎ ΡΠΎΡΠΌΠ° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΡΠΎΠ³Π°Ρ Π²ΠΎ ΠΎΠ²ΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π°ΡΠ°ΡΠ° ΡΡΠ»ΡΠ³Π°, ΠΊΠΎΡΠ° ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ° Π½Π° ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°ΡΠ°ΡΠ° Π·Π° Push, ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΊΠ°ΠΊΠΎ ΡΠ΅Π»ΠΎΡΠ΅Π½ ΡΠ΅ΡΠ²Π΅Ρ. ΠΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° API. Π Π½Π°ΡΠΈΠΎΡ Π½ΠΎΠ² ΡΠ°Π·Π²ΠΎΡ Π΅ Π²ΠΎ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΎ Π½Π΅Π³ΠΎ.
ΠΠΎ ΡΠΎΠ° Π²ΡΠ΅ΠΌΠ΅ ΡΠ° ΠΊΠΎΡΠΈΡΡΠ΅Π²ΠΌΠ΅ Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° 4 Π½Π° NodeJS. Π‘Π΅Π³Π° (Π²ΠΎ 2017 Π³ΠΎΠ΄ΠΈΠ½Π° - Π·Π°Π±Π΅Π»Π΅ΡΠΊΠ° Π½Π° ΡΡΠ΅Π΄Π½ΠΈΠΊΠΎΡ) Π²ΠΎ Π½Π°ΡΠΈΡΠ΅ Π½Π°ΡΠ½ΠΎΠ²ΠΈ ΡΠ»ΡΡΡΠ²Π°ΡΠ° ΡΠ° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° 7 Π½Π° NodeJS. ΠΠ΅ΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π²ΠΎ Π½ΠΎΠ²ΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π·Π° Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅ Π½Π° Π½ΠΎΠ²ΠΈ Π²Π΅ΡΠ·ΠΈΠΈ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
ΠΠΎΠΊΠΎΠ»ΠΊΡ Π΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ° ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΡΠ°ΡΠ΅ ΠΈ ΠΏΠΎΠ΄ΠΈΠ³Π½Π΅ΡΠ΅ Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° NodeJS Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° Π·Π° ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°ΡΠ΅ Push.
Π Π°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΡΠ° ΠΎΠ΄ΡΠΆΠΈΠΌΠ΅ ΠΊΠΎΠΌΠΏΠ°ΡΠΈΠ±ΠΈΠ»Π½ΠΎΡΡΠ° ΡΠΎ API, ΡΠΎΠ³Π°Ρ ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ° Π·Π°ΠΌΠ΅Π½ΠΈΠΌΠ΅ ΡΠΎ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΡΡΠΎ Π±ΠΈΠ»Π΅ ΠΊΠΎΡΠΈΡΡΠ΅Π½ΠΈ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΎ.
Π¨ΡΠΎ Π²ΠΈ Π΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ Π·Π° Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ Docker? ΠΠΎΠ΄Π°Π²Π°ΠΌΠ΅ Dockerfile Π²ΠΎ Π½Π°ΡΠ΅ΡΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅, ΠΊΠΎΠ΅ Π³ΠΈ ΠΎΠΏΠΈΡΡΠ²Π° ΠΏΠΎΡΡΠ΅Π±Π½ΠΈΡΠ΅ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ. ΠΠΎ ΠΎΠ²ΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ ΡΠ΅ ΠΏΠΎΠ΄Π΅Π»Π΅Π½ΠΈ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ. ΠΠ²Π° Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈΠΎΡ ΠΊΠΎΠΌΠΏΠ»Π΅Ρ Π·Π° ΡΠ°Π·Π²ΠΈΠ²Π°Ρ Π½Π° Π·Π°Π΄Π½ΠΈΠ½Π°.
ΠΠΎΠ³Π° ΠΊΡΠ΅ΠΈΡΠ°ΠΌΠ΅ Π½ΠΎΠ² ΠΏΡΠΎΠ΅ΠΊΡ, ΠΊΡΠ΅ΠΈΡΠ°ΠΌΠ΅ Dockerfile ΠΈ Π³ΠΎ ΠΎΠΏΠΈΡΡΠ²Π°ΠΌΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈΠΎΡ Π΅ΠΊΠΎΡΠΈΡΡΠ΅ΠΌ (Python, Ruby, NodeJS). ΠΠΎ docker-compose, ΡΠ° ΠΎΠΏΠΈΡΡΠ²Π° ΠΏΠΎΡΡΠ΅Π±Π½Π°ΡΠ° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ - Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠΏΠΈΡΡΠ²Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π½ΠΈ ΡΡΠ΅Π±Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° ΡΠ°ΠΊΠ²Π° ΠΈ ΡΠ°ΠΊΠ²Π° Π²Π΅ΡΠ·ΠΈΡΠ°, Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΠ°ΠΌΡ ΠΈ ΡΠ°ΠΌΡ.
ΠΠΈΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΏΠΎΡΠ΅Π±Π΅Π½ ΡΡΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ ΡΠΎ nginx Π·Π° Π΄Π° ΡΠ»ΡΠΆΠΈΠΌΠ΅ ΡΡΠ°ΡΠΈΡΠ½Π° ΡΠΎΠ΄ΡΠΆΠΈΠ½Π°. ΠΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° ΠΏΡΠΈΠΊΠ°ΡΡΠ²Π°ΡΠ΅ ΡΠ»ΠΈΠΊΠΈ. ΠΠ°Π΄Π½ΠΈΠ½Π°ΡΠ° Π³ΠΈ ΡΡΠ°Π²Π° Π²ΠΎ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ Π²ΠΎΠ»ΡΠΌΠ΅Π½, ΠΊΠΎΡ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π΅ ΠΌΠΎΠ½ΡΠΈΡΠ°Π½ Π²ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ ΡΠΎ nginx, ΠΊΠΎΡ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° ΡΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ.
ΠΠ° Π΄Π° ΡΠ° Π·Π°ΡΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° nginx ΠΈ mysql, Π΄ΠΎΠ΄Π°Π΄ΠΎΠ²ΠΌΠ΅ ΠΏΠ°ΠΏΠΊΠ° Docker Π²ΠΎ ΠΊΠΎΡΠ° Π³ΠΈ ΡΡΠ²Π°ΠΌΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ. ΠΠΎΠ³Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΎΡ ΠΏΡΠ°Π²ΠΈ git ΠΊΠ»ΠΎΠ½ Π½Π° ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠΎ Π½Π° Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°, ΡΠΎΡ Π²Π΅ΡΠ΅ ΠΈΠΌΠ° ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ Π·Π° Π»ΠΎΠΊΠ°Π»Π΅Π½ ΡΠ°Π·Π²ΠΎΡ. ΠΠ΅ΠΌΠ° ΠΏΡΠ°ΡΠ°ΡΠ΅ Π·Π° ΡΠΎΠ° ΠΊΠΎΡΠ° ΠΏΠΎΡΡΠ° ΠΈΠ»ΠΈ ΠΊΠΎΠΈ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π°Ρ.
Π‘Π»Π΅Π΄Π½ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ: Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡ, ΠΈΠ½ΡΠΎ-API, ΠΏΡΠΈΡΠΈΡΠ½ΠΈ ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°ΡΠ°.
Π‘ΠΎ ΡΠ΅Π» Π΄Π° Π³ΠΎ ΡΡΠ°ΡΡΡΠ²Π°ΠΌΠ΅ ΡΠ΅ΡΠΎ ΠΎΠ²Π°, ΡΠΎΠ·Π΄Π°Π΄ΠΎΠ²ΠΌΠ΅ Π΄ΡΡΠ³ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ Π½Π°ΡΠ΅ΡΠ΅Π½ΠΎ dockerized-app. ΠΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ° Π·Π° ΡΠ΅ΠΊΠΎΡΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°. Π’ΠΈΠ΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΡΠ΅ Π»ΠΎΠ³ΠΈΡΠΊΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ - Π²ΠΎ GitLab ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΊΠ°ΠΊΠΎ ΠΏΠ°ΠΏΠΊΠ°, Π½ΠΎ Π½Π° ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΎΡ ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΊΠ°ΠΊΠΎ ΠΏΠ°ΠΏΠΊΠ° Π·Π° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ. ΠΠ΄Π½ΠΎ Π½ΠΈΠ²ΠΎ ΠΏΠΎΠ΄ΠΎΠ»Ρ ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ ΡΡΠΎ ΡΠ΅ ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°Π°Ρ.
ΠΠ²Π° Π΅ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠΎΠ΄ΡΠΆΠΈΠ½Π°ΡΠ° Π½Π° dockerized-app. ΠΠ²Π΄Π΅ ΠΏΠΎΡΡΠ°Π²ΡΠ²Π°ΠΌΠ΅ ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ Docker, Π²ΠΎ ΠΊΠΎΡ Π³ΠΈ ΠΏΠΎΠΏΠΎΠ»Π½ΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ Π·Π° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠΈΡΠ΅ Π½Π° ΡΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ. ΠΠΎΡΡΠΎΠΈ README.md ΠΊΠΎΡ Π½Π°ΠΊΡΠ°ΡΠΊΠΎ ΠΎΠΏΠΈΡΡΠ²Π° ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ.
ΠΠ²Π΄Π΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠ²ΠΌΠ΅ Π΄Π²Π΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΡΠΎ Π΄ΠΎΠΊΠ΅Ρ-ΠΊΠΎΠΌΠΏΠΎΠ½ΠΈΡΠ°ΡΠ΅. ΠΠ²Π° Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π»Π°Π½ΡΠΈΡΠ° Π²ΠΎ ΡΠ°Π·ΠΈ. ΠΠΎΠ³Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΎΡ ΡΠ°Π±ΠΎΡΠΈ ΡΠΎ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ, Π½Π΅ ΠΌΡ ΡΡΠ΅Π±Π°Π°Ρ ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°ΡΠ° Π·Π° Push, ΡΠΎΡ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΡΠ° ΡΡΠ°ΡΡΡΠ²Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° Π·Π° ΡΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ docker ΠΈ, ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΎ, ΡΠ΅ΡΡΡΡΠΈΡΠ΅ ΡΠ΅ Π·Π°ΡΡΠ²ΡΠ²Π°Π°Ρ.
ΠΠΎΠΊΠΎΠ»ΠΊΡ ΠΈΠΌΠ° ΠΏΠΎΡΡΠ΅Π±Π° ΠΎΠ΄ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ° ΡΠΎ Push ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°ΡΠ°ΡΠ°, ΡΠΎΠ³Π°Ρ ΡΠ΅ ΡΡΠ°ΡΡΡΠ²Π°Π°Ρ docker-compose.yaml ΠΈ docker-compose-push.yaml.
ΠΠΈΠ΄Π΅ΡΡΠΈ docker-compose.yaml ΠΈ docker-compose-push.yaml ΡΠ΅ Π²ΠΎ ΠΏΠ°ΠΏΠΊΠ°ΡΠ°, Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ ΡΠ΅ ΠΊΡΠ΅ΠΈΡΠ° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π° Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΠΌΡΠ΅ΠΆΠ°.
ΠΠΏΠΈΡ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅. ΠΠ²Π° Π΅ ΠΏΠΎΠ½Π°ΠΏΡΠ΅Π΄Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΠΊΠΎΡΠ° Π΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ½Π° Π·Π° ΡΠΎΠ±ΠΈΡΠ°ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ. Π¨ΡΠΎ Π΅ ΠΈΠ·Π²ΠΎΠ½ΡΠ΅Π΄Π½ΠΎ ΠΎΠ²Π΄Π΅? ΠΠ²Π΄Π΅ ΡΠ° Π²ΠΎΠ²Π΅Π΄ΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΡΠ° Π·Π° Π±Π°Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅.
ΠΠ²Π° Π΅ Π³ΠΎΡΠΎΠ²Π° Docker ΡΠ»ΠΈΠΊΠ° ΠΊΠΎΡΠ° ΡΠ°Π±ΠΎΡΠΈ nginx ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΊΠΎΡΠ° Π³ΠΎ ΡΠ»ΡΡΠ° ΡΡΠ΅ΠΊΠ΅ΡΠΎΡ Docker. ΠΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ, Π΄ΠΎΠ΄Π΅ΠΊΠ° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈΡΠ΅ ΡΠ΅ Π²ΠΊΠ»ΡΡΡΠ²Π°Π°Ρ ΠΈ ΠΈΡΠΊΠ»ΡΡΡΠ²Π°Π°Ρ, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° nginx ΡΠ΅ ΡΠ΅Π³Π΅Π½Π΅ΡΠΈΡΠ°. ΠΠΈΠ΅ Π³ΠΎ Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΊΡΠ²Π°ΡΠ΅ΡΠΎ ΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΠΈΠΌΠΈΡΠ° Π½Π° Π΄ΠΎΠΌΠ΅Π½ΠΈ ΠΎΠ΄ ΡΡΠ΅ΡΠΎ Π½ΠΈΠ²ΠΎ.
ΠΠ° ΡΠ°Π·Π²ΠΎΡΠ½Π°ΡΠ° ΠΎΠΊΠΎΠ»ΠΈΠ½Π° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ Π΄ΠΎΠΌΠ΅Π½ΠΎΡ .dev - api.informer.dev. ΠΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅ ΡΠΎ Π΄ΠΎΠΌΠ΅Π½ .dev ΡΠ΅ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° Π½Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΎΡ.
ΠΠΎΡΠΎΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈΡΠ΅ ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π°Π°Ρ Π½Π° ΡΠ΅ΠΊΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ ΡΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΡΠ΅ Π»Π°Π½ΡΠΈΡΠ°Π°Ρ Π·Π°Π΅Π΄Π½ΠΎ Π²ΠΎ ΠΈΡΡΠΎ Π²ΡΠ΅ΠΌΠ΅.
ΠΠΊΠΎ Π³ΠΎ ΠΏΡΠΈΠΊΠ°ΠΆΠ΅ΠΌΠ΅ Π³ΡΠ°ΡΠΈΡΠΊΠΈ, ΠΈΠ·Π»Π΅Π³ΡΠ²Π° Π΄Π΅ΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΡ Π΅ Π½Π°ΡΠΈΠΎΡ ΠΏΡΠ΅Π»ΠΈΡΡΡΠ²Π°Ρ ΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΡ Π²ΠΈΠ΄ Π°Π»Π°ΡΠΊΠ° ΡΠΎ ΠΊΠΎΡΠ° ΠΏΡΠ°Π²ΠΈΠΌΠ΅ Π±Π°ΡΠ°ΡΠ° Π΄ΠΎ Π±Π°Π»Π°Π½ΡΠ΅ΡΠΎΡ.
ΠΠ°Π»Π°Π½ΡΠ΅ΡΠΎΡ ΠΎΠ΄ΡΠ΅Π΄ΡΠ²Π° Π΄ΠΎ ΠΊΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΏΡΠΈΡΡΠ°ΠΏΠΈ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π΄ΠΎΠΌΠ΅Π½ΠΎΡ.
ΠΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ nginx, ΠΊΠΎΡ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° JS Π½Π° Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΈΠ²Π½ΠΈΠΎΡ ΠΏΠ°Π½Π΅Π». ΠΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠΎ nginx, ΠΊΠΎΡ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° API, ΠΈΠ»ΠΈ ΡΡΠ°ΡΠΈΡΠ½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ, ΠΊΠΎΠΈ ΡΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½ΠΈ ΠΎΠ΄ nginx Π²ΠΎ ΡΠΎΡΠΌΠ° Π½Π° Π²ΡΠΈΡΡΠ²Π°ΡΠ΅ ΡΠ»ΠΈΠΊΠΈ.
ΠΠΈΡΠ°Π³ΡΠ°ΠΌΠΎΡ ΠΏΠΎΠΊΠ°ΠΆΡΠ²Π° Π΄Π΅ΠΊΠ° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈΡΠ΅ ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ ΡΠΎ Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΠΌΡΠ΅ΠΆΠ° ΠΈ ΡΠ΅ ΡΠΊΡΠΈΠ΅Π½ΠΈ Π·Π°Π΄ ΠΏΡΠΎΠΊΡΠΈ.
ΠΠ° ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΎΡ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΈΡΡΠ°ΠΏΠΈΡΠ΅ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ Π·Π½Π°Π΅ΡΡΠΈ ΡΠ° IP-Π°, Π½ΠΎ Π²ΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏ Π½ΠΈΠ΅ Π½Π΅ Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΎΠ²Π°. ΠΡΠ°ΠΊΡΠΈΡΠ½ΠΎ Π½Π΅ΠΌΠ° ΠΏΠΎΡΡΠ΅Π±Π° ΠΎΠ΄ Π΄ΠΈΡΠ΅ΠΊΡΠ΅Π½ ΠΊΠΎΠ½ΡΠ°ΠΊΡ.
ΠΠ°ΠΊΠΎΠ² ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠ΅Π±Π° Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°ΠΌ Π·Π° Π΄Π° ΡΠ° ΠΏΡΠΈΠΊΠ»ΡΡΠ°ΠΌ ΠΌΠΎΡΠ°ΡΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°? Π‘ΠΏΠΎΡΠ΅Π΄ ΠΌΠΎΠ΅ ΠΌΠΈΡΠ»Π΅ΡΠ΅, Π΄ΠΎΠ±Π°Ρ ΠΏΡΠΈΠΌΠ΅Ρ Π΅ ΠΎΡΠΈΡΠΈΡΠ°Π»Π½Π°ΡΠ° Π΄ΠΎΠΊΠ΅Ρ ΡΠ»ΠΈΠΊΠ° Π·Π° MySQL.
Π’ΠΎΠ° Π΅ Π΄ΠΎΡΡΠ° ΠΊΠΎΠΌΠΏΠ»ΠΈΡΠΈΡΠ°Π½ΠΎ. ΠΠΌΠ° ΠΌΠ½ΠΎΠ³Ρ Π²Π΅ΡΠ·ΠΈΠΈ. ΠΠΎ, Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΏΠΎΠΊΡΠΈΠ΅ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈ ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ°Π²Π°Ρ Π²ΠΎ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΠΏΠΎΠ½Π°ΡΠ°ΠΌΠΎΡΠ΅Π½ ΡΠ°Π·Π²ΠΎΡ. ΠΠΊΠΎ ΠΎΠ΄Π²ΠΎΠΈΡΠ΅ Π²ΡΠ΅ΠΌΠ΅ ΠΈ ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΠΊΠ°ΠΊΠΎ ΡΠ΅ΡΠΎ ΡΠΎΠ° ΠΊΠΎΠΌΡΠ½ΠΈΡΠΈΡΠ°, ΡΠΎΠ³Π°Ρ ΠΌΠΈΡΠ»Π°ΠΌ Π΄Π΅ΠΊΠ° Π½Π΅ΠΌΠ° Π΄Π° ΠΈΠΌΠ°ΡΠ΅ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠ°ΠΌΠΈ Π΄Π° Π³ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅.
Hub.docker.com ΠΎΠ±ΠΈΡΠ½ΠΎ ΡΠΎΠ΄ΡΠΆΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΈ Π΄ΠΎ github.com, ΠΊΠ°Π΄Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΡΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π°Π°Ρ Π½Π΅ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΎΠ΄ ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΠΌΠΈ Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΡΠ΅ ΡΠ»ΠΈΠΊΠ°.
ΠΠΎΠ½Π°ΡΠ°ΠΌΡ Π²ΠΎ ΠΎΠ²Π° ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ ΠΏΠΎΡΡΠΎΠΈ ΡΠΊΡΠΈΠΏΡΠ° docker-endpoint.sh, ΠΊΠΎΡΠ° Π΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ½Π° Π·Π° ΠΏΡΠ²ΠΈΡΠ½Π°ΡΠ° ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΠ° ΠΈ ΠΏΠΎΠ½Π°ΡΠ°ΠΌΠΎΡΠ½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΡΠ°ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°.
ΠΡΡΠΎ ΡΠ°ΠΊΠ° Π²ΠΎ ΠΎΠ²ΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΡΡΠΎΠΈ ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΠΎΠΊΠΎΠ»ΠΈΠ½Π°ΡΠ°. Π‘ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π½Π° ΠΆΠΈΠ²ΠΎΡΠ½Π°ΡΠ° ΡΡΠ΅Π΄ΠΈΠ½Π° ΠΏΡΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° Π΅Π΄Π΅Π½ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ ΠΈΠ»ΠΈ ΠΏΡΠ΅ΠΊΡ docker-compose, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΡΠ΅Π±Π° Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ ΠΏΡΠ°Π·Π½Π° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ° Π·Π° docker Π·Π° root Π½Π° MySQL ΠΈΠ»ΠΈ ΡΡΠΎ ΠΈ Π΄Π° ΡΠ°ΠΊΠ°ΠΌΠ΅.
ΠΠΎΡΡΠΎΠΈ ΠΎΠΏΡΠΈΡΠ° Π·Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΠ»ΡΡΠ°ΡΠ½Π° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°. ΠΠΈΠ΅ Π²Π΅Π»ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° Π½ΠΈ ΡΡΠ΅Π±Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ, ΡΡΠ΅Π±Π° Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ Π»ΠΎΠ·ΠΈΠ½ΠΊΠ° Π·Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ ΠΈ ΡΡΠ΅Π±Π° Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ.
ΠΠΎ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΠΌΠ°Π»ΠΊΡ Π³ΠΎ ΠΎΠ±Π΅Π΄ΠΈΠ½ΠΈΠ²ΠΌΠ΅ Dockerfile, ΠΊΠΎΡ Π΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ΅Π½ Π·Π° ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΠ°. Π’Π°ΠΌΡ Π³ΠΎ ΠΏΡΠΈΡΠΏΠΎΡΠΎΠ±ΠΈΠ²ΠΌΠ΅ Π½Π° Π½Π°ΡΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈ Π·Π° Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ Π΄Π° Π³ΠΈ ΠΏΡΠΎΡΠΈΡΠΈΠΌΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈΡΠ΅ ΠΏΡΠ°Π²Π° ΡΡΠΎ Π³ΠΈ ΠΊΠΎΡΠΈΡΡΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°. ΠΠ²Π° ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ Π΄Π° ΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄Π΅ Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΎΠ΄ ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π²ΠΎ ΠΈΠ΄Π½ΠΈΠ½Π°. Π ΡΠ±ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅ ΠΈΠΌΠ°Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅, ΠΌΠ΅Π½ΡΠ²Π°ΡΠ΅ ΠΈ Π±ΡΠΈΡΠ΅ΡΠ΅ Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ.
ΠΠ²Π° Π΅ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½Π° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° MySQL Π½Π° github.com. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΎΡΠ²ΠΎΡΠΈΡΠ΅ Dockerfile ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΊΠ°ΠΊΠΎ ΡΠ΅ ΠΎΠ΄Π²ΠΈΠ²Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΠ°ΡΠ° ΡΠ°ΠΌΡ.
docker-endpoint.sh ΡΠΊΡΠΈΠΏΡΠ° ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ½Π° Π·Π° Π²Π»Π΅Π·Π½Π°ΡΠ° ΡΠΎΡΠΊΠ°. ΠΠ° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΠΎΡΠ΅ΡΠ½Π°ΡΠ° ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΠ°, ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ ΡΠ΅ Π½Π΅ΠΊΠΎΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΠΈΡΠ΅Π»Π½ΠΈ Π΄Π΅ΡΡΡΠ²Π° ΠΈ ΡΠΈΡΠ΅ ΠΎΠ²ΠΈΠ΅ Π΄Π΅ΡΡΡΠ²Π° ΡΠ΅ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ Π²ΠΎ ΡΠΊΡΠΈΠΏΡΠ°ΡΠ° Π·Π° ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΠ°.
ΠΠ° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌΠ΅ Π½Π° Π²ΡΠΎΡΠΈΠΎΡ Π΄Π΅Π».
Π‘Π΅ ΠΏΡΠ΅ΡΡΠ»ΠΈΠ²ΠΌΠ΅ Π½Π° gitlab Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΈΠ·Π²ΠΎΡΠ½ΠΈΡΠ΅ ΠΊΠΎΠ΄ΠΎΠ²ΠΈ. ΠΠ²Π° Π΅ ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ ΠΌΠΎΡΠ΅Π½ ΡΠΈΡΡΠ΅ΠΌ ΠΊΠΎΡ ΠΈΠΌΠ° Π²ΠΈΠ·ΡΠ΅Π»Π΅Π½ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ.
ΠΠ΄Π½Π° ΠΎΠ΄ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ Π½Π° Gitlab Π΅ Gitlab CI. Π’ΠΎΠ° Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΎΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ΅ΡΠΈΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΊΠΎΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΡΠ΅ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ Π·Π° ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌ Π·Π° ΠΈΡΠΏΠΎΡΠ°ΠΊΠ° Π½Π° ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΎ ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅.
ΠΠ·Π²Π΅ΡΡΠ°Ρ Π·Π° Gitlab CI 2
Π‘Π΅Π³Π° ΡΠ΅ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΡΡΠΎ Π΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ Π·Π° Π΄Π° ΡΠ΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ° Gitlab CI. ΠΠ° Π΄Π° Π³ΠΎ ΡΡΠ°ΡΡΡΠ²Π°ΠΌΠ΅ Gitlab CI, ΡΠ°ΠΌΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ° ΡΡΠ°Π²ΠΈΠΌΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° .gitlab-ci.yml Π²ΠΎ ΠΊΠΎΡΠ΅Π½ΠΎΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ.
ΠΠ²Π΄Π΅ ΠΎΠΏΠΈΡΡΠ²Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΠ°ΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΈΠ·Π²ΡΡΠΈΠΌΠ΅ Π½ΠΈΠ·Π° ΡΠΎΡΡΠΎΡΠ±ΠΈ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ ΡΠ΅ΡΡ, ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅.
ΠΠ·Π²ΡΡΡΠ²Π°ΠΌΠ΅ ΡΠΊΡΠΈΠΏΡΠΈ ΠΊΠΎΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΡΠ° ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π°Π°Ρ ΠΈΠ·Π³ΡΠ°Π΄Π±Π°ΡΠ° Π½Π° docker-compose Π½Π° Π½Π°ΡΠ°ΡΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°. ΠΠ²Π° Π΅ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠ°ΠΌΠΎ Π·Π°Π΄Π½ΠΈΠΎΡ Π΄Π΅Π».
Π‘Π»Π΅Π΄Π½ΠΎ Π²Π΅Π»ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° Π΅ Π½Π΅ΠΎΠΏΡ ΠΎΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΠ°Ρ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ Π·Π° Π΄Π° ΡΠ΅ ΡΠΌΠ΅Π½ΠΈ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΠ°Ρ ΡΠ΅ΡΡΠΎΠ²ΠΈ.
ΠΠΊΠΎ ΡΠΊΡΠΈΠΏΡΠΈΡΠ΅ ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΈΠ·Π²ΡΡΠ΅Π½ΠΈ ΠΈ Π½Π΅ Π²ΡΠ°ΡΠ°Π°Ρ ΠΊΠΎΠ΄ Π·Π° Π³ΡΠ΅ΡΠΊΠ°, ΡΠΎΠ³Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΡΠ²Π° Π²ΠΎ Π²ΡΠΎΡΠ°ΡΠ° ΡΠ°Π·Π° Π½Π° ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅.
Π€Π°Π·Π°ΡΠ° Π½Π° ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π° Π·Π° ΠΏΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ°. ΠΠ΅ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Π²ΠΌΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ Π±Π΅Π· ΠΏΡΠ΅ΠΊΠΈΠ½ΠΈ.
ΠΠ°ΡΠΈΠ»Π½ΠΎ Π³ΠΈ Π³Π°ΡΠΈΠΌΠ΅ ΡΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ, Π° ΠΏΠΎΡΠΎΠ° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π³ΠΈ ΠΊΡΠ΅Π²Π°ΠΌΠ΅ ΡΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ ΡΠΎΠ±ΡΠ°Π½ΠΈ Π²ΠΎ ΠΏΡΠ²Π°ΡΠ° ΡΠ°Π·Π° ΠΏΡΠΈ ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ΡΠΎ.
ΠΡΠ΄Π΅ Π΄Π° Π³ΠΈ ΠΈΠ·Π²ΡΡΠΈΠΌΠ΅ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈΡΠ΅ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΡΠΎ Π±Π΅Π° Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ ΠΎΠ΄ ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΈΡΠ΅ Π·Π° ΡΠ΅ΠΊΠΎΠ²Π½Π°ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΠΎΠΊΠΎΠ»ΠΈΠ½Π°.
ΠΠΌΠ° Π·Π°Π±Π΅Π»Π΅ΡΠΊΠ° Π΄Π΅ΠΊΠ° ΠΎΠ²Π° ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΌΠΎ Π½Π° Π³Π»Π°Π²Π½Π°ΡΠ° Π³ΡΠ°Π½ΠΊΠ°.
ΠΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΠΊΠΎΠ³Π° ΠΌΠ΅Π½ΡΠ²Π°ΡΠ΅ Π΄ΡΡΠ³ΠΈ Π³ΡΠ°Π½ΠΊΠΈ.
ΠΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Π°Ρ ΠΏΡΡΡΠ°ΡΠ° ΠΏΠΎ Π³ΡΠ°Π½ΠΊΠΈ.
ΠΠ° Π΄Π° Π³ΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΎΠ²Π° ΠΏΠΎΠ½Π°ΡΠ°ΠΌΡ, ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Gitlab Runner.
ΠΠ²Π°Π° Π°Π»Π°ΡΠΊΠ° Π΅ Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° Golang. Π’ΠΎΠ° Π΅ Π΅Π΄Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π΅ Π²ΠΎΠΎΠ±ΠΈΡΠ°Π΅Π½ΠΎ Π²ΠΎ ΡΠ²Π΅ΡΠΎΡ Π½Π° ΠΠΎΠ»Π°Π½Π³, ΠΊΠΎΡΠ° Π½Π΅ Π±Π°ΡΠ° Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ.
ΠΡΠΈ ΡΡΠ°ΡΡΡΠ²Π°ΡΠ΅ Π³ΠΎ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΌΠ΅ Gitlab Runner.
ΠΠΎ Π΄ΠΎΠ±ΠΈΠ²Π°ΠΌΠ΅ ΠΊΠ»ΡΡΠΎΡ Π²ΠΎ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΎΡ Π½Π° Gitlab.
ΠΠΎΡΠΎΠ° ΡΠ° ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π·Π° ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½Π°ΡΠ° Π»ΠΈΠ½ΠΈΡΠ°.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° Gitlab Runner Π²ΠΎ ΡΠ΅ΠΆΠΈΠΌ Π½Π° Π΄ΠΈΡΠ°Π»ΠΎΠ³ (Shell, Docker, VirtualBox, SSH)
ΠΠΎΠ΄ΠΎΡ Π½Π° Gitlab Runner ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΡΠΈ ΡΠ΅ΠΊΠΎΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π²ΠΎ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ ΠΎΠ΄ ΠΏΠΎΡΡΠ°Π²ΠΊΠ°ΡΠ° .gitlab-ci.yml.
ΠΠ°ΠΊΠΎ Π²ΠΈΠ·ΡΠ΅Π»Π½ΠΎ ΠΈΠ·Π³Π»Π΅Π΄Π° Π²ΠΎ Gitlab Π²ΠΎ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΎΡ. ΠΠΎ ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° GItlab CI, ΠΈΠΌΠ°ΠΌΠ΅ Π·Π½Π°ΠΌΠ΅ ΡΡΠΎ ΠΏΠΎΠΊΠ°ΠΆΡΠ²Π° Π²ΠΎ ΠΊΠ°ΠΊΠ²Π° ΡΠΎΡΡΠΎΡΠ±Π° Π΅ ΠΈΠ·Π³ΡΠ°Π΄Π±Π°ΡΠ° Π²ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΡ.
ΠΠ»Π΅Π΄Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΏΡΠ΅Π΄ 4 ΠΌΠΈΠ½ΡΡΠΈ Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½Π° ΠΎΠ±Π²ΡΡΠΊΠ° ΠΊΠΎΡΠ° Π³ΠΈ ΠΏΠΎΠΌΠΈΠ½Π°Π»Π° ΡΠΈΡΠ΅ ΡΠ΅ΡΡΠΎΠ²ΠΈ ΠΈ Π½Π΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠ»Π° Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ.
ΠΠΎΠΆΠ΅ΠΌΠ΅ ΠΏΠΎΠ΄Π΅ΡΠ°Π»Π½ΠΎ Π΄Π° Π³ΠΈ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π³ΡΠ°Π΄Π±ΠΈΡΠ΅. ΠΠ²Π΄Π΅ Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π²Π΅ΡΠ΅ ΠΏΠΎΠΌΠΈΠ½Π°Π»Π΅ Π΄Π²Π΅ Π΄ΡΠΆΠ°Π²ΠΈ. Π‘ΡΠ°ΡΡΡΠΎΡ Π½Π° ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅ ΠΈ ΡΡΠ°ΡΡΡΠΎΡ Π½Π° ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ ΠΏΡΠΈ ΠΏΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅.
ΠΠΊΠΎ ΠΊΠ»ΠΈΠΊΠ½Π΅ΠΌΠ΅ Π½Π° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½Π° Π³ΡΠ°Π΄Π±Π°, ΡΠ΅ ΠΈΠΌΠ° ΠΈΠ·Π»Π΅Π· ΠΎΠ΄ ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ΡΡΠΎ Π±Π΅Π° Π»Π°Π½ΡΠΈΡΠ°Π½ΠΈ Π²ΠΎ ΠΏΡΠΎΡΠ΅ΡΠΎΡ ΡΠΏΠΎΡΠ΅Π΄ .gitlab-ci.yml.
ΠΠ°ΠΊΠ° ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΏΡΠΈΠΊΠ°Π·Π½Π°ΡΠ° Π·Π° Π½Π°ΡΠΈΠΎΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄. ΠΠ»Π΅Π΄Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΈΠΌΠ°Π»ΠΎ ΡΡΠΏΠ΅ΡΠ½ΠΈ ΠΎΠ±ΠΈΠ΄ΠΈ. ΠΠΎΠ³Π° ΡΠ΅ ΠΏΠΎΠ΄Π½Π΅ΡΡΠ²Π°Π°Ρ ΡΠ΅ΡΡΠΎΠ²ΠΈΡΠ΅, ΡΠΈΠ΅ Π½Π΅ ΡΠ΅ ΠΏΡΠ΅ΡΡΠ»Π°Π°Ρ Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΠΎΡ ΡΠ΅ΠΊΠΎΡ ΠΈ ΠΊΠΎΠ΄ΠΎΡ Π·Π° ΡΠ°Π·Π° Π½Π΅ ΡΠ΅ Π°ΠΆΡΡΠΈΡΠ°.
ΠΠΎΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π³ΠΈ ΡΠ΅ΡΠΈΠ²ΠΌΠ΅ ΠΏΡΠΈ ΠΈΠ½ΡΡΠ΅Π½ΠΈΡΠ°ΡΠ΅ΡΠΎ ΠΊΠΎΠ³Π° Π³ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π²ΠΌΠ΅ docker? ΠΠ°ΡΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌ ΡΠ΅ ΡΠΎΡΡΠΎΠΈ ΠΎΠ΄ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΠΈ ΡΡΠ΅Π±Π°ΡΠ΅ Π΄Π° Π³ΠΈ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π½Π΅ΠΊΠΎΠΈ ΠΎΠ΄ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ ΡΡΠΎ Π±Π΅Π° Π°ΠΆΡΡΠΈΡΠ°Π½ΠΈ Π²ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠΎ, Π° Π½Π΅ ΡΠ΅Π»ΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌ.
ΠΠ° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΎΠ²Π°, ΠΌΠΎΡΠ°Π²ΠΌΠ΅ Π΄Π° ΠΎΠ΄Π²ΠΎΠΈΠΌΠ΅ ΡΓ¨ Π²ΠΎ ΠΏΠΎΡΠ΅Π±Π½ΠΈ ΠΏΠ°ΠΏΠΊΠΈ.
ΠΡΠΊΠ°ΠΊΠΎ Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠ²ΠΌΠ΅ ΠΎΠ²Π°, ΠΈΠΌΠ°Π²ΠΌΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠΎ ΡΠ°ΠΊΡΠΎΡ Π΄Π΅ΠΊΠ° Docker-compose ΡΠΎΠ·Π΄Π°Π²Π° ΡΠΎΠΏΡΡΠ²Π΅Π½ ΠΌΡΠ΅ΠΆΠ΅Π½ ΠΏΡΠΎΡΡΠΎΡ Π·Π° ΡΠ΅ΠΊΠΎΡΠ° ΠΏΠ°ΠΏΠΊΠ° ΠΈ Π½Π΅ Π³ΠΈ Π³Π»Π΅Π΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ Π½Π° ΡΠ²ΠΎΡΠΎΡ ΡΠΎΡΠ΅Π΄.
ΠΠ° Π΄Π° ΡΠ΅ Π·Π°ΠΎΠ±ΠΈΠΊΠΎΠ»ΠΈΠΌΠ΅, ΡΠ° ΡΠΎΠ·Π΄Π°Π΄ΠΎΠ²ΠΌΠ΅ ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΡΠ°ΡΠ½ΠΎ Π²ΠΎ Docker. ΠΠΎ Docker-compose ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π΄Π΅ΠΊΠ° ΡΡΠ΅Π±Π° Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΡΠ°ΠΊΠ²Π° ΠΌΡΠ΅ΠΆΠ° Π·Π° ΠΎΠ²ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ.
Π’Π°ΠΊΠ°, ΡΠ΅ΠΊΠΎΡΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΡΡΠΎ Π·Π°ΠΏΠΎΡΠ½ΡΠ²Π° ΡΠΎ ΠΎΠ²Π°Π° ΠΌΡΠ΅ΠΆΠ° Π³ΠΈ Π³Π»Π΅Π΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ Π²ΠΎ Π΄ΡΡΠ³ΠΈΡΠ΅ Π΄Π΅Π»ΠΎΠ²ΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ.
Π‘Π»Π΅Π΄Π½ΠΈΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π΅ ΠΏΠΎΠ΄Π΅Π»Π±Π°ΡΠ° Π½Π° ΡΡΠ΅Π½Π°ΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΏΡΠΎΠ΅ΠΊΡΠΈ.
ΠΠΈΠ΄Π΅ΡΡΠΈ Π·Π° ΡΠ΅ΡΠΎ ΠΎΠ²Π° Π΄Π° ΠΈΠ·Π³Π»Π΅Π΄Π° ΡΠ±Π°Π²ΠΎ ΠΈ ΡΡΠΎ Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ±Π»ΠΈΡΠΊΡ Π΄ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ, Π΄ΠΎΠ±ΡΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΏΠΎΡΡΠ°ΡΠ° 80 ΠΈΠ»ΠΈ 443, ΠΊΠΎΡΠ° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π½Π°ΡΠ΅ΠΊΠ°Π΄Π΅ Π²ΠΎ WEB.
ΠΠ°ΠΊΠΎ Π³ΠΎ ΡΠ΅ΡΠΈΠ²ΠΌΠ΅ ΠΎΠ²Π°? ΠΠ° ΡΠΈΡΠ΅ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΌΡ Π΄ΠΎΠ΄Π΅Π»ΠΈΠ²ΠΌΠ΅ Π΅Π΄Π΅Π½ Gitlab Runner.
Gitlab Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ΠΈ Gitlab Runners, ΠΊΠΎΠΈ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΡΠ΅ Π³ΠΈ ΠΏΡΠ΅Π·Π΅ΠΌΠ°Ρ ΡΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Π΅Π΄Π½Π° ΠΏΠΎ Π΅Π΄Π½Π° Π²ΠΎ Ρ Π°ΠΎΡΠΈΡΠ΅Π½ ΡΠ΅Π΄ΠΎΡΠ»Π΅Π΄ ΠΈ ΡΠ΅ Π³ΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π°Π°Ρ.
ΠΠ° Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΠΌΠ΅ ΠΊΡΡΠ½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²ΠΌΠ΅ Π³ΡΡΠΏΠ°ΡΠ° Π½Π° Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π½Π° Π΅Π΄Π΅Π½ Gitlab Runner, ΠΊΠΎΡ ΡΠ΅ ΡΠΏΡΠ°Π²ΡΠ²Π° ΡΠΎ Π½Π°ΡΠΈΡΠ΅ ΡΠΎΠΌΠΎΠ²ΠΈ Π±Π΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ.
ΠΠΎ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠΈΠ²ΠΌΠ΅ nginx-proxy Π²ΠΎ ΠΏΠΎΡΠ΅Π±Π½Π° ΡΠΊΡΠΈΠΏΡΠ° Π·Π° Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅ ΠΈ Π³ΠΈ Π½Π°ΠΏΠΈΡΠ°Π²ΠΌΠ΅ ΠΌΡΠ΅ΠΆΠΈΡΠ΅ Π½Π° ΡΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π²ΠΎ Π½Π΅Π³ΠΎ.
ΠΠ°ΡΠΈΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈΠΌΠ° Π΅Π΄Π½Π° ΠΌΡΠ΅ΠΆΠ°, Π° Π±Π°Π»Π°Π½ΡΠ΅ΡΠΎΡ ΠΈΠΌΠ° Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΌΡΠ΅ΠΆΠΈ Π·Π°ΡΠ½ΠΎΠ²Π°Π½ΠΈ Π½Π° ΠΈΠΌΠΈΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ. ΠΠΎΠΆΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΊΡΠΈ ΡΠΎ ΠΈΠΌΠΈΡΠ° Π½Π° Π΄ΠΎΠΌΠ΅Π½ΠΈ.
ΠΠ°ΡΠΈΡΠ΅ Π±Π°ΡΠ°ΡΠ° Π΄ΠΎΠ°ΡΠ°Π°Ρ ΠΏΡΠ΅ΠΊΡ Π΄ΠΎΠΌΠ΅Π½ΠΎΡ Π½Π° ΠΏΠΎΡΡΠ°ΡΠ° 80 ΠΈ ΡΠ΅ ΡΠ΅ΡΠ°Π²Π°Π°Ρ Π½Π° Π³ΡΡΠΏΠ° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ ΡΡΠΎ Π³ΠΎ ΠΎΠΏΡΠ»ΡΠΆΡΠ²Π°Π°Ρ ΠΎΠ²ΠΎΡ Π΄ΠΎΠΌΠ΅Π½.
ΠΠ°ΠΊΠ²ΠΈ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΈΠΌΠ°ΡΠ΅? ΠΠ²Π° Π΅ ΠΎΠ½Π° ΡΡΠΎ ΡΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°Ρ ΠΊΠ°ΠΊΠΎ root. ΠΠ²Π° Π΅ ΠΊΠΎΡΠ΅Π½ΠΎΡ Π½Π΅Π΅Π΄Π½Π°ΠΊΠΎΠ² ΠΊΠΎΡΠ΅Π½ Π΄ΠΎΠΌΠ°ΡΠΈΠ½ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ.
ΠΠ΅ΡΡΡΠΎΠ°, Π°ΠΊΠΎ Π³ΠΎ Π²Π½Π΅ΡΠ΅ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ, ΡΠΎΡ ΡΠ΅ Π±ΠΈΠ΄Π΅ root ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΡΠΎ ΡΠ° ΡΠΎΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π²ΠΎ ΠΎΠ²ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ Π΄ΠΎΠ±ΠΈΠ²Π° root ΠΏΡΠ°Π²Π°.
ΠΠΊΠΎ Π½Π΅ΠΊΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅Ρ Π²Π»Π΅Π³ΠΎΠ» Π²ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ ΠΈ Π½Π°ΠΏΡΠ°Π²ΠΈΠ» Π½Π΅ΠΊΠΎΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΡΠ°ΠΌΡ ΡΡΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π»Π΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ, Π° ΠΏΠΎΡΠΎΠ° Π³ΠΎ Π½Π°ΠΏΡΡΡΠΈΠ» ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ, ΡΠΎΠ³Π°Ρ Π²ΠΎ Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ ΡΠ°Π±ΠΎΡΠ΅Π½ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ ΠΈΠΌΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° Π΄ΠΎ ΠΊΠΎΡΠ° Π½Π΅ΠΌΠ° ΠΏΡΠΈΡΡΠ°ΠΏ.
ΠΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ ΠΎΠ²Π° Π΄Π° ΡΠ΅ ΡΠ΅ΡΠΈ? ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈ ΠΊΠΎΠΈ ΡΠ΅ Π±ΠΈΠ΄Π°Ρ Π²ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ.
ΠΠΎΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠ΅ ΠΏΠΎΡΠ°Π²ΠΈΡΠ° ΠΊΠΎΠ³Π° Π³ΠΎ Π΄ΠΎΠ΄Π°Π΄ΠΎΠ²ΠΌΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ?
ΠΠΎΠ³Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ, ID Π½Π° Π³ΡΡΠΏΠ°ΡΠ° (UID) ΠΈ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ ID (GID) ΡΠ΅ΡΡΠΎ Π½Π΅ ΡΠ΅ ΡΠΎΠ²ΠΏΠ°ΡΠ°Π°Ρ.
ΠΠ° Π΄Π° Π³ΠΎ ΡΠ΅ΡΠΈΠΌΠ΅ ΠΎΠ²ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π²ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈ ΡΠΎ ID 1000.
ΠΠΎ Π½Π°ΡΠΈΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΠΎΠ²Π° ΡΠ΅ ΡΠΎΠ²ΠΏΠ°Π΄Π½Π° ΡΠΎ ΡΠ°ΠΊΡΠΎΡ Π΄Π΅ΠΊΠ° ΡΠΊΠΎΡΠΎ ΡΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈ ΠΊΠΎΡΠΈΡΡΠ°Ρ Ubuntu OS. Π Π²ΠΎ Ubuntu OS ΠΏΡΠ²ΠΈΠΎΡ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ ΠΈΠΌΠ° ID 1000.
ΠΠ°Π»ΠΈ ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΠ»Π°Π½ΠΎΠ²ΠΈ?
ΠΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΡΠ΅ ΡΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° Docker. ΠΡΠΎΠ΅ΠΊΡΠΎΡ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π°, Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΌΠ΅Π½ΡΠ²Π°. ΠΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΠΊΠΎΠΈ Π±Π΅Π° Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈ ΠΏΡΠ΅Π΄ Π΄Π²Π°-ΡΡΠΈ ΠΌΠ΅ΡΠ΅ΡΠΈ ΠΏΠΎΠ»Π΅ΠΊΠ° ΡΡΠ°Π½ΡΠ²Π°Π°Ρ Π·Π°ΡΡΠ°ΡΠ΅Π½ΠΈ.
ΠΠ΅ΠΊΠΎΠΈ ΠΎΠ΄ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ ΡΡΠΎ Π³ΠΈ ΡΠ΅ΡΠΈΠ²ΠΌΠ΅ ΠΌΠΎΠΆΠ΅Π±ΠΈ Π²Π΅ΡΠ΅ ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈ ΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°.
ΠΠ°Π²ΠΈΡΡΠΈΠ½Π° ΡΠ°ΠΊΠ°ΠΌ Π΄Π° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΌ ΠΏΠΎΠ½Π°ΡΠ°ΠΌΡ ΠΈ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π°ΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π½Π° ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΡΠ°.
ΠΠ΄Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ Π΅ Π²Π³ΡΠ°Π΄Π΅Π½ΠΈΠΎΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ Π½Π° Docker Π½Π°ΡΠ΅ΡΠ΅Π½ Docker Swarm, ΠΊΠΎΡ ΠΈΠ·Π»Π΅Π³ΡΠ²Π° ΠΎΠ΄ ΠΊΡΡΠΈΡΠ°ΡΠ°. ΠΠΈ ΡΠ°ΠΊΠ°Π» Π΄Π° Π»Π°Π½ΡΠΈΡΠ° Π½Π΅ΡΡΠΎ Π²ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ°ΡΠ° Docker Swarm.
ΠΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈΡΠ΅ Π·Π° ΠΌΡΠ΅ΡΡΠ΅ΡΠ΅ Π³ΠΎ ΠΏΡΠ°Π²Π°Ρ Π½Π΅Π·Π³ΠΎΠ΄Π½ΠΎ ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ΡΠΎ ΡΠΎ ΡΡΡΠΏΡΠΈ. Π‘Π΅Π³Π° ΡΡΡΠΏΡΠΈΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΎΠ»ΠΈΡΠ°Π½ΠΈ. Π’ΠΈΠ΅ ΡΠ΅ ΡΠ°ΡΡΡΠ»Π°Π½ΠΈ Π²ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ. ΠΠ΄Π½Π° ΠΎΠ΄ Π·Π°Π΄Π°ΡΠΈΡΠ΅ Π΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠ΄ΠΎΠ±Π΅Π½ ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ Π΄Π½Π΅Π²Π½ΠΈΡΠΈΡΠ΅ ΠΏΡΠ΅ΠΊΡ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ.
ΠΠ·Π²ΠΎΡ: www.habr.com