рд╕реАрдЖрдп/рд╕реАрдбреА рд╕рд╛рдЦрд│реА рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрдгрд┐ рдбреЙрдХрд░рд╕рд╣ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд╛рд░реНрдп

рдореА рдорд╛рдЭреА рдкрд╣рд┐рд▓реА рд╡реЗрдмрд╕рд╛рдЗрдЯ 90 рдЪреНрдпрд╛ рджрд╢рдХрд╛рдЪреНрдпрд╛ рдЙрддреНрддрд░рд╛рд░реНрдзрд╛рдд рд▓рд┐рд╣рд┐рд▓реА. рддреНрдпрд╛рд╡реЗрд│реЗрд╕ рддреНрдпрд╛рдВрдирд╛ рдХрд╛рд░реНрдпрд░рдд рдХреНрд░рдорд╛рдиреЗ рдареЗрд╡рдгреЗ рдЦреВрдк рд╕реЛрдкреЗ рд╣реЛрддреЗ. рдХрд╛рд╣реА рд╕рд╛рдорд╛рдпрд┐рдХ рд╣реЛрд╕реНрдЯрд┐рдВрдЧрд╡рд░ Apache рд╕рд░реНрд╡реНрд╣рд░ рд╣реЛрддрд╛, рддреБрдореНрд╣реА FTP рджреНрд╡рд╛рд░реЗ рдпрд╛ рд╕рд░реНрд╡реНрд╣рд░рдордзреНрдпреЗ рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА рд▓рд┐рд╣реВрди рд▓реЙрдЧ рдЗрди рдХрд░реВ рд╢рдХрддрд╛ ftp://ftp.example.com. рдордЧ рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреЗ рдирд╛рд╡ рдЖрдгрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдЯрд╛рдХрд╛рд╡рд╛ рд▓рд╛рдЧреЗрд▓ рдЖрдгрд┐ рдлрд╛рдЗрд▓реНрд╕ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдЕрдкрд▓реЛрдб рдХрд░рд╛рд╡реНрдпрд╛ рд▓рд╛рдЧрддреАрд▓. рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╡реЗрд│рд╛ рд╣реЛрддреНрдпрд╛, рддреЗрд╡реНрд╣рд╛ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЖрддрд╛рдкреЗрдХреНрд╖рд╛ рд╕реЛрдкреЗ рд╣реЛрддреЗ.

рд╕реАрдЖрдп/рд╕реАрдбреА рд╕рд╛рдЦрд│реА рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрдгрд┐ рдбреЙрдХрд░рд╕рд╣ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд╛рд░реНрдп

рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рджреЛрди рджрд╢рдХрд╛рдВрдд рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЦреВрдк рдмрджрд▓рд▓реЗ рдЖрд╣реЗ. рд╡реЗрдмрд╕рд╛рдЗрдЯреНрд╕ рдЕрдзрд┐рдХ рдХреНрд▓рд┐рд╖реНрдЯ рдЭрд╛рд▓реНрдпрд╛ рдЖрд╣реЗрдд; рдЙрддреНрдкрд╛рджрдирд╛рдд рд╕реЛрдбрдгреНрдпрд╛рдкреВрд░реНрд╡реА рддреНрдпрд╛ рдПрдХрддреНрд░ рдХреЗрд▓реНрдпрд╛ рдкрд╛рд╣рд┐рдЬреЗрдд. рдПрдХрдЪ рд╕рд░реНрд╡реНрд╣рд░ рд▓реЛрдб рдмреЕрд▓рдиреНрд╕рд░реНрд╕рдЪреНрдпрд╛ рдорд╛рдЧреЗ рдЪрд╛рд▓рдгрд╛рд░реЗ рдЕрдиреЗрдХ рд╕рд░реНрд╡реНрд╣рд░ рдмрдирд▓реЗ рдЖрдгрд┐ рдЖрд╡реГрддреНрддреА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реАрдЪрд╛ рд╡рд╛рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдЭрд╛рд▓рд╛.

рдорд╛рдЭреНрдпрд╛ рд╡реИрдпрдХреНрддрд┐рдХ рдкреНрд░рдХрд▓реНрдкрд╛рд╕рд╛рдареА рдорд╛рдЭреНрдпрд╛рдХрдбреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╣реЛрддреЗ. рдЖрдгрд┐ рдорд▓рд╛ рдорд╛рд╣рд┐рдд рд╣реЛрддреЗ рдХреА рдорд▓рд╛ рдлрдХреНрдд рдПрдХ рдХреГрддреА рдХрд░реВрди рд╕рд╛рдЗрдЯрд▓рд╛ рдЙрддреНрдкрд╛рджрдирд╛рдд рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ: рд╢рд╛рдЦреЗрдд рдХреЛрдб рд▓рд┐рд╣рд┐рдгреЗ master GitHub рд╡рд░. рдпрд╛ рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдорд▓рд╛ рдорд╛рд╣рд┐рдд рд╣реЛрддреЗ рдХреА рдорд╛рдЭреНрдпрд╛ рдЫреЛрдЯреНрдпрд╛ рд╡реЗрдм рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдЪреНрдпрд╛ рдСрдкрд░реЗрд╢рдирдЪреА рдЦрд╛рддреНрд░реА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдорд▓рд╛ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдЪреЗ рдПрдХ рдореЛрдареЗ рдХреНрд▓рд╕реНрдЯрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛рдпрдЪреЗ рдирд╡реНрд╣рддреЗ рдХрд┐рдВрд╡рд╛ рдбреЙрдХрд░ рд╕реНрд╡реЙрд░реНрдо рддрдВрддреНрд░рдЬреНрдЮрд╛рди рд╡рд╛рдкрд░рд╛рдпрдЪреЗ рдирд╡реНрд╣рддреЗ рдХрд┐рдВрд╡рд╛ рдкреЙрдб, рдПрдЬрдВрдЯ рдЖрдгрд┐ рдЗрддрд░ рд╕рд░реНрд╡ рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рд╕рд░реНрд╡реНрд╣рд░рдЪрд╛ рддрд╛рдлрд╛ рд░рд╛рдЦрд╛рдпрдЪрд╛ рдирд╡реНрд╣рддрд╛. рдЧреБрдВрддрд╛рдЧреБрдВрдд рдХрд╛рдо рд╢рдХреНрдп рддрд┐рддрдХреЗ рд╕реЛрдкреЗ рдХрд░рдгреНрдпрд╛рдЪреЗ рдЙрджреНрджрд┐рд╖реНрдЯ рд╕рд╛рдзреНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдорд▓рд╛ CI/CD рд╢реА рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдгреЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ.

рдЬрд░ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХ рдЫреЛрдЯрд╛ рдкреНрд░рдХрд▓реНрдк рдЕрд╕реЗрд▓ (рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдПрдХ Node.js рдкреНрд░рдХрд▓реНрдк) рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдЪреА рддреИрдирд╛рддреА рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд╢реА рдХрд░рд╛рдпрдЪреА рд╣реЗ рдЬрд╛рдгреВрди рдШреНрдпрд╛рдпрдЪреЗ рдЕрд╕реЗрд▓, рддрд░ рднрд╛рдВрдбрд╛рд░рд╛рдд рдЬреЗ рд╕рд╛рдард╡рд▓реЗ рдЬрд╛рддреЗ рддреЗ рдЙрддреНрдкрд╛рджрдирд╛рдд рдХрд╛рдо рдХрд░рдгрд╛рд▒реНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдВрд╢реА рддрдВрддреЛрддрдВрдд рдЬреБрд│рддреЗ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░реВрди рдШреНрдпрд╛, рддрд░ рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдпрд╛ рд▓реЗрдЦрд╛рдд рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕реЗрд▓ рдЕрд╕реЗ рд╡рд╛рдЯрддреЗ.

рдкреВрд░реНрд╡рддрдпрд╛рд░реА

рдпрд╛ рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рд╡рд╛рдЪрдХрд╛рд▓рд╛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЖрдгрд┐ рдмреЕрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рдореВрд▓рднреВрдд рдорд╛рд╣рд┐рддреА рдЕрд╕рдгреЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрд╣реЗ. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рддреНрдпрд╛рд▓рд╛ рдЦрд╛рддреНрдпрд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓ рдЯреНрд░реЗрд╡рд┐рд╕ рд╕реАрдЖрдп ╨╕ рдбреЙрдХрд░ рд╣рдм.

рдЙрджреНрджреАрд╖реНрдЯреЗ

рдореА рдЕрд╕реЗ рдореНрд╣рдгрдгрд╛рд░ рдирд╛рд╣реА рдХреА рдпрд╛ рд▓реЗрдЦрд╛рд▓рд╛ рдмрд┐рдирд╢рд░реНрдд "рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓" рдореНрд╣рдЯрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рд╣рд╛ рдПрдХ рдЕрдзрд┐рдХ рджрд╕реНрддрдРрд╡рдЬ рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдореА рдЬреЗ рд╢рд┐рдХрд▓реЛ рддреНрдпрд╛рдмрджреНрджрд▓ рдмреЛрд▓рддреЛ рдЖрдгрд┐ рдПрдХрд╛ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдкрд╛рд╕рдордзреНрдпреЗ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХреЛрдбрдЪреА рдЪрд╛рдЪрдгреА рдЖрдгрд┐ рдЙрдкрдпреЛрдЬрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА рдЕрдиреБрдХреВрд▓ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЛ.

рдорд╛рдЭреНрдпрд╛ рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣рд╛рдЪрд╛ рд╢реЗрд╡рдЯ рдЕрд╕рд╛ рдЭрд╛рд▓рд╛.

рд╡рдЧрд│рддрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рднрд╛рдВрдбрд╛рд░ рд╢рд╛рдЦреЗрдд рдкреЛрд╕реНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХреЛрдбрд╕рд╛рдареА master, рдЦрд╛рд▓реАрд▓ рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд:

  • рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп рд╡рд░ рдкреНрд░рдХрд▓реНрдк рдмрд╛рдВрдзрдгреЗ рд╕реБрд░реВ рд╣реЛрддреЗ.
  • рд╕рд░реНрд╡ рдпреБрдирд┐рдЯ, рдЗрдВрдЯрд┐рдЧреНрд░реЗрд╢рди рдЖрдгрд┐ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдЪрд╛рдЪрдгреНрдпрд╛ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд.

