ΠΡΠ΅Π΄ΡΡΠ°Π²ΡΠΌ Π²ΠΈ ΡΠ°Π·ΠΈΡΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π΄ΠΎΠΊΠ»Π°Π΄Π° Π½Π° ΠΠ»Π΅ΠΊΡΠ°Π½Π΄ΡΡ Π‘ΠΈΠ³Π°ΡΠ΅Π² ΠΎΡ Inventos "ΠΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΡΠ΅ΡΡΠ²Π°Π½Π΅ Ρ Docker + Gitlab CI"
Π’Π΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ Π·Π°ΠΏΠΎΡΠ²Π°Ρ Π΄Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Ρ ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° Π±Π°Π·Π° Docker + Gitlab CI, ΡΠ΅ΡΡΠΎ Π·Π°Π΄Π°Π²Π°Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ Π²ΡΠΏΡΠΎΡΠΈ. ΠΡ ΠΊΡΠ΄Π΅ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π°Ρ? ΠΠ°ΠΊ Π΄Π° ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Ρ ΠΏΡΠΎΡΠ΅ΡΠ°? ΠΠ°ΠΊ Π΄Π° ΡΠ΅ΡΡΠ²Π°Ρ?
Π’ΠΎΠ·ΠΈ Π΄ΠΎΠΊΠ»Π°Π΄ Π΅ ΡΠ΅Π½Π΅Π½, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΡΡΡΠΊΡΡΡΠΈΡΠ°Π½ΠΎ ΠΎΠ±ΡΡΠ½ΡΠ²Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΡΠ΅ΡΡΠ²Π°Π½Π΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Docker ΠΈ Gitlab CI. Π‘Π°ΠΌΠΈΡΡ Π΄ΠΎΠΊΠ»Π°Π΄ Π΅ ΠΎΡ 2017 Π³ΠΎΠ΄ΠΈΠ½Π°. Π‘ΠΌΡΡΠ°ΠΌ, ΡΠ΅ ΠΎΡ Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ, ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡ, ΠΈΠ΄Π΅ΠΈ ΠΈ ΠΎΠΏΠΈΡ Π²ΡΠ² ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ°.

ΠΠ° ΠΊΠΎΠ³ΠΎΡΠΎ ΠΌΡ Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, ΠΌΠΎΠ»Ρ ΠΏΠΎΠ΄ ΠΊΠ°Ρ.
ΠΠ°Π·Π²Π°ΠΌ ΡΠ΅ ΠΠ»Π΅ΠΊΡΠ°Π½Π΄ΡΡ Π‘ΠΈΠ³Π°ΡΠ΅Π². Π Π°Π±ΠΎΡΡ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° Inventos. Π©Π΅ ΡΠΏΠΎΠ΄Π΅Π»Ρ ΠΎΠΏΠΈΡΠ° ΡΠΈ Ρ Docker ΠΈ ΠΊΠ°ΠΊ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ Π³ΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°ΠΌΠ΅ Π² ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ°.
Π’Π΅ΠΌΠ° Π½Π° Π΄ΠΎΠΊΠ»Π°Π΄Π°: ΠΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Docker ΠΈ Gitlab CI.

Π’ΠΎΠ²Π° Π΅ ΠΌΠΎΡΡ Π²ΡΠΎΡΠΈ Π΄ΠΎΠΊΠ»Π°Π΄ Π·Π° Docker. ΠΡΠΈ ΠΏΡΡΠ²ΠΈΡ Π΄ΠΎΠΊΠ»Π°Π΄ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅ Docker ΡΠ°ΠΌΠΎ Π² Development Π½Π° ΠΌΠ°ΡΠΈΠ½ΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅. ΠΡΠΎΡΡ Π½Π° ΡΠ»ΡΠΆΠΈΡΠ΅Π»ΠΈΡΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠΈ Docker, Π±Π΅ΡΠ΅ ΠΎΠΊΠΎΠ»ΠΎ 2-3 Π΄ΡΡΠΈ. ΠΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ Π½Π°ΡΡΡΠΏΠ°Ρ ΠΌΠ΅ ΠΎΠΏΠΈΡ ΠΈ ΠΏΠΎΡΡΠΈΠ³Π½Π°Ρ ΠΌΠ΅ ΠΌΠ°Π»ΠΊΠΎ Π½Π°ΠΏΡΠ΅Π΄ΡΠΊ. ΠΠΈΠ½ΠΊ ΠΊΡΠΌ Π½Π°ΡΠΈΡ .
ΠΠ°ΠΊΠ²ΠΎ ΡΠ΅ Π²ΠΊΠ»ΡΡΠ²Π° ΡΠΎΠ·ΠΈ Π΄ΠΎΠΊΠ»Π°Π΄? Π©Π΅ ΡΠΏΠΎΠ΄Π΅Π»ΠΈΠΌ ΠΎΠΏΠΈΡΠ° ΡΠΈ Π·Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΡΠ΅ΡΠ½Π°Ρ ΠΌΠ΅, ΠΈ ΠΊΠ°ΠΊ Π³ΠΈ ΡΠ΅ΡΠ°Π²Π°Ρ ΠΌΠ΅. ΠΠ΅ Π²ΡΠΈΡΠΊΠΎ Π±Π΅ΡΠ΅ ΠΏΠ΅ΡΡΠ΅ΠΊΡΠ½ΠΎ, Π½ΠΎ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° Π½Π°ΠΏΡΠ΅Π΄Π²Π°ΠΌΠ΅.
ΠΠ°ΡΠΈΡΡ Π΄Π΅Π²ΠΈΠ·: dockerize everything we can reach.

ΠΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠ΅ΡΠ°Π²Π°ΠΌΠ΅?
ΠΠΎΠ³Π°ΡΠΎ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΅ΠΊΠΈΠΏΠ°, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΡΡ ΡΡΠ°Π²Π° ΠΎΠ±Ρ ΡΠ΅ΡΡΡΡ. ΠΠΎΠ½ΡΠΊΠΎΠ³Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΡΡ ΡΠ΅ ΠΈΠ·ΡΠ΅Π³Π»Ρ ΠΎΡ Π΅Π΄ΠΈΠ½ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ ΡΠ΅ Π½Π°Π·Π½Π°ΡΠ°Π²Π° Π·Π° Π½ΡΠΊΠ°ΠΊΠ²ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π² Π΄ΡΡΠ³ ΠΏΡΠΎΠ΅ΠΊΡ.
ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΡΡ Π±ΡΡΠ·ΠΎ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅, ΡΠΎΠΉ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΠΈ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ° ΡΡΠ΅Π΄Π°, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΌΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ΡΠ΅ΡΠ°Π²Π° Π·Π°Π΄Π°ΡΠΈΡΠ΅ ΠΏΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ, Π°ΠΊΠΎ Π·Π°ΠΏΠΎΡΠ²Π°ΡΠ΅ ΠΎΡ Π½ΡΠ»Π°ΡΠ°, Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°Π»Π½Π°ΡΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΅ ΠΎΡΠΊΡΠ΄Π½Π°. ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Ρ ΠΈΠΌΠ°Ρ ΡΠ°ΠΌΠΎ ΠΏΠΎ-ΠΎΠΏΠΈΡΠ½ΠΈΡΠ΅. Π‘Π»ΡΠΆΠΈΡΠ΅Π»ΠΈΡΠ΅ ΡΠ°ΠΌΠΈ Π½Π°ΡΡΡΠΎΠΉΠ²Π°Ρ ΡΠ°Π±ΠΎΡΠ½ΠΎΡΠΎ ΡΠΈ ΠΌΡΡΡΠΎ Π·Π° Π΅Π΄ΠΈΠ½-Π΄Π²Π° Π΄Π½ΠΈ. ΠΠ° Π΄Π° ΡΡΠΊΠΎΡΠΈΠΌ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅ Docker.
Π‘Π»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΠΏΡΠΈΡΠΈΠ½Π° Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π² Development. ΠΠΎ ΠΌΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΈΠ²Π°. ΠΡΠ² Π²ΡΠ΅ΠΊΠΈ ΠΏΠ΅ΡΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ Π²ΡΠ²Π΅ΠΆΠ΄Π° ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ Π΄ΠΎΠΌΠ΅ΠΉΠ½, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ vasya.dev. Π‘ΡΡΠ΅Π΄ΡΡ ΠΠ΅ΡΡ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅Π΄ΠΈ Π΄ΠΎ Π½Π΅Π³ΠΎ, ΠΈΠΌΠ° Π΄ΠΎΠΌΠ΅ΠΉΠ½ petya.dev. Π’Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Ρ ΡΠ°ΠΉΡ ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΠ΅Π·ΠΈ Π΄ΠΎΠΌΠ΅ΠΉΠ½ΠΈ.
ΠΠΎΠ³Π°ΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π½Π°ΡΠ°ΡΡΠ²Π° ΠΈ ΡΠ΅Π·ΠΈ Π΄ΠΎΠΌΠ΅ΠΉΠ½ΠΈ Π·Π°ΠΏΠΎΡΠ²Π°Ρ Π΄Π° ΠΏΠΎΠΏΠ°Π΄Π°Ρ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈΡΠ΅, Π²ΡΠ·Π½ΠΈΠΊΠ²Π° ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡ ΠΌΠ΅ΠΆΠ΄Ρ Development ΡΡΠ΅Π΄ΠΈΡΠ΅ ΠΈ ΠΏΡΡΡΡ Π½Π° ΡΠ°ΠΉΡΠ° ΡΠ΅ ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ²Π°.
Π‘ΡΡΠΎΡΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π° ΠΈ Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ. ΠΡΠΊΠΎΠΉ Π½Π΅ ΡΠ΅ Π·Π°ΠΌΠΈΡΠ»Ρ Π·Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ° ΠΈ ΡΠ°Π±ΠΎΡΠΈ Ρ ΠΏΡΠ°Π·Π½Π° ΠΏΠ°ΡΠΎΠ»Π° Π·Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» root. ΠΡΠΊΠΎΠΉ Π΄ΡΡΠ³ Π½Π° Π΅ΡΠ°ΠΏΠ° Π½Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ° Π½Π° MySQL Π΅ ΠΏΠΎΠΈΡΠΊΠ°Π» ΠΏΠ°ΡΠΎΠ»Π°, ΠΊΠΎΡΡΠΎ Π΅ Π±ΠΈΠ»Π° 123. Π§Π΅ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ commit Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°. ΠΡΠΊΠΎΠΉ Π΅ ΠΏΠΎΠΏΡΠ°Π²ΠΈΠ», Π½ΡΠΊΠΎΠΉ Π½Π΅ Π΅ ΠΏΠΎΠΏΡΠ°Π²ΠΈΠ» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°. ΠΠΌΠ° ΡΠ»ΡΡΠ°ΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Ρ
ΠΌΠ΅ ΡΠ΅ΡΡΠΎΠ²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π² .gitignore ΠΈ Π²ΡΠ΅ΠΊΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ. Π’ΠΎΠ²Π° Π·Π°ΡΡΡΠ΄Π½ΡΠ²Π°ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ. ΠΡΠ²Π΅Π½ Π²ΡΠΈΡΠΊΠΎ Π΄ΡΡΠ³ΠΎ, Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΏΠΎΠΌΠ½ΠΈΠΌ Π·Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ. ΠΠ°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ½ΠΈΡΠΈΠΈΡΠ°Π½Π°, ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π·Π°Π΄Π°Π΄Π΅Π½Π° ΠΏΠ°ΡΠΎΠ»Π°, ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π», Π΄Π° Π±ΡΠ΄Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½Π° ΡΠ°Π±Π»ΠΈΡΠ° ΠΈ Ρ.Π½.
ΠΡΠ΅ Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ Π΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΡΠ΅. Π§Π΅ΡΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ ΡΠ°Π±ΠΎΡΠΈ ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ. ΠΠΌΠ° Legacy ΠΏΡΠΎΠ΅ΠΊΡ, ΠΊΠΎΠΉΡΠΎ Π·Π°ΠΏΠΎΡΠ½Π° ΠΏΡΠ΅Π΄ΠΈ ΠΏΠ΅Ρ Π³ΠΎΠ΄ΠΈΠ½ΠΈ (ΠΎΡ 2017 Π³ΠΎΠ΄ΠΈΠ½Π° β Π·Π°Π±Π΅Π». ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ°). ΠΡΠΈ ΡΡΠ°ΡΡΠ° Π·Π°ΠΏΠΎΡΠ½Π°Ρ ΠΌΠ΅ Ρ MySQL 5.5. ΠΠΌΠ° ΠΈ ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ ΡΡΠ°ΡΠ°Π΅ΠΌ Π΄Π° Π²Π½Π΅Π΄ΡΡΠ²Π°ΠΌΠ΅ Π²Π΅ΡΠ΅ ΠΏΠΎ-ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° MySQL, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ 5.7 ΠΈΠ»ΠΈ ΠΏΠΎ-Π½ΠΎΠ²ΠΈ (ΠΏΡΠ΅Π· 2017 Π³ΠΎΠ΄ΠΈΠ½Π° β Π·Π°Π±Π΅Π». ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ°).
ΠΠΎΠΉΡΠΎ ΡΠ°Π±ΠΎΡΠΈ Ρ MySQL Π·Π½Π°Π΅, ΡΠ΅ ΡΠ΅Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π²ΠΎΠ΄ΡΡ ΡΡΡ ΡΠ΅Π±Π΅ ΡΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ. ΠΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°Ρ Π΄Π²Π΅ Π±Π°Π·ΠΈ Π·Π°Π΅Π΄Π½ΠΎ. ΠΠ°ΠΉ-ΠΌΠ°Π»ΠΊΠΎΡΠΎ, ΡΡΠ°ΡΠΈΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΠΊΡΠΌ Π½ΠΎΠ²Π°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. Π’ΠΎΠ²Π° ΠΎΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π° ΠΏΠΎΡΠ°ΠΆΠ΄Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°.
Π‘Π»Π΅Π΄Π²Π°ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π΅, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ ΡΠ°Π±ΠΎΡΠΈ Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°, ΡΠΎΠΉ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π»ΠΎΠΊΠ°Π»Π½ΠΈ ΡΠ΅ΡΡΡΡΠΈ, Π»ΠΎΠΊΠ°Π»Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, Π»ΠΎΠΊΠ°Π»Π½Π° RAM. Π¦ΡΠ»ΠΎΡΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΡΠ΅ΡΠ΅Π½ΠΈΡΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠΎΠ²Π°, ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ Π½Π° Π΅Π΄Π½Π° ΠΌΠ°ΡΠΈΠ½Π°. ΠΡΠΈΠΌΠ΅Ρ Π΅, ΠΊΠΎΠ³Π°ΡΠΎ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ ΠΈΠΌΠ°ΠΌΠ΅ 3 backend ΡΡΡΠ²ΡΡΠ°, Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ Π·Π°ΠΏΠ°Π·Π²Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² ΠΊΠΎΡΠ΅Π½ΠΎΠ²Π°ΡΠ° ΠΏΠ°ΠΏΠΊΠ°, ΠΎΡ ΠΊΠΎΡΡΠΎ nginx Π²Π·Π΅ΠΌΠ° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π·Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π½Π° Π·Π°ΡΠ²ΠΊΠΈΡΠ΅. ΠΠΎΠ³Π°ΡΠΎ ΡΠ°ΠΊΡΠ² ΠΊΠΎΠ΄ ΠΏΠΎΠΏΠ°Π΄Π½Π΅ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ, ΡΠ΅ ΠΎΠΊΠ°Π·Π²Π°, ΡΠ΅ ΡΠ°ΠΉΠ»ΡΡ ΠΏΡΠΈΡΡΡΡΠ²Π° ΡΠ°ΠΌΠΎ Π½Π° Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΡΠΈΡΠ΅ ΡΡΡΠ²ΡΡΠ°.
Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π° Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈ. ΠΠΎΠ³Π°ΡΠΎ ΡΠ°Π·Π΄Π΅Π»ΡΠΌΠ΅ Π³ΠΎΠ»Π΅ΠΌΠΈΡΠ΅ ΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ, ΠΊΠΎΠΈΡΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°Ρ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ. Π’ΠΎΠ²Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΠΌ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, ΡΡΠΎΠ±ΡΠ°Π·Π΅Π½ΠΈ Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈΡ ΡΡΠ΅ΠΊ Π·Π°Π΄Π°ΡΠΈ. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠΎΠ²Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ°Π·Π΄Π΅Π»ΠΈΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΠΈ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ½ΠΎΡΡΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅.
Frontend ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ, ΡΠ°Π±ΠΎΡΠ΅Ρ Π½Π° JS, ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ Π²Π»ΠΈΡΠ΅ Π½Π° Backend. Backend ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ ΠΎΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°, Π² Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ, Ruby on Rails ΠΈ Π½Π΅ ΠΏΡΠ΅ΡΠΈ Π½Π° Frontend. ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ ΡΠ΅ ΠΎΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΡΡΠ΅Π· API.
ΠΠ°ΡΠΎ Π±ΠΎΠ½ΡΡ, Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Docker ΡΡΠΏΡΡ ΠΌΠ΅ Π΄Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠ΅ΡΡΡΡΠΈΡΠ΅ Π½Π° Staging. ΠΡΠ΅ΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡ, ΠΏΠΎΡΠ°Π΄ΠΈ ΡΠ²ΠΎΡΡΠ° ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°, ΠΈΠ·ΠΈΡΠΊΠ²Π°ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ. Π€ΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΠΎΡΠ΄Π΅Π»ΡΠΌΠ΅ ΠΈΠ»ΠΈ ΠΏΠΎ Π΅Π΄ΠΈΠ½ Π²ΠΈΡΡΡΠ°Π»Π΅Π½ ΡΡΡΠ²ΡΡ ΠΈ Π΄Π° Π³ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΎΡΠ΄Π΅Π»Π½ΠΎ, ΠΈΠ»ΠΈ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΡΠΌΠ΅ Π½ΡΠΊΠ°ΠΊΠ²Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΡΡΠ΅Π΄Π°, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²Π»ΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ Π²Π΅ΡΡΠΈΠΈΡΠ΅ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΡΠ΅.

ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ. ΠΠ°ΠΊΠ²ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅?
- Π‘Π°ΠΌΠΈΡΡ Docker. Π Dockerfile ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° Π΅Π΄Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
- Docker-compose β ΡΠΎΠ²Π° Π΅ ΡΠ²ΡΡΠ·Π²Π°Π½Π΅, ΠΊΠΎΠ΅ΡΠΎ ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π°ΡΠΈ Docker ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
- GitLab ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄.
- GitLab-CI ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π·Π° ΡΠΈΡΡΠ΅ΠΌΠ½Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ.

