рдбреЙрдХрд░: рд╡рд╛рдИрдЯ рд╕рд▓реНрд▓рд╛ рдирд╛рд╣реА

рдорд╛рдЭреНрдпрд╛ рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдордзреНрдпреЗ рдбреЙрдХрд░: рд╡рд╛рдИрдЯ рд╕рд▓реНрд▓рд╛ рддреНрдпрд╛рдд рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реА рдбреЙрдХрд░рдлрд╛рдИрд▓ рдЗрддрдХреА рднрдпрдВрдХрд░ рдХрд╛ рдЖрд╣реЗ рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рд╡рд┐рдирдВрддреНрдпрд╛ рд╣реЛрддреНрдпрд╛.

рдорд╛рдЧреАрд▓ рднрд╛рдЧрд╛рдЪрд╛ рд╕рд╛рд░рд╛рдВрд╢: рджреЛрди рдбреЗрд╡реНрд╣рд▓рдкрд░ рдПрдХ рдШрдЯреНрдЯ рдбреЗрдбрд▓рд╛рдЗрди рдЕрдВрддрд░реНрдЧрдд рдбреЙрдХрд░рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░рддрд╛рдд. рдкреНрд░рдХреНрд░рд┐рдпреЗрдд, рдСрдкреНрд╕ рдЗрдЧреЛрд░ рдЗрд╡рд╛рдиреЛрд╡рд┐рдЪ рддреНрдпрд╛рдВрдЪреНрдпрд╛рдХрдбреЗ рдпреЗрддреЛ. рдкрд░рд┐рдгрд╛рдореА рдбреЙрдХрд░рдлрд╛рдИрд▓ рдЗрддрдХреА рд╡рд╛рдИрдЯ рдЖрд╣реЗ рдХреА рдПрдЖрдп рд╣реГрджрдпрд╡рд┐рдХрд╛рд░рд╛рдЪреНрдпрд╛ рдорд╛рд░реНрдЧрд╛рд╡рд░ рдЖрд╣реЗ.

рдбреЙрдХрд░: рд╡рд╛рдИрдЯ рд╕рд▓реНрд▓рд╛ рдирд╛рд╣реА

рдЖрддрд╛ рдпрд╛ рдбреЙрдХрд░рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдХрд╛рдп рдЪреВрдХ рдЖрд╣реЗ рддреЗ рд╢реЛрдзреВрдпрд╛.

рддрд░, рдПрдХ рдЖрдард╡рдбрд╛ рдЙрд▓рдЯрд▓рд╛.

рджреЗрд╡ рдкреЗрдЯреНрдпрд╛ рдПрдХрд╛ рдХрдк рдХреЙрдлреАрд╡рд░ рдЬреЗрд╡рдгрд╛рдЪреНрдпрд╛ рдЦреЛрд▓реАрдд Ops рдЗрдЧреЛрд░ рдЗрд╡реНрд╣рд╛рдиреЛрд╡рд┐рдЪрд▓рд╛ рднреЗрдЯрддреЛ.

рдкреА: рдЗрдЧреЛрд░ рдЗрд╡реНрд╣рд╛рдиреЛрд╡рд┐рдЪ, рддреВ рдЦреВрдк рд╡реНрдпрд╕реНрдд рдЖрд╣реЗрд╕? рдЖрдореНрд╣реА рдХреБрдареЗ рдЪреБрдХрд▓реЛ рддреЗ рдорд▓рд╛ рд╢реЛрдзреВрди рдХрд╛рдврд╛рдпрдЪреЗ рдЖрд╣реЗ.

