ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠΈΡΡΠ΅Π»ΠΈ!
* Π’Π°Π·ΠΈ ΡΡΠ°ΡΠΈΡ Π΅ Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° ΠΎΡΠ²ΠΎΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΌΠΈΠ½Π°Ρ Π½Π° REBRAIN & Yandex.Cloud, Π°ΠΊΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΡΠ΅ Π΄Π° Π³Π»Π΅Π΄Π°ΡΠ΅ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ»ΠΈΠΏΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΈ Π²ΡΡΠ·ΠΊΠ° -
ΠΠ°ΡΠΊΠΎΡΠΎ ΠΈΠΌΠ°Ρ
ΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΈΠ·ΠΏΡΠΎΠ±Π²Π°ΠΌΠ΅ Yandex.Cloud Π½Π° ΠΆΠΈΠ²ΠΎ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΡΠΊΠ°Ρ
ΠΌΠ΅ Π΄Π° ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°ΠΌΠ΅ Π΄ΡΠ»Π³ΠΎ ΠΈ ΡΠΏΠΎΡΠΈΡΠΎ, Π²Π΅Π΄Π½Π°Π³Π° ΡΠ΅ ΠΎΡΠΊΠ°Π·Π°Ρ
ΠΌΠ΅ ΠΎΡ ΠΈΠ΄Π΅ΡΡΠ° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΡΡ Π±Π»ΠΎΠ³ Π½Π° Wordpress Ρ ΠΎΠ±Π»Π°ΡΠ½Π° Π±Π°Π·Π° - Π±Π΅ΡΠ΅ ΡΠ²ΡΡΠ΄Π΅ ΡΠΊΡΡΠ½ΠΎ. Π‘Π»Π΅Π΄ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΡΠ°Π·ΠΌΠΈΡΡΠ» ΡΠ΅ΡΠΈΡ
ΠΌΠ΅ Π΄Π° Π²Π½Π΅Π΄ΡΠΈΠΌ Π½Π΅ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ° Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π° ΡΡΠ»ΡΠ³Π° Π·Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ±ΠΈΡΠΈΡ Π² ΡΠ΅ΠΆΠΈΠΌ ΠΏΠΎΡΡΠΈ Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅.
ΠΠ±ΡΠΎΠ»ΡΡΠ½ΠΎ ΡΡΠΌ ΡΠΈΠ³ΡΡΠ΅Π½, ΡΠ΅ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ°ΡΠ° ΡΠ°ΡΡ ΠΎΡ ΠΎΠ½Π»Π°ΠΉΠ½ (ΠΈ Π½Π΅ ΡΠ°ΠΌΠΎ) Π±ΠΈΠ·Π½Π΅ΡΠΈ ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΡΠ² Π½Π°ΡΠΈΠ½ ΡΡΠ±ΠΈΡΠ°Ρ ΠΏΠ»Π°Π½ΠΈΠ½Π° ΠΎΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΡΠ²ΠΎΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΠΈ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ. ΠΠ°ΡΠΎ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ, ΡΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° Π²Π·Π΅ΠΌΠ°Π½Π΅ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ - Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π°ΠΊΠΎ ΡΠΏΡΠ°Π²Π»ΡΠ²Π°ΡΠ΅ ΠΎΠ½Π»Π°ΠΉΠ½ ΠΈΠ³ΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ°ΡΠ° Π½Π° ΠΊΠΎΠ΅ Π½ΠΈΠ²ΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π°ΠΉ-ΡΠ΅ΡΡΠΎ ΡΠ΅ Π·Π°Π±ΠΈΠ²Π°Ρ ΠΈ ΠΈΠ·ΡΡΠΈΠ²Π°Ρ Π²Π°ΡΠ°ΡΠ° ΠΈΠ³ΡΠ°ΡΠΊΠ°. ΠΠ»ΠΈ Π·Π°ΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π°ΠΏΡΡΠΊΠ°Ρ Π²Π°ΡΠΈΡ ΡΠ°ΠΉΡ, Π±Π΅Π· Π΄Π° ΠΊΡΠΏΡΡ Π½ΠΈΡΠΎ (Π·Π΄ΡΠ°Π²Π΅ΠΉ, Yandex.Metrica).
Π ΡΠ°ΠΊΠ°, Π½Π°ΡΠ°ΡΠ° ΠΈΡΡΠΎΡΠΈΡ: ΠΊΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°Ρ ΠΌΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° golang, ΡΠ΅ΡΡΠ²Π°Ρ ΠΌΠ΅ kafka ΡΡΠ΅ΡΡ rabbitmq ΡΡΠ΅ΡΡ yqs, Π½Π°ΠΏΠΈΡΠ°Ρ ΠΌΠ΅ ΠΏΠΎΡΠΎΡΠ½ΠΎ ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π² ΠΊΠ»ΡΡΡΠ΅Ρ Clickhouse ΠΈ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Ρ ΠΌΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° yandex datalens. ΠΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ, Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Π±Π΅ΡΠ΅ ΠΏΠΎΠ΄ΠΏΡΠ°Π²Π΅Π½ΠΎ Ρ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ½ΠΈ ΠΈΠ·ΠΊΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° docker, terraform, gitlab ci ΠΈ, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, prometheus. ΠΠ° ΡΡΡΠ³Π²Π°ΠΌΠ΅!
ΠΠΈΡ ΠΈΡΠΊΠ°Π» Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²Ρ ΡΠ΅Π·Π΅ΡΠ²Π°ΡΠΈΡ, ΡΠ΅ Π½ΡΠΌΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΎ Π½Π°Π²Π΅Π΄Π½ΡΠΆ - Π·Π° ΡΠΎΠ²Π° ΡΠ΅ Π½ΠΈ ΡΡΡΠ±Π²Π°Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΠ°ΡΠΈΠΈ ΠΎΡ ΠΏΠΎΡΠ΅Π΄ΠΈΡΠ°ΡΠ°. ΠΠ°Π»ΠΊΠΎ Π·Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°:
Π§Π°ΡΡ 1 (Π²ΠΈΠ΅ Ρ ΡΠ΅ΡΠ΅ΡΠ΅). ΠΠΈΠ΅ ΡΠ΅ Π²Π·Π΅ΠΌΠ΅ΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅ ΠΈ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° Π½Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° golang.
Π§Π°ΡΡ 2. ΠΡΡΠΊΠ°ΠΌΠ΅ Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ, ΠΏΡΠ°Π²ΠΈΠΌ Π³ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎ ΠΈ ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ.
Π§Π°ΡΡ 3. ΠΠ΅ΠΊΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ Π·Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΡ
ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° Π² Π±ΡΡΠ΅Ρ, Π° Π½Π΅ Π²ΡΠ² ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΠΈ ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π΄Π° ΡΡΠ°Π²Π½ΠΈΠΌ ΡΡΠ»ΡΠ³Π°ΡΠ° kafka, rabbitmq ΠΈ yandex queue.
ΡΠ°ΡΡ 4 Π©Π΅ Π²Π½Π΅Π΄ΡΠΈΠΌ ΠΊΠ»ΡΡΡΠ΅Ρ Clickhouse, ΡΠ΅ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ»ΡΠ³Π° Π·Π° ΡΡΡΠΈΠΉΠΌΠΈΠ½Π³ Π·Π° ΠΏΡΠ΅Ρ
Π²ΡΡΠ»ΡΠ½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ Π±ΡΡΠ΅ΡΠ° ΡΠ°ΠΌ ΠΈ ΡΠ΅ Π½Π°ΡΡΡΠΎΠΈΠΌ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π² datalens.
ΡΠ°ΡΡ 5 ΠΠ΅ΠΊΠ° ΠΏΡΠΈΠ²Π΅Π΄Π΅ΠΌ ΡΡΠ»Π°ΡΠ° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° Π² ΠΏΡΠ°Π²ΠΈΠ»Π½Π° ΡΠΎΡΠΌΠ° - Π½Π°ΡΡΡΠΎΠΉΡΠ΅ ci/cd Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° gitlab ci, ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΈ ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° ΡΡΠ»ΡΠ³ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° prometheus ΠΈ consul.
TK
ΠΡΡΠ²ΠΎ, Π½Π΅ΠΊΠ° ΡΠΎΡΠΌΡΠ»ΠΈΡΠ°ΠΌΠ΅ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΎΡΠΎ Π·Π°Π΄Π°Π½ΠΈΠ΅ - ΠΊΠ°ΠΊΠ²ΠΎ ΡΠΎΡΠ½ΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΊΠ°ΡΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ.
- ΠΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ ΠΊΡΠ°ΠΉΠ½Π° ΡΠΎΡΠΊΠ° ΠΊΠ°ΡΠΎ events.kis.im (kis.im Π΅ ΡΠ΅ΡΡΠΎΠ²ΠΈΡΡ Π΄ΠΎΠΌΠ΅ΠΉΠ½, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π²ΡΠ² Π²ΡΠΈΡΠΊΠΈ ΡΡΠ°ΡΠΈΠΈ), ΠΊΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΡΡΠ±ΠΈΡΠΈΡ ΡΡΠ΅Π· HTTPS.
- Π‘ΡΠ±ΠΈΡΠΈΡΡΠ° ΡΠ° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ json ΠΊΠ°ΡΠΎ: {βeventβ: βviewβ, βosβ: βlinuxβ, βbrowserβ: βchromeβ}. ΠΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ Π΅ΡΠ°ΠΏ ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΡΠ΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎΠ»Π΅ΡΠ°, Π½ΠΎ ΡΠΎΠ²Π° Π½ΡΠΌΠ° Π΄Π° ΠΈΠ³ΡΠ°Π΅ Π³ΠΎΠ»ΡΠΌΠ° ΡΠΎΠ»Ρ. ΠΠΊΠΎ ΠΆΠ΅Π»Π°Π΅ΡΠ΅, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΡΠ΅ ΠΊΡΠΌ protobuf.
- Π£ΡΠ»ΡΠ³Π°ΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° 10 000 ΡΡΠ±ΠΈΡΠΈΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°.
- Π’ΡΡΠ±Π²Π° Π΄Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»Π½ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅ ΡΡΠ΅Π· ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ ΠΊΡΠΌ Π½Π°ΡΠ΅ΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. Π ΡΠ΅ Π±ΡΠ΄Π΅ Ρ ΡΠ±Π°Π²ΠΎ, Π°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠ΅ΠΌΠ΅ΡΡΠΈΠΌ ΠΏΡΠ΅Π΄Π½Π°ΡΠ° ΡΠ°ΡΡ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π³Π΅ΠΎΠ»ΠΎΠΊΠ°ΡΠΈΠΈ, Π·Π° Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ Π·Π°Π±Π°Π²ΡΠ½Π΅ΡΠΎ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ.
- Π’ΠΎΠ»Π΅ΡΠ°Π½ΡΠ½ΠΎΡΡ ΠΊΡΠΌ Π³ΡΠ΅ΡΠΊΠΈ. Π Π΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΡΡΠ°Π±ΠΈΠ»Π½ΠΎ ΠΈ Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΡΠ΅Π»Π΅Π΅ ΠΏΡΠΈ ΠΏΠ°Π΄Π°Π½Π΅ Π½Π° Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΡΠ°ΡΡΠΈ (Π΄ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π±ΡΠΎΠΉ, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅).
Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°
ΠΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏ Π·Π° ΡΠΎΠ·ΠΈ ΡΠΈΠΏ Π·Π°Π΄Π°ΡΠΈ ΠΎΡΠ΄Π°Π²Π½Π° ΡΠ° ΠΈΠ·ΠΌΠΈΡΠ»Π΅Π½ΠΈ ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅. Π€ΠΈΠ³ΡΡΠ°ΡΠ° ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π½Π°ΡΠ΅ΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
Π ΡΠ°ΠΊΠ°, ΠΊΠ°ΠΊΠ²ΠΎ ΠΈΠΌΠ°ΠΌΠ΅:
1. ΠΡΠ»ΡΠ²ΠΎ ΡΠ° Π½Π°ΡΠΈΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΠΊΠΎΠΈΡΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠ±ΠΈΡΠΈΡ, Π±ΠΈΠ»ΠΎ ΡΠΎ ΠΈΠ³ΡΠ°ΡΠΈ, Π·Π°Π²ΡΡΡΠ²Π°ΡΠΈ Π½ΠΈΠ²ΠΎ Π² ΠΈΠ³ΡΠ°ΡΠΊΠ° Π½Π° ΡΠΌΠ°ΡΡΡΠΎΠ½ ΠΈΠ»ΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΡΡΡΠΊΠ° Π² ΠΎΠ½Π»Π°ΠΉΠ½ ΠΌΠ°Π³Π°Π·ΠΈΠ½ ΡΡΠ΅Π· ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ Π±ΡΠ°ΡΠ·ΡΡ. Π‘ΡΠ±ΠΈΡΠΈΠ΅ΡΠΎ, ΠΊΠ°ΠΊΡΠΎ Π΅ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΎ Π² ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΡΠ°, Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ json, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ° Π΄ΠΎ Π½Π°ΡΠ°ΡΠ° ΠΊΡΠ°ΠΉΠ½Π° ΡΠΎΡΠΊΠ° - events.kis.im.
2. ΠΡΡΠ²ΠΈΡΠ΅ Π΄Π²Π° ΡΡΡΠ²ΡΡΠ° ΡΠ° ΠΏΡΠΎΡΡΠΈ Π±Π°Π»Π°Π½ΡΡΠΎΡΠΈ, ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΈΠΌ Π·Π°Π΄Π°ΡΠΈ ΡΠ°:
- ΠΡΠ΄Π΅ΡΠ΅ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π½Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ keepalived, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π° Π²ΠΈΡΡΡΠ°Π»Π½ΠΈΡ IP ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠ·Π»ΠΈΡΠ΅ Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ.
- ΠΡΠ΅ΠΊΡΠ°ΡΠ΅ΡΠ΅ TLS. ΠΠ°, Π½ΠΈΠ΅ ΡΠ΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΠΌ TLS Π½Π° ΡΡΡ . ΠΡΡΠ²ΠΎ, ΡΠ°ΠΊΠ° ΡΠ΅ Π½Π°ΡΠ΅ΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π° ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈΡΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΠΈ Π²ΡΠΎΡΠΎ, Π·Π° Π΄Π° ΡΠ΅ ΠΎΠ±Π»Π΅ΠΊΡΠΈ ΡΠ΅ΠΆΠ΅ΡΡΡΠ° Π½Π° ΡΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π° Π²ΡΡΠ·ΠΊΠ° ΠΎΡ Π½Π°ΡΠΈΡΠ΅ ΡΡΡΠ²ΡΡΠΈ Π² Π·Π°Π΄Π½Π°ΡΠ° ΡΠ°ΡΡ.
- ΠΠ°Π»Π°Π½ΡΠΈΡΠ°ΠΉΡΠ΅ Π²Ρ ΠΎΠ΄ΡΡΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ Π½Π°Π»ΠΈΡΠ½ΠΈΡΠ΅ Π±Π΅ΠΊΠ΅Π½Π΄ ΡΡΡΠ²ΡΡΠΈ. ΠΠ»ΡΡΠΎΠ²Π°ΡΠ° Π΄ΡΠΌΠ° ΡΡΠΊ Π΅ Π΄ΠΎΡΡΡΠΏΠ½Π°. ΠΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΡΠΎΠ²Π° ΡΡΠΈΠ³Π°ΠΌΠ΅ Π΄ΠΎ ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ΡΠΎ, ΡΠ΅ Π±Π°Π»Π°Π½ΡΡΠΎΡΠΈΡΠ΅ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π½Π°Π±Π»ΡΠ΄Π°Π²Π°Ρ Π½Π°ΡΠΈΡΠ΅ ΡΡΡΠ²ΡΡΠΈ Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Π΄Π° ΡΠΏΡΠ°Ρ Π΄Π° Π±Π°Π»Π°Π½ΡΠΈΡΠ°Ρ ΡΡΠ°ΡΠΈΠΊΠ° ΠΊΡΠΌ ΠΏΠΎΠ²ΡΠ΅Π΄Π΅Π½ΠΈ Π²ΡΠ·Π»ΠΈ.
3. Π‘Π»Π΅Π΄ Π±Π°Π»Π°Π½ΡΡΠΎΡΠΈΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ ΡΡΡΠ²ΡΡΠΈ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠ°Π±ΠΎΡΠ΅ΡΠΈ Ρ Π΄ΠΎΡΡΠ° ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’ΡΡΠ±Π²Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠΈΠ΅ΠΌΠ° Π²Ρ ΠΎΠ΄ΡΡΠΈ Π·Π°ΡΠ²ΠΊΠΈ ΡΡΠ΅Π· HTTP, Π΄Π° Π²Π°Π»ΠΈΠ΄ΠΈΡΠ° ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ΠΈΡ json ΠΈ Π΄Π° ΠΏΠΎΡΡΠ°Π²Ρ Π΄Π°Π½Π½ΠΈΡΠ΅ Π² Π±ΡΡΠ΅Ρ.
4. ΠΠΈΠ°Π³ΡΠ°ΠΌΠ°ΡΠ° ΠΏΠΎΠΊΠ°Π·Π²Π° kafka ΠΊΠ°ΡΠΎ Π±ΡΡΠ΅Ρ, Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, Π΄ΡΡΠ³ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΡΡΠ»ΡΠ³ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π½Π° ΡΠΎΠ²Π° Π½ΠΈΠ²ΠΎ. Π©Π΅ ΡΡΠ°Π²Π½ΠΈΠΌ Kafka, rabbitmq ΠΈ yqs Π² ΡΡΠ΅ΡΠ°ΡΠ° ΡΡΠ°ΡΠΈΡ.
5. ΠΡΠ΅Π΄ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° ΡΠΎΡΠΊΠ° Π½Π° Π½Π°ΡΠ°ΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π΅ Clickhouse - ΠΊΠΎΠ»ΠΎΠ½Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΡΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΡΠ΅ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°ΡΠ΅ ΠΎΠ³ΡΠΎΠΌΠ½ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π°Π½Π½ΠΈ. ΠΠ° ΡΠΎΠ²Π° Π½ΠΈΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΠΈΠΌ Π΄Π°Π½Π½ΠΈ ΠΎΡ Π±ΡΡΠ΅ΡΠ° ΠΊΡΠΌ ΡΠ°ΠΌΠ°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ (ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΠΎΠ²Π° Π² ΡΡΠ°ΡΠΈΡ 4).
Π’ΠΎΠ·ΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°ΠΌΠ΅ Π²ΡΠ΅ΠΊΠΈ ΡΠ»ΠΎΠΉ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ Ρ ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»Π½ΠΎ. ΠΠ΅ΠΊΠ΅Π½Π΄ ΡΡΡΠ²ΡΡΠΈΡΠ΅ Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΡΡ - Π½Π΅ΠΊΠ° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΡΠ΅ Π½Π΅ΡΠΎ - Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΡΠ΅ ΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π±Π΅Π· ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Π΄ΠΎΡΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ. ΠΡΡΠ΅ΡΡΡ Π² ΡΡΠΈΠ» Kafka Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ - Π½Π΅ΠΊΠ° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΡΠ΅ ΡΡΡΠ²ΡΡΠΈ ΠΈ Π΄Π° ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΠΈΠΌ Π½ΡΠΊΠΎΠΈ ΠΎΡ Π΄ΡΠ»ΠΎΠ²Π΅ΡΠ΅ Π½Π° Π½Π°ΡΠ°ΡΠ° ΡΠ΅ΠΌΠ° ΠΊΡΠΌ ΡΡΡ . Clickhouse Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΠΈ - Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ :) ΠΡΡΡΠ½ΠΎΡΡ Π½ΠΈΠ΅ ΡΡΡΠΎ ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ΠΌ ΡΡΡΠ²ΡΡΠΈΡΠ΅ ΠΈ ΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΠΈΠΌ Π΄Π°Π½Π½ΠΈΡΠ΅.
ΠΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, Π°ΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π²Π½Π΅Π΄ΡΠΈΡΠ΅ Π½Π΅Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½Π°ΡΠ° ΡΠ°ΡΡ ΠΎΡ Π½Π°ΡΠΈΡΠ΅ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ ΠΌΠ°ΡΠ°Π± Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π³Π΅ΠΎΠ»ΠΎΠΊΠ°ΡΠΈΠΈ, ΡΠΎΠ³Π°Π²Π° Π½ΡΠΌΠ° Π½ΠΈΡΠΎ ΠΏΠΎ-ΠΏΡΠΎΡΡΠΎ:
ΠΡΠ² Π²ΡΡΠΊΠ° Π³Π΅ΠΎΠ»ΠΎΠΊΠ°ΡΠΈΡ ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°ΠΌΠ΅ Π±Π°Π»Π°Π½ΡΡΠΎΡ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ kafka. ΠΠ°ΡΠΎ ΡΡΠ»ΠΎ ΡΠ° Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΈ 2 ΡΡΡΠ²ΡΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, 3 Π²ΡΠ·Π΅Π»Π° kafka ΠΈ ΠΎΠ±Π»Π°ΡΠ΅Π½ Π±Π°Π»Π°Π½ΡΡΠΎΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ cloudflare, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° Π²ΡΠ·Π»ΠΈ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΡΠ²ΠΊΠΈ Π·Π° Π±Π°Π»Π°Π½Ρ ΡΡΠ΅Π· Π³Π΅ΠΎΠ»ΠΎΠΊΠ°ΡΠΈΡ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° IP Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π΄Π°Π½Π½ΠΈΡΠ΅, ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ΠΈ ΠΎΡ Π°ΠΌΠ΅ΡΠΈΠΊΠ°Π½ΡΠΊΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ, ΡΠ΅ ΠΊΠ°ΡΠ½Π°Ρ Π½Π° Π°ΠΌΠ΅ΡΠΈΠΊΠ°Π½ΡΠΊΠΈ ΡΡΡΠ²ΡΡΠΈ. Π Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΎΡ ΠΡΡΠΈΠΊΠ° ΡΠ° Π½Π° Π°ΡΡΠΈΠΊΠ°Π½ΡΠΊΠΈ.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π²ΡΠΈΡΠΊΠΎ Π΅ ΡΡΠ²ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ - ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΠ³Π»Π΅Π΄Π°Π»Π½ΠΈΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΎΡ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ° Kafka ΠΈ ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ Π΄Π°Π½Π½ΠΈ ΠΎΡ Π²ΡΠΈΡΠΊΠΈ ΠΌΠ΅ΡΡΠ° Π² Π½Π°ΡΠΈΡ ΡΠ΅Π½ΡΡΠ°Π»Π΅Π½ ΡΠ΅Π½ΡΡΡ Π·Π° Π΄Π°Π½Π½ΠΈ, ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π² Π ΡΡΠΈΡ. ΠΡΡΡΠ΅ΡΠ½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΈ Π³ΠΈ Π·Π°ΠΏΠΈΡΠ²Π°ΠΌΠ΅ Π² Clickhouse Π·Π° ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠ° Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ.
Π ΡΠ°ΠΊΠ°, ΠΏΠΎΠ΄ΡΠ΅Π΄ΠΈΡ ΠΌΠ΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° - Π½Π΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Π΄Π° ΡΠ°Π·ΠΊΠ»Π°ΡΠ°ΠΌΠ΅ Yandex.Cloud!
ΠΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠΎΠ»Π±Π°
ΠΡΠ΅Π΄ΠΈ Cloud Π²ΡΠ΅ ΠΎΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ΅ ΠΌΠ°Π»ΠΊΠΎ ΡΡΡΠΏΠ΅Π»ΠΈΠ²ΠΈ ΠΈ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Π΄ΠΎΡΡΠ° ΠΏΡΠΎΡΡΠ° ΡΡΠ»ΡΠ³Π° Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π²Ρ ΠΎΠ΄ΡΡΠΈ ΡΡΠ±ΠΈΡΠΈΡ. Π©Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ golang, Π·Π°ΡΠΎΡΠΎ ΡΠΎΠΉ ΡΠ΅ Π΅ Π΄ΠΎΠΊΠ°Π·Π°Π» ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ±ΡΠ΅ ΠΊΠ°ΡΠΎ Π΅Π·ΠΈΠΊ Π·Π° ΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΏΡΠ΅ΠΊΠ°ΡΠ°ΠΌΠ΅ Π΅Π΄ΠΈΠ½ ΡΠ°Ρ (ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΡΠ°), ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ Π½Π΅ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ:
ΠΠΎΠΈ ΡΠ° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΡΠΎΡΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ Π±ΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° ΠΎΡΠ±Π΅Π»Π΅ΠΆΠ° ΡΡΠΊ:
1. ΠΠΎΠ³Π°ΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ Π΄Π²Π° ΡΠ»Π°Π³Π°. ΠΠ΄ΠΈΠ½ΠΈΡΡ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π·Π° ΠΏΠΎΡΡΠ°, Π½Π° ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ»ΡΡΠ°ΠΌΠ΅ Π²Ρ ΠΎΠ΄ΡΡΠΈΡΠ΅ http Π·Π°ΡΠ²ΠΊΠΈ (-addr). ΠΡΠΎΡΠΎΡΠΎ Π΅ Π·Π° Π°Π΄ΡΠ΅ΡΠ° Π½Π° kafka ΡΡΡΠ²ΡΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ Π·Π°ΠΏΠΈΡΠ²Π°ΠΌΠ΅ Π½Π°ΡΠΈΡΠ΅ ΡΡΠ±ΠΈΡΠΈΡ (-kafka):
addr = flag.String("addr", ":8080", "TCP address to listen to")
kafka = flag.String("kafka", "127.0.0.1:9092", "Kafka endpointsβ)
2. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° sarama (
config := sarama.NewConfig()
config.Producer.RequiredAcks = sarama.WaitForLocal
config.Producer.Compression = sarama.CompressionSnappy
config.Producer.Return.Successes = true
3. ΠΠ°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΡΡΠΎ ΠΈΠΌΠ° Π²Π³ΡΠ°Π΄Π΅Π½ ΠΊΠ»ΠΈΠ΅Π½Ρ prometheus, ΠΊΠΎΠΉΡΠΎ ΡΡΠ±ΠΈΡΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
- Π±ΡΠΎΠΉ Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅;
- Π±ΡΠΎΠΉ Π³ΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° (Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠ΅Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅, ΠΏΠΎΠ²ΡΠ΅Π΄Π΅Π½ json, Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Π½Π΅ Π½Π° Kafka);
- Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π΅Π΄Π½Π° Π·Π°ΡΠ²ΠΊΠ° ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎ Kafka.
4. Π’ΡΠΈ ΠΊΡΠ°ΠΉΠ½ΠΈ ΡΠΎΡΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°:
- /ΡΡΠ°ΡΡΡ - ΠΏΡΠΎΡΡΠΎ Π²ΡΡΡΠ° ok, Π·Π° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅, ΡΠ΅ ΡΠΌΠ΅ ΠΆΠΈΠ²ΠΈ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π½ΡΠΊΠΎΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π½Π°Π»ΠΈΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ° Kafka.
- /metrics - ΡΠΏΠΎΡΠ΅Π΄ ΡΠΎΠ·ΠΈ url ΠΊΠ»ΠΈΠ΅Π½ΡΡΡ prometheus ΡΠ΅ Π²ΡΡΠ½Π΅ ΡΡΠ±ΡΠ°Π½ΠΈΡΠ΅ ΠΎΡ Π½Π΅Π³ΠΎ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ.
- /post Π΅ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΊΡΠ°ΠΉΠ½Π° ΡΠΎΡΠΊΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ°Ρ POST Π·Π°ΡΠ²ΠΊΠΈ Ρ json Π²ΡΡΡΠ΅. ΠΠ°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° json Π·Π° Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡ ΠΈ Π°ΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΡΠ΅Π΄, Π·Π°ΠΏΠΈΡΠ²Π° Π΄Π°Π½Π½ΠΈΡΠ΅ Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ° Kafka.
Π©Π΅ Π½Π°ΠΏΡΠ°Π²Ρ ΡΠ³ΠΎΠ²ΠΎΡΠΊΠ°, ΡΠ΅ ΠΊΠΎΠ΄ΡΡ Π½Π΅ Π΅ ΠΈΠ΄Π΅Π°Π»Π΅Π½ - ΡΠΎΠΉ ΠΌΠΎΠΆΠ΅ (ΠΈ ΡΡΡΠ±Π²Π°!) Π΄Π° Π±ΡΠ΄Π΅ Π·Π°Π²ΡΡΡΠ΅Π½. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠΏΡΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π²Π³ΡΠ°Π΄Π΅Π½ΠΈΡ net/http ΠΈ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΡΠ΅ ΠΊΡΠΌ ΠΏΠΎ-Π±ΡΡΠ·ΠΈΡ fasthttp. ΠΠ»ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠΏΠ΅ΡΠ΅Π»ΠΈΡΠ΅ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΡΠ΅ΡΡΡΡΠΈ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ°, ΠΊΠ°ΡΠΎ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π·Π° Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡ Π½Π° json Π½Π° ΠΏΠΎ-ΠΊΡΡΠ΅Π½ Π΅ΡΠ°ΠΏ - ΠΊΠΎΠ³Π°ΡΠΎ Π΄Π°Π½Π½ΠΈΡΠ΅ ΡΠ΅ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΡ ΠΎΡ Π±ΡΡΠ΅ΡΠ° ΠΊΡΠΌ ΠΊΠ»ΡΡΡΠ΅ΡΠ° clickhouse.
Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ ΡΠ°Π·Π²ΠΎΠΉΠ½Π°ΡΠ° ΡΡΡΠ°Π½Π° Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, Π²Π΅Π΄Π½Π°Π³Π° ΠΏΠΎΠΌΠΈΡΠ»ΠΈΡ
ΠΌΠ΅ Π·Π° Π½Π°ΡΠ°ΡΠ° Π±ΡΠ΄Π΅ΡΠ° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° ΠΈ ΡΠ΅ΡΠΈΡ
ΠΌΠ΅ Π΄Π° Π²Π½Π΅Π΄ΡΠΈΠΌ Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΡΠ΅Π· Π΄ΠΎΠΊΠ΅Ρ. ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΡΡ Dockerfile Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅
ΠΡΡΠ²ΠΈ ΡΡΡΠΏΠΊΠΈ Π² ΠΎΠ±Π»Π°ΠΊΠ°
ΠΠ° ΠΏΡΡΠ²ΠΎ ΠΌΡΡΡΠΎ, ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΉΡΠ΅ ΡΠ΅ Π½Π°
Π‘Π»Π΅Π΄ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ Π·Π° Π²Π°Ρ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½ ΠΎΡΠ΄Π΅Π»Π΅Π½ ΠΎΠ±Π»Π°ΠΊ ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅, Π² ΠΊΠΎΡΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ ΠΎΠ±Π»Π°ΡΠ½ΠΈ ΡΠ΅ΡΡΡΡΠΈ. ΠΠ°ΡΠΎ ΡΡΠ»ΠΎ Π² Yandex.Cloud Π²ΡΡΠ·ΠΊΠ°ΡΠ° Π½Π° ΡΠ΅ΡΡΡΡΠΈΡΠ΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΎΠ±Π»Π°ΠΊΠ° Π·Π° Π΅Π΄ΠΈΠ½ Π°ΠΊΠ°ΡΠ½Ρ. Π Π²ΡΡΡΠ΅ Π² ΠΎΠ±Π»Π°ΠΊΠ° Π½Π°ΠΏΡΠ°Π²Π΅ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΡΠΌΠ΅Π½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΠΎΠ²Π° Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° -
ΠΠ° Π΄Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°ΡΠ΅ ΠΎΠ±Π»Π°ΠΊΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΊΠ°ΠΊΡΠΎ ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΡΠ°ΠΊΠ° ΠΈ ΠΊΠΎΠ½Π·ΠΎΠ»Π½Π°ΡΠ° ΠΏΠΎΠΌΠΎΡΠ½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° - yc. ΠΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Ρ Π΅Π΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° (Π·Π° Linux ΠΈ Mac Os):
curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash
ΠΠΊΠΎ Π²Π°ΡΠΈΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡ ΠΏΠΎ Π²ΡΡΡΠ΅ΡΠ½Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ ΡΠ΅ ΡΠ΄ΠΎΡΠ²Π° Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ ΠΎΡ ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ, ΡΠΎΠ³Π°Π²Π°, ΠΏΡΡΠ²ΠΎ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΡΠ²ΠΎΡΠΈΡΠ΅ ΡΠΊΡΠΈΠΏΡΠ° ΠΈ Π΄Π° Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅, ΠΈ Π²ΡΠΎΡΠΎ, Π½ΠΈΠ΅ Π³ΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΠΌΠ΅ ΠΏΠΎΠ΄ Π½Π°ΡΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» - Π±Π΅Π· root ΠΏΡΠ°Π²Π°.
ΠΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ Π·Π° Windows, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ yc init
Π·Π° Π΄Π° Π³ΠΎ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π°ΠΏΡΠ»Π½ΠΎ:
vozerov@mba:~ $ yc init
Welcome! This command will take you through the configuration process.
Please go to https://oauth.yandex.ru/authorize?response_type=token&client_id= in order to obtain OAuth token.
Please enter OAuth token:
Please select cloud to use:
[1] cloud-b1gv67ihgfu3bp (id = b1gv67ihgfu3bpt24o0q)
[2] fevlake-cloud (id = b1g6bvup3toribomnh30)
Please enter your numeric choice: 2
Your current cloud has been set to 'fevlake-cloud' (id = b1g6bvup3toribomnh30).
Please choose folder to use:
[1] default (id = b1g5r6h11knotfr8vjp7)
[2] Create a new folder
Please enter your numeric choice: 1
Your current folder has been set to 'default' (id = b1g5r6h11knotfr8vjp7).
Do you want to configure a default Compute zone? [Y/n]
Which zone do you want to use as a profile default?
[1] ru-central1-a
[2] ru-central1-b
[3] ru-central1-c
[4] Don't set default zone
Please enter your numeric choice: 1
Your profile default Compute zone has been set to 'ru-central1-a'.
vozerov@mba:~ $
ΠΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏ ΠΏΡΠΎΡΠ΅ΡΡΡ Π΅ Π»Π΅ΡΠ΅Π½ β ΠΏΡΡΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ oauth token Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±Π»Π°ΠΊΠ°, Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ ΠΎΠ±Π»Π°ΠΊΠ° ΠΈ ΠΏΠ°ΠΏΠΊΠ°ΡΠ°, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅.
ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π°ΠΊΠ°ΡΠ½ΡΠ° ΠΈΠ»ΠΈ ΠΏΠ°ΠΏΠΊΠΈ Π² Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡΠΈ ΠΎΠ±Π»Π°ΠΊ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΏΡΠΎΡΠΈΠ»ΠΈ Ρ ΠΎΡΠ΄Π΅Π»Π½ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΡΠ΅Π· yc config profile create ΠΈ Π΄Π° ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π°ΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡ .
Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ Π³ΠΎΡΠ½ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ, Π΅ΠΊΠΈΠΏΡΡ Π½Π° Yandex.Cloud Π½Π°ΠΏΠΈΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ±ΡΡ
vozerov@mba:~ $ git clone https://github.com/rebrainme/yandex-cloud-events/ events
Cloning into 'events'...
remote: Enumerating objects: 100, done.
remote: Counting objects: 100% (100/100), done.
remote: Compressing objects: 100% (68/68), done.
remote: Total 100 (delta 37), reused 89 (delta 26), pack-reused 0
Receiving objects: 100% (100/100), 25.65 KiB | 168.00 KiB/s, done.
Resolving deltas: 100% (37/37), done.
vozerov@mba:~ $ cd events/terraform/
ΠΡΠΈΡΠΊΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π² terraform, ΡΠ° Π·Π°ΠΏΠΈΡΠ°Π½ΠΈ Π²ΡΠ² ΡΠ°ΠΉΠ»Π° main.tf. ΠΠ° Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅, ΡΡΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ» private.auto.tfvars Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° terraform ΡΡΡ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅:
# Yandex Cloud Oauth token
yc_token = ""
# Yandex Cloud ID
yc_cloud_id = ""
# Yandex Cloud folder ID
yc_folder_id = ""
# Default Yandex Cloud Region
yc_region = "ru-central1-a"
# Cloudflare email
cf_email = ""
# Cloudflare token
cf_token = ""
# Cloudflare zone id
cf_zone_id = ""
ΠΡΠΈΡΠΊΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π²Π·Π΅ΡΠΈ ΠΎΡ yc config ΡΠΏΠΈΡΡΠΊΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²Π΅ΡΠ΅ ΡΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π»ΠΈ ΠΊΠΎΠ½Π·ΠΎΠ»Π½Π°ΡΠ° ΠΏΠΎΠΌΠΎΡΠ½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°. Π‘ΡΠ²Π΅ΡΠ²Π°ΠΌ Π²ΠΈ Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ private.auto.tfvars ΠΊΡΠΌ .gitignore, Π·Π° Π΄Π° Π½Π΅ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°ΡΠ΅ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π»ΠΈΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ.
Π private.auto.tfvars ΡΡΡΠΎ ΠΏΠΎΡΠΎΡΠΈΡ ΠΌΠ΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ Cloudflare - Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° DNS Π·Π°ΠΏΠΈΡΠΈ ΠΈ ΠΏΡΠΎΠΊΡΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ Π΄ΠΎΠΌΠ΅ΠΉΠ½ events.kis.im ΠΊΡΠΌ Π½Π°ΡΠΈΡΠ΅ ΡΡΡΠ²ΡΡΠΈ. ΠΠΊΠΎ Π½Π΅ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ cloudflare, ΠΏΡΠ΅ΠΌΠ°Ρ Π½Π΅ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° Π½Π° cloudflare Π² main.tf ΠΈ ΡΠ°ΠΉΠ»Π° dns.tf, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ΅Π½ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ dns Π·Π°ΠΏΠΈΡΠΈ.
Π Π½Π°ΡΠ°ΡΠ° ΡΠ°Π±ΠΎΡΠ° ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΠΌΠ΅ ΠΈ ΡΡΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° - ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΠΏΠΎΠΌΠΎΡΠ½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° ΠΈ terraform.
ΠΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΡΠ΅ΠΆΠΈ
Π§Π΅ΡΡΠ½ΠΎ ΠΊΠ°Π·Π°Π½ΠΎ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΠΏΡΡΠ½Π΅ΡΠ΅ ΡΠ°Π·ΠΈ ΡΡΡΠΏΠΊΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ Π½ΠΎΠ² ΠΎΠ±Π»Π°ΠΊ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½Π° ΠΎΡΠ΄Π΅Π»Π½Π° ΠΌΡΠ΅ΠΆΠ° ΠΈ 3 ΠΏΠΎΠ΄ΠΌΡΠ΅ΠΆΠΈ - ΠΏΠΎ Π΅Π΄Π½Π° Π·Π° Π²ΡΡΠΊΠ° Π·ΠΎΠ½Π° Π½Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡ. ΠΠΎ Π²ΡΠ΅ ΠΏΠ°ΠΊ Π±ΠΈΡ
ΠΌΠ΅ ΠΈΡΠΊΠ°Π»ΠΈ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΎΡΠ΄Π΅Π»Π½Π° ΠΌΡΠ΅ΠΆΠ° Π·Π° Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΡΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΎ Π°Π΄ΡΠ΅ΡΠΈΡΠ°Π½Π΅. ΠΠ±ΡΠ°ΡΠ° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ° Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π² Yandex.Cloud Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π° ΡΠΈΠ³ΡΡΠ°ΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ (ΡΠ΅ΡΡΠ½ΠΎ Π²Π·Π΅ΡΠ° ΠΎΡ
Π’Π°ΠΊΠ° ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ ΠΎΠ±ΡΠ° ΠΌΡΠ΅ΠΆΠ°, Π² ΠΊΠΎΡΡΠΎ ΡΠ΅ΡΡΡΡΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠΈΡΠ°Ρ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ. ΠΠ° Π²ΡΡΠΊΠ° Π·ΠΎΠ½Π° Π½Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° ΠΏΠΎΠ΄ΠΌΡΠ΅ΠΆΠ° ΡΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΎ Π°Π΄ΡΠ΅ΡΠΈΡΠ°Π½Π΅ ΠΈ ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π° ΠΊΡΠΌ ΠΎΠ±ΡΠ°ΡΠ° ΠΌΡΠ΅ΠΆΠ°. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° Π²ΡΠΈΡΠΊΠΈ ΠΎΠ±Π»Π°ΡΠ½ΠΈ ΡΠ΅ΡΡΡΡΠΈ Π² Π½Π΅Π³ΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠΈΡΠ°Ρ, Π΄ΠΎΡΠΈ Π°ΠΊΠΎ ΡΠ° Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π·ΠΎΠ½ΠΈ Π½Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡ. Π Π΅ΡΡΡΡΠΈΡΠ΅, ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΠΊΡΠΌ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΎΠ±Π»Π°ΡΠ½ΠΈ ΠΌΡΠ΅ΠΆΠΈ, ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ Π²ΠΈΠΆΠ΄Π°Ρ Π΅Π΄ΠΈΠ½ Π΄ΡΡΠ³ ΡΠ°ΠΌΠΎ ΡΡΠ΅Π· Π²ΡΠ½ΡΠ½ΠΈ Π°Π΄ΡΠ΅ΡΠΈ. ΠΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, ΠΊΠ°ΠΊ Π΄Π΅ΠΉΡΡΠ²Π° ΡΠ°Π·ΠΈ ΠΌΠ°Π³ΠΈΡ Π²ΡΡΡΠ΅,
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΡΠ΅ΠΆΠ° Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π²ΡΠ² ΡΠ°ΠΉΠ»Π° network.tf ΠΎΡ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ. Π’Π°ΠΌ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π΅Π΄Π½Π° ΠΎΠ±ΡΠ° Π²ΡΡΡΠ΅ΡΠ½Π° Π²ΡΡΡΠ΅ΡΠ½Π° ΠΌΡΠ΅ΠΆΠ° ΠΈ ΡΠ²ΡΡΠ·Π²Π°ΠΌΠ΅ ΠΊΡΠΌ Π½Π΅Ρ ΡΡΠΈ ΠΏΠΎΠ΄ΠΌΡΠ΅ΠΆΠΈ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π·ΠΎΠ½ΠΈ Π½Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡ - Π²ΡΡΡΠ΅ΡΠ½Π°-a (172.16.1.0/24), Π²ΡΡΡΠ΅ΡΠ½Π°-b (172.16.2.0/24), Π²ΡΡΡΠ΅ΡΠ½Π°-c (172.16.3.0/24 ).
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΉΡΠ΅ terraform ΠΈ ΡΡΠ·Π΄Π°ΠΉΡΠ΅ ΠΌΡΠ΅ΠΆΠΈ:
vozerov@mba:~/events/terraform (master) $ terraform init
... skipped ..
vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_vpc_subnet.internal-a -target yandex_vpc_subnet.internal-b -target yandex_vpc_subnet.internal-c
... skipped ...
Plan: 4 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
yandex_vpc_network.internal: Creating...
yandex_vpc_network.internal: Creation complete after 3s [id=enp2g2rhile7gbqlbrkr]
yandex_vpc_subnet.internal-a: Creating...
yandex_vpc_subnet.internal-b: Creating...
yandex_vpc_subnet.internal-c: Creating...
yandex_vpc_subnet.internal-a: Creation complete after 6s [id=e9b1dad6mgoj2v4funog]
yandex_vpc_subnet.internal-b: Creation complete after 7s [id=e2liv5i4amu52p64ac9p]
yandex_vpc_subnet.internal-c: Still creating... [10s elapsed]
yandex_vpc_subnet.internal-c: Creation complete after 10s [id=b0c2qhsj2vranoc9vhcq]
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
Π‘ΡΡΠ°Ρ ΠΎΡΠ΅Π½! Π‘ΡΠ·Π΄Π°Π΄ΠΎΡ ΠΌΠ΅ Π½Π°ΡΠ°ΡΠ° ΠΌΡΠ΅ΠΆΠ° ΠΈ Π²Π΅ΡΠ΅ ΡΠΌΠ΅ Π³ΠΎΡΠΎΠ²ΠΈ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π½Π°ΡΠΈΡΠ΅ Π²ΡΡΡΠ΅ΡΠ½ΠΈ ΡΡΠ»ΡΠ³ΠΈ.
Π‘ΡΠ·Π΄Π°Π²Π°ΠΉΡΠ΅ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ
ΠΠ° Π΄Π° ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΡΠ°ΠΌΠΎ Π΄Π²Π΅ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ β ΠΏΡΡΠ²Π°ΡΠ° ΡΠ΅ Π½ΠΈ ΡΡΡΠ±Π²Π° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, Π²ΡΠΎΡΠ°ΡΠ° Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° kafka, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π²Ρ ΠΎΠ΄ΡΡΠΈ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ. Π ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π΄ΡΡΠ³Π° ΠΌΠ°ΡΠΈΠ½Π°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅ prometheus Π΄Π° Π½Π°Π±Π»ΡΠ΄Π°Π²Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
ΠΠΈΡΡΡΠ°Π»Π½ΠΈΡΠ΅ ΠΌΠ°ΡΠΈΠ½ΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ansible, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΡΠ΅Π΄ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ terraform, ΡΠ²Π΅ΡΠ΅ΡΠ΅ ΡΠ΅, ΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ Π΅Π΄Π½Π° ΠΎΡ Π½Π°ΠΉ-Π½ΠΎΠ²ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° ansible. Π ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΡΠΎΠ»ΠΈ Ρ ansible galaxy:
vozerov@mba:~/events/terraform (master) $ cd ../ansible/
vozerov@mba:~/events/ansible (master) $ ansible-galaxy install -r requirements.yml
- cloudalchemy-prometheus (master) is already installed, skipping.
- cloudalchemy-grafana (master) is already installed, skipping.
- sansible.kafka (master) is already installed, skipping.
- sansible.zookeeper (master) is already installed, skipping.
- geerlingguy.docker (master) is already installed, skipping.
vozerov@mba:~/events/ansible (master) $
Π ΠΏΠ°ΠΏΠΊΠ°ΡΠ° ansible ΠΈΠΌΠ° ΠΏΡΠΈΠΌΠ΅ΡΠ΅Π½ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΡΠ°ΠΉΠ» .ansible.cfg, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ. ΠΠΎΠΆΠ΅ Π΄Π° Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ.
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ, ΡΠ²Π΅ΡΠ΅ΡΠ΅ ΡΠ΅, ΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ ΡΠ°Π±ΠΎΡΠ΅Ρ ssh-Π°Π³Π΅Π½Ρ ΠΈ Π΄ΠΎΠ±Π°Π²Π΅Π½ ssh ΠΊΠ»ΡΡ, Π² ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ terraform Π½ΡΠΌΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ ΡΡΡ ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈΡΠ΅ ΠΌΠ°ΡΠΈΠ½ΠΈ. Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΏΠΎΠΏΠ°Π΄Π½Π°Ρ
Π½Π° Π³ΡΠ΅ΡΠΊΠ° Π² os x:
vozerov@mba:~/events/terraform (master) $ export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
Π ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Ρ terraform ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΡΠ΅ΡΡΡΡΠΈ:
vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_compute_instance.build -target yandex_compute_instance.monitoring -target yandex_compute_instance.kafka
yandex_vpc_network.internal: Refreshing state... [id=enp2g2rhile7gbqlbrkr]
data.yandex_compute_image.ubuntu_image: Refreshing state...
yandex_vpc_subnet.internal-a: Refreshing state... [id=e9b1dad6mgoj2v4funog]
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
... skipped ...
Plan: 3 to add, 0 to change, 0 to destroy.
... skipped ...
ΠΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ ΠΏΡΠΈΠΊΠ»ΡΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎ (ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅), ΡΠΎΠ³Π°Π²Π° ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ ΡΡΠΈ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ:
- build - ΠΌΠ°ΡΠΈΠ½Π° Π·Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅ ΠΈ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Docker Π±Π΅ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΎΡ Ansible.
- ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ - ΠΌΠ°ΡΠΈΠ½Π° Π·Π° Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ - prometheus & grafana, ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π° Π½Π° Π½Π΅Ρ. Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎ Π²Π»ΠΈΠ·Π°Π½Π΅ / ΠΏΠ°ΡΠΎΠ»Π°: admin / admin
- kafka Π΅ ΠΌΠ°Π»ΠΊΠ° ΠΌΠ°ΡΠΈΠ½Π° Ρ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π° kafka, Π΄ΠΎΡΡΡΠΏΠ½Π° Π½Π° ΠΏΠΎΡΡ 9092.
ΠΠ΅ΠΊΠ° ΡΠ΅ ΡΠ²Π΅ΡΠΈΠΌ, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΠ° Π½Π° ΠΌΡΡΡΠΎΡΠΎ ΡΠΈ:
vozerov@mba:~/events (master) $ yc compute instance list
+----------------------+------------+---------------+---------+---------------+-------------+
| ID | NAME | ZONE ID | STATUS | EXTERNAL IP | INTERNAL IP |
+----------------------+------------+---------------+---------+---------------+-------------+
| fhm081u8bkbqf1pa5kgj | monitoring | ru-central1-a | RUNNING | 84.201.159.71 | 172.16.1.35 |
| fhmf37k03oobgu9jmd7p | kafka | ru-central1-a | RUNNING | 84.201.173.41 | 172.16.1.31 |
| fhmt9pl1i8sf7ga6flgp | build | ru-central1-a | RUNNING | 84.201.132.3 | 172.16.1.26 |
+----------------------+------------+---------------+---------+---------------+-------------+
Π Π΅ΡΡΡΡΠΈΡΠ΅ ΡΠ° Π½Π°Π»ΠΈΡΠ΅ ΠΈ ΠΎΡ ΡΡΠΊ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ IP Π°Π΄ΡΠ΅ΡΠΈ. ΠΠΎ-Π½Π°ΡΠ°ΡΡΠΊ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ IP Π°Π΄ΡΠ΅ΡΠΈ Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ ΡΡΠ΅Π· ssh ΠΈ ΡΠ΅ ΡΠ΅ΡΡΠ²Π°ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ Π°ΠΊΠ°ΡΠ½Ρ Π² cloudflare, ΡΠ²ΡΡΠ·Π°Π½ Ρ terraform, Π½Π΅ ΡΠ΅ ΠΊΠΎΠ»Π΅Π±Π°ΠΉΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΏΡΡΡΠ½ΠΎ ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈ DNS ΠΈΠΌΠ΅Π½Π°.
ΠΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°, ΡΠ΅ Π΄Π°Π²Π°Ρ Π²ΡΡΡΠ΅ΡΠ΅Π½ IP ΠΈ Π²ΡΡΡΠ΅ΡΠ΅Π½ DNS ΠΈΠΌΠ΅, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΡΡΠ²ΡΡΠΈ Π² ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΠΏΠΎ ΠΈΠΌΠ΅:
ubuntu@build:~$ ping kafka.ru-central1.internal
PING kafka.ru-central1.internal (172.16.1.31) 56(84) bytes of data.
64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=1 ttl=63 time=1.23 ms
64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=2 ttl=63 time=0.625 ms
^C
--- kafka.ru-central1.internal ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.625/0.931/1.238/0.308 ms
Π’ΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π° Π½Π°Ρ, Π·Π° Π΄Π° ΠΏΠΎΡΠΎΡΠΈΠΌ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΊΡΠ°ΠΉΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ° Ρ kafk.
Π‘Π³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
Π‘ΡΡΠ°Ρ ΠΎΡΠ½ΠΎ, ΠΈΠΌΠ° ΡΡΡΠ²ΡΡΠΈ, ΠΈΠΌΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ - ΠΎΡΡΠ°Π²Π° ΡΠ°ΠΌΠΎ Π΄Π° Π³ΠΎ ΡΠ³Π»ΠΎΠ±ΠΈΠΌ ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°ΠΌΠ΅. ΠΠ° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΠ±ΠΈΡΠ°ΠΉΠ½Π°ΡΠ° Π΄ΠΎΠΊΠ΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ, Π½ΠΎ ΠΊΠ°ΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π·Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΡΠ»ΡΠ³Π° ΠΎΡ Yandex - ΡΠ΅Π³ΠΈΡΡΡΡ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ. ΠΠΎ Π½Π° ΠΏΡΡΠ²ΠΎ ΠΌΡΡΡΠΎ.
ΠΠΎΠΏΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π² ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅, Π²Π»ΠΈΠ·Π°ΠΌΠ΅ ΡΡΠ΅Π· ssh ΠΈ ΡΠ³Π»ΠΎΠ±ΡΠ²Π°ΠΌΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ:
vozerov@mba:~/events/terraform (master) $ cd ..
vozerov@mba:~/events (master) $ rsync -av app/ [email protected]:app/
... skipped ...
sent 3849 bytes received 70 bytes 7838.00 bytes/sec
total size is 3644 speedup is 0.93
vozerov@mba:~/events (master) $ ssh 84.201.132.3 -l ubuntu
ubuntu@build:~$ cd app
ubuntu@build:~/app$ sudo docker build -t app .
Sending build context to Docker daemon 6.144kB
Step 1/9 : FROM golang:latest AS build
... skipped ...
Successfully built 9760afd8ef65
Successfully tagged app:latest
ΠΠΎΠ»ΠΎΠ²ΠΈΠ½Π°ΡΠ° Π±ΠΈΡΠΊΠ° Π΅ ΡΠ²ΡΡΡΠ΅Π½Π° - ΡΠ΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΡΠ° Π½Π° Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠ°ΡΠΎ Π³ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠΈΠΌ Π½Π° kafka:
ubuntu@build:~/app$ sudo docker run --name app -d -p 8080:8080 app /app/app -kafka=kafka.ru-central1.internal:9092</code>
Π‘ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ event ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΠΎΡΠ²Π΅Ρ:
<code>vozerov@mba:~/events (master) $ curl -D - -s -X POST -d '{"key1":"data1"}' http://84.201.132.3:8080/post
HTTP/1.1 200 OK
Content-Type: application/json
Date: Mon, 13 Apr 2020 13:53:54 GMT
Content-Length: 41
{"status":"ok","partition":0,"Offset":0}
vozerov@mba:~/events (master) $
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ Ρ ΡΡΠΏΠ΅Ρ Π½Π° Π·Π°ΠΏΠΈΡΠ° ΠΈ ΠΏΠΎΡΠΎΡΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Π½Π° Π΄ΡΠ»Π° ΠΈ ΠΎΡΠΌΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ, Π² ΠΊΠΎΠ΅ΡΠΎ Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΎΡΡΠ°Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅, Π΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΡ Π² Yandex.Cloud ΠΈ Π΄Π° ΠΊΠ°ΡΠΈΡΠ΅ Π½Π°ΡΠ΅ΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΌ (ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΡΠΈ ΡΠ΅Π΄Π° Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π²ΡΠ² ΡΠ°ΠΉΠ»Π° registry.tf). Π‘ΡΠ·Π΄Π°ΠΉΡΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅:
vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_container_registry.events
... skipped ...
Plan: 1 to add, 0 to change, 0 to destroy.
... skipped ...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
ΠΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π°ΡΠΈΠ½Π° Π·Π° ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ Π² ΡΠ΅Π³ΠΈΡΡΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° - Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° oauth ΡΠΎΠΊΠ΅Π½, iam ΡΠΎΠΊΠ΅Π½ ΠΈΠ»ΠΈ ΠΊΠ»ΡΡ Π½Π° Π°ΠΊΠ°ΡΠ½Ρ Π·Π° ΡΡΠ»ΡΠ³Π°. ΠΠΎΠ²Π΅ΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π·Π° ΡΠ΅Π·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ°.
vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_iam_service_account.docker -target yandex_resourcemanager_folder_iam_binding.puller -target yandex_resourcemanager_folder_iam_binding.pusher
... skipped ...
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
Π‘Π΅Π³Π° Π²ΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΎΡΡΠ°Π²Π°, Π΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΊΠ»ΡΡ Π·Π° Π½Π΅Π³ΠΎ:
vozerov@mba:~/events/terraform (master) $ yc iam key create --service-account-name docker -o key.json
id: ajej8a06kdfbehbrh91p
service_account_id: ajep6d38k895srp9osij
created_at: "2020-04-13T14:00:30Z"
key_algorithm: RSA_2048
ΠΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Π½Π° Π½Π°ΡΠ΅ΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΠΌΠ΅ ΠΊΠ»ΡΡΠ° ΠΈ Π²Π»ΠΈΠ·Π°ΠΌΠ΅:
vozerov@mba:~/events/terraform (master) $ scp key.json [email protected]:
key.json 100% 2392 215.1KB/s 00:00
vozerov@mba:~/events/terraform (master) $ ssh 84.201.132.3 -l ubuntu
ubuntu@build:~$ cat key.json | sudo docker login --username json_key --password-stdin cr.yandex
WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
ubuntu@build:~$
ΠΠ° Π΄Π° ΠΊΠ°ΡΠΈΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π² ΡΠ΅Π³ΠΈΡΡΡΡΠ°, ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Π½Π° ΡΠ΅Π³ΠΈΡΡΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, Π²Π·Π΅ΠΌΠ°ΠΌΠ΅ Π³ΠΎ ΠΎΡ ΠΏΠΎΠΌΠΎΡΠ½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° yc:
vozerov@mba:~ $ yc container registry get events
id: crpdgj6c9umdhgaqjfmm
folder_id:
name: events
status: ACTIVE
created_at: "2020-04-13T13:56:41.914Z"
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΌΠ°ΡΠΊΠΈΡΠ°ΠΌΠ΅ Π½Π°ΡΠ΅ΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Ρ Π½ΠΎΠ²ΠΎ ΠΈΠΌΠ΅ ΠΈ ΠΊΠ°ΡΠ²Π°ΠΌΠ΅:
ubuntu@build:~$ sudo docker tag app cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
ubuntu@build:~$ sudo docker push cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
The push refers to repository [cr.yandex/crpdgj6c9umdhgaqjfmm/events]
8c286e154c6e: Pushed
477c318b05cb: Pushed
beee9f30bc1f: Pushed
v1: digest: sha256:1dd5aaa9dbdde2f60d833be0bed1c352724be3ea3158bcac3cdee41d47c5e380 size: 946
ΠΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ Π΄Π°Π»ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅ Π·Π°ΡΠ΅Π΄Π΅Π½ΠΎ ΡΡΠΏΠ΅ΡΠ½ΠΎ:
vozerov@mba:~/events/terraform (master) $ yc container repository list
+----------------------+-----------------------------+
| ID | NAME |
+----------------------+-----------------------------+
| crpe8mqtrgmuq07accvn | crpdgj6c9umdhgaqjfmm/events |
+----------------------+-----------------------------+
ΠΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, Π°ΠΊΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΏΠΎΠΌΠΎΡΠ½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° yc Π½Π° Linux ΠΌΠ°ΡΠΈΠ½Π°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°
yc container registry configure-docker
Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π΄ΠΎΠΊΠ΅Ρ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π‘Π²ΡΡΡΠΈΡ ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΈΡΠ° ΡΠ°Π±ΠΎΡΠ° ΠΈ Π² ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π°:
- ΠΠ·ΠΌΠΈΡΠ»ΠΈΡ ΠΌΠ΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°ΡΠ° Π½Π° Π½Π°ΡΠ°ΡΠ° Π±ΡΠ΄Π΅ΡΠ° ΡΡΠ»ΡΠ³Π°.
- ΠΠ°ΠΏΠΈΡΠ°Ρ ΠΌΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° golang, ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠΈΠ»Π°Π³Π° Π½Π°ΡΠ°ΡΠ° Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΠ°.
- Π‘ΡΠ±ΡΠ°Ρ ΠΌΠ΅ Π³ΠΎ ΠΈ Π³ΠΎ ΠΈΠ·ΡΠΈΠΏΠ°Ρ ΠΌΠ΅ Π² ΡΠ°ΡΡΠ΅Π½ ΡΠ΅Π³ΠΈΡΡΡΡ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ.
Π ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΠ°ΡΡ ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈΡΠ΅ Π½Π΅ΡΠ° - ΡΠ΅ ΠΏΡΡΠ½Π΅ΠΌ Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΈ Π½Π°ΠΊΡΠ°Ρ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ Π²ΡΡΡ Ρ Π½Π΅Π³ΠΎ. ΠΠ΅ ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π°ΠΉΡΠ΅!
Π’ΠΎΠ·ΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π» Π΅ Π²ΡΠ² Π²ΠΈΠ΄Π΅ΠΎΠ·Π°ΠΏΠΈΡΠ° Π½Π° ΠΎΡΠ²ΠΎΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΌΠΈΠ½Π°Ρ REBRAIN & Yandex.Cloud: ΠΡΠΈΠ΅ΠΌΠ°ΠΌΠ΅ 10 000 Π·Π°ΡΠ²ΠΊΠΈ Π² ΡΠ΅ΠΊΡΠ½Π΄Π° Π² Yandex Cloud -
ΠΠΊΠΎ ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°ΡΠ΅ Π΄Π° ΠΏΠΎΡΠ΅ΡΠ°Π²Π°ΡΠ΅ ΡΠ°ΠΊΠΈΠ²Π° ΡΡΠ±ΠΈΡΠΈΡ ΠΎΠ½Π»Π°ΠΉΠ½ ΠΈ Π΄Π° Π·Π°Π΄Π°Π²Π°ΡΠ΅ Π²ΡΠΏΡΠΎΡΠΈ Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ ΡΠ΅ Ρ
ΠΠΈΡ
ΠΌΠ΅ ΠΈΡΠΊΠ°Π»ΠΈ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΠΈ Π½Π° Yandex.Cloud Π·Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° Π±ΡΠ΄Π΅ Π΄ΠΎΠΌΠ°ΠΊΠΈΠ½ Π½Π° ΡΠ°ΠΊΠΎΠ²Π° ΡΡΠ±ΠΈΡΠΈΠ΅. ΠΠΈΠ½ΠΊ ΠΊΡΠΌ ΡΡΡ
-
ΠΠΊΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΡΠ΅ ΠΊΡΠΌ ΠΎΠ±Π»Π°ΠΊΠ° ΠΈΠ»ΠΈ ΠΈΠΌΠ°ΡΠ΅ Π²ΡΠΏΡΠΎΡΠΈ ΠΎΡΠ½ΠΎΡΠ½ΠΎ Π²Π°ΡΠ°ΡΠ° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°,
PS ΠΠΌΠ°ΠΌΠ΅ 2 Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΈ ΠΎΠ΄ΠΈΡΠ° Π½Π° ΠΌΠ΅ΡΠ΅Ρ, ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π²Π°ΡΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ΅ Π±ΡΠ΄Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΡΡ
.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com