เดธเดฟเด‚เด—เดฟเตพ เดชเต‡เดœเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เดตเดฟเดคเดฐเดฃเดคเตเดคเดฟเดจเตเดณเตเดณ เดกเต‹เด•เตเด•เตผ เดšเดฟเดคเตเดฐเด‚

เดธเดฟเด‚เด—เดฟเตพ-เดชเต‡เดœเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป (SPA) เดŽเดจเตเดจเดคเต เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต JavaScript, HTML เดซเดฏเดฒเตเด•เดณเตเดŸเต†เดฏเตเด‚ เดšเดฟเดคเตเดฐเด™เตเด™เดณเตเดŸเต†เดฏเตเด‚ เดฎเดฑเตเดฑเต เด‰เดฑเดตเดฟเดŸเด™เตเด™เดณเตเดŸเต†เดฏเตเด‚ เด’เดฐเต เด•เต‚เดŸเตเดŸเดฎเดพเดฃเต. เด…เดต เดšเดฒเดจเดพเดคเตเดฎเด•เดฎเดพเดฏเดฟ เดฎเดพเดฑเดพเดคเตเดคเดคเดฟเดจเดพเตฝ, เด…เดต เด“เตบเดฒเตˆเดจเดฟเตฝ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เดตเดณเดฐเต† เดŽเดณเตเดชเตเดชเดฎเดพเดฃเต. เดฒเดณเดฟเดคเดฎเดพเดฏ GitHub เดชเต‡เดœเตเด•เดณเดฟเตฝ เดคเตเดŸเด™เตเด™เดฟ (เดšเดฟเดฒเตผเด•เตเด•เต narod.ru-เตฝ เดชเต‹เดฒเตเด‚) เด†เดฎเดธเต‹เตบ S3 เดชเต‹เดฒเต†เดฏเตเดณเตเดณ CDN-เตฝ เด…เดตเดธเดพเดจเดฟเด•เตเด•เตเดจเตเดจ เดตเดฟเดฒเด•เตเดฑเดžเตเดžเดคเตเด‚ เดธเต—เดœเดจเตเดฏเดตเตเดฎเดพเดฏ เดจเดฟเดฐเดตเดงเดฟ เดธเต‡เดตเดจเด™เตเด™เตพ เด‡เดคเดฟเดจเดพเดฏเดฟ เดฒเดญเตเดฏเดฎเดพเดฃเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดŽเดจเดฟเด•เตเด•เต เดฎเดฑเตเดฑเต†เดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต.

เดŽเดจเดฟเด•เตเด•เต SPA เด‰เดณเตเดณ เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด‡เดฎเต‡เดœเต เด†เดตเดถเตเดฏเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด…เดคเตเดตเดดเดฟ เด’เดฐเต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดจเตเดฑเต† เดญเดพเด—เดฎเดพเดฏเตเดณเตเดณ เดจเดฟเตผเดฎเตเดฎเดพเดฃเดคเตเดคเดฟเดฒเตเด‚ SPA เดŽเดจเตเดคเดพเดฃเต†เดจเตเดจเต เด…เดฑเดฟเดฏเดพเดคเตเดค เด’เดฐเต เดฌเดพเด•เตเด•เต-เดŽเตปเดกเต เดกเต†เดตเดฒเดชเตเดชเดฑเตเดŸเต† เดฎเต†เดทเต€เดจเดฟเดฒเตเด‚ เด‡เดคเต เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เดพเดจเดพเด•เตเด‚.

เดŽเดจเดฟเด•เตเด•เดพเดฏเดฟ เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดšเดฟเดคเตเดฐ เด†เดตเดถเตเดฏเด•เดคเด•เตพ เดžเดพเตป เดจเดฟเตผเดฃเตเดฃเดฏเดฟเดšเตเดšเต:

  • เด‰เดชเดฏเต‹เด—เดคเตเดคเดฟเดจเตเดฑเต† เดŽเดณเตเดชเตเดชเด‚ (เดชเด•เตเดทเต‡ เด…เดธเด‚เดฌเตเดฒเดฟ เด…เดฒเตเดฒ);
  • เดกเดฟเดธเตเด•เดฟเดจเตเดฑเต†เดฏเตเด‚ เดฑเดพเดฎเดฟเดจเตเดฑเต†เดฏเตเด‚ เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ เดเดฑเตเดฑเดตเตเด‚ เด•เตเดฑเดžเตเดž เดตเดฒเตเดชเตเดชเด‚;
  • เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดตเดดเดฟเดฏเตเดณเตเดณ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป, เด…เดคเดฟเดฒเต‚เดŸเต† เดšเดฟเดคเตเดฐเด‚ เดตเตเดฏเดคเตเดฏเดธเตเดค เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เดณเดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚;
  • เดซเดฏเดฒเตเด•เดณเตเดŸเต† เดเดฑเตเดฑเดตเตเด‚ เด•เดพเดฐเตเดฏเด•เตเดทเดฎเดฎเดพเดฏ เดตเดฟเดคเดฐเดฃเด‚.