ΠΠΎΠΊΠ»Π°Π΄ΡΡ ΡΡΠ΄ΡΡΠΆΠ° Π΄Π²Π΅ ΡΠ°ΡΡΠΈ.
ΠΡΡΠ²Π°ΡΠ° ΡΠ°ΡΡ ΡΠ΅ ΡΠ°Π·ΠΊΠ°ΠΆΠ΅ ΠΊΠ°ΠΊ ΡΡΠ°ΡΡΠΈΡΠ°Ρ ΠΌΠ΅ Docker Π½Π° ΠΌΠ°ΡΠΈΠ½ΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅.
ΠΡΠΎΡΠ°ΡΠ° ΡΠ°ΡΡ ΡΠ΅ ΡΠ°Π·ΠΊΠ°ΠΆΠ΅ ΠΊΠ°ΠΊ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°ΠΌΠ΅ Ρ GitLab, ΠΊΠ°ΠΊ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠ΅ΡΡΠΎΠ²Π΅ ΠΈ ΠΊΠ°ΠΊ ΡΠ°Π·Π²ΠΈΠ²Π°ΠΌΠ΅ Π½Π° Staging.

Docker β ΡΠΎΠ²Π° Π΅ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° (ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π΅Π½ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄) Π΄Π° ΠΎΠΏΠΈΡΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ. Π’ΠΎΠ²Π° Π΅ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Dockerfile. Π’ΡΠΊ ΠΎΠ±ΡΠ²ΡΠ²Π°ΠΌΠ΅, ΡΠ΅ Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π°ΠΌΠ΅ ΠΎΡ ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΈΡ Docker ΠΎΠ±ΡΠ°Π· Ruby:2.3.0. Π’ΠΎΠΉ ΡΡΠ΄ΡΡΠΆΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Ruby Π²Π΅ΡΡΠΈΡ 2.3. Π£ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°ΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ ΠΈ NodeJS. ΠΠΏΠΈΡΠ²Π°ΠΌΠ΅, ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³. /appΠΠ°Π·Π½Π°ΡΠ°Π²Π°ΠΌΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° app Π·Π° ΡΠ°Π±ΠΎΡΠ½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ. Π ΡΠΎΠ·ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΠΏΠΎΡΡΠ°Π²ΡΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½ Gemfile ΠΈ Gemfile.lock. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΡΠΎΠ·ΠΈ ΠΎΠ±ΡΠ°Π·. Π£ΠΊΠ°Π·Π²Π°ΠΌΠ΅, ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡΡ ΡΠ΅ Π±ΡΠ΄Π΅ Π³ΠΎΡΠΎΠ² Π΄Π° ΡΠ»ΡΡΠ° Π½Π° Π²ΡΠ½ΡΠ΅Π½ ΠΏΠΎΡΡ 3000. ΠΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° β ΡΠΎΠ²Π° Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°, ΠΊΠΎΡΡΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΡΡΠ°ΡΡΠΈΡΠ° Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠΊΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ° ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈ ΡΠΊΠ°Π·Π°Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°.

Π’ΠΎΠ²Π° Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π° docker-compose ΡΠ°ΠΉΠ». Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΠΏΠΎΠΊΠ°Π·Π²Π°ΠΌΠ΅ ΠΊΠ°ΠΊ ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π°Ρ Π΄Π²Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° β ΡΠ΅ΡΠ²ΠΈΠ·ΡΡ Π·Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΈ ΡΠ΅Π± ΡΠ΅ΡΠ²ΠΈΠ·ΡΡ. Π ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΠ»ΡΡΠ°ΠΈ Π½Π°ΡΠΈΡΠ΅ ΡΠ΅Π± ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ·ΠΈΡΠΊΠ²Π°Ρ Π·Π° backend ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠ΅ΡΠΎ Π΅ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ MySQL, ΠΏΡΠΈΠΌΠ΅ΡΡΡ Π΅ Ρ MySQL β Π½ΠΎ Π½ΠΈΡΠΎ Π½Π΅ ΠΏΡΠ΅ΡΠΈ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΄ΡΡΠ³Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ (PostgreSQL, Redis).
ΠΠ·Π΅ΠΌΠ°ΠΌΠ΅ ΠΎΠ±ΡΠ°Π· Π½Π° MySQL 5.7.14 ΠΎΡ ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΈΡ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π² Docker hub Π±Π΅Π· ΠΏΡΠΎΠΌΠ΅Π½ΠΈ. ΠΠ±ΡΠ°Π·ΡΡ, ΠΊΠΎΠΉΡΠΎ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π·Π° Π½Π°ΡΠ΅ΡΠΎ ΡΠ΅Π± ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΡΠ±ΠΈΡΠ°ΠΌΠ΅ ΠΎΡ ΡΠ΅ΠΊΡΡΠ°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ. ΠΡΠΈ ΠΏΡΡΠ²ΠΎΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΡΠΎΠΉ ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ ΠΎΠ±ΡΠ°Π·Π°. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠ°ΡΡΠΈΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°, ΠΊΠΎΡΡΠΎ ΡΡΠΊ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΠΌΠ΅. ΠΠΊΠΎ ΡΠ΅ Π²ΡΡΠ½Π΅ΠΌ Π½Π°Π·Π°Π΄, ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌ, ΡΠ΅ Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΡΡΠ΅Π· Puma. Puma Π΅ ΡΠ΅ΡΠ²ΠΈΠ·, Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Ruby. ΠΡΠ² Π²ΡΠΎΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ Ρ ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ²Π°ΠΌΠ΅. Π’Π°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½Π° Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ Π½Π°ΡΠΈΡΠ΅ Π½ΡΠΆΠ΄ΠΈ ΠΈΠ»ΠΈ Π·Π°Π΄Π°ΡΠΈ.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅ ΠΊΠ°ΠΊ Π΄Π° ΠΏΡΠΎΠ±ΠΈΠ΅ΠΌ ΠΏΠΎΡΡΠ° Π½Π° Π½Π°ΡΠ°ΡΠ° Ρ ΠΎΡΡ ΠΌΠ°ΡΠΈΠ½ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΎΡ 3000 Π½Π° 3000 ΠΏΠΎΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. Π’ΠΎΠ²Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° iptables ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ°, ΠΊΠΎΠΉΡΠΎ Π΅ Π·Π°Π»ΠΎΠΆΠ΅Π½ Π² Docker.
Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ ΠΌΠΎΠΆΠ΅ ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΏΡΠ΅Π΄ΠΈ Π΄Π° ΡΠ΅ ΠΎΠ±ΡΡΠ½Π΅ ΠΊΡΠΌ Π²ΡΠ΅ΠΊΠΈ Π΄ΠΎΡΡΡΠΏΠ΅Π½ IP Π°Π΄ΡΠ΅Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ 127.0.0.1 Π»ΠΎΠΊΠ°Π»Π΅Π½ ΠΈΠ»ΠΈ Π²ΡΠ½ΡΠ΅Π½ IP Π°Π΄ΡΠ΅Ρ Π½Π° ΠΌΠ°ΡΠΈΠ½Π°ΡΠ°.
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΡΡ ΡΠ΅Π΄ ΠΊΠ°Π·Π²Π°, ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡΡ web Π·Π°Π²ΠΈΡΠΈ ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° db. ΠΠΎΠ³Π°ΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° web, ΠΏΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π° docker-compose ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ. Π‘Π»Π΅Π΄ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ (Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΎΡΡ β ΡΠ»Π΅Π΄ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°! ΠΠΎΡΠΎΠ²Π½ΠΎΡΡΡΠ° Π½Π° ΠΠ Π½Π΅ ΡΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°) ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, Π½Π°ΡΠΈΡ backend.
Π’ΠΎΠ²Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΠΌ Π³ΡΠ΅ΡΠΊΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π½Π΅ Π΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π° ΠΈ ΡΠΏΠ΅ΡΡΡΠ²Π° ΡΠ΅ΡΡΡΡΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠΏΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°ΠΉΠΊΠΈ ΡΠ΅ΡΡΡΡΠΈ Π·Π° Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ.