рдлрдХреНрдд рдордзреНрдпреЗ рдореЛрдбрдгрд╛рд▒реНрдпрд╛ рдХреЛрдбрд╕рд╛рдареА master, рдЦрд╛рд▓реАрд▓ рдХреЗрд▓реЗ рдЬрд╛рддреЗ:

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

рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдбреЙрдХрд░, рдкреНрд░рддрд┐рдорд╛ рдЖрдгрд┐ рдХрдВрдЯреЗрдирд░рдмрджреНрджрд▓ рдХрд╛рд╣реАрд╣реА рдорд╛рд╣рд┐рдд рдирд╕реЗрд▓ рддрд░ рдХрд╛рд│рдЬреА рдХрд░реВ рдирдХрд╛. рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдмрджреНрджрд▓ рд╕рд░реНрд╡ рд╕рд╛рдВрдЧреЗрди.

CI/CD рдореНрд╣рдгрдЬреЗ рдХрд╛рдп?

CI/CD рдЪрд╛ рд╕рдВрдХреНрд╖реЗрдк рдореНрд╣рдгрдЬреЗ тАЬрд╕рддрдд рдПрдХреАрдХрд░рдг/рд╕рддрдд рддреИрдирд╛рддреАтАЭ.

тЦНрд╕рддрдд рдПрдХреАрдХрд░рдг

рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдг рд╣реА рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рд╡рд┐рдХрд╛рд╕рдХ рдкреНрд░рдХрд▓реНрдкрд╛рдЪреНрдпрд╛ рдореБрдЦреНрдп рд╕реНрддреНрд░реЛрдд рдХреЛрдб рд░реЗрдкреЙрдЬрд┐рдЯрд░реА (рд╕рд╛рдорд╛рдиреНрдпрдд: рдПрдХ рд╢рд╛рдЦрд╛) рд╕рд╛рдареА рдХрдорд┐рдЯ рдХрд░рддрд╛рдд master). рддреНрдпрд╛рдЪ рд╡реЗрд│реА, рдХреЛрдбрдЪреА рдЧреБрдгрд╡рддреНрддрд╛ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдЪрд╛рдЪрдгреАрджреНрд╡рд╛рд░реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХреЗрд▓реА рдЬрд╛рддреЗ.

тЦНрд╕рддрдд рддреИрдирд╛рддреА

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

рдкреНрд░рд╛рд░рдВрдн рдХрд░рдгреЗ

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

рдорд╛рдЭреНрдпрд╛ рдмрд╛рдмрддреАрдд, ре▓рдкреНрд▓рд┐рдХреЗрд╢рди рд╣рд╛ рдПрдХ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╕рд░реНрд╡реНрд╣рд░ рдЖрд╣реЗ рдЬреЛ Node.js рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рдЪрд╛рд▓рддреЛ, рд╕рд┐рдВрдЧрд▓-рдкреЗрдЬ рд░рд┐ре▓рдХреНрдЯ ре▓рдкреНрд▓рд┐рдХреЗрд╢рдирд▓рд╛ рд╕реЗрд╡рд╛ рджреЗрддреЛ рдЖрдгрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рд░реНрд╡реНрд╣рд░-рд╕рд╛рдЗрдб API рд▓рд╛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддреЛ. рд╣реЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЬреНрдпрд╛ рд░рдгрдиреАрддреАрдордзреНрдпреЗ рдЖрдврд│реВ рд╢рдХрддреЗ рддреНрдпрд╛рдЪреЗ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рджрд┐рд▓реЗ рдкреВрд░реНрдг рд╕реНрдЯреЕрдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ.

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

рдЧреЛрджреА рдХрд╛рдордЧрд╛рд░

рдбреЙрдХрд░ рд╣реЗ рдПрдХ рд╕рд╛рдзрди рдЖрд╣реЗ рдЬреЗ рдХрдВрдЯреЗрдирд░рд╛рдпрдЭреЗрд╢рди рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдореБрд│реЗ, ре▓рдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рдЪреЗ рд╡рд┐рддрд░рдг, рдЙрдкрдпреЛрдЬрд┐рдд рдЖрдгрд┐ рдПрдХрд╛рдЪ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рд╕рд╣рдЬрддреЗрдиреЗ рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ, рдЬрд░реА рдбреЙрдХрд░ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо рд╕реНрд╡рддрдГ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рдЪрд╛рд▓рдд рдЕрд╕рд▓рд╛ рддрд░реАрд╣реА. рдкреНрд░рдердо, рдорд▓рд╛ рдбреЙрдХрд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЯреВрд▓реНрд╕ (рд╕реАрдПрд▓рдЖрдп) рд╡рд░ рд╣рд╛рдд рдорд┐рд│рд╡рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╕реВрдЪрдирд╛ рдбреЙрдХрд░ рдЗрдиреНрд╕реНрдЯреЙрд▓реЗрд╢рди рдЧрд╛рдЗрдбрд▓рд╛ рдЕрдЧрджреА рд╕реНрдкрд╖реНрдЯ рдЖрдгрд┐ рд╕рдордЬрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдореНрд╣рдЯрд▓реЗ рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рддреНрдпрд╛рддреВрди рддреБрдореНрд╣реА рд╣реЗ рд╢рд┐рдХреВ рд╢рдХрддрд╛ рдХреА рдкреНрд░рдердо рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдЪрд░рдг рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдбреЙрдХрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ (рдореЕрдХ рдХрд┐рдВрд╡рд╛ рд╡рд┐рдВрдбреЛрдЬрд╕рд╛рдареА).

рдбреЙрдХрд░ рд╣рдм рд╣реЗ рдЕрдВрджрд╛рдЬреЗ рд╕рдорд╛рди рдЧреЛрд╖реНрдЯ рдЖрд╣реЗ GitHub git рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдЬ рдХрд┐рдВрд╡рд╛ рд░реЗрдЬрд┐рд╕реНрдЯреНрд░реАрд╕рд╛рдареА npm JavaScript рдкреЕрдХреЗрдЬреЗрд╕рд╕рд╛рдареА. рд╣реЗ рдбреЙрдХрд░ рдкреНрд░рддрд┐рдорд╛рдВрд╕рд╛рдареА рдСрдирд▓рд╛рдЗрди рднрд╛рдВрдбрд╛рд░ рдЖрд╣реЗ. рдбреЙрдХрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рдпрд╛рд▓рд╛ рдЬреЛрдбрддреЛ.

рддрд░, рдбреЙрдХрд░рд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рджреЛрди рдЧреЛрд╖реНрдЯреА рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ:

рдпрд╛рдирдВрддрд░, рдбреЙрдХрд░ рдЖрд╡реГрддреНрддреА рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдЦрд╛рд▓реАрд▓ рдХрдорд╛рдВрдб рдЪрд╛рд▓рд╡реВрди рддреБрдореНрд╣реА рдбреЙрдХрд░ рд╕реАрдПрд▓рдЖрдп рдХрд╛рд░реНрдп рдХрд░рдд рдЖрд╣реЗ рдХрд╛ рддреЗ рддрдкрд╛рд╕реВ рд╢рдХрддрд╛:

docker -v

рдкреБрдвреЗ, рд╡рд┐рдЪрд╛рд░рд▓реНрдпрд╛рд╡рд░ рддреБрдордЪреЗ рд╡рд╛рдкрд░рдХрд░реНрддрд╛рдирд╛рд╡ рдЖрдгрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдЯрд╛рдХреВрди рдбреЙрдХрд░ рд╣рдмрдордзреНрдпреЗ рд▓реЙрдЧ рдЗрди рдХрд░рд╛:

docker login

рдбреЙрдХрд░ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддрд┐рдорд╛ рдЖрдгрд┐ рдХрдВрдЯреЗрдирд░рдЪреНрдпрд╛ рд╕рдВрдХрд▓реНрдкрдирд╛ рд╕рдордЬреВрди рдШреЗрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

тЦН рдкреНрд░рддрд┐рдорд╛

рдкреНрд░рддрд┐рдорд╛ рд╣реА рдмреНрд▓реВрдкреНрд░рд┐рдВрдЯрд╕рд╛рд░рдЦреА рдЕрд╕рддреЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдХрдВрдЯреЗрдирд░ рдПрдХрддреНрд░ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╕реВрдЪрдирд╛ рдЕрд╕рддрд╛рдд. рд╣рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреНрдпрд╛ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдЖрдгрд┐ рд╕реЗрдЯрд┐рдВрдЧреНрдЬрдЪрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕реНрдиреЕрдкрд╢реЙрдЯ рдЖрд╣реЗ. рд╡рд┐рдХрд╕рдХ рд╕рд╣рдЬрдкрдгреЗ рдкреНрд░рддрд┐рдорд╛ рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд░реВ рд╢рдХрддрд╛рдд.

# ╨Т╤Л╨▓╨╛╨┤ ╤Б╨▓╨╡╨┤╨╡╨╜╨╕╨╣ ╨╛╨▒╨╛ ╨▓╤Б╨╡╤Е ╨╛╨▒╤А╨░╨╖╨░╤Е
docker images

рд╣реА рдЖрдЬреНрдЮрд╛ рдЦрд╛рд▓реАрд▓ рд╢реАрд░реНрд╖рд▓реЗрдЦрд╛рд╕рд╣ рдЯреЗрдмрд▓ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрд▓:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

рдкреБрдвреЗ рдЖрдкрдг рддреНрдпрд╛рдЪ рдлреЙрд░рдореЕрдЯрдордзреАрд▓ рдХрдорд╛рдВрдбреНрд╕рдЪреА рдХрд╛рд╣реА рдЙрджрд╛рд╣рд░рдгреЗ рдкрд╛рд╣реВ - рдкреНрд░рдердо рдЯрд┐рдкреНрдкрдгреАрд╕рд╣ рдХрдорд╛рдВрдб рдЕрд╕рддреЗ рдЖрдгрд┐ рдирдВрддрд░ рддреЗ рдХрд╛рдп рдЖрдЙрдЯрдкреБрдЯ рдХрд░реВ рд╢рдХрддреЗ рдпрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг.

тЦНрдХрдВрдЯреЗрдирд░

