เจธเจฟเฉฐเจ—เจฒ เจชเฉ‡เจœ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจตเฉฐเจก เจฒเจˆ เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐ

เจธเจฟเฉฐเจ—เจฒ-เจชเฉ‡เจœ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ (SPA) เจธเจฅเจฟเจฐ JavaScript เจ…เจคเฉ‡ HTML เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ-เจจเจพเจฒ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจธเจฐเฉ‹เจคเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเจฎเฉ‚เจน เจนเฉˆเฅค เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‰เจน เจ—เจคเฉ€เจธเจผเฉ€เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจฌเจฆเจฒเจฆเฉ‡, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ”เจจเจฒเจพเจˆเจจ เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจ•เจฐเจจเจพ เจฌเจนเฉเจค เจ†เจธเจพเจจ เจนเฉˆเฅค เจ‡เจธเจฆเฉ‡ เจฒเจˆ เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจธเจธเจคเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจ‡เฉฑเจฅเฉ‹เจ‚ เจคเฉฑเจ• เจ•เจฟ เจฎเฉเจซเจค เจธเฉ‡เจตเจพเจตเจพเจ‚ เจนเจจ, เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ GitHub เจชเฉฐเจจเจฟเจ†เจ‚ เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจนเฉเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ (เจ…เจคเฉ‡ เจ•เฉเจ เจฒเจˆ narod.ru เจจเจพเจฒ เจตเฉ€) เจ…เจคเฉ‡ เจเจฎเจพเจœเจผเจพเจจ S3 เจตเจฐเจ—เฉ‡ CDN เจจเจพเจฒ เจ–เจคเจฎ เจนเฉเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจฎเฉˆเจจเฉ‚เฉฐ เจ•เฉเจ เจนเฉ‹เจฐ เจšเจพเจนเฉ€เจฆเจพ เจธเฉ€เฅค

เจฎเฉˆเจจเฉ‚เฉฐ SPA เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐ เจฆเฉ€ เจฒเฉ‹เฉœ เจธเฉ€ เจคเจพเจ‚ เจœเฉ‹ เจ‡เจธเจจเฉ‚เฉฐ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ•เจฒเฉฑเจธเจŸเจฐ เจฆเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจตเจœเฉ‹เจ‚ เจ‰เจคเจชเจพเจฆเจจ เจตเจฟเฉฑเจš เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจฒเจพเจ‚เจš เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เฉ‡, เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจฌเฉˆเจ•-เจเจ‚เจก เจกเจฟเจตเฉˆเจฒเจชเจฐ เจฆเฉ€ เจฎเจธเจผเฉ€เจจ 'เจคเฉ‡ เจœเจฟเจธ เจจเฉ‚เฉฐ เจ‡เจน เจจเจนเฉ€เจ‚ เจชเจคเจพ เจ•เจฟ SPA เจ•เฉ€ เจนเฉˆเฅค

เจฎเฉˆเจ‚ เจ†เจชเจฃเฉ‡ เจฒเจˆ เจนเฉ‡เจ  เจฒเจฟเจ–เฉ€เจ†เจ‚ เจšเจฟเฉฑเจคเจฐ เจฒเฉ‹เฉœเจพเจ‚ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เฉ€เจคเฉ€เจ†เจ‚ เจนเจจ:

  • เจตเจฐเจคเจฃ เจฆเฉ€ เจธเฉŒเจ– (เจชเจฐ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจจเจนเฉ€เจ‚);
  • เจกเจฟเจธเจ• เจ…เจคเฉ‡ เจฐเฉˆเจฎ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจ†เจ•เจพเจฐ;
  • เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจฆเฉเจ†เจฐเจพ เจธเฉฐเจฐเจšเจจเจพ เจคเจพเจ‚ เจœเฉ‹ เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ เจตเฉฑเจ–-เจตเฉฑเจ– เจตเจพเจคเจพเจตเจฐเจฃเจพเจ‚ เจตเจฟเฉฑเจš เจตเจฐเจคเจฟเจ† เจœเจพ เจธเจ•เฉ‡;
  • เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ€ เจธเจญ เจคเฉ‹เจ‚ เจ•เฉเจธเจผเจฒ เจตเฉฐเจก.