ΠΠ°ΠΊΠ²ΠΎ Π½ΠΈ Π΄Π°Π²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ°. Π£ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°ΠΌΠ΅ Π²Π΅ΡΡΠΈΡΡΠ° Π½Π° MySQL Π·Π° Π²ΡΠΈΡΠΊΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ. Π’ΠΎΠ²Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΠΌ Π½ΡΠΊΠΎΠΈ Π³ΡΠ΅ΡΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ²ΡΡ ΠΏΡΠΈ ΡΠ°Π·Π»ΠΈΡΠΈΡ Π² Π²Π΅ΡΡΠΈΠΈΡΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΡΡ, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°, Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅. Π’ΠΎΠ²Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΏΠΎΡΠΎΡΠΈΠΌ ΠΎΠ±ΡΠΈ hostname Π·Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ, ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎ ΠΈΠΌΠ΅, ΠΏΠ°ΡΠΎΠ»Π°. ΠΡΠ΄Π°Π»Π΅ΡΠ°Π²Π°ΠΌΠ΅ ΡΠ΅ ΠΎΡ Π·ΠΎΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΠ°ΡΠΊ ΠΎΡ ΠΈΠΌΠ΅Π½Π° ΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΈ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ Π±ΡΡ Π° ΠΏΠΎ-ΡΠ°Π½ΠΎ.
ΠΠΌΠ°ΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΠΎ-ΠΎΠΏΡΠΈΠΌΠ°Π»Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π·Π° ΡΡΠ΅Π΄Π°ΡΠ° Π½Π° Development, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° ΠΎΡ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°ΡΠ°ΡΠ° ΡΠ΅. MySQL ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π΅ Π½Π°ΡΡΡΠΎΠ΅Π½ Π·Π° ΡΠ»Π°Π±ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΌΡ ΠΎΡ ΠΊΡΡΠΈΡΡΠ° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΈΡΠΊΠ°.

Docker ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ Python, Ruby, NodeJS, PHP Π² Π½ΡΠΆΠ½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ. ΠΡΠΏΠ°Π΄Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ Π½Π° Π²Π΅ΡΡΠΈΠΈ. ΠΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅ rpm ΠΏΠ°ΠΊΠ΅Ρ Π·Π° Ruby, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΡΠ΅ ΡΠΌΡΠ½Π° Π½Π° Π²Π΅ΡΡΠΈΡΡΠ° Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π½Π° Docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΏΠ»Π°Π²Π½ΠΎ ΠΌΠΈΠ³ΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ΄Π° ΠΈ Π³ΠΎ Π²Π΅ΡΡΠΈΠΎΠ½ΠΈΡΠ°ΠΌΠ΅ Π·Π°Π΅Π΄Π½ΠΎ ΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅. ΠΡΠΌΠ°ΠΌΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ Π²Π΅ΡΡΠΈΡΡΠ° Π½Π° ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ° ΠΈ ΠΊΠΎΠ΄Π°. ΠΠ° ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° Π²Π΅ΡΡΠΈΡΡΠ° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ²Π°Π»ΠΈΠΌ ΡΡΠ°ΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΈ Π΄Π° ΠΏΡΡΠ½Π΅ΠΌ Π½ΠΎΠ²ΠΈΡ. ΠΠΊΠΎ Π½Π΅ΡΠΎ Π½Π΅ Π²ΡΡΠ²ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ²Π°Π»ΠΈΠΌ Π½ΠΎΠ²ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΈ Π΄Π° ΠΏΡΡΠ½Π΅ΠΌ ΡΡΠ°ΡΠΈΡ.
Π‘Π»Π΅Π΄ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΠΎΠ±ΡΠ°Π·Π°, ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅ ΠΊΠ°ΠΊΡΠΎ Π² Development, ΡΠ°ΠΊΠ° ΠΈ Π² Production ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ. Π’ΠΎΠ²Π° Π΅ ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π°ΠΊΡΡΠ°Π»Π½ΠΎ Π·Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΠΈ.
ΠΠ° ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ JavaScript ΠΈ NodeJS.
Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΡ Π½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ Π΅ Π½Π° ReactJS. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ ΡΡΠ°ΡΡΠΈΡΠ° Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ hot-reload.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠ°ΡΡΠΈΡΠ° Π·Π°Π΄Π°ΡΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° JavaScript ΠΈ ΠΊΠΎΠ΄ΡΡ, ΡΡΠ±ΡΠ°Π½ Π² ΡΡΠ°ΡΠΈΠΊΠ°ΡΠ°, ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΡΡΠ΅Π· nginx, ΡΠΏΠ΅ΡΡΡΠ²Π°ΠΉΠΊΠΈ ΡΠ΅ΡΡΡΡΠΈ.

Π’ΡΠΊ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠΌ ΡΡ Π΅ΠΌΠ°ΡΠ° Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ Π½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ.
ΠΠ°ΠΊΠ²ΠΈ Π·Π°Π΄Π°ΡΠΈ ΡΠ΅ΡΠ°Π²Π°Ρ ΠΌΠ΅? ΠΠ·ΠΏΡΠ°Π²ΠΈΡ ΠΌΠ΅ ΡΠ΅ ΠΏΡΠ΅Π΄ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΠΌ ΡΠΈΡΡΠ΅ΠΌΠ°, Ρ ΠΊΠΎΡΡΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°Ρ ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π°. Π’Π΅ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Ρ Π΄Π°Π½Π½ΠΈ. ΠΠ΄Π½Π° ΠΎΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π΅ Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠΈΠΌ push ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎ.
ΠΠ°ΠΊΠ²ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡ ΠΌΠ΅ Π·Π° ΡΠΎΠ²Π°?
Π Π°Π·Π΄Π΅Π»ΠΈΡ ΠΌΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ°ΠΊΠΈΠ²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΠΊΠ°ΡΠΎ: Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΡΠΊΠ° ΡΠ°ΡΡ Π½Π° JS, Π±Π΅ΠΊΠ΅Π½Π΄, ΠΊΠΎΠΉΡΠΎ ΡΠ°Π±ΠΎΡΠΈ ΡΡΠ΅Π· REST ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΏΠΎΠ΄ Ruby on Rails. ΠΠ΅ΠΊΠ΅Π½Π΄ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π° Ρ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ. Π Π΅Π·ΡΠ»ΡΠ°ΡΡΡ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°, ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠ΄ΠΌΠΈΠ½ ΠΏΠ°Π½Π΅Π»ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π° Ρ Π±Π΅ΠΊΠ΅Π½Π΄Π° ΠΈ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΏΠΎ REST ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΈΠΌΠ°Ρ ΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°ΠΌΠ΅ Push ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ. ΠΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π° ΠΈΠΌΠ°Ρ ΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡ, Π² ΠΊΠΎΠΉΡΠΎ Π±Π΅ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ, ΠΊΠΎΠΉΡΠΎ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π·Π° Π΄ΠΎΡΡΠ°Π²ΠΊΠ°ΡΠ° Π½Π° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π΄ΠΎ ΠΌΠΎΠ±ΠΈΠ»Π½ΠΈΡΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ.
Π Π°Π·ΡΠ°Π±ΠΎΡΠΈΡ ΠΌΠ΅ ΡΠ°ΠΊΠ°Π²Π° ΡΡ Π΅ΠΌΠ°: ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡΡ ΠΎΡ Π±ΡΠ°ΡΠ·ΡΡΠ° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π° Ρ Π°Π΄ΠΌΠΈΠ½ ΠΏΠ°Π½Π΅Π»Π°, Π°Π΄ΠΌΠΈΠ½ ΠΏΠ°Π½Π΅Π»ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π° Ρ Π±Π΅ΠΊΠ΅Π½Π΄Π°, ΠΏΠΎΡΡΠ°Π²Ρ ΡΠ΅ Π·Π°Π΄Π°ΡΠ° Π·Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° Push ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ.
Push ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡΡΠ° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°Ρ Ρ Π΄ΡΡΠ³ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ Π½Π° NodeJS.
ΠΠΏΠ°ΡΠΊΠΈΡΠ΅ ΡΠ΅ ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Ρ ΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ°Ρ ΠΏΠΎ ΡΠ²ΠΎΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ.
Π’ΡΠΊ ΡΠ° ΠΈΠ·ΡΠΈΡΡΠ²Π°Π½ΠΈ Π΄Π²Π΅ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ. Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ 2 Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΡΡΠ΅Π· Docker, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π³ΠΈ ΡΠ²ΡΡΠ·Π²Π°, Π΅ ΠΎΠ±ΡΠ°ΡΠ° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΡΠ΅ΠΆΠ°, Π° ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°.