เดŽเด™เตเด™เดจเต†เดฏเต†เดจเตเดจเต เด‡เดจเตเดจเต เดžเดพเตป เดจเดฟเด™เตเด™เดณเต‹เดŸเต เดชเดฑเดฏเตเด‚:

  • เด•เตเดŸเตฝ nginx;
  • เด‰เดฑเดตเดฟเดŸเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดฌเตเดฐเต‹เดŸเตเดŸเตเดฒเดฟ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเด•;
  • เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดพเตป เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เดซเดฏเดฒเตเด•เตพ เดชเด เดฟเดชเตเดชเดฟเด•เตเด•เตเด•;
  • เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚ เด‡เดคเดฟเตฝ เดจเดฟเดจเตเดจเต†เดฒเตเดฒเดพเด‚ เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด‡เดฎเต‡เดœเต เดŽเด™เตเด™เดจเต† เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เดพเด‚.

เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เด‰เดฆเตเดฆเต‡เดถเด‚ เดŽเดจเตเดฑเต† เด…เดจเตเดญเดตเด‚ เดชเด™เตเด•เตเดตเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ เด…เดจเตเดญเดตเดชเดฐเดฟเดšเดฏเดฎเตเดณเตเดณ เด•เดฎเตเดฎเตเดฏเต‚เดฃเดฟเดฑเตเดฑเดฟ เด…เด‚เด—เด™เตเด™เดณเต† เด•เตเดฐเดฟเดฏเดพเดคเตเดฎเด•เดฎเดพเดฏ เดตเดฟเดฎเตผเดถเดจเดคเตเดคเดฟเดจเต เดชเตเดฐเต‡เดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด• เดŽเดจเตเดจเดคเดพเดฃเต.

เด…เดธเด‚เดฌเตเดฒเดฟเด•เตเด•เดพเดฏเดฟ เด’เดฐเต เด‡เดฎเต‡เดœเต เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเต

เด…เดตเดธเดพเดจ เดกเต‹เด•เตเด•เตผ เด‡เดฎเต‡เดœเต เดตเดฒเตเดชเตเดชเดคเตเดคเดฟเตฝ เดšเต†เดฑเตเดคเดพเด•เตเด•เดพเตป, เดจเดฟเด™เตเด™เตพ เดฐเดฃเตเดŸเต เดจเดฟเดฏเดฎเด™เตเด™เตพ เดชเดพเดฒเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต: เด•เตเดฑเดžเตเดžเดคเต เดฒเต†เดฏเดฑเตเด•เดณเตเด‚ เดฎเดฟเดจเดฟเดฎเดฒเดฟเดธเตเดฑเตเดฑเดฟเด•เต เด…เดŸเดฟเดธเตเดฅเดพเดจ เดšเดฟเดคเตเดฐเดตเตเด‚. เดเดฑเตเดฑเดตเตเด‚ เดšเต†เดฑเดฟเดฏ เด…เดŸเดฟเดธเตเดฅเดพเดจ เดšเดฟเดคเตเดฐเด™เตเด™เดณเดฟเดฒเตŠเดจเตเดจเดพเดฃเต เด†เตฝเดชเตˆเตป เดฒเดฟเดจเด•เตเดธเต เด‡เดฎเต‡เดœเต, เด…เดคเดฟเดจเดพเตฝ เดžเดพเตป เด…เดคเต เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด‚. เด†เตฝเดชเตˆเตป เด‰เตฝเดชเดพเดฆเดจเดคเตเดคเดฟเดจเต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดฒเตเดฒเต†เดจเตเดจเต เดšเดฟเดฒเตผ เดตเดพเดฆเดฟเดšเตเดšเต‡เด•เตเด•เดพเด‚, เด…เดต เดถเดฐเดฟเดฏเดพเดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚. เดŽเดจเตเดจเดพเตฝ เดตเตเดฏเด•เตเดคเดฟเดชเดฐเดฎเดพเดฏเดฟ, เดŽเดจเดฟเด•เตเด•เต เด…เดฆเตเดฆเต‡เดนเดตเตเดฎเดพเดฏเดฟ เด’เดฐเต เดชเตเดฐเดถเตโ€Œเดจเดตเตเด‚ เด‰เดฃเตเดŸเดพเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒ, เด…เดฆเตเดฆเต‡เดนเดคเตเดคเดฟเดจเต†เดคเดฟเดฐเต† เดตเดพเดฆเด™เตเด™เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ.

