ΠΠ° ΡΠ΅ΠΊΠΎΠΈ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π³ΠΎΠ΄ΠΈΠ½ΠΈ, ΠΈΠ½Π΄ΡΡΡΡΠΈΡΠ°ΡΠ° Π·Π° ΡΠ°Π·Π²ΠΎΡ Π½Π° ΡΠΎΡΡΠ²Π΅Ρ ΠΏΡΠ΅ΡΡΠΏΡΠ²Π° ΠΏΡΠΎΠΌΠ΅Π½Π° Π½Π° ΠΏΠ°ΡΠ°Π΄ΠΈΠ³ΠΌΠ°ΡΠ°. ΠΠ΄Π΅Π½ ΠΎΠ΄ ΠΎΠ²ΠΈΠ΅ ΡΠ΅Π½ΠΎΠΌΠ΅Π½ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΠΏΠΎΠ·Π½Π°Π΅ ΠΊΠ°ΠΊΠΎ Π·Π³ΠΎΠ»Π΅ΠΌΠ΅Π½ΠΈΠΎΡ ΠΈΠ½ΡΠ΅ΡΠ΅Ρ Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΎΡ Π½Π° ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ. ΠΠ°ΠΊΠΎ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΈΡΠ΅ Π½Π΅ ΡΠ΅ Π½Π°ΡΠ½ΠΎΠ²Π°ΡΠ° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ°, Π΄ΡΡΠΈ Π½Π΅ΠΎΠ΄Π°ΠΌΠ½Π° Π½Π΅ΡΠ·ΠΈΠ½Π°ΡΠ° ΠΏΠΎΠΏΡΠ»Π°ΡΠ½ΠΎΡΡ Π±ΡΠΊΠ²Π°Π»Π½ΠΎ Π²ΡΡΠΎΠ³Π»Π°Π²ΠΎ ΠΏΠΎΡΠ°ΡΠ½Π°.
ΠΠΎΠ»Π΅ΠΌΠΈΡΠ΅ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡΠ½ΠΈ ΡΡΠ»ΡΠ³ΠΈ ΡΠ΅Π³Π° ΡΠ΅ Π·Π°ΠΌΠ΅Π½ΡΠ²Π°Π°Ρ ΡΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠ½ΠΈ, Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΠΈ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΈ. ΠΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠΌΠ΅ΡΠ° ΠΊΠ°ΠΊΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΊΠΎΡΠ° ΡΠ»ΡΠΆΠΈ Π·Π° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π° ΠΈ ΠΌΠ½ΠΎΠ³Ρ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½Π° ΡΠ΅Π». ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π° DBMS, Express Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°, ΡΡΠ»ΡΠ³Π° Solr.
ΠΠ΅Π½ΠΎΠ²ΠΈΠ²Π΅, ΡΠ΅ΡΠΊΠΎ Π΅ Π΄Π° ΡΠ΅ Π·Π°ΠΌΠΈΡΠ»ΠΈ ΡΠ°Π·Π²ΠΎΡ Π½Π° Π½ΠΎΠ² ΡΠΎΡΡΠ²Π΅ΡΡΠΊΠΈ ΡΠΈΡΡΠ΅ΠΌ Π±Π΅Π· ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΈ. Π ΠΎΠ²Π°Π° ΡΠΈΡΡΠ°ΡΠΈΡΠ°, ΠΏΠ°ΠΊ, Π½Γ¨ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° Docker.
ΠΏΡΠΈΡΡΠ°Π½ΠΈΡΠ΅Π½ ΡΠ°Π±ΠΎΡΠ½ΠΈΠΊ
ΠΠ»Π°ΡΡΠΎΡΠΌΠ°
ΠΠΎΠΊΠ΅Ρ ΠΠΎΠΌΠΏΠΎΠ½ΠΈΡΠ°Ρ
Π’Π΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡ
ΠΠΎΠ³Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ ΡΠΎ Docker Compose, Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° YAML ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΠΈΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ ΠΈ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° Π½ΠΈΠ²Π½Π°ΡΠ° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ° Π΅Π΄Π½ΠΈ ΡΠΎ Π΄ΡΡΠ³ΠΈ. ΠΠ°ΡΠΎΠ°, Docker Compose Π΅ Π°Π»Π°ΡΠΊΠ° Π·Π° ΠΎΠΏΠΈΡΡΠ²Π°ΡΠ΅ ΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅ Docker ΡΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ.
ΠΠ²Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ ΡΠ°Π±ΠΎΡΠ°Ρ Π½Π° ΡΠΈΡΡΠ΅ΠΌ Π΄ΠΎΠΌΠ°ΡΠΈΠ½
ΠΠ°ΠΏΡΠ°Π²Π΅ΡΠ΅ ΠΠΠ£
ΠΡΠΎΠ³ΡΠ°ΠΌΠ° make
, Π²ΠΎ ΡΡΡΡΠΈΠ½Π° Π΅ Π°Π»Π°ΡΠΊΠ° Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° Π³ΡΠ°Π΄Π΅ΡΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΎΠ΄ ΠΈΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄. ΠΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΊΠ°ΠΆΠ΅ΠΌΠ΅ ΡΠΎΠ° make
ΡΠ΅ ΠΎΠ΄Π½Π΅ΡΡΠ²Π° Π½Π° ΡΠ΅ΠΊΠΎΡ ΠΏΡΠΎΡΠ΅Ρ ΠΊΠΎΡ Π²ΠΊΠ»ΡΡΡΠ²Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠΈΡΠ°ΡΠ΅ Π½Π° Π½Π΅ΠΊΠΎΠΈ Π²Π»Π΅Π·Π½ΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΡΠ°Π»ΠΈ Π²ΠΎ Π½Π΅ΠΊΠΎΡΠ° ΠΈΠ·Π»Π΅Π·Π½Π° ΡΠΎΡΠΌΠ°, Π΄ΠΎ Π½Π΅ΠΊΠΎΡΠ° ΡΠ΅Π». ΠΠΎ Π½Π°ΡΠΈΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ docker-compose
ΡΠ΅ ΡΠ΅ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠΈΡΠ°Π°Ρ Π²ΠΎ Π°ΠΏΡΡΡΠ°ΠΊΡΠ½ΠΈ ΡΠ΅Π»ΠΈ (
ΠΠ° ΡΠ° ΠΊΠ°ΠΆΠ°ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° make
Π·Π° ΡΠΎΠ° ΡΡΠΎ ΡΠ°ΠΊΠ°ΠΌΠ΅ ΠΎΠ΄ Π½Π΅Π³ΠΎ, Π½ΠΈ ΡΡΠ΅Π±Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° Makefile
.
ΠΠΎ Π½Π°ΡΠ°ΡΠ° Makefile
ΡΠ΅ ΡΠΎΠ΄ΡΠΆΠΈ ΡΠ΅Π΄ΠΎΠ²Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ docker
ΠΈ docker-compose
, ΠΊΠΎΠΈ ΡΠ΅ Π΄ΠΈΠ·Π°ΡΠ½ΠΈΡΠ°Π½ΠΈ Π΄Π° ΡΠ΅ΡΠ°Π²Π°Π°Ρ ΠΌΠ½ΠΎΠ³Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ. ΠΠΌΠ΅Π½ΠΎ, Π·Π±ΠΎΡΡΠ²Π°ΠΌΠ΅ Π·Π° ΡΠΊΠ»ΠΎΠΏΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ, Π·Π° Π½Π΅Π³ΠΎΠ²ΠΎ ΡΡΠ°ΡΡΡΠ²Π°ΡΠ΅, Π·Π°ΠΏΠΈΡΠ°ΡΠ΅, ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅, Π·Π° ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° Π½Π°ΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ Π²ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ, Π·Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ Π΄Π½Π΅Π²Π½ΠΈΡΠΈ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ ΠΈ Π·Π° ΡΠ΅ΡΠ°Π²Π°ΡΠ΅ Π½Π° Π΄ΡΡΠ³ΠΈ ΡΠ»ΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ.
Π’ΠΈΠΏΠΈΡΠ½ΠΈ ΡΠ»ΡΡΠ°ΠΈ Π·Π° ΡΠΏΠΎΡΡΠ΅Π±Π° Π·Π° Docker Compose
ΠΡΠ΄Π΅ Π΄Π° Π·Π°ΠΌΠΈΡΠ»ΠΈΠΌΠ΅ ΠΎΠ±ΠΈΡΠ½Π° Π²Π΅Π±-Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΊΠΎΡΠ° Π³ΠΈ ΠΈΠΌΠ° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ:
- TimescaleDB Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ (Postgres).
- ΠΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Express.js.
- ΠΠΈΠ½Π³ (ΡΠ°ΠΌΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ, Π½Π΅ ΠΏΡΠ°Π²ΠΈ Π½ΠΈΡΡΠΎ ΠΏΠΎΡΠ΅Π±Π½ΠΎ).
ΠΠ° ΠΎΠ²Π°Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΡΠ΅ Ρ Π±ΠΈΠ΄Π°Ρ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ 3 ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ Π·Π° Docker ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° docker-compose
, ΠΊΠΎΡ ΡΠΎΠ΄ΡΠΆΠΈ ΡΠΏΠ°ΡΡΡΠ²Π° Π·Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ ΠΎΠ²ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ. Π‘Π΅ΠΊΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ ΡΠ΅ ΠΈΠΌΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΎΡΠΊΠΈ Π½Π° Π΄ΠΎΠΏΠΈΡ. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ timescale
ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ½ΠΎ Π½Π° ΠΈΡΡ Π½Π°ΡΠΈΠ½ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Ρ ΡΠΎ Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠΌΠ΅Π½ΠΎ, Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° Π³ΠΈ ΠΈΠ·Π²ΡΡΠΈΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π΄Π΅ΡΡΡΠ²Π°:
- ΠΠ°ΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π²ΠΎ ΡΠΊΠΎΠ»ΠΊΠ° Postgres.
- Π£Π²ΠΎΠ· ΠΈ ΠΈΠ·Π²ΠΎΠ· Π½Π° ΡΠ°Π±Π΅Π»ΠΈ.
- ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅
pg_dump
ΡΠ°Π±Π΅Π»ΠΈ ΠΈΠ»ΠΈ Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ.
ΠΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Express.js, expressjs
, ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΈ ΠΈΠΌΠ° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ:
- ΠΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π°ΡΠ΅ ΡΠ²Π΅ΠΆΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΎΠ΄ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈΠΎΡ Π΄Π½Π΅Π²Π½ΠΈΠΊ.
- ΠΡΠΈΡΠ°Π²Π΅ΡΠ΅ ΡΠ΅ Π²ΠΎ ΡΠΊΠΎΠ»ΠΊΠ° Π·Π° Π΄Π° ΠΈΠ·Π²ΡΡΠΈΡΠ΅ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ.
ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ
ΠΡΠΊΠ°ΠΊΠΎ ΡΠ΅ ΠΏΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Docker Compose, Π²ΡΠ΅ΠΌΠ΅ Π΅ Π΄Π° ΠΊΠΎΠΌΡΠ½ΠΈΡΠΈΡΠ°ΠΌΠ΅ ΡΠΎ ΡΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ. ΠΠΎ ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ Docker Compose ΠΏΠΎΡΡΠΎΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° docker-compose
, ΠΎΠΏΡΠΈΡΠ° Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΊΠ° -f
, ΠΊΠΎΡ Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΏΡΠ΅ΡΡΠ»ΠΈΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° Π²ΠΎ ΡΠΈΡΡΠ΅ΠΌΠΎΡ docker-compose.yml
.
ΠΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΈ ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΎΠ²Π°Π° ΠΎΠΏΡΠΈΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ°ΡΠ° ΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΡΠ°ΠΌΠΎ Π½Π° ΠΎΠ½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ ΡΡΠΎ ΡΠ΅ ΡΠΏΠΎΠΌΠ΅Π½Π°ΡΠΈ Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° docker-compose.yml
.
ΠΡΠ΄Π΅ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ ΠΈΠ·Π³Π»Π΅Π΄Π°Π°Ρ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠΈΡΠ΅ ΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈΡΠ΅ ΠΏΡΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ docker-compose
. ΠΠΊΠΎ Π·Π°ΠΌΠΈΡΠ»ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ Π½Π°ΡΠ°Π²ΠΈΠΌΠ΅ Π²ΠΎ ΡΠΊΠΎΠ»ΠΊΠ° psql
, ΡΠΎΠ³Π°Ρ ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅Π΄Π°Π°Ρ Π²Π°ΠΊΠ°:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
ΠΡΡΠ°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΡΠΎ Π½Π΅ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ docker-compose
Π docker
, ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ°:
docker exec -it edp_timescale_1 psql -Upostgres
ΠΠ΅ ΠΌΠΎΠ»ΠΈΠΌΠ΅ ΠΈΠΌΠ°ΡΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ Π΄Π΅ΠΊΠ° Π²ΠΎ ΡΠ°ΠΊΠ²ΠΈ ΡΠ»ΡΡΠ°ΠΈ ΡΠ΅ΠΊΠΎΠ³Π°Ρ Π΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΠΎ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° docker
, ΠΈ ΡΠΈΠΌΠΎΡ docker-compose
, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΠΎΠ²Π° ΡΠ° Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡΠ° ΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠΌΠ½Π°Ρ ΠΈΠΌΠΈΡΠ°ΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈΡΠ΅.
Π Π΄Π²Π΅ΡΠ΅ Π³ΠΎΡΠ΅Π½Π°Π²Π΅Π΄Π΅Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π½Π΅ ΡΠ΅ ΡΠΎΠ»ΠΊΡ ΡΠ΅ΡΠΊΠΈ. ΠΠΎ, Π°ΠΊΠΎ ΠΊΠΎΡΠΈΡΡΠ΅Π²ΠΌΠ΅ βΠΎΠ±Π²ΠΈΠ²ΠΊΠ°β Π²ΠΎ ΡΠΎΡΠΌΠ°ΡΠ° Makefile
, ΠΊΠΎΡ Π±ΠΈ Π½ΠΈ Π΄Π°Π» ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ Π²ΠΎ ΡΠΎΡΠΌΠ° Π½Π° Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΈ ΡΠ°ΠΌΠΈΠΎΡ Π±ΠΈ Π³ΠΈ Π½Π°ΡΠ΅ΠΊΠΎΠ» ΡΠ»ΠΈΡΠ½ΠΈ Π΄ΠΎΠ»Π³ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΡΠΎΠ³Π°Ρ ΠΈΡΡΠΈΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ Π±ΠΈ ΠΌΠΎΠΆΠ΅Π»Π΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π°Ρ Π²Π°ΠΊΠ°:
make db-shell
Π‘ΠΎΡΠ΅ΠΌΠ° Π΅ ΠΎΡΠΈΠ³Π»Π΅Π΄Π½ΠΎ Π΄Π΅ΠΊΠ° ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Makefile
ΠΌΠ½ΠΎΠ³Ρ ΡΠ° ΠΎΠ»Π΅ΡΠ½ΡΠ²Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ!
Π Π°Π±ΠΎΡΠ΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ
ΠΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° Π³ΠΎΡΠ΅Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠ΅Π½ Π΄ΠΈΡΠ°Π³ΡΠ°ΠΌ, ΡΠ΅ ΡΠ° ΠΊΡΠ΅ΠΈΡΠ°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° docker-compose.yml
:
version: '3.3'
services:
api:
build: .
image: mywebimage:0.0.1
ports:
- 8080:8080
volumes:
- /app/node_modules/
depends_on:
- timescale
command: npm run dev
networks:
- webappnetwork
timescale:
image: timescale/timescaledb-postgis:latest-pg11
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
command: ["postgres", "-c", "log_statement=all", "-c", "log_destination=stderr"]
volumes:
- ./create_schema.sql:/docker-entrypoint-initdb.d/create_schema.sql
networks:
- webappnetwork
ping:
image: willfarrell/ping
environment:
HOSTNAME: "localhost"
TIMEOUT: 300
networks:
webappnetwork:
driver: bridge
ΠΠ° Π΄Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΠΌΠ΅ ΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Docker Compose ΠΈ Π΄Π° ΠΊΠΎΠΌΡΠ½ΠΈΡΠΈΡΠ°ΠΌΠ΅ ΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈΡΠ΅ ΡΡΠΎ Π³ΠΈ ΠΎΠΏΠΈΡΡΠ²Π°, ΡΠ΅ ΡΠ° ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° Makefile
:
THIS_FILE := $(lastword $(MAKEFILE_LIST))
.PHONY: help build up start down destroy stop restart logs logs-api ps login-timescale login-api db-shell
help:
make -pRrq -f $(THIS_FILE) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
build:
docker-compose -f docker-compose.yml build $(c)
up:
docker-compose -f docker-compose.yml up -d $(c)
start:
docker-compose -f docker-compose.yml start $(c)
down:
docker-compose -f docker-compose.yml down $(c)
destroy:
docker-compose -f docker-compose.yml down -v $(c)
stop:
docker-compose -f docker-compose.yml stop $(c)
restart:
docker-compose -f docker-compose.yml stop $(c)
docker-compose -f docker-compose.yml up -d $(c)
logs:
docker-compose -f docker-compose.yml logs --tail=100 -f $(c)
logs-api:
docker-compose -f docker-compose.yml logs --tail=100 -f api
ps:
docker-compose -f docker-compose.yml ps
login-timescale:
docker-compose -f docker-compose.yml exec timescale /bin/bash
login-api:
docker-compose -f docker-compose.yml exec api /bin/bash
db-shell:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
ΠΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈ ΠΎΠ²Π΄Π΅ Π²Π°ΠΆΠ°Ρ Π·Π° ΡΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ, Π½ΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° ΠΎΠΏΡΠΈΡΠ°ΡΠ° c=
Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° Π³ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΠ΅ ΠΎΠΏΡΠ΅Π³ΠΎΡ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π½Π° Π΅Π΄Π΅Π½ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ.
ΠΠΎ Makefile
ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ Π²Π°ΠΊΠ°:
make help
β ΠΈΠ·Π΄Π°Π²Π°ΡΠ΅ Π»ΠΈΡΡΠ° Π½Π° ΡΠΈΡΠ΅ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π°make
.
ΠΠΎΠΌΠΎΡ Π·Π° Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ
make build
- ΡΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠ»ΠΈΠΊΠ° ΠΎΠ΄Dockerfile
. ΠΠΎ Π½Π°ΡΠΈΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΡΠΈΡΡΠ΅Π²ΠΌΠ΅ ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠΈ ΡΠ»ΠΈΠΊΠΈtimescale
ΠΈping
. ΠΠΎ ΡΠ»ΠΈΠΊΠ°ΡΠ°api
ΡΠ°ΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠΎΠ±ΠΈΡΠ°ΠΌΠ΅ Π»ΠΎΠΊΠ°Π»Π½ΠΎ. ΠΠ²Π° Π΅ ΡΠΎΠΊΠΌΡ ΠΎΠ½Π° ΡΡΠΎ ΡΠ΅ ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΏΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΎΠ²Π°Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°.
ΠΠ·Π³ΡΠ°Π΄Π±Π° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ Docker
make start
β Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ. ΠΠ° Π΄Π° ΡΡΠ°ΡΡΡΠ²Π°ΡΠ΅ ΡΠ°ΠΌΠΎ Π΅Π΄Π΅Π½ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΊΠ°ΠΊΠΎmake start c=timescale
.
ΠΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡ Π·Π° Π²ΡΠ΅ΠΌΠ΅Π½ΡΠΊΠ° ΡΠ°ΠΌΠΊΠ°
ΠΠΎΠ΄Π΅ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ Π·Π° ΠΏΠΈΠ½Π³
make login-timescale
β Π½Π°ΡΠ°Π²Π΅ΡΠ΅ ΡΠ΅ Π½Π° Π±Π°Ρ ΡΠ΅ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΎΡtimescale
.
Π Π°Π±ΠΎΡΠ΅ΡΠ΅ Π±Π°Ρ Π²ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΡΠΊΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠΈ
make db-shell
- Π²Π»Π΅Π· Π²ΠΎpsql
Π²ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρtimescale
Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° SQL ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ° Π²ΠΎ ΠΎΠ΄Π½ΠΎΡ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ.
ΠΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅ Π½Π° psql Π²ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ timescaledb
make stop
β ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ Π·Π° Π·Π°ΠΏΠΈΡΠ°ΡΠ΅.
ΠΠ°ΠΏΠΈΡΠ°ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ Π·Π° Π²ΡΠ΅ΠΌΠ΅Π½ΡΠΊΠ° ΡΠ°ΠΌΠΊΠ°
make down
β Π·Π°ΠΏΠΈΡΠ°ΡΠ΅ ΠΈ ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ. ΠΠ° Π΄Π° ΠΎΡΡΡΡΠ°Π½ΠΈΡΠ΅ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΎΠ²Π°Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π°Π²Π΅Π΄ΡΠ²Π°ΡΡΠΈ Π³ΠΎ ΡΠ°ΠΊΠ°Π½ΠΈΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅Ρ. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ -make down c=timescale
ΠΈΠ»ΠΈmake down c=api
.
ΠΠ°ΠΏΠΈΡΠ°ΡΠ΅ ΠΈ Π±ΡΠΈΡΠ΅ΡΠ΅ Π½Π° ΡΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ
Π Π΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΠ΄
ΠΠ°ΠΊΠΎ Docker Compose Π½ΠΈ Π΄Π°Π²Π° Π±ΠΎΠ³Π°Ρ ΡΠ΅Ρ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ, ΠΏΠΎΠ½Π΅ΠΊΠΎΠ³Π°Ρ ΠΎΠ²ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ°Π½Π°Ρ Π΄ΠΎΠ»Π³ΠΈ ΠΈ ΡΠ΅ΡΠΊΠΈ Π·Π° ΠΏΠ°ΠΌΠ΅ΡΠ΅ΡΠ΅.
ΠΠ°ΡΠΈΠ½ Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π° Makefile
Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π° Π΄Π° Π²ΠΎΡΠΏΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ Π±ΡΠ·Π° ΠΈ Π»Π΅ΡΠ½Π° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ ΠΎΠ΄ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° docker-compose.yml
. ΠΠΌΠ΅Π½ΠΎ, ΡΡΠ°Π½ΡΠ²Π° Π·Π±ΠΎΡ Π·Π° ΡΠ»Π΅Π΄Π½ΠΎΠ²ΠΎ:
- ΠΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΎΡ ΠΊΠΎΠΌΡΠ½ΠΈΡΠΈΡΠ° ΡΠ°ΠΌΠΎ ΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈ Π²ΠΎ
docker-compose.yml
, ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π΅ ΡΠ° ΠΏΠΎΠΏΡΠ΅ΡΡΠ²Π°Π°Ρ Π΄ΡΡΠ³ΠΈ ΠΊΠΎΠ½ΡΠ΅ΡΠ½Π΅ΡΠΈ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Ρ. - ΠΠΎ ΡΠ»ΡΡΠ°Ρ Π΄Π° ΡΠ΅ Π·Π°Π±ΠΎΡΠ°Π²ΠΈ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ° ΠΈΠ·Π²ΡΡΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°
make help
ΠΈ Π΄ΠΎΠ±ΠΈΡΡΠ΅ ΠΏΠΎΠΌΠΎΡ Π·Π° Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ. - ΠΠ΅ ΠΌΠΎΡΠ° Π΄Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΠ΅ Π΄ΠΎΠ»Π³ΠΈ ΡΠΏΠΈΡΠΎΡΠΈ Π½Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ Π·Π° Π΄Π° ΠΈΠ·Π²ΡΡΠΈΡΠ΅ Π΄Π΅ΡΡΡΠ²Π° ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ Π΄ΠΎΠ±ΠΈΠ²Π°ΡΠ΅ Π½Π° Π½Π°ΡΠ½ΠΎΠ²ΠΈΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ Π²ΠΎ Π΄Π½Π΅Π²Π½ΠΈΠΊΠΎΡ ΠΈΠ»ΠΈ Π½Π°ΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π²ΠΎ ΡΠΈΡΡΠ΅ΠΌ. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΊΠ°ΠΊΠΎ
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
ΡΠ΅ ΠΏΡΠ΅ΡΠ²ΠΎΡΠ° Π²ΠΎmake db-shell
. - Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°
Makefile
ΠΠΎΠΆΠ΅ΡΠ΅ ΡΠ»Π΅ΠΊΡΠΈΠ±ΠΈΠ»Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³ΠΎΠ΄ΠΈΡΠ΅ Π½Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ ΡΠ°ΡΡΠ΅. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, Π»Π΅ΡΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π΄ΠΎΠ΄Π°Π΄Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π° Π΄Π° ΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄Π΅ ΡΠ΅Π·Π΅ΡΠ²Π½Π° ΠΊΠΎΠΏΠΈΡΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈΠ»ΠΈ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΠΈ ΠΊΠΎΠ΅ Π±ΠΈΠ»ΠΎ Π΄ΡΡΠ³ΠΎ Π΄Π΅ΡΡΡΠ²ΠΎ. - ΠΠΊΠΎ Π³ΠΎΠ»Π΅ΠΌ ΡΠΈΠΌ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅ΡΠΈ Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈ ΠΈΡΡΠΎΡΠΎ
Makefile
, ΠΎΠ²Π° ΡΠ° ΡΠ°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ° ΡΠΎΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° ΠΈ Π³ΠΈ Π½Π°ΠΌΠ°Π»ΡΠ²Π° Π³ΡΠ΅ΡΠΊΠΈΡΠ΅.
PS ΠΠΎ Π½Π°ΡΠ°ΡΠ°
ΠΠΎΡΠΈΡΡΠ²Π°Π½ΠΈ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ! ΠΠ°ΠΊΠΎ ΡΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ° Docker Compose?
ΠΠ·Π²ΠΎΡ: www.habr.com