AI: рд╣реЗ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ, рд╢реЛрд╖рдгрд╛рдд рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╡рд┐рдХрд╛рд╕рдХрд╛рдВрдирд╛ рддреБрдореНрд╣реА рд╕рд╣рд╕рд╛ рднреЗрдЯрдд рдирд╛рд╣реА.
рдкреНрд░рдердо, рдЖрдкрдг рдХрд╛рд╣реА рдЧреЛрд╖реНрдЯреАрдВрд╡рд░ рд╕рд╣рдордд рд╣реЛрдК рдпрд╛:

  1. рдбреЙрдХрд░ рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛: рдПрдХ рдХрдВрдЯреЗрдирд░ - рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛.
  2. рдХрдВрдЯреЗрдирд░ рдЬрд┐рддрдХрд╛ рд▓рд╣рд╛рди рдЕрд╕реЗрд▓ рддрд┐рддрдХрд╛ рдЪрд╛рдВрдЧрд▓рд╛.
  3. рдЖрдкрдг рдХреЕрд╢реЗрдордзреВрди рдЬрд┐рддрдХреЗ рдЬрд╛рд╕реНрдд рдШреНрдпрд╛рд▓ рддрд┐рддрдХреЗ рдЪрд╛рдВрдЧрд▓реЗ.

P: рдПрдХрд╛ рдХрдВрдЯреЗрдирд░рдордзреНрдпреЗ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЕрд╕рд╛рд╡реА?

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

рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдгрдЦреА рдХрд╛рд╣реА рдкреНрд░рд╢реНрди рдирд╕рд▓реНрдпрд╛рд╕, рдХреГрдкрдпрд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреА рдбреЙрдХрд░рдлрд╛рдЗрд▓ рджрд╛рдЦрд╡рд╛.

рдЖрдгрд┐ рдкреЗрдЯреНрдпрд╛рдиреЗ рджрд╛рдЦрд╡рд▓реЗ:

FROM ubuntu:latest

# ╨Ъ╨╛╨┐╨╕╤А╤Г╨╡╨╝ ╨╕╤Б╤Е╨╛╨┤╨╜╤Л╨╣ ╨║╨╛╨┤
COPY ./ /app
WORKDIR /app

# ╨Ю╨▒╨╜╨╛╨▓╨╗╤П╨╡╨╝ ╤Б╨┐╨╕╤Б╨╛╨║ ╨┐╨░╨║╨╡╤В╨╛╨▓
RUN apt-get update 

# ╨Ю╨▒╨╜╨╛╨▓╨╗╤П╨╡╨╝ ╨┐╨░╨║╨╡╤В╤Л
RUN apt-get upgrade

# ╨г╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝ ╨╜╤Г╨╢╨╜╤Л╨╡ ╨┐╨░╨║╨╡╤В╤Л
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor

# ╨г╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝ bundler
RUN gem install bundler

# ╨г╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝ nodejs ╨╕╤Б╨┐╨╛╨╗╤М╨╖╤Г╨╡╤В╤Б╤П ╨┤╨╗╤П ╤Б╨▒╨╛╤А╨║╨╕ ╤Б╤В╨░╤В╨╕╨║╨╕
RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash -
RUN apt-get install -y nodejs

# ╨г╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╨╡╨╝ ╨╖╨░╨▓╨╕╤Б╨╕╨╝╨╛╤Б╤В╨╕
RUN bundle install --without development test --path vendor/bundle

# ╨з╨╕╤Б╤В╨╕╨╝ ╨╖╨░ ╤Б╨╛╨▒╨╛╨╣ ╨║╤Н╤И╨╕
RUN rm -rf /usr/local/bundle/cache/*.gem 
RUN apt-get clean 
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 
RUN rake assets:precompile
# ╨Ч╨░╨┐╤Г╤Б╨║╨░╨╡╨╝ ╤Б╨║╤А╨╕╨┐╤В, ╨┐╤А╨╕ ╤Б╤В╨░╤А╤В╨╡ ╨║╨╛╨╜╤В╨╡╨╣╨╜╨╡╤А╨░, ╨║╨╛╤В╨╛╤А╤Л╨╣ ╨╖╨░╨┐╤Г╤Б╤В╨╕╤В ╨▓╤Б╨╡ ╨╛╤Б╤В╨░╨╗╤М╨╜╨╛╨╡.
CMD ["/app/init.sh"]

AI: рдЕрд░реЗ, рддреЗ рдХреНрд░рдорд╛рдиреЗ рдШреЗрдК. рдЪрд▓рд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рдУрд│реАрдиреЗ рд╕реБрд░реБрд╡рд╛рдд рдХрд░реВрдпрд╛:

FROM ubuntu:latest

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

рддреБрдореНрд╣реА рднрд░рдкреВрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░рд╕рд╣ рдкреВрд░реНрдг OS рдЕрд╕рд▓реЗрд▓реА рдкреНрд░рддрд┐рдорд╛ рдШреЗрддрд╛, рдЬреНрдпрд╛рдореБрд│реЗ рдХрдВрдЯреЗрдирд░рдЪрд╛ рдЖрд╡рд╛рдЬ рд╡рд╛рдврддреЛ. рдЖрдгрд┐ рдЬрд┐рддрдХреЗ рдЕрдзрд┐рдХ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░, рддрд┐рддрдХреЗ рдЕрдзрд┐рдХ рдЫрд┐рджреНрд░ рдЖрдгрд┐ рднреЗрджреНрдпрддрд╛.

рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдкреНрд░рддрд┐рдорд╛ рдЬрд┐рддрдХреА рдореЛрдареА рдЕрд╕реЗрд▓ рддрд┐рддрдХреА рддреА рд╣реЛрд╕реНрдЯрд╡рд░ рдЖрдгрд┐ рд░реЗрдЬрд┐рд╕реНрдЯреНрд░реАрдордзреНрдпреЗ рдЕрдзрд┐рдХ рдЬрд╛рдЧрд╛ рдШреЗрддреЗ (рддреБрдореНрд╣реА рдХреБрдареЗрддрд░реА рдкреНрд░рддрд┐рдорд╛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддрд╛)?

рдкреА: рд╣реЛрдп, рдирдХреНрдХреАрдЪ, рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХ рдиреЛрдВрджрдгреА рдЖрд╣реЗ, рддреБрдореНрд╣реА рддреА рд╕реЗрдЯ рдХрд░рд╛.

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

рдореНрд╣рдгреВрди, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЕрдЪреВрдХ рдЖрд╡реГрддреНрддреА рдЖрдгрд┐ рдХрд┐рдорд╛рди рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░рд╕рд╣ рд╕рд░реНрд╡рд╛рдд рдпреЛрдЧреНрдп рдкреНрд░рддрд┐рдорд╛ рдирд┐рд╡рдбрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдШреНрдпрд╛: FROM ruby:2.5.5-stretch

рдкреА: рдЕрд░реЗ, рдореА рдкрд╛рд╣рддреЛ. рдореА рдЙрдкрд▓рдмреНрдз рдкреНрд░рддрд┐рдорд╛ рдХрд╕реЗ рдЖрдгрд┐ рдХреБрдареЗ рдкрд╛рд╣реВ рд╢рдХрддреЛ? рдорд▓рд╛ рдХреЛрдгрддреНрдпрд╛рдЪреА рдЧрд░рдЬ рдЖрд╣реЗ рд╣реЗ рдорд▓рд╛ рдХрд╕реЗ рдХрд│реЗрд▓?

AI: рд╕рд╣рд╕рд╛ рдкреНрд░рддрд┐рдорд╛ рдпрд╛рд╡рд░реВрди рдШреЗрддрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рдбреЙрдХрд░рд╣рдм, рдкреЙрд░реНрдирд╣рдмрдордзреНрдпреЗ рдЧреЛрдВрдзрд│ рдХрд░реВ рдирдХрд╛ :). рдкреНрд░рддрд┐рдореЗрд╕рд╛рдареА рд╕рд╣рд╕рд╛ рдЕрдиреЗрдХ рдЕрд╕реЗрдВрдмреНрд▓реА рдЕрд╕рддрд╛рдд:
рдЕрд▓реНрдкрд╛рдЗрди: рдкреНрд░рддрд┐рдорд╛ рдХрд┐рдорд╛рди рд▓рд┐рдирдХреНрд╕ рдкреНрд░рддрд┐рдореЗрд╡рд░ рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд, рдлрдХреНрдд 5 MB. рддреНрдпрд╛рдЪреЗ рдиреБрдХрд╕рд╛рди: рддреЗ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ libc рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╕рд╣ рд╕рдВрдХрд▓рд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗ, рдорд╛рдирдХ рдкреЕрдХреЗрдЬреЗрд╕ рддреНрдпрд╛рдд рдХрд╛рд░реНрдп рдХрд░рдд рдирд╛рд╣реАрдд. рдЖрд╡рд╢реНрдпрдХ рдкреЕрдХреЗрдЬ рд╢реЛрдзрдгреЗ рдЖрдгрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЦреВрдк рд╡реЗрд│ рдШреЗрдИрд▓.
рд╕реНрдХреНрд░реЕрдЪ: рдореВрд│ рдкреНрд░рддрд┐рдорд╛, рдЗрддрд░ рдкреНрд░рддрд┐рдорд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реА рдЬрд╛рдд рдирд╛рд╣реА. рд╣реЗ рдХреЗрд╡рд│ рдмрд╛рдпрдирд░реА, рддрдпрд╛рд░ рдбреЗрдЯрд╛ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╣реЗ. рдмрд╛рдпрдирд░реА рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЖрджрд░реНрд╢ рдЬреНрдпрд╛рдордзреНрдпреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯреАрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЖрд╣реЗ, рдЬрд╕реЗ рдХреА GO рдНрдкреНрд▓рд┐рдХреЗрд╢рди.
Ubuntu рдХрд┐рдВрд╡рд╛ Debian рд╕рд╛рд░рдЦреНрдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА OS рд╡рд░ рдЖрдзрд╛рд░рд┐рдд. рдмрд░рдВ, рдорд▓рд╛ рд╕рдордЬрд╛рд╡реВрди рд╕рд╛рдВрдЧрдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рд╡рд╛рдЯрдд рдирд╛рд╣реА.

AI: рдЖрддрд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рд░реНрд╡ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ. рдкреЕрдХреЗрдЬреЗрд╕ рдЖрдгрд┐ рдХреЕрд╢реЗ рд╕рд╛рдл рдХрд░рд╛. рдЖрдгрд┐ рдЖрдкрдг рддреЗ рд▓рдЧреЗрдЪ рдлреЗрдХреВрди рджреЗрдК рд╢рдХрддрд╛ apt-get рдЕрдкрдЧреНрд░реЗрдб. рдЕрдиреНрдпрдерд╛, рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рд▓реНрдбрд╕рд╣, рдореВрд│ рдкреНрд░рддрд┐рдореЗрдЪрд╛ рдирд┐рд╢реНрдЪрд┐рдд рдЯреЕрдЧ рдЕрд╕реВрдирд╣реА, рднрд┐рдиреНрди рдкреНрд░рддрд┐рдорд╛ рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддреАрд▓. рдЗрдореЗрдЬрдордзреАрд▓ рдкреЕрдХреЗрдЬреЗрд╕ рдЕрдкрдбреЗрдЯ рдХрд░рдгреЗ рд╣реЗ рдореЗрдВрдЯреЗрдирд░рдЪреЗ рдХрд╛рдо рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рдЯреЕрдЧ рдмрджрд▓рдгреНрдпрд╛рд╕реЛрдмрдд рдЖрд╣реЗ.

рдкреА: рд╣реЛрдп, рдореА рддреЗ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛, рддреЗ рдЕрд╕реЗ рдЭрд╛рд▓реЗ:

WORKDIR /app
COPY ./ /app

RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - 
    && apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle

RUN rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

AI: рд╡рд╛рдИрдЯ рдирд╛рд╣реА, рдкрдг рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдХрд╛рд╣реАрддрд░реА рдЖрд╣реЗ. рдкрд╣рд╛, рд╣реА рдЖрдЬреНрдЮрд╛ рдЖрд╣реЗ:

RUN rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*  

... рдЕрдВрддрд┐рдо рдкреНрд░рддрд┐рдореЗрддреВрди рдбреЗрдЯрд╛ рд╣рдЯрд╡рдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рдХреЗрд╡рд│ рдпрд╛ рдбреЗрдЯрд╛рд╢рд┐рд╡рд╛рдп рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрддрд░ рддрдпрд╛рд░ рдХрд░рддреЗ. рдмрд░реЛрдмрд░ рдЕрд╕реЗ:

RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - 
    && apt-get -y install libpq-dev imagemagick gsfonts nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle   
    && rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

рдкрдг рдПрд╡рдвреЗрдЪ рдирд╛рд╣реА. рддреБрдЭреНрдпрд╛рдХрдбреЗ рдХрд╛рдп рдЖрд╣реЗ, рд░реБрдмреА? рдордЧ рддреБрдореНрд╣рд╛рд▓рд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рд╕рдВрдкреВрд░реНрдг рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЙрдкреА рдХрд░рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА. Gemfile рдЖрдгрд┐ Gemfile.lock рдХреЙрдкреА рдХрд░рдгреЗ рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ.

рдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рд╕рд╣, рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд░реЛрдд рдмрджрд▓рд╛рд╕рд╛рдареА рдмрдВрдбрд▓ рд╕реНрдерд╛рдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реА рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реА, рдкрд░рдВрддреБ рдХреЗрд╡рд│ Gemfile рдХрд┐рдВрд╡рд╛ Gemfile.lock рдмрджрд▓рд▓реЗ рдЕрд╕рд▓реНрдпрд╛рд╕.

рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХрд╛рд╕рд╣ рдЗрддрд░ рднрд╛рд╖рд╛рдВрд╕рд╛рдареА рд╕рдорд╛рди рдкрджреНрдзрддреА рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд, рдЬрд╕реЗ рдХреА npm, pip, рд╕рдВрдЧреАрддрдХрд╛рд░ рдЖрдгрд┐ рдЗрддрд░ рдЕрд╡рд▓рдВрдмрдирд╛рдВрдЪреНрдпрд╛ рд╕реВрдЪреАрд╕рд╣ рдлрд╛рдЗрд▓рд╡рд░ рдЖрдзрд╛рд░рд┐рдд.

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

рдкрдг рддреНрдпрд╛рдмрджреНрджрд▓ рдирдВрддрд░ рдЕрдзрд┐рдХ.

P: рдорд▓рд╛ рд╡рд╛рдЯрддреЗ рдХреА рдорд▓рд╛ рд╕рдордЬрд▓реЗ рдЖрд╣реЗ. рдХрд╛рдп рд╣реЛрддреЗ рддреЗ рдкрд╣рд╛:

FROM ruby:2.5.5-stretch

WORKDIR /app
COPY Gemfile* /app

RUN curl -sL https://deb.nodesource.com/setup_9.x | bash - 
    && apt-get -y install libpq-dev imagemagick gsfonts nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle   
    && rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

COPY . /app
RUN rake assets:precompile

CMD ["bundleтАЭ, тАЬexecтАЭ, тАЬpassengerтАЭ, тАЬstart"]

рдХрдВрдЯреЗрдирд░ рд╕реБрд░реВ рдХрд░рддрд╛рдирд╛ рдЖрдкрдг рдбрд┐рдордирдЪреЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рдУрд╡реНрд╣рд░рд░рд╛рдЗрдб рдХрд░реВ рд╢рдХрддреЛ рдХрд╛?

AI: рд╣реЛрдп, рддреЗ рдмрд░реЛрдмрд░ рдЖрд╣реЗ. рддрд╕реЗ, рддреБрдореНрд╣реА CMD рдЖрдгрд┐ ENTRYPOINT рджреЛрдиреНрд╣реА рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛. рдЖрдгрд┐ рдлрд░рдХ рдХрд╛рдп рдЖрд╣реЗ рд╣реЗ рд╢реЛрдзрдгреЗ рдореНрд╣рдгрдЬреЗ рддреБрдордЪрд╛ рдЧреГрд╣рдкрд╛рда. Habr├й рд╡рд░ рдпрд╛ рд╡рд┐рд╖рдпрд╛рд╡рд░ рдПрдХ рдЪрд╛рдВрдЧрд▓рд╛ рдЖрд╣реЗ рд▓реЗрдЦ.

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

RUN curl -sL https://deb.nodesource.com/setup_9.x > setup_9.x 
    && echo "958c9a95c4974c918dca773edf6d18b1d1a41434  setup_9.x" | sha1sum -c - 
    &&  bash  setup_9.x 
    && rm -rf setup_9.x 
    && apt-get -y install libpq-dev imagemagick gsfonts nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle   
    && rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

рдЪреЗрдХрд╕рдо рд╡рд╛рдкрд░реВрди рддреБрдореНрд╣реА рдпреЛрдЧреНрдп рдлрд╛рдИрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗрд▓реНрдпрд╛рдЪреЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реВ рд╢рдХрддрд╛.

P: рдкрд░рдВрддреБ рдлрд╛рдЗрд▓ рдмрджрд▓рд▓реНрдпрд╛рд╕, рдмрд┐рд▓реНрдб рдЕрдпрд╢рд╕реНрд╡реА рд╣реЛрдИрд▓.

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

рдкреА: рдзрдиреНрдпрд╡рд╛рдж. рдЕрд╕реЗ рджрд┐рд╕реВрди рдЖрд▓реЗ рдХреА рдЕрдВрддрд┐рдо рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдпрд╛рд╕рд╛рд░рдЦреЗ рджрд┐рд╕реЗрд▓:

FROM ruby:2.5.5-stretch

WORKDIR /app
COPY Gemfile* /app

RUN curl -sL https://deb.nodesource.com/setup_9.x > setup_9.x 
    && echo "958c9a95c4974c918dca773edf6d18b1d1a41434  setup_9.x" | sha1sum -c - 
    &&  bash  setup_9.x 
    && rm -rf setup_9.x 
    && apt-get -y install libpq-dev imagemagick gsfonts nodejs 
    && gem install bundler 
    && bundle install --without development test --path vendor/bundle   
    && rm -rf /usr/local/bundle/cache/*.gem 
    && apt-get clean  
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

COPY . /app
RUN rake assets:precompile

CMD ["bundleтАЭ, тАЬexecтАЭ, тАЬpassengerтАЭ, тАЬstart"]

рдкреА: рдЗрдЧреЛрд░ рдЗрд╡рд╛рдиреЛрд╡рд┐рдЪ, рддреБрдордЪреНрдпрд╛ рдорджрддреАрдмрджреНрджрд▓ рдзрдиреНрдпрд╡рд╛рдж. рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА рдзрд╛рд╡рдгреНрдпрд╛рдЪреА рд╡реЗрд│ рдЖрд▓реА рдЖрд╣реЗ, рдорд▓рд╛ рдЖрдЬ рдЖрдгрдЦреА 10 рдХрдорд┐рдЯ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреАрд▓.

рдЗрдЧреЛрд░ рдЗрд╡реНрд╣рд╛рдиреЛрд╡рд┐рдЪ, рддреНрдпрд╛рдЪреНрдпрд╛ рдШрд╛рдИрдЧрдбрдмрдбреАрдд рд╕рд╣рдХрд╛рд▒реНрдпрд╛рд▓рд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рдирдЬрд░реЗрдиреЗ рдерд╛рдВрдмрд╡рдд, рдордЬрдмреВрдд рдХреЙрдлреАрдЪрд╛ рдПрдХ рдШреЛрдЯ рдШреЗрддреЛ. 99.9% SLA рдЖрдгрд┐ рдмрдЧ-рдореБрдХреНрдд рдХреЛрдбрдмрджреНрджрд▓ рдХрд╛рд╣реА рд╕реЗрдХрдВрдж рд╡рд┐рдЪрд╛рд░ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рддреЛ рдПрдХ рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рддреЛ.

AI: рддреБрдореНрд╣реА рдиреЛрдВрджреА рдХреБрдареЗ рдареЗрд╡рддрд╛?

рдкреА: рдирдХреНрдХреАрдЪ, production.log рдордзреНрдпреЗ. рддрд╕реЗ, рд╣реЛрдп, рдкрд░рдВрддреБ рдЖрдореНрд╣реА ssh рд╢рд┐рд╡рд╛рдп рддреНрдпрд╛рдВрдирд╛ рдХрд╕реЗ рдкреНрд░рд╡реЗрд╢ рдХрд░реВ рд╢рдХрддреЛ?

AI: рдЬрд░ рддреБрдореНрд╣реА рддреНрдпрд╛рдВрдирд╛ рдлрд╛рдЗрд▓реНрд╕рдордзреНрдпреЗ рд╕реЛрдбрд▓реЗ рддрд░ рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рдЖрдзреАрдЪ рдПрдХ рдЙрдкрд╛рдп рд╢реЛрдзрд▓рд╛ рдЧреЗрд▓рд╛ рдЖрд╣реЗ. docker exec рдХрдорд╛рдВрдб рддреБрдореНрд╣рд╛рд▓рд╛ рдХрдВрдЯреЗрдирд░рдордзреНрдпреЗ рдХреЛрдгрддреАрд╣реА рдХрдорд╛рдВрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдкрдг рд▓реЙрдЧрд╕рд╛рдареА рдорд╛рдВрдЬрд░ рдХрд░реВ рд╢рдХрддрд╛. рдЖрдгрд┐ рдХреА рд╡рд╛рдкрд░реВрди -рд╣реЗ рдЖрдгрд┐ рд░рдирд┐рдВрдЧ рдмреЕрд╢ (рдХрдВрдЯреЗрдирд░рдордзреНрдпреЗ рд╕реНрдерд╛рдкрд┐рдд рдЕрд╕рд▓реНрдпрд╛рд╕) рддреБрдореНрд╣рд╛рд▓рд╛ рдХрдВрдЯреЗрдирд░рдордзреНрдпреЗ рдкрд░рд╕реНрдкрд░ рдкреНрд░рд╡реЗрд╢ рджреЗрдИрд▓.

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

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

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

рдкреА: рдЗрдЧреЛрд░ рдЗрд╡реНрд╣рд╛рдиреЛрд╡рд┐рдЪ, рддреБрдореНрд╣реА рдорд▓рд╛ рдХрд╛рдп рд╡рд╛рдЪрд╛рд╡реЗ рдпрд╛рдмрджреНрджрд▓ рд╕рд▓реНрд▓рд╛ рджреЗрдК рд╢рдХрддрд╛?

AI: рдкреНрд░рдердо, рд╡рд╛рдЪрд╛ рдбреЙрдХрд░ рд╡рд┐рдХрд╕рдХрд╛рдВрдХрдбреВрди рд╢рд┐рдлрд╛рд░рд╕реА, рддреНрдпрд╛рдВрдЪреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдбреЙрдХрд░рд▓рд╛ рдХреНрд╡рдЪрд┐рддрдЪ рдХреЛрдгреА рдУрд│рдЦрдд рдЕрд╕реЗрд▓.

рдЖрдгрд┐ рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдЗрдВрдЯрд░реНрдирд╢рд┐рдк рдорд┐рд│рд╡рд╛рдпрдЪреА рдЕрд╕реЗрд▓ рддрд░ рдЬрд╛ рдЧрд╣рди. рд╢реЗрд╡рдЯреА, рдЕрднреНрдпрд╛рд╕рд╛рд╢рд┐рд╡рд╛рдп рд╕рд┐рджреНрдзрд╛рдВрдд рдореГрдд рдЖрд╣реЗ.

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

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