เด•เตเดฑเดšเตเดšเต เดฒเต†เดฏเดฑเตเด•เตพ เดฒเดญเดฟเด•เตเด•เดพเตป, เดžเดพเตป เดšเดฟเดคเตเดฐเด‚ 2 เด˜เดŸเตเดŸเด™เตเด™เดณเดฟเดฒเดพเดฏเดฟ เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เตเด‚. เด†เดฆเตเดฏเดคเตเดคเต‡เดคเต เด’เดฐเต เดกเตเดฐเดพเดซเตเดฑเตเดฑเดพเดฃเต; เดŽเดฒเตเดฒเดพ เดธเดนเดพเดฏ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เดณเตเด‚ เดคเดพเตฝเด•เตเด•เดพเดฒเดฟเด• เดซเดฏเดฒเตเด•เดณเตเด‚ เด…เดคเดฟเตฝ เดจเดฟเดฒเดจเดฟเตฝเด•เตเด•เตเด‚. เด…เดตเดธเดพเดจ เด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ เดžเดพเตป เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เด…เดตเดธเดพเดจ เดชเดคเดฟเดชเตเดชเต เดฎเดพเดคเตเดฐเดฎเต‡ เดŽเดดเตเดคเตเด•เดฏเตเดณเตเดณเต‚.

เดธเดนเดพเดฏ เดšเดฟเดคเตเดฐเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฎเตเด•เตเด•เต เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเด‚.

เด’เดฐเต SPA เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ node.js เด†เดตเดถเตเดฏเดฎเดพเดฃเต. npm, เดจเต‚เตฝ เดชเดพเด•เตเด•เต‡เดœเต เดฎเดพเดจเต‡เดœเตผเดฎเดพเตผเด•เตเด•เตŠเดชเตเดชเด‚ เดตเดฐเตเดจเตเดจ เด”เดฆเตเดฏเต‹เด—เดฟเด• เดšเดฟเดคเตเดฐเด‚ เดžเดพเตป เดŽเดŸเตเด•เตเด•เตเด‚. เดŽเดจเตเดฑเต† เดชเต‡เดฐเดฟเตฝ, เดžเดพเตป เดšเดฟเดฒ npm เดชเดพเด•เตเด•เต‡เดœเตเด•เตพ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเตป เด†เดตเดถเตเดฏเดฎเดพเดฏ node-gyp เด‰เด‚ Google-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ Brotli เด•เด‚เดชเตเดฐเดธเตเดธเดฑเตเด‚ เดšเต‡เตผเด•เตเด•เตเด‚, เด…เดคเต เดชเดฟเดจเตเดจเต€เดŸเต เดžเด™เตเด™เตพเด•เตเด•เต เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเด•เตเด‚.

เด…เดญเดฟเดชเตเดฐเดพเดฏเด™เตเด™เดณเตเดณเตเดณ เดกเต‹เด•เตเด•เตผเดซเดฏเตฝ.

# ะ‘ะฐะทะพะฒั‹ะน ะพะฑั€ะฐะท
FROM node:12-alpine
LABEL maintainer="Aleksey Maydokin <[email protected]>"
ENV BROTLI_VERSION 1.0.7
# ะŸะฐะบะตั‚ั‹, ะบะพั‚ะพั€ั‹ะต ะฝัƒะถะฝั‹, ั‡ั‚ะพะฑั‹ ัะพะฑั€ะฐั‚ัŒ ะธะท ะธัั…ะพะดะฝะธะบะพะฒ Brotli
RUN apk add --no-cache --virtual .build-deps 
        bash 
        gcc 
        libc-dev 
        make 
        linux-headers 
        cmake 
        curl 
    && mkdir -p /usr/src 
    # ะ˜ัั…ะพะดะฝะธะบะธ Brotli ัะบะฐั‡ะธะฒะฐะตะผ ะธะท ะพั„ะธั†ะธะฐะปัŒะฝะพะณะพ ั€ะตะฟะพะทะธั‚ะพั€ะธั
    && curl -LSs https://github.com/google/brotli/archive/v$BROTLI_VERSION.tar.gz | tar xzf - -C /usr/src 
    && cd /usr/src/brotli-$BROTLI_VERSION 
    # ะšะพะผะฟะธะปะธั€ัƒะตะผ Brotli
    && ./configure-cmake --disable-debug && make -j$(getconf _NPROCESSORS_ONLN) && make install 
    # ะ”ะพะฑะฐะฒะปัะตะผ node-gyp
    && yarn global add node-gyp 
    # ะฃะฑะธั€ะฐะตะผ ะทะฐ ัะพะฑะพะน ะผัƒัะพั€
    && apk del .build-deps && yarn cache clean && rm -rf /usr/src

เด‡เดคเดฟเดจเด•เด‚ เด‡เดตเดฟเดŸเต† เดžเดพเตป เดฎเดฟเดจเดฟเดฎเดฒเดฟเดธเดคเตเดคเดฟเดจเดพเดฏเดฟ เดชเต‹เดฐเดพเดŸเตเด•เดฏเดพเดฃเต, เด…เดคเดฟเดจเดพเตฝ เด’เดฐเต เดตเดฒเดฟเดฏ เดŸเต€เดฎเดพเดฃเต เดšเดฟเดคเตเดฐเด‚ เด’เดฐเตเดฎเดฟเดšเตเดšเต เดšเต‡เตผเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต.

เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏ เดšเดฟเดคเตเดฐเด‚ เด‡เดตเดฟเดŸเต† เด•เดพเดฃเดพเด‚: https://hub.docker.com/r/alexxxnf/spa-builder. เดฎเดฑเตเดฑเตเดณเตเดณเดตเดฐเตเดŸเต† เดšเดฟเดคเตเดฐเด™เตเด™เดณเต† เด†เดถเตเดฐเดฏเดฟเด•เตเด•เดฐเตเดคเต†เดจเตเดจเตเด‚ เดจเดฟเด™เตเด™เดณเตเดŸเต‡เดคเต เดถเต‡เด–เดฐเดฟเด•เตเด•เดฐเตเดคเต†เดจเตเดจเตเด‚ เดžเดพเตป เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเตเดตเต†เด™เตเด•เดฟเดฒเตเด‚.

nginx

เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เด‰เดณเตเดณเดŸเด•เตเด•เด‚ เดตเดฟเดคเดฐเดฃเด‚ เดšเต†เดฏเตเดฏเดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดเดคเต เดตเต†เดฌเต เดธเต†เตผเดตเดฑเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚. เดžเดพเตป nginx-เตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเต เดชเดคเดฟเดตเดพเดฃเต, เด…เดคเดฟเดจเดพเตฝ เดžเดพเตป เด‡เดชเตเดชเต‹เตพ เด…เดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚.

Nginx-เดจเต เด’เดฐเต เด”เดฆเตเดฏเต‹เด—เดฟเด• เดกเต‹เด•เตเด•เตผ เด‡เดฎเต‡เดœเต เด‰เดฃเตเดŸเต, เดŽเดจเตเดจเดพเตฝ เดฒเดณเดฟเดคเดฎเดพเดฏ เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เดกเดฟเดธเตเดŸเตเดฐเดฟเดฌเตเดฏเต‚เดทเดจเตเดตเต‡เดฃเตเดŸเดฟ เด‡เดคเดฟเดจเต เดงเดพเดฐเดพเดณเด‚ เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เตพ เด‰เดฃเตเดŸเต. เดกเต†เดฒเดฟเดตเดฑเดฟเดฏเดฟเตฝ เด‰เตพเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดต เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดŸเต€เดฎเดฟเดจเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด”เดฆเตเดฏเต‹เด—เดฟเด• เดกเต‹เด•เตเด•เตผเดซเดฏเดฒเดฟเตฝ เด•เดพเดฃเดพเตป เด•เดดเดฟเดฏเตเด‚.

$ เดกเต‹เด•เตเด•เตผ เดฑเตบ --rm nginx:1-alpine nginx -V

nginx version: nginx/1.17.9
built by gcc 8.3.0 (Alpine 8.3.0) 
built with OpenSSL 1.1.1d  10 Sep 2019
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-perl_modules_path=/usr/lib/perl5/vendor_perl --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-Os -fomit-frame-pointer' --with-ld-opt=-Wl,--as-needed

เดžเดพเตป เดกเต‹เด•เตเด•เตผเดซเดฏเตฝ เด’เดฐเต เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚, เดŽเดจเตเดจเดพเตฝ เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เด‰เดณเตเดณเดŸเด•เตเด•เด‚ เดตเดฟเดคเดฐเดฃเด‚ เดšเต†เดฏเตเดฏเดพเตป เด†เดตเดถเตเดฏเดฎเตเดณเตเดณเดคเต เดฎเดพเดคเตเดฐเด‚ เดžเดพเตป เด…เดคเดฟเตฝ เด‡เดŸเตเด‚. เดŽเดจเตเดฑเต† เดชเดคเดฟเดชเตเดชเดฟเดจเต HTTPS-เตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ, เด…เด‚เด—เต€เด•เดพเดฐเดคเตเดคเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เดฟเดฒเตเดฒ, เด•เต‚เดŸเดพเดคเต† เดฎเดฑเตเดฑเต เดชเดฒเดคเตเด‚. เดŽเดจเตเดจเดพเตฝ เดŽเดจเตเดฑเต† เดชเดคเดฟเดชเตเดชเดฟเดจเต เดฌเตเดฐเต‹เดŸเตโ€Œเดฒเดฟ เด…เตฝเด—เต‹เดฐเดฟเดคเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เด‚เดชเตเดฐเดธเต เดšเต†เดฏเตโ€Œเดค เดซเดฏเดฒเตเด•เตพ เดตเดฟเดคเดฐเดฃเด‚ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚, เด…เดคเต gzip-เดจเต‡เด•เตเด•เดพเตพ เด…เตฝเดชเตเดชเด‚ เด•เต‚เดŸเตเดคเตฝ เด•เดพเดฐเตเดฏเด•เตเดทเดฎเดฎเดพเดฃเต. เดžเด™เตเด™เตพ เดซเดฏเดฒเตเด•เตพ เด’เดฐเดฟเด•เตเด•เตฝ เด•เด‚เดชเตเดฐเดธเตเดธเตเดšเต†เดฏเตเดฏเตเด‚; เดˆเดšเตเดšเดฏเดฟเตฝ เด‡เดคเต เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเดฟเดฒเตเดฒ.

เด‡เดคเดพเดฃเต เดžเดพเตป เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเดšเตเดš Dockerfile. เดฑเดทเตเดฏเตป เดญเดพเดทเดฏเดฟเดฒเตเดณเตเดณ เด…เดญเดฟเดชเตเดฐเดพเดฏเด™เตเด™เตพ เดŽเดจเตเดฑเต‡เดคเดพเดฃเต, เด‡เด‚เด—เตเดฒเต€เดทเดฟเตฝ - เด’เดฑเดฟเดœเดฟเดจเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต.

Dockerfile

# ะ‘ะฐะทะพะฒั‹ะน ะพะฑั€ะฐะท ัะฝะพะฒะฐ Alpine
FROM alpine:3.9
LABEL maintainer="Aleksey Maydokin <[email protected]>"
ENV NGINX_VERSION 1.16.0
ENV NGX_BROTLI_VERSION 0.1.2
ENV BROTLI_VERSION 1.0.7
RUN set -x 
    && addgroup -S nginx 
    && adduser -D -S -h /var/cache/nginx -s /sbin/nologin -G nginx nginx 
# ะฃัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฟะฐะบะตั‚ั‹, ะบะพั‚ะพั€ั‹ะต ะฝัƒะถะฝั‹ ั‡ั‚ะพะฑั‹ ัะพะฑั€ะฐั‚ัŒ nginx ะธ ะผะพะดัƒะปัŒ ngx_brotli ะบ ะฝะตะผัƒ
    && apk add --no-cache --virtual .build-deps 
            gcc 
            libc-dev 
            make 
            linux-headers 
            curl 
    && mkdir -p /usr/src 
# ะกะบะฐั‡ะธะฒะฐะตะผ ะธัั…ะพะดะฝะธะบะธ
    && curl -LSs https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz | tar xzf - -C /usr/src 
    && curl -LSs https://github.com/eustas/ngx_brotli/archive/v$NGX_BROTLI_VERSION.tar.gz | tar xzf - -C /usr/src 
    && curl -LSs https://github.com/google/brotli/archive/v$BROTLI_VERSION.tar.gz | tar xzf - -C /usr/src 
    && rm -rf /usr/src/ngx_brotli-$NGX_BROTLI_VERSION/deps/brotli/ 
    && ln -s /usr/src/brotli-$BROTLI_VERSION /usr/src/ngx_brotli-$NGX_BROTLI_VERSION/deps/brotli 
    && cd /usr/src/nginx-$NGINX_VERSION 
    && CNF="
            --prefix=/etc/nginx 
            --sbin-path=/usr/sbin/nginx 
            --modules-path=/usr/lib/nginx/modules 
            --conf-path=/etc/nginx/nginx.conf 
            --error-log-path=/var/log/nginx/error.log 
            --http-log-path=/var/log/nginx/access.log 
            --pid-path=/var/run/nginx.pid 
            --lock-path=/var/run/nginx.lock 
            --http-client-body-temp-path=/var/cache/nginx/client_temp 
            --http-proxy-temp-path=/var/cache/nginx/proxy_temp 
            --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp 
            --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp 
            --http-scgi-temp-path=/var/cache/nginx/scgi_temp 
            --user=nginx 
            --group=nginx 
            --without-http_ssi_module 
            --without-http_userid_module 
            --without-http_access_module 
            --without-http_auth_basic_module 
            --without-http_mirror_module 
            --without-http_autoindex_module 
            --without-http_geo_module 
            --without-http_split_clients_module 
            --without-http_referer_module 
            --without-http_rewrite_module 
            --without-http_proxy_module 
            --without-http_fastcgi_module 
            --without-http_uwsgi_module 
            --without-http_scgi_module 
            --without-http_grpc_module 
            --without-http_memcached_module 
            --without-http_limit_conn_module 
            --without-http_limit_req_module 
            --without-http_empty_gif_module 
            --without-http_browser_module 
            --without-http_upstream_hash_module 
            --without-http_upstream_ip_hash_module 
            --without-http_upstream_least_conn_module 
            --without-http_upstream_keepalive_module 
            --without-http_upstream_zone_module 
            --without-http_gzip_module 
            --with-http_gzip_static_module 
            --with-threads 
            --with-compat 
            --with-file-aio 
            --add-dynamic-module=/usr/src/ngx_brotli-$NGX_BROTLI_VERSION 
    " 
# ะกะพะฑะธั€ะฐะตะผ
    && ./configure $CNF 
    && make -j$(getconf _NPROCESSORS_ONLN) 
    && make install 
    && rm -rf /usr/src/ 
# ะฃะดะฐะปัะตะผ ะดะธะฝะฐะผะธั‡ะตัะบะธะน brotli ะผะพะดัƒะปัŒ, ะพัั‚ะฐะฒะปัั ั‚ะพะปัŒะบะพ ัั‚ะฐั‚ะธั‡ะตัะบะธะน
    && rm /usr/lib/nginx/modules/ngx_http_brotli_filter_module.so 
    && sed -i '$ d' /etc/apk/repositories 
# Bring in gettext so we can get `envsubst`, then throw
# the rest away. To do this, we need to install `gettext`
# then move `envsubst` out of the way so `gettext` can
# be deleted completely, then move `envsubst` back.
    && apk add --no-cache --virtual .gettext gettext 
    && mv /usr/bin/envsubst /tmp/ 
    && runDeps="$( 
        scanelf --needed --nobanner /usr/sbin/nginx /usr/lib/nginx/modules/*.so /tmp/envsubst 
            | awk '{ gsub(/,/, "nso:", $2); print "so:" $2 }' 
            | sort -u 
            | xargs -r apk info --installed 
            | sort -u 
    )" 
    && apk add --no-cache $runDeps 
    && apk del .build-deps 
    && apk del .gettext 
    && mv /tmp/envsubst /usr/local/bin/ 
# Bring in tzdata so users could set the timezones through the environment
# variables
    && apk add --no-cache tzdata 
# forward request and error logs to docker log collector
    && ln -sf /dev/stdout /var/log/nginx/access.log 
    && ln -sf /dev/stderr /var/log/nginx/error.log
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
STOPSIGNAL SIGTERM
CMD ["nginx", "-g", "daemon off;"]

เดžเดพเตป เด‰เดŸเดจเดŸเดฟ nginx.conf เดถเดฐเดฟเดฏเดพเด•เตเด•เตเด‚, เด…เด™เตเด™เดจเต† gzip, brotli เดŽเดจเตเดจเดฟเดต เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เตเด‚. เด•เดพเดทเดฟเด‚เด—เต เดนเต†เดกเดฑเตเด•เดณเตเด‚ เดžเดพเตป เด‰เตพเดชเตเดชเต†เดŸเตเดคเตเดคเตเด‚, เด•เดพเดฐเดฃเด‚ เดžเด™เตเด™เตพ เด’เดฐเดฟเด•เตเด•เดฒเตเด‚ เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เดฎเดพเดฑเตเดฑเดฟเดฒเตเดฒ. เดŽเดฒเตเดฒเดพ 404 เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เดณเตเด‚ index.html-เดฒเต‡เด•เตเด•เต เดฑเต€เดกเดฏเดฑเด•เตโ€ŒเดŸเต เดšเต†เดฏเตเดฏเตเด• เดŽเดจเตเดจเดคเดพเดฃเต เด…เดตเดธเดพเดจ เดธเตเดชเตผเดถเดจเด‚, SPA-เดฏเดฟเดฒเต† เดจเดพเดตเดฟเด—เต‡เดทเดจเต เด‡เดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต.

nginx.conf

user nginx;
worker_processes  1;
error_log /var/log/nginx/error.log warn;
pid       /var/run/nginx.pid;
load_module /usr/lib/nginx/modules/ngx_http_brotli_static_module.so;
events {
    worker_connections 1024;
}
http {
    include      mime.types;
    default_type application/octet-stream;
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx/access.log main;
    sendfile on;
    keepalive_timeout 65;
    gzip_static   on;
    brotli_static on;
    server {
        listen      80;
        server_name localhost;
        charset utf-8;
        location / {
            root html;
            try_files $uri /index.html;
            etag on;
            expires max;
            add_header Cache-Control public;
            location = /index.html {
                expires 0;
                add_header Cache-Control "no-cache, public, must-revalidate, proxy-revalidate";
            }
        }
    }
}

เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏ เดšเดฟเดคเตเดฐเด‚ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดตเดฟเดŸเต† เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเด‚: https://hub.docker.com/r/alexxxnf/nginx-spa. เด‡เดคเต 10,5 MB เดŽเดŸเตเด•เตเด•เตเด‚. เดฏเดฅเดพเตผเดคเตเดฅ nginx 19,7 MB เดŽเดŸเตเดคเตเดคเต. เดŽเดจเตเดฑเต† เด•เดพเดฏเดฟเด• เดคเดพเตฝเดชเดฐเตเดฏเด‚ เดคเตƒเดชเตเดคเดฟเด•เดฐเดฎเดพเดฃเต.

เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดฎเดจเดธเดฟเดฒเดพเด•เตเด•เดพเตป เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เตเดธเต เดชเด เดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต

เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเต SPA-เดฏเดฟเตฝ เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ เด†เดตเดถเตเดฏเดฎเดพเดฏเดฟ เดตเดจเตเดจเต‡เด•เตเด•เดพเด‚? เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดเดคเต RESTful API เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดฃเดฎเต†เดจเตเดจเต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต. เดธเดพเดงเดพเดฐเดฃเด—เดคเดฟเดฏเดฟเตฝ, เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เตเด•เตเดณเตเดณ เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ เดฌเดฟเตฝเดกเต เด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ SPA-เดฏเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดฑเตเดฑเตเดจเตเดจเต. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดฎเดพเดฑเตเดฑเดฃเดฎเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเตเดจเตผเดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดŽเดจเดฟเด•เตเด•เต เด…เดคเต เดตเต‡เดฃเตเดŸ. CI เด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ เด’เดฐเดฟเด•เตเด•เตฝ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดฃเดฎเต†เดจเตเดจเตเด‚, เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต CD เด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ เด†เดตเดถเตเดฏเดฎเตเดณเตเดณเดคเตเดฐ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเดฃเดฎเต†เดจเตเดจเตเด‚ เดžเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต.

เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เดซเดฏเดฒเตเด•เตพเด•เตเด•เต เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เดณเตŠเดจเตเดจเตเด‚ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเดจเตเดจเดฟเดฒเตเดฒ. เด…เดคเดฟเดจเดพเตฝ, เดจเดฟเด™เตเด™เตพ เด’เดฐเต เดคเดจเตเดคเตเดฐเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เต‡เดฃเตเดŸเดฟเดตเดฐเตเด‚. เด…เดตเดธเดพเดจ เดšเดฟเดคเตเดฐเดคเตเดคเดฟเตฝ, เดžเดพเตป nginx เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เดฟเดฒเตเดฒ, เดฎเดฑเดฟเดšเตเดšเต เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดตเดพเดฏเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด…เดต เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เดซเดฏเดฒเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดŽเดดเตเดคเตเด•เดฏเตเด‚ เด…เดตเดฏเต† เด•เด‚เดชเตเดฐเดธเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดคเตเดŸเตผเดจเตเดจเต เดฎเดพเดคเตเดฐเด‚ เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด‚ nginx-เดฒเต‡เด•เตเด•เต เดฎเดพเดฑเตเดฑเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดทเต†เตฝ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต.

เดˆ เด†เดตเดถเตเดฏเดคเตเดคเดฟเดจเดพเดฏเดฟ, เดกเต‹เด•เตเด•เตผเดซเดฏเตฝ ENTRYPOINT เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเตผ เดจเตฝเด•เตเดจเตเดจเต. เดจเดฎเตเด•เตเด•เต เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดจเตฝเด•เดพเด‚ (เด•เต‹เดฃเดฟเด• เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเดฎเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต):

docker-entrypoint.sh

#!/bin/sh
set -e
FLAG_FILE="/configured"
TARGET_DIR="/etc/nginx/html"
replace_vars () {
  ENV_VARS='$(awk 'BEGIN{for(v in ENVIRON) print "

quot;v}')'
# ะ’ Angular ะธั‰ะตะผ ะฟะปะตะนัั…ะพะปะดะตั€ั‹ ะฒ main-ั„ะฐะนะปะฐั…
for f in "$TARGET_DIR"/main*.js; do
# envsubst ะทะฐะผะตะฝัะตั‚ ะฒ ั„ะฐะนะปะฐั… ะฟะปะตะนัั…ะพะปะดะตั€ั‹ ะฝะฐ ะทะฝะฐั‡ะตะฝะธั ะธะท ะฟะตั€ะตะผะตะฝะฝั‹ั… ะพะบั€ัƒะถะตะฝะธั
echo "$(envsubst "$ENV_VARS" < "$f")" > "$f"
done
}
compress () {
for i in $(find "$TARGET_DIR" | grep -E ".css$|.html$|.js$|.svg$|.txt$|.ttf


quot;); do
# ะ˜ัะฟะพะปัŒะทัƒะตะผ ะผะฐะบัะธะผะฐะปัŒะฝัƒัŽ ัั‚ะตะฟะตะฝัŒ ัะถะฐั‚ะธั
gzip -9kf "$i" && brotli -fZ "$i"
done
}
if [ "$1" = 'nginx' ]; then
# ะคะปะฐะณ ะฝัƒะถะตะฝ, ั‡ั‚ะพะฑั‹ ะฒั‹ะฟะพะปะฝะธั‚ัŒ ัะบั€ะธะฟั‚ ั‚ะพะปัŒะบะพ ะฟั€ะธ ัะฐะผะพะผ ะฟะตั€ะฒะพะผ ะทะฐะฟัƒัะบะต
if [ ! -e "$FLAG_FILE" ]; then
echo "Running init script"
echo "Replacing env vars"
replace_vars
echo "Compressing files"
compress
touch $FLAG_FILE
echo "Done"
fi
fi
exec "$@"

เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด…เดคเดฟเดจเตเดฑเต† เดœเต‹เดฒเดฟ เดจเดฟเตผเดตเดนเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ เดˆ เดซเต‹เดฎเดฟเตฝ js เดซเดฏเดฒเตเด•เดณเดฟเตฝ เดŽเดดเตเดคเดฃเด‚: ${API_URL}.

เดฎเดฟเด•เตเด• เด†เดงเตเดจเดฟเด• SPA-เด•เดณเตเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด…เดตเดฐเตเดŸเต† เดซเดฏเดฒเตเด•เดณเดฟเตฝ เดนเดพเดทเตเด•เตพ เดšเต‡เตผเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดพเดฃเต. เดฌเตเดฐเต—เดธเดฑเดฟเดจเต เดตเดณเดฐเต†เด•เตเด•เดพเดฒเด‚ เดซเดฏเตฝ เดธเตเดฐเด•เตเดทเดฟเดคเดฎเดพเดฏเดฟ เด•เดพเดทเต† เดšเต†เดฏเตเดฏเดพเตป เด‡เดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เดซเดฏเตฝ เดฎเดพเดฑเตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด…เดคเดฟเดจเตเดฑเต† เดนเดพเดทเต เดฎเดพเดฑเตเด‚, เด…เดคเต เดซเดฏเตฝ เดตเต€เดฃเตเดŸเตเด‚ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเตป เดฌเตเดฐเต—เดธเดฑเดฟเดจเต† เดชเตเดฐเต‡เดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚.

เดจเดฟเตผเดญเดพเด—เตเดฏเดตเดถเดพเตฝ, เดŽเดจเตเดฑเต† เดฐเต€เดคเดฟเดฏเดฟเตฝ, เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดตเดดเดฟ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเต เดซเดฏเตฝ เดนเดพเดทเดฟเตฝ เด’เดฐเต เดฎเดพเดฑเตเดฑเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดจเดฏเดฟเด•เตเด•เดฟเดฒเตเดฒ, เด…เดคเดพเดฏเดคเต เดฌเตเดฐเต—เดธเตผ เด•เดพเดทเต† เดฎเดฑเตเดฑเต‡เดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดฐเต€เดคเดฟเดฏเดฟเตฝ เด…เดธเดพเดงเตเดตเดพเด•เตเด•เดฃเด‚. เดตเตเดฏเดคเตเดฏเดธเตเดค เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเตเด•เตพ เดตเตเดฏเดคเตเดฏเดธเตเดค เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เดณเดฟเตฝ เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ เดŽเดจเดฟเด•เตเด•เต เดˆ เดชเตเดฐเดถเตโ€Œเดจเดฎเดฟเดฒเตเดฒ.

เด…เดจเตเดคเดฟเดฎ เดšเดฟเดคเตเดฐเด‚ เด’เดฐเตเดฎเดฟเดšเตเดšเต เดšเต‡เตผเด•เตเด•เตเดจเตเดจเต

เด’เดŸเตเดตเดฟเตฝ.

Dockerfile

# ะŸะตั€ะฒั‹ะน ะฑะฐะทะพะฒั‹ะน ะพะฑั€ะฐะท ะดะปั ัะฑะพั€ะบะธ
FROM alexxxnf/spa-builder as builder
# ะงั‚ะพะฑั‹ ัั„ั„ะบั‚ะธะฒะฝะตะต ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะบััˆ Docker-ะฐ, ัะฝะฐั‡ะฐะปะฐ ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ั‚ะพะปัŒะบะพ ะทะฐะฒะธัะธะผะพัั‚ะธ
COPY ./package.json ./package-lock.json /app/
RUN cd /app && npm ci --no-audit
# ะŸะพั‚ะพะผ ัะพะฑะธั€ะฐะตะผ ัะฐะผะพ ะฟั€ะธะปะพะถะตะฝะธะต
COPY . /app
RUN cd /app && npm run build -- --prod --configuration=docker

# ะ’ั‚ะพั€ะพะน ะฑะฐะทะพะฒั‹ะน ะพะฑั€ะฐะท ะดะปั ั€ะฐะทะดะฐั‡ะธ
FROM alexxxnf/nginx-spa
# ะ—ะฐะฑะธั€ะฐะตะผ ะธะท ะฟะตั€ะฒะพะณะพ ะพะฑั€ะฐะทะฐ ัะฝะฐั‡ะฐะปะฐ ะบะพะผะฟั€ะตััะพั€
COPY --from=builder /usr/local/bin/brotli /usr/local/bin
# ะŸะพั‚ะพะผ ะดะพะฑะฐะฒะปัะตะผ ั‡ัƒะดะพ-ัะบั€ะธะฟั‚
COPY ./docker/docker-entrypoint.sh /docker-entrypoint.sh
# ะ˜ ะฒ ะบะพะฝั†ะต ะทะฐะฑะธั€ะฐะตะผ ัะฐะผะพ ะฟั€ะธะปะพะถะตะฝะธะต
COPY --from=builder /app/dist/app /etc/nginx/html/
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]

เด‡เดชเตเดชเต‹เตพ เดคเดคเตเดซเดฒเดฎเดพเดฏเตเดฃเตเดŸเดพเด•เตเดจเตเดจ เดšเดฟเดคเตเดฐเด‚ เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เดพเดจเตเด‚ เดŽเดตเดฟเดŸเต†เดฏเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com