Π΅ ΠΌΠΎΠ³ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΊΠΎΠΉΡΠΎ ΡΡΡΠ΅ΡΠ°Π²Π° CRM, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈ, ΡΡΠ΅ΡΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π΄ΡΡΠ³ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ Ρ Π°ΡΠ΅ΡΠ²Π°Ρ Π½Π° ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΠΈΡΠ΅, Π½ΠΎ Π½Π΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π½Π° ΠΠ’ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΈΡΠ΅. ΠΠΎΡΡΠ°Π»ΡΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ°Π»ΠΊΠΈ ΠΈ ΡΡΠ΅Π΄Π½ΠΈ fΓΆretag, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΌΠ°Π»ΠΊΠΈ ΠΊΠ»ΠΈΠ½ΠΈΠΊΠΈ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΠΈ ΠΈ Π΄ΠΎΡΠΈ ΡΠ°Π»ΠΎΠ½ΠΈ Π·Π° ΠΊΡΠ°ΡΠΎΡΠ°. ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΡΠΎ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΠΈΡΠ΅ βΠΎΠ±ΠΈΡΠ°Ρβ, Π΅ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΡΠ° Π½Π° ΡΠ΅Π»Π΅ΡΠΎΠ½ΠΈΡΡΠ° Ρ CRM, ΠΏΡΠΈ ΠΊΠΎΡΡΠΎ Π²ΡΠ΅ΠΊΠΈ ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ ΡΠ΅ Π·Π°ΠΏΠΈΡΠ²Π° Π²Π΅Π΄Π½Π°Π³Π° Π² CRM, ΡΡΠ·Π΄Π°Π²Π°Ρ ΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈ ΠΊΠ°ΡΡΠΈ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΏΡΠΈ Π²Ρ ΠΎΠ΄ΡΡΠΎ ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π²Π΅Π΄Π½Π°Π³Π° ΡΠ΅ Π²ΠΈΠΆΠ΄Π° ΠΊΠ°ΠΊΡΠ² Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΡ, ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΌΡ ΡΠ΅ ΠΏΡΠΎΠ΄Π°Π΄Π΅ ΠΈ ΠΊΠΎΠ»ΠΊΠΎ Π΄ΡΠ»ΠΆΠΈ. ΠΠΎ ΡΠ΅Π»Π΅ΡΠΎΠ½ΠΈΡΡΠ° ΠΎΡ ΠΠΈΡΡΠΈΠΊΡ24 ΠΈ Π½Π΅ΠΉΠ½Π°ΡΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ CRM Π΅ ΠΏΠ»Π°ΡΠ΅Π½Π°, ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ. Π ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΡΠΏΠΎΠ΄Π΅Π»Ρ ΠΎΠΏΠΈΡ Π·Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ ΠΎΡΠΊΡΠΈΡΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΈ ΠΏΠΎΠΏΡΠ»ΡΡΠ½Π° IP ΠΠ’Π‘ , ΠΊΠ°ΠΊΡΠΎ ΠΈ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌ Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ ΡΠ°ΡΡΠΈ
Π Π°Π±ΠΎΡΡ Π½Π° Π°ΡΡΡΠΎΡΡ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ, ΠΊΠΎΡΡΠΎ ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π²Π° Ρ ΠΏΡΠΎΠ΄Π°ΠΆΠ±Π°, Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Π½Π° IP ΡΠ΅Π»Π΅ΡΠΎΠ½ΠΈΡ. ΠΠΎΠ³Π°ΡΠΎ ΠΌΠ΅ ΠΏΠΎΠΏΠΈΡΠ°Ρ Π°, ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈ Π΄Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠΌ Π½Π΅ΡΠΎ Π·Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Π½Π° ΠΠΈΡΡΠΈΠΊΡ24 Ρ ΠΠ’Π‘, ΠΊΠΎΠΈΡΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅ ΠΈΠΌΠ°Ρ, Π° ΡΡΡΠΎ ΠΈ Ρ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΠ’Π‘ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ VDS Π½Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, Π°Π· ΡΠ΅ Π½Π°ΡΠΎΡΠΈΡ ΠΊΡΠΌ ΠΡΠ³ΡΠ». Π ΡΠΎΠΉ ΠΌΠΈ Π΄Π°Π΄Π΅ Π»ΠΈΠ½ΠΊ Π½Π° , ΠΊΡΠ΄Π΅ΡΠΎ ΠΈΠΌΠ°ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅, GitHub ΠΈ Π²ΡΠΈΡΠΊΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°ΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ. ΠΠΎ ΠΏΡΠΈ ΠΎΠΏΠΈΡ Π·Π° ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠΎΠ²Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ°Π½Π° ΡΡΠ½ΠΎ, ΡΠ΅ ΠΠΈΡΡΠΈΠΊΡ24 Π²Π΅ΡΠ΅ Π½Π΅ Π΅ ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ Π±Π΅ΡΠ΅, ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠ°Π±ΠΎΡΡΡ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, FreePBX Π½Π΅ Π΅ ΠΏΡΠΎΡΡΠΎ Π³ΠΎΠ»Π° Asterisk, ΡΡΠΊ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΌΠΈΡΠ»ΠΈ ΠΊΠ°ΠΊ Π΄Π° ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ° ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎΡΠΎ Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π° Ρ Ρ Π°ΡΠ΄ΠΊΠΎΡΠ½ΠΈΡ Π΄ΠΈΠ°Π»ΠΏΠ»Π°Π½ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
ΠΠ·ΡΡΠ°Π²Π°Π½Π΅ Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ°
Π ΡΠ°ΠΊΠ°, Π·Π° Π½Π°ΡΠ°Π»ΠΎ, ΠΊΠ°ΠΊ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π°. ΠΠΎΠ³Π°ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ ΠΎΡ Π²ΡΠ½ Π½Π° ΠΠ’Π‘ (ΡΡΠ±ΠΈΡΠΈΠ΅ SIP INVITE ΠΎΡ Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊΠ°), Π·Π°ΠΏΠΎΡΠ²Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° Π΄ΠΈΠ°Π»ΠΏΠ»Π°Π½Π° (ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΊΠ°ΠΊΠ²ΠΎ ΠΈ Π² ΠΊΠ°ΠΊΡΠ² ΡΠ΅Π΄ Π΄Π° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ Ρ ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ). ΠΡ ΠΏΡΡΠ²ΠΈΡ ΠΏΠ°ΠΊΠ΅Ρ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΊΠΎΡΡΠΎ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° Π² ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ°. ΠΡΠ»ΠΈΡΠ΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΠΈΠ·ΡΡΠ°Π²Π°Π½Π΅ Π½Π° Π²ΡΡΡΠ΅ΡΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° SIP Π΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡΡ sngrep () ΠΊΠΎΠΉΡΠΎ Π»Π΅ΡΠ½ΠΎ ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° Π½Π° ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΈ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠΈ ΡΡΠ΅Π· apt install/yum install ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ° ΠΈ ΠΎΡ ΠΈΠ·Ρ ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄. ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π»ΠΎΠ³ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ Π² sngrep.

Π ΠΏΡΠΎΡΡΠΎΡΠΎ Π΄ΠΈΠ°Π»ΠΏΠ»Π°Π½ΡΡ ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π²Π° ΡΠ°ΠΌΠΎ Ρ ΠΏΡΡΠ²ΠΈΡ ΠΏΠ°ΠΊΠ΅Ρ, ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΈ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ, Π½Π°ΡΠΈΡΠΊΠ°Π½Π΅ Π½Π° Π±ΡΡΠΎΠ½ΠΈ (DTMF), ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ°ΡΠΎ FollowMe, RingGroup, IVR ΠΈ Π΄ΡΡΠ³ΠΈ.
ΠΠ°ΠΊΠ²ΠΎ ΠΈΠΌΠ° Π² ΠΏΠ°ΠΊΠ΅ΡΠ° Invite