เจ…เฉฑเจœ เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเฉฑเจธเจพเจ‚เจ—เจพ เจ•เจฟ เจ•เจฟเจตเฉ‡เจ‚:

  • gut nginx;
  • เจธเจฐเฉ‹เจคเจพเจ‚ เจคเฉ‹เจ‚ เจฌเจฐเฉ‹เจŸเจฒเฉ€ เจฌเจฃเจพเจ“;
  • เจธเจฅเจฟเจฐ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจจเฉ‚เฉฐ เจธเจฎเจเจฃ เจฒเจˆ เจธเจฟเจ–เจพเจ“;
  • เจ…เจคเฉ‡ เจฌเฉ‡เจธเจผเจ• เจ‡เจธ เจธเจญ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจเจพ เจนเฉˆ.

เจ‡เจธ เจฒเฉ‡เจ– เจฆเจพ เจ‰เจฆเฉ‡เจธเจผ เจฎเฉ‡เจฐเฉ‡ เจ…เจจเฉเจญเจต เจจเฉ‚เฉฐ เจธเจพเจ‚เจเจพ เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจคเจœเจฐเจฌเฉ‡เจ•เจพเจฐ เจญเจพเจˆเจšเจพเจฐเฉ‡ เจฆเฉ‡ เจฎเฉˆเจ‚เจฌเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ‰เจธเจพเจฐเฉ‚ เจ†เจฒเฉ‹เจšเจจเจพ เจฒเจˆ เจ‰เจ•เจธเจพเจ‰เจฃเจพ เจนเฉˆเฅค

เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจฒเจˆ เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจฌเจฃเจพเจ‰เจฃเจพ

เจซเจพเจˆเจจเจฒ เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ เจ†เจ•เจพเจฐ เจตเจฟเฉฑเจš เจ›เฉ‹เจŸเจพ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเฉ‹ เจจเจฟเจฏเจฎเจพเจ‚ เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ: เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจฒเฉ‡เจ…เจฐเจพเจ‚ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจ…เจงเจพเจฐ เจšเจฟเฉฑเจคเจฐเฅค เจธเจญ เจคเฉ‹เจ‚ เจ›เฉ‹เจŸเฉ€เจ†เจ‚ เจฌเฉ‡เจธ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจ…เจฒเจชเจพเจˆเจจ เจฒเฉ€เจจเจ•เจธ เจšเจฟเฉฑเจคเจฐ เจนเฉˆ, เจ‡เจธเจฒเจˆ เจ‡เจน เจ‰เจนเฉ€ เจนเฉˆ เจœเฉ‹ เจฎเฉˆเจ‚ เจšเฉเจฃเจพเจ‚เจ—เจพเฅค เจ•เฉเจ เจฒเฉ‹เจ• เจ‡เจน เจฆเจฒเฉ€เจฒ เจฆเฉ‡ เจธเจ•เจฆเฉ‡ เจนเจจ เจ•เจฟ เจเจฒเจชเจพเจˆเจจ เจ‰เจคเจชเจพเจฆเจจ เจฒเจˆ เจขเฉเจ•เจตเฉ€เจ‚ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ…เจคเฉ‡ เจ‰เจน เจธเจนเฉ€ เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจเฅค เจชเจฐ เจจเจฟเฉฑเจœเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡, เจฎเฉˆเจจเฉ‚เฉฐ เจ‰เจธ เจจเจพเจฒ เจ•เจฆเฉ‡ เจ•เฉ‹เจˆ เจธเจฎเฉฑเจธเจฟเจ† เจจเจนเฉ€เจ‚ เจ†เจˆ เจ…เจคเฉ‡ เจจเจพ เจนเฉ€ เจ‰เจธ เจตเจฟเจฐเฉเฉฑเจง เจ•เฉ‹เจˆ เจฆเจฒเฉ€เจฒ เจนเฉˆเฅค

เจ˜เฉฑเจŸ เจฒเฉ‡เจ…เจฐเจพเจ‚ เจฐเฉฑเจ–เจฃ เจฒเจˆ, เจฎเฉˆเจ‚ เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ 2 เจชเฉœเจพเจตเจพเจ‚ เจตเจฟเฉฑเจš เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจพเจ‚เจ—เจพเฅค เจชเจนเจฟเจฒเจพ เจ‡เฉฑเจ• เจกเจฐเจพเจซเจŸ เจนเฉˆ; เจธเจพเจฐเฉ€เจ†เจ‚ เจธเจนเจพเจ‡เจ• เจธเจนเฉ‚เจฒเจคเจพเจ‚ เจ…เจคเฉ‡ เจ…เจธเจฅเจพเจˆ เจซเจพเจˆเจฒเจพเจ‚ เจ‡เจธ เจตเจฟเฉฑเจš เจฐเจนเจฟเจฃเจ—เฉ€เจ†เจ‚เฅค เจ…เจคเฉ‡ เจ…เฉฐเจคเจฎ เจชเฉœเจพเจ… เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจธเจฟเจฐเจซ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเจพ เจ…เฉฐเจคเจฎ เจธเฉฐเจธเจ•เจฐเจฃ เจฒเจฟเจ–เจพเจ‚เจ—เจพเฅค

เจ†เจ‰ เจธเจนเจพเจ‡เจ• เจšเจฟเฉฑเจคเจฐ เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ€เจเฅค

เจ‡เฉฑเจ• SPA เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ node.js เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจฎเฉˆเจ‚ เจ…เจงเจฟเจ•เจพเจฐเจค เจšเจฟเฉฑเจคเจฐ เจฒเจตเจพเจ‚เจ—เจพ, เจœเฉ‹ เจ•เจฟ เจเจจเจชเฉ€เจเจฎ เจ…เจคเฉ‡ เจงเจพเจ—เฉ‡ เจฆเฉ‡ เจชเฉˆเจ•เฉ‡เจœ เจชเฉเจฐเจฌเฉฐเจงเจ•เจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจตเฉ€ เจ†เจ‰เจ‚เจฆเจพ เจนเฉˆเฅค เจฎเฉ‡เจฐเฉ€ เจ†เจชเจฃเฉ€ เจคเจฐเจซเฉ‹เจ‚, เจฎเฉˆเจ‚ เจจเฉ‹เจก-เจœเจฟเจช เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจพเจ‚เจ—เจพ, เจœเฉ‹ เจ•เจฟ เจ•เฉเจ เจเจจเจชเฉ€เจเจฎ เจชเฉˆเจ•เฉ‡เจœ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ—เฉ‚เจ—เจฒ เจคเฉ‹เจ‚ เจฌเจฐเฉ‹เจŸเจฒเฉ€ เจ•เฉฐเจชเฉเจฐเฉˆเจธเจฐ, เจœเฉ‹ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจธเจพเจกเฉ‡ เจฒเจˆ เจฒเจพเจญเจฆเจพเจ‡เจ• เจนเฉ‹เจตเฉ‡เจ—เจพ.

เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจฆเฉ‡ เจจเจพเจฒ เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ.

# ะ‘ะฐะทะพะฒั‹ะน ะพะฑั€ะฐะท
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 เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจ…เจงเจฟเจ•เจพเจฐเจค เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐ เจนเฉˆ, เจชเจฐ เจ‡เจธ เจตเจฟเฉฑเจš เจธเจงเจพเจฐเจจ เจธเจฅเจฟเจฐ เจตเฉฐเจก เจฒเจˆ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจนเจจ. เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจตเจฟเฉฑเจš เจ•เจฟเจนเฉœเฉ‡ เจฒเฉ‹เจ• เจธเจผเจพเจฎเจฒ เจนเจจ, เจ‡เฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผ เจŸเฉ€เจฎ เจฆเฉเจ†เจฐเจพ เจœเจพเจ‚ เจ…เจงเจฟเจ•เจพเจฐเจค เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจฆเฉ‡เจ–เจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค

$ docker run --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 เจจเจพเจฒเฉ‹เจ‚ เจฅเฉ‹เฉœเฉเจนเจพ เจตเจงเฉ‡เจฐเฉ‡ เจ•เฉเจธเจผเจฒ เจนเฉˆ. เจ…เจธเฉ€เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเจพเจฐ เจธเฉฐเจ•เฉเจšเจฟเจค เจ•เจฐเจพเจ‚เจ—เฉ‡; เจซเจฒเจพเจˆ 'เจคเฉ‡ เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจˆ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

เจ‡เจน เจ‰เจน เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ เจนเฉˆ เจœเจฟเจธ เจจเจพเจฒ เจฎเฉˆเจ‚ เจ–เจคเจฎ เจนเฉ‹เจ‡เจ† เจธเฉ€. เจฐเฉ‚เจธเฉ€ เจตเจฟเฉฑเจš เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจฎเฉ‡เจฐเฉ€เจ†เจ‚ เจนเจจ, เจ…เฉฐเจ—เจฐเฉ‡เจœเจผเฉ€ เจตเจฟเฉฑเจš - เจฎเฉ‚เจฒ เจคเฉ‹เจ‚เฅค

เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ

# ะ‘ะฐะทะพะฒั‹ะน ะพะฑั€ะฐะท ัะฝะพะฒะฐ 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 เจ…เจคเฉ‡ เจฌเจฐเฉ‹เจŸเจฒเฉ€ เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจธเจฎเจฐเฉฑเจฅ เจนเฉ‹ เจœเจพเจฃเฅค เจฎเฉˆเจ‚ เจ•เฉˆเจšเจฟเฉฐเจ— เจนเฉˆเจกเจฐ เจตเฉ€ เจธเจผเจพเจฎเจฒ เจ•เจฐเจพเจ‚เจ—เจพ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ•เจฆเฉ‡ เจตเฉ€ เจธเจฅเจฟเจฐ เจจเจนเฉ€เจ‚ เจฌเจฆเจฒเจพเจ‚เจ—เฉ‡. เจ…เจคเฉ‡ เจ…เฉฐเจคเจฎ เจธเฉฐเจชเจฐเจ• เจธเจพเจฐเฉ€เจ†เจ‚ 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 เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจ†เจชเจฃเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจตเจฟเฉฑเจš เจนเฉˆเจธเจผ เจœเฉ‹เฉœเจฆเฉ‡ เจนเจจเฅค เจ‡เจน เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆ เจคเจพเจ‚ เจœเฉ‹ เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจฒเฉฐเจฌเฉ‡ เจธเจฎเฉ‡เจ‚ เจฒเจˆ เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจขเฉฐเจ— เจจเจพเจฒ เจ•เฉˆเจธเจผ เจ•เจฐ เจธเจ•เฉ‡เฅค เจœเฉ‡เจ•เจฐ เจซเจพเจˆเจฒ เจฌเจฆเจฒเจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจ‡เจธเจฆเจพ เจนเฉˆเจธเจผ เจฌเจฆเจฒ เจœเจพเจตเฉ‡เจ—เจพ, เจœเฉ‹ เจฌเจฆเจฒเฉ‡ เจตเจฟเฉฑเจš เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจจเฉ‚เฉฐ เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเจจ เจฒเจˆ เจฎเจœเจฌเฉ‚เจฐ เจ•เจฐเฉ‡เจ—เจพเฅค

เจฌเจฆเจ•เจฟเจธเจฎเจคเฉ€ เจจเจพเจฒ, เจฎเฉ‡เจฐเฉ€ เจตเจฟเจงเฉ€ เจตเจฟเฉฑเจš, เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจฆเฉเจ†เจฐเจพ เจธเฉฐเจฐเจšเจจเจพ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃ เจจเจพเจฒ เจซเจพเจˆเจฒ เจนเฉˆเจธเจผ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจคเจฌเจฆเฉ€เจฒเฉ€ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเฉ€, เจœเจฟเจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจ•เฉˆเจธเจผ เจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจ…เจตเฉˆเจง เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เจน เจธเจฎเฉฑเจธเจฟเจ† เจจเจนเฉ€เจ‚ เจนเฉˆ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจตเฉฑเจ–-เจตเฉฑเจ– เจธเฉฐเจฐเจšเจจเจพเจตเจพเจ‚ เจตเฉฑเจ–-เจตเฉฑเจ– เจตเจพเจคเจพเจตเจฐเจฃเจพเจ‚ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจค เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจจเฅค

เจ…เฉฐเจคเจฟเจฎ เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจเจพ

เจ…เฉฐเจค เจตเจฟเฉฑเจš.

เจกเฉŒเจ•เจฐเจซเจพเจˆเจฒ

# ะŸะตั€ะฒั‹ะน ะฑะฐะทะพะฒั‹ะน ะพะฑั€ะฐะท ะดะปั ัะฑะพั€ะบะธ
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