рдХрдВрдЯреЗрдирд░ рдПрдХ рдПрдХреНрдЭрд┐рдХреНрдпреБрдЯреЗрдмрд▓ рдкреЕрдХреЗрдЬ рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд╛рд▓рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рдЧреЛрд╖реНрдЯреА рдЕрд╕рддрд╛рдд. рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХрд░реВрди рдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рд╕рд╣ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдиреЗрд╣рдореА рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░реЗрд▓: рд╡реЗрдЧрд│реНрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рдЖрдгрд┐ рд╕рдорд╛рди рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд. рдореБрджреНрджрд╛ рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рд╕рдорд╛рди рдкреНрд░рддрд┐рдореЗрдЪреА рдЙрджрд╛рд╣рд░рдгреЗ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рд▓реЙрдиреНрдЪ рдХреЗрд▓реА рдЬрд╛рддрд╛рдд.

# ╨Я╨╡╤А╨╡╤З╨╕╤Б╨╗╨╡╨╜╨╕╨╡ ╨▓╤Б╨╡╤Е ╨║╨╛╨╜╤В╨╡╨╣╨╜╨╡╤А╨╛╨▓
docker ps -a
CONTAINER ID     IMAGE     COMMAND     CREATED     STATUS     PORTS     NAMES
---

тЦНрдЯреЕрдЧ

рдЯреЕрдЧ рд╣реЗ рдкреНрд░рддрд┐рдореЗрдЪреНрдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡реГрддреНрддреАрдЪреЗ рд╕рдВрдХреЗрдд рдЖрд╣реЗ.

тЦНрдбреЙрдХрд░ рдХрдорд╛рдВрдбрдЪрд╛ рдПрдХ рджреНрд░реБрдд рд╕рдВрджрд░реНрдн

рдпреЗрдереЗ рдХрд╛рд╣реА рд╕рд╛рдорд╛рдиреНрдпрддрдГ рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд▒реНрдпрд╛ рдбреЙрдХрд░ рдХрдорд╛рдВрдбрдЪреЗ рд╡рд┐рд╣рдВрдЧрд╛рд╡рд▓реЛрдХрди рдЖрд╣реЗ.

рд╕рдВрдШ

рд╕рдВрджрд░реНрдн

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

рдбреЙрдХрд░ рдмрд┐рд▓реНрдб

рдкреНрд░рддрд┐рдорд╛

рдбреЙрдХрд░рдлрд╛рдЗрд▓рд╡рд░реВрди рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░рдгреЗ

рдбреЙрдХрд░ рдЯреЕрдЧ

рдкреНрд░рддрд┐рдорд╛

рдкреНрд░рддрд┐рдорд╛ рдЯреЕрдЧрд┐рдВрдЧ

рдбреЙрдХрд░ рдкреНрд░рддрд┐рдорд╛

рдкреНрд░рддрд┐рдорд╛

рд╕реВрдЪреА рдкреНрд░рддрд┐рдорд╛

рдбреЙрдХрд░ рд░рди

рдХрдВрдЯреЗрдирд░

рдкреНрд░рддрд┐рдореЗрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдХрдВрдЯреЗрдирд░ рдЪрд╛рд▓рд╡рдгреЗ

рдбреЙрдХрд░ рдкреБрд╢

рдкреНрд░рддрд┐рдорд╛

рд░реЗрдЬрд┐рд╕реНрдЯреНрд░реАрдордзреНрдпреЗ рдкреНрд░рддрд┐рдорд╛ рдЕрдкрд▓реЛрдб рдХрд░рдд рдЖрд╣реЗ

рдбреЙрдХрд░ рдкреБрд▓

рдкреНрд░рддрд┐рдорд╛

рд░реЗрдЬрд┐рд╕реНрдЯреНрд░реАрдордзреВрди рдкреНрд░рддрд┐рдорд╛ рд▓реЛрдб рдХрд░рдд рдЖрд╣реЗ

рдбреЙрдХрд░ рдкреАрдПрд╕

рдХрдВрдЯреЗрдирд░

рдХрдВрдЯреЗрдирд░ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдгреЗ

рдбреЙрдХрд░ рдкреНрд░рдгрд╛рд▓реА рдЫрд╛рдЯрдгреА

рдкреНрд░рддрд┐рдорд╛/рдХрдВрдЯреЗрдирд░

рди рд╡рд╛рдкрд░рд▓реЗрд▓реЗ рдХрдВрдЯреЗрдирд░ рдЖрдгрд┐ рдкреНрд░рддрд┐рдорд╛ рдХрд╛рдвреВрди рдЯрд╛рдХрдгреЗ

тЦНрдбреЙрдХрд░рдлрд╛рдЗрд▓

рдорд▓рд╛ рд╕реНрдерд╛рдирд┐рдХ рдкрд╛рддрд│реАрд╡рд░ рдЙрддреНрдкрд╛рджрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╕рд╛ рдЪрд╛рд▓рд╡рд╛рдпрдЪрд╛ рд╣реЗ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ. рдорд╛рдЭреНрдпрд╛рдХрдбреЗ рд╡реЗрдмрдкреЕрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд░реЗрдбреАрдореЗрдб рд░рд┐ре▓рдХреНрдЯ ре▓рдкреНрд▓рд┐рдХреЗрд╢рди рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗрд▓реЗ рдЖрд╣реЗ. рдкреБрдвреЗ, рдорд╛рдЭреНрдпрд╛рдХрдбреЗ рдПрдХ рдХрдорд╛рдВрдб рдЖрд╣реЗ рдЬреА рдкреЛрд░реНрдЯрд╡рд░ Node.js рдЖрдзрд╛рд░рд┐рдд рд╕рд░реНрд╡реНрд╣рд░ рд╕реБрд░реВ рдХрд░рддреЗ 5000. рд╣реЗ рдЕрд╕реЗ рджрд┐рд╕рддреЗ:

npm i         # ╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨░ ╨╖╨░╨▓╨╕╤Б╨╕╨╝╨╛╤Б╤В╨╡╨╣
npm run build # ╤Б╨▒╨╛╤А╨║╨░ React-╨┐╤А╨╕╨╗╨╛╨╢╨╡╨╜╨╕╤П
npm run start # ╨╖╨░╨┐╤Г╤Б╨║ Node-╤Б╨╡╤А╨▓╨╡╤А╨░

рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛рд╡реЗ рдХреА рдорд╛рдЭреНрдпрд╛рдХрдбреЗ рдпрд╛ рд╕рд╛рдордЧреНрд░реАрд╕рд╛рдареА рдЙрджрд╛рд╣рд░рдг рдЕрд░реНрдЬ рдирд╛рд╣реА. рдкрд░рдВрддреБ рдпреЗрдереЗ, рдкреНрд░рдпреЛрдЧрд╛рдВрд╕рд╛рдареА, рдХреЛрдгрддрд╛рд╣реА рд╕рд╛рдзрд╛ рдиреЛрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд░реЗрд▓.

рдХрдВрдЯреЗрдирд░ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдбреЙрдХрд░рд▓рд╛ рд╕реВрдЪрдирд╛ рджреНрдпрд╛рд╡реНрдпрд╛ рд▓рд╛рдЧрддреАрд▓. рдирд╛рд╡рд╛рдЪреНрдпрд╛ рдлрд╛рдИрд▓рджреНрд╡рд╛рд░реЗ рд╣реЗ рдХреЗрд▓реЗ рдЬрд╛рддреЗ Dockerfile, рдкреНрд░рдХрд▓реНрдкрд╛рдЪреНрдпрд╛ рдореВрд│ рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдд рд╕реНрдерд┐рдд рдЖрд╣реЗ. рд╣реА рдлрд╛рдЗрд▓, рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛, рдЕрдЧрджреА рдЕрдирд╛рдХрд▓рдиреАрдп рджрд┐рд╕рддреЗ.

рдкрд░рдВрддреБ рддреНрдпрд╛рдд рдЬреЗ рдЖрд╣реЗ рддреЗ рдХреЗрд╡рд│ рд╡рд┐рд╢реЗрд╖ рдЖрджреЗрд╢рд╛рдВрд╕рд╣, рдХрд╛рд░реНрдп рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдХрд╛рд╣реАрддрд░реА рд╡рд░реНрдгрди рдХрд░рддреЗ. рдпрд╛рдкреИрдХреА рдХрд╛рд╣реА рдЖрдЬреНрдЮрд╛ рдпреЗрдереЗ рдЖрд╣реЗрдд:

  • рдкреНрд░реЗрд╖рдХ тАФ рд╣реА рдХрдорд╛рдВрдб рдлрд╛рдЗрд▓ рд╕реБрд░реВ рдХрд░рддреЗ. рд╣реЗ рдмреЗрд╕ рдЗрдореЗрдЬ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рдЬреНрдпрд╛рд╡рд░ рдХрдВрдЯреЗрдирд░ рдмрд╛рдВрдзрд▓рд╛ рдЖрд╣реЗ.
  • рдХреЙрдкреА рдХрд░рд╛ тАФ рд╕реНрдерд╛рдирд┐рдХ рд╕реНрддреНрд░реЛрддрд╛рдХрдбреВрди рдХрдВрдЯреЗрдирд░рдордзреНрдпреЗ рдлрд╛рдЗрд▓реНрд╕ рдХреЙрдкреА рдХрд░рдгреЗ.
  • WORKDIR тАФ рдЦрд╛рд▓реАрд▓ рдЖрджреЗрд╢рд╛рдВрд╕рд╛рдареА рдХрд╛рд░реНрдпрд░рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗрдЯ рдХрд░рдгреЗ.
  • рдзрд╛рд╡реВ - рдЖрджреЗрд╢ рдЪрд╛рд▓рд╡рд╛.
  • рдЙрдШрдб рдХрд░рд╛ - рдкреЛрд░реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрдЬ.
  • ENTRYPOINT - рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдЖрджреЗрд╢рд╛рдЪреЗ рд╕рдВрдХреЗрдд.

Dockerfile рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА рджрд┐рд╕реВ рд╢рдХрддреЗ:

# ╨Ч╨░╨│╤А╤Г╨╖╨╕╤В╤М ╨▒╨░╨╖╨╛╨▓╤Л╨╣ ╨╛╨▒╤А╨░╨╖
FROM node:12-alpine

# ╨б╨║╨╛╨┐╨╕╤А╨╛╨▓╨░╤В╤М ╤Д╨░╨╣╨╗╤Л ╨╕╨╖ ╤В╨╡╨║╤Г╤Й╨╡╨╣ ╨┤╨╕╤А╨╡╨║╤В╨╛╤А╨╕╨╕ ╨▓ ╨┤╨╕╤А╨╡╨║╤В╨╛╤А╨╕╤О app/
COPY . app/