ΠΠΎ ΡΡΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΏΡΠΎΡΡΠΈ Π΄ΠΈΠ°Π»ΠΏΠ»Π°Π½ΠΈ ΡΠ°Π±ΠΎΡΡΡ Ρ ΠΏΡΡΠ²ΠΈΡΠ΅ Π΄Π²Π΅ ΠΏΠΎΠ»Π΅ΡΠ°, Π° Π²ΡΠΈΡΠΊΠ°ΡΠ° Π»ΠΎΠ³ΠΈΠΊΠ° Π΅ ΡΠΎΠΊΡΡΠΈΡΠ°Π½Π° ΠΎΠΊΠΎΠ»ΠΎ DID ΠΈ CallerID. DID Π΅ Π½ΠΎΠΌΠ΅ΡΡΡ, Π½Π° ΠΊΠΎΠΉΡΠΎ Π·Π²ΡΠ½ΠΈΠΌ, CallerID Π΅ Π½ΠΎΠΌΠ΅ΡΡΡ, ΠΎΡ ΠΊΠΎΠΉΡΠΎ Π·Π²ΡΠ½ΡΡ.
ΠΠΎ Π½ΠΈΠ΅ ΡΠΌΠ΅ ΡΠΈΡΠΌΠ°, Π° Π½Π΅ ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΡΠ΅Π»Π΅ΡΠΎΠ½ β Π·Π½Π°ΡΠΈ Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π² ΠΠ’Π‘ ΠΈΠΌΠ° Π³ΡΡΠΏΠΈ Π·Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ (ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ/ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π·Π²ΡΠ½ΡΠ½Π΅ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°) Π½Π° Π³ΡΠ°Π΄ΡΠΊΠΈ Π½ΠΎΠΌΠ΅ΡΠ° (Ring Group), IVR (ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅, Π·Π²ΡΠ½Π½Π°Ρ ΡΠ΅ Π½Π°β¦ ΠΠ°ΡΠΈΡΠ½Π΅ΡΠ΅ Π΅Π΄Π½ΠΎ Π·Π°β¦), ΠΠ²ΡΠΎΠΎΡΠ³ΠΎΠ²ΠΎΡΠ½ΠΈΡΠΈ (Phrases), ΠΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ (Time Conditions), ΠΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Π½Π΅ Π½Π° Π΄ΡΡΠ³ΠΈ Π½ΠΎΠΌΠ΅ΡΠ° ΠΈΠ»ΠΈ Π½Π° ΠΌΠΎΠ±ΠΈΠ»Π΅Π½ (FollowMe, Forward). Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈ ΠΊΠΎΠΉ ΡΠΎΡΠ½ΠΎ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ ΠΈ Ρ ΠΊΠΎΠ³ΠΎ ΡΠ΅ ΡΠ°Π·Π³ΠΎΠ²Π°ΡΡ ΠΏΡΠΈ ΠΏΠΎΡΡΡΠΏΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ. ΠΡΠΎ Π΅Π΄ΠΈΠ½ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π½Π°ΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΡΠΈΠΏΠΈΡΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° Π² ΠΠ’Π‘ Π½Π° Π½Π°ΡΠΈΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ.

Π‘Π»Π΅Π΄ ΡΡΠΏΠ΅ΡΠ½ΠΎΡΠΎ Π²Π»ΠΈΠ·Π°Π½Π΅ Π½Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π² ΠΠ’Π‘, ΡΠΎ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΏΡΠ΅Π· Π΄ΠΈΠ°Π»ΠΏΠ»Π°Π½Π° Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ "ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΈ". ΠΠΎΠ½ΡΠ΅ΠΊΡΡΡΡ ΠΎΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° Asterisk Π΅ Π½ΠΎΠΌΠ΅ΡΠΈΡΠ°Π½ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, Π²ΡΡΠΊΠ° ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΡΡΠ΄ΡΡΠΆΠ° ΡΠΈΠ»ΡΡΡ ΠΏΠΎ Π½Π°Π±ΡΠ°Π½ΠΈΡ Π½ΠΎΠΌΠ΅Ρ (ΡΠΎΠ·ΠΈ ΡΠΈΠ»ΡΡΡ ΡΠ΅ Π½Π°ΡΠΈΡΠ° exten, Π·Π° Π²ΡΠ½ΡΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ Π² Π½Π°ΡΠ°Π»Π΅Π½ Π΅ΡΠ°ΠΏ exten=DID). ΠΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ Π² ΡΠ΅Π΄Π° Π½Π° Π΄ΠΈΠ°Π»ΠΏΠ»Π°Π½Π° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΊΠ°ΠΊΠ²ΠΈΡΠΎ ΠΈ Π΄Π° Π±ΠΈΠ»ΠΎ β Π²ΡΡΡΠ΅ΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π° Π·Π²ΡΠ½ΠΈ Π½Π° Π²ΡΡΡΠ΅ΡΠ΅Π½ Π°Π±ΠΎΠ½Π°Ρ β Dial(), Π΄Π° ΠΏΠΎΠ»ΠΎΠΆΠΈ ΡΠ»ΡΡΠ°Π»ΠΊΠ°ΡΠ° β Hangup()), ΡΡΠ»ΠΎΠ²Π½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈ (IF, ELSE, ExecIF ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ), ΠΏΡΠ΅Ρ
ΠΎΠ΄ΠΈ ΠΊΡΠΌ Π΄ΡΡΠ³ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° Π½Π° ΡΠΎΠ·ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ (Goto, GotoIF), ΠΏΡΠ΅Ρ
ΠΎΠ΄ ΠΊΡΠΌ Π΄ΡΡΠ³ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΈ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ (Gosub, Macro). ΠΡΠ΄Π΅Π»Π½ΠΎ Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π°ΡΠ° include ΠΈΠΌΠ΅_ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, ΠΊΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΎΡ Π΄ΡΡΠ³ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π² ΠΊΡΠ°Ρ Π½Π° ΡΠ΅ΠΊΡΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ. ΠΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅, Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ ΡΡΠ΅Π· include, ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ»Π΅Π΄ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠ΅ΠΊΡΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ.
Π¦ΡΠ»Π°ΡΠ° Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° Π½Π° FreePBX Π΅ ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½Π° Π½Π° Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ΡΠΎ Π΅Π΄ΠΈΠ½ Π² Π΄ΡΡΠ³ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΈ ΡΡΠ΅Π· include ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ ΡΡΠ΅Π· Gosub, Macro ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Handler. ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π½Π° Π²Ρ ΠΎΠ΄ΡΡΠΈΡΠ΅ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° FreePBX.

ΠΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΏΡΠ΅Π· Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΈ ΠΎΡΠ³ΠΎΡΠ΅ Π½Π°Π΄ΠΎΠ»Ρ ΠΏΠΎ ΡΠ΅Π΄Π°, Π² ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° Π΄ΡΡΠ³ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΈ ΠΊΠ°ΡΠΎ ΠΌΠ°ΠΊΡΠΎΡΠΈ (Macro), ΡΡΠ½ΠΊΡΠΈΠΈ (Gosub) ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅Ρ ΠΎΠ΄ΠΈ (Goto), Π·Π°ΡΠΎΠ²Π° ΡΠ΅Π°Π»Π½ΠΎΡΠΎ Π΄ΡΡΠ²ΠΎ Π½Π° ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠ»Π΅Π΄ΠΈ ΡΠ°ΠΌΠΎ Π² Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅.
Π’ΠΈΠΏΠΎΠ²Π° ΡΡ Π΅ΠΌΠ° Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΡΠΈΠΏΠΈΡΠ΅Π½ ΠΎΡΠΈΡ AΠ’Π‘ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρ. ΠΡΠΈ Π²Ρ ΠΎΠ΄ΡΡΠΈ ΠΎΠ±Π°ΠΆΠ΄Π°Π½ΠΈΡ ΡΠ΅ ΡΡΡΡΠΈ DID, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°Ρ Π²ΡΠ΅ΠΌΠ΅Π²ΠΈΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ; Π°ΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΡΠ΅Π΄ β ΡΡΠ°ΡΡΠΈΡΠ° ΡΠ΅ Π³Π»Π°ΡΠΎΠ²ΠΎ ΠΌΠ΅Π½Ρ. ΠΡ Π½Π΅Π³ΠΎ ΡΡΠ΅Π· Π½Π°ΡΠΈΡΠΊΠ°Π½Π΅ Π½Π° Π±ΡΡΠΎΠ½ 1 ΠΈΠ»ΠΈ ΠΏΠΎ ΡΠ°ΠΉΠΌΠ°ΡΡ ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π° ΠΊΡΠΌ Π³ΡΡΠΏΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΈ. Π‘Π»Π΅Π΄ ΠΊΡΠ°Ρ Π½Π° ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠ° ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΠΌΠ°ΠΊΡΠΎΡ hangupcall, ΡΠ»Π΅Π΄ ΠΊΠΎΠΉΡΠΎ Π½ΠΈΡΠΎ Π΄ΡΡΠ³ΠΎ Π² Π΄ΠΈΠ°Π»ΠΏΠ»Π°Π½Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈ, ΠΎΡΠ²Π΅Π½ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ (hangup handler).

