рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝: рдореЗрдХрдлрд╝рд╛рдЗрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛

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

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

рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝: рдореЗрдХрдлрд╝рд╛рдЗрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛

рдЗрди рджрд┐рдиреЛрдВ, рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рдирдпрд╛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред рдФрд░ рдпрд╣ рд╕реНрдерд┐рддрд┐, рдмрджрд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдбреЙрдХрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИред

рдбрд╛рдХ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗрд╡рд╛рд▓рд╛ рдордЬрд╝рджреВрд░

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

рдбреЙрдХрд░ рд▓рд┐рдЦреЗрдВ

╨в╨╡╤Е╨╜╨╛╨╗╨╛╨│╨╕╤П рдбреЙрдХрд░ рд▓рд┐рдЦреЗрдВ рдорд▓реНрдЯреА-рдХрдВрдЯреЗрдирд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдПрдХ рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрддрдиреЗ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рддрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдЪрд╛рд╣рд┐рдПред

рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдПрдХ YAML рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЙрдирдХреА рдмрд╛рддрдЪреАрдд рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝ рдорд▓реНрдЯреА-рдХрдВрдЯреЗрдирд░ рдбреЙрдХрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рд╣реИред

рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝: рдореЗрдХрдлрд╝рд╛рдЗрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛
рдПрдХ рд╣реЛрд╕реНрдЯ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рджреЛ рдХрдВрдЯреЗрдирд░

GNU рдореЗрдХ

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

рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП make рд╣рдо рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ Makefile.

рд╣рдорд╛рд░реЗ рдпрд╣рд╛рдВ Makefile рдирд┐рдпрдорд┐рдд рдЖрджреЗрд╢ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ docker ╨╕ docker-compose, рдЬреЛ рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЕрд░реНрдерд╛рддреН, рд╣рдо рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЛ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдиреЗ, рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ, рдЗрд╕реЗ рд░реЛрдХрдиреЗ, рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ, рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧрд┐рди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ, рдХрдВрдЯреЗрдирд░ рд▓реЙрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдЕрдиреНрдп рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ

рдЖрдЗрдП рдПрдХ рдирд┐рдпрдорд┐рдд рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШрдЯрдХ рд╣реЛрдВ:

  • рдЯрд╛рдЗрдорд╕реНрдХреЗрд▓рдбреАрдмреА рдбреЗрдЯрд╛рдмреЗрд╕ (рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ)ред
  • рдПрдХреНрд╕рдкреНрд░реЗрд╕.рдЬреЗрдПрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рдиред
  • рдкрд┐рдВрдЧ (рд╕рд┐рд░реНрдл рдПрдХ рдХрдВрдЯреЗрдирд░, рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛)ред

рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ 3 рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░ рдФрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА docker-compose, рдЬрд┐рд╕рдореЗрдВ рдЗрди рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯрдЪрдкреНрд╡рд╛рдЗрдВрдЯ рд╣реЛрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕рд╛рде timescale рдпрд╣ рд▓рдЧрднрдЧ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рд╡реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЕрд░реНрдерд╛рддреН, рдпрд╣ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

  • рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рд╢реЗрд▓ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдирд╛ред
  • рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдЖрдпрд╛рдд рдФрд░ рдирд┐рд░реНрдпрд╛рдд.
  • рд╕реГрдЬрди pg_dump рдЯреЗрдмрд▓ рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕.

Express.js рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрдВрдЯреЗрдирд░, expressjs, рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд╖рдорддрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ:

  • рд╕рд┐рд╕реНрдЯрдо рд▓реЙрдЧ рд╕реЗ рддрд╛рдЬрд╝рд╛ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ред
  • рдХреБрдЫ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрд▓ рдореЗрдВ рд▓реЙрдЧрд┐рди рдХрд░реЗрдВред

рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЙрди рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЬрд╛рддрд╛ рд╣реИред рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рднреАрддрд░ рдПрдХ рдХрдорд╛рдВрдб рд╣реИ docker-compose, рд╕рд╣рд╛рдпрдХ рд╡рд┐рдХрд▓реНрдк -f, рдЬреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ docker-compose.yml.

рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реЗрдХреНрд╢рди рдХреЛ рдХреЗрд╡рд▓ рдЙрди рдХрдВрдЯреЗрдирд░реЛрдВ рддрдХ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ docker-compose.yml.

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ docker-compose. рдпрджрд┐ рд╣рдо рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдореЗрдВ рд╢реЗрд▓ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ psql, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЖрджреЗрд╢ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

docker-compose -f docker-compose.yml exec timescale psql -Upostgres

рд╡рд╣реА рдХрдорд╛рдВрдб рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ docker-composeрдФрд░ docker, рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

docker exec -it  edp_timescale_1 psql -Upostgres

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ docker, рдФрд░ рдЖрджреЗрд╢ docker-compose, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдХрдВрдЯреЗрдирд░ рдирд╛рдореЛрдВ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рджреЛрдиреЛрдВ рдЖрджреЗрд╢ рдЙрддрдиреЗ рдХрдард┐рди рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдордиреЗ рдлреЙрд░реНрдо рдореЗрдВ "рд░реИрдкрд░" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ Makefile, рдЬреЛ рд╣рдореЗрдВ рд╕рд░рд▓ рдХрдорд╛рдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреЗрдЧрд╛ рдФрд░ рд╕реНрд╡рдпрдВ рд╕рдорд╛рди рд▓рдВрдмреА рдХрдорд╛рдВрдб рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдлрд┐рд░ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

make db-shell

рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧ Makefile рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ!

рдХрд╛рдордХрд╛рдЬреА рдЙрджрд╛рд╣рд░рдг

рдЙрдкрд░реЛрдХреНрдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрд░реЗрдЦ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВрдЧреЗ docker-compose.yml:

version: '3.3'
services:
    api:
        build: .
        image: mywebimage:0.0.1
        ports:
            - 8080:8080
        volumes:
            - /app/node_modules/
        depends_on:
            - timescale
        command: npm run dev
        networks:
            - webappnetwork
    timescale:
        image: timescale/timescaledb-postgis:latest-pg11
        environment:
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
        command: ["postgres", "-c", "log_statement=all", "-c", "log_destination=stderr"]
        volumes:
          - ./create_schema.sql:/docker-entrypoint-initdb.d/create_schema.sql
        networks:
           - webappnetwork
    ping:
       image: willfarrell/ping
       environment:
           HOSTNAME: "localhost"
           TIMEOUT: 300
networks:
   webappnetwork:
       driver: bridge

рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВрдЧреЗ Makefile:

THIS_FILE := $(lastword $(MAKEFILE_LIST))
.PHONY: help build up start down destroy stop restart logs logs-api ps login-timescale login-api db-shell
help:
        make -pRrq  -f $(THIS_FILE) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
build:
        docker-compose -f docker-compose.yml build $(c)
up:
        docker-compose -f docker-compose.yml up -d $(c)
start:
        docker-compose -f docker-compose.yml start $(c)
down:
        docker-compose -f docker-compose.yml down $(c)
destroy:
        docker-compose -f docker-compose.yml down -v $(c)
stop:
        docker-compose -f docker-compose.yml stop $(c)
restart:
        docker-compose -f docker-compose.yml stop $(c)
        docker-compose -f docker-compose.yml up -d $(c)
logs:
        docker-compose -f docker-compose.yml logs --tail=100 -f $(c)
logs-api:
        docker-compose -f docker-compose.yml logs --tail=100 -f api
ps:
        docker-compose -f docker-compose.yml ps
login-timescale:
        docker-compose -f docker-compose.yml exec timescale /bin/bash
login-api:
        docker-compose -f docker-compose.yml exec api /bin/bash
db-shell:
        docker-compose -f docker-compose.yml exec timescale psql -Upostgres

рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрджреЗрд╢ рд╕рднреА рдХрдВрдЯреЗрдирд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП c= рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рдХреЗ рджрд╛рдпрд░реЗ рдХреЛ рдПрдХ рдХрдВрдЯреЗрдирд░ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдХреЗ рдмрд╛рдж Makefile рддреИрдпрд╛рд░ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  • make help - рдЙрдкрд▓рдмреНрдз рд╕рднреА рдЖрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдЬрд╛рд░реА рдХрд░рдирд╛ make.

рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝: рдореЗрдХрдлрд╝рд╛рдЗрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛
рдЙрдкрд▓рдмреНрдз рдЖрджреЗрд╢реЛрдВ рдкрд░ рд╕рд╣рд╛рдпрддрд╛

  • make build - рд╕реЗ рдПрдХ рдЫрд╡рд┐ рдХреЛ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдирд╛ Dockerfile. рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдордиреЗ рдореМрдЬреВрджрд╛ рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ timescale ╨╕ ping. рд▓реЗрдХрд┐рди рдЫрд╡рд┐ api рд╣рдо рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рд╕рдВрдЧреНрд░рд╣ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ. рдЗрд╕ рдЖрджреЗрд╢ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдареАрдХ рдпрд╣реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝: рдореЗрдХрдлрд╝рд╛рдЗрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛
рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг

  • make start - рд╕рднреА рдХрдВрдЯреЗрдирд░ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ред рдХреЗрд╡рд▓ рдПрдХ рдХрдВрдЯреЗрдирд░ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЬреИрд╕реЗ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ make start c=timescale.

рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝: рдореЗрдХрдлрд╝рд╛рдЗрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛
рдЯрд╛рдЗрдорд╕реНрдХреЗрд▓ рдХрдВрдЯреЗрдирд░ рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИ

рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝: рдореЗрдХрдлрд╝рд╛рдЗрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛
рдПрдХ рдкрд┐рдВрдЧ рдХрдВрдЯреЗрдирд░ рдЪрд▓рд╛рдирд╛

  • make login-timescale - рдХрдВрдЯреЗрдирд░ рдХреЗ рдмреИрд╢ рд╕рддреНрд░ рдореЗрдВ рд▓реЙрдЧрд┐рди рдХрд░реЗрдВ timescale.

рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝: рдореЗрдХрдлрд╝рд╛рдЗрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛
рдЯрд╛рдЗрдорд╕реНрдХреЗрд▓ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдмреИрд╢ рдЪрд▓рд╛рдирд╛

  • make db-shell - рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ psql рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ timescale рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╡рд┐рд░реБрджреНрдз SQL рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝: рдореЗрдХрдлрд╝рд╛рдЗрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛
рдЯрд╛рдЗрдорд╕реНрдХреЗрд▓реНрдбрдмреА рдХрдВрдЯреЗрдирд░ рдореЗрдВ psql рдЪрд▓рд╛рдирд╛

  • make stop - рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рд░реЛрдХрдирд╛ред

рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝: рдореЗрдХрдлрд╝рд╛рдЗрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛
рдПрдХ рдЯрд╛рдЗрдорд╕реНрдХреЗрд▓ рдХрдВрдЯреЗрдирд░ рдХреЛ рд░реЛрдХрдирд╛

  • make down - рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рд░реЛрдХрдирд╛ рдФрд░ рд╣рдЯрд╛рдирд╛ред рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдВрдЯреЗрдирд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд╛рдВрдЫрд┐рдд рдХрдВрдЯреЗрдирд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реБрдП рдЗрд╕ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - make down c=timescale рдпрд╛ make down c=api.

рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝: рдореЗрдХрдлрд╝рд╛рдЗрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛
рд╕рднреА рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рд░реЛрдХрдирд╛ рдФрд░ рд╣рдЯрд╛рдирд╛

рдкрд░рд┐рдгрд╛рдо

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝ рд╣рдореЗрдВ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдХрд╛ рдПрдХ рд╕рдореГрджреНрдз рд╕реЗрдЯ рджреЗрддрд╛ рд╣реИ, рдХрднреА-рдХрднреА рдпреЗ рдХрдорд╛рдВрдб рд▓рдВрдмреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╛рдж рд░рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдкреНрд░рдпреЛрдЧ рдХреА рд╡рд┐рдзрд┐ Makefile рд╣рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рддреНрд╡рд░рд┐рдд рдФрд░ рдЖрд╕рд╛рди рдЗрдВрдЯрд░реИрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реА docker-compose.yml. рдЕрд░реНрдерд╛рддреН, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

  • рдбреЗрд╡рд▓рдкрд░ рдХреЗрд╡рд▓ рд╡рд░реНрдгрд┐рдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ docker-compose.yml, рдЕрдиреНрдп рдЪрд▓ рд░рд╣реЗ рдХрдВрдЯреЗрдирд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╛рдо рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрдм рдХреЛрдИ рдирд┐рд╢реНрдЪрд┐рдд рдХрдорд╛рдВрдб рднреВрд▓ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрд╕ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ make help рдФрд░ рдЙрдкрд▓рдмреНрдз рдЖрджреЗрд╢реЛрдВ рдкрд░ рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
  • рдЖрдкрдХреЛ рдирд╡реАрдирддрдо рд▓реЙрдЧ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдЬреИрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХреЛрдВ рдХреА рд▓рдВрдмреА рд╕реВрдЪреА рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рдПрдХ рдЖрджреЗрд╢ docker-compose -f docker-compose.yml exec timescale psql -Upostgres рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ make db-shell.
  • рдлрд╝рд╛рдЗрд▓ Makefile рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдврд╝рддрд╛ рд╣реИ рдЖрдк рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдЗрд╕реЗ рдЕрдкрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдмреИрдХрдЕрдк рдмрдирд╛рдиреЗ рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИред
  • рдпрджрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдПрдХ рдмрдбрд╝реА рдЯреАрдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ Makefile, рдпрд╣ рд╕рд╣рдпреЛрдЧ рдХреЛ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред

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

рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдЖрдк рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝ рдХреЛ рдХреИрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ?

рдбреЙрдХрд░ рдХрдВрдкреЛрдЬрд╝: рдореЗрдХрдлрд╝рд╛рдЗрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛

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

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