Π‘ΡΡΠΎΡΠΎ, Π½ΠΎ Π² ΡΠΈΡΡΠΈ. ΠΠ°ΠΆΠ½ΠΎ Π΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π°.
ΠΠΊΠΎ Π΄ΠΎ ΡΠ΅Π³Π° Π³ΠΎΠ²ΠΎΡΠ΅Ρ ΠΌΠ΅ Π·Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π° ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, Π² ΡΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π°ΡΠΈΡΡ ΡΠ΅ΡΠ²ΠΈΡ, ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ΅Π½ Π·Π° Push ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡΡΠ°, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠ»Π½ΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌ ΡΡΡΠ²ΡΡ. Π’ΠΎΠΉ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ API ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π° Ρ Π½ΠΎΠ²Π°ΡΠ° Π½ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°.
ΠΠΎ ΡΠΎΠ²Π° Π²ΡΠ΅ΠΌΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅ 4 Π²Π΅ΡΡΠΈΡ Π½Π° NodeJS. Π‘Π΅Π³Π° (ΠΏΡΠ΅Π· 2017 Π³ΠΎΠ΄ΠΈΠ½Π° β Π·Π°Π±Π΅Π»Π΅ΠΆΠΊΠ° Π½Π° ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ°) Π² Π½ΠΎΠ²ΠΈΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ 7 Π²Π΅ΡΡΠΈΡ Π½Π° NodeJS. ΠΡΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π½ΠΎΠ²ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΡΠ΅ Π² Π½ΠΎΠ²ΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ.
ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³ ΠΈ Π΄Π° ΡΠ²Π΅Π»ΠΈΡΠΈΠΌ Π²Π΅ΡΡΠΈΡΡΠ° Π½Π° NodeJS Π·Π° ΡΠ΅ΡΠ²ΠΈΡΠ° Π·Π° Push ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ.
Π Π°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ ΠΏΠΎ API, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π³ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π² Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠΌΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π»ΠΈ ΠΏΡΠ΅Π΄ΠΈ.

ΠΠ°ΠΊΠ²ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, Π·Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Docker? ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ Π² Π½Π°ΡΠΈΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Dockerfile, ΠΊΠΎΠΉΡΠΎ ΠΎΠΏΠΈΡΠ²Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ. Π ΡΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ ΡΠ° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ. Π’ΠΎΠ²Π° Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈΡΡ Π½Π°Π±ΠΎΡ Π·Π° backend-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ.
ΠΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ² ΠΏΡΠΎΠ΅ΠΊΡ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ Dockerfile, ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°ΡΠ° Π΅ΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ° (Python, Ruby, NodeJS). Π docker-compose ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°ΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ β Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. ΠΠΏΠΈΡΠ²Π°ΠΌΠ΅, ΡΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π±Π°Π·Π° ΠΎΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Π²Π΅ΡΡΠΈΡ, ΠΈ ΡΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ Π² Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΡΠ΄Π΅Π»Π΅Π½ ΡΡΠ΅ΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Ρ nginx Π·Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΡΠ΅Π΄Π²ΠΈΠ΄Π΅Π½Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΠΊΠ°ΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ. Backend ΠΈΠ·ΠΏΡΠ°ΡΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΡΠ° Π² ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ, ΠΊΠΎΡΡΠΎ ΡΡΡΠΎ Π΅ ΠΌΠΎΠ½ΡΠΈΡΠ°Π½Π° Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Ρ nginx, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΡΡΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
ΠΠ° Π΄Π° ΡΡΡ ΡΠ°Π½ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° nginx ΠΈ mysql, Π΄ΠΎΠ±Π°Π²ΠΈΡ ΠΌΠ΅ ΠΏΠ°ΠΏΠΊΠ° Docker, Π² ΠΊΠΎΡΡΠΎ ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ. ΠΠΎΠ³Π°ΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ Π½Π°ΠΏΡΠ°Π²ΠΈ git clone Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π½Π° ΡΠ²ΠΎΡ ΠΊΠΎΠΌΠΏΡΡΡΡ, ΡΠΎΠΉ ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΏΡΠΎΠ΅ΠΊΡ, Π³ΠΎΡΠΎΠ² Π·Π° Π»ΠΎΠΊΠ°Π»Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°. ΠΠ΅ Π²ΡΠ·Π½ΠΈΠΊΠ²Π° Π²ΡΠΏΡΠΎΡ ΠΊΠ°ΠΊΡΠ² ΠΏΠΎΡΡ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠ²ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π΄Π° ΠΏΡΠΈΠ»Π°Π³Π°.

Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°: Π°Π΄ΠΌΠΈΠ½, ΠΈΠ½ΡΠΎΡΠΌ-API, push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ.
ΠΠ° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π°, ΡΡΠ·Π΄Π°Π΄ΠΎΡ ΠΌΠ΅ ΠΎΡΠ΅ Π΅Π΄Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΠΊΠΎΠ΅ΡΠΎ Π½Π°ΡΠ΅ΠΊΠΎΡ ΠΌΠ΅ dockerized-app. Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ. Π’Π΅ ΠΏΡΠΎΡΡΠΎ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π°Ρ β Π² GitLab ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°ΡΠΎ ΠΏΠ°ΠΏΠΊΠ°, Π° Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Π΅ ΠΏΠ°ΠΏΠΊΠ° Π·Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ. ΠΠ° ΠΏΠΎ-Π½ΠΈΡΠΊΠΎ Π½ΠΈΠ²ΠΎ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°Ρ.

Π’ΠΎΠ²Π° Π΅ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° dockerized-app. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΈΠ·Π½Π°ΡΡΠΌΠ΅ ΡΡΠΊ Docker Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ, Π² ΠΊΠΎΡΡΠΎ ΠΏΠΎΠΏΡΠ»Π²Π°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈ Π·Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ. ΠΠΌΠ° README.md, Π² ΠΊΠΎΠΉΡΠΎ Π½Π°ΠΊΡΠ°ΡΠΊΠΎ Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ ΠΊΠ°ΠΊ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
Π’ΡΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠΈΡ ΠΌΠ΅ Π΄Π²Π° docker-compose ΡΠ°ΠΉΠ»Π°. Π’ΠΎΠ²Π° Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ, Π·Π° Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π½Π° Π΅ΡΠ°ΠΏΠΈ. ΠΠΎΠ³Π°ΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ ΡΠ°Π±ΠΎΡΠΈ Ρ ΡΠ΄ΡΠΎΡΠΎ ΠΈ Π½Π΅ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ ΠΎΡ Push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ, ΡΠΎΠΉ ΠΏΡΠΎΡΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ° docker-compose ΡΠ°ΠΉΠ»Π° ΠΈ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ ΡΠΏΠ΅ΡΡΡΠ²Π° ΡΠ΅ΡΡΡΡΠΈ.
ΠΠΊΠΎ ΠΈΠΌΠ° Π½ΡΠΆΠ΄Π° ΠΎΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ, ΡΠΎΠ³Π°Π²Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° docker-compose.yaml ΠΈ docker-compose-push.yaml.
Π’ΡΠΉ ΠΊΠ°ΡΠΎ docker-compose.yaml ΠΈ docker-compose-push.yaml ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°Ρ Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ°, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° Π΅Π΄ΠΈΠ½Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΡΠ΅ΠΆΠ°.

ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅. Π’ΠΎΠ²Π° Π΅ ΠΏΠΎ-ΠΎΠ±ΡΠΈΡΠ΅Π½ ΡΠ°ΠΉΠ», ΠΊΠΎΠΉΡΠΎ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π·Π° ΡΠ±ΠΎΡ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅. ΠΠ°ΠΊΠ²ΠΎ Π΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΡΠ΅Π»Π½ΠΎΡΠΎ ΡΡΠΊ? ΠΡΠ²Π΅Π΄ΠΎΡ ΠΌΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π·Π° Π±Π°Π»Π°Π½ΡΠΈΡΠ°Π½Π΅.
Π’ΠΎΠ²Π° Π΅ Π³ΠΎΡΠΎΠ² Docker ΠΎΠ±ΡΠ°Π·, Π² ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° nginx ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ ΡΠ»ΡΡΠ° Docker ΡΠΎΠΊΠ΅Ρ. ΠΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ, Ρ Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ΡΠΎ ΠΈ ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° nginx. ΠΠ±ΡΠ°ΡΠ΅Π½ΠΈΡΡΠ° Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΡΠΌΠ΅ ΠΏΠΎ Π΄ΠΎΠΌΠ΅ΠΉΠ½ ΠΈΠΌΠ΅Π½Π° ΡΡΠ΅ΡΠΎ Π½ΠΈΠ²ΠΎ.
ΠΠ° Development ΡΡΠ΅Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π΄ΠΎΠΌΠ΅ΠΉΠ½ .dev β api.informer.dev. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Ρ Π΄ΠΎΠΌΠ΅ΠΉΠ½ .dev Π΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈΡΠ΅ ΡΠ΅ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΡ Π΄ΠΎ Π²ΡΠ΅ΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°Ρ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.