# ╨Ш╤Б╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╤В╤М app/ ╨▓ ╤А╨╛╨╗╨╕ ╤А╨░╨▒╨╛╤З╨╡╨╣ ╨┤╨╕╤А╨╡╨║╤В╨╛╤А╨╕╨╕
WORKDIR app/

# ╨г╤Б╤В╨░╨╜╨╛╨▓╨╕╤В╤М ╨╖╨░╨▓╨╕╤Б╨╕╨╝╨╛╤Б╤В╨╕ (╨║╨╛╨╝╨░╨╜╨┤╨░ npm ci ╨┐╨╛╤Е╨╛╨╢╨░ npm i, ╨╜╨╛ ╨╕╤Б╨┐╨╛╨╗╤М╨╖╤Г╨╡╤В╤Б╤П ╨┤╨╗╤П ╨░╨▓╤В╨╛╨╝╨░╤В╨╕╨╖╨╕╤А╨╛╨▓╨░╨╜╨╜╤Л╤Е ╤Б╨▒╨╛╤А╨╛╨║)
RUN npm ci --only-production

# ╨б╨╛╨▒╤А╨░╤В╤М ╨║╨╗╨╕╨╡╨╜╤В╤Б╨║╨╛╨╡ React-╨┐╤А╨╕╨╗╨╛╨╢╨╡╨╜╨╕╨╡ ╨┤╨╗╤П ╨┐╤А╨╛╨┤╨░╨║╤И╨╜╨░
RUN npm run build

# ╨Я╤А╨╛╤Б╨╗╤Г╤И╨╕╨▓╨░╤В╤М ╤Г╨║╨░╨╖╨░╨╜╨╜╤Л╨╣ ╨┐╨╛╤А╤В
EXPOSE 5000

# ╨Ч╨░╨┐╤Г╤Б╤В╨╕╤В╤М Node-╤Б╨╡╤А╨▓╨╡╤А
ENTRYPOINT npm run start

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

тЦН рдХрдВрдЯреЗрдирд░ рдмрд╛рдВрдзрдгреЗ, рдЯреЕрдЧ рдХрд░рдгреЗ рдЖрдгрд┐ рдЪрд╛рд▓рд╡рдгреЗ

рд╕реНрдерд╛рдирд┐рдХ рдЕрд╕реЗрдВрдмреНрд▓реА рдЖрдгрд┐ рдХрдВрдЯреЗрдирд░рдЪреЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЖрд╣реЗ Dockerfile, рдХрд╛рд░реНрдпреЗ рдЕрдЧрджреА рд╕реЛрдкреА рдЖрд╣реЗрдд. рддреБрдореНрд╣реА рдкреНрд░рддрд┐рдорд╛ рдбреЙрдХрд░ рд╣рдмрд╡рд░ рдврдХрд▓рдгреНрдпрд╛рдкреВрд░реНрд╡реА, рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдЪреА рд╕реНрдерд╛рдирд┐рдХ рдкрд╛рддрд│реАрд╡рд░ рдЪрд╛рдЪрдгреА рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

тЦНрд╡рд┐рдзрд╛рдирд╕рднрд╛

рдкреНрд░рдердо рдЖрдкрдг рдЧреЛрд│рд╛ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдкреНрд░рддрд┐рдорд╛, рдирд╛рд╡ рдЖрдгрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХрд░рд┐рддреНрдпрд╛, рдЯреЕрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреЗ (рдЬрд░ рдЯреЕрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓рд╛ рдирд╕реЗрд▓ рддрд░, рд╕рд┐рд╕реНрдЯрдо рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдкреНрд░рддрд┐рдореЗрд▓рд╛ рдПрдХ рдЯреЕрдЧ рдирд┐рдпреБрдХреНрдд рдХрд░реЗрд▓ latest).

# ╨б╨▒╨╛╤А╨║╨░ ╨╛╨▒╤А╨░╨╖╨░
docker build -t <image>:<tag> .

рд╣реА рдЖрдЬреНрдЮрд╛ рдЪрд╛рд▓рд╡рд▓реНрдпрд╛рдирдВрддрд░, рддреБрдореНрд╣реА рдбреЙрдХрд░ рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░рддрд╛рдирд╛ рдкрд╛рд╣реВ рд╢рдХрддрд╛.

Sending build context to Docker daemon   2.88MB
Step 1/9 : FROM node:12-alpine
 ---> ...╨▓╤Л╨┐╨╛╨╗╨╜╨╡╨╜╨╕╨╡ ╤Н╤В╨░╨┐╨╛╨▓ ╤Б╨▒╨╛╤А╨║╨╕...
Successfully built 123456789123
Successfully tagged <image>:<tag>

рдмрд┐рд▓реНрдбрд▓рд╛ рдХрд╛рд╣реА рдорд┐рдирд┐рдЯреЗ рд▓рд╛рдЧреВ рд╢рдХрддрд╛рдд - рд╣реЗ рд╕рд░реНрд╡ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдХрд┐рддреА рдЕрд╡рд▓рдВрдмрдирд╛рдВрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЖрд╣реЗ. рдмрд┐рд▓реНрдб рдкреВрд░реНрдг рдЭрд╛рд▓реНрдпрд╛рд╡рд░, рддреБрдореНрд╣реА рдХрдорд╛рдВрдб рдЪрд╛рд▓рд╡реВ рд╢рдХрддрд╛ docker images рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ рдирд╡реАрди рдкреНрд░рддрд┐рдореЗрдЪреЗ рд╡рд░реНрдгрди рдкрд╣рд╛.

REPOSITORY          TAG               IMAGE ID            CREATED              SIZE
<image>             latest            123456789123        About a minute ago   x.xxGB

тЦНрд▓рд╛рдБрдЪ рдХрд░рд╛

рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХреЗрд▓реА рдЖрд╣реЗ. рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рдЖрдкрдг рддреНрдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдХрдВрдЯреЗрдирд░ рдЪрд╛рд▓рд╡реВ рд╢рдХрддрд╛. рдХрд╛рд░рдг рдорд▓рд╛ рдХрдВрдЯреЗрдирд░рдордзреНрдпреЗ рдЪрд╛рд▓реВ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рд╛рдпрдЪрд╛ рдЖрд╣реЗ localhost:5000, рдореА, рдЬреЛрдбреАрдЪреНрдпрд╛ рдбрд╛рд╡реНрдпрд╛ рдмрд╛рдЬреВрд▓рд╛ 5000:5000 рдкреБрдвреАрд▓ рдХрдорд╛рдВрдбрдордзреНрдпреЗ рд╕реНрдерд╛рдкрд┐рдд 5000. рдЙрдЬрд╡реНрдпрд╛ рдмрд╛рдЬреВрд▓рд╛ рдХрдВрдЯреЗрдирд░ рдкреЛрд░реНрдЯ рдЖрд╣реЗ.

# ╨Ч╨░╨┐╤Г╤Б╨║ ╤Б ╨╕╤Б╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╨╜╨╕╨╡╨╝ ╨╗╨╛╨║╨░╨╗╤М╨╜╨╛╨│╨╛ ╨┐╨╛╤А╤В╨░ 5000 ╨╕ ╨┐╨╛╤А╤В╨░ ╨║╨╛╨╜╤В╨╡╨╣╨╜╨╡╤А╨░ 5000
docker run -p 5000:5000 <image>:<tag>

рдЖрддрд╛ рдХрдВрдЯреЗрдирд░ рддрдпрд╛рд░ рдЭрд╛рд▓рд╛ рдЖрд╣реЗ рдЖрдгрд┐ рдЪрд╛рд▓реВ рдЖрд╣реЗ, рддреБрдореНрд╣реА рдХрдорд╛рдВрдб рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛ docker ps рдпрд╛ рдХрдВрдЯреЗрдирд░рдмрджреНрджрд▓ рдорд╛рд╣рд┐рддреА рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА (рдХрд┐рдВрд╡рд╛ рддреБрдореНрд╣реА рдХрдорд╛рдВрдб рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛ docker ps -a, рдЬреЗ рд╕рд░реНрд╡ рдХрдВрдЯреЗрдирд░рдмрджреНрджрд▓ рдорд╛рд╣рд┐рддреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ, рдлрдХреНрдд рдЪрд╛рд▓рдд рдирд╕реВрди).

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                    NAMES
987654321234        <image>             "/bin/sh -c 'npm runтАж"   6 seconds ago        Up 6 seconds                0.0.0.0:5000->5000/tcp   stoic_darwin

рдЬрд░ рддреБрдореНрд╣реА рдЖрддрд╛ рдкрддреНрддреНрдпрд╛рд╡рд░ рдЧреЗрд▓рд╛рдд localhost:5000 тАФ рддреБрдореНрд╣реА рдЪрд╛рд▓реВ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреЗ рдкреГрд╖реНрда рдкрд╛рд╣реВ рд╢рдХрддрд╛ рдЬреЗ рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рдЪрд╛рд▓рдгрд╛рд▒реНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреНрдпрд╛ рдкреГрд╖реНрдард╛рд╕рд╛рд░рдЦреЗрдЪ рджрд┐рд╕рддреЗ.

тЦН рдЯреЕрдЧ рдХрд░рдгреЗ рдЖрдгрд┐ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдгреЗ

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

рдЖрддрд╛ рддреБрдореНрд╣реА рдирд╡реАрди рдирд╛рд╡рд╛рдиреЗ рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рдХрдорд╛рдВрдб рдЪрд╛рд▓рд╡реВ рд╢рдХрддрд╛ docker push рддреЗ рдбреЙрдХрд░ рд╣рдм рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рдврдХрд▓рдгреНрдпрд╛рд╕рд╛рдареА.

docker build -t <username>/<repository>:<tag> .
docker tag <username>/<repository>:<tag> <username>/<repository>:latest
docker push <username>/<repository>:<tag>

# ╨Э╨░ ╨┐╤А╨░╨║╤В╨╕╨║╨╡ ╤Н╤В╨╛ ╨╝╨╛╨╢╨╡╤В ╨▓╤Л╨│╨╗╤П╨┤╨╡╤В╤М, ╨╜╨░╨┐╤А╨╕╨╝╨╡╤А, ╤В╨░╨║:
docker build -t user/app:v1.0.0 .
docker tag user/app:v1.0.0 user/app:latest
docker push user/app:v1.0.0