ΠΡΠ΄Π΅ Π² ΡΠΎΠ·ΠΈ Π°Π»Π³ΠΎΡΠΈΡΡΠΌ Π·Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠΌΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π² CRM, ΠΊΡΠ΄Π΅ Π΄Π° Π·Π°ΠΏΠΎΡΠ²Π°ΠΌΠ΅ Π·Π°ΠΏΠΈΡ, ΠΊΡΠ΄Π΅ Π΄Π° ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°ΠΌΠ΅ Π·Π°ΠΏΠΈΡΠ° ΠΈ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΡΠ°ΡΠ°ΠΌΠ΅ Π·Π°Π΅Π΄Π½ΠΎ Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° CRM?
ΠΡΠ΅ΡΠ°ΡΠΈΡ Ρ Π²ΡΠ½ΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ
ΠΠ°ΠΊΠ²ΠΎ Π΅ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ AΠ’Π‘ ΠΈ CRM? Π’ΠΎΠ²Π° ΡΠ° Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°Ρ Π΄Π°Π½Π½ΠΈ ΠΈ ΡΡΠ±ΠΈΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²Π΅ΡΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ ΠΈ Π³ΠΈ ΠΏΡΠ΅Π΄Π°Π²Π°Ρ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ. ΠΠ°ΠΉ-ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΡΡ Π½Π°ΡΠΈΠ½ Π·Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π½Π° Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Π΅ ΡΡΠ΅Π· API, Π° Π½Π°ΠΉ-ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΈΡΡ Π½Π°ΡΠΈΠ½ Π·Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ API Π΅ HTTP REST. ΠΠΎ Π½Π΅ ΠΈ Π·Π° asterisk.
ΠΡΡΡΠ΅ Π² Asterisk ΠΈΠΌΠ°:
AGI β ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° Π²ΡΠ½ΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ/ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎ Π² Π΄ΠΈΠ°Π»ΠΏΠ»Π°Π½Π°, ΠΈΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΊΠ°ΡΠΎ ,
AMI β ΡΠ΅ΠΊΡΡΠΎΠ² TCP ΡΠΎΠΊΠ΅Ρ, ΠΊΠΎΠΉΡΠΎ ΡΠ°Π±ΠΎΡΠΈ Π½Π° ΠΏΡΠΈΠ½ΡΠΈΠΏΠ° Π½Π° ΠΏΠΎΠ΄ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ±ΠΈΡΠΈΡ ΠΈ Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, Π½Π°ΠΏΠΎΠΌΠ½Ρ Π½Π° SMTP ΠΎΡ Π²ΡΡΡΠ΅, ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π° ΡΡΠ±ΠΈΡΠΈΡ ΠΈ Π΄Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ, ΠΈΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° β Π½Π°ΠΉ-ΠΏΠΎΠΏΡΠ»ΡΡΠ½Π°ΡΠ° Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π²ΡΡΠ·ΠΊΠΈ Ρ Asterisk
ΠΡΠΈΠΌΠ΅ΡΠ΅Π½ ΠΈΠ·Ρ ΠΎΠ΄ ΠΎΡ AMI
Π‘ΡΠ±ΠΈΡΠΈΠ΅: Newchannel
ΠΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ: call,all
ΠΠ°Π½Π°Π»: PJSIP/VMS_pjsip-0000078b
ChannelState: 4
ChannelStateDesc: Ring
CallerIDNum: 111222
CallerIDName: 111222
ConnectedLineNum:
ConnectedLineName:
ΠΠ·ΠΈΠΊ: en
AccountCode:
ΠΠΎΠ½ΡΠ΅ΠΊΡΡ: from-pstn
Exten: s
ΠΡΠΈΠΎΡΠΈΡΠ΅Ρ: 1
Uniqueid: 1599589046.5244
Linkedid: 1599589046.5244
ARI β ΡΠΌΠ΅Ρ ΠΎΡ Π΄Π²Π΅ΡΠ΅, Π²ΡΠΈΡΠΊΠΎ ΠΏΡΠ΅Π· REST, WebSocket, Π² JSON ΡΠΎΡΠΌΠ°Ρ β Π½ΠΎ Ρ Π½ΠΎΠ²ΠΈΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ ΠΎΠ±Π²ΠΈΠ²ΠΊΠΈ Π½Π΅ΡΠ°ΡΠ° Π½Π΅ ΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠ½ΠΈ, Π½Π° ΠΏΡΡΠ² ΠΏΠΎΠ³Π»Π΅Π΄ Π½Π°ΠΌΠ΅ΡΠΈΡ ΠΌΠ΅ (, ) ΠΊΠΎΠΈΡΠΎ Π² ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ΡΠΎ ΡΠΈ ΡΠ° ΠΎΠΊΠΎΠ»ΠΎ 3 Π³ΠΎΠ΄ΠΈΠ½ΠΈ Π½Π°Π·Π°Π΄.
ΠΡΠΈΠΌΠ΅ΡΠ΅Π½ ΠΈΠ·Ρ ΠΎΠ΄ ΠΎΡ ARI ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅
{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id":"1599644315.5334", "name":"PJSIP/VMSpjsip-000007b6", "state":"Ring", "caller":{ "name":"111222", "number":"111222" }, "connected":{ "name":"", "number":"" }, "accountcode":"", "dialplan":{ "context":"from-pstn", "exten":"s", "priority":2, "appname":"Stasis", "appdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"ru" }, "asteriskid":"48:5b:aa:aa:aa:aa", "application":"hello-world" }
Π£Π΄ΠΎΠ±ΡΡΠ²ΠΎΡΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎΡΠΎ, Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° ΠΈΠ»ΠΈ Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π΄Π°Π΄Π΅Π½ΠΎ API ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΎΡ Π·Π°Π΄Π°ΡΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠ΅ΡΠ°Ρ. ΠΠ°Π΄Π°ΡΠΈΡΠ΅ Π·Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ CRM ΡΠ° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅:
ΠΠ° ΡΠ΅ ΠΏΡΠΎΡΠ»Π΅Π΄ΠΈ Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ, ΠΊΡΠ΄Π΅ Π΅ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ΅Π½ΠΎ, Π΄Π° ΡΠ΅ ΠΈΠ·Π²Π»Π΅ΡΠ΅ CallerID, DID, Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° Π½Π°ΡΠ°Π»ΠΎ ΠΈ ΠΊΡΠ°ΠΉ, ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π΄Π°Π½Π½ΠΈ ΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° (Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° ΡΠ΅Π»Π΅ΡΠΎΠ½Π° ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π² CRM)
ΠΠ° ΡΠ΅ Π·Π°ΠΏΠΎΡΠ½Π΅ ΠΈ Π·Π°Π²ΡΡΡΠΈ Π·Π°ΠΏΠΈΡΠ° Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ, Π΄Π° ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈ Π² Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ ΡΠΎΡΠΌΠ°Ρ, Π΄Π° ΡΠ΅ ΡΡΠΎΠ±ΡΠΈ ΡΠ»Π΅Π΄ Π·Π°Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° Π·Π°ΠΏΠΈΡΠ° ΠΊΡΠ΄Π΅ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° ΡΠ°ΠΉΠ»ΡΡ
ΠΠ° ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΠΈΡΠ° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ ΠΏΠΎ Π²ΡΠ½ΡΠ½ΠΎ ΡΡΠ±ΠΈΡΠΈΠ΅ (ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°), Π΄Π° ΡΠ΅ ΠΏΠΎΠ·Π²ΡΠ½ΠΈ Π½Π° Π²ΡΡΡΠ΅ΡΠ΅Π½ Π½ΠΎΠΌΠ΅Ρ, Π²ΡΠ½ΡΠ΅Π½ ΠΈ Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ°Ρ
ΠΠΎ ΠΈΠ·Π±ΠΎΡ: ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½Π΅ Ρ CRM, Π³ΡΡΠΏΠΈ Π·Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ FollowME Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½ΠΈΡ, ΠΊΠΎΠ³Π°ΡΠΎ Π½Π΅ ΡΡΠ΅ Π½Π° ΠΌΡΡΡΠΎ (ΠΏΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΡ CRM)
ΠΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ Π·Π°Π΄Π°ΡΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΠ΅ΡΠ°Ρ ΡΡΠ΅Π· AMI ΠΈΠ»ΠΈ ARI, Π½ΠΎ ARI ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π½ΡΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠ±ΠΈΡΠΈΡ, ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π΅ ΡΠ΅ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Ρ, ΠΊΠΎΠΈΡΠΎ Π² AMI Π²ΡΠ΅ ΠΏΠ°ΠΊ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° ΠΌΠ°ΠΊΡΠΎΡΠΈ, Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΠΌΠ°ΠΊΡΠΎΡΠΈ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π·Π°ΠΏΠΈΡ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½ΠΈΡ). ΠΠ°ΡΠΎΠ²Π°, Π·Π° ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΈ ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ β Π·Π°ΡΠ΅Π³Π° ΡΠ΅ ΠΈΠ·Π±Π΅ΡΠ΅ΠΌ AMI (Π½ΠΎ Π½Π΅ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π½ΠΎ). ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° (ΠΊΠ°ΠΊ ΠΈΠ½Π°ΡΠ΅, Π½ΠΈΠ΅ ΡΠΌΠ΅ ΠΌΡΡΠ·Π΅Π»ΠΈΠ²ΠΈ) β Π² ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ° () ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ PAMI. *Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠΎΠ±Π²Π°ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ΅ΠΌ Π½Π° ARI, Π½ΠΎ Π½Π΅ Π΅ ΡΠΈΠ³ΡΡΠ½ΠΎ, ΡΠ΅ ΡΠ΅ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ.
ΠΡΠΈΠ΄ΡΠΌΠ²Π°ΠΌΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΡΠ° ΠΎΡΠ½ΠΎΠ²ΠΎ
ΠΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ Π½Π°ΡΠΈΡΡ FreePBX Π΄Π° ΡΡΠΎΠ±ΡΠ°Π²Π° Π½Π° AMI ΠΏΠΎ ΠΏΡΠΎΡΡ Π½Π°ΡΠΈΠ½ Π·Π° Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ, Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΊΡΠ°Ρ, Π½ΠΎΠΌΠ΅ΡΠ°ΡΠ°, ΠΈΠΌΠ΅Π½Π°ΡΠ° Π½Π° Π·Π°ΠΏΠΈΡΠ°Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, Π½Π°ΠΉ-Π»Π΅ΡΠ½ΠΎ Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΡΡΠΈΡ ΡΡΠΈΠΊ, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π° ΠΈ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡΠ΅ Π°Π²ΡΠΎΡΠΈ β Π΄Π° Π²ΡΠ²Π΅Π΄Π΅ΠΌ ΡΠ²ΠΎΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΈ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΈΠ·Ρ ΠΎΠ΄Π° Π·Π° ΡΡΡ Π½ΠΎΡΠΎ ΠΏΡΠΈΡΡΡΡΠ²ΠΈΠ΅. PAMI ΠΏΡΠ΅Π΄Π»Π°Π³Π° Π΄Π° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ ΡΠΎΠ²Π° ΠΏΡΠΎΡΡΠΎ ΡΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΡ-ΡΠΈΠ»ΡΡΡ.
ΠΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π·Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° Π½Π°ΡΠ°Π»ΠΎ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ (s β ΡΠΎΠ²Π° Π΅ ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ Π½ΠΎΠΌΠ΅Ρ Π² Π΄ΠΈΠ°Π»ΠΏΠ»Π°Π½Π°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΠ ΠΠΠ Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° ΡΡΡΡΠ΅Π½Π΅ΡΠΎ ΠΏΠΎ DID)
[ext-did-custom]
exten => s,1,Set(CallStart=${STRFTIME(epoch,,%s)})ΠΡΠΈΠΌΠ΅Ρ Π½Π° AMI ΡΡΠ±ΠΈΡΠΈΠ΅ ΠΏΠΎ ΡΠ°Π·ΠΈ Π»ΠΈΠ½ΠΈΡ
Π‘ΡΠ±ΠΈΡΠΈΠ΅: Newchannel
ΠΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ: call,all
ΠΠ°Π½Π°Π»: PJSIP/VMS_pjsip-0000078b
ChannelState: 4
ChannelStateDesc: Ring
CallerIDNum: 111222
CallerIDName: 111222
ConnectedLineNum:
ConnectedLineName:
ΠΠ·ΠΈΠΊ: en
AccountCode:
ΠΠΎΠ½ΡΠ΅ΠΊΡΡ: from-pstn
Exten: s
ΠΡΠΈΠΎΡΠΈΡΠ΅Ρ: 1
Uniqueid: 1599589046.5244
Linkedid: 1599589046.5244
Application: Set AppData:
CallStart=1599571046
ΠΠΎΠ½Π΅ΠΆΠ΅ FreePBX ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ²Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ extention.conf ΠΈ extention_additional.conf, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ°ΠΉΠ»Π° extention_custom.conf
ΠΡΠ»Π΅Π½ ΠΊΠΎΠ΄ extention_custom.conf
[globals]
;; ΠΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅ ΠΏΡΡΠΈΡΠ°ΡΠ° ΠΈ ΠΏΡΠ°Π²Π°ΡΠ° Π½Π° ΠΏΠ°ΠΏΠΊΠΈΡΠ΅ - ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ asterisk ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠ° ΠΏΡΠ°Π²Π° Π·Π° Π·Π°ΠΏΠΈΡ
;; Π’ΡΠΊ ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠΈΡΠ²Π°Ρ ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠΈΡΠ΅
WAV=\/var\/www\/html\/callme\/records\/wav
MP3=\/var\/www\/html\/callme\/records\/mp3
;; ΠΠΎ ΡΠ΅Π·ΠΈ ΠΏΡΡΠΈΡΠ° ΡΠ΅ ΡΠ΅ Π²ΡΠ·ΠΏΡΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π°Ρ ΠΈ ΡΠ²Π°Π»ΡΡ Π·Π°ΠΏΠΈΡΠΈΡΠ΅
URLRECORDS=https:\/\/www.host.ru\/callmeplus\/records\/mp3
;; ΠΠ΄ΡΠ΅Ρ Π·Π° ΠΎΠ±ΡΠ°ΡΠ΅Π½ ΠΏΠΎΠ²ΠΈΠΊ Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄ΡΡΠΎ ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅
URLPHP=https:\/\/www.host.ru\/callmeplus
;; ΠΠ°, Π·Π°ΠΏΠΈΡΠ²Π°ΠΌΠ΅ ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠΈΡΠ΅
RECORDING=1
;; Π’ΠΎΠ²Π° Π΅ ΠΌΠ°ΠΊΡΠΎΡ Π·Π° Π·Π°ΠΏΠΈΡ Π½Π° ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠΈ Π² Π½Π°ΡΠ°ΡΠ° ΠΏΠ°ΠΏΠΊΠ°.
;; ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ΅Π½ Π·Π°ΠΏΠΈΡ, Π½ΠΎ Π·Π°ΡΠ΅Π³Π° Π½Π΅ΠΊΠ° Π΄Π° Π΅ ΡΠΎΠ·ΠΈ -
;; ΡΠΎΠΉ ΡΠ°Π±ΠΎΡΠΈ
[recording]
exten => ~~s~~,1,Set(LOCAL(calling)=${ARG1})
exten => ~~s~~,2,Set(LOCAL(called)=${ARG2})
exten => ~~s~~,3,GotoIf($["${RECORDING}" = "1"]?4:14)
exten => ~~s~~,4,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called})
exten => ~~s~~,5,Set(datedir=${STRFTIME(${EPOCH},,%Y\/%m\/%d)})
exten => ~~s~~,6,System(mkdir -p ${MP3}\/${datedir})
exten => ~~s~~,7,System(mkdir -p ${WAV}\/${datedir})
exten => ~~s~~,8,Set(monopt=nice -n 19 \/usr\/bin\/lame -b 32 --silent "${WAV}\/${datedir}\/${fname}.wav" "${MP3}\/${datedir}\/${fname}.mp3" && rm -f "${WAV}\/${fname}.wav" && chmod o+r "${MP3}\/${datedir}\/${fname}.mp3")
exten => ~~s~~,9,Set(FullFname=${URLRECORDS}\/${datedir}\/${fname}.mp3)
exten => ~~s~~,10,Set(CDR(filename)=${fname}.mp3)
exten => ~~s~~,11,Set(CDR(recordingfile)=${fname}.wav)
exten => ~~s~~,12,Set(CDR(realdst)=${called})
exten => ~~s~~,13,MixMonitor(${WAV}\/${datedir}\/${fname}.wav,b,${monopt})
exten => ~~s~~,14,NoOp(Finish if_recording_1)
exten => ~~s~~,15,Return()
;; Π’ΠΎΠ²Π° Π΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π·Π° Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠ°
[ext-did-custom]
;; Π’ΠΎΠ²Π° Π΅ Π½Π΅ΡΠ΅Π΄Π½ΠΎΡΡ, Π΄Π° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ ΡΠ°ΠΊΠ° ΡΡΠΊ, Π½ΠΎ ΡΠ°Π±ΠΎΡΠΈ - Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ '8' ΠΊΡΠΌ Π½ΠΎΠΌΠ΅ΡΠ°
nexten => s,1,Set(CALLERID(num)=8${CALLERID(num)})
;; Π’ΡΠΊ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π·Π° ΡΠΊΡΠΈΠΏΡΠ°
exten => s,n,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
exten => s,n,ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp())
exten => s,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})
;; ΠΠ°ΠΉ-Π²Π°ΠΆΠ½ΠΎΡΠΎ! ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π° ΠΊΡΠ°Ρ Π½Π° ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠ°.
;; ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡΠ΅ ΠΏΡΡΠΈΡΠ° Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΊΡΠ°Ρ Π½Π΅ ΡΠ°Π±ΠΎΡΡΡ - Macro(hangupcall,) Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π·Π²Π°Π»Ρ.
;; ΠΠ°ΡΠΎΠ²Π° Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ Hangup_Handler Π½Π° ΠΊΡΠ°Ρ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ
exten => s,n,Set(CHANNEL(hangup_handler_push)=sub-call-from-cid-ended,s,1(${CALLERID(num)},${EXTEN}))
;; ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π° ΠΊΡΠ°Ρ Π½Π° Π²Ρ
ΠΎΠ΄ΡΡΠΎ ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅
[sub-call-from-cid-ended]
;; ΠΠΎΠΊΠ»Π°Π΄Π²Π°ΠΌΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ ΠΏΡΠΈ ΠΊΡΠ°Ρ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ
exten => s,1,Set(CDR_PROP(disable)=true)
exten => s,n,Set(CallStop=${STRFTIME(epoch,,%s)})
exten => s,n,Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)})
;; Π‘ΡΠ°ΡΡΡ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ - ΠΡΠ³ΠΎΠ²ΠΎΡ, Π½Π΅ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ΅Π½ΠΎ...
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})
exten => s,n,Return
;; ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄ΡΡΠΈ ΠΎΠ±Π°ΠΆΠ΄Π°Π½ΠΈΡ - Π²ΡΠΈΡΠΊΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ
[outbound-allroutes-custom]
;; ΠΠ°ΠΏΠΈΡ
exten => _.,1,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
;; ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ
exten => _.,n,Set(__CallIntNum=${CALLERID(num)})
exten => _.,n,Set(CallExtNum=${EXTEN})
exten => _.,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten => _.,n,Set(CallmeCALLID=${SIPCALLID})
;; ΠΠ°Π΄Π°Π²Π°ΠΌΠ΅ Hangup_Handler Π½Π° ΠΊΡΠ°Ρ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ
exten => _.,n,Set(CHANNEL(hangup_handler_push)=sub-call-internal-ended,s,1(${CALLERID(num)},${EXTEN}))
;; ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π° ΠΊΡΠ°Ρ Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄ΡΡΠΎ ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅
[sub-call-internal-ended]
;; ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ
exten => s,1,Set(CDR_PROP(disable)=true)
exten => s,n,Set(CallStop=${STRFTIME(epoch,,%s)})
exten => s,n,Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)})
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})
;; ΠΠ·Π²ΠΈΠΊΠ²Π°ΠΌΠ΅ ΡΠΊΡΠΈΠΏΡΠ°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΡΠΎΠ±ΡΠΈ Π·Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π² CRM - ΡΠΎΠ²Π° Π΅ ΠΈΠ·Ρ
ΠΎΠ΄ΡΡΠΎ,
;; ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΠΎ ΡΠ°ΠΊΡΠΈ Π½Π° ΠΊΡΠ°Ρ
exten => s,n,System(curl -s ${URLPHP}\/CallMeOut.php --data action=sendcall2b24 --data ExtNum=${CallExtNum} --data call_id=${SIPCALLID} --data-urlencode FullFname='${FullFname}' --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition='${CallMeDISPOSITION}')
exten => s,n,ReturnΠ₯Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° ΠΈ ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π΄ΠΈΠ°Π»ΠΏΠ»Π°Π½Π° Π°Π²ΡΠΎΡΠΎΠ² ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ°ΡΡΠΈ β
ΠΠΈΠ°Π»ΠΏΠ»Π°Π½ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ .conf, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ FreePBX ΡΡΠΎΠ³ΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ (Π΄Π°, ΠΎΠ½ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ .ael, Π½ΠΎ Π½Π΅ Π²ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΠΈ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΡΡΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ)
ΠΠΌΠ΅ΡΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ ΡΠ΅ΡΠ΅Π· exten=>h Π²Π²Π΅Π΄Π΅Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ΅ΡΠ΅Π· hangup_handler, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΄ΠΈΠ°Π»ΠΏΠ»Π°Π½ FreePBX Π·Π°ΡΠ°Π±ΠΎΡΠ°Π» ΡΠΎΠ»ΡΠΊΠΎ Ρ Π½ΠΈΠΌ
ΠΡΠΏΡΠ°Π²Π»Π΅Π½Π° ΡΡΡΠΎΠΊΠ° Π²ΡΠ·ΠΎΠ²Π° ΡΠΊΡΠΈΠΏΡΠ°, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ ΠΊΠ°Π²ΡΡΠΊΠΈ ΠΈ Π²Π½Π΅ΡΠ½ΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ Π·Π²ΠΎΠ½ΠΊΠ° ExtNum
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²ΡΠ½Π΅ΡΠ΅Π½Ρ Π² _custom ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΡ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π½Π΅ ΡΡΠΎΠ³Π°ΡΡ ΠΈ Π½Π΅ ΠΏΡΠ°Π²ΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΠΈ FreePBX β Π²Ρ ΠΎΠ΄ΡΡΠΈΠ΅ ΡΠ΅ΡΠ΅Π· [ext-did-custom], ΠΈΡΡ ΠΎΠ΄ΡΡΠΈΠ΅ ΡΠ΅ΡΠ΅Π· [outbound-allroutes-custom]
ΠΠ΅Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊ Π½ΠΎΠΌΠ΅ΡΠ°ΠΌ β ΡΠ°ΠΉΠ» ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π΅Π½ ΠΈ ΡΡΠ΅Π±ΡΠ΅Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΡΠΈ ΠΈ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΡΠ°Π±ΠΎΡΡ Π½ΡΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠΊΡΠΈΠΏΡΡ Π² AMI ΠΏΠΎ Π»ΠΎΠ³ΠΈΠ½Ρ ΠΈ ΠΏΠ°ΡΠΎΠ»Ρ β Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π² FreePBX ΡΠΎΠΆΠ΅ Π΅ΡΡΡ _custom ΡΠ°ΠΉΠ»
Π€Π°ΠΉΠ» manager_custom.conf
;; ΡΡΠΎ Π»ΠΎΠ³ΠΈΠ½
[callmeplus]
;; ΡΡΠΎ ΠΏΠ°ΡΠΎΠ»Ρ
secret = trampampamturlala
deny = 0.0.0.0/0.0.0.0
;; Ρ ΡΠ°Π±ΠΎΡΠ°Ρ Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½ΠΎΠΉ - Π½ΠΎ Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΏΠΈΡΠ°ΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅
permit = 127.0.0.1/255.255.255.255
read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan
write = system,call,agent,log,verbose,user,config,command,reporting,originateΠΠ±Π° ΡΡΠΈΡ ΡΠ°ΠΉΠ»Π° Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ Π² /etc/asterisk, Π·Π°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΠΈ (ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΡΡ Asterisk)
# astrisk -rv
Connected to Asterisk 16.6.2 currently running on freepbx (pid = 31629)
#freepbx*CLI> dialplan reload
Dialplan reloaded.
#freepbx*CLI> exitΠ’Π΅ΠΏΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ PHP
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΊΡΠΈΠΏΡΠΎΠ² ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΠ°
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡ Π΅ΠΌΠ° ΡΠ°Π±ΠΎΡΡ Ρ ΠΠΈΡΡΠΈΠΊΡ 24, ΡΠ΅ΡΠ²ΠΈΡΠΎΠΌ Π΄Π»Ρ AMI, Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠ° ΠΈ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½Π°, Π΅ΠΉ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ΄Π΅Π»ΠΈΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. Asterisk ΠΏΡΠΈ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΈ AMI ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΠΏΠΎΡΡ ΠΈ Π²ΡΠ΅. ΠΡΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΎΠ½ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ, Π·Π°ΡΠ΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π½Π° Π½ΡΠΆΠ½ΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ. Π‘ΠΎΠ±ΡΡΠΈΡ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ Π² ΠΏΡΠΎΡΡΠΎΠΌ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠΉ PAMI ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ Π² ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°Π΄Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡΠΈΠΌ ΡΠΎΠ±ΡΡΠΈΡΠΌ, ΠΏΠΎΠ»ΡΠΌ, Π½ΠΎΠΌΠ΅ΡΠ°ΠΌ ΠΈ Ρ.Π΄.
ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΡΡΠΏΠ°Π΅Ρ Π·Π²ΠΎΠ½ΠΎΠΊ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΠΎΠ±ΡΡΠΈΠ΅ NewExten, Π½Π°ΡΠΈΠ½Π°Ρ Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° [from-pstn], Π·Π°ΡΠ΅ΠΌ ΠΈΠ΄ΡΡ Π²ΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΠΎΠΊ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°Ρ . ΠΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈΠ· Π·Π°Π΄Π°Π½Π½ΡΡ Π² Π΄ΠΈΠ°Π»ΠΏΠ»Π°Π½Π΅ _custom ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ CallMeCallerIDName ΠΈ CallStart Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ.
Π€ΡΠ½ΠΊΡΠΈΡΡΠ° Π·Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ UserID, ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°ΡΠ° Π½Π° Π²ΡΡΡΠ΅ΡΠ½ΠΈΡ Π½ΠΎΠΌΠ΅Ρ, ΠΊΡΠΌ ΠΊΠΎΠΉΡΠΎ Π΅ ΠΏΠΎΡΡΡΠΏΠΈΠ»ΠΎ ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ. Π Π°ΠΊΠΎ ΡΠΎΠ²Π° Π΅ Π³ΡΡΠΏΠ° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ? ΠΡΠΏΡΠΎΡΡΡ Π΅ ΠΏΠΎΠ»ΠΈΡΠΈΡΠ΅ΡΠΊΠΈ, ΡΡΡΠ±Π²Π° Π»ΠΈ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ Π΄ΠΎ Π²ΡΠΈΡΠΊΠΈ Π½Π°Π²Π΅Π΄Π½ΡΠΆ (ΠΊΠΎΠ³Π°ΡΠΎ Π·Π²ΡΠ½ΡΡ Π²ΡΠΈΡΠΊΠΈ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ) ΠΈΠ»ΠΈ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΠΎΠ΅ΡΠ°ΠΏΠ½ΠΎ, ΠΏΡΠΈ Π΅Π΄Π½ΠΎ ΡΠ»Π΅Π΄ Π΄ΡΡΠ³ΠΎ ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅? ΠΡΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ Π΅ Π·Π°Π΄Π°Π΄Π΅Π½Π° ΡΡΡΠ°ΡΠ΅Π³ΠΈΡΡΠ° First Available, Π·Π°ΡΠΎΠ²Π° Π½ΡΠΌΠ°ΠΌΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, Π·Π²ΡΠ½ΠΈ ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΡΠΎΠ²Π΅ΠΊ. ΠΠΎ Π²ΡΠΏΡΠΎΡΡΡ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠ΅ΡΠΈ.
Π€ΡΠ½ΠΊΡΠΈΡΡΠ° Π·Π° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ Π² ΠΠΈΡΡΠΈΠΊΡ24, ΠΊΠΎΡΡΠΎ Π²ΡΡΡΠ° CallID, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ Π·Π° Π΄ΠΎΠΊΠ»Π°Π΄Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ ΠΈ Π»ΠΈΠ½ΠΊΠ° ΠΊΡΠΌ Π·Π°ΠΏΠΈΡΠ°. ΠΠ·ΠΈΡΠΊΠ²Π° ΠΈΠ»ΠΈ Π²ΡΡΡΠ΅ΡΠ΅Π½ Π½ΠΎΠΌΠ΅Ρ, ΠΈΠ»ΠΈ UserID.

Π‘Π»Π΅Π΄ ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π·Π° Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π·Π°ΠΏΠΈΡΠ°, ΠΊΠΎΡΡΠΎ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΡΠΎΠ±ΡΠ°Π²Π° ΡΡΠ°ΡΡΡΠ° Π½Π° ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ (ΠΠ°Π΅Ρ, ΠΡΠΌΠ° ΠΎΡΠ³ΠΎΠ²ΠΎΡ, Π£ΡΠΏΠ΅Ρ ), Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π·Π°ΡΠ΅ΠΆΠ΄Π° Π»ΠΈΠ½ΠΊ ΠΊΡΠΌ mp3 ΡΠ°ΠΉΠ»Π° Ρ Π·Π°ΠΏΠΈΡΠ° (Π°ΠΊΠΎ ΠΈΠΌΠ° ΡΠ°ΠΊΡΠ²).
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΌΠΎΠ΄ΡΠ»ΡΡ CallMeIn.php ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠΎ, Π·Π° Π½Π΅Π³ΠΎ Π±Π΅ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½ ΡΠ°ΠΉΠ» Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° SystemD. callme.service, ΠΊΠΎΠΉΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΡΡΠ°Π²Π΅Π½ Π² /etc/systemd/system/callme.service
[Unit]
Description=CallMe
[Service]
WorkingDirectory=/var/www/html/callmeplus
ExecStart=/usr/bin/php /var/www/html/callmeplus/CallMeIn.php 2>&1 >>/var/log/callmeplus.log
ExecStop=/bin/kill -WINCH ${MAINPID}
KillSignal=SIGKILL
Restart=on-failure
RestartSec=10s
#ΡΡΠΊ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΡ ΠΏΡΠ°Π²Π°ΡΠ° Π½Π° ΠΏΠ°ΠΏΠΊΠΈΡΠ΅
#User=www-data #Ubuntu - debian
#User=nginx #Centos
[Install]
WantedBy=multi-user.targetΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠΊΡΠΈΠΏΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΡΠ΅Π· systemctl ΠΈΠ»ΠΈ service.
# systemctl enable callme
# systemctl start callmeΠ‘Π΅ΡΠ²ΠΈΡΡΡ ΡΠ΅ ΡΠ΅ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ° ΠΏΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ (ΠΏΡΠΈ ΠΏΠ°Π΄Π°Π½ΠΈΡ). Π‘Π΅ΡΠ²ΠΈΠ·ΡΡ Π·Π° Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Π²Ρ ΠΎΠ΄ΡΡΠΈ ΠΎΠ±Π°ΠΆΠ΄Π°Π½ΠΈΡ Π½Π΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅Π± ΡΡΡΠ²ΡΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π΅ ΡΠ°ΠΌΠΎ PHP (ΠΊΠΎΠΉΡΠΎ ΡΡΡ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ Π΅ Π½Π°Π»ΠΈΡΠ΅Π½ Π½Π° ΡΡΡΠ²ΡΡΠ° FeePBX). ΠΠΎ ΠΏΡΠΈ Π»ΠΈΠΏΡΠ° Π½Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π·Π°ΠΏΠΈΡΠΈΡΠ΅ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½ΠΈΡΡΠ° ΡΡΠ΅Π· ΡΠ΅Π± ΡΡΡΠ²ΡΡ (ΠΎΡΠ΅ ΠΈ Ρ https) Π½ΡΠΌΠ° Π΄Π° ΠΈΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΏΡΠΎΡΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° Π·Π°ΠΏΠΈΡΠΈΡΠ΅ Π½Π° ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠΈΡΠ΅.
Π‘Π΅Π³Π° Π΄Π° ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° ΠΈΠ·Ρ ΠΎΠ΄ΡΡΠΈΡΠ΅ ΠΎΠ±Π°ΠΆΠ΄Π°Π½ΠΈΡ. Π‘ΠΊΡΠΈΠΏΡΡΡ CallMeOut.php ΠΈΠΌΠ° Π΄Π²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ:
ΠΠ½ΠΈΡΠΈΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ ΠΏΡΠΈ ΠΏΠΎΡΡΡΠΏΠ²Π°Π½Π΅ Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ ΠΊΡΠΌ PHP ΡΠΊΡΠΈΠΏΡΠ° (Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎ Π±ΡΡΠΎΠ½Π° βΠΠΎΠ·Π²ΡΠ½ΠΈβ Π² ΡΠ°ΠΌΠΈΡ ΠΠΈΡΡΠΈΠΊΡ). ΠΠ΅Π· ΡΠ΅Π± ΡΡΡΠ²ΡΡ Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ, Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ ΠΏΠΎΡΡΡΠΏΠ²Π° ΡΡΠ΅Π· HTTP POST, Π² Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° ΡΠΎΠΊΠ΅Π½.
Π‘ΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ, Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² ΠΠΈΡΡΠΈΠΊΡ. Π‘ΡΠ°Π²Π° ΠΏΠΎ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΈΠ²Π° Π½Π° Asterisk Π² Π΄ΠΈΠ°Π»ΠΏΠ»Π°Π½Π° [sub-call-internal-ended] ΠΏΡΠΈ ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅ΡΠΎ.

Π£Π΅Π± ΡΡΡΠ²ΡΡ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΡΠ°ΠΌΠΎ Π·Π° Π΄Π²Π΅ Π½Π΅ΡΠ° β Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Ρ Π·Π°ΠΏΠΈΡΠΈ ΠΎΡ ΠΠΈΡΡΠΈΠΊΡ (ΠΏΠΎ HTTPS) ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΡΠΊΡΠΈΠΏΡΠ° CallMeOut.php. ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π²Π³ΡΠ°Π΄Π΅Π½ ΡΡΡΠ²ΡΡ FreePBX, ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π·Π° ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°Ρ Π² /var/www/html, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° Π΄ΡΡΠ³ ΡΡΡΠ²ΡΡ ΠΈΠ»ΠΈ Π΄Π° ΡΠ΅ Π·Π°Π΄Π°Π΄Π΅ Π΄ΡΡΠ³ ΠΏΡΡ.
Π£Π΅Π± ΡΡΡΠ²ΡΡ
ΠΡΡΠ°Π²ΡΠΌΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° Π½Π° ΡΠ΅Π± ΡΡΡΠ²ΡΡΠ° Π·Π° ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½ΠΎ ΠΈΠ·ΡΡΠ°Π²Π°Π½Π΅ (, , ). ΠΠΊΠΎ Π½ΡΠΌΠ°ΡΠ΅ Π΄ΠΎΠΌΠ΅ΠΉΠ½, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΠΏΠΈΡΠ°ΡΠ΅ FreeDomain( ), ΠΊΠΎΠΈΡΠΎ Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΎ ΡΠ΅ Π²ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ ΠΈΠΌΠ΅ Π·Π° Π²Π°ΡΠΈΡ Π±ΡΠ» IP (Π½Π΅ Π·Π°Π±ΡΠ°Π²ΡΠΉΡΠ΅ Π΄Π° ΠΏΡΠ΅Π½Π°ΡΠΎΡΠΈΡΠ΅ ΠΏΠΎΡΡΠΎΠ²Π΅ΡΠ΅ 80, 443 ΠΏΡΠ΅Π· ΡΡΡΠ΅ΡΠ°, Π°ΠΊΠΎ Π²ΡΠ½ΡΠ½ΠΈΡΡ Π°Π΄ΡΠ΅Ρ Π΅ ΡΠ°ΠΌΠΎ Π½Π° Π½Π΅Π³ΠΎ). ΠΠΊΠΎ ΡΠΎΠΊΡ-ΡΠΎ ΡΡΠ΅ ΡΡΠ·Π΄Π°Π»ΠΈ DNS Π΄ΠΎΠΌΠ΅ΠΉΠ½, ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΡΠ°ΠΊΠ°ΡΠ΅ (ΠΎΡ 15 ΠΌΠΈΠ½ΡΡΠΈ Π΄ΠΎ 48 ΡΠ°ΡΠ°), Π΄ΠΎΠΊΠ°ΡΠΎ Π²ΡΠΈΡΠΊΠΈ ΡΡΡΠ²ΡΡΠΈ ΡΠ΅ Π·Π°ΡΠ΅Π΄ΡΡ. Π‘ΠΏΠΎΡΠ΅Π΄ ΠΎΠΏΠΈΡΠΈΡΠ΅ Ρ ΠΌΠ΅ΡΡΠ½ΠΈ Π΄ΠΎΡΡΠ°Π²ΡΠΈΡΠΈ - ΠΎΡ 1 ΡΠ°Ρ Π΄ΠΎ 24 ΡΠ°ΡΠ°.
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ°
Π GitHub Π΅ Π·Π°ΠΏΠΎΡΠ½Π°ΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΎΡ, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° ΠΎΡΠ΅ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ. ΠΠΎ Π³Π»Π°Π΄ΠΊΠΎ Π±Π΅ΡΠ΅ ΡΠ°ΠΌΠΎ Π½Π° Ρ Π°ΡΡΠΈΡ β Π·Π° ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΎ ΡΡΡΠ½ΠΎ, Π½ΠΎ ΡΠ»Π΅Π΄ ΡΠ°Π±ΠΎΡΠ° Ρ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° ΡΡΠ°Π½Π° ΠΊΡΠΈΡΡΠ°Π»Π½ΠΎ ΡΡΠ½ΠΎ, ΠΊΠΎΠΉ Ρ ΠΊΠΎΠ³ΠΎ Π΄ΡΡΠΆΠΈ, ΠΊΠΎΠΉ Π½Π°ΠΊΡΠ΄Π΅ Ρ ΠΎΠ΄ΠΈ ΠΈ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ Π΄Π΅Π±ΡΠ³Π²Π°ΠΌΠ΅. ΠΡΠ΅ ΠΎΡΠ΅ Π½ΡΠΌΠ° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΎΡ (
Docker
ΠΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π±ΡΡΠ·ΠΎ Π΄Π° ΡΠ΅ΡΡΠ²Π°ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ β ΠΈΠΌΠ° ΠΎΠΏΡΠΈΡ Ρ Docker β Π±ΡΡΠ·ΠΎ ΡΡΠ·Π΄Π°ΠΉΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, Π΄Π°ΠΉΡΠ΅ ΠΌΡ ΠΏΠΎΡΡΠΎΠ²Π΅ Π½Π°Π²ΡΠ½, ΠΏΠΎΠ΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΈ ΠΎΠΏΠΈΡΠ°ΠΉΡΠ΅ (ΡΠΎΠ²Π° Π΅ Π²Π°ΡΠΈΠ°Π½Ρ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π½Π° LetsEncrypt, Π°ΠΊΠΎ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡΡ Π²Π΅ΡΠ΅ Π΅ Π½Π°Π»ΠΈΡΠ΅Π½, ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠ΅Π½Π°ΡΠΎΡΠΈΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΈΡ ΠΏΡΠΎΠΊΡΠΈ ΠΊΡΠΌ ΡΠ΅Π± ΡΡΡΠ²ΡΡΠ° FreePBX (Π½Π° Π½Π΅Π³ΠΎ ΡΠΌΠ΅ Π΄Π°Π»ΠΈ Π΄ΡΡΠ³ ΠΏΠΎΡΡ β 88), LetsEncrypt Π² Docker ΠΏΠΎ ΠΌΠΎΡΠΈΠ²ΠΈ
Π€Π°ΠΉΠ»ΡΡ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Π² ΠΈΠ·ΡΠ΅Π³Π»Π΅Π½Π°ΡΠ° ΠΏΠ°ΠΏΠΊΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° (ΡΠ»Π΅Π΄ git clone), Π½ΠΎ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈΡΠ΅ Π½Π° Asterisk (ΠΏΠ°ΠΏΠΊΠ° asterisk) ΠΈ Π΄Π° ΡΠ΅ Π·Π°Π΄Π°Π΄Π°Ρ ΠΏΡΡΠΈΡΠ° ΠΊΡΠΌ Π·Π°ΠΏΠΈΡΠΈΡΠ΅ ΠΈ URL Π°Π΄ΡΠ΅ΡΠ° Π½Π° Π²Π°ΡΠΈΡ ΡΠ°ΠΉΡ.
version: '3.3'
services:
nginx:
image: nginx:1.15-alpine
ports:
- "80:80"
- "443:443"
volumes:
- .\/nginx\/ssl_docker.conf:\/etc\/nginx\/conf.d\/ssl_docker.conf
certbot:
image: certbot\/certbot
freepbx:
image: flaviostutz\/freepbx
ports:
- 88:80 # Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ°
- 5060:5060\/udp
- 5160:5160\/udp
- 127.0.0.1:5038:5038 # Π·Π° CallMeOut.php
# - 3306:3306
- 18000-18100:18000-18100\/udp
restart: always
environment:
- ADMIN_PASSWORD=admin123
volumes:
- backup:\/backup
- recordings:\/var\/spool\/asterisk\/monitor
- .\/callme:\/var\/www\/html\/callme
- .\/systemd\/callme.service:\/etc\/systemd\/system\/callme.conf
- .\/asterisk\/manager_custom.conf:\/etc\/asterisk\/manager_custom.conf
- .\/asterisk\/extensions_custom.conf:\/etc\/asterisk\/extensions_custom.conf
# - .\/conf\/startup.sh:\/startup.sh
volumes:
backup:
recordings:
Π’ΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» docker-compose.yaml ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΡΡΠ΅Π·
docker-compose up -d
ΠΠΊΠΎ nginx Π½Π΅ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°, Π·Π½Π°ΡΠΈ Π½Π΅ΡΠΎ Π½Π΅ Π΅ Π½Π°ΡΠ΅Π΄ Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° nginx\/ssl_docker.conf
ΠΡΡΠ³ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ
Π Π·Π°ΡΠΎ Π΄Π° Π½Π΅ Π²ΠΊΠ»ΡΡΠΈΠΌ ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ CRM Π² ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ΡΠ΅, ΠΏΠΎΠΌΠΈΡΠ»ΠΈΡ ΠΌΠ΅. ΠΠ·ΡΡΠΈΡ ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ API Π½Π° Π΄ΡΡΠ³ΠΈ CRM, ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π±Π΅Π·ΠΏΠ»Π°ΡΠ½Π°ΡΠ°, Π²Π³ΡΠ°Π΄Π΅Π½Π° Π² Π½ΡΠΊΠΎΠΈ ΠΠ’Π‘ β ShugarCRM ΠΈ Vtiger, ΠΈ Π΄Π°! ΠΌΠΎΠΆΠ΅, ΠΏΡΠΈΠ½ΡΠΈΠΏΡΡ Π΅ ΡΡΡΠΈΡΡ. ΠΠΎ ΡΠΎΠ²Π° Π΅ Π΄ΡΡΠ³Π° ΠΈΡΡΠΎΡΠΈΡ, ΠΊΠΎΡΡΠΎ ΠΏΠΎΡΠ»Π΅ ΡΠ΅ ΠΊΠ°ΡΠΈΠΌ Π½Π° GitHub ΠΎΡΠ΄Π΅Π»Π½ΠΎ.
ΠΡΡΠ·ΠΊΠΈ
ΠΠΎΠ΄ΡΡ Π΅ Π½Π° GitHub β
Π‘ΡΠ°ΡΠΈΡ Π·Π° Π²Π΄ΡΡ Π½ΠΎΠ²Π΅Π½ΠΈΠ΅
ΠΠΈΡΠΊΠ»Π΅ΠΉΠΌΠ΅Ρ: Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΡΡΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ Ρ ΡΠ΅Π°Π»Π½ΠΎΡΡΡΠ° ΡΠ° ΠΈΠ·ΠΌΠΈΡΠ»Π΅Π½ΠΈ ΠΈ Π°Π· Π½Π΅ ΡΡΠΌ Π±ΠΈΠ» ΡΠ°ΠΌ,
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