ΠΠΊΠΎ Π³ΡΠ°ΡΠΈΡΠ½ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°Π·ΠΈΠΌ, ΠΊΠ»ΠΈΠ΅Π½ΡΡΡ Π΅ Π½Π°ΡΠΈΡΡ Π±ΡΠ°ΡΠ·ΡΡ ΠΈΠ»ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, Ρ ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ°Π²ΠΈΠΌ Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ Π±Π°Π»Π°Π½ΡΠΈΡΠ°ΡΠΈΡ ΡΡΡΠ²ΡΡ.
ΠΠ°Π»Π°Π½ΡΠΈΡΠ°ΡΠΈΡΡ ΡΡΡΠ²ΡΡ ΠΏΠΎ Π΄ΠΎΠΌΠ΅ΠΉΠ½ ΠΈΠΌΠ΅ΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΊΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ·Π²ΠΈΠΊΠ°Π½.
Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ nginx, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ JS Π°Π΄ΠΌΠΈΠ½ΡΠΊΠΈΡ ΠΏΠ°Π½Π΅Π». ΠΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ nginx, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ API ΠΈΠ»ΠΈ ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ nginx ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ.
ΠΠ° ΡΡ Π΅ΠΌΠ°ΡΠ° Π΅ Π²ΠΈΠ΄Π½ΠΎ, ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅ ΡΠ° ΡΠ²ΡΡΠ·Π°Π½ΠΈ Π² Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΡΠ΅ΠΆΠ° ΠΈ ΡΠ° ΡΠΊΡΠΈΡΠΈ Π·Π°Π΄ ΠΏΡΠΎΠΊΡΠΈ.
ΠΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΊΠ°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΏΠΎΠ·Π½Π°Π²Π°ΠΉΠΊΠΈ IP Π°Π΄ΡΠ΅ΡΠ°, Π½ΠΎ Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ Π½Π΅ Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅. ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½ΡΠΌΠ° Π½ΡΠΆΠ΄Π° ΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ.

ΠΠ°ΠΊΡΠ² ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠΎΠ³Π° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌ, Π·Π° Π΄Π° Π΄ΠΎΠΊΠ΅ΡΠΈΠ·ΠΈΡΠ°ΠΌ ΡΠ²ΠΎΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅? ΠΠ° ΠΌΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅, Π΄ΠΎΠ±ΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Π΅ ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΈΡΡ Docker ΠΎΠ±ΡΠ°Π· Π·Π° MySQL.
Π’ΠΎΠΉ Π΅ Π΄ΠΎΡΡΠ° ΡΠ»ΠΎΠΆΠ΅Π½. ΠΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²Π΅ΡΡΠΈΠΈ. ΠΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΡΠ° ΠΌΡ ΠΏΠΎΠΊΡΠΈΠ²Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Ρ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΡΠ½Π°ΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°. ΠΠΊΠΎ ΠΎΡΠ΄Π΅Π»ΠΈΡΠ΅ Π²ΡΠ΅ΠΌΠ΅ ΠΈ ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΠΊΠ°ΠΊ Π²ΡΠΈΡΠΊΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°, Π½Π΅ Π±ΠΈ ΡΡΡΠ±Π²Π°Π»ΠΎ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ.
Π hub.docker.com ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΏΡΠΈΡΡΡΡΠ²Π°Ρ Π²ΡΡΠ·ΠΊΠΈ ΠΊΡΠΌ github.com, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈ ΡΡΡΠΎΠ²ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΠΌΠΈ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΎΠ±ΡΠ°Π·.
Π ΡΠΎΠ²Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΈΠΌΠ° ΡΠΊΡΠΈΠΏΡ docker-endpoint.sh, ΠΊΠΎΠΉΡΠΎ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π·Π° ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½Π°ΡΠ° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ Π·Π° ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΡΠ½Π°ΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
Π ΡΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΡΠΎ ΠΈΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ ΡΡΠ΅Π· ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΠΎΠΊΠΎΠ»Π½Π°ΡΠ° ΡΡΠ΅Π΄Π°. ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠΉΠΊΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΎΡΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡΠ΅Π½ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΈΠ»ΠΈ ΡΡΠ΅Π· docker-compose, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅, ΡΠ΅ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ ΠΏΡΠ°Π·Π½Π° ΠΏΠ°ΡΠΎΠ»Π° Π·Π° root Π² MySQL ΠΈΠ»ΠΈ Π΄ΡΡΠ³Π°, ΠΊΠΎΡΡΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΠΌΠ΅.
ΠΠΌΠ° Π²Π°ΡΠΈΠ°Π½Ρ Π΄Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½Π° ΠΏΠ°ΡΠΎΠ»Π°. ΠΠ°Π·Π²Π°ΠΌΠ΅, ΡΠ΅ Π½ΠΈ ΡΡΡΠ±Π²Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π», ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ ΠΏΠ°ΡΠΎΠ»Π° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ.
Π ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅ ΡΠΈ ΠΌΠ°Π»ΠΊΠΎ ΡΠ΅Π΄Π½Π°ΠΊΠ²ΠΈΡ ΠΌΠ΅ Dockerfile, ΠΊΠΎΠΉΡΠΎ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π·Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ°. ΠΠ°ΡΡΡΠΎΠΈΡ ΠΌΠ΅ Π³ΠΎ ΡΠΏΠΎΡΠ΅Π΄ Π½Π°ΡΠΈΡΠ΅ Π½ΡΠΆΠ΄ΠΈ, Π·Π° Π΄Π° ΡΠ°Π·ΡΠΈΡΠΈΠΌ ΠΏΡΠ°Π²Π°ΡΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°. Π’ΠΎΠ²Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. Π Ruby ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° ΠΈΠΌΠ° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅, ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Π½Π΅ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅ Π½Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ.

Π’ΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° Π²Π΅ΡΡΠΈΡ Π½Π° MySQL Π½Π° github.com. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΡΠ²ΠΎΡΠΈΡΠ΅ Dockerfile ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΊΠ°ΠΊ ΡΡΠ°Π²Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ΡΠΎ.
docker-endpoint.sh Π΅ ΡΠΊΡΠΈΠΏΡΡΡ, ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡ Π·Π° ΡΠΎΡΠΊΠ°ΡΠ° Π½Π° Π΄ΠΎΡΡΡΠΏ. ΠΡΠΈ ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½Π°ΡΠ° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΠΈΡΠ΅Π»Π½ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΈ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ° ΠΈΠ·Π½Π΅ΡΠ΅Π½ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² ΡΠΊΡΠΈΠΏΡΠ° Π·Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ.

ΠΡΠ΅ΠΌΠΈΠ½Π°Π²Π°ΠΌΠ΅ ΠΊΡΠΌ Π²ΡΠΎΡΠ°ΡΠ° ΡΠ°ΡΡ.
ΠΠ° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Ρ ΠΌΠ΅ Π½Π° gitlab. Π’ΠΎΠ²Π° Π΅ Π΄ΠΎΡΡΠ° ΠΌΠΎΡΠ½Π° ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΊΠΎΡΡΠΎ ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π° Ρ Π²ΠΈΠ·ΡΠ°Π»Π΅Π½ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
ΠΠ΄ΠΈΠ½ ΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ Π½Π° Gitlab Π΅ Gitlab CI. Π’ΠΎΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΎΠΏΠΈΡΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° Π΄ΠΎΡΡΠ°Π²ΠΊΠ° Π½Π° ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅.
ΠΠΎΠΊΠ»Π°Π΄ Π·Π° Gitlab CI 2 β Π΄ΠΎΠΊΠ»Π°Π΄ ΠΎΡ Ruby Russia club β Π΄ΠΎΡΡΠ° ΠΏΠΎΠ΄ΡΠΎΠ±Π΅Π½ ΠΈ Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΡΠ΅ Π²ΠΈ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°.

