рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдСрдЯреЛ-рдЕрдкрдбреЗрдЯреЗрдб рдПрд╕рдПрд╕рдПрд▓ рдХреЗ рд╕рд╛рде Node.js https рд╕рд░реНрд╡рд░ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдФрд░ рдореИрдВрдиреЗ рд╡рд┐рдХрд╛рд╕ рдЪрдХреНрд░ рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ (+ рдЧрд┐рдЯ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛)

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


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

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

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

рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк


рдЕрдкрдиреЗ рд╢реМрдХ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдорд╣реАрдиреЗ рдореЗрдВ $ 10 рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЙрд╕ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЛ рдЪреБрдирд╛ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рд╛рде рд░рд╣рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдереАред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдореБрдЭреЗ 0 рдЕрдиреБрднрд╡ рдереЗ, рдЬрд┐рд╕рдореЗрдВ рд╕рд╛рдЗрдЯ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рднреА рд╢рд╛рдорд┐рд▓ рдереАред рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдордирд╛ рдХрд░ рджрд┐рдпрд╛:

рдЬреЗрд▓рд╕реНрдЯрд┐рдХ : рд╕реБрдВрджрд░ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдЗрдВрдЯрд░рдлреЗрд╕, рд╕рдм рдХреБрдЫ рд╕рд╣рдЬ, рд╕реНрдХреЗрд▓реЗрдмрд▓ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд▓рдЧрддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдореБрдЭреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ (рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ nginx vps рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдХреЗрд╡рд▓ рдЙрдирдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде) рдФрд░ SSL (рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдкрдбреЗрдЯрд┐рдВрдЧ) рдХреЛ рдорд╛рдирдХ рддрд░реАрдХреЛрдВ рд╕реЗ рд░реВрд╕реА-рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рдбреЛрдореЗрди рд╕реЗ рдЬреЛрдбрд╝рдирд╛ (рд╡реЗ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ)

рдХреНрд▓рд╛рдЙрдб рд╣реЛрд╕реНрдЯрд┐рдВрдЧ REG.RU : рдореЗрд░реЗ рдкрд╛рд╕ рднреА рдПрдХ рдбреЛрдореЗрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рддрд░реНрдХрд╕рдВрдЧрдд рд▓рдЧ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдкрд╛рд╕ PostgreSQL рдЕрд▓рдЧ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЬрдм рд╕реЗ рдореИрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рд╢рд╛рд╕рди рд╕реЗ рд╕рдВрдкрд░реНрдХ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдореИрдВрдиреЗ рдЖрдЧреЗ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред

AWS рдФрд░ Google рдХреНрд▓рд╛рдЙрдб : рдореИрдВрдиреЗ рдЗрд╕рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд╕рдм рдХреБрдЫ рдареАрдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╣рдорд╛рд░реЗ "рдЕрджреНрднреБрдд" рдХрд╛рдиреВрдиреЛрдВ рдФрд░ рд░реВрд╕реА рд╕рдВрдШ рдореЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдпрд╛рдж рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрди рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рд░реВрд╕реА рд╕рдВрдШ рдореЗрдВ рд╕рд░реНрд╡рд░ рдирд╣реАрдВ рдереЗред рдПрдХ рд╡рдХреАрд▓ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдкрд╛рдк рд╕реЗ рд░реВрд╕реА рд╕рдВрдШ рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдмрд╛рджрд▓реЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХрд╛рдиреВрди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдкред

рдпрджреНрдпрдкрд┐ рд░реВрд╕реА рд╕рдВрдШ рдореЗрдВ рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рджрд▓ рдереЗ, рдлрд┐рд░ рднреА рдореБрдЭреЗ рдХреБрдЫ рдРрд╕рд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рдЬреЛ рдореБрдЭреЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ рдкреНрд░рд╢рд╛рд╕рди рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛ред рдЖрд╡реЗрдЧ рдереЛрдбрд╝реА рджреЗрд░ рдкрд╣рд▓реЗ рдЖрдпрд╛ рдерд╛ рдпреИрдВрдбреЗрдХреНрд╕ред рдЬреЛ рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЧрдпрд╛ рдерд╛, рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП рд░реЛрдХ рджрд┐рдпрд╛ред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ PostgreSQL рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рддреБрд░рдВрдд 1core рдФрд░ 4GB рд░реИрдо рдХреЗ рд╕рд╛рде рдЖрддреА рд╣реИ, рдЬрд┐рд╕рдХреА рд▓рд╛рдЧрдд рдкреНрд░рддрд┐ рдорд╛рд╣ рд▓рдЧрднрдЧ 2k рд░реВрдмрд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рдХрд╛рд╕ рдФрд░ рдХрдо рднрд╛рд░ рдХреЗ рд▓рд┐рдП, рдореИрдВ ~ 300r рдХреЗ рд▓рд┐рдП VPS рдкрд░ PostgreSQL рдЪрд▓рд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддрд╛ рд╣реВрдВ, рдФрд░ рд▓реЛрдб рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред Yandex рдкреНрд░рд╢рд╛рд╕рди рдФрд░ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИред

Yandex.Cloud рдХреА рд╕реНрдерд╛рдкрдирд╛


рдЖрднрд╛рд╕реА рдирд┐рдЬреА рдмрд╛рджрд▓


1) рдЕрдкрдиреА рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдБ:

рдЫрд╡рд┐

2) рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдкреНрд░рд╛рдЗрд╡реЗрдЯ рдХреНрд▓рд╛рдЙрдб рдмрдирд╛рдПрдВ:

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