рд╕рд░реНрд╡рдХрд╛рд╣реА рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░рд╛рд╣рд┐рд▓реНрдпрд╛рд╕, рдкреНрд░рддрд┐рдорд╛ рдбреЙрдХрд░ рд╣рдмрд╡рд░ рдЙрдкрд▓рдмреНрдз рдЕрд╕реЗрд▓ рдЖрдгрд┐ рддреА рд╕рд╣рдЬрдкрдгреЗ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдЕрдкрд▓реЛрдб рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ рдХрд┐рдВрд╡рд╛ рдЗрддрд░ рд╡рд┐рдХрд╕рдХрд╛рдВрдХрдбреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ.

рдкреБрдвреАрд▓ рдкрд╛рдпрд▒реНрдпрд╛

рдЖрддреНрддрд╛рдкрд░реНрдпрдВрдд рдЖрдореНрд╣реА рд╣реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗ рдХреА рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░рдЪреНрдпрд╛ рд░реВрдкрд╛рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрдерд╛рдирд┐рдХ рдкрд╛рддрд│реАрд╡рд░ рдЪрд╛рд▓рдд рдЖрд╣реЗ. рдЖрдореНрд╣реА рдХрдВрдЯреЗрдирд░ рдбреЙрдХрд░ рд╣рдмрд╡рд░ рдЕрдкрд▓реЛрдб рдХреЗрд▓рд╛ рдЖрд╣реЗ. рдпрд╛ рд╕рд░реНрд╡рд╛рдВрдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рдзреНрдпреЗрдпрд╛рдХрдбреЗ рдЦреВрдк рдЪрд╛рдВрдЧрд▓реА рдкреНрд░рдЧрддреА рдХреЗрд▓реА рдЖрд╣реЗ. рдЖрддрд╛ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЖрдгрдЦреА рджреЛрди рдкреНрд░рд╢реНрди рд╕реЛрдбрд╡рд╛рдпрдЪреЗ рдЖрд╣реЗрдд:

  • рдХреЛрдбрдЪреА рдЪрд╛рдЪрдгреА рдЖрдгрд┐ рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА CI рдЯреВрд▓ рд╕реЗрдЯ рдХрд░рдгреЗ.
  • рдкреНрд░реЙрдбрдХреНрд╢рди рд╕рд░реНрд╡реНрд╣рд░ рд╕реЗрдЯ рдХрд░рдд рдЖрд╣реЗ рдЬреЗрдгреЗрдХрд░реВрди рддреЛ рдЖрдордЪрд╛ рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реВ рд╢рдХреЗрд▓ рдЖрдгрд┐ рдЪрд╛рд▓рд╡реВ рд╢рдХреЗрд▓.

рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдЖрдореНрд╣реА рд╡рд╛рдкрд░рддреЛ рдЯреНрд░реЗрд╡рд┐рд╕ рд╕реАрдЖрдп. рд╕рд░реНрд╡реНрд╣рд░ рдореНрд╣рдгреВрди - DitigalOcean.

рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛рд╡реЗ рдХреА рдпреЗрдереЗ рдЖрдкрдг рд╕реЗрд╡рд╛рдВрдЪреЗ рджреБрд╕рд░реЗ рд╕рдВрдпреЛрдЬрди рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, Travis CI рдРрд╡рдЬреА, рддреБрдореНрд╣реА CircleCI рдХрд┐рдВрд╡рд╛ Github Actions рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛. рдЖрдгрд┐ рддреНрдпрд╛рдРрд╡рдЬреА DigitalOcean - AWS рдХрд┐рдВрд╡рд╛ Linode.

рдЖрдореНрд╣реА Travis CI рд╕рд╣ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛ рдЖрдгрд┐ рдпрд╛ рд╕реЗрд╡реЗрдордзреНрдпреЗ рдорд╛рдЭреНрдпрд╛рдХрдбреЗ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рдХрд╛рд╣реАрддрд░реА рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗрд▓реЗ рдЖрд╣реЗ. рдореНрд╣рдгреВрди, рдЖрддрд╛ рдореА рдХрд╛рдорд╛рд╕рд╛рдареА рддреЗ рдХрд╕реЗ рддрдпрд╛рд░ рдХрд░рд╛рд╡реЗ рдпрд╛рдмрджреНрджрд▓ рдереЛрдбрдХреНрдпрд╛рдд рдмреЛрд▓реЗрди.

рдЯреНрд░реЗрд╡рд┐рд╕ рд╕реАрдЖрдп

рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп рд╣реЗ рдХреЛрдбрдЪреА рдЪрд╛рдЪрдгреА рдЖрдгрд┐ рдЙрдкрдпреЛрдЬрди рдХрд░рдгреНрдпрд╛рдЪреЗ рд╕рд╛рдзрди рдЖрд╣реЗ. рдорд▓рд╛ рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдпрдЪреНрдпрд╛ рд╕реНрдерд╛рдкрдиреЗрдЪреНрдпрд╛ рдЧреБрдВрддрд╛рдЧреБрдВрддреАрдордзреНрдпреЗ рдЬрд╛рдпрд▓рд╛ рдЖрд╡рдбрдгрд╛рд░ рдирд╛рд╣реА, рдХрд╛рд░рдг рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд▓реНрдк рдЕрджреНрд╡рд┐рддреАрдп рдЖрд╣реЗ рдЖрдгрд┐ рдпрд╛рдореБрд│реЗ рдлрд╛рд░рд╕рд╛ рдлрд╛рдпрджрд╛ рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА. рдкрд░рдВрддреБ рддреБрдореНрд╣реА рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреЗ рдард░рд╡рд┐рд▓реНрдпрд╛рд╕ рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдореВрд▓рднреВрдд рдЧреЛрд╖реНрдЯреА рдХрд╡реНрд╣рд░ рдХрд░реЗрди. рддреБрдореНрд╣реА Travis CI, CircleCI, Jenkins рдХрд┐рдВрд╡рд╛ рдЗрддрд░ рдХрд╛рд╣реА рдирд┐рд╡рдбрд▓реЗ рддрд░реАрд╣реА, рд╕рдорд╛рди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкрджреНрдзрддреА рд╕рд░реНрд╡рддреНрд░ рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рддреАрд▓.

Travis CI рд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдпреЗрдереЗ рдЬрд╛ рдкреНрд░рдХрд▓реНрдк рдЖрдгрд┐ рдЦрд╛рддреЗ рддрдпрд╛рд░ рдХрд░рд╛. рдирдВрддрд░ рдЖрдкрд▓реНрдпрд╛ GitHub рдЦрд╛рддреНрдпрд╛рд╕рд╣ Travis CI рд╕рдорд╛рдХрд▓рд┐рдд рдХрд░рд╛. рд╕рд┐рд╕реНрдЯрдо рд╕реЗрдЯ рдЕрдк рдХрд░рддрд╛рдирд╛, рддреБрдореНрд╣рд╛рд▓рд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬреНрдпрд╛рд╕рд╣ рддреБрдореНрд╣реА рдХрд╛рд░реНрдп рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░реВ рдЗрдЪреНрдЫрд┐рддрд╛ рдЖрдгрд┐ рддреНрдпрд╛рдд рдкреНрд░рд╡реЗрд╢ рд╕рдХреНрд╖рдо рдХрд░реВ рдЗрдЪреНрдЫрд┐рддрд╛. (рдореА GitHub рд╡рд╛рдкрд░рддреЛ, рдкрд░рдВрддреБ рдорд▓рд╛ рдЦрд╛рддреНрд░реА рдЖрд╣реЗ рдХреА Travis CI BitBucket, рдЖрдгрд┐ GitLab рдЖрдгрд┐ рдЗрддрд░ рддрддреНрд╕рдо рд╕реЗрд╡рд╛рдВрд╕рд╣ рд╕рдорд╛рдХрд▓рд┐рдд рдХрд░реВ рд╢рдХрддреЗ).

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

тЦН рдиреЛрдХрд░реА рдЬреАрд╡рди рдЪрдХреНрд░

рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ рдХреЙрд▓ рдХреЗрд▓реА .travis.yml рдЖрдгрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдд рд╕рдВрдЧреНрд░рд╣рд┐рдд, рдЗрд╡реНрд╣реЗрдВрдЯрдЪреНрдпрд╛ рд╕рдВрдХрд▓реНрдкрдиреЗрд▓рд╛ рд╕рдорд░реНрдерди рджреЗрддреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХрд╛рд░реНрдпреЗ рдпрд╛ рдШрдЯрдирд╛ рдЬреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рдШрдбрддрд╛рдд рддреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рд╕реВрдЪреАрдмрджреНрдз рдХреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд:

  • apt addons
  • cache components
  • before_install
  • install
  • before_script
  • script
  • before_cache
  • after_success ╨╕╨╗╨╕ after_failure
  • before_deploy
  • deploy
  • after_deploy
  • after_script

тЦНрдЪрд╛рдЪрдгреА

рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдореА рд╕реНрдерд╛рдирд┐рдХ рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп рд╕рд░реНрд╡реНрд╣рд░ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгрд╛рд░ рдЖрд╣реЗ. рдореА рднрд╛рд╖рд╛ рдореНрд╣рдгреВрди рдиреЛрдб 12 рдирд┐рд╡рдбрд▓реЗ рдЖрдгрд┐ рдбреЙрдХрд░ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕ рд╕рд┐рд╕реНрдЯрдорд▓рд╛ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ.