Π‘Π΅Π³Π° ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, Π·Π° Π΄Π° Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅ Gitlab CI. ΠΠ° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Gitlab CI, Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π΅Π΄ΠΈΠ½ ΡΠ°ΠΉΠ» .gitlab-ci.yml Π² ΠΊΠΎΡΠ΅Π½Π° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
Π’ΡΠΊ ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΠΌΠ΅ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΎΡ ΡΡΡΡΠΎΡΠ½ΠΈΡ ΠΊΠ°ΡΠΎ ΡΠ΅ΡΡΠΎΠ²Π΅ ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ.
ΠΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΠΌΠ΅ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Ρ docker-compose Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’ΠΎΠ²Π° Π΅ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΎΡΠ½ΠΎ Π·Π° backend.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΊΠ°Π·Π²Π°ΠΌΠ΅, ΡΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈΡΠ΅ Π·Π° ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΈ Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΠΌ ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅.
ΠΠΊΠΎ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΎ ΠΈ Π½Π΅ Π²ΡΡΡΠ°Ρ ΠΊΠΎΠ΄ Π·Π° Π³ΡΠ΅ΡΠΊΠ°, ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΊΡΠΌ Π²ΡΠΎΡΠ°ΡΠ° ΡΠ°Π·Π° Π½Π° Π΄Π΅ΠΏΠ»ΠΎΡ.
Π€Π°Π·Π°ΡΠ° Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° Π·Π° staging. ΠΠΈΠ΅ Π½Π΅ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Ρ ΠΌΠ΅ Π±Π΅Π·ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅Π½ ΡΠ΅ΡΡΠ°ΡΡ.
ΠΠΈΠ΅ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»Π½ΠΎ ΡΠΏΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°Ρ ΠΎΡΠ½ΠΎΠ²ΠΎ, ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ΠΈ Π½Π° ΠΏΡΡΠ²ΠΈΡ Π΅ΡΠ°ΠΏ ΠΏΡΠΈ ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ.
ΠΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΠΌΠ΅ Π²Π΅ΡΠ΅ Π·Π° ΡΠ΅ΠΊΡΡΠ°ΡΠ° ΡΡΠ΅Π΄Π° ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈΡΠ΅ Π½Π° Π±Π°Π·ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ ΠΎΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅.
ΠΠΌΠ° Π·Π°Π±Π΅Π»Π΅ΠΆΠΊΠ°, ΡΠ΅ ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΡΠ°ΠΌΠΎ Π·Π° ΠΊΠ»ΠΎΠ½ master.
ΠΡΠΈ ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° Π΄ΡΡΠ³ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°.
ΠΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΡ ΠΏΠΎ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅.

ΠΠ° Π΄Π° Π³ΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΠΊ, ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Gitlab Runner.
Π’Π°Π·ΠΈ ΡΡΠΈΠ»ΠΈΡΠ° Π΅ Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° Golang. Π’Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° Π΅Π΄ΠΈΠ½Π΅Π½ ΡΠ°ΠΉΠ», ΠΊΠ°ΠΊΡΠΎ Π΅ ΠΏΡΠΈΠ΅ΡΠΎ Π² ΡΠ²Π΅ΡΠ° Π½Π° Golang, Π±Π΅Π· Π½ΡΠΆΠ΄Π° ΠΎΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ.
ΠΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΌΠ΅ Gitlab Runner.
ΠΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΊΠ»ΡΡ Π² ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π½Π° Gitlab.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π° ΠΈΠ½ΠΈΡΠΈΠΈΡΠ°Π½Π΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈΡ ΡΠ΅Π΄.
ΠΠ°ΡΡΡΠΎΠΉΠ²Π°ΠΌΠ΅ Gitlab Runner Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ² ΡΠ΅ΠΆΠΈΠΌ (Shell, Docker, VirtualBox, SSH)
ΠΠΎΠ΄ΡΡ Π½Π° Gitlab Runner ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΏΡΠΈ Π²ΡΡΠΊΠΎ ΠΊΠΎΠΌΠΈΡΠΈΡΠ°Π½Π΅ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° .gitlab-ci.yml.

ΠΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π²ΠΈΠ·ΡΠ°Π»Π½ΠΎ Π² Gitlab Π² ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠ²ΡΡΠΆΠ΅ΠΌ Gitlab CI, ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΠ»Π°Π³, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π° Π² ΠΊΠ°ΠΊΠ²ΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π΅ Π±ΠΈΠ»Π΄ΡΡ Π² ΡΠ΅ΠΊΡΡΠΈΡ ΠΌΠΎΠΌΠ΅Π½Ρ.
ΠΠΈΠ΄ΠΈΠΌ, ΡΠ΅ ΠΏΡΠ΅Π΄ΠΈ 4 ΠΌΠΈΠ½ΡΡΠΈ Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ ΠΊΠΎΠΌΠΈΡ, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π» Π²ΡΠΈΡΠΊΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅ ΠΈ Π½Π΅ Π΅ ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ°Π» ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ.

ΠΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π±ΠΈΠ»Π΄ΠΎΠ²Π΅ΡΠ΅. Π’ΡΠΊ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, ΡΠ΅ Π²Π΅ΡΠ΅ ΡΠ° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π»ΠΈ Π΄Π²Π° ΡΡΡΡΠΎΡΠ½ΠΈΡ. Π‘ΡΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅ ΠΈ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° Π΄Π΅ΠΏΠ»ΠΎΠΉ Π½Π° staging.
ΠΠΊΠΎ ΠΊΠ»ΠΈΠΊΠ½Π΅ΠΌ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ Π±ΠΈΠ»Π΄, ΡΠ°ΠΌ ΡΠ΅ ΠΈΠΌΠ° ΠΊΠΎΠ½Π·ΠΎΠ»Π½ΠΈΡ ΠΈΠ·Ρ ΠΎΠ΄ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π±ΠΈΠ»ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΈ Π² ΠΏΡΠΎΡΠ΅ΡΠ° ΡΡΠ³Π»Π°ΡΠ½ΠΎ .gitlab-ci.yml.

Π’Π°ΠΊΠ° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΈΡΡΠΎΡΠΈΡΡΠ° Π½Π° Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΄ΡΠΊΡ. ΠΠΈΠΆΠ΄Π°ΠΌΠ΅, ΡΠ΅ ΠΈΠΌΠ° ΡΡΠΏΠ΅ΡΠ½ΠΈ ΠΎΠΏΠΈΡΠΈ. ΠΠΎΠ³Π°ΡΠΎ ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅ ΡΠ΅ ΠΏΡΠΎΠ²Π°Π»ΡΡ, ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΡΡΠΏΠΊΠ° Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΈ ΠΊΠΎΠ΄ΡΡ Π½Π° staging Π½Π΅ ΡΠ΅ ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°.

ΠΠ°ΠΊΠ²ΠΈ Π·Π°Π΄Π°ΡΠΈ ΡΠ΅ΡΠ°Π²Π°Ρ ΠΌΠ΅ Π½Π° staging, ΠΊΠΎΠ³Π°ΡΠΎ Π²Π½Π΅Π΄ΡΠΈΡ ΠΌΠ΅ docker? ΠΠ°ΡΠ°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ΅ ΡΡΡΡΠΎΠΈ ΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΠΈ ΠΈΠΌΠ°ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ Π΄Π° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ ΡΠ°ΡΡΡΠ° ΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ Π±ΡΡ Π° ΠΎΠ±Π½ΠΎΠ²Π΅Π½ΠΈ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ, Π° Π½Π΅ ΡΡΠ»Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°.
ΠΠ° ΡΠΎΠ²Π° Π½ΠΈ ΡΠ΅ Π½Π°Π»ΠΎΠΆΠΈ Π΄Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ Π²ΡΠΈΡΠΊΠΎ Π² ΠΎΡΠ΄Π΅Π»Π½ΠΈ ΠΏΠ°ΠΏΠΊΠΈ.
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡ ΠΌΠ΅ ΡΠΎΠ²Π°, ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ Docker-compose, ΠΊΠΎΠΉΡΠΎ ΡΡΠ·Π΄Π°Π²Π° ΡΠ²ΠΎΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΎ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Π·Π° Π²ΡΡΠΊΠ° ΠΏΠ°ΠΏΠΊΠ° ΠΈ Π½Π΅ Π²ΠΈΠΆΠ΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ Π½Π° ΡΡΡΠ΅Π΄Π°.
ΠΠ° Π΄Π° Π·Π°ΠΎΠ±ΠΈΠΊΠΎΠ»ΠΈΠΌ ΡΠΎΠ²Π°, ΡΡΠ·Π΄Π°Π΄ΠΎΡ ΠΌΠ΅ ΠΌΡΠ΅ΠΆΠ° Π² Docker ΡΡΡΠ½ΠΎ. Π Docker-compose Π½Π°ΠΏΠΈΡΠ°Ρ ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ°ΠΊΠ°Π²Π° ΠΌΡΠ΅ΠΆΠ°.
ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π²ΡΠ΅ΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΠΊΠΎΠΉΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ° Ρ ΡΠ°Π·ΠΈ ΠΌΡΠ΅ΠΆΠ°, Π²ΠΈΠΆΠ΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ Π² Π΄ΡΡΠ³ΠΈΡΠ΅ ΡΠ°ΡΡΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°.
Π‘Π»Π΅Π΄Π²Π°ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π΅ ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π΅ΡΠΎ Π½Π° staging ΠΌΠ΅ΠΆΠ΄Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π·Π° Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π²ΡΠΈΡΠΊΠΎ ΠΊΡΠ°ΡΠΈΠ²ΠΎ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΎ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΎ Π΄ΠΎ production, Π΅ Π΄ΠΎΠ±ΡΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠΎΡΡ 80 ΠΈΠ»ΠΈ 443, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π½Π°Π²ΡΡΠΊΡΠ΄Π΅ Π² WEB.