3) рдПрдХ рд╕рдмрдиреЗрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдЖрдИрдкреА рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдпрд╣ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдХреА рддрд░рд╣ рд╣реИ)

рдЫрд╡рд┐

4) рдЖрдИрдкреА рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдХ рд╕реНрдерд┐рд░ рдЖрдИрдкреА рдЖрд░рдХреНрд╖рд┐рдд рдХрд░реЗрдВред

рдЙрд╕ рдкрд░ рд╣рдо рдШрд░ рдФрд░ рдЕрдиреНрдп рд╕реНрдерд╛рдиреЛрдВ рд╕реЗ рдЬреБрдбрд╝реЗрдВрдЧреЗред рдЖрдк рд╢рд╛рдпрдж рдЧрддрд┐рд╢реАрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдпрд╣ рдХрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИред

рдЫрд╡рд┐

рд╕рдВрдЧрдгрдХ рдореЗрдШ


рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЧрдгрдирд╛ рд╣реЛрдЧреА :) рдЕрд░реНрдерд╛рдд, рд╣рдо рд▓рд┐рдирдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдмрдирд╛рдПрдВрдЧреЗ (рдореИрдВрдиреЗ ubuntu 18.04 рдЪреБрдирд╛), рдиреЛрдб.рдЬреЗрдПрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред

рдЫрд╡рд┐

рд╣рдо рдПрдХ рд╡реАрдПрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рд╕рднреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдЦреЛрд▓ рджреЗрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рдЬрдм рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдореЛрдбрд╝ рджреЗрдВ, рдареАрдХ рд╣реИ, рд╣рдо рд░реЗрдЦрд╛рдВрдХрди рджреНрд╡рд╛рд░рд╛ рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдВрдЧреЗ)ред

SSH


рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рд╣реИ SSH:

рдЫрд╡рд┐

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

C: \ Program Files \ PuTTY \ puttygen.exe рдЪрд▓рд╛рдПрдБ

рдЫрд╡рд┐

рд╣рдо рдЬреЗрдирд░реЗрдЯ рдмрдЯрди рдХреЛ рджрдмрд╛рддреЗ рд╣реИрдВ рдФрд░ рдорд╛рдЙрд╕ рдХреЛ рдЬрдирд░реЗрдЯ рдХреА рдХреА (рдЬреИрд╕реЗ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ) рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХрддрд╛ рджреЗрддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЯреЗрдХреНрд╕реНрдЯ рд▓рд╛рдЗрди рдореЗрдВ рдХрд╣реАрдВ ssh-rsa рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЗрди рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рд╕реЗрд╡ рдкреНрд░рд╛рдЗрд╡реЗрдЯ рдХреА, рд╕реЗрд╡ рдкрдмреНрд▓рд┐рдХ рдХреАред рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЙрдкреА рдХреА рдЧрдИ рдХреБрдВрдЬреА рдХреЛ Yandex Yandex рдкреГрд╖реНрда рдХреА рдХреБрдВрдЬреА рдХреЗ SSH рдлрд╝реАрд▓реНрдб рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рд░реВрдЯ рдХреЛ рд▓реЙрдЧрд┐рди рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЧреНрд░рд╛рдлрд┐рдХ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрдЧреА, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрдк рдШрд░ / рдХрд╛рдо рд╕реЗ рдХреНрд▓рд╛рдЙрдб рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВрдЧреЗ (рд╢рд╛рдпрдж рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛)ред
рдЬреИрд╕рд╛ рдХрд┐ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд░реВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ рддрд╛рдХрд┐ рдЪреАрдиреА рдмреЙрдЯ рдЖрдкрдХреЗ рдХреНрд▓рд╛рдЙрдб рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рди рдЙрдард╛рдПрдВ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ Yandex.cloud рдПрдХреНрд╕реЗрд╕ рдХреЗрд╡рд▓ SSH рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИ, рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВред

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


рд╣рдо рдПрдХ рдкреАрд╕реА рд╕реЗ рдХреНрд▓рд╛рдЙрдб рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдореБрдлреНрдд рдПрд╕рдПрд╕рдПрдЪ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ


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

рдмрд┐рдЯрд╡рд┐рд╢ ssh рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ


рдЫрд╡рд┐

рдпрд╣рд╛рдВ рд╕рд░реНрд╡рд░ рдореЗрдВ> рд╣реЛрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рд╣рдорд╛рд░реЗ рдмрд╛рд╣рд░реА рдЖрдИрдкреА рдХреНрд▓рд╛рдЙрдб рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреЛрд░реНрдЯ 22. рдХреНрд▓рд╛рдЗрдВрдЯ рдХреБрдВрдЬреА рдкреНрд░рдмрдВрдзрдХ> рдЖрдпрд╛рдд рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдирд┐рдЬреА рдХреБрдВрдЬреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдЖрдкрдХреЛ рдЕрднреА рднреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдХреБрдЫ рдРрд╕рд╛ рдЪреБрдиреЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рднреВрд▓ рдирд╣реАрдВ рдкрд╛рдПрдВрдЧреЗред рдЗрд╕ рд╡рд┐рдВрдбреЛ рдХреЛ рдмрдВрдж рдХрд░реЗрдВ рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ: рд░реВрдЯ, рд╡рд┐рдзрд┐ publick рдХреБрдВрдЬреА, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреБрдВрдЬреА - рдкрд╣рд▓реЗ рд╕реЗ рдЖрдпрд╛рддрд┐рдд рдПрдХ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рд▓реЙрдЧрд┐рди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдЕрдЧрд░ рд╣рдордиреЗ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдХреНрд▓рд╛рдЙрдб рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:

рдЫрд╡рд┐

Node.js рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рдпрд╣рд╛рдВ рдореИрдВ digitalocean.com рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рд╡реЗ рдмрд╣реБрдд рд╡рд┐рд╕реНрддреГрдд рд╣реИрдВ рдФрд░ рдХрдИ рд░реВрд╕реА рдореЗрдВ рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░ рдореИрдВ Google тАЬdigitalocean ubuntu 18.04 рдиреЛрдб .jsтАЭ рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА рдЖрдк рд╡рд╣рд╛рдВ рд╕реНрдерд╛рдкрд┐рдд рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

Node.js рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдпрд╣рд╛рдБ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдо рдиреЛрдбрд╕реЛрд░реНрд╕ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ (рдпрд╣рд╛рдВ рдиреЛрдб рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдгред рдЬреЗрдПрд╕ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ), рдпрд╣рд╛рдВ рд╕реЗ рдкрддреНрддреА рджреЗрдВ:

рдЫрд╡рд┐

рдмрд╛рд░реА-рдмрд╛рд░реА рд╕реЗ рдХрдорд╛рдВрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ:

curl -sL https://deb.nodesource.com/setup_11.x | sudo -E bash - sudo apt-get install -y nodejs 

рд╣рдо рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛

 nodejs -v 

рд╣рдо рдиреЛрдб.рдЬреЗрдПрд╕ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦреЗрдВрдЧреЗ

 npm -v 

рд╣рдореЗрдВ node.js. рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛

рдЗрд╕рдХреЗ рдмрд╛рдж, / opt / mysuperapp рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдЬрд╛рдПрдБ (my_super_app_name - рдЖрдкрдХреЛ рдпрд╣ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛)ред рдСрдкреНрдЯреЙрдЧ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЛ рд▓рдВрдмреЗ рдЧреЛрд▓рдЧрдкреНрдкреЗ рдХреЗ рдмрд╛рдж рдЖрд╡реЗрджрди рдХреЗ рд╕реНрдерд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ "рдЬрд╣рд╛рдВ рдЙрдмрдВрдЯреВ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдиреЛрдбреНрд╕.рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓реЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ"ред

рдЕрдВрдд рдореЗрдВ, server.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ, рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛, рдФрд░ рдиреЛрдб рдкрд░ рд╕рд░рд▓ рд╕рд░реНрд╡рд░ рдХреЛрдб рдкреЗрд╕реНрдЯ рдХрд░реЗрдВред

 const http = require('http'); const hostname = 'localhost'; const port = 80; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World!\n'); }); server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); }); 

рдкреЛрд░реНрдЯ 80 http рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ, 443 https рдХреЗ рд▓рд┐рдП рд╣реИред рдЬрдмрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ http рдкрд░ рдПрдХ рд╕рд░реНрд╡рд░ рд╣реИред

рд╣рдо рд╕рдм рдХреБрдЫ рдмрдЪрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ:

 node server.js 

рдХрдВрд╕реЛрд▓ рдХреЛ рд▓рд╛рдЗрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП 'рд╕рд░реНрд╡рд░ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ: 80 /'

рдЕрдм рдЖрдк рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдмрд╛рд╣рд░реА рдЖрдИрдкреА рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдкрдХреЗ ubuntu VM рдХреЗ Yandex рдХреНрд▓рд╛рдЙрдб рдореЗрдВ) рдФрд░ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб!"

рд╣рдо рд╕рдм рдХреБрдЫ рд╕реБрд╡рд┐рдзрд╛ рд╕реЗ рдпрд╛ рд╡рд┐рдХрд╛рд╕ рдЪрдХреНрд░ рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ


рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рд╣рд░ рд╕рдордп рдХреНрд▓рд╛рдЙрдб рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЪрд╛рдирдХ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдХреЗрд▓реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

Github


рдЧрд┐рддреБрдм рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХрд╛ рдХреЛрдб рдЭреВрда рд╣реЛрдЧрд╛ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

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

рд╕рдм рдХреБрдЫ рддреЗрдЬ, рд╕рд░рд▓ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреАрдердм рдкрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдЬреА рднрдВрдбрд╛рд░ рдмрдирд╛рдПрдВ (рдпрд╣ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛):

рдЫрд╡рд┐

рдЖрд╡реЗрджрди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди github.com/ReTWi/mysuperapp.git рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВред

рдЫрд╡рд┐

  1. рд╣рдо рдмрд┐рдЯрд╡рд┐рдЗрд╕ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ ctrl + c (рдпрджрд┐ рдпрд╣ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ) рджрдмрд╛рдХрд░ рдмрдВрдж рдХрд░ рджреЗрдВред
  2. / рдСрдкреНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ

Git рд╡рд╣ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ github, рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдпрд╛ рдЕрдиреНрдп рдкреАрд╕реА рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП Git рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрднреА рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкрд░ рдЧрд┐рдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

 sudo apt update sudo apt install git 

рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ:

 git --version 

рдЧрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдо рдЧрд┐рдЯ рдбреЗрдЯрд╛ рдореЗрдВ рднрд░рддреЗ рд╣реИрдВ (рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдХреНрдпреЛрдВ, рд▓реЗрдХрд┐рди рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рдХреБрдЫ рдЙрдмрд╛рдК рдЪреЗрддрд╛рд╡рдиреА рд╣реЛ рд╕рдХрддреА рд╣реИ)ред

 git config --global user.name "Your Name" git config --global user.email "youremail@domain.com" 

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ:
(рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХрд╛ рд▓рд┐рдВрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)

 git clone https://github.com/ReTWi/mysuperapp.git 

