ΠΠΎ Π½Π°ΡΠ° ΠΌΠΎΠ»Π±Π° Habr ΡΡΠ·Π΄Π°Π΄Π΅ Ρ ΡΠ±
Kubernetes ΠΈ ΠΈΠΌΠ°ΠΌΠ΅ ΡΠ΄ΠΎΠ²ΠΎΠ»ΡΡΠ²ΠΈΠ΅ΡΠΎ Π΄Π° ΠΏΠΎΠΌΠ΅ΡΡΠΈΠΌ ΠΏΡΡΠ²Π°ΡΠ° ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π² Π½Π΅Π³ΠΎ. ΠΠ±ΠΎΠ½ΠΈΡΠ°ΠΉ ΡΠ΅!
Kubernetes Π΅ Π»Π΅ΡΠ΅Π½. ΠΠ°ΡΠΎ Π±Π°Π½ΠΊΠΈΡΠ΅ ΠΌΠΈ ΠΏΠ»Π°ΡΠ°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠΈ, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΡ Π² ΡΠ°Π·ΠΈ ΠΎΠ±Π»Π°ΡΡ, Π΄ΠΎΠΊΠ°ΡΠΎ Π²ΡΠ΅ΠΊΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΠ²Π»Π°Π΄Π΅Π΅ ΡΠ°Π·ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ ΡΠ°ΠΌΠΎ Π·Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΡΠ°?
ΠΠΊΠΎ ΡΠ΅ ΡΡΠΌΠ½ΡΠ²Π°ΡΠ΅, ΡΠ΅ Kubernetes ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΡΠΈ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π±ΡΡΠ·ΠΎ, ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΠΌ Π²ΠΈ Π΄Π° ΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠ°ΠΌΠΈ. Π ΠΈΠΌΠ΅Π½Π½ΠΎ, ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΡΠ²ΠΎΠΈΡΠ΅ ΡΠΎΠ·ΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π», ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ Π² ΠΊΠ»ΡΡΡΠ΅Ρ Π½Π° Kubernetes. ΠΠΎΠ³Π° Π΄Π° Π³Π°ΡΠ°Π½ΡΠΈΡΠ°ΠΌ ΡΠΎΠ²Π°, Π·Π°ΡΠΎΡΠΎ ΠΏΠΎ ΡΡΡΠ°ΡΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡ, ΠΊΠΎΡΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΡΡΠΊ, ΠΎΠ±ΡΡΠ°Π²Π°ΠΌ Π½Π°ΡΠΈΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ ΠΊΠ°ΠΊ Π΄Π° ΡΠ°Π±ΠΎΡΡΡ Ρ Kubernetes. ΠΠ°ΠΊΠ²ΠΎ ΠΏΡΠ°Π²ΠΈ ΡΠΎΠ²Π° ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎ ΠΎΡ Π΄ΡΡΠ³ΠΈΡΠ΅? ΠΡΡΡΠ½ΠΎΡΡ, ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΡΠ°. Π ΡΠ°ΠΊΠ°, ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΎΡ ΡΠ΅Π·ΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈ Π·Π°ΠΏΠΎΡΠ²Π°Ρ Ρ ΠΎΠ±ΡΡΠ½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΡΡΠΈ Π½Π΅ΡΠ° - ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈΡΠ΅ Π½Π° Kubernetes ΠΈ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈΡΠ΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° kubectl. ΠΠ²ΡΠΎΡΠΈΡΠ΅ Π½Π° ΡΠ΅Π·ΠΈ ΡΡΠ°ΡΠΈΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΠ΅ ΡΠ΅Ρ
Π½ΠΈΡΡ ΡΠΈΡΠ°ΡΠ΅Π» Π΅ Π·Π°ΠΏΠΎΠ·Π½Π°Ρ Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΠΈ Docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅. Π©Π΅ ΡΡΡΠ³Π½Π΅ΠΌ ΠΏΠΎ Π΄ΡΡΠ³ΠΈΡ ΠΏΡΡ. ΠΡΡΠ²ΠΎ, Π½Π΅ΠΊΠ° ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΡ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ Π·Π° Π²ΡΡΠΊΠ° ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³Π°. Π ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΠΌ Ρ Kubernetes ΠΈ ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ Π² ΠΊΠ»ΡΡΡΠ΅Ρ, ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Π½ ΠΎΡ Kubernetes.
Π’ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, Ρ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π΅Π½ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΊΡΠΌ Kubernetes, ΡΠ΅ Π΄Π°Π΄Π΅ Π΄ΡΠ»Π±ΠΎΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ»ΡΡΠ²Π°ΡΠΎΡΠΎ ΡΠ΅, ΠΎΡ ΠΊΠΎΡΡΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡΡ ΡΠΎΠ²Π΅ΠΊ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅, Π·Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ ΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΎΡΡΠΎ Π΅ ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΎ Π²ΡΠΈΡΠΊΠΎ Π² Kubernetes. Kubernetes ΡΡΡ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ Π΅ ΠΏΡΠΎΡΡΠ° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, ΠΏΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠ΅, ΡΠ΅ ΠΊΠΎΠΉΡΠΎ ΠΈΡΠΊΠ° Π΄Π° Ρ ΠΎΠ²Π»Π°Π΄Π΅Π΅ Π·Π½Π°Π΅ ΠΊΡΠ΄Π΅ ΠΈ ΠΊΠ°ΠΊ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°.
Π‘Π΅Π³Π°, Π±Π΅Π· ΠΏΠΎΠ²Π΅ΡΠ΅ ΡΡΠΌ, Π½Π΅ΠΊΠ° ΡΠ΅ Π·Π°Π΅ΠΌΠ΅ΠΌ Ρ ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΠΈ Π΄Π° ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, Ρ ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈΠΌ.
ΠΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
ΠΠ°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΡΠ°ΠΌΠΎ Π΅Π΄Π½Π° ΡΡΠ½ΠΊΡΠΈΡ. ΠΠ·Π΅ΠΌΠ° ΠΊΠ°ΡΠΎ Π²Ρ ΠΎΠ΄ Π΅Π΄Π½ΠΎ ΠΈΠ·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° ΡΠ΅ΠΊΡΡ, ΠΈΠ·Π²ΡΡΡΠ²Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° Π½Π°ΡΡΡΠΎΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠΎΠ²Π° ΠΈΠ·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΊΠ°ΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΎΡΠ΅Π½ΠΊΠ° Π½Π° Π΅ΠΌΠΎΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π½Π° Π°Π²ΡΠΎΡΠ° Π½Π° ΠΈΠ·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΊΡΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΎΠ±Π΅ΠΊΡ.
ΠΡΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΡ ΠΏΡΠΎΠ·ΠΎΡΠ΅Ρ Π½Π° ΡΠΎΠ²Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
Π£Π΅Π± ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° Π½Π°ΡΡΡΠΎΠ΅Π½ΠΈΠ΅ΡΠΎ
ΠΡ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠ° Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ ΡΡΡΡΠΎΠΈ ΠΎΡ ΡΡΠΈ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ, Π²ΡΡΠΊΠ° ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ΡΠ°Π²Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ Π·Π°Π΄Π°ΡΠΈ:
- SA-Frontend Π΅ ΡΠ΅Π± ΡΡΡΠ²ΡΡ Π½Π° Nginx, ΠΊΠΎΠΉΡΠΎ ΠΎΠ±ΡΠ»ΡΠΆΠ²Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° React.
- SA-WebApp Π΅ ΡΠ΅Π± ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π½Π° Java, ΠΊΠΎΠ΅ΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° Π·Π°ΡΠ²ΠΊΠΈ ΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°.
- SA-Logic Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Python, ΠΊΠΎΠ΅ΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° Π½Π°ΡΡΡΠΎΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ΅ΠΊΡΡΠ°.
ΠΠ°ΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ, ΡΠ΅ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈΡΠ΅ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ ΠΈΠ·ΠΎΠ»ΠΈΡΠ°Π½ΠΎ. Π’Π΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ ΠΈΠ΄Π΅ΡΡΠ° Π·Π° "ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π·Π°Π΄ΡΠ»ΠΆΠ΅Π½ΠΈΡΡΠ°", Π½ΠΎ Π² ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°Ρ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ.
ΠΠΎΡΠΎΡΠΈ ΠΎΡ Π΄Π°Π½Π½ΠΈ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
Π Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ°ΡΠ° ΠΏΠΎ-Π³ΠΎΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ Π½ΠΎΠΌΠ΅ΡΠΈΡΠ°Π½ΠΈΡΠ΅ Π΅ΡΠ°ΠΏΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°, ΠΈΠ»ΡΡΡΡΠΈΡΠ°ΡΠΈ ΠΏΠΎΡΠΎΡΠΈΡΠ΅ ΠΎΡ Π΄Π°Π½Π½ΠΈ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΠ΅ΠΊΠ° Π³ΠΈ ΡΠ°Π·Π΄Π΅Π»ΠΈΠΌ:
- ΠΡΠ°ΡΠ·ΡΡΡΡ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΡΠ°ΠΉΠ» ΠΎΡ ΡΡΡΠ²ΡΡΠ°
index.html
(ΠΊΠΎΠ΅ΡΠΎ ΠΎΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π° Π·Π°ΡΠ΅ΠΆΠ΄Π° ΠΏΠ°ΠΊΠ΅ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ React). - ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π° Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΡΠ΅Π± ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° Spring.
- Π£Π΅Π± ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΡΠ΅ΠΏΡΠ°ΡΠ° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π·Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅ΠΊΡΡΠ° ΠΊΡΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Python.
- ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Python Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ° Π½Π°ΡΡΡΠΎΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ΅ΠΊΡΡΠ° ΠΈ Π²ΡΡΡΠ° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° ΠΊΠ°ΡΠΎ ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°.
- ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Spring ΠΈΠ·ΠΏΡΠ°ΡΠ° ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ React (ΠΊΠΎΠ΅ΡΠΎ ΠΎΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π° ΠΏΠΎΠΊΠ°Π·Π²Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° ΠΎΡ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈΡ ΡΠ΅ΠΊΡΡ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ).
ΠΠΎΠ΄ΡΡ Π·Π° Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π½Π°ΠΌΠ΅ΡΠ΅Π½
Π‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°
ΠΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΈ ΡΡΠΈΡΠ΅ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ. ΠΠ΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ Π½Π°ΠΉ-ΠΊΡΠ°ΡΠΈΠ²ΠΎΡΠΎ ΠΎΡ ΡΡΡ - ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΎΡΠΏΡΠ΅Π΄.
βΠΠ°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° React Π·Π° Π»ΠΎΠΊΠ°Π»Π½ΠΎ ΡΠ°Π·Π²ΠΈΡΠΈΠ΅
ΠΠ° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ React ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΌΠΊΠ°ΡΠ° Node.js ΠΈ NPM Π½Π° Π²Π°ΡΠΈΡ ΠΊΠΎΠΌΠΏΡΡΡΡ. Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π°, ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π° Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° sa-frontend
ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
npm install
Π§ΡΠ΅Π· ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° node_modules
ΡΠ΅ ΡΠ΅ Π·Π°ΡΠ΅Π΄ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ React, ΡΠΈΠΈΡΠΎ Π·Π°ΠΏΠΈΡΠΈ ΡΠ° Π²ΡΠ² ΡΠ°ΠΉΠ»Π° package.json
. Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΈΠ·ΡΠ΅Π³Π»ΠΈΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ Π² ΡΡΡΠ°ΡΠ° ΠΏΠ°ΠΏΠΊΠ°, ΠΈΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
npm start
Π’ΠΎΠ²Π° Π΅ Π²ΡΠΈΡΠΊΠΎ. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ React Π²Π΅ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΡΡΠ΅Π· Π½Π°Π²ΠΈΠ³ΠΈΡΠ°Π½Π΅ Π΄ΠΎ Π°Π΄ΡΠ΅ΡΠ° Π½Π° Π±ΡΠ°ΡΠ·ΡΡΠ° localhost:3000
. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π½Π΅ΡΠΎ Π² Π½Π΅Π³ΠΎΠ²ΠΈΡ ΠΊΠΎΠ΄. ΠΠ΅Π΄Π½Π°Π³Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅ Π΅ΡΠ΅ΠΊΡΠ° ΠΎΡ ΡΠ΅Π·ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² Π±ΡΠ°ΡΠ·ΡΡΠ°. Π’ΠΎΠ²Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ°ΠΊΠ° Π½Π°ΡΠ΅ΡΠ΅Π½Π°ΡΠ° "Π³ΠΎΡΠ΅ΡΠ°" ΠΏΠΎΠ΄ΠΌΡΠ½Π° Π½Π° ΠΌΠΎΠ΄ΡΠ»ΠΈΡΠ΅. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΎΠ²Π°, front-end ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° ΡΠ΅ ΠΏΡΠ΅Π²ΡΡΡΠ° Π² ΠΏΡΠΎΡΡΠΎ ΠΈ ΠΏΡΠΈΡΡΠ½ΠΎ ΠΈΠ·ΠΆΠΈΠ²ΡΠ²Π°Π½Π΅.
βΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° React ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ
ΠΠ° ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½ΠΎΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° React ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΎ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΠΌΠ΅ Π² Π½Π°Π±ΠΎΡ ΠΎΡ ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ Π΄Π° Π³ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠΈ ΡΠ΅Π± ΡΡΡΠ²ΡΡ.
ΠΠ° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ React, ΠΎΡΠ½ΠΎΠ²ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°, ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Π΄ΠΎ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° sa-frontend
ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
npm run build
Π’ΠΎΠ²Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° build
. Π’ΠΎΠΉ ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° Π²ΡΠΈΡΠΊΠΈ ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ React.
βΠΠ±ΡΠ»ΡΠΆΠ²Π°Π½Π΅ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Ρ Nginx
ΠΡΡΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΡΠ΅Π± ΡΡΡΠ²ΡΡΠ° Nginx. sa-frontend/build
ΠΊΡΠΌ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° [your_nginx_installation_dir]/html
.
Π‘ ΡΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ ΡΠ°ΠΉΠ»ΡΡ, Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π°ΡΠ΅ΠΌΠ±Π»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ React index.html
ΡΠ΅ Π±ΡΠ΄Π΅ Π½Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° [your_nginx_installation_dir]/html/index.html
. Π’ΠΎΠ²Π° Π΅ ΡΠ°ΠΉΠ»ΡΡ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΡΡΡΠ²ΡΡΡΡ Π½Π° Nginx ΠΈΠ·Π΄Π°Π²Π° ΠΏΡΠΈ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π½Π΅Π³ΠΎ. Π‘ΡΡΠ²ΡΡΡΡ Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ Π΄Π° ΡΠ»ΡΡΠ° Π½Π° ΠΏΠΎΡΡ 80
, Π½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΠΊΠ°ΠΊΡΠΎ ΠΈΡΠΊΠ°ΡΠ΅, ΠΊΠ°ΡΠΎ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΉΠ»Π° [your_nginx_installation_dir]/conf/nginx.conf
.
Π‘Π΅Π³Π° ΠΎΡΠ²ΠΎΡΠ΅ΡΠ΅ Π±ΡΠ°ΡΠ·ΡΡΠ° ΡΠΈ ΠΈ ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Π½Π° localhost:80
. Π©Π΅ Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ React.
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ React, ΠΎΠ±ΡΠ»ΡΠΆΠ²Π°Π½ΠΎ ΠΎΡ Nginx ΡΡΡΠ²ΡΡ
ΠΠΊΠΎ ΡΠ΅Π³Π° Π²ΡΠ²Π΅Π΄Π΅ΡΠ΅ Π½Π΅ΡΠΎ Π² ΠΏΠΎΠ»Π΅ΡΠΎ Type your sentence
ΠΈ Π½Π°ΡΠΈΡΠ½Π΅ΡΠ΅ Π±ΡΡΠΎΠ½Π° Send
- Π½ΠΈΡΠΎ Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ ΡΠ»ΡΡΠΈ. ΠΠΎ Π°ΠΊΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅ ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π·Π° Π³ΡΠ΅ΡΠΊΠ° ΡΠ°ΠΌ. ΠΠ° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΊΡΠ΄Π΅ ΡΠΎΡΠ½ΠΎ Π²ΡΠ·Π½ΠΈΠΊΠ²Π°Ρ ΡΠ΅Π·ΠΈ Π³ΡΠ΅ΡΠΊΠΈ, Π½Π΅ΠΊΠ° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
βΠΠ½Π°Π»ΠΈΠ· Π½Π° ΠΊΠΎΠ΄Π° Π½Π° front-end ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
Π Π°Π·Π³Π»Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π° Π½Π° ΡΠ°ΠΉΠ»Π° App.js
, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΡΠΎΠ²Π°, ΠΊΠ°ΡΠΎ ΡΡΠ°ΠΊΠ½Π΅ΠΌ Π²ΡΡΡ
Ρ Π±ΡΡΠΎΠ½Π° Send
ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΠΌΠ΅ΡΠΎΠ΄ analyzeSentence()
. ΠΠΎΠ΄ΡΡ Π·Π° ΡΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΠΎ-Π΄ΠΎΠ»Ρ. Π ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ°ΠΊΡΠ°, ΡΠ΅ Π·Π° Π²ΡΠ΅ΠΊΠΈ ΡΠ΅Π΄, ΠΊΡΠΌ ΠΊΠΎΠΉΡΠΎ ΠΈΠΌΠ° ΠΊΠΎΠΌΠ΅Π½ΡΠ°Ρ Π½Π° ΡΠΎΡΠΌΡΠ»ΡΡΠ° # ΠΠΎΠΌΠ΅Ρ
, ΠΏΠΎΠ΄ ΠΊΠΎΠ΄Π° ΠΈΠΌΠ° ΠΎΠ±ΡΡΠ½Π΅Π½ΠΈΠ΅. ΠΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½ ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π΄ΡΡΠ³ΠΈ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΈ ΠΎΡ ΠΊΠΎΠ΄.
analyzeSentence() {
fetch('http://localhost:8080/sentiment', { // #1
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
sentence: this.textField.getValue()})// #2
})
.then(response => response.json())
.then(data => this.setState(data)); // #3
}
1. URL Π°Π΄ΡΠ΅ΡΡΡ, ΠΊΡΠΌ ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΏΡΠ°Π²ΠΈ POST Π·Π°ΡΠ²ΠΊΠ°ΡΠ°. ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π° ΡΠ΅, ΡΠ΅ ΡΠΎΠ·ΠΈ Π°Π΄ΡΠ΅Ρ Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠ°ΠΊΠ°ΡΠΎ ΡΠ°ΠΊΠΈΠ²Π° Π·Π°ΡΠ²ΠΊΠΈ.
2.Π’ΡΠ»ΠΎΡΠΎ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°, ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ΠΎ Π΄ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΡΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ΅Π½ ΡΠ΅ΠΊΡΡ Π½Π° Π·Π°ΡΠ²ΠΊΠ°:
{
sentence: "I like yogobella!"
}
3.ΠΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π½Π° Π·Π°ΡΠ²ΠΊΠ°, ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΡΠ΅ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°. Π’ΠΎΠ²Π° Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°. ΠΠΊΠΎ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π΄Π°Π½Π½ΠΈ (Ρ.Π΅. JSON ΠΎΠ±Π΅ΠΊΡ, ΡΡΠ΄ΡΡΠΆΠ°Ρ Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΠΈ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½Π°ΡΠ° ΡΠ΅ΠΊΡΡΠΎΠ²Π° ΠΎΡΠ΅Π½ΠΊΠ°), ΡΠ΅ ΠΈΠ·Π²Π΅Π΄Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Polarity
ΡΡΠΈΠ³Π° Π΄Π° ΡΠ° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡΡΠ°. ΠΡΠΎ ΠΊΠ°ΠΊ ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°:
const polarityComponent = this.state.polarity !== undefined ?
<Polarity sentence={this.state.sentence}
polarity={this.state.polarity}/> :
null;
ΠΠΎΠ΄ΡΡ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°Π±ΠΎΡΠΈ Π΄ΠΎΡΡΠ° Π΄ΠΎΠ±ΡΠ΅. ΠΠ°ΠΊΠ²ΠΎ Π½Π΅ Π΅ Π½Π°ΡΠ΅Π΄ ΡΡΠΊ, Π²ΡΠ΅ ΠΏΠ°ΠΊ? ΠΠΊΠΎ ΠΏΡΠΈΠ΅ΠΌΠ΅ΡΠ΅, ΡΠ΅ Π½Π° Π°Π΄ΡΠ΅ΡΠ°, Π½Π° ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π° Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠΈ POST Π·Π°ΡΠ²ΠΊΠ°, Π²ΡΠ΅ ΠΎΡΠ΅ Π½ΡΠΌΠ° Π½ΠΈΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π΄Π° ΠΏΡΠΈΠ΅ΠΌΠ΅ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΈ ΡΠ°Π·ΠΈ Π·Π°ΡΠ²ΠΊΠ°, ΡΠΎΠ³Π°Π²Π° ΡΠ΅ Π±ΡΠ΄Π΅ΡΠ΅ Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΏΡΠ°Π²ΠΈ. Π ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° Π·Π°ΡΠ²ΠΊΠΈ, ΠΏΠΎΡΡΡΠΏΠ²Π°ΡΠΈ Π½Π° Π°Π΄ΡΠ΅ΡΠ° http://localhost:8080/sentiment
, ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠ΅Π± ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° Spring.
ΠΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ Spring ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠΈΠ΅ΠΌΠ΅ POST Π·Π°ΡΠ²ΠΊΠ°
βΠΠ°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° ΡΠ΅Π± ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° Spring
ΠΠ° Π΄Π° Π²Π½Π΅Π΄ΡΠΈΡΠ΅ Spring ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠΌΠ°ΡΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ JDK8 ΠΈ Maven ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°. Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ ΠΏΠΎ Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ.
βΠΠ°ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π² jar ΡΠ°ΠΉΠ»
ΠΡΠΈΠ΄Π΅ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π° Π΄ΠΎ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° sa-webapp
ΠΈ Π²ΡΠ²Π΅Π΄Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
mvn install
Π‘Π»Π΅Π΄ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° sa-webapp
ΡΠ΅ Π±ΡΠ΄Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ target
. Π’ΠΎΠ²Π° Π΅ ΠΌΡΡΡΠΎΡΠΎ, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ Java ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ°Π½ΠΎ Π² jar ΡΠ°ΠΉΠ», ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ ΠΎΡ ΡΠ°ΠΉΠ»Π° sentiment-analysis-web-0.0.1-SNAPSHOT.jar
.
βΠ‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Java ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
ΠΡΠΈΠ΄Π΅ΡΠ΅ Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° target
ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΡΡ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar
Π©Π΅ Π²ΡΠ·Π½ΠΈΠΊΠ½Π΅ Π³ΡΠ΅ΡΠΊΠ° ΠΏΡΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°. ΠΠ° Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Π΄Π° Π³ΠΎ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°ΠΌΠ΅, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π΄Π΅ΡΠ°ΠΉΠ»ΠΈΡΠ΅ Π½Π° ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π² Π΄Π°Π½Π½ΠΈΡΠ΅ Π·Π° ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ΅ΠΊΠ°:
Error creating bean with name 'sentimentController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'sa.logic.api.url' in value "${sa.logic.api.url}"
ΠΠ° Π½Π°Ρ Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΎΡΠΎ ΡΡΠΊ Π΅ ΡΠΏΠΎΠΌΠ΅Π½Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΠΈΠ·ΡΡΠ½ΡΠ²Π°Π½Π΅ Π½Π° ΡΠΌΠΈΡΡΠ»Π° sa.logic.api.url
. ΠΠ΅ΠΊΠ° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ΄Π°, ΠΊΡΠ΄Π΅ΡΠΎ Π²ΡΠ·Π½ΠΈΠΊΠ²Π° Π³ΡΠ΅ΡΠΊΠ°ΡΠ°.
βΠΠ½Π°Π»ΠΈΠ· Π½Π° ΠΊΠΎΠ΄Π° Π½Π° Java ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
ΠΡΠΎ ΠΊΠΎΠ΄ΠΎΠ²ΠΈΡ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ, ΠΊΡΠ΄Π΅ΡΠΎ Π²ΡΠ·Π½ΠΈΠΊΠ²Π° Π³ΡΠ΅ΡΠΊΠ°ΡΠ°.
@CrossOrigin(origins = "*")
@RestController
public class SentimentController {
@Value("${sa.logic.api.url}") // #1
private String saLogicApiUrl;
@PostMapping("/sentiment")
public SentimentDto sentimentAnalysis(
@RequestBody SentenceDto sentenceDto)
{
RestTemplate restTemplate = new RestTemplate();
return restTemplate.postForEntity(
saLogicApiUrl + "/analyse/sentiment", // #2
sentenceDto, SentimentDto.class)
.getBody();
}
}
- Π Π‘
entimentController
ΠΈΠΌΠ° ΠΏΠΎΠ»Π΅saLogicApiUrl
. Π‘ΡΠΎΠΉΠ½ΠΎΡΡΡΠ° ΠΌΡ ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΎΡ ΠΈΠΌΠΎΡΠ°sa.logic.api.url
. - ΡΠ΅Π΄
saLogicApiUrl
ΡΠ²ΡΡΠ·Π²Π° ΡΡΡ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ°/analyse/sentiment
. ΠΠ°Π΅Π΄Π½ΠΎ ΡΠ΅ ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Ρ Π°Π΄ΡΠ΅Ρ Π·Π° ΠΎΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ ΠΊΡΠΌ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³Π°ΡΠ°, ΠΊΠΎΡΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° ΡΠ΅ΠΊΡΡ.
βΠΠ°Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ Π½Π° ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΡΠΎ
ΠΡΠ΅Π· ΠΏΡΠΎΠ»Π΅ΡΡΠ° ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΡΡ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΡΠ²ΠΎΠΉΡΡΠ²Π°ΡΠ° Π΅ ΡΠ°ΠΉΠ» application.properties
, ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π° sa-webapp/src/main/resources
. ΠΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ ΠΌΡ Π½Π΅ Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΈΡΡ Π½Π°ΡΠΈΠ½ Π·Π° Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π½Π° ΡΠ²ΠΎΠΉΡΡΠ²Π°. ΠΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠΎ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π° ΡΡΡ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=WHAT.IS.THE.SA.LOGIC.API.URL
Π‘ΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠΎΠ²Π° ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠΎΡΠΈ ΠΊΡΠΌ Π°Π΄ΡΠ΅ΡΠ° Π½Π° Π½Π°ΡΠ΅ΡΠΎ Python ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
ΠΠ°ΡΠΎ Π³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅, ΠΊΠ°Π·Π²Π°ΠΌΠ΅ Π½Π° ΡΠ΅Π± ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Spring ΠΊΡΠ΄Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΡΠΈΠ΄Π΅, Π·Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ Π·Π°ΡΠ²ΠΊΠΈ Π·Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° ΡΠ΅ΠΊΡΡ.
ΠΠ° Π΄Π° Π½Π΅ ΡΠΈ ΡΡΠ»ΠΎΠΆΠ½ΡΠ²Π°ΠΌΠ΅ ΠΆΠΈΠ²ΠΎΡΠ°, ΡΠ΅ ΡΠ΅ΡΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Python Π΄Π° Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π½Π° localhost:5000
ΠΈ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΉΡΠ΅ Π΄Π° Π½Π΅ Π³ΠΎ Π·Π°Π±ΡΠ°Π²ΡΡΠ΅. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Spring ΡΠ΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=http://localhost:5000
Π Π½Π°ΡΠ°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π»ΠΈΠΏΡΠ²Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Python
Π‘Π΅Π³Π° ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Python ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΡΠΏΠΎΡΠ΅Π΄ ΠΎΡΠ°ΠΊΠ²Π°Π½ΠΈΡΡΠ°.
βΠΠ°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Python
ΠΠ° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Python, ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ Python 3 ΠΈ Pip ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°.
βΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
ΠΡΠΈΠ΄Π΅ΡΠ΅ Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° sa-logic/sa
ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ:
python -m pip install -r requirements.txt
python -m textblob.download_corpora
βΠ‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
Π‘ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΡΠΌΠ΅ Π³ΠΎΡΠΎΠ²ΠΈ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ:
python sentiment_analysis.py
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΡΠ°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΡΠ΅ Π½ΠΈ Π±ΡΠ΄Π΅ ΠΊΠ°Π·Π°Π½ΠΎ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ°Π±ΠΎΡΠΈ ΠΈ ΡΠ°ΠΊΠ° Π·Π°ΡΠ²ΠΊΠΈ Π½Π° localhost:5000/
βΠΡΠΎΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄
ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Python, Π·Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ:
from textblob import TextBlob
from flask import Flask, request, jsonify
app = Flask(__name__) #1
@app.route("/analyse/sentiment", methods=['POST']) #2
def analyse_sentiment():
sentence = request.get_json()['sentence'] #3
polarity = TextBlob(sentence).sentences[0].polarity #4
return jsonify( #5
sentence=sentence,
polarity=polarity
)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000) #6
- ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΎΠ±Π΅ΠΊΡ
Flask
. - ΠΠΎΡΠΎΡΠ²Π°Π½Π΅ Π½Π° Π°Π΄ΡΠ΅ΡΠ° Π·Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° POST Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ Π½Π΅Π³ΠΎ.
- ΠΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΎΡΡ
sentence
ΠΎΡ ΡΡΠ»ΠΎΡΠΎ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°. - ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° Π°Π½ΠΎΠ½ΠΈΠΌΠ΅Π½ ΠΎΠ±Π΅ΠΊΡ
TextBlob
ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ°polarity
Π·Π° ΠΏΡΡΠ²ΠΎΡΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ Π² ΡΡΠ»ΠΎΡΠΎ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° (Π² Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΡΠΎΠ²Π° Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎΡΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ΠΎ Π·Π° Π°Π½Π°Π»ΠΈΠ·). - ΠΡΡΡΠ°Π½Π΅ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡ, ΡΠΈΠ΅ΡΠΎ ΡΡΠ»ΠΎ ΡΡΠ΄ΡΡΠΆΠ° ΡΠ΅ΠΊΡΡΠ° Π½Π° ΠΎΡΠ΅ΡΡΠ°ΡΠ° ΠΈ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ Π·Π° Π½Π΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»
polarity
. - Π‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Flask, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π½Π°
0.0.0.0:5000
(ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠΎ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π½Π΅Π³ΠΎ, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Π½Π° ΡΠΎΡΠΌΡΠ»ΡΡΠ°localhost:5000
).
Π‘Π΅Π³Π° ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΡΡΡΠ°Π²ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΡΠ°Π±ΠΎΡΡΡ. Π’Π΅ ΡΠ° Π½Π°ΡΡΡΠΎΠ΅Π½ΠΈ Π΄Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°Ρ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ. ΠΡΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΡ Π΅ΠΌΠ°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ ΠΎΡ ΡΠ°Π±ΠΎΡΠ°ΡΠ°.
ΠΡΠΈΡΠΊΠΈ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΡΡΡΠ°Π²Π»ΡΠ²Π°Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΡΠ΅ ΠΏΡΠΈΠ²Π΅ΠΆΠ΄Π°Ρ Π² Π·Π΄ΡΠ°Π²ΠΎΡΠ»ΠΎΠ²Π½ΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅
Π‘Π΅Π³Π°, ΠΏΡΠ΅Π΄ΠΈ Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΠΌ, ΠΎΡΠ²ΠΎΡΠ΅ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ React Π² Π±ΡΠ°ΡΠ·ΡΡ ΠΈ ΠΎΠΏΠΈΡΠ°ΠΉΡΠ΅ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½ΡΠΊΠΎΠ΅ ΠΈΠ·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Ρ Π½Π΅Π³ΠΎ. ΠΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ - ΡΠ»Π΅Π΄ Π½Π°ΡΠΈΡΠΊΠ°Π½Π΅ Π½Π° Π±ΡΡΠΎΠ½Π° Send
ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΠΎΠ΄ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΡΠΎ ΠΏΠΎΠ»Π΅.
Π ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΡΠ°Π·Π΄Π΅Π» ΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π½Π°ΡΠΈΡΠ΅ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ Π² Docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ. Π’ΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, Π·Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ° Kubernetes.
ΠΠΎΠΊΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ
ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π΅ Π»Π΅ΠΊ, ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π΅Π½, ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΠΏΠ°ΠΊΠ΅Ρ, ΠΊΠΎΠΉΡΠΎ ΡΡΠ΄ΡΡΠΆΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΊΠ»ΡΡΠ²Π° Π²ΡΠΈΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΌΡ: ΠΊΠΎΠ΄ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΡΡΠ΅Π΄Π° Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ. ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΊΠ°ΠΊΡΠΎ Π² ΡΡΠ΅Π΄ΠΈ Π½Π° Linux, ΡΠ°ΠΊΠ° ΠΈ Π² Windows ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ΅ ΡΠ°Π±ΠΎΡΡΡ ΠΏΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°.
Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Π½Π° Π²ΡΠ΅ΠΊΠΈ ΠΊΠΎΠΌΠΏΡΡΡΡ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ΠΈ ΡΡΡΠ²ΡΡΠΈ, ΠΈ Π²ΡΠ² Π²ΡΡΠΊΠ° ΡΡΠ΅Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ°, ΡΡΠ΄ΡΡΠΆΠ°ΡΠΈ ΡΠ΅ Π² ΡΡΡ , ΡΠ΅ ΡΠ°Π±ΠΎΡΡΡ ΠΏΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½.
ΠΠ° Π΄Π° ΠΏΡΠΎΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅ ΠΈ Π΄Π° Π³ΠΈ ΡΡΠ°Π²Π½ΠΈΠΌ Ρ Π΄ΡΡΠ³ΠΈ Π½Π°ΡΠΈΠ½ΠΈ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½Π΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π·Π° ΠΎΠ±ΡΠ»ΡΠΆΠ²Π°Π½Π΅ Π½Π° React ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ.
βΠΠ±ΡΠ»ΡΠΆΠ²Π°Π½Π΅ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° React ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°
ΠΠΏΠΈΡΠ²Π°ΠΉΠΊΠΈ ΡΠ΅ Π΄Π° ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ, ΡΠ΅ ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ°ΠΌΠ΅ ΡΡΡ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ:
- ΠΠ΅Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΡΡΡΡΠΈΡΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²ΡΡΠΊΠ° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° Π΅ ΡΡΠ»ΠΎΡΡΠ½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°.
- ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°. Π’ΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΡΠ°Π±ΠΎΡΠΈ Π½Π° Π½ΡΠΊΠΎΠΉ Π»ΠΎΠΊΠ°Π»Π΅Π½ ΠΊΠΎΠΌΠΏΡΡΡΡ, ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½ ΡΡΡΠ²ΡΡ.
- ΠΠ°Π²Π½ΠΎ ΠΈ ΠΈΠ·ΠΈΡΠΊΠ²Π°ΡΠΎ ΡΠ΅ΡΡΡΡΠΈ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°.
Nginx ΡΠ΅Π± ΡΡΡΠ²ΡΡ, ΠΎΠ±ΡΠ»ΡΠΆΠ²Π°Ρ ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΡΠ°Π±ΠΎΡΠ΅ΡΠΈ Π²ΡΠ² Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°
ΠΠΊΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΡΠΎΠ³Π°Π²Π° Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈΡΠ΅ ΠΌΠ°ΡΠΈΠ½ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠ°Ρ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΠΈΠ»Π½ΠΈ ΡΡΡΠ°Π½ΠΈ:
- ΠΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΡΡΡΡΠΈΡΠ΅: ΡΠ°Π±ΠΎΡΠ° Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Docker.
- ΠΠ΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ°. ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΠΊΠΎΠΉΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ° Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈΡ ΡΠΈ ΠΊΠΎΠΌΠΏΡΡΡΡ, ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ Π½Π°Π²ΡΡΠΊΡΠ΄Π΅.
- ΠΠ΅ΠΊΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ ΡΡΠ΅Π· ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ»ΠΎΠ΅Π²Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ.
Nginx ΡΠ΅Π± ΡΡΡΠ²ΡΡ, ΠΎΠ±ΡΠ»ΡΠΆΠ²Π°Ρ ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΡΠ°Π±ΠΎΡΠ΅ΡΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
Π‘ΡΠ°Π²Π½ΠΈΡ
ΠΌΠ΅ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ ΡΠ°ΠΌΠΎ ΠΏΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠΎΡΠΊΠΈ, Π½ΠΎ Π΄ΠΎΡΠΈ ΠΈ ΡΠΎΠ²Π° Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ, Π·Π° Π΄Π° ΡΡΠ΅ΡΠΈΡΠ΅ ΡΠΈΠ»Π½ΠΈΡΠ΅ ΡΡΡΠ°Π½ΠΈ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅.
βΠΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π·Π° React ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
ΠΡΠ½ΠΎΠ²Π½ΠΈΡΡ Π³ΡΠ°Π΄ΠΈΠ²Π΅Π½ Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π½Π° Docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π΅ ΡΠ°ΠΉΠ»ΡΡ Dockerfile
. Π Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» ΡΠ΅ Π·Π°ΠΏΠΈΡΠ²Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π²ΠΊΠ»ΡΡΠ²Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ ΠΎΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ, ΠΏΠΎΠΊΠ°Π·Π²Π°ΡΠΈ ΠΊΠ°ΠΊ Π΄Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΠΊΠΎΠΉΡΠΎ Π΄Π° ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° Π½ΡΠΆΠ΄ΠΈΡΠ΅ Π½Π° Π΄Π°Π΄Π΅Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
ΠΡΠ΅Π΄ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠ°ΠΉΠ»Π° Dockerfile
, ΡΠΏΠΎΠΌΠ½Π΅ΡΠ΅ ΡΠΈ ΠΊΠ°ΠΊΠ²ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡ
ΠΌΠ΅, Π·Π° Π΄Π° ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΠΈΠΌ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ React Π·Π° ΠΊΠ°ΡΠ²Π°Π½Π΅ Π½Π° ΡΡΡΠ²ΡΡΠ° Π½Π° Nginx:
- ΠΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ React (
npm run build
). - Π‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΡΠ²ΡΡΠ° Nginx.
- ΠΠΎΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ
build
ΠΎΡ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°sa-frontend
ΠΊΡΠΌ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ°nginx/html
.
ΠΠΎ-Π΄ΠΎΠ»Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΏΠ°ΡΠ°Π»Π΅Π»ΠΈΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΈ Π³ΠΎΡΠ½ΠΈΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΈΠ·Π²ΡΡΡΠ΅Π½ΠΈ Π½Π° Π»ΠΎΠΊΠ°Π»Π½ΠΈΡ ΠΊΠΎΠΌΠΏΡΡΡΡ.
βΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° Dockerfile Π·Π° SA-Frontend ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
ΠΠ½ΡΡΡΡΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ Π² Dockerfile
Π·Π° ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΡΡΠ²Π°Π½Π΅ SA-Frontend
, ΡΠ΅ ΡΡΡΡΠΎΠΈ ΡΠ°ΠΌΠΎ ΠΎΡ Π΄Π²Π° ΠΎΡΠ±ΠΎΡΠ°. Π€Π°ΠΊΡ Π΅, ΡΠ΅ Π΅ΠΊΠΈΠΏΡΡ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Nginx Π΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΠΈΠ» ΠΎΡΠ½ΠΎΠ²Π΅Π½
- Π’ΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Nginx ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
- Π‘ΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΠΏΠΊΠ°ΡΠ°
sa-frontend/build
ΡΡΡΠ±Π²Π° Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡnginx/html
.
ΠΠΊΠΎ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΎΡ ΡΠΎΠ²Π° ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΡΠΌ ΡΠ°ΠΉΠ»Π° Dockerfile
, ΡΠΎΠ³Π°Π²Π° ΡΠ΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
FROM nginx
COPY build /usr/share/nginx/html
ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅, Π²ΡΠΈΡΠΊΠΎ ΡΡΠΊ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΠΎ, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ°ΠΉΠ»Π° Π΄ΠΎΡΠΈ ΡΠ΅ ΠΎΠΊΠ°Π·Π²Π° Π΄ΠΎΡΡΠ° ΡΠ΅ΡΠ»ΠΈΠ²ΠΎ ΠΈ ΡΠ°Π·Π±ΠΈΡΠ°Π΅ΠΌΠΎ. Π’ΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» ΠΊΠ°Π·Π²Π° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π΄Π° Π²Π·Π΅ΠΌΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ nginx
Ρ Π²ΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π²Π΅ΡΠ΅ ΠΈΠΌΠ°, ΠΈ ΠΊΠΎΠΏΠΈΡΠ°ΠΉΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° build
ΠΊΡΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° nginx/html
.
Π’ΡΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ Π²ΡΠΏΡΠΎΡ ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π·Π½Π°ΠΌ ΠΊΡΠ΄Π΅ ΡΠΎΡΠ½ΠΎ Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΠΌ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ ΠΎΡ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° build
, Ρ.Π΅. ΠΎΡΠΊΡΠ΄Π΅ Π΅ ΡΡΡΠ³Π½Π°Π» ΠΏΡΡΡΡ /usr/share/nginx/html
. ΠΡΡΡΠ½ΠΎΡΡ ΠΈ ΡΡΠΊ Π½ΡΠΌΠ° Π½ΠΈΡΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ. Π€Π°ΠΊΡ Π΅, ΡΠ΅ ΡΡΠΎΡΠ²Π΅ΡΠ½Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π½Π°ΠΌΠ΅ΡΠ΅Π½Π° Π²
βΠ‘Π³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ ΠΊΠ°ΡΠ²Π°Π½Π΅ΡΠΎ ΠΌΡ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΠΌ ΡΡΡ Π·Π°Π²ΡΡΡΠ΅Π½ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΡΠ°ΡΠΈΠΌ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ. ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠΎΠ²Π°, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π±Π΅Π·ΠΏΠ»Π°ΡΠ½Π°ΡΠ° ΠΎΠ±Π»Π°ΡΠ½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° Π·Π° Ρ ΠΎΡΡΠΈΠ½Π³ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Docker Hub. ΠΠ° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ ΠΎΡ ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
- ΡΡΡΠ°Π½ΠΎΠ²ΡΡ
Π΄ΠΎΠΊΠ΅Ρ . - Π Π΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΉΡΠ΅ ΡΠ΅ Π½Π° ΡΠ°ΠΉΡΠ° Π½Π° Docker Hub.
- ΠΠ»Π΅Π·ΡΠ΅ Π² Π°ΠΊΠ°ΡΠ½ΡΠ° ΡΠΈ, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°:
docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"
Π‘Π΅Π³Π° ΡΡΡΠ±Π²Π°, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°, ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° sa-frontend
ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ°ΠΌ:
docker build -f Dockerfile -t $DOCKER_USER_ID/sentiment-analysis-frontend .
Π’ΡΠΊ ΠΈ ΠΏΠΎ-Π΄ΠΎΠ»Ρ Π² ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ $DOCKER_USER_ID
ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΎ Ρ Π²Π°ΡΠ΅ΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎ ΠΈΠΌΠ΅ Π² Docker Hub. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°Π·ΠΈ ΡΠ°ΡΡ ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°: rinormaloku/sentiment-analysis-frontend
.
Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΠ°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΡΠΊΡΠ°ΡΠ΅Π½Π°, ΠΊΠ°ΡΠΎ ΡΠ΅ ΠΏΡΠ΅ΠΌΠ°Ρ
Π½Π΅ ΠΎΡ Π½Π΅Ρ -f Dockerfile
, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΠ°ΠΏΠΊΠ°ΡΠ°, Π² ΠΊΠΎΡΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΠΌΠ΅ ΡΠ°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°, Π²Π΅ΡΠ΅ ΠΈΠΌΠ° ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ».
ΠΠ° Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠΈΠΌ Π³ΠΎΡΠΎΠ²ΠΎΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ, ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
docker push $DOCKER_USER_ID/sentiment-analysis-frontend
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π³ΠΎ Π·Π°Π²ΡΡΡΠΈΡΠ΅, ΠΏΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅ ΡΠΏΠΈΡΡΠΊΠ° ΡΠΈ Ρ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π² Docker Hub, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ Π΄Π°Π»ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ΅Π½ΠΎ Π² ΠΎΠ±Π»Π°ΡΠ½ΠΎΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅.
βΠ‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
Π‘Π΅Π³Π° Π²ΡΠ΅ΠΊΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΠΈ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ ΠΊΠ°ΡΠΎ $DOCKER_USER_ID/sentiment-analysis-frontend
. ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡ ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ:
docker pull $DOCKER_USER_ID/sentiment-analysis-frontend
docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend
Π‘Π΅Π³Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡΡ ΡΠ°Π±ΠΎΡΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΠΌ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΠΌ, ΠΊΠ°ΡΠΎ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π΄ΡΡΠ³ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ. ΠΠΎ ΠΏΡΠ΅Π΄ΠΈ Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΠΌ, Π½Π΅ΠΊΠ° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ Π΄ΠΈΠ·Π°ΠΉΠ½Π° 80:80
, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΎΠ±ΡΡΠΊΠ²Π°ΡΠΎ.
- ΠΡΡΠ²ΠΎ ΡΠΈΡΠ»ΠΎ
80
Π΅ Π½ΠΎΠΌΠ΅ΡΡΡ Π½Π° ΠΏΠΎΡΡΠ° Π½Π° Ρ ΠΎΡΡΠ° (Ρ.Π΅. Π»ΠΎΠΊΠ°Π»Π½ΠΈΡ ΠΊΠΎΠΌΠΏΡΡΡΡ). - ΠΡΠΎΡΠΎ ΡΠΈΡΠ»ΠΎ
80
Π΅ ΠΏΠΎΡΡΡΡ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΊΡΠΌ ΠΊΠΎΠΉΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ΅Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°.
Π Π°Π·Π³Π»Π΅Π΄Π°ΠΉΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΈΠ»ΡΡΡΡΠ°ΡΠΈΡ.
ΠΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΡΡΠΎΠ²Π΅
Π‘ΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΠΏΡΠ΅ΠΏΡΠ°ΡΠ° Π·Π°ΡΠ²ΠΊΠΈ ΠΎΡ ΠΏΠΎΡΡΠ° <hostPort>
Π΄ΠΎ ΠΏΡΠΈΡΡΠ°Π½ΠΈΡΠ΅ΡΠΎ <containerPort>
. Π’ΠΎΠ΅ΡΡ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΏΠΎΡΡΠ° 80
ΠΊΠΎΠΌΠΏΡΡΡΡΡΡ Π΅ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ΅Π½ ΠΊΡΠΌ ΠΏΠΎΡΡ 80
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ.
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠΈΡΡΠ°Π½ΠΈΡΠ΅ΡΠΎ 80
ΠΎΡΠ²ΠΎΡΠ΅Π½ΠΎ Π½Π° Π»ΠΎΠΊΠ°Π»Π½ΠΈΡ ΠΊΠΎΠΌΠΏΡΡΡΡ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΎΡ ΡΠΎΠ·ΠΈ ΠΊΠΎΠΌΠΏΡΡΡΡ Π½Π° Π°Π΄ΡΠ΅Ρ localhost:80
. ΠΠΊΠΎ Π²Π°ΡΠ°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Docker, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° Docker, ΡΠΈΠΉΡΠΎ Π°Π΄ΡΠ΅Ρ ΡΠ΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ° <docker-machine ip>:80
. ΠΠ° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ IP Π°Π΄ΡΠ΅ΡΠ° Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° Docker, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° docker-machine ip
.
Π ΡΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ, ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡΡ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ ΠΏΡΠ΅Π΄Π½ΠΈΡ ΠΊΡΠ°ΠΉ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΡΡΡΠ±Π²Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΡΠ²ΠΎΡΠΈΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° ΠΌΡ Π² Π±ΡΠ°ΡΠ·ΡΡ.
β.dockerignore ΡΠ°ΠΉΠ»
ΠΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ SA-Frontend
, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΠΌ, ΡΠ΅ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π±Π°Π²Π΅Π½. Π’ΠΎΠ²Π° Π΅ ΡΠ°ΠΊΠ°, Π·Π°ΡΠΎΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΡΡ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ Π΄ΠΎ Π΄Π΅ΠΌΠΎΠ½Π° Π½Π° Docker. ΠΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ°, ΠΊΠΎΡΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ, ΡΠ΅ Π΄Π°Π²Π° ΠΊΠ°ΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π΅Π½ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° docker build
. Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ Π² ΠΊΡΠ°Ρ Π½Π° ΡΠ°Π·ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΠΌΠ° ΡΠΎΡΠΊΠ°. Π’ΠΎΠ²Π° Π²ΠΎΠ΄ΠΈ Π΄ΠΎ Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΡΡΡΡΠΊΡΡΡΠ° Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π½Π° Π°ΡΠ΅ΠΌΠ±Π»ΠΈΡΠ°Π½Π΅ΡΠΎ:
sa-frontend:
| .dockerignore
| Dockerfile
| package.json
| README.md
+---build
+---node_modules
+---public
---src
ΠΠΎ ΠΎΡ Π²ΡΠΈΡΠΊΠΈ ΠΏΠ°ΠΏΠΊΠΈ, ΠΏΡΠΈΡΡΡΡΠ²Π°ΡΠΈ ΡΡΠΊ, ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΡΠ°ΠΌΠΎ ΠΎΡ ΠΏΠ°ΠΏΠΊΠ° build
. ΠΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ΡΠΎ Π½Π° Π½Π΅ΡΠΎ Π΄ΡΡΠ³ΠΎ Π΅ Π·Π°Π³ΡΠ±Π° Π½Π° Π²ΡΠ΅ΠΌΠ΅. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠΊΠΎΡΠΈΡΠ΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ, ΠΊΠ°ΡΠΎ ΠΊΠ°ΠΆΠ΅ΡΠ΅ Π½Π° Docker ΠΊΠΎΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Π΄Π° ΠΈΠ³Π½ΠΎΡΠΈΡΠ°. ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠΎΠ²Π°, ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΡΠ°ΠΉΠ» .dockerignore
. ΠΠΈΠ΅, Π°ΠΊΠΎ ΡΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°ΡΠΈ Ρ ΡΠ°ΠΉΠ»Π° .gitignore
, ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΡΠ΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎΠ·Π½Π°ΡΠ°. Π’ΠΎΠΉ ΠΈΠ·Π±ΡΠΎΡΠ²Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ³Π½ΠΎΡΠΈΡΠ°. Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
node_modules
src
public
Π΄ΠΎΡΠΈΠ΅ .dockerignore
ΡΡΡΠ±Π²Π° Π΄Π° Π΅ Π² ΡΡΡΠ°ΡΠ° ΠΏΠ°ΠΏΠΊΠ° ΠΊΠ°ΡΠΎ ΡΠ°ΠΉΠ»Π° Dockerfile
. Π‘Π΅Π³Π° ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ ΠΎΡΠ½Π΅ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ.
ΠΠ΅ΠΊΠ° ΡΠ΅Π³Π° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π° Java ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
βΠΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π·Π° Java ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
ΠΠ½Π°Π΅ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΠΈ Π²Π΅ΡΠ΅ ΡΡΠ΅ Π½Π°ΡΡΠΈΠ»ΠΈ Π²ΡΠΈΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ½ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ. ΠΡΠΎ Π·Π°ΡΠΎ ΡΠΎΠ·ΠΈ ΡΠ°Π·Π΄Π΅Π» ΡΠ΅ Π±ΡΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΡΠ°ΡΡΠΊ.
ΠΡΠ²ΠΎΡΠ΅ΡΠ΅ ΡΠ°ΠΉΠ»Π° Dockerfile
, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° sa-webapp
. ΠΠΊΠΎ ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΡΠ΅ΠΊΡΡΠ° Π½Π° ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ», ΡΠΎΠ³Π°Π²Π° Π² Π½Π΅Π³ΠΎ ΡΠ΅ ΡΡΠ΅ΡΠ½Π΅ΡΠ΅ ΡΠ°ΠΌΠΎ Π΄Π²Π΅ Π½ΠΎΠ²ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ Π·Π°ΠΏΠΎΡΠ²Π°Ρ Ρ ΠΊΠ»ΡΡΠΎΠ²ΠΈ Π΄ΡΠΌΠΈ ENV
ΠΈ EXPOSE
:
ENV SA_LOGIC_API_URL http://localhost:5000
β¦
EXPOSE 8080
ΠΠ»ΡΡΠΎΠ²Π° Π΄ΡΠΌΠ° ENV
Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° Π² Docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ. ΠΠΎ-ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ, Π² Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ URL Π·Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ API Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° ΡΠ΅ΠΊΡΡ.
ΠΠ»ΡΡΠΎΠ²Π° Π΄ΡΠΌΠ° EXPOSE
Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΊΠ°ΠΆΠ΅ΡΠ΅ Π½Π° Docker Π΄Π° ΠΎΡΠ²ΠΎΡΠΈ ΠΏΠΎΡΡ. Π©Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠΎΠ·ΠΈ ΠΏΠΎΡΡ, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΠ°Π±ΠΎΡΠΈΠΌ Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. Π’ΡΠΊ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΠΎΠ²Π° Π² Dockerfile
Π·Π° ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΡΡΠ²Π°Π½Π΅ SA-Frontend
Π½ΡΠΌΠ° ΡΠ°ΠΊΠ°Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°. Π’ΠΎΠ²Π° Π΅ ΡΠ°ΠΌΠΎ Π·Π° ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ°, Ρ Π΄ΡΡΠ³ΠΈ Π΄ΡΠΌΠΈ, ΡΠ°Π·ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Π΅ Π·Π° ΡΠΈΡΠ°ΡΠ΅Π»Ρ Dockerfile
.
ΠΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ΡΠΎ ΠΌΡ Π² Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠΎΡΠ½ΠΎ ΠΊΠ°ΡΠΎ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ. ΠΠΊΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ²Π΅ΡΠ΅Π½ΠΈ Π² ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈΡΠ΅ ΡΠΈ, ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈ Π²ΡΠ² ΡΠ°ΠΉΠ»Π° README.md
Π² ΠΏΠ°ΠΏΠΊΠ° sa-webapp
.
βΠΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Python
ΠΠΊΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ°ΠΉΠ»Π° Dockerfile
Π² ΠΏΠ°ΠΏΠΊΠ° sa-logic
Π½ΡΠΌΠ° Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π½ΠΈΡΠΎ Π½ΠΎΠ²ΠΎ ΡΠ°ΠΌ. ΠΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ΡΠΎ ΠΌΡ Π² Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π²Π΅ΡΠ΅ Π΄Π° ΡΠ° Π²ΠΈ ΠΏΠΎΠ·Π½Π°ΡΠΈ, Π½ΠΎ, ΠΊΠ°ΠΊΡΠΎ Π² ΡΠ»ΡΡΠ°Ρ Ρ Π΄ΡΡΠ³ΠΈΡΠ΅ Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈ Π²ΡΠ² ΡΠ°ΠΉΠ»Π° README.md
Π² ΠΏΠ°ΠΏΠΊΠ° sa-logic
.
βΠ’Π΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
ΠΠΎΠΆΠ΅ΡΠ΅ Π»ΠΈ Π΄Π° ΡΠ΅ Π΄ΠΎΠ²Π΅ΡΠΈΡΠ΅ Π½Π° Π½Π΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π½Π΅ ΡΡΠ΅ ΡΠ΅ΡΡΠ²Π°Π»ΠΈ? Π Π°Π· Π½Π΅ ΠΌΠΎΠ³Π°. ΠΠ΅ΠΊΠ° ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ Π½Π°ΡΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ.
- ΠΠ΅ΠΊΠ° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
sa-logic
ΠΈ Π³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΉΡΠ΅ Π΄Π° ΡΠ»ΡΡΠ° Π½Π° ΠΏΠΎΡΡ5050
:docker run -d -p 5050:5000 $DOCKER_USER_ID/sentiment-analysis-logic
- ΠΠ΅ΠΊΠ° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
sa-webapp
ΠΈ Π³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΉΡΠ΅ Π΄Π° ΡΠ»ΡΡΠ° Π½Π° ΠΏΠΎΡΡ8080
. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ ΠΏΠΎΡΡΠ°, Π½Π° ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Python ΡΠ΅ ΡΠ»ΡΡΠ° Π·Π° Π·Π°ΡΠ²ΠΊΠΈ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Java, ΠΊΠ°ΡΠΎ ΠΏΡΠ΅Π½Π°Π·Π½Π°ΡΠΈΠΌ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°SA_LOGIC_API_URL
:$ docker run -d -p 8080:8080 -e SA_LOGIC_API_URL='http://<container_ip or docker machine ip>:5000' $DOCKER_USER_ID/sentiment-analysis-web-app
ΠΠ° Π΄Π° Π½Π°ΡΡΠΈΡΠ΅ ΠΊΠ°ΠΊ Π΄Π° ΠΎΡΠΊΡΠΈΠ΅ΡΠ΅ IP Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΈΠ»ΠΈ Docker VM, Π²ΠΈΠΆΡΠ΅ ΡΠ°ΠΉΠ»Π°
ΠΠ΅ΠΊΠ° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ sa-frontend
:
docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend
Π‘Π΅Π³Π° Π²ΡΠΈΡΠΊΠΎ Π΅ Π³ΠΎΡΠΎΠ²ΠΎ Π·Π° Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ Π² Π±ΡΠ°ΡΠ·ΡΡΠ° Π΄ΠΎ Π°Π΄ΡΠ΅ΡΠ° localhost:80
ΠΈ ΡΠ΅ΡΡΠ²Π°ΠΉΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
ΠΠΎΠ»Ρ, ΠΈΠΌΠ°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ Π°ΠΊΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΠΏΠΎΡΡΠ° Π·Π° sa-webapp
, ΠΈΠ»ΠΈ Π°ΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Docker VM, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΉΠ»Π° App.js
ΠΎΡ ΠΏΠ°ΠΏΠΊΠ° sa-frontend
ΡΡΠ΅Π· ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° IP Π°Π΄ΡΠ΅ΡΠ° ΠΈΠ»ΠΈ Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° ΠΏΠΎΡΡΠ° Π² ΠΌΠ΅ΡΠΎΠ΄Π° analyzeSentence()
ΡΡΠ΅Π· Π·Π°ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΅ΠΊΡΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π²ΠΌΠ΅ΡΡΠΎ ΠΎΡΡΠ°ΡΠ΅Π»ΠΈ Π΄Π°Π½Π½ΠΈ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ³Π»ΠΎΠ±ΠΈΡΠ΅ ΠΎΡΠ½ΠΎΠ²ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅.
ΠΡΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π½Π°ΡΠ°ΡΠ° Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅Π³Π°.
ΠΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ
Π Π΅Π·ΡΠΌΠ΅: Π·Π°ΡΠΎ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ Kubernetes ΠΊΠ»ΡΡΡΠ΅Ρ?
Π’ΠΎΠΊΡ-ΡΠΎ ΠΏΡΠ΅Π³Π»Π΅Π΄Π°Ρ
ΠΌΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Dockerfile
, Π³ΠΎΠ²ΠΎΡΠΈ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈ Π΄Π° Π³ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°ΡΠ΅ Π² Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° Docker. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° Π½Π°ΡΡΠΈΡ
ΠΌΠ΅ ΠΊΠ°ΠΊ Π΄Π° ΡΡΠΊΠΎΡΠΈΠΌ ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ°ΠΉΠ»Π° .dockerignore
. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° Π½Π°ΡΠΈΡΠ΅ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ Π²Π΅ΡΠ΅ ΡΠ°Π±ΠΎΡΡΡ Π² Docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ. Π’ΡΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΎΡΠ½ΠΎΠ²Π°ΡΠ΅Π»Π΅Π½ Π²ΡΠΏΡΠΎΡ Π·Π°ΡΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ Kubernetes. ΠΡΠ³ΠΎΠ²ΠΎΡΡΡ Π½Π° ΡΠΎΠ·ΠΈ Π²ΡΠΏΡΠΎΡ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΡΠ²Π΅ΡΠ΅Π½ Π½Π° Π²ΡΠΎΡΠ°ΡΠ° ΡΠ°ΡΡ Π½Π° ΡΠΎΠ·ΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π». ΠΠ΅ΠΆΠ΄ΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΉΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ Π²ΡΠΏΡΠΎΡ:
ΠΠ° ΠΏΡΠΈΠ΅ΠΌΠ΅ΠΌ, ΡΠ΅ Π½Π°ΡΠ΅ΡΠΎ ΡΠ΅Π± ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° ΡΠ΅ΠΊΡΡ Π΅ ΡΡΠ°Π½Π°Π»ΠΎ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎ Π² ΡΠ²Π΅ΡΠΎΠ²Π΅Π½ ΠΌΠ°ΡΠ°Π±. ΠΡΡΠΊΠ° ΠΌΠΈΠ½ΡΡΠ° ΠΏΡΠΈ Π½Π΅Π³ΠΎ ΠΈΠ΄Π²Π°Ρ ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ Π·Π°ΡΠ²ΠΊΠΈ. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈΡΠ΅ sa-webapp
ΠΈ sa-logic
ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΠ΄ ΠΎΠ³ΡΠΎΠΌΠ΅Π½ ΡΡΡΠ΅Ρ. ΠΠ°ΠΊ Π΄Π° ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ?
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com