- ΠΡΠΎΠ΅ΠΊΡ ΡΠΎΠ·Π΄Π°Π½ Π΄Π»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ΡΠ΅ΡΠ²ΠΈΡΠ° mattermost ΠΈ redmine.
- ΠΠ°Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ.
- ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°
- ΠΠΊΡΡΠ°Π»ΡΠ½ΠΎΡΡΡ
- ΠΠΎΠΌΠ°Π½Π΄Ρ
- ΠΠ΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅
- Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
- Π‘Ρ Π΅ΠΌΠ° ΠΏΡΠΎΠ΅ΠΊΡΠ°
- ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΡΡΠ΅Π΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ
- Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° redmine ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΡΠ΅ΡΠ΅Π· docker-compose.yml
- Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° mattermost ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΡΠ΅ΡΠ΅Π· docker-compose.yml
- Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Redmine ΠΈ Mattermost
- ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ docker ΠΊΠΎΠΌΠ°Π½Π΄Ρ
- ΠΠ²ΡΠΎΡΠ΅ΡΡΡ
- ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Reverse Proxy Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
- ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° HTTPS(Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ) Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
- ΠΠ»Ρ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ°
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ
- ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ
- Π‘ ΠΊΠ°ΠΊΠΈΠΌΠΈ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ
- ΠΠ΅ ΠΏΠΎ ΡΠ΅ΠΌΠ΅
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΈΠΊΠ΅ΡΠΎΠ². ΠΠ΄Π½ΠΈΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΊΠ΅ΡΠΎΠ².
- ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΡΠΈΠΊΠ΅ΡΠΎΠ² Π² redmine. ΠΡ Π²ΡΠ΅Π³Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠΈΠΊΠ΅ΡΡ Π½Π° ΡΠ΅Π±Ρ, ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΡΠΈΠΊΠ΅ΡΡ.
- Π Π°ΡΡΠΈΡΡΠ΅ΠΌΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΡΠΎΠ΅ΠΊΡ ΠΎΡΠΊΡΡΡ Π΄Π»Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, Π»Π΅Π³ΠΊΠΎ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΡΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π² Π³ΡΡΠΏΠΏΡ, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠΊΠ΅ΡΠ°ΠΌΠΈ, ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΡΡΡ ΠΏΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΌ ΡΠΎΠ±ΡΡΠΈΡΠΌ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Π² ΠΎΠ΄Π½Ρ ΡΡΡΠΎΠΊΡ, Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ°Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ , ΠΏΠ΅ΡΠ΅Ρ Π²Π°Ρ ΡΠ»ΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅.
- Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΈΠΊΠ΅ΡΠΎΠ² ΠΏΠΎ ΡΠΎΡΠΌΠ΅ Redmine ΠΏΡΡΠΌΠΎ ΡΠ΅ΡΠ΅Π· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
- Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΡΡΠ»ΠΎΠΊ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΡΡΠΈΡ
Π² Redmine, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° ΡΠΈΠΊΠ΅ΡΡ, Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΡ, Π½Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, Π½Π°
ΠΠΎΠΈ Π·Π°Π΄Π°ΡΠΈ
, Π½Π°Π‘ΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ
. - ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎ ΡΠΈΠΊΠ΅ΡΠ°ΠΌ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ.
- ΠΠ°ΡΡΡΠΎΠ΅Π½ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Mattermost ΠΈ Redmine ΡΠ΅ΡΠ΅Π· ΡΠ°ΠΉΠ»
.docker.env.
- ΠΠ½ΠΎΠΏΠΊΠ° Π·Π²ΠΎΠ½ΠΊΠ° Π² Π―Π½Π΄Π΅ΠΊΡ Π’Π΅Π»Π΅ΠΌΠΎΡΡ
π‘ Π ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π΅ΡΡΡ Π²ΡΡΡΠ΅ΡΠΈ, ΠΏΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°ΠΌ Π²ΡΡΡΠ΅ΡΠΈ ΡΠ°Π·Π΄Π°ΡΡΡΡ ΠΏΠΎΡΡΡΠ΅Π½ΠΈΡ. ΠΠΎΡΡΡΠ΅Π½ΠΈΡ ΡΠ΅ΡΡΡΡΡΡ ΠΈ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ. ΠΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ ΠΏΠΎΡΡΡΠ΅Π½ΠΈΡ ΠΆΠΈΠ²ΡΡ Π² ΡΠΈΠΊΠ΅ΡΠ°Ρ Π² Π±Π°Π³ΡΡΠ΅ΠΊΠ΅ΡΠ΅. Π₯ΠΎΡΠ΅ΡΡΡ, ΡΡΠΎΠ±Ρ Π²ΡΠ΅ ΠΏΠΎΡΡΡΠ΅Π½ΠΈΡ ΠΆΠΈΠ»ΠΈ Π² Π±Π°Π³ΡΡΠ΅ΠΊΠ΅ΡΠ΅, ΡΠ°ΠΌ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ»ΠΈΡΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡ.
-
ΠΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° python Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ Flask Π² Π²ΠΈΠ΄Π΅ Π±ΠΎΡΠ°.
-
Π’ΠΎΡΠΊΠ° Π²Ρ ΠΎΠ΄Π° Π΄Π»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ
/redmine
*commands
ΠΠΎΠΌΠ°Π½Π΄Ρ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
---|---|
/help | ΠΡΠ°ΡΠΊΠ°Ρ ΡΠΏΡΠ°Π²ΠΎΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈ Π΅Π³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ |
/new_task | Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΎΠ΄Π½Ρ Π·Π°Π΄Π°ΡΡ Π² ΡΠΎΡΠΌΠ΅ Redmine |
/new_tasks | Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΎΠ΄Π½Ρ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°Π΄Π°Ρ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π² ΠΎΠ΄Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ |
/tasks_by_me | ΠΠΎΠΊΠ°Π·Π°ΡΡ Π·Π°Π΄Π°ΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΠΏΠΎΡΡΡΠΈΠ» Π΄ΡΡΠ³ΠΈΠΌ |
/tasks_for_me | ΠΠΎΠΊΠ°Π·Π°ΡΡ ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ ΠΌΠ½Π΅ Π·Π°Π΄Π°ΡΠΈ |
-
Π§ΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΡΠ»ΠΊΡ Π½Π° ΡΠΈΠΊΠ΅Ρ, Π½Π°ΠΏΠΈΡΠΈΡΠ΅ ΠΏΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΠΏΡΠΈΠΌΠ΅ΡΡ
#t(ID ΡΠΈΠΊΠ΅ΡΠ°)
. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ,#t10
. ΠΠΎΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ².ΠΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ Π½Π° ΡΡΡΠ»ΠΊΡ, ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠΈΠΊΠ΅Ρ.
ΠΠ°ΠΆΠ½ΠΎΠ΅ ΡΡΠΎΡΠ½Π΅Π½ΠΈΠ΅. ΠΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°ΡΡΠΈΠΉ Π²Π΅Π± ΡΠΎΠΊΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ, Π΄ΠΈΡΠ΅ΠΊΡΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ. Π§ΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΡΠ»ΠΊΠΈ Π² Π²ΠΈΠ΄Π΅
#t(ID ΡΠΈΠΊΠ΅ΡΠ°)
Π² Π΄ΠΈΡΠ΅ΠΊΡΠ΅, ΠΏΡΠΎΡΡΠΎ Π½Π°ΠΏΠΈΡΠΈΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π±ΠΎΡΡ, Π±ΠΎΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΡΠ»ΠΊΠΈ Π² ΡΠ΅ΠΊΡΡΠ΅. ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΈΡΠ΅ΡΠ΅ Π² ΠΊΠ°Π½Π°Π»Π΅ ΠΈΠ»ΠΈ ΠΏΠΎΡΠΎΠΊΠ΅, ΠΈΠ»ΠΈ Π² Π΄ΠΈΡΠ΅ΠΊΡΠ΅ Π±ΠΎΡΠ°, ΡΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΠΊΡΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ.This is an example of making a user_typing request, with the purpose of alerting the server that the connected client has begun typing in a channel or thread.
ΠΠ»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²Π°ΡΠΈΡ ΡΡΡΠ»ΠΎΠΊ Π½Π° ΡΠΈΠΊΠ΅ΡΡ Π² ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΡ ΡΠ°ΡΡΠ½ΡΡ ΠΊΠ°Π½Π°Π»Π°Ρ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ.
To add the bot account to teams and channels you want it to interact in, select the team drop-down menu, then select
Invite People. Next, select Invite Member and enter the bot account in the Add or Invite People field. Then select
Invite Members. You should now be able to add the bot account to channels like any other user.
-
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅ Π±ΠΎΡΠ° Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρ https://drive.google.com/file/d/16RAOr7d5huqCDg7T4-Ww5wqewNmREY-n/view?usp=sharing
-
ΠΠ»Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Redmine ΠΈ Mattermost Π²ΠΏΠΈΡΠΈΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ (Π»ΠΎΠ³ΠΈΠ½ Π² redmine)=(Π»ΠΎΠ³ΠΈΠ½ Π² mattermost) Π²
.docker.env
. ΠΡΠΈΠΌΠ΅Ρ- mattermost_username=redmine_username
- seconad_username_in_mattermost=second_username_in_redmine
Π‘ΡΡΠΎΠ³ΠΎ, ΡΠ½Π°ΡΠ°Π»Π° Π»ΠΎΠ³ΠΈΠ½ ΠΌΠ°ΡΡΠ΅ΡΠΌΠΎΡΡΠ°=Π»ΠΎΠ³ΠΈΠ½ ΡΠ΅Π΄ΠΌΠ°ΠΉΠ½Π°
-
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ° ΡΠΈΠΊΠ΅ΡΠ° Π² ΡΡΡΠ»ΠΊΡ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΡΠ°Π² Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ° Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ
Create a new ephemeral post in a channel.
Permissions
Must have create_post_ephemeral permission (currently only given to system admin) -
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π΅ΡΠ»ΠΈ ΠΌΠ°ΡΡΠ΅ΡΠΌΠΎΡΡ Π½Π΅ Π²ΠΈΠ΄ΠΈΡ Π·Π°ΠΏΡΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ
- ΠΈΠ»ΠΈ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ
Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ° Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΏΠΎ Ρ
ΠΎΡΡΡ
127.0.0.1
(ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ) - ΠΈΠ»ΠΈ Π² ΡΠ°ΠΉΠ»Π΅
.env
ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡEXTERNAL
Ρ ΠΎΡΡΡ Π½Π°0.0.0.0
(Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΅ΡΠ΅Π·flask run -h 0.0.0.0
ΠΈΠ»ΠΈgunicorn
)
- ΠΈΠ»ΠΈ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ
Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ° Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΏΠΎ Ρ
ΠΎΡΡΡ
-
ΠΡΠ΅Π΄ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ
-
Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΡΡ docker ΡΠ΅ΡΡ
-
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π΄ΠΎΠΊΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ redmine ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ
-
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π΄ΠΎΠΊΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ mattermost ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ
-
ΠΠΎΡΠ»Π΅ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΈ REST API Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΡΠ΅ΡΠ²ΠΈΡΠ°Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π² ΡΠ°ΠΉΠ»
.env
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π€Π°ΠΉΠ» Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π²./wsgi/.env
-
ΠΠΎΡΠ»Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π²
./wsgi/.env
ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π΄ΠΎΠΊΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ mattermost-redmine ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ -
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² mattermost ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ c ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ Ρ ΠΎΡΡΠ° ΠΈ ΠΏΠΎΡΡΠ° Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
/apps install http http://host:port/manifest.json
-
Π‘Π³Π΅Π½Π΅ΡΠΈΡΡΠΉΡΠ΅ ΡΠΎΠΊΠ΅Π½ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ΅ΡΠ΅Π· Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ
-
ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠΎΠΊΠ΅Π½ Π²
./wsgi/.env
-
ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠΎΠΊΠ΅Π½ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ° ΠΈ Π΄Π°ΠΉΡΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡΡΠΎΠ². ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠΈΡΠΈ t#ID Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π±ΠΎΡΠ° Π² System Admin.
-
ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π²ΡΠ΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ mattermost_login=redmine_login Π²
./wsgi/.env
, ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ ΡΡΠΎ Π»ΠΎΠ³ΠΈΠ½Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½Ρ ΠΈ Π°ΠΊΠΊΠ°ΡΠ½ΡΡ Π°ΠΊΡΠΈΠ²Π½Ρ. -
ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΡΠ΅ Π΄ΠΎΠΊΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π² ΠΏΠ°ΠΏΠΊΠ΅
./wsgi
docker compose stop docket compose up
-
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ
-
ΠΠΎΠ΄ΡΠΎΠ±Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ https://developers.mattermost.com/integrate/apps/quickstart/quick-start-python/
-
ΠΠ΅ΡΠ²ΡΠΌ Π΄Π΅Π»ΠΎΠΌ ΡΠ΄Π°Π»ΡΡ ΡΡΠ°ΡΡΡ Π²Π΅ΡΡΠΈΡ docker ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Ρ Π½ΠΎΠ²ΡΡ https://docs.docker.com/engine/install/ubuntu/
-
ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ ./wsgi/.env.example Π² ./wsgi/.env
cp ./wsgi/.env.example ./wsgi/.env
-
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π°, ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΏΠ°ΠΏΠΊΡ docker Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠΌ
mkdir ./rm cd ./rm
-
CΡΠ°Π²Π»Ρ redmine ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ. ΠΠ±ΡΠ°Π· ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π° https://github.com/sameersbn/docker-redmine.git
- ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ Π²Π°Ρ ΠΎΠ±ΡΠ°Π· Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π²Π°ΡΠΈΡ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ΅Π½ΠΈΠΉ
-
ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ Π½Π° ΡΠ°ΠΉΡ Ρ Π»ΠΎΠ³ΠΈΠ½ΠΎΠΌ admin ΠΈ ΠΏΠ°ΡΠΎΠ»Π΅ΠΌ admin, ΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΏΠ°ΡΠΎΠ»Ρ, Π΄Π°Π»Π΅Π΅
ΠΠ΄ΠΌΠΈΠ½ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
>ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ
ΠΠ΅ΡΠ°Π»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΡ https://developers.mattermost.com/integrate/apps/quickstart/quick-start-python/
ΠΠΎ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ°Π·, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π³ΠΈΠ±ΠΊΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΡ https://github.com/mattermost/docker.git + ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ Π²Π°Ρ ΠΎΠ±ΡΠ°Π· Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π²Π°ΡΠΈΡ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ΅Π½ΠΈΠΉ + Π ΡΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Π½Π΅ Π½Π°ΡΡΡΠΎΠ΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠ° plugin_app, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ»Π΅Π΄ΡΡΡ ΡΠ°ΡΡΠΈΡΠΈΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΈΠ· https://developers.mattermost.com/integrate/apps/quickstart/quick-start-python/
-
Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠΊΠ΅Π½ Π°Π΄ΠΌΠΈΠ½Π° Π΄Π»Ρ REST API Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π²
./wsgi/.env
.
-
ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ./wsgi ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Ρ Π±ΠΎΡΠΎΠΌ-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ.
docker compose up
-
Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΠΈΠΌΡΡ, ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΈΠ½Π³ΠΎΠ²Π°ΡΡΡΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°ΠΌΠΈ
docker exec -it conteiner_name_app bash curl -I http://host_redmine:port_redmine/
HTTP/1.1 200 OK
curl -I http://host_mattermost:port_mattermost/
HTTP/1.1 405 Method Not Allowed
curl ΠΊΠΎΠΌΠ°Π½Π΄Ρ
GET
curl -I http://localhost:5000/*endpointPOST
curl --header "Content-Type: application/json" --request POST --data '{"item1":"data1","item2":"data2"}' http://127.0.0.1:5000/*endpoint
-
Π§ΡΠΎΠ±Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π° Π²Π°Ρ Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠΉ mattermost ΡΠ°ΠΉΡ ΠΈ Π²Π²Π΅ΡΡΠΈ
/
(slash) ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΏΠΎ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΠ· ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ. https://developers.mattermost.com/integrate/apps/quickstart/quick-start-python//apps install http http://mattermost-apps-python-hello-world:8090/manifest.json
Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΊΠΎΠΌΠ°Π½Π΄Ρ
/apps install http http://external_ip_address:8090/manifest.json
-
ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ Π΅Π³ΠΎ, ΡΠΎ ΡΠΌΠΎΡΡΠΈΠΌ Π·Π΄Π΅ΡΡ https://developers.mattermost.com/integrate/apps/quickstart/quick-start-python/#uninstall-the-app
-
ΠΠΎΡΠ»Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π½ΡΠΆΠ½ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠΊΠ΅Π½ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΅Π³ΠΎ Π²
./wsgi/.env
Π‘Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠΊΠ΅Π½ Π½ΡΠΆΠ½ΠΎ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ
>ΠΠΊΠΊΠ°ΡΠ½ΡΡ Π±ΠΎΡΠΎΠ²
>@redmine
. Π’Π°ΠΊΠΆΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡΠ΅ Π΄ΠΎΡΡΡΠΏ Π±ΠΎΡΠ° ΠΊ Direct ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌ, Π½Π°Π·Π½Π°ΡΡΡΠ΅ Π΅ΠΌΡ ΡΠΎΠ»Ρ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡ ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π· Π»ΠΈΡΠ½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ c API ΡΠΎΠΊΠ΅Π½ΠΎΠΌ. -
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ:
- ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΈΠΊΠ΅ΡΡ
- ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΈΠΊΠ΅Ρ ΠΏΠΎ ΡΠΎΡΠΌΠ΅ Redmine
- ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠΈΠΊΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΡΡΡΠ΅Π½Ρ Π²Π°ΠΌ
- ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠΈΠΊΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ Π½Π°Π·Π½Π°ΡΠΈΠ»ΠΈ
- ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΡΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ Π²Π°Ρ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅ redmine ΠΈΠ»ΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ², ΠΈΠ»ΠΈ ΠΏΡΠΈ Π²Π²ΠΎΠ΄Π΅ Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ.
- Π‘ΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΡΡΠ»ΠΊΠΈ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΡΡΠΈΠ΅ Π² redmine
- docker compose up - Create and start containers
- docker compose down - Stop and remove containers, networks
-
ΠΌΡ ΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΡΡ ΡΠ°ΡΡΡ
-
ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ Π΄ΠΎΠΊΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ redmine ΠΈ mattermost
-
ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ»
.test.env
ΠΈ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΡΠΈΠΌΠ΅ΡAPP_SCHEMA=http APP_HOST_INTERNAl=127.0.0.1 APP_PORT_INTERNAL=8090 APP_HOST_EXTERNAL=127.0.0.1 APP_PORT_EXTERNAL=8090 MM_SCHEMA=http MM_HOST_EXTERNAL=127.0.0.1 MM_PORT_EXTERNAL=8065 RM_SCHEMA=http RM_HOST_EXTERNAL=127.0.0.1 RM_PORT_EXTERNAL=3000 rm_admin_key=redmine_secret mm_app_token=app_secret app_url_internal=${APP_SCHEMA}://${APP_HOST_INTERNAl}:${APP_PORT_INTERNAL} app_url_external=${APP_SCHEMA}://${APP_HOST_EXTERNAL}:${APP_PORT_EXTERNAL} redmine_url_external=${RM_SCHEMA}://${RM_HOST_EXTERNAL}:${RM_PORT_EXTERNAL} mattermost_url_external=${MM_SCHEMA}://${MM_HOST_EXTERNAL}:${MM_PORT_EXTERNAL} # testing mattermost client test_mm_email1=t1@mail test_mm_username1=t1 test_mm_password1=super_secret test_mm_first_name1=TestMattermost test_mm_last_name1=UserMattermost test_mm_email2=t2@mail test_mm_username2=t2 test_mm_password2=super_secret test_mm_first_name2=TestMattermost2 test_mm_last_name2=UserMattermost2 # redmine clients [email protected] test_rm_username1=test.user1 test_rm_password1=super_secret test_rm_first_name1=Test1 test_rm_last_name1=User1 [email protected] test_rm_username2=test.user2 test_rm_password2=super_secret test_rm_first_name2=Test2 test_rm_last_name2=User2 # usernames mattermost with redmine account # For example: # mattermost_username=redmine_username # seconad_username_in_mattermost=second_username_in_redmine # and etc... t1=test.user1 t2=test.user2
-
Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠ΅ΡΡΡ ΠΈ ΡΠΌΠΎΡΡΠΈΠΌ ΠΏΠΎΠΊΡΡΡΠΈΠ΅ ΠΊΠΎΠ΄Π°
coverage run -m pytest
coverage report
Name Stmts Miss Cover ------------------------------------------------- ext_funcs.py 9 0 100% tests/__init__.py 0 0 100% tests/blocks_code/blocks.py 30 0 100% tests/conftest.py 37 3 92% tests/test_app.py 306 0 100% wsgi/__init__.py 401 31 92% wsgi/client_errors.py 6 0 100% wsgi/constants.py 2 0 100% wsgi/decorators.py 29 3 90% wsgi/my_bot.py 27 2 93% wsgi/redmine_api.py 48 0 100% wsgi/settings.py 60 2 97% wsgi/views.py 26 2 92% ------------------------------------------------- TOTAL 981 43 96%
-
ΠΏΡΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ nginx
- ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° nginx Π½Π° ΡΠ΅ΡΠ²Π΅Ρ
sudo apt update sudo apt install nginx
- Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ»ΡΠΆΠ±Ρ nginx
sudo systemctl start nginx
- ΡΠΎΠ·Π΄Π°ΡΠΌ Π½ΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠ» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
sudo cp ./wsgi/app_nginx /etc/nginx/sites-enabled/app_nginx
- ΠΎΠ±Π½ΠΎΠ²ΠΈΡΠ΅ ΡΠ»ΡΠΆΠ±Ρ nginx
sudo systemctl reload nginx
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° HTTPS(Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ) Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
- Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ certbot Π½Π° ΡΠ΅ΡΠ²Π΅Ρ, https://certbot.eff.org/
- Π‘Π»Π΅Π΄ΡΠ΅ΠΌ ΠΏΠΎ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΏΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅, certbot Π²ΡΡ Π΄Π΅Π»Π°Π΅Ρ Π·Π° Π²Π°Ρ
ΠΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ ΡΠ΅Π±Ρ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅?
- ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Ρ Π²Π°Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠ΅ Π²ΡΡΠ΅
- ΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ https://github.com/ArtemIsmagilov/redmine-mattermost-integrations.git ΠΈ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π² ΠΏΠ°ΠΏΠΊΡ wsgi/
- ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ .docker.env.exampple Π² .docker.env Π² ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ
- ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ app_nginx Π² /etc/nginx/sites-enables/ ΡΡΠ΄ΠΎΠΌ Π² default ΡΡΡΠ»ΠΊΠΎΠΉ, Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ (ΠΏΠΎΡΡΡ, ΠΏΡΡΠΈ ΠΊ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°ΠΌ). ΠΠ»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ http, Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ https
- ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ gunicorn.conf.py(accesslog*=ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°, loglevel='error', ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²ΠΎΡΠΊΠ΅ΡΠΎΠ², ΠΏΡΡΡ ΠΊ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°ΠΌ)
- Π·Π°ΠΏΡΡΡΠΈΡΠ΅ Π΄ΠΎΠΊΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
- ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Π² mattermost /apps install http ...
- ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠΎΠΊΠ΅Π½ Π΄Π»Ρ Π±ΠΎΡΠ°, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡΠ΅ ΠΏΡΠ°Π²Π° Π΄Π»Ρ REST API ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ. ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π±ΠΎΡΠ° Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ - ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ websocket Subscriptions
- Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠΎΠΊΠ΅Π½, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π² .docker.env ΠΈ Π·Π°Π½ΠΎΠ²ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
mattermostautodriver
.- Github https://github.com/embl-bio-it/python-mattermost-autodriver
- ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ https://embl-bio-it.github.io/python-mattermost-autodriver
python-redmine
.- Github https://github.com/maxtepkeev/python-redmine
- ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ https://python-redmine.com
- REST API redmine - https://www.redmine.org/projects/redmine/wiki/Developer_Guide
- ΠΡΠΎΡΡΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
hello world
Π² mattermost Π½Π° python - https://developers.mattermost.com/integrate/apps/quickstart/quick-start-python/ - REST API mattermost - https://api.mattermost.com/
- matterbridge https://github.com/42wim/matterbridge
- Mattermost chat plugin for Redmine - https://github.com/altsol/redmine_mattermost
- Docker image Redmine - https://hub.docker.com/_/redmine
- Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° redmine ΡΠ΅ΡΠ΅Π· docker-compose - https://kurazhov.ru/install-redmine-on-docker-compose/?ysclid=lhu5e6s0bb161225177
- Π§Π°Ρ-Π±ΠΎΡ Π΄Π»Ρ mattermost - https://habr.com/ru/companies/hh/articles/727246/
- ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΏΠΎ Π΄ΠΎΠΊΠ΅ΡΡ - https://docs.docker.com/engine/install/
- HTTPS Π½Π° Flask - https://blog.miguelgrinberg.com/post/running-your-flask-application-over-https
- ΠΡΠΎΠΊΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ - https://dvmn.org/encyclopedia/web-server/deploy-django-nginx-gunicorn/
- ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Gunicorn - https://docs.gunicorn.org/en/latest/install.html
- Redmine docker Π² production - https://github.com/sameersbn/docker-redmine.git
- Mattermost docker Π² production - https://github.com/mattermost/docker.git
- ΠΠ΅ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ²Π½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡ mattermost(Π°), ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ Π΄ΠΎΠΊΠ΅Ρ ΠΎΠ±ΡΠ°Π·Π° Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π» websocket ΡΠ΅ΡΠ΅Π· ΡΠΎΡΡΠΌΡ ΡΠ·Π½Π°Π», ΡΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π°Ρ Π²Π΅ΡΡΠΈΡ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π΄Π°ΠΆΠ΅ ΠΏΡΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅
- ΠΠ΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ (ΠΊΡΠ°ΠΉΠ½Π΅ ΠΌΠ°Π»ΠΎ) ΠΏΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ websocket. Π§Π΅ΡΠ΅Π· websocket ΡΠ΄ΠΎΠ±Π½Π΅Π΅ Π²ΡΠ΅Π³ΠΎ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ ΡΡΠ΅Π±ΡΡΡΡΡ ΡΠΎΡΠΌΡ. ΠΠ°ΠΆΠ½ΠΎ Π»ΠΈΡΡ ΡΠΊΠ°Π·Π°ΡΡ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ
- ΠΠ΅ ΡΠ°Π±ΠΎΡΠ°Π» Websocket Π½Π° ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ. ΠΡΡΡΠ½ΠΈΠ»ΠΎΡΡ, websocket ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠΌ ΠΊΠ°Π½Π°Π»Π°ΠΌ. ΠΠ»Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» Π²Π΅ΡΡΠΈΡ mattermost ΠΊΠ°ΠΊ Ρ Π·Π°ΠΊΠ°Π·ΡΠΈΠΊΠ° 7.7.1
- python:latest Π²Π΅ΡΡΠΈΡ Π΄ΠΎΠΊΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π²Π΅ΡΠΈΡ ΠΎΠΊΠΎΠ»ΠΎ 1 GB, ΠΏΡΠΎΠ±ΡΡ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΠΎΠ±ΡΠ°Π· python:slim. ΠΠ΅ΡΡΠΈΡ slim Π±ΡΡΡΡΠ΅Π΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ, ΠΌΠ΅Π½ΡΡΠ΅ Π²Π΅ΡΠΈΡ(ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ), Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π΅ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ (ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ΄Π°Π²Π°ΡΡ ΡΠ°Π·Π½ΡΠ΅ ΡΡΠ°ΡΡΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΏΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ Π·Π°ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΡ Π² python)
- ΠΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π°, Π±ΠΎΡ Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΠ»ΡΡ Π² ΠΊΠ°Π½Π°Π», ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΠΎ ΡΡΠ°Π·Ρ Π½Π΅ ΠΏΠΎΠ½ΡΡΡ ΡΡΠΎ ΠΎΠ½ ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ ΡΡΠ°Π·Ρ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΅Π³ΠΎ Π² Π΄ΠΈΡΠ΅ΠΊΡ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΊΠ°Π½Π°Π»Ρ, ΡΠ΅Π³ΠΎ ΠΌΡ ΠΈ Ρ ΠΎΡΠΈΠΌ https://forum.mattermost.com/t/add-a-bot-to-channels/8355/15
- Π Π΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³ ΠΊΠΎΠ΄Π°
- ΠΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΡΡΠΊΠΈΠΉ ΡΠ·ΡΠΊ
ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½Π°Π΄ΠΎΠ΅Π» ΠΏΠ΅ΡΠ΅Π³ΡΠ΅Π² Π½ΠΎΡΡΠ±ΡΠΊΠ° ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Π² Oracle VirtualBox, ΡΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΠ΅ΡΠ²ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ - ΠΎΡΠΊΠ»ΡΡΠΈΡΡ Π·Π°ΠΏΠΈΡΡ Π»ΠΎΠ³ΠΎΠ². ΠΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, Ρ ΠΌΠ΅Π½Ρ ΡΠ½Π΅ΡΠ³ΠΎΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΡΠ½ΠΈΠ·ΠΈΠ»ΠΎΡΡ Ρ ΠΡΠ΅Π½Ρ Π²ΡΡΠΎΠΊΠΎΠ³ΠΎ Π΄ΠΎ ΠΡΡΠΎΠΊΠΎΠ³ΠΎ, ΠΈΠ½ΠΎΠ³Π΄Π° Π£ΠΌΠ΅ΡΠ΅Π½Π½ΡΠΉ. ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, Π΅ΡΠ»ΠΈ Π²Ρ ΡΡΠΎ-ΡΠΎ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΡΠ΅.
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΎΠ²
- https://www.virtualbox.org/ticket/11988
- https://ubuntuforums.org/showthread.php?t=879256
- ΠΡΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΠ°ΠΏΠΊΡ C:\Users\user\VirtualBox VMs\Ubuntu\Logs ΠΏΡΠ°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡΡΠΈ ->
ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ
->ΠΠ·ΠΌΠ΅Π½ΠΈΡΡ
-> ΠΡΠ±ΠΈΡΠ°Π΅ΠΌ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΎΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π»ΡΡ VBox -> Π‘ΡΠ°Π²ΠΈΠΌ Π³Π°Π»ΠΎΡΠΊΡΠΠ°ΠΏΡΠ΅ΡΠΈΡΡ Π·Π°ΠΏΠΈΡΡ
->ΠΡΠΈΠΌΠ΅Π½ΠΈΡΡ
. Π’Π΅ΠΏΠ΅ΡΡ Π·Π°ΠΏΠΈΡΡ Π»ΠΎΠ³ΠΎΠ² Π±ΡΠ΄Π΅Ρ Π½Π΅ Π΄ΠΎΡΡΡΠΏΠ½Π°. ΠΡΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ ΠΈ ΠΏΠ°ΠΌΡΡΡ ΠΎΡ Π»ΠΈΡΠ½Π΅ΠΉ ΡΠ°Π±ΠΎΡΡ.