рдЬрд╝реАрд░реЛрдЯреЗрдХ рдореЗрдВ рд╣рдордиреЗ рдРрдкреНрдкрд▓ рд╕рдлрд╛рд░реА рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХреЛ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рд╕реЗ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛

рдпрд╣ рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬреЛ:

  • рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрдЯрд┐рдлрд╝рд┐рдХреЗрдЯ рдХреНрдпрд╛ рд╣реИ рдФрд░ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдореЛрдмрд╛рдЗрд▓ рд╕рдлрд╝рд╛рд░реА рдкрд░ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ;
  • рдореИрдВ рд╡реЗрдм рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд╕реАрдорд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╛ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛;
  • рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рд╕реА рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рдФрд░ рд╡рд╣ рджреБрдирд┐рдпрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ред

рд╡реЗрдмрд╕реЙрдХреЗрдЯ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд▓рдЧрднрдЧ 8 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╢реБрд░реВ рд╣реБрдЖ рдерд╛ред рдкрд╣рд▓реЗ, рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдВрдмреЗ http рдЕрдиреБрд░реЛрдзреЛрдВ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ) рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдиреЗ рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдФрд░ рдХреБрдЫ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рдж рдпрд╣ рдлрд┐рд░ рд╕реЗ рдЬреБрдбрд╝рд╛ рдФрд░ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рд╕рд╛рдордиреЗ рдЖрдПред

рдЬрд╝реАрд░реЛрдЯреЗрдХ рдореЗрдВ рд╣рдордиреЗ рдРрдкреНрдкрд▓ рд╕рдлрд╛рд░реА рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХреЛ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рд╕реЗ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛

рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рд╢реБрджреНрдз PHP рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдерд╛, рдЬреЛ https рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓рд┐рдВрдХ рдкрд░рдд рд╣реИред рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рд▓рдЧрднрдЧ рд╕рднреА рд╡реЗрдм рд╕рд░реНрд╡рд░реЛрдВ рдиреЗ https рдкрд░ рдкреНрд░реЙрдХреНрд╕реА рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдФрд░ рдХрдиреЗрдХреНрд╢рди:рдЕрдкрдЧреНрд░реЗрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╕реАрдЦ рд▓рд┐рдпрд╛ рдерд╛ред

рдЬрдм рдРрд╕рд╛ рд╣реБрдЖ, рддреЛ рдПрд╕рдкреАрдП рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрд╕реЙрдХреЗрдЯ рд▓рдЧрднрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрд╡рд╛ рдмрди рдЧрдИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд░реНрд╡рд░ рдХреА рдкрд╣рд▓ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ (рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдирд╛ рдпрд╛ рдХрд┐рд╕реА рдЫрд╡рд┐, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝, рдкреНрд░рд╕реНрддреБрддрд┐ рдХрд╛ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛) рдЬрд┐рд╕реЗ рдХреЛрдИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ)ред

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХрд╛рдлреА рд╕рдордп рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рдлрд┐рд░ рднреА рдпрд╣ рдЕрднреА рднреА рдЦрд░рд╛рдм рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред рдФрд░ (рд╕рдВрднрд╡рддрдГ :рдереЛрдбрд╝рд╛_рд╕реНрдорд╛рдЗрд▓рд┐рдВрдЧ_рдлреЗрд╕: ) рдЗрд╕реАрд▓рд┐рдП рдЖрдИрдУрдПрд╕ рдмреНрд░рд╛рдЙрдЬрд╝рд░ (рд╕рдлрд╛рд░реА рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА) рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдЯреЛрд░ рд╕реЗ рдЗрд╕рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред рд▓реЙрдЧрд┐рди/рдкрд╛рд╕ рдпрд╛ рдПрд╕рдПрд╕рдПрдЪ рдХреБрдВрдЬреА рдпрд╛ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдкреЛрд░реНрдЯ рдмрдВрдж рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдмрд╛рдд рд╣реИред

рдЖрдИрдУрдПрд╕ рдкрд░, рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ (рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ), рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпрд╣ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВ рдФрд░ рдЬреЛ рдХреЗрд╡рд▓ рд╕рдлрд╛рд░реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рдлрд╝рд╛рд░реА рдХреЛ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдРрд╕реЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдЕрдкреНрд░рд╛рдкреНрдп рд╣реИред

рдЬрд╝реАрд░реЛрдЯреЗрдХ рдореЗрдВ рд╣рдордиреЗ рдРрдкреНрдкрд▓ рд╕рдлрд╛рд░реА рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХреЛ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рд╕реЗ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛

рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛: рд╕рдорд╕реНрдпрд╛/рдкрд░рд┐рдХрд▓реНрдкрдирд╛/рд╕рдорд╛рдзрд╛рдиред

рд╕рдорд╕реНрдпрд╛: IOS рдХреЗ рд▓рд┐рдП рд╕рдлрд╝рд╛рд░реА рдореЛрдмрд╛рдЗрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рдорд░реНрдерди рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдкрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреНрд░реЙрдХреНрд╕реА рдХрд░рддреЗ рд╕рдордп рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред

рдкрд░рд┐рдХрд▓реНрдкрдирд╛рдПрдБ:

  1. рдЖрдВрддрд░рд┐рдХ/рдмрд╛рд╣реНрдп рдкреНрд░реЙрдХреНрд╕реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдореЗрдВ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдХреЛрдИ рдирд╣реАрдВ рд╣реЛрдЧрд╛) рдРрд╕реЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред
  2. рд╡реЗрдмрд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕рд╛рдорд╛рдиреНрдп (рдЧреИрд░-рд╡реЗрдмрд╕реЙрдХреЗрдЯ) рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЕрдиреБрд░реЛрдз рдХреЗ рджреМрд░рд╛рди рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрд╕реНрдерд╛рдпреА рд╕рддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп, рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рд░рдХреНрд╖рд╛рддреНрдордХ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
  3. рдЕрд╕реНрдерд╛рдпреА рд╕рддреНрд░реЛрдВ рдХреЛ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рд╡реЗрдм рд╕рд░реНрд╡рд░ (рдХреЗрд╡рд▓ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореЙрдбреНрдпреВрд▓ рдФрд░ рдлрд╝рдВрдХреНрд╢рди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  4. рдЕрд╕реНрдерд╛рдпреА рд╕рддреНрд░ рдЯреЛрдХрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдпрд╛рд░ рдЕрдкрд╛рдЪреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рдЪреБрдХреЗ рд╣реИрдВред
  5. рдЕрд╕реНрдерд╛рдпреА рд╕рддреНрд░ рдЯреЛрдХрди рдХреЛ рдЗрдВрдЯрд░реЗрдХреНрд╢рди рд╕рдВрд░рдЪрдирд╛ рдХреЛ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рдж рджреГрд╢реНрдпрдорд╛рди рд╕реНрдерд┐рддрд┐.

рдЙрджреНрджреЗрд╢реНрдп: рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдЖрдИрдУрдПрд╕ рдкрд░ рдореЛрдмрд╛рдЗрд▓ рдлреЛрди рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ (рдЬреИрд╕реЗ рд╡реАрдкреАрдПрди) рдХреЗ рдмрд┐рдирд╛, рдПрдХреАрдХреГрдд рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рдХреНрд╖реНрдп: рдореЛрдмрд╛рдЗрд▓ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╕рд╛рдордЧреНрд░реА рдХреА рддреЗрдЬрд╝ рдбрд┐рд▓реАрд╡рд░реА рдХреЗ рд╕рд╛рде рд╕рдордп рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ/рдлрд╝реЛрди рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреА рдмрдЪрдд (рд╡реЗрдм тАЛтАЛрд╕реЙрдХреЗрдЯ рдХреЗ рдмрд┐рдирд╛ рдХреБрдЫ рд╕реЗрд╡рд╛рдПрдБ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЕрдиреБрд░реЛрдз рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИрдВ)ред

рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдЬрд╛рдВрдЪ рдХрд░реЗрдВ?

1. рдЦреБрд▓рдиреЗ рд╡рд╛рд▓реЗ рдкрдиреНрдиреЗ:

тАФ ╨╜╨░╨┐╤А╨╕╨╝╨╡╤А, https://teamcity.yourdomain.com ╨▓ ╨╝╨╛╨▒╨╕╨╗╤М╨╜╨╛╨╝ ╨▒╤А╨░╤Г╨╖╨╡╤А╨╡ Safari (╨┤╨╛╤Б╤В╤Г╨┐╨╡╨╜ ╤В╨░╨║╨╢╨╡ ╨▓ ╨┤╨╡╤Б╨║╤В╨╛╨┐╨╜╨╛╨╣ ╨▓╨╡╤А╤Б╨╕╨╕) тАФ ╨▓╤Л╨╖╤Л╨▓╨░╨╡╤В ╤Г╤Б╨┐╨╡╤И╨╜╨╛╨╡ ╨┐╨╛╨┤╨║╨╗╤О╤З╨╡╨╜╨╕╨╡ ╨║ ╨▓╨╡╨▒-╤Б╨╛╨║╨╡╤В╨░╨╝.
тАФ ╨╜╨░╨┐╤А╨╕╨╝╨╡╤А, https://teamcity.yourdomain.com/admin/admin.html?item=diagnostics&tab=webSтАжтАФ ╨┐╨╛╨║╨░╨╖╤Л╨▓╨░╨╡╤В ping/pong.
тАФ ╨╜╨░╨┐╤А╨╕╨╝╨╡╤А, https://rancher.yourdomain.com/p/c-84bnv:p-vkszd/workload/deployment:danidb:phтАж-> viewlogs тАФ ╨┐╨╛╨║╨░╨╖╤Л╨▓╨░╨╡╤В ╨╗╨╛╨│╨╕ ╨║╨╛╨╜╤В╨╡╨╣╨╜╨╡╤А╨░.

2. рдпрд╛ рдбреЗрд╡рд▓рдкрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ:

рдЬрд╝реАрд░реЛрдЯреЗрдХ рдореЗрдВ рд╣рдордиреЗ рдРрдкреНрдкрд▓ рд╕рдлрд╛рд░реА рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХреЛ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рд╕реЗ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛

рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдкрд░реАрдХреНрд╖рдг:

1. рдЖрдВрддрд░рд┐рдХ/рдмрд╛рд╣реНрдп рдкреНрд░реЙрдХреНрд╕реА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдореЗрдВ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдХреЛрдИ рдирд╣реАрдВ рд╣реЛрдЧрд╛) рдРрд╕реЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рдпрд╣рд╛рдВ 2 рд╕рдорд╛рдзрд╛рди рдорд┐рд▓реЗ:

рдХ) рд╕реНрддрд░ рдкрд░

<Location sock*> SSLVerifyClient optional </Location>
<Location /> SSLVerifyClient require </Location>

рдкрд╣реБрдВрдЪ рд╕реНрддрд░ рдмрджрд▓реЗрдВ.

рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ рд╣реИрдВ:

  • рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рддреНрдпрд╛рдкрди рдкреНрд░реЙрдХреНрд╕реА рд╕рдВрд╕рд╛рдзрди рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рдж рд╣реЛрддрд╛ рд╣реИ, рдпрд╛рдиреА рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рдж рд╣реИрдВрдбрд╢реЗрдХред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░реЙрдХреНрд╕реА рдкрд╣рд▓реЗ рд▓реЛрдб рд╣реЛрдЧреА рдФрд░ рдлрд┐рд░ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╕реЗрд╡рд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдХрд╛рдЯ рджреЗрдЧреАред рдпрд╣ рдмреБрд░рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрд▓реЛрдЪрдирд╛рддреНрдордХ рдирд╣реАрдВ;
  • http2 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ. рдпрд╣ рдЕрднреА рднреА рдбреНрд░рд╛рдлреНрдЯ рдореЗрдВ рд╣реИ, рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдирд┐рд░реНрдорд╛рддрд╛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП #tls1.3 http2 рдкреЛрд╕реНрдЯ рд╣реИрдВрдбрд╢реЗрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА (рдЕрднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ) рдЖрд░рдПрдлрд╕реА 8740 рд▓рд╛рдЧреВ рдХрд░реЗрдВ "HTTP/1.3 рдХреЗ рд╕рд╛рде рдЯреАрдПрд▓рдПрд╕ 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛";
  • рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХреИрд╕реЗ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдмреА) рдмреБрдирд┐рдпрд╛рджреА рд╕реНрддрд░ рдкрд░, рдмрд┐рдирд╛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рдПрд╕рдПрд╕рдПрд▓ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред

SSLVerifyClient рдХреЛ => SSLVerifyClient рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рд╕реНрддрд░ рдХреЛ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдкреНрд░реЙрдХреНрд╕реА рд╕реЗрд╡рд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

RewriteEngine        on
RewriteCond     %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
RewriteRule     .? - [F]
ErrorDocument 403 "You need a client side certificate issued by CAcert to access this site"

рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдПрд╕рдПрд╕рдПрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ: рдЕрдкрд╛рдЪреЗ рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг

рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛, рд╡рд┐рдХрд▓реНрдк "рдмреА" рдХреЛ http2 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рдмрд╣реБрдореБрдЦреА рдкреНрд░рддрд┐рднрд╛ рдФрд░ рдЕрдиреБрдХреВрд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред

рдЗрд╕ рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХрдИ рдкреНрд░рдпреЛрдЧ рдХрд┐рдП рдЧрдП; рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбрд┐рдЬрд╝рд╛рдЗрдиреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛:

рдпрджрд┐ = рдЖрд╡рд╢реНрдпрдХрддрд╛ = рдкреБрдирдГ рд▓рд┐рдЦрдирд╛

рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореВрд▓ рдбрд┐рдЬрд╝рд╛рдЗрди рд╣реИ:

SSLVerifyClient optional
RewriteEngine on
RewriteCond %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule     .? - [F]
#ErrorDocument 403 "You need a client side certificate issued by CAcert to access this site"

#websocket for safari without cert auth
<If "%{SSL:SSL_CLIENT_VERIFY} != 'SUCCESS'">
<If "%{HTTP:Upgrade} = 'websocket'">
...
    #╨╖╨░╨╝╨╡╤Й╨░╨╡╨╝ ╨░╨▓╤В╨╛╤А╨╕╨╖╨░╤Ж╨╕╤О ╨┐╨╛ ╨▓╨╗╨░╨┤╨╡╨╗╤М╤Ж╤Г ╤Б╨╡╤А╤В╨╕╤Д╨╕╨║╨░╤В╨░ ╨╜╨░ ╨░╨▓╤В╨╛╤А╨╕╨╖╨░╤Ж╨╕╤О ╨┐╨╛ ╨╜╨╛╨╝╨╡╤А╤Г ╨┐╤А╨╛╤В╨╛╨║╨╛╨╗╨░
    SSLUserName SSl_PROTOCOL
</If>
</If>

рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрд╡рд╛рдореА рджреНрд╡рд╛рд░рд╛ рдореМрдЬреВрджрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдиреБрдкрд▓рдмреНрдз рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рдЙрдкрд▓рдмреНрдз рдЪрд░ SSl_PROTOCOL (SSL_CLIENT_S_DN_CN рдХреЗ рдмрдЬрд╛рдп) рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЧреИрд░-рдореМрдЬреВрдж рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрд╡рд╛рдореА рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг:

рдЕрдкрд╛рдЪреЗ рдореЙрдбреНрдпреВрд▓ mod_ssl

рдЬрд╝реАрд░реЛрдЯреЗрдХ рдореЗрдВ рд╣рдордиреЗ рдРрдкреНрдкрд▓ рд╕рдлрд╛рд░реА рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХреЛ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рд╕реЗ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛

2. рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕рд╛рдорд╛рдиреНрдп (рдЧреИрд░-рд╡реЗрдмрд╕реЛрдХреЗрдЯ) рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЕрдиреБрд░реЛрдз рдХреЗ рджреМрд░рд╛рди рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрд╕реНрдерд╛рдпреА рд╕рддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп, рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрдиреЗрдХреНрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╡ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдкрдХреЛ рдирд┐рдпрдорд┐рдд (рдЧреИрд░-рд╡реЗрдм рд╕реЙрдХреЗрдЯ) рдЕрдиреБрд░реЛрдз рдХреЗ рджреМрд░рд╛рди рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд╛рдпреА рдЯреЛрдХрди рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрднрд╛рдЧ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

#╨┐╨╛╨┤╨│╨╛╤В╨╛╨▓╨║╨░ ╨┐╨╡╤А╨╡╨┤╨░╤З╨░ ╤Б╨╡╨▒╨╡ ╨бookie ╤З╨╡╤А╨╡╨╖ ╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╤В╨╡╨╗╤М╤Б╨║╨╕╨╣ ╨▒╤А╨░╤Г╨╖╨╡╤А
<If "%{SSL:SSL_CLIENT_VERIFY} = 'SUCCESS'">
<If "%{HTTP:Upgrade} != 'websocket'">
Header set Set-Cookie "websocket-allowed=true; path=/; Max-Age=100"
</If>
</If>

#╨┐╤А╨╛╨▓╨╡╤А╨║╨░ Cookie ╨┤╨╗╤П ╤Г╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╕╤П ╨▓╨╡╨▒-╤Б╨╛╨║╨╡╤В ╤Б╨╛╨╡╨┤╨╕╨╜╨╡╨╜╨╕╤П
<source lang="javascript">
<If "%{SSL:SSL_CLIENT_VERIFY} != 'SUCCESS'">
<If "%{HTTP:Upgrade} = 'websocket'">
#check for exists cookie

#get and check
SetEnvIf Cookie "websocket-allowed=(.*)" env-var-name=$1

#or rewrite rule
RewriteCond %{HTTP_COOKIE} !^.*mycookie.*$

#or if
<If "%{HTTP_COOKIE} =~ /(^|; )cookie-names*=s*some-val(;|$)/ >
</If

</If>
</If>

рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡рдпрдВ рдХреЛ рдХреБрдХреАрдЬрд╝ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

3. рдЕрд╕реНрдерд╛рдпреА рд╕рддреНрд░реЛрдВ рдХреЛ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рд╡реЗрдм рд╕рд░реНрд╡рд░ (рдХреЗрд╡рд▓ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореЙрдбреНрдпреВрд▓ рдФрд░ рдлрд╝рдВрдХреНрд╢рди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдкрддрд╛ рдЪрд▓рд╛, рдЕрдкрд╛рдЪреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рд╕рд╢рд░реНрдд рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдореЗрдВ рдЕрдкрдиреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реИ рдФрд░ рдХреНрдпреЛрдВ, рдФрд░ рд╣рдо рдХрд┐рди рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

  • рд╣рдореЗрдВ рдПрдХ рдРрд╕реЗ рдЯреЛрдХрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдбрд┐рдХреЛрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
  • рд╣рдореЗрдВ рдПрдХ рдРрд╕реЗ рдЯреЛрдХрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдкреНрд░рдЪрд▓рди рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╣реЛ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкреНрд░рдЪрд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛред
  • рд╣рдореЗрдВ рдПрдХ рдЯреЛрдХрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд╕реНрд╡рд╛рдореА рдХреЗ рд╕рд╛рде рд╕рдВрдмрджреНрдз рд╣реЛрдЧрд╛ред

рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрд╢рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди, рдПрдХ рдирдордХ рдФрд░ рдЯреЛрдХрди рдХреА рдЖрдпреБ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рддрд╛рд░реАрдЦ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрд╛рдЪреЗ HTTP рд╕рд░реНрд╡рд░ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕рдм рдмреЙрдХреНрд╕ sha1 рдФрд░ %{TIME} рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред

рдкрд░рд┐рдгрд╛рдо рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдерд╛:

#╨╜╨╡╤В ╤Б╨╡╤А╤В╨╕╤Д╨╕╨║╨░╤В╨░, ╨╕ ╨╛╨▒╤А╨░╤Й╨╡╨╜╨╕╨╡ ╨║ websocket
<If "%{SSL:SSL_CLIENT_VERIFY} != 'SUCCESS'">
<If "%{HTTP:Upgrade} = 'websocket'">
    SetEnvIf Cookie "zt-cert-sha1=([^;]+)" zt-cert-sha1=$1
    SetEnvIf Cookie "zt-cert-uid=([^;]+)" zt-cert-uid=$1
    SetEnvIf Cookie "zt-cert-date=([^;]+)" zt-cert-date=$1

#╤В╨╛╨╗╤М╨║╨╛ ╤В╨░╨║ ╨╝╨╛╨╢╨╜╨╛ ╤А╨░╨▒╨╛╤В╨░╤В╤М ╤Б ╨┐╨╡╤А╨╡╨╝╨╡╨╜╨╜╤Л╨╝╨╕, ╨┐╨╛╨╗╤Г╤З╨╡╨╜╨╜╤Л╨╝╨╕ ╨▓ env-╨░╤Е ╨▓ ╤Н╤В╨╛╤В ╨╝╨╛╨╝╨╡╨╜╤В ╨▓╤А╨╡╨╝╨╡╨╜╨╕, ╨▒╨╛╨╗╨╡╨╡ ╨╛╨╜╨╕ ╨╜╨╕╨│╨┤╨╡ ╨╜╨╡ ╨┤╨╛╤Б╤В╤Г╨┐╨╜╤Л ╨┤╨╗╤П ╤Д╤Г╨╜╨║╤Ж╨╕╨╕ ╤Е╨╡╤И╨╕╤А╨╛╨▓╨░╨╜╨╕╤П (╨┐╨╛ ╨╛╤В╨┤╨╡╨╗╤М╨╜╨╛╤Б╤В╨╕ ╨╝╨╛╨╢╨╜╨╛, ╨╜╨╛ ╨╜╨╡ ╨▓╨╝╨╡╤Б╤В╨╡, ╨┤╨░ ╨╕ ╨╡╤Й╤С ╤Б ╤Е╨╡╤И╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡╨╝)
    <RequireAll>
        Require expr %{sha1:salt1%{env:zt-cert-date}salt3%{env:zt-cert-uid}salt2} == %{env:zt-cert-sha1}
        Require expr %{env:zt-cert-sha1} =~ /^.{40}$/
    </RequireAll>
</If>
</If>

#╨╡╤Б╤В╤М ╤Б╨╡╤А╤В╨╕╤Д╨╕╨║╨░╤В, ╨╖╨░╨┐╤А╨░╤И╨╕╨▓╨░╨╡╤В╤Б╤П ╨╜╨╡ websocket
<If "%{SSL:SSL_CLIENT_VERIFY} = 'SUCCESS'">
<If "%{HTTP:Upgrade} != 'websocket'">
    SetEnvIf Cookie "zt-cert-sha1=([^;]+)" HAVE_zt-cert-sha1=$1

    SetEnv zt_cert "path=/; HttpOnly;Secure;SameSite=Strict"
#╨Э╨╛╨▓╤Л╨╡ ╨║╤Г╨║╨╕ ╤Б╤В╨░╨▓╤П╤В╤Б╤П, ╨╡╤Б╨╗╨╕ ╤Б╤В╨░╤А╤Л╤Е ╨╜╨╡╤В
    Header add Set-Cookie "expr=zt-cert-sha1=%{sha1:salt1%{TIME}salt3%{SSL_CLIENT_S_DN_CN}salt2};%{env:zt_cert}" env=!HAVE_zt-cert-sha1
    Header add Set-Cookie "expr=zt-cert-uid=%{SSL_CLIENT_S_DN_CN};%{env:zt_cert}" env=!HAVE_zt-cert-sha1
    Header add Set-Cookie "expr=zt-cert-date=%{TIME};%{env:zt_cert}" env=!HAVE_zt-cert-sha1
</If>
</If>

рд▓рдХреНрд╖реНрдп рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░ рдЕрдкреНрд░рдЪрд▓рди (рдЖрдк рдПрдХ рд╕рд╛рд▓ рдкреБрд░рд╛рдиреА рдХреБрдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЯреЛрдХрди, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдВрддрд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ, рдФрджреНрдпреЛрдЧрд┐рдХ (рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░) рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВред

рдЬрд╝реАрд░реЛрдЯреЗрдХ рдореЗрдВ рд╣рдордиреЗ рдРрдкреНрдкрд▓ рд╕рдлрд╛рд░реА рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХреЛ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рд╕реЗ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛

4. рдЕрд╕реНрдерд╛рдпреА рд╕рддреНрд░ рдЯреЛрдХрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдпрд╛рд░ рдЕрдкрд╛рдЪреЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рдЪреБрдХреЗ рд╣реИрдВред

рдкрд┐рдЫрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛ рдмрдиреА рд░рд╣реА - рдЯреЛрдХрди рдЙрдореНрд░ рдмрдврд╝рдиреЗ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ред

рд╣рдо рдПрдХ рддреИрдпрд╛рд░ рдореЙрдбреНрдпреВрд▓ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╢рдмреНрджреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ: рдЕрдкрд╛рдЪреЗ рдЯреЛрдХрди рдЬреЗрд╕рди рдЯреВ рдлреИрдХреНрдЯрд░ рдСрде

рд╣рд╛рдВ, рддреИрдпрд╛рд░ рдореЙрдбреНрдпреВрд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдмрдВрдзреЗ рд╣реИрдВ рдФрд░ рд╕рддреНрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреБрдХреАрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВ рд╣реИрдВред рдпрд╛рдиреА рдХреБрдЫ рджреЗрд░ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ.
рд╣рдореЗрдВ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдкрд╛рдВрдЪ рдШрдВрдЯреЗ рд▓рдЧ рдЧрдП, рдЬрд┐рд╕рд╕реЗ рдХреЛрдИ рдареЛрд╕ рдирддреАрдЬрд╛ рдирд╣реАрдВ рдирд┐рдХрд▓рд╛ред

5. рдЕрд╕реНрдерд╛рдпреА рд╕рддреНрд░ рдЯреЛрдХрди рдХреЛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд░реЗрдбреА-рдореЗрдб рдореЙрдбреНрдпреВрд▓ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдРрд╕рд╛ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐, рддрд╛рд░реАрдЦ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдкрд╛рдЪреЗ рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рднрд╡рд┐рд╖реНрдп рд╕реЗ рддрд╛рд░реАрдЦ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдкреНрд░рдЪрд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╕рдордп рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЛрдИ рдЧрдгрд┐рддреАрдп рдЬреЛрдбрд╝/рдШрдЯрд╛рд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдпрд╛рдиреА рдЖрдк рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ:

(%{env:zt-cert-date} + 30) > %{DATE}

рдЖрдк рдХреЗрд╡рд▓ рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ.

рд╕рдлрд╝рд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд▓реЗрдЦ рдорд┐рд▓рд╛: рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде HomeAssistant рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ (Safari/iOS рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)
рдпрд╣ Nginx рдХреЗ рд▓рд┐рдП Lua рдореЗрдВ рдХреЛрдб рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬреЛ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рддрд░реНрдХ рдХреЛ рдмрд╣реБрдд рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рд╣реИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП hmac рд╕рд╛рд▓реНрдЯрд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде ( рдпрд╣ рдЕрдкрд╛рдЪреЗ рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рд╛)ред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рд▓реБрдЖ рд╕реНрдкрд╖реНрдЯ рддрд░реНрдХ рд╡рд╛рд▓реА рдПрдХ рднрд╛рд╖рд╛ рд╣реИ, рдФрд░ рдЕрдкрд╛рдЪреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд░рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ:

Nginx рдФрд░ Apache рдХреЗ рд╕рд╛рде рдЕрдВрддрд░ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж:

рдФрд░ рд▓реБрдЖ рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗ рдЙрдкрд▓рдмреНрдз рдХрд╛рд░реНрдп:
22.1 - рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп

рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рддрд╛рд░реАрдЦ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдХреА рддрд╛рд░реАрдЦ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд▓реБрдЖ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдирд╡реА рд╡реИрд░рд┐рдПрдмрд▓ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдорд┐рд▓рд╛ред

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд▓реБрдЖ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрддреА рд╣реИ:

require 'apache2'

function handler(r)
    local fmt = '%Y%m%d%H%M%S'
    local timeout = 3600 -- 1 hour

    r.notes['zt-cert-timeout'] = timeout
    r.notes['zt-cert-date-next'] = os.date(fmt,os.time()+timeout)
    r.notes['zt-cert-date-halfnext'] = os.date(fmt,os.time()+ (timeout/2))
    r.notes['zt-cert-date-now'] = os.date(fmt,os.time())

    return apache2.OK
end

рдФрд░ рдпрд╣ рд╕рдм рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреБрдХреАрдЬрд╝ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдФрд░ рдкреБрд░рд╛рдиреЗ рдХреБрдХреА (рдЯреЛрдХрди) рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдзрд╛ рд╕рдордп рдЖрдиреЗ рдкрд░ рдЯреЛрдХрди рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╕рд╛рде:

SSLVerifyClient optional

#LuaScope thread
#generate event variables zt-cert-date-next
LuaHookAccessChecker /usr/local/etc/apache24/sslincludes/websocket_token.lua handler early

#╨╖╨░╨┐╤А╨╡╤Й╨░╨╡╨╝ ╨▒╨╡╨╖ ╤Б╨╡╤А╤В╨╕╤Д╨╕╨║╨░╤В╨░ ╤З╤В╨╛-╤В╨╛ ╨╡╤Й╤С, ╨║╤А╨╛╨╝╨╡ webscoket
RewriteEngine on
RewriteCond %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule     .? - [F]
#ErrorDocument 403 "You need a client side certificate issued by CAcert to access this site"

#websocket for safari without certauth
<If "%{SSL:SSL_CLIENT_VERIFY} != 'SUCCESS'">
<If "%{HTTP:Upgrade} = 'websocket'">
    SetEnvIf Cookie "zt-cert=([^,;]+),([^,;]+),[^,;]+,([^,;]+)" zt-cert-sha1=$1 zt-cert-date=$2 zt-cert-uid=$3

    <RequireAll>
        Require expr %{sha1:salt1%{env:zt-cert-date}salt3%{env:zt-cert-uid}salt2} == %{env:zt-cert-sha1}
        Require expr %{env:zt-cert-sha1} =~ /^.{40}$/
        Require expr %{env:zt-cert-date} -ge %{env:zt-cert-date-now}
    </RequireAll>
   
    #╨╖╨░╨╝╨╡╤Й╨░╨╡╨╝ ╨░╨▓╤В╨╛╤А╨╕╨╖╨░╤Ж╨╕╤О ╨┐╨╛ ╨▓╨╗╨░╨┤╨╡╨╗╤М╤Ж╤Г ╤Б╨╡╤А╤В╨╕╤Д╨╕╨║╨░╤В╨░ ╨╜╨░ ╨░╨▓╤В╨╛╤А╨╕╨╖╨░╤Ж╨╕╤О ╨┐╨╛ ╨╜╨╛╨╝╨╡╤А╤Г ╨┐╤А╨╛╤В╨╛╨║╨╛╨╗╨░
    SSLUserName SSl_PROTOCOL
    SSLOptions -FakeBasicAuth
</If>
</If>

<If "%{SSL:SSL_CLIENT_VERIFY} = 'SUCCESS'">
<If "%{HTTP:Upgrade} != 'websocket'">
    SetEnvIf Cookie "zt-cert=([^,;]+),[^,;]+,([^,;]+)" HAVE_zt-cert-sha1=$1 HAVE_zt-cert-date-halfnow=$2
    SetEnvIfExpr "env('HAVE_zt-cert-date-halfnow') -ge %{TIME} && env('HAVE_zt-cert-sha1')=~/.{40}/" HAVE_zt-cert-sha1-found=1

    Define zt-cert "path=/;Max-Age=%{env:zt-cert-timeout};HttpOnly;Secure;SameSite=Strict"
    Define dates_user "%{env:zt-cert-date-next},%{env:zt-cert-date-halfnext},%{SSL_CLIENT_S_DN_CN}"
    Header set Set-Cookie "expr=zt-cert=%{sha1:salt1%{env:zt-cert-date-next}sal3%{SSL_CLIENT_S_DN_CN}salt2},${dates_user};${zt-cert}" env=!HAVE_zt-cert-sha1-found
</If>
</If>

SetEnvIfExpr "env('HAVE_zt-cert-date-halfnow') -ge %{TIME} && env('HAVE_zt-cert-sha1')=~/.{40}/" HAVE_zt-cert-sha1-found=1
╤А╨░╨▒╨╛╤В╨░╨╡╤В,

╨░ ╤В╨░╨║ ╤А╨░╨▒╨╛╤В╨░╤В╤М ╨╜╨╡ ╨▒╤Г╨┤╨╡╤В
SetEnvIfExpr "env('HAVE_zt-cert-date-halfnow') -ge  env('zt-cert-date-now') && env('HAVE_zt-cert-sha1')=~/.{40}/" HAVE_zt-cert-sha1-found=1 

рдХреНрдпреЛрдВрдХрд┐ LuaHookAccessChecker Nginx рдХреА рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХреНрд╕реЗрд╕ рдЬрд╛рдВрдЪ рдХреЗ рдмрд╛рдж рд╣реА рд╕рдХреНрд░рд┐рдп рд╣реЛрдЧрд╛ред

рдЬрд╝реАрд░реЛрдЯреЗрдХ рдореЗрдВ рд╣рдордиреЗ рдРрдкреНрдкрд▓ рд╕рдлрд╛рд░реА рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХреЛ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рд╕реЗ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛

рд╕реНрд░реЛрдд рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ рдЫрд╡рд┐.

рдПрдХ рдФрд░ рдмрд╛рддред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЕрдкрд╛рдЪреЗ (рд╕рдВрднрд╡рддрдГ Nginx) рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрдд рдореЗрдВ рд╕рдм рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдХреНрд░рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдпреЛрдЬрдирд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рд▓реБрдЖ рд╕реНрдХреНрд░рд┐рдкреНрдЯ.

рд╕рдорд╛рдкрди:

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рдж рджреГрд╢реНрдпрдорд╛рди рд╕реНрдерд┐рддрд┐ (рд▓рдХреНрд╖реНрдп):
рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдЖрдИрдУрдПрд╕ рдкрд░ рдореЛрдмрд╛рдЗрд▓ рдлреЛрди рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ (рд╡реАрдкреАрдПрди) рдХреЗ рдмрд┐рдирд╛, рдПрдХреАрдХреГрдд рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИред

рд▓рдХреНрд╖реНрдп рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рд╕реНрддрд░ рдХрд┐рд╕реА рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реИред

рдЬрд╝реАрд░реЛрдЯреЗрдХ рдореЗрдВ рд╣рдордиреЗ рдРрдкреНрдкрд▓ рд╕рдлрд╛рд░реА рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХреЛ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рд╕реЗ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