рдордзреНрдпреЗ рд╕реВрдЪреАрдмрджреНрдз рдХреЗрд▓реЗрд▓реА рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯ .travis.yml, рдЕрдиреНрдпрдерд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп, рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдЪреНрдпрд╛ рд╕рд░реНрд╡ рд╢рд╛рдЦрд╛рдВрдирд╛ рд╕рд░реНрд╡ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рддреЗрд╡реНрд╣рд╛ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реНрдпрд╛ рдЬрд╛рддреАрд▓. рд╣реЗ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдЖрд╣реЗ рдХрд╛рд░рдг рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЖрдореНрд╣реА рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рдпреЗрдгрд╛рд░реЗ рд╕рд░реНрд╡ рдХреЛрдб рддрдкрд╛рд╕реВ рд╢рдХрддреЛ. рд╣реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЛрдб рд╢рд╛рдЦреЗрдд рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕рд╛рдареА рддрдпрд╛рд░ рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рд╣реЗ рдХрд│реВ рджреЗрддреЗ. master, рдЖрдгрд┐ рддреЗ рдкреНрд░рдХрд▓реНрдк рдмрд╛рдВрдзрдгреНрдпрд╛рдЪреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЦрдВрдбрд┐рдд рдХрд░реЗрд▓ рдХреА рдирд╛рд╣реА. рдпрд╛ рдЬрд╛рдЧрддрд┐рдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ, рдореА рд╕рд░реНрд╡ рдХрд╛рд╣реА рд╕реНрдерд╛рдирд┐рдХрд░рд┐рддреНрдпрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЛ, рдкрд╛рд░реНрд╢реНрд╡рднреВрдореАрдордзреНрдпреЗ рд╡реЗрдмрдкреЕрдХ рдбреЗрд╡реНрд╣ рд╕рд░реНрд╡реНрд╣рд░ рдЪрд╛рд▓рд╡рддреЛ (рд╣реЗ рдорд╛рдЭреНрдпрд╛ рд╡рд░реНрдХрдлреНрд▓реЛрдЪреЗ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдЖрд╣реЗ), рдЖрдгрд┐ рдЪрд╛рдЪрдгреНрдпрд╛ рдЪрд╛рд▓рд╡рддреЛ.

рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреНрдпрд╛ рднрд╛рдВрдбрд╛рд░рд╛рдд рдЪрд╛рдЪрдгреА рдХрд╡реНрд╣рд░реЗрдЬ рджрд░реНрд╢рд╡рдгрд╛рд░реЗ рдмреЕрдЬ рджрд╛рдЦрд╡рд╛рдпрдЪреЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рдпреЗрдереЗ рд╣реА рдорд╛рд╣рд┐рддреА рд╕рдВрдХрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ Jest, Travis CI рдЖрдгрд┐ Coveralls рд╡рд╛рдкрд░рдгреНрдпрд╛рдмрд╛рдмрдд рд▓рд╣рд╛рди рд╕реВрдЪрдирд╛ рдорд┐рд│реВ рд╢рдХрддрд╛рдд.

рддрд░ рдлрд╛рдИрд▓рдЪреА рд╕рд╛рдордЧреНрд░реА рдпреЗрдереЗ рдЖрд╣реЗ .travis.yml:

# ╨г╤Б╤В╨░╨╜╨╛╨▓╨╕╤В╤М ╤П╨╖╤Л╨║
language: node_js

# ╨г╤Б╤В╨░╨╜╨╛╨▓╨╕╤В╤М ╨▓╨╡╤А╤Б╨╕╤О Node.js
node_js:
  - '12'

services:
  # ╨Ш╤Б╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╤В╤М ╨║╨╛╨╝╨░╨╜╨┤╨╜╤Г╤О ╤Б╤В╤А╨╛╨║╤Г Docker
  - docker

install:
  # ╨г╤Б╤В╨░╨╜╨╛╨▓╨╕╤В╤М ╨╖╨░╨▓╨╕╤Б╨╕╨╝╨╛╤Б╤В╨╕ ╨┤╨╗╤П ╤В╨╡╤Б╤В╨╛╨▓
  - npm ci

before_script:
  # ╨Ч╨░╨┐╤Г╤Б╤В╨╕╤В╤М ╤Б╨╡╤А╨▓╨╡╤А ╨╕ ╨║╨╗╨╕╨╡╨╜╤В ╨┤╨╗╤П ╤В╨╡╤Б╤В╨╛╨▓
  - npm run dev &

script:
  # ╨Ч╨░╨┐╤Г╤Б╤В╨╕╤В╤М ╤В╨╡╤Б╤В╤Л
  - npm run test

рд░рд┐рдкреЙрдЭрд┐рдЯрд░реАрдЪреНрдпрд╛ рд╕рд░реНрд╡ рд╢рд╛рдЦрд╛рдВрд╕рд╛рдареА рдЖрдгрд┐ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╕рд╛рдареА рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд▒реНрдпрд╛ рдХреНрд░рд┐рдпрд╛ рдпреЗрдереЗрдЪ рд╕рдВрдкрддрд╛рдд.

тЦНрдЙрдкрдпреЛрдЬрди

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

deploy:
  # ╨б╨╛╨▒╤А╨░╤В╤М Docker-╨║╨╛╨╜╤В╨╡╨╣╨╜╨╡╤А ╨╕ ╨╛╤В╨┐╤А╨░╨▓╨╕╤В╤М ╨╡╨│╨╛ ╨╜╨░ Docker Hub
  provider: script
  script: bash deploy.sh
  on:
    branch: master

рдЙрдкрдпреЛрдЬрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреЛрди рд╕рдорд╕реНрдпрд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рддреЗ:

  • рд╕реАрдЖрдп рдЯреВрд▓ (рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп) рд╡рд╛рдкрд░реВрди рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░рд╛, рдЯреЕрдЧ рдХрд░рд╛ рдЖрдгрд┐ рдбреЙрдХрд░ рд╣рдмрд╡рд░ рдкрд╛рдард╡рд╛.
  • рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдкреНрд░рддрд┐рдорд╛ рд▓реЛрдб рдХрд░рдгреЗ, рдЬреБрдирд╛ рдХрдВрдЯреЗрдирд░ рдерд╛рдВрдмрд╡рдгреЗ рдЖрдгрд┐ рдирд╡реАрди рд╕реБрд░реВ рдХрд░рдгреЗ (рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рд╕рд░реНрд╡реНрд╣рд░ рдбрд┐рдЬрд┐рдЯрд▓ рдУрд╢рди рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╡рд░ рдЪрд╛рд▓рддреЛ).

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

рддрд░, рд╕реНрдХреНрд░рд┐рдкреНрдЯрдЪрд╛ рдкрд╣рд┐рд▓рд╛ рднрд╛рдЧ рдбреЙрдХрд░ рд╣рдмрд╡рд░ рдкреНрд░рддрд┐рдорд╛ рдЕрдкрд▓реЛрдб рдХрд░рдд рдЖрд╣реЗ. рд╣реЗ рдХрд░рдгреЗ рдЕрдЧрджреА рд╕реЛрдкреЗ рдЖрд╣реЗ. рдореА рд╡рд╛рдкрд░рд▓реЗрд▓реНрдпрд╛ рдЯреЕрдЧрд┐рдВрдЧ рд╕реНрдХреАрдордордзреНрдпреЗ рдЧреАрдЯ рд╣реЕрд╢ рдЖрдгрд┐ рдЧрд┐рдЯ рдЯреЕрдЧ рдЕрд╕рд▓реНрдпрд╛рд╕, рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕рд▓реНрдпрд╛рд╕ рдПрдХрддреНрд░ рдХрд░рдгреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ. рд╣реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рдХреА рдЯреЕрдЧ рдЕрджреНрд╡рд┐рддреАрдп рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рдЬреНрдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЖрд╣реЗ рддреЗ рдУрд│рдЦрдгреЗ рд╕реЛрдкреЗ рдХрд░рддреЗ. DOCKER_USERNAME ╨╕ DOCKER_PASSWORD рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд╛рдкрд░реВрди рд╕реЗрдЯ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрдгрд╛рд░реЗ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдЖрд╣реЗрдд. рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ рд╕реАрдЖрдп рдЖрдкреЛрдЖрдк рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрд▓ рдЬреЗрдгреЗрдХрд░реВрди рддреЛ рдЪреБрдХреАрдЪреНрдпрд╛ рд╣рд╛рддрд╛рдд рдкрдбрдгрд╛рд░ рдирд╛рд╣реА.

рдпреЗрдереЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдЪрд╛ рдкрд╣рд┐рд▓рд╛ рднрд╛рдЧ рдЖрд╣реЗ deploy.sh.

#!/bin/sh
set -e # ╨Ю╤Б╤В╨░╨╜╨╛╨▓╨╕╤В╤М ╤Б╨║╤А╨╕╨┐╤В ╨┐╤А╨╕ ╨╜╨░╨╗╨╕╤З╨╕╨╕ ╨╛╤И╨╕╨▒╨╛╨║

IMAGE="<username>/<repository>"                             # ╨Ю╨▒╤А╨░╨╖ Docker
GIT_VERSION=$(git describe --always --abbrev --tags --long) # Git-╤Е╤Н╤И ╨╕ ╤В╨╡╨│╨╕

# ╨б╨▒╨╛╤А╨║╨░ ╨╕ ╤В╨╡╨│╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨╛╨▒╤А╨░╨╖╨░
docker build -t ${IMAGE}:${GIT_VERSION} .
docker tag ${IMAGE}:${GIT_VERSION} ${IMAGE}:latest

# ╨Т╤Е╨╛╨┤ ╨▓ Docker Hub ╨╕ ╨▓╤Л╨│╤А╤Г╨╖╨║╨░ ╨╛╨▒╤А╨░╨╖╨░
echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
docker push ${IMAGE}:${GIT_VERSION}

рд╕реНрдХреНрд░рд┐рдкреНрдЯрдЪрд╛ рджреБрд╕рд░рд╛ рднрд╛рдЧ рдХрд╛рдп рдЕрд╕реЗрд▓ рд╣реЗ рдкреВрд░реНрдгрдкрдгреЗ рддреБрдореНрд╣реА рдХреЛрдгрддреЗ рд╣реЛрд╕реНрдЯ рд╡рд╛рдкрд░рдд рдЖрд╣рд╛рдд рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рдХрдиреЗрдХреНрд╢рди рдХрд╕реЗ рдЖрдпреЛрдЬрд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗ рдпрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЖрд╣реЗ. рдорд╛рдЭреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдореА рдбрд┐рдЬрд┐рдЯрд▓ рдорд╣рд╛рд╕рд╛рдЧрд░ рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдореА рд╕рд░реНрд╡реНрд╣рд░рд╢реА рдХрдиреЗрдХреНрдЯ рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдЬреНрдЮрд╛ рд╡рд╛рдкрд░рддреЛ doctl. AWS рд╕рд╣ рдХрд╛рдо рдХрд░рддрд╛рдирд╛, рдЙрдкрдпреБрдХреНрддрддрд╛ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рдИрд▓ aws, рдЖрдгрд┐ рдЕрд╕реЗрдЪ.

рд╕рд░реНрд╡реНрд╣рд░ рд╕реЗрдЯ рдХрд░рдгреЗ рд╡рд┐рд╢реЗрд╖рддрдГ рдХрдареАрдг рдирд╡реНрд╣рддреЗ. рдореНрд╣рдгреВрди, рдореА рдмреЗрд╕ рдЗрдореЗрдЬрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдбреНрд░реЙрдкрд▓реЗрдЯ рд╕реЗрдЯ рдХреЗрд▓реЗ. рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрддрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ рдХреА рдореА рдирд┐рд╡рдбрд▓реЗрд▓реНрдпрд╛ рд╕рд┐рд╕реНрдЯрдорд▓рд╛ рдбреЙрдХрд░рдЪреА рдПрдХ-рд╡реЗрд│ рдореЕрдиреНрдпреБрдЕрд▓ рд╕реНрдерд╛рдкрдирд╛ рдЖрдгрд┐ рдбреЙрдХрд░рдЪреЗ рдПрдХ-рд╡реЗрд│ рдореЕрдиреНрдпреБрдЕрд▓ рд▓реЙрдиреНрдЪ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдореА рдбреЙрдХрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЙрдмрдВрдЯреВ 18.04 рд╡рд╛рдкрд░рд▓реЗ, рдореНрд╣рдгреВрди рдЬрд░ рддреБрдореНрд╣реА рджреЗрдЦреАрд▓ рддреЗрдЪ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЙрдмрдВрдЯреВ рд╡рд╛рдкрд░рдд рдЕрд╕рд╛рд▓ рддрд░ рддреБрдореНрд╣реА рдлрдХреНрдд рдЕрдиреБрд╕рд░рдг рдХрд░реВ рд╢рдХрддрд╛ рд╣реЗ рд╕рд╛рдзреЗ рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ.

рдореА рдпреЗрдереЗ рд╕реЗрд╡реЗрд╕рд╛рдареА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрджреЗрд╢рд╛рдВрдмрджреНрджрд▓ рдмреЛрд▓рдд рдирд╛рд╣реА, рдХрд╛рд░рдг рд╣рд╛ рдкреИрд▓реВ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рдмрджрд▓реВ рд╢рдХрддреЛ. рдЬреНрдпрд╛ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдкреНрд░рдХрд▓реНрдк рддреИрдирд╛рдд рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓ рддреНрдпрд╛ рд╕рд░реНрд╡реНрд╣рд░рд╢реА SSH рджреНрд╡рд╛рд░реЗ рдХрдиреЗрдХреНрдЯ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд▒реНрдпрд╛ рдХреГрддреАрдЪреА рдореА рдлрдХреНрдд рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рджреЗрдИрди:

  • рд╕рдзреНрдпрд╛ рдЪрд╛рд▓реВ рдЕрд╕рд▓реЗрд▓рд╛ рдХрдВрдЯреЗрдирд░ рд╢реЛрдзреВрди рддреЛ рдерд╛рдВрдмрд╡рд╛рд╡рд╛ рд▓рд╛рдЧреЗрд▓.
  • рдирдВрддрд░ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдкрд╛рд░реНрд╢реНрд╡рднреВрдореАрдд рдПрдХ рдирд╡реАрди рдХрдВрдЯреЗрдирд░ рд▓реЙрдиреНрдЪ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ.
  • рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд░реНрд╡реНрд╣рд░рдЪреЗ рд╕реНрдерд╛рдирд┐рдХ рдкреЛрд░реНрдЯ рд╕реЗрдЯ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ 80 - рд╣реЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╕рд╛рд░рдЦреНрдпрд╛ рдкрддреНрддреНрдпрд╛рд╡рд░ рд╕рд╛рдЗрдЯ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрдИрд▓ example.com, рдкреЛрд░реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рди рдХрд░рддрд╛, рд╕рд╛рд░рдЦрд╛ рдкрддреНрддрд╛ рд╡рд╛рдкрд░рдгреНрдпрд╛рдРрд╡рдЬреА example.com:5000.
  • рд╢реЗрд╡рдЯреА, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╕рд░реНрд╡ рдЬреБрдиреЗ рдХрдВрдЯреЗрдирд░ рдЖрдгрд┐ рдкреНрд░рддрд┐рдорд╛ рд╣рдЯрд╡рд┐рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ.

рдЗрдереЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдЪрд╛ рд╕рд┐рд▓рд╕рд┐рд▓рд╛ рд╕реБрд░реВ рдЖрд╣реЗ.

# ╨Э╨░╨╣╤В╨╕ ID ╤А╨░╨▒╨╛╤В╨░╤О╤Й╨╡╨│╨╛ ╨║╨╛╨╜╤В╨╡╨╣╨╜╨╡╤А╨░
CONTAINER_ID=$(docker ps | grep takenote | cut -d" " -f1)

# ╨Ю╤Б╤В╨░╨╜╨╛╨▓╨╕╤В╤М ╤Б╤В╨░╤А╤Л╨╣ ╨║╨╛╨╜╤В╨╡╨╣╨╜╨╡╤А, ╨╖╨░╨┐╤Г╤Б╤В╨╕╤В╤М ╨╜╨╛╨▓╤Л╨╣, ╨╛╤З╨╕╤Б╤В╨╕╤В╤М ╤Б╨╕╤Б╤В╨╡╨╝╤Г
docker stop ${CONTAINER_ID}
docker run --restart unless-stopped -d -p 80:5000 ${IMAGE}:${GIT_VERSION}
docker system prune -a -f

рд▓рдХреНрд╖ рджреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреНрдпрд╛ рдХрд╛рд╣реА рдЧреЛрд╖реНрдЯреА

рд╣реЗ рд╢рдХреНрдп рдЖрд╣реЗ рдХреА рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА Travis CI рд╡рд░реВрди SSH рджреНрд╡рд╛рд░реЗ рд╕рд░реНрд╡реНрд╣рд░рд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рд╛рд▓, рддреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдХ рдЪреЗрддрд╛рд╡рдгреА рджрд┐рд╕реЗрд▓ рдЬреА рддреБрдореНрд╣рд╛рд▓рд╛ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рд╕реБрд░реВ рдареЗрд╡рдгреНрдпрд╛рдкрд╛рд╕реВрди рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░реЗрд▓ рдХрд╛рд░рдг рд╕рд┐рд╕реНрдЯрдо рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдЪреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрд▓.

The authenticity of host '<hostname> (<IP address>)' can't be established.
RSA key fingerprint is <key fingerprint>.
Are you sure you want to continue connecting (yes/no)?

рдореА рд╢рд┐рдХрд▓реЛ рдХреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдмреЗрд╕64 рдордзреНрдпреЗ рдПрдиреНрдХреЛрдб рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ рдЬреЗрдгреЗрдХрд░реВрди рддреА рд╕реЛрдпреАрд╕реНрдХрд░рдкрдгреЗ рдЖрдгрд┐ рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣рдкрдгреЗ рдХрд╛рдо рдХрд░рддрд╛ рдпреЗрдИрд▓. рдЗрдиреНрд╕реНрдЯреЙрд▓реЗрд╢рди рд╕реНрдЯреЗрдЬрд╡рд░, рддреБрдореНрд╣реА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреА рдбреАрдХреЛрдб рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рдлрд╛рдЗрд▓рд╡рд░ рд▓рд┐рд╣реВ рд╢рдХрддрд╛ known_hosts рд╡рд░реАрд▓ рддреНрд░реБрдЯреАрдкрд╛рд╕реВрди рдореБрдХреНрдд рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА.

echo <public key> | base64 # ╨▓╤Л╨▓╨╛╨┤╨╕╤В <╨┐╤Г╨▒╨╗╨╕╤З╨╜╤Л╨╣ ╨║╨╗╤О╤З, ╨╖╨░╨║╨╛╨┤╨╕╤А╨╛╨▓╨░╨╜╨╜╤Л╨╣ ╨▓ base64>

рд╕рд░рд╛рд╡ рдордзреНрдпреЗ, рд╣реА рдЖрдЬреНрдЮрд╛ рдпрд╛рд╕рд╛рд░рдЦреА рджрд┐рд╕реВ рд╢рдХрддреЗ:

echo "123.45.67.89 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== [email protected]" | base64

рдЖрдгрд┐ рддреЗ рдХрд╛рдп рддрдпрд╛рд░ рдХрд░рддреЗ рддреЗ рдпреЗрдереЗ рдЖрд╣реЗ - рдПрдХ рдмреЗрд╕64 рдПрдиреНрдХреЛрдбреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

рдпреЗрдереЗ рд╡рд░ рдирдореВрдж рдХреЗрд▓реЗрд▓реА рдЖрдЬреНрдЮрд╛ рдЖрд╣реЗ

install:
  - echo < ╨┐╤Г╨▒╨╗╨╕╤З╨╜╤Л╨╣ ╨║╨╗╤О╤З, ╨╖╨░╨║╨╛╨┤╨╕╤А╨╛╨▓╨░╨╜╨╜╤Л╨╣ ╨▓ base64> | base64 -d >> $HOME/.ssh/known_hosts

рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛рдирд╛ рдЦрд╛рдЬрдЧреА рдХреАрд╕рд╣ рд╕рдорд╛рди рджреГрд╖реНрдЯреАрдХреЛрди рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ, рдХрд╛рд░рдг рд╕рд░реНрд╡реНрд╣рд░рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рдЦрд╛рдЬрдЧреА рдХреА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕реВ рд╢рдХрддреЗ. рдХреА рд╕реЛрдмрдд рдХрд╛рдо рдХрд░рддрд╛рдирд╛, рддреБрдореНрд╣рд╛рд▓рд╛ рддреЗ рдЯреНрд░реЕрд╡реНрд╣рд┐рд╕ CI рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдордзреНрдпреЗ рд╕реБрд░рдХреНрд╖рд┐рддрдкрдгреЗ рд╕рд╛рдард╡рд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рдХреБрдареЗрд╣реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдд рдирд╛рд╣реА рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рдЖрдгрдЦреА рдПрдХ рдЧреЛрд╖реНрдЯ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреА рдЖрд╣реЗ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рдВрдкреВрд░реНрдг рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдУрд│ рдореНрд╣рдгреВрди рдЪрд╛рд▓рд╡рд╛рд╡реА рд▓рд╛рдЧреЗрд▓, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде - рд╕рд╣ doctl. рдпрд╛рд╕рд╛рдареА рдХрд╛рд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрддреНрди рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреАрд▓.

doctl compute ssh <droplet> --ssh-command "╨▓╤Б╨╡ ╨║╨╛╨╝╨░╨╜╨┤╤Л ╨▒╤Г╨┤╤Г╤В ╨╖╨┤╨╡╤Б╤М && ╨╖╨┤╨╡╤Б╤М"

TLS/SSL рдЖрдгрд┐ рд▓реЛрдб рдмреЕрд▓рдиреНрд╕рд┐рдВрдЧ

рдореА рд╡рд░ рдирдореВрдж рдХреЗрд▓реЗрд▓реЗ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдорд▓рд╛ рд╢реЗрд╡рдЯрдЪреА рд╕рдорд╕реНрдпрд╛ рдЖрд▓реА рддреА рдореНрд╣рдгрдЬреЗ рд╕рд░реНрд╡реНрд╣рд░рдХрдбреЗ SSL рдирд╛рд╣реА. рд╕рдХреНрддреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдореА Node.js рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реНрдпрд╛рдиреЗ рдХрд╛рдо рдХрд░рдгреЗ рд░рд┐рд╡реНрд╣рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА Nginx рдЖрдгрд┐ рдЪрд▓рд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рд╛, рддреБрдореНрд╣рд╛рд▓рд╛ рдЦреВрдк рдЯрд┐рдВрдХрд░ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓.

рдорд▓рд╛ рд╣реЗ рд╕рд░реНрд╡ SSL рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдореЕрдиреНрдпреБрдЕрд▓реА рдХрд░рд╛рдпрдЪреЗ рдирд╡реНрд╣рддреЗ, рдореНрд╣рдгреВрди рдореА рдлрдХреНрдд рд▓реЛрдб рдмреЕрд▓рдиреНрд╕рд░ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рддрдкрд╢реАрд▓ DNS рдордзреНрдпреЗ рд░реЗрдХреЙрд░реНрдб рдХреЗрд▓реЗ. рдбрд┐рдЬрд┐рдЯрд▓ рдУрд╢рдирдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд▓реЛрдб рдмреЕрд▓рдиреНрд╕рд░рд╡рд░ рд╕реНрд╡рдпрдВ-рдиреВрддрдиреАрдХрд░рдг рд╕реНрд╡рдпрдВ-рд╕реНрд╡рд╛рдХреНрд╖рд░реА рдХреЗрд▓реЗрд▓реЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ рд╣реА рдПрдХ рд╕реЛрдкреА, рд╡рд┐рдирд╛рдореВрд▓реНрдп рдЖрдгрд┐ рдЬрд▓рдж рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд╣реЗ. рдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рдЪрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╛рдпрджрд╛ рдЖрд╣реЗ рдХреА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕ рд▓реЛрдб рдмреЕрд▓рдиреНрд╕рд░рдЪреНрдпрд╛ рдорд╛рдЧреЗ рдЪрд╛рд▓рдгрд╛рд▒реНрдпрд╛ рдПрдХрд╛рдзрд┐рдХ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ SSL рд╕реЗрдЯ рдХрд░рдгреЗ рдЦреВрдк рд╕реЛрдкреЗ рдЖрд╣реЗ. рд╣реЗ рд╕рд░реНрд╡реНрд╣рд░рдирд╛ рд╕реНрд╡рддрдГрд▓рд╛ SSL рдмрджреНрджрд▓ рдЕрдЬрд┐рдмрд╛рдд "рд╡рд┐рдЪрд╛рд░" рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рддреНрдпрд╛рдЪ рд╡реЗрд│реА рдиреЗрд╣рдореАрдкреНрд░рдорд╛рдгреЗ рдкреЛрд░реНрдЯ рд╡рд╛рдкрд░рддрд╛рдд. 80. рддреНрдпрд╛рдореБрд│реЗ рд▓реЛрдб рдмреЕрд▓рдиреНрд╕рд░рд╡рд░ SSL рд╕реЗрдЯ рдХрд░рдгреЗ SSL рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкрд░реНрдпрд╛рдпреА рдкрджреНрдзрддреАрдВрдкреЗрдХреНрд╖рд╛ рдЦреВрдк рд╕реЛрдкреЗ рдЖрдгрд┐ рдЕрдзрд┐рдХ рд╕реЛрдпреАрдЪреЗ рдЖрд╣реЗ.

рдЖрддрд╛ рддреБрдореНрд╣реА рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реАрд▓ рд╕рд░реНрд╡ рдкреЛрд░реНрдЯ рдмрдВрдж рдХрд░реВ рд╢рдХрддрд╛ рдЬреЗ рдпреЗрдгрд╛рд░реЗ рдХрдиреЗрдХреНрд╢рди рд╕реНрд╡реАрдХрд╛рд░рддрд╛рдд - рдкреЛрд░реНрдЯ рд╡рдЧрд│рддрд╛ 80, рд▓реЛрдб рдмреЕрд▓рдиреНрд╕рд░ рдЖрдгрд┐ рдкреЛрд░реНрдЯрд╢реА рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ 22 SSH рд╕рд╛рдареА. рдкрд░рд┐рдгрд╛рдореА, рдпрд╛ рджреЛрди рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд рдЗрддрд░ рдХреЛрдгрддреНрдпрд╛рд╣реА рдкреЛрд░реНрдЯрд╡рд░реАрд▓ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдереЗрдЯ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдЕрдпрд╢рд╕реНрд╡реА рд╣реЛрдИрд▓.

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

рдореА рдпрд╛ рд╕рд╛рдордЧреНрд░реАрдордзреНрдпреЗ рдЬреЗ рдХрд╛рд╣реА рдмреЛрд▓рд▓реЛ рддреЗ рд╕рд░реНрд╡ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдбреЙрдХрд░ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо рдХрд┐рдВрд╡рд╛ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд CI/CD рдЪреЗрдирдЪреНрдпрд╛ рд╕рдВрдХрд▓реНрдкрдирд╛рдВрдиреА рдорд▓рд╛ рдШрд╛рдмрд░рд╡рд▓реЗ рдирд╛рд╣реА. рдореА рд╕рддрдд рдПрдХреАрдХрд░рдг рд╕рд╛рдЦрд│реА рд╕реЗрдЯ рдХрд░реВ рд╢рдХрд▓реЛ, рдЬреНрдпрд╛ рджрд░рдореНрдпрд╛рди рдХреЛрдб рдЙрддреНрдкрд╛рджрдирд╛рдд рдЬрд╛рдгреНрдпрд╛рдкреВрд░реНрд╡реА рддреНрдпрд╛рдЪреА рдЪрд╛рдЪрдгреА рдХреЗрд▓реА рдЬрд╛рддреЗ рдЖрдгрд┐ рдХреЛрдб рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рддреИрдирд╛рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ. рд╣реЗ рд╕рд░реНрд╡ рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА рдЕрдЬреВрдирд╣реА рддреБрд▓рдиреЗрдиреЗ рдирд╡реАрди рдЖрд╣реЗ рдЖрдгрд┐ рдорд▓рд╛ рдЦрд╛рддреНрд░реА рдЖрд╣реЗ рдХреА рдорд╛рдЭреЗ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рд╕реБрдзрд╛рд░рдгреНрдпрд╛рдЪреЗ рдЖрдгрд┐ рддреЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдо рдмрдирд╡рдгреНрдпрд╛рдЪреЗ рдорд╛рд░реНрдЧ рдЖрд╣реЗрдд. рддреНрдпрд╛рдореБрд│реЗ рдпрд╛ рд╡рд┐рд╖рдпрд╛рд╡рд░ рддреБрдордЪреНрдпрд╛ рдХрд╛рд╣реА рдХрд▓реНрдкрдирд╛ рдЕрд╕рддреАрд▓ рддрд░ рдХреГрдкрдпрд╛ рдорд▓рд╛ рдХрд│рд╡рд╛. рдорд▓рд╛ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ рдорд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рдпрд╛ рд▓реЗрдЦрд╛рдиреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреНрдпрд╛ рдкреНрд░рдпрддреНрдирд╛рдВрдордзреНрдпреЗ рдорджрдд рдХреЗрд▓реА рдЖрд╣реЗ. рдорд▓рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдареЗрд╡рд╛рдпрдЪрд╛ рдЖрд╣реЗ рдХреА рддреЗ рд╡рд╛рдЪрд▓реНрдпрд╛рдирдВрддрд░, рдореА рддреНрдпрд╛рдд рдЬреЗ рдХрд╛рд╣реА рдмреЛрд▓рд▓реЛ рддреЗ рд╢реЛрдзреВрди рдХрд╛рдврддрд╛рдирд╛ рдореА рдЬрд┐рддрдХреЗ рд╢рд┐рдХрд▓реЛ рддрд┐рддрдХреЗрдЪ рддреБрдореНрд╣реА рд╢рд┐рдХрд▓рд╛рдд.

PS рдЖрдордЪреНрдпрд╛ рдордзреНрдпреЗ рдмрд╛рдЬрд╛рд░рдкреЗрда рдПрдХ рдкреНрд░рддрд┐рдорд╛ рдЖрд╣реЗ рдЧреЛрджреА рдХрд╛рдордЧрд╛рд░, рдЬреЗ рдПрдХрд╛ рдХреНрд▓рд┐рдХрд╡рд░ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рдпреЗрдереЗ рдЖрдкрдг рдХрдВрдЯреЗрдирд░рдЪреЗ рдСрдкрд░реЗрд╢рди рддрдкрд╛рд╕реВ рд╢рдХрддрд╛ VPS. рд╕рд░реНрд╡ рдирд╡реАрди рдЧреНрд░рд╛рд╣рдХрд╛рдВрдирд╛ 3 рджрд┐рд╡рд╕рд╛рдВрдЪреА рдЪрд╛рдЪрдгреА рдореЛрдлрдд рджрд┐рд▓реА рдЬрд╛рддреЗ.

рдкреНрд░рд┐рдп рд╡рд╛рдЪрдХ! рддреБрдореНрд╣реА рддреБрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдВрдордзреНрдпреЗ CI/CD рддрдВрддреНрд░рдЬреНрдЮрд╛рди рд╡рд╛рдкрд░рддрд╛?

рд╕реАрдЖрдп/рд╕реАрдбреА рд╕рд╛рдЦрд│реА рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрдгрд┐ рдбреЙрдХрд░рд╕рд╣ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд╛рд░реНрдп

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