ΠΠ°ΠΊ ΡΠ΅ΡΠΈΡ ΠΌΠ΅ ΡΠΎΠ²Π°? ΠΠ°Π·Π½Π°ΡΠΈΡ ΠΌΠ΅ Π΅Π΄ΠΈΠ½ Gitlab Runner Π½Π° Π²ΡΠΈΡΠΊΠΈ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ.
Gitlab ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Gitlab Runner, ΠΊΠΎΠΈΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎ ΡΠ΅Π΄ΠΈΡΠ° Π² Ρ Π°ΠΎΡΠΈΡΠ΅Π½ ΡΠ΅Π΄ Π²Π·ΠΈΠΌΠ°Ρ Π²ΡΠΈΡΠΊΠΈ Π·Π°Π΄Π°ΡΠΈ ΠΈ Π³ΠΈ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ.
ΠΠ° Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΠΌ Ρ Π°ΠΎΡ, ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡ ΠΌΠ΅ Π³ΡΡΠΏΠ°ΡΠ° Π½Π° Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π΄ΠΎ Π΅Π΄ΠΈΠ½ Gitlab Runner, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΈ Π½Π°ΡΠΈΡΠ΅ ΠΎΠ±Π΅ΠΌΠΈ ΡΠΏΡΠ°Π²Ρ Π±Π΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ.
ΠΠ·Π½Π΅ΡΠΎΡ ΠΌΠ΅ nginx-proxy Π² ΠΎΡΠ΄Π΅Π»Π΅Π½ ΡΡΠ°ΡΡΠΈΡΠ°Ρ ΡΠΊΡΠΈΠΏΡ ΠΈ Π² Π½Π΅Π³ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ ΠΌΠ΅ ΠΌΡΠ΅ΠΆΠΈΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ.
ΠΠ°ΡΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈΠΌΠ° Π΅Π΄Π½Π° ΠΌΡΠ΅ΠΆΠ°, Π° Π±Π°Π»Π°Π½ΡΠ΅ΡΡΡ ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΡΠ΅ΠΆΠΈ ΠΏΠΎ ΠΈΠΌΠ΅Π½Π° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ. Π’ΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠΎΠΊΡΠΈΡΠ²Π° Π½Π°ΡΠ°ΡΡΠΊ ΠΏΠΎ Π΄ΠΎΠΌΠ΅ΠΉΠ½ΠΈ.
ΠΠ°ΠΏΠΈΡΠ²Π°Π½ΠΈΡΡΠ° ΠΈΠ΄Π²Π°Ρ ΠΏΠΎ Π΄ΠΎΠΌΠ΅ΠΉΠ½ Π½Π° ΠΏΠΎΡΡ 80 ΠΈ ΡΠ΅ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΡΡ Π² Π³ΡΡΠΏΠ° ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΎΠ±ΡΠ»ΡΠΆΠ²Π°Ρ ΡΠΎΠ·ΠΈ Π΄ΠΎΠΌΠ΅ΠΉΠ½.

ΠΠ°ΠΊΠ²ΠΈ Π±ΡΡ Π° ΠΎΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅? Π’ΠΎΠ²Π° Π΅, ΡΠ΅ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΡΠ°Π±ΠΎΡΡΡ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ root. Π’ΠΎΠ·ΠΈ root Π½Π΅ Π΅ ΡΠ°Π²Π΅Π½ Π½Π° root Π½Π° Ρ ΠΎΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°.
ΠΠΊΠΎ Π²Π»Π΅Π·Π΅ΡΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΡΠ΅ Π±ΡΠ΄Π΅ΡΠ΅ root ΠΈ ΡΠ°ΠΉΠ»ΡΡ, ΠΊΠΎΠΉΡΠΎ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π² ΡΠΎΠ·ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΏΡΠ°Π²Π° root.
ΠΠΊΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ Π΅ Π²Π»Π΅Π·ΡΠ» Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΈ Π΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠ» ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΠΊΠΎΠΈΡΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΅ ΠΈΠ·Π»ΡΠ·ΡΠ» ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, Π² Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΠΎΡΡΠ°Π²Π° ΡΠ°ΠΉΠ», Π΄ΠΎ ΠΊΠΎΠΉΡΠΎ Π½ΡΠΌΠ° Π΄ΠΎΡΡΡΠΏ.
ΠΠ°ΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ΅ΡΠΈ ΡΠΎΠ²Π°? ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°.
ΠΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Ρ Π°, ΠΊΠΎΠ³Π°ΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ ΠΌΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»?
ΠΠΎΠ³Π°ΡΠΎ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π», ΡΠ΅ΡΡΠΎ ID Π½Π° Π³ΡΡΠΏΠ°ΡΠ° (UID) ΠΈ ID Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ (GID) Π½Π΅ ΡΡΠ²ΠΏΠ°Π΄Π°Ρ.
ΠΠ° Π΄Π° ΡΠ΅ΡΠΈΠΌ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ Ρ ID 1000.
Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΡΠΎΠ²Π° ΡΡΠ²ΠΏΠ°Π΄Π½Π° Ρ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠΈΡΠΊΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΠ‘ Ubuntu. ΠΡΡΠ²ΠΈΡΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» Π² ΠΠ‘ Ubuntu ΠΈΠΌΠ° ID 1000.

ΠΠ°ΠΊΠ²ΠΈ ΡΠ° Π½Π°ΡΠΈΡΠ΅ ΠΏΠ»Π°Π½ΠΎΠ²Π΅?
ΠΠ° ΠΏΡΠ΅Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° ΠΏΠΎ Docker. ΠΡΠΎΠ΅ΠΊΡΡΡ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π°, Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ. ΠΠ°Π½Π½ΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ Π±ΡΡ Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈ ΠΏΡΠ΅Π΄ΠΈ Π΄Π²Π°-ΡΡΠΈ ΠΌΠ΅ΡΠ΅ΡΠ°, Π²Π΅ΡΠ΅ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ ΠΎΡΡΠ°ΡΡΠ²Π°Ρ.
Π§Π°ΡΡ ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ΡΠ°Π²Π°Ρ ΠΌΠ΅, Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π²Π΅ΡΠ΅ ΡΠ° ΡΠ΅ΡΠ΅Π½ΠΈ ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°.
ΠΠ½ΠΎΠ³ΠΎ ΠΌΠΈ ΡΠ΅ ΠΈΡΠΊΠ° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ Π½Π°ΠΏΡΠ΅Π΄ ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π΄Π° ΡΡΠΈΠ³Π½Π΅ΠΌ Π΄ΠΎ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΈΡΡΠ°.
ΠΠ΄ΠΈΠ½ ΠΎΡ ΠΏΡΠΈΠΌΠ΅ΡΠΈΡΠ΅ Π΅ Π²Π³ΡΠ°Π΄Π΅Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡΡ Π² Docker, Π½Π°ΡΠ΅ΡΠ΅Π½ Docker Swarm, ΠΊΠΎΠΉΡΠΎ ΠΈΠ΄Π²Π° Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ. ΠΡΠΊΠ°ΠΌ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌ Π½Π΅ΡΠΎ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ Π½Π° Π±Π°Π·Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Docker Swarm.
ΠΠ΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΡΡΠ·Π΄Π°Π²Π° Π½Π΅ΡΠ΄ΠΎΠ±ΡΡΠ²Π° ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅. Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ ΡΠ° ΠΈΠ·ΠΎΠ»ΠΈΡΠ°Π½ΠΈ. Π’Π΅ ΡΠ° ΡΠ°Π·ΠΏΡΡΡΠ½Π°ΡΠΈ ΠΏΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅. ΠΠ΄Π½Π° ΠΎΡ Π·Π°Π΄Π°ΡΠΈΡΠ΅ Π΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠ΄ΠΎΠ±Π΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ ΡΡΠ΅Π· ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.

ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