рдПрдХ рдирдпрд╛ mysuperapp / рдСрдкреНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ github рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдм рдкреАрд╕реА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рджреЛрд╣рд░рд╛рдиреЗ рдФрд░ рдкреАрд╕реА рд╢реНрд░реГрдВрдЦрд▓рд╛ (рдЕрд▓рдЧ) -> рдЬреАрдердм -> рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ

рдкреАрд╕реА рдкрд░ рдиреЛрдб.рдЬреЗрдПрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред

рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЛрдб


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

рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:

рдЫрд╡рд┐

рдкреАрд╕реА рдХреЗ рд▓рд┐рдП рдЧрд┐рдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ ред
рд╡реАрдЯреАрдХреЛрдб рдореЗрдВ рд╕реАрдЯреАрдПрд▓ + рд╢рд┐рдлреНрдЯ + `рдпрд╛ рдЯрд░реНрдорд┐рдирд▓> рдирдП рдЯрд░реНрдорд┐рдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХрдВрд╕реЛрд▓ рдЦреЛрд▓реЗрдВ

рд╡рд┐рд╖рдпрд╛рдВрддрд░:

рд╡рд┐рдВрдбреЛрдЬрд╝ рдХрдВрд╕реЛрд▓ рдореЗрдВ, рдпрд╣ рд░реВрд╕реА рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде рдЦрд░рд╛рдм рд╣реИ, рддрд╛рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЛрдИ рджрд░рд╛рд░ рди рдкрдбрд╝реЗ> рд╡рд░реАрдпрддрд╛рдПрдБ> рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдЯрд░реНрдорд┐рдирд▓.integrated.shellArgs.windows рджрд░реНрдЬ рдХрд░реЗрдВ, рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ

рдЫрд╡рд┐

рдФрд░ "рдЯрд░реНрдорд┐рдирд▓.integrated.shellArgs.windows": ["-NoExit", "/ c", "chcp 65001"], рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВ

рдЫрд╡рд┐


Github рд╕реЗ рдлрд╝рд╛рдЗрд▓реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рджреЛрд╣рд░рд╛рдПрдВ:

 git clone https://github.com/ReTWi/mysuperapp.git 

рд╡реАрдПрд╕рдХреЛрдб рдореЗрдВ, рдлрд╝рд╛рдЗрд▓> рдлрд╝реЛрд▓реНрдбрд░ рдЦреЛрд▓реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдЦреЛрд▓реЗрдВред

рдПрдХ рд╣реА рд╕рд░рд▓ рд╕рд░реНрд╡рд░ рдХреЛрдб рдХреЗ рд╕рд╛рде server.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:

 const http = require('http'); const hostname = 'localhost'; const port = 80; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World!\n'); }); server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); }); 

рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рд╕рд░реНрд╡рд░ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЛрдбреЗрдо рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

 npm i nodemon -g 

рдореИрдВ - рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо
рдЬреА - рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд╛рдкрдирд╛ (рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП), рдФрд░ рди рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдПред

рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ:

 nodemon server.js 

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдЦреЛрд▓реЗрдВ: 80 / рдпрд╛ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ: 80 рдФрд░ рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рджреЗрдЦреЗрдВред

рдЕрдм рд╣рдорд╛рд░реА рдкреАрд╕реА рд╢реНрд░реГрдВрдЦрд▓рд╛> рдЬреАрдердм> рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред

рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП Github рдбреЗрд╕реНрдХрдЯреЙрдк рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдЕрдкрдирд╛ github рдЦрд╛рддрд╛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ, рдлрд┐рд░ рд╕реНрдерд╛рдиреАрдп рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рд╣рдо Github рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд┐рдП рдЧрдП рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ (рд╣рдордиреЗ server.js рдЬреЛрдбрд╝рд╛):

рдЫрд╡рд┐

"рдХрдорд┐рдЯ рдЯреВ рдорд╛рд╕реНрдЯрд░"> "рдкреБрд╢ рдУрд░рд┐рдЬрд┐рди" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреАрд╕реА рд╕реЗ рдЧреАрдереВрдм рдореЗрдВ рдлрд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред

рдЫрд╡рд┐

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

рдЫрд╡рд┐

рдЖрдЗрдП рдереЛрдбрд╝рд╛ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ, рд╡реАрдПрд╕рдХреЛрдб рдореЗрдВ рд╣рдо "res.end ('рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб! \ N') рдХреА рдЬрдЧрд╣ рд▓реЗрддреЗ рд╣реИрдВ;" "res.end ('OmNomNom');"ред рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рд░реНрд╡рд░ рдиреЗ рд╕реНрд╡рдпрдВ рд░рд┐рдмреВрдЯ рдХрд┐рдпрд╛:

рдЫрд╡рд┐

рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЬрд╛рдБрдЪ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ "OmNomNom" рдореЗрдВ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред

рдбреЗрд╕реНрдХрдЯреЙрдк рдЬреАрдереБрдм рд╣рдореЗрдВ рдпрд╣ рднреА рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рд╣рдордиреЗ рд▓рд╛рдЗрди рдмрджрд▓ рджреА рд╣реИ:

рдЫрд╡рд┐

рдлрд┐рд░ рд╕реЗ, рдорд╛рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ> рдЙрддреНрдкрддреНрддрд┐ рдХреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЧреАрдереВрдм рдкрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд╢ рдХрд░реЗрдВред

рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдЬрд╛рдПрдБред

рд╣рдо рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдЕрдЧрд░ рдпрд╣ рдЕрднреА рднреА рдЪрд▓ рд░рд╣рд╛ рд╣реИ (ctrl + c)ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдЕрджреНрдпрддрди рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:

 git config credential.helper store git pull 

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

Pm2 рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ - рдХреЗрд╡рд▓ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдорд╛рди,

 npm i pm2 -g 

рдЪрд▓рд┐рдП pm2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкрд░ рдЕрдЧрд▓реЗ git рдкреБрд▓ рджреНрд╡рд╛рд░рд╛ рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░реЗрдЧрд╛:

 pm2 start server.js --watch 

рд╣рдорд╛рд░реЗ рдмрд╛рд╣рд░реА рдЖрдИрдкреА рдХреНрд▓рд╛рдЙрдб рдкрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЦреЛрд▓реЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ "рдУрдордиреЛрдордиреЙрдо" рдХреЛ рджреЗрдЦреЗрдВред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдФрд░ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкрд░ рдЗрд╕рдХреА рддреЗрдЬреА рд╕реЗ рддреИрдирд╛рддреА рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ред

рд╣рдо рд╕реНрдерд╛рдиреАрдп рд╣реЛрд╕реНрдЯ рдФрд░ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкрд░ HTTPS рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд╛рдпреА SSL рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдмрдирд╛рддреЗ рд╣реИрдВ


рд╣рдо рд╕рд╛рдЗрдЯ zerossl.com рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ

рдЫрд╡рд┐

рдбреЛрдореЗрди рдореЗрдВ, рдЖрдИрдкреА ... рдлрд╝реАрд▓реНрдб, рдкрд╣рд▓реЗ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдВ, рдЬрдирд░реЗрдЯ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдмрдЯрди рджреНрд╡рд╛рд░рд╛ 2 рдлрд╛рдЗрд▓реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ:

рдЫрд╡рд┐

рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ ssl / localhost рдлреЛрд▓реНрдбрд░ рдореЗрдВ рд╕реЗрд╡ рдХрд░рддреЗ рд╣реИрдВред

рдмрд╛рд╣рд░реА IP рдХреНрд▓рд╛рдЙрдб рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреЛрд╣рд░рд╛рдПрдВ рдФрд░ рдЗрд╕реЗ ssl / myapp рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВред

рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ https рд╕рд░реНрд╡рд░ node.js рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ


рдЖрд╡реЗрджрди рд╕рдВрд░рдЪрдирд╛:

рдЫрд╡рд┐

  • рдЧреНрд░рд╛рд╣рдХ - рдпрд╣рд╛рдБ рд╣рдорд╛рд░рд╛ рдлреНрд░рдВрдЯ-рдПрдВрдб рдЭреВрда рд╣реЛрдЧрд╛ред рдореЗрд░реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИред
  • рд▓реЙрдЧ - рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкрд░ рд▓реЙрдЧ рдпрд╣рд╛рдБ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ
  • рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ - рдиреЛрдб.рдЬреЗрдПрд╕ рдореЙрдбреНрдпреВрд▓
  • рдирд┐рдЬреА - рдЖрдкрдХреА рдирд┐рдЬреА рдлрд╛рдЗрд▓реЗрдВ, рдореИрдВ рдПрд╕рдПрд╕рдПрдЪ рдПрдХреНрд╕реЗрд╕ рдХреЛ рд╡рд╣рд╛рдВ рдХреНрд▓рд╛рдЙрдб рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реВрдВ
  • рд╕рд░реНрд╡рд░ рдЖрдкрдХрд╛ рдмреИрдХрдПрдВрдб рд╣реИ
  • ssl - рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдФрд░ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкрд░ https рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ssl рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ
  • .babelrc - webpack'om рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░рд┐рдПрдХреНрдЯ рдмрд┐рд▓реНрдб рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рдЖрдкрдХреЛ рдлреНрд░рдВрдЯрдПрдВрдб рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЕрдзрд┐рдХ рдЖрдзреБрдирд┐рдХ рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ)
  • .рдЧрд░рд┐рдЧреНрдиреЛрд░ - рд╡реЗ рдлрд╛рдЗрд▓реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЧрд┐рдЯрд╣рдм рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЬреАрдЖрдИрдЯреА рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрддреА рдирд╣реАрдВ рд╣реИ)
  • client.js - рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ
  • package.json - рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдХрдорд╛рдВрдб рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рдиреЛрдб_рдореЙрдбрд▓ред
  • package-lock.json - рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдлрд╝рд╛рдЗрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╡рд╣реА рдореЙрдбреНрдпреВрд▓ рдЖрдкрдХреЗ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдФрд░ рдЖрдкрдХреЗ рдкреАрд╕реА рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИрдВ)ред
  • pm2-watch.json - рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП pm2 рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕реЗрдЯрд┐рдВрдЧреНрд╕
  • README.md - рдЬреАрдердм рдХреЗ рд▓рд┐рдП рдХрд╡рд░
  • server.js - рд╣рдорд╛рд░реЗ рдмреИрдХрдПрдВрдб Node.js рд╕рд░реНрд╡рд░ рдХрд╛ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ
  • webpack.config.js - рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ

.gitignore


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

 /node_modules/ /logs/* # exception to the rule !logs/.gitkeep /public/react_bundle.js /public/isProd.js 

рдЪреВрдБрдХрд┐ рдЧрд┐рддреБрдм рдЦрд╛рд▓реА рдлреЛрд▓реНрдбрд░ рдХреЛ рдЕрдирд▓реЛрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдХреБрдЫ рдЕрдВрджрд░ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЦрд╛рд▓реА .gitkeep рдлрд╝рд╛рдЗрд▓ред рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдмрдВрдж рдХрд░реЗрдВред

package.json


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдЦреЛрд▓реЗрдВ рдФрд░ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ (// рдЬреЛрдбрд╝рд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж)

 { "name": "myapp", //    "version": "1.0.0", "description": "OmNomNom", "main": "server.js", "scripts": { "server": "pm2 start pm2-watch.json", //  npm run server     "client": "webpack -w --mode development", //  npm client    .        ,   . "client-prod": "webpack --mode production", //     production "client-analyze": "webpack --mode production --analyze true" //     production       .    }, "repository": { "type": "git", "url": "git+https://github.com/myapp/knigam.git" //     github }, "author": "rtw", "license": "UNLICENSED", //     ( ) "bugs": { "url": https://github.com/myapp/knigam.git" }, "homepage": "https://github.com/myapp/knigam.git#readme", "dependencies": { "@babel/core": "^7.2.2", //  js  frontend "@babel/plugin-transform-runtime": "^7.2.0", //  js  frontend "@babel/preset-env": "^7.3.1", //  js  frontend "@babel/preset-react": "^7.0.0", //  js  frontend "ajv": "^6.8.1", //    "babel-loader": "^8.0.5", //  js  frontend "babel-plugin-styled-components": "^1.10.0", //   styled-components "css-loader": "^2.1.0", //   webpack'om css "fastify": "^2.0.0-rc.6", //  express,      "fastify-cookie": "^2.1.6", //    "fastify-static": "^2.2.0", //     "moment": "^2.24.0", //    "pg": "^7.8.0", //    "pino": "^5.11.1", //   postgreSQL  node.js "pino-pretty": "^2.5.0", //     "react": "^16.8.1", // Frontend .      Vue.js,    .      ,     "react-dom": "^16.8.1", // React     "style-loader": "^0.23.1", //   webpack'om ,    "styled-components": "^4.1.3", // CSS in JS,           "webpack": "^4.29.3", //    "webpack-bundle-analyzer": "^3.0.3", //       "webpack-cli": "^3.2.3" //    ,     } } 

рдореИрдВ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдЪреБрдиреЗ рдЧрдП рджреЛ рдореБрдЦреНрдп рдврд╛рдВрдЪреЗ / рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛:
Fastify рдХреЛ express.js рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдЪреВрдВрдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА htpp2 рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд╕рдорд░реНрдерди рд╣реИ, рдпрд╣ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ express.js рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рднрд╡рд┐рд╖реНрдп рд╣реИ, рдЬреЛ рдмрд╣реБрдд рдзреАрдорд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдПрдХреНрд╕рдкреНрд░реЗрд╕.рдЬреЗрдПрд╕ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

рд░рд┐рдПрдХреНрдЯ рдЗрд╕рд▓рд┐рдП рдЪреБрдирд╛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛, рд╕рдордЭрдирд╛ рдФрд░ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд╣рд░ рдЪреАрдЬ рдХреЛ рдЖрдЬрдорд╛рдирд╛ рдЖрд╕рд╛рди рдерд╛ред Vue - рдпрд╣ рдЕрдкрдиреЗ рдирд┐рдпрдореЛрдВ, рджрд┐рд╢рд╛ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рдпрджреНрдпрдкрд┐ Vue рдореЗрдВ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдХреБрдЫ рдХрдо рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд┐рд╕реА рддрд░рд╣ рдЖрд╕рд╛рди рд╣реЛ рдЧрдИред

рд╣рдо Package.json рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рднреА рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 npm i 

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдиреЛрдб_рдореЙрдбрд▓ рдлрд╝реЛрд▓реНрдбрд░ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рднреА рдореЙрдбреНрдпреВрд▓ рд╣реЛрдВрдЧреЗред

рдЧреНрд░рд╛рд╣рдХ - рдЬрдмрдХрд┐ рдЦрд╛рд▓реА рдлрд╝реЛрд▓реНрдбрд░
рд▓реЙрдЧ-рдЗрди .рдЧрд┐рддрдХреА рдлрд╝рд╛рдЗрд▓ рдЕрдВрджрд░ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдлрд╝реЛрд▓реНрдбрд░ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд▓реЙрдЧ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЧрд┐рд░ рдЬрд╛рддреЗ рд╣реИрдВред рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рд╣рдо рд╕рдм рдХреБрдЫ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдВрдЧреЗред

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ


рдпрд╣рд╛рдВ рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рдХреА рд╕реНрдЯреИрдЯрд┐рдХ рдлрд╛рдЗрд▓реНрд╕ рдЭреВрда рдмреЛрд▓реЗрдВрдЧреА, рд╡рд╣рд╛рдВ рдХреА рдЗрдореЗрдЬ, рдлреЗрд╡рд┐рдХреЙрди рдЖрджрд┐ред
рдЖрдЗрдП рд╣рдо рджреЛ рдлрд╛рдЗрд▓реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ:
index.html:

 <!DOCTYPE html> <html> <head> <base href="/" /> <meta charset="UTF-8" /> <title>MyApp</title> </head> <body> <div id="cookies">    react_bundle   </div> <noscript >:       Javscript</noscript > <script src="react_bundle.js"></script> </body> </html> 

- рдпрд╣рд╛рдБ рд╣рдо рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рд╛рдордиреЗ рдЕрдВрдд рд▓реЛрдб рдФрд░ рдЗрд╕рдХреА рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЯреИрдЧ рдореЗрдВ рдкреНрд░рджрд╛рди рдХреА рд╣реИред

isProd.js рдореЗрдВ рдПрдХ рдПрдХрд▓ рдкрдВрдХреНрддрд┐ "рдореЙрдбреНрдпреВрд▓ .exports = false" рд╣реИ
рдЪреВрдБрдХрд┐ рдпрд╣ .gitignore рдЕрдкрд╡рд╛рджреЛрдВ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреЛрд░реНрдЯреЗрдмрд▓ рдирд╣реАрдВ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рд╣рдо рдЗрд╕реЗ рдкреАрд╕реА рдкрд░ рдЧрд▓рдд рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкрд░ рд╕рдЪ рд╣реИред рддрдм рд╣рдо рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ (рд╡рд┐рдХрд╛рд╕ / рдЙрддреНрдкрд╛рджрди) рдХрд┐рд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╣реИрдВред рдпрд╣ рдореБрдЭреЗ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧрд╛, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдХреЛрдб рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

ssl - рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдФрд░ myapp рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╕рд╣реЗрдЬреЗ рдЧрдП рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рд╣реИрдВ

.babelrc


 { "presets": [ [ "@babel/preset-env", { "targets": { "browsers": [">0.25%", "not ie 11", "not op_mini all"] } } ], "@babel/preset-react" ], "plugins": [ "babel-plugin-styled-components", "@babel/plugin-transform-runtime" ] } ", { "presets": [ [ "@babel/preset-env", { "targets": { "browsers": [">0.25%", "not ie 11", "not op_mini all"] } } ], "@babel/preset-react" ], "plugins": [ "babel-plugin-styled-components", "@babel/plugin-transform-runtime" ] } 

0.25% рд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛_рдмрдВрдбрд▓реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ред

client.js


 import React from 'react' import { render } from 'react-dom' render(<div>!!</div>, document.getElementById('cookies')) 


рдХреБрдХреА рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдПрдХ div рдореЗрдВ рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред

pm2-watch.json - рдЖрдкрдХреЛ рдХреЛрдб рдореЗрдВ рдЯреНрд░реИрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рдмреВрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкрд░ "рдПрдирдкреАрдПрдо рд░рди рд╕рд░реНрд╡рд░" рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

webpack.config.js


рд░рд┐рдПрдХреНрдЯрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд┐рд▓реНрдбрд░:

 const webpack = require('webpack'), path = require('path'), BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin module.exports = (env, argv) => { let prod = argv.mode == 'production' let config = { entry: './client.js', output: { path: path.resolve('./public'), filename: 'react_bundle.js' }, module: { rules: [ { test: /\.(js|jsx)$/, exclude: /node_modules/, loader: 'babel-loader' }, { test: /\.css$/, use: ['style-loader', 'css-loader'] } ] }, resolve: { alias: { client: path.resolve('./client/shared'), public: path.resolve('./public') } }, plugins: [ argv.analyze ? new BundleAnalyzerPlugin() : false, prod ? new webpack.optimize.AggressiveMergingPlugin() : false, new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /ru/) ].filter(Boolean), optimization: { minimize: prod ? true : false }, performance: { hints: false } } return config } 

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╡рд╣ client.js рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рдЕрдВрджрд░ рдореМрдЬреВрдж рд╕рдм рдХреБрдЫ, react_bundle рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рдЗрд╕реЗ рдЦреБрд▓реЗ index.html рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

server.js


 const isProd = require('./public/isProd'), fs = require('fs'), log = require('./server/logger'), path = require('path') //   node.js,      process.on('unhandledRejection', (reason, promise) => { log.error({ reason, promise }, '  unhandledRejection') }) process.on('uncaughtException', err => { log.error({ err }, '  uncaughtException') }) // Redirect server from http port 80 to https 443 const fastifyHttp = require('fastify')({ logger: log, ignoreTrailingSlash: true }) fastifyHttp.listen(80, '::', (err, address) => { if (err) { log.error({ err, address }, '   HTTP ') } else { log.warn('Http c ') } }) // Let's Encrypt challenge fastifyHttp.get('/.well-known/acme-challenge/:file', (req, res) => { let stream = fs.createReadStream( path.join(__dirname + '/ssl/.well-known/acme-challenge/' + req.params.file) ) res.type('text/html').send(stream) }) fastifyHttp.get('/*', (req, res) => { res.redirect(301, 'https://' + req.headers.host + req.raw.url) }) fastifyHttp.get('/', (req, res) => { res.redirect(301, 'https://' + req.headers.host + req.raw.url) }) //  let fastifyOptions = { logger: log, ignoreTrailingSlash: true, http2: true } fastifyOptions.https = isProd ? { allowHTTP1: true, key: fs.readFileSync('./ssl/myapp/key.txt'), cert: fs.readFileSync('./ssl/myapp/crt.txt') } : { allowHTTP1: true, key: fs.readFileSync('./ssl/localhost/cert.key'), cert: fs.readFileSync('./ssl/localhost/cert.pem') } const fastify = require('fastify')(fastifyOptions) fastify.listen(443, '::', (err, address) => { if (err) { log.error({ err, address }, '   ') } else { log.warn( `   ${ isProd ? '' : ' ' }` ) } }) //  fastify.setSchemaCompiler(schema => { return ajv.compile(schema) }) //  fastify fastify.setErrorHandler((err, req, res) => { log.error({ err, req }, 'fastify errorHandler') //     if (err.validation) { return res.send({ error: '   ' }) } else { return res.send({ error: ' errorHandler' }) } }) //   fastify.register(require('fastify-static'), { root: path.join(__dirname, './public') }) //  fastify.register(require('fastify-cookie'), err => { if (err) log.error({ err }, 'fastify-cookie') }) //       /   //       index.html,     //        api,   GET /api/userdata fastify.setNotFoundHandler((req, res) => { res.sendFile('index.html') }) // Routes fastify.register( async openRoutes => { //    openRoutes.register(require('./server/api/open')) openRoutes.register(async withSession => { //         //    , : ///withSession.addHook('preHandler', async (req, res) => { // if (!(await sessionManagerIsOk(req, res))) return // }) withSession.register(require('./server/api/with_session')) }) }, { prefix: '/api' } //    ) 

рд╕рд░реНрд╡рд░ рдлрд╝реЛрд▓реНрдбрд░


рдпрд╣рд╛рдБ рдмреИрдХрдПрдВрдб рдФрд░ рд╕рднреА рддрд░реАрдХреЗ рдирд┐рд╣рд┐рдд рд╣реИрдВред
logger.js - рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░, isProd рдХрдВрд╕реЛрд▓ рдпрд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧ рд╣реЛрддрд╛ рд╣реИ

 'use strict' const pino = require('pino'), isProd = require('../public/isProd') let logOptions = isProd ? { level: 'warn', //   timestamp: () => { return ',"time":"' + new Date() + '"' } } : { level: 'warn', prettifier: require('pino-pretty'), prettyPrint: { levelFirst: true, translateTime: true } } let dest = isProd ? pino.destination('./logs/errors.log') : pino.destination(1) let log = pino(logOptions, dest) module.exports = log 

рд╕рд░реНрд╡рд░ / рдПрдкреАрдЖрдИ /
open.js - рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рд░рд╛рд╕реНрддреЗ рдЬреЛрдбрд╝реЗрдВред

 'use strict' module.exports = function(fastify, options, next) { fastify.route({ method: 'GET', url: '/', handler: async (req, res) => { res.send('api / route') } }) fastify.route({ method: 'GET', url: '/hi', handler: async (req, res) => { res.send('api / route hi') } }) next() } 

рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкрд░ рд╕рдм рдХреБрдЫ рд╕реЗрдЯ рдЕрдк рдФрд░ рдЪреЗрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдмрд╕ рд╕рдм рдХреБрдЫ рдЬреАрдереВрдм рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╣рд╛рдБ рд╕реЗ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рддрдХ рдЦреАрдВрдЪрддреЗ рд╣реИрдВред рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкрд░ рдЬреЛ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рд╡рд╣ "npm i" рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдиреЛрдб.рдЬреЗрдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИ рдФрд░ isProd.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛ рд╣реИред

рдПрд╕рдПрд╕рдПрд▓ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛


рдЬрдм рдЖрдк рдПрдХ рдбреЛрдореЗрди рдЦрд░реАрджрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЖрдИрдкреА рдХреНрд▓рд╛рдЙрдб рдкрд░ рдмрд╛рдВрдз рджреЗрддреЗ рд╣реИрдВ , рддреЛ REG.RU рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг, рдЖрдк рдЙрд╕ рд╕рд╛рдЗрдЯ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрд╕рдПрд╕рдПрд▓ рд╣реИ рдЬреЛ рд╕рд╛рдЗрдЯ рдкрд░ https рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

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

Ssl рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, .well- рдЬреНрдЮрд╛рдд рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ, рдФрд░ рдЗрд╕рдореЗрдВ acme- рдЪреБрдиреМрддреАред рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ /opt/myapp/ssl/.well-ogn/acme-challenge

Nginx рдХреЗ рдмрд┐рдирд╛ node.js рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдПрд╕рдПрд╕рдПрд▓ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП , рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ ред рдмрджрд▓реЗ рдореЗрдВ, рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

 sudo apt-get update sudo apt-get install software-properties-common sudo add-apt-repository universe sudo add-apt-repository ppa:certbot/certbot sudo apt-get update sudo apt-get install certbot sudo certbot certonly 

рд╣рдо рджреВрд╕рд░реА рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ /opt/myapp/ssl/.well-ogn/acme-challenge рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рд░рдЦреЗрдЧрд╛, рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рд▓рд┐рдХ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╣рдо рдЕрдиреБрд░реЛрдз рдкрд░ рд╣рдорд╛рд░реЗ рдбреЛрдореЗрди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: "example.com" рдФрд░ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ ssl рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдорд╛рд░реНрдЧ (рд╕рд░реНрд╡рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдмреЙрдЯ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рджреЗ рджреЗрдЧрд╛) "/ opt / myapp / ssl"ред

90 рджрд┐рдиреЛрдВ рдХреЗ рднреАрддрд░ рдЗрд╕рдХреА рд╕рдорд╛рдкреНрддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ рдирд╡реАрдиреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЙрдЯ рд╕реНрд╡рдпрдВ рдХреНрд░реЛрди рдХрд╛рд░реНрдп рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдЧрд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЗрддрдирд╛ рд╕рдордп рд▓рдЧреЗрдЧрд╛, рд╕реБрдмрд╣ 4 рдмрдЬреЗ рддрдХ рдореИрдВ рдХреБрдЫ рдпрд╛рдж рдХрд░ рд╕рдХрддрд╛ рдерд╛:

рд░реЛрдЪрдХ рд╣реИрдмреНрд░реИрдЪрд┐рдпрди рдФрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреА рд░рд╛рдп рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рдХреИрдирд╡рд╛рд╕ рдкрд░ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХреА рдпрд╛ рдХреБрдЫ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкрдврд╝рд╛ред рдЖрдкрдХреЗ рд╡рд┐рдХрд╛рд╕ рдЪрдХреНрд░ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ? рдХреНрдпрд╛ рдХреЛрдИ рдРрд╕рд╛ рдмрд┐рдВрджреБ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рдпрд╛ рдЧрд▓рдд рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ?

Source: https://habr.com/ru/post/hi439952/


All Articles