เจฎเฉˆเจ‚ เจ…เจงเจฟเจ•เจพเจฐ เจ…เจคเฉ‡ S3 เจจเจพเจฒ เจ†เจชเจฃเฉ€ เจ–เฉเจฆ เจฆเฉ€ PyPI เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจฌเจฃเจพเจˆ เจนเฉˆเฅค Nginx 'เจคเฉ‡

เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจ†เจชเจฃเฉ‡ เจคเจœเจผเจฐเจฌเฉ‡ เจจเฉ‚เฉฐ NJS เจจเจพเจฒ เจธเจพเจ‚เจเจพ เจ•เจฐเจจเจพ เจšเจพเจนเจพเจ‚เจ—เจพ, Nginx Inc เจฆเฉเจ†เจฐเจพ เจตเจฟเจ•เจธเจค Nginx เจฒเจˆ เจ‡เฉฑเจ• JavaScript เจฆเฉเจญเจพเจธเจผเฉ€เจ, เจ‡เฉฑเจ• เจ…เจธเจฒ เจ‰เจฆเจพเจนเจฐเจฃ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ‡เจธเจฆเฉ€เจ†เจ‚ เจฎเฉเฉฑเจ– เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจเฅค NJS JavaScript เจฆเจพ เจ‡เฉฑเจ• เจธเจฌเจธเฉˆเฉฑเจŸ เจนเฉˆ เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ Nginx เจฆเฉ€ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒเจคเจพ เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจธเจตเจพเจฒ เจจเฉ‚เฉฐ เจคเฉเจนเจพเจกเจพ เจ†เจชเจฃเจพ เจฆเฉเจญเจพเจธเจผเฉ€เจ เจ•เจฟเจ‰เจ‚??? เจฆเจฎเจฟเฉฑเจคเจฐเฉ€ Volyntsev เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจœเจตเจพเจฌ เจฆเจฟเฉฑเจคเจพ. เจธเฉฐเจ–เฉ‡เจช เจตเจฟเฉฑเจš: NJS nginx-way เจนเฉˆ, เจ…เจคเฉ‡ JavaScript เจตเจงเฉ‡เจฐเฉ‡ เจชเฉเจฐเจ—เจคเฉ€เจธเจผเฉ€เจฒ, "เจฎเฉ‚เจฒ" เจ…เจคเฉ‡ GC เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚, Lua เจฆเฉ‡ เจ‰เจฒเจŸ เจนเฉˆเฅค

เจฌเจนเฉเจค เจšเจฟเจฐ เจชเจนเจฟเจฒเจพเจ‚โ€ฆ

เจฎเฉ‡เจฐเฉ€ เจ†เจ–เจฐเฉ€ เจจเฉŒเจ•เจฐเฉ€ 'เจคเฉ‡, เจฎเฉˆเจจเฉ‚เฉฐ เจกเฉŒเจ•เจฐ-เจ•เฉฐเจชเฉ‹เจœเจผ, เจกเจฟเฉฐเจก เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจชเฉเจฐเจธเฉฐเจจเจคเจพเจตเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ•เจˆ เจฎเฉ‹เจŸเจฒเฉ‡ CI/CD เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ—เจฟเจŸเจฒเฉˆเจฌ เจตเจฟเจฐเจพเจธเจค เจตเจฟเฉฑเจš เจฎเจฟเจฒเฉ€, เจœเจฟเจจเฉเจนเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจจเฉ€เจ•เฉ‹ เจฐเฉ‡เจฒเจพเจ‚ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€เฅค เจ‰เจน เจšเจฟเฉฑเจคเจฐ เจœเฉ‹ เจชเจนเจฟเจฒเจพเจ‚ CI เจตเจฟเฉฑเจš เจตเจฐเจคเฉ‡ เจ—เจ เจธเจจ เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจ…เจธเจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจšเจฒเฉ‡ เจ—เจ เจธเจจเฅค เจ‰เจจเฉเจนเจพเจ‚ เจจเฉ‡ เจ‰เจธ เจฆเจฟเจจ เจคเฉฑเจ• เจธเจนเฉ€ เจขเฉฐเจ— เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เฉ€เจคเจพ เจœเจฆเฉ‹เจ‚ เจธเจพเจกเจพ เจ—เจฟเจŸเจฒเฉˆเจฌ เจ†เจˆเจชเฉ€ เจฌเจฆเจฒ เจ—เจฟเจ† เจ…เจคเฉ‡ เจธเฉ€เจ†เจˆ เจ‡เฉฑเจ• เจชเฉ‡เจ เจพ เจตเจฟเฉฑเจš เจฌเจฆเจฒ เจ—เจฟเจ†. เจธเจฎเฉฑเจธเจฟเจ† เจ‡เจน เจธเฉ€ เจ•เจฟ เจธเฉ€เจ†เจˆ เจตเจฟเฉฑเจš เจนเจฟเฉฑเจธเจพ เจฒเฉˆเจฃ เจตเจพเจฒเฉ‡ เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจตเจฟเฉฑเจš git เจธเฉ€, เจœเฉ‹ เจชเจพเจˆเจฅเจจ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจจเฉ‚เฉฐ ssh เจฆเฉเจ†เจฐเจพ เจ–เจฟเฉฑเจšเจฆเจพ เจธเฉ€เฅค ssh เจฒเจˆ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจชเฉเจฐเจพเจˆเจตเฉ‡เจŸ เจ•เฉเฉฐเจœเฉ€ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจ…เจคเฉ‡... เจ‡เจน เจœเจพเจฃเจฟเจ†_เจนเฉ‹เจธเจŸ เจฆเฉ‡ เจจเจพเจฒ เจšเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจš เจธเฉ€เฅค เจ…เจคเฉ‡ เจ•เฉ‹เจˆ เจตเฉ€ CI เจ…เจธเจฒ IP เจ…เจคเฉ‡ known_hosts เจตเจฟเฉฑเจš เจฆเจฐเจธเจพเจ เจ—เจ เจ‡เฉฑเจ• เจตเจฟเฉฑเจš เจฎเฉ‡เจฒ เจจเจพ เจนเฉ‹เจฃ เจ•เจพเจฐเจจ เจ‡เฉฑเจ• เจฎเฉเฉฑเจ– เจคเจธเจฆเฉ€เจ• เจ—เจฒเจคเฉ€ เจจเจพเจฒ เจ…เจธเจซเจฒ เจนเฉ‹เจ‡เจ†เฅค เจฎเฉŒเจœเฉ‚เจฆเจพ เจกเฉŒเจ•เจซเจพเจˆเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผเฉ€ เจจเจพเจฒ เจ‡เจ•เฉฑเจ เจพ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€ เจ…เจคเฉ‡ เจตเจฟเจ•เจฒเจช เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€ StrictHostKeyChecking no. เจชเจฐ เจฎเจพเฉœเจพ เจธเฉเจ†เจฆ เจฌเจฃเจฟเจ† เจฐเจฟเจนเจพ เจ…เจคเฉ‡ เจฒเจฟเจฌเจธ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจชเฉเจฐเจพเจˆเจตเฉ‡เจŸ PyPI เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจฒเจฟเจœเจพเจฃ เจฆเฉ€ เจ‡เฉฑเจ›เจพ เจธเฉ€เฅค เจ‡เฉฑเจ• เจตเจพเจงเฉ‚ เจฌเฉ‹เจจเจธ, เจชเฉเจฐเจพเจˆเจตเฉ‡เจŸ PyPI 'เจคเฉ‡ เจœเจพเจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ‡เฉฑเจ• เจธเจฐเจฒ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจธเฉ€ เจ…เจคเฉ‡ เจฒเฉ‹เฉœเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจตเจฐเจฃเจจ เจธเฉ€.txt

เจšเฉ‹เจฃ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆ, เจธเฉฑเจœเจฃ!

เจ…เจธเฉ€เจ‚ เจนเจฐ เจšเฉ€เจœเจผ เจจเฉ‚เฉฐ เจ•เจฒเจพเจ‰เจก เจ…เจคเฉ‡ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฟเฉฑเจš เจšเจฒเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚, เจ…เจคเฉ‡ เจ…เฉฐเจค เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจ›เฉ‹เจŸเฉ€ เจœเจฟเจนเฉ€ เจธเฉ‡เจตเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจธเฉ€ เจœเฉ‹ เจฌเจพเจนเจฐเฉ€ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจธเจŸเฉ‡เจŸเจฒเฉˆเฉฑเจธ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจธเฉ€เฅค เจ–เฉˆเจฐ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจธเฉ€เจ‚ S3 เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจ‡เจธ เจจเฉ‚เฉฐ เจคเจฐเจœเฉ€เจน เจฆเจฟเฉฑเจคเฉ€ เจ—เจˆ เจธเฉ€เฅค เจ…เจคเฉ‡, เจœเฉ‡ เจธเฉฐเจญเจต เจนเฉ‹เจตเฉ‡, gitlab เจตเจฟเฉฑเจš เจชเฉเจฐเจฎเจพเจฃเจฟเจ•เจคเจพ เจฆเฉ‡ เจจเจพเจฒ (เจœเฉ‡ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡ เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ†เจช เจœเฉ‹เฉœ เจธเจ•เจฆเฉ‡ เจนเฉ‹)เฅค

เจ‡เฉฑเจ• เจคเฉ‡เจœเจผ เจ–เฉ‹เจœ เจจเฉ‡ เจ•เจˆ เจจเจคเฉ€เจœเฉ‡ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ‡: s3pypi, pypicloud เจ…เจคเฉ‡ turnips เจฒเจˆ html เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ€ "เจฎเฉˆเจจเฉ‚เจ…เจฒ" เจฐเจšเจจเจพ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจตเจฟเจ•เจฒเจชเฅค เจ†เจ–เจฐเฉ€ เจตเจฟเจ•เจฒเจช เจ†เจชเจฃเฉ‡ เจ†เจช เจ…เจฒเฉ‹เจช เจนเฉ‹ เจ—เจฟเจ†.

s3pypi: เจ‡เจน S3 เจนเฉ‹เจธเจŸเจฟเฉฐเจ— เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจ•เจฒเฉ€ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจ…เจชเจฒเฉ‹เจก เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, html เจคเจฟเจ†เจฐ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ‰เจธเฉ‡ เจฌเจพเจฒเจŸเฉ€ เจตเจฟเฉฑเจš เจ…เจชเจฒเฉ‹เจก เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจ˜เจฐเฉ‡เจฒเฉ‚ เจตเจฐเจคเฉ‹เจ‚ เจฒเจˆ เจขเฉเจ•เจตเจพเจ‚เฅค

pypicloud: เจ‡เจน เจ‡เฉฑเจ• เจฆเจฟเจฒเจšเจธเจช เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจœเจพเจชเจฆเจพ เจธเฉ€, เจชเจฐ เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจฎเฉˆเจ‚ เจจเจฟเจฐเจพเจธเจผ เจนเฉ‹ เจ—เจฟเจ† เจธเฉ€เฅค เจšเฉฐเจ—เฉ‡ เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจ…เจคเฉ‡ เจคเฉเจนเจพเจกเฉ€เจ†เจ‚ เจœเจผเจฐเฉ‚เจฐเจคเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเจจ เจฒเจˆ เจตเจฟเจธเจคเจพเจฐ เจ•เจฐเจจ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจฆเฉ‡ เจฌเจพเจตเจœเฉ‚เจฆ, เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ‡เจน เจฌเฉ‡เจฒเฉ‹เฉœเจพ เจ…เจคเฉ‡ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเจจเจพ เจฎเฉเจธเจผเจ•เจฒ เจธเจพเจฌเจค เจนเฉ‹เจ‡เจ†เฅค เจ‰เจธ เจธเจฎเฉ‡เจ‚ เจฆเฉ‡ เจ…เจจเฉเจฎเจพเจจเจพเจ‚ เจ…เจจเฉเจธเจพเจฐ, เจคเฉเจนเจพเจกเฉ‡ เจ•เจพเจฐเจœเจพเจ‚ เจฆเฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจ เฉ€เจ• เจ•เจฐเจจ เจตเจฟเฉฑเจš 3-5 เจฆเจฟเจจ เจฒเฉฑเจ— เจœเจพเจฃเจ—เฉ‡เฅค เจธเฉ‡เจตเจพ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจฆเฉ€ เจตเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ›เฉฑเจก เจฆเจฟเฉฑเจคเจพ เจœเฉ‡ เจธเจพเจจเฉ‚เฉฐ เจนเฉ‹เจฐ เจ•เฉเจ เจจเจนเฉ€เจ‚ เจฎเจฟเจฒเจฟเจ†เฅค

เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจกเฉ‚เฉฐเจ˜เจพเจˆ เจจเจพเจฒ เจ–เฉ‹เจœ เจจเฉ‡ Nginx, ngx_aws_auth เจฒเจˆ เจ‡เฉฑเจ• เจฎเฉ‹เจกเฉ€เจŠเจฒ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเจพเฅค เจ‰เจธเจฆเฉ€ เจœเจพเจ‚เจš เจฆเจพ เจจเจคเฉ€เจœเจพ เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจตเจฟเฉฑเจš XML เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€, เจœเจฟเจธ เจตเจฟเฉฑเจš S3 เจฌเจพเจฒเจŸเฉ€ เจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจฆเจฟเจ–เจพเจˆ เจ—เจˆ เจธเฉ€เฅค เจ–เฉ‹เจœ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจ†เจ–เจฐเฉ€ เจตเจšเจจเจฌเฉฑเจงเจคเจพ เจ‡เฉฑเจ• เจธเจพเจฒ เจชเจนเจฟเจฒเจพเจ‚ เจธเฉ€. เจญเฉฐเจกเจพเจฐ เจ›เฉฑเจกเจฟเจ† เจนเฉ‹เจ‡เจ† เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡ เจฐเจฟเจนเจพ เจธเฉ€เฅค

เจธเจฐเฉ‹เจค เจคเฉ‡ เจœเจพ เจ•เฉ‡ เจชเฉœเฉเจนเจจเจพ เจชเฉ€เจˆเจชเฉ€ -503 เจฎเฉˆเจจเฉ‚เฉฐ เจ…เจนเจฟเจธเจพเจธ เจนเฉ‹เจ‡เจ† เจ•เจฟ XML เจจเฉ‚เฉฐ เจซเจฒเจพเจˆ 'เจคเฉ‡ HTML เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจชเจพเจˆเจช เจจเฉ‚เฉฐ เจฆเจฟเฉฑเจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค Nginx เจ…เจคเฉ‡ S3 เจฌเจพเจฐเฉ‡ เจฅเฉ‹เฉœเจพ เจนเฉ‹เจฐ เจ—เฉ‚เจ—เจฒ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฎเฉˆเจจเฉ‚เฉฐ Nginx เจฒเจˆ JS เจตเจฟเฉฑเจš เจฒเจฟเจ–เฉ‡ S3 เจตเจฟเฉฑเจš เจชเฉเจฐเจฎเจพเจฃเจฟเจ•เจคเจพ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจฎเจฟเจฒเฉ€. เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฎเฉˆเจ‚ NJS เจจเฉ‚เฉฐ เจฎเจฟเจฒเจฟเจ†เฅค

เจ‡เจธ เจ‰เจฆเจพเจนเจฐเจจ เจจเฉ‚เฉฐ เจ†เจงเจพเจฐ เจตเจœเฉ‹เจ‚ เจฒเฉˆเจ‚เจฆเฉ‡ เจนเฉ‹เจ, เจ‡เฉฑเจ• เจ˜เฉฐเจŸเฉ‡ เจฌเจพเจ…เจฆ เจฎเฉˆเจ‚ เจ†เจชเจฃเฉ‡ เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจตเจฟเฉฑเจš เจ‰เจนเฉ€ XML เจฆเฉ‡เจ–เจฟเจ† เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ ngx_aws_auth เจฎเฉ‹เจกเฉ€เจŠเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจชเจฐ เจธเจญ เจ•เฉเจ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ JS เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจธเฉ€.

เจฎเฉˆเจจเฉ‚เฉฐ เจธเฉฑเจšเจฎเฉเฉฑเจš nginx เจนเฉฑเจฒ เจชเจธเฉฐเจฆ เจ†เจ‡เจ†. เจชเจนเจฟเจฒเจพเจ‚, เจšเฉฐเจ—เฉ‡ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจ…เจคเฉ‡ เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚, เจฆเฉ‚เจœเจพ, เจธเจพเจจเฉ‚เฉฐ เจซเจพเจˆเจฒเจพเจ‚ (เจฌเจพเจ•เจธ เจคเฉ‹เจ‚ เจฌเจพเจนเจฐ) เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ Nginx เจฆเฉ€เจ†เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจšเฉ€เจœเจผเจพเจ‚ เจฎเจฟเจฒเจฆเฉ€เจ†เจ‚ เจนเจจ, เจคเฉ€เจœเจพ, เจ•เฉ‹เจˆ เจตเฉ€ เจœเฉ‹ เจœเจพเจฃเจฆเจพ เจนเฉˆ เจ•เจฟ Nginx เจฒเจˆ เจธเฉฐเจฐเจšเจจเจพ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจฟเจ–เจฃเฉ€ เจนเฉˆ, เจ‡เจน เจชเจคเจพ เจฒเจ—เจพเจ‰เจฃ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจตเฉ‡เจ—เจพ เจ•เจฟ เจ•เฉ€ เจนเฉˆ. เจชเจพเจ‡เจฅเจจ เจœเจพเจ‚ เจ—เฉ‹ (เจœเฉ‡เจ•เจฐ เจธเจ•เฉเจฐเฉˆเจš เจคเฉ‹เจ‚ เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจนเฉˆ) เจฆเฉ‡ เจฎเฉเจ•เจพเจฌเจฒเฉ‡, เจ—เจ เจœเฉ‹เฉœ เจฆเจพ เจœเจผเจฟเจ•เจฐ เจจเจพ เจ•เจฐเจจ เจฒเจˆ, เจ˜เฉฑเจŸเฉ‹ เจ˜เฉฑเจŸเจตเจพเจฆ เจตเฉ€ เจฎเฉ‡เจฐเฉ‡ เจฒเจˆ เจ‡เฉฑเจ• เจชเจฒเฉฑเจธ เจนเฉˆเฅค

TL;DR 2 เจฆเจฟเจจเจพเจ‚ เจฌเจพเจ…เจฆ, PyPi เจฆเจพ เจŸเฉˆเจธเจŸ เจตเจฐเจœเจจ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ CI เจตเจฟเฉฑเจš เจตเจฐเจคเจฟเจ† เจ—เจฟเจ† เจธเฉ€เฅค

เจ‡เจธ เจจเฉ‚เฉฐ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ?

เจฎเฉ‹เจกเฉ€เจŠเจฒ Nginx เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ ngx_http_js_module, เจ…เจงเจฟเจ•เจพเจฐเจค เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฟเจต เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ†เจชเจฃเฉ€ เจธเจ•เฉเจฐเจฟเจชเจŸ เจจเฉ‚เฉฐ เจ†เจฏเจพเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ js_importNginx เจธเฉฐเจฐเจšเจจเจพ เจฒเจˆ. เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจจเจฟเจฐเจฆเฉ‡เจธเจผ เจฆเฉเจ†เจฐเจพ เจฌเฉเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ js_content. เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฟเจต เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจธเฉˆเฉฑเจŸ เจ•เจฐเจจ เจฒเจˆ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ js_set, เจœเฉ‹ เจ•เจฟ เจธเจฟเจฐเจซ เจธเจ•เฉเจฐเจฟเจชเจŸ เจตเจฟเฉฑเจš เจตเจฐเจฃเจฟเจค เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸ เจตเจœเฉ‹เจ‚ เจฒเฉˆเจ‚เจฆเจพ เจนเฉˆเฅค เจชเจฐ เจ…เจธเฉ€เจ‚ เจธเจฟเจฐเจซ Nginx เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ NJS เจตเจฟเฉฑเจš เจธเจฌเจ•เจตเฉ‡เจฐเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚, เจจเจพ เจ•เจฟ เจ•เฉ‹เจˆ XMLHttpRequest. เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, เจ…เจจเฉเจธเจพเจฐเฉ€ เจธเจฅเจพเจจ เจจเฉ‚เฉฐ Nginx เจธเฉฐเจฐเจšเจจเจพ เจตเจฟเฉฑเจš เจœเฉ‹เฉœเจฟเจ† เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ. เจ…เจคเฉ‡ เจธเจ•เฉเจฐเจฟเจชเจŸ เจจเฉ‚เฉฐ เจ‡เจธ เจŸเจฟเจ•เจพเจฃเฉ‡ เจฒเจˆ เจธเจฌ-เจฐเจฟเจตเฉ‡เจธเจŸ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค Nginx เจธเฉฐเจฐเจšเจจเจพ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจซเฉฐเจ•เจธเจผเจจ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจฃ เจฒเจˆ, เจซเฉฐเจ•เจธเจผเจจ เจฆเจพ เจจเจพเจฎ เจธเจ•เฉเจฐเจฟเจชเจŸ เจตเจฟเฉฑเจš เจนเฉ€ เจจเจฟเจฐเจฏเจพเจค เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ export default.

nginx.conf

load_module modules/ngx_http_js_module.so;
http {
  js_import   imported_name  from script.js;

server {
  listen 8080;
  ...
  location = /sub-query {
    internal;

    proxy_pass http://upstream;
  }

  location / {
    js_content imported_name.request;
  }
}

script.js

function request(r) {
  function call_back(resp) {
    // handler's code
    r.return(resp.status, resp.responseBody);
  }

  r.subrequest('/sub-query', { method: r.method }, call_back);
}

export default {request}

เจœเจฆเฉ‹เจ‚ เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจตเจฟเฉฑเจš เจฌเฉ‡เจจเจคเฉ€ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ http://localhost:8080/ เจ…เจธเฉ€เจ‚ เจ…เฉฐเจฆเจฐ เจ†เจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ location /เจœเจฟเจธ เจตเจฟเฉฑเจš เจจเจฟเจฐเจฆเฉ‡เจธเจผ js_content เจ‡เฉฑเจ• เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจฆเจพ เจนเฉˆ request เจธเจพเจกเฉ€ เจธเจ•เฉเจฐเจฟเจชเจŸ เจตเจฟเฉฑเจš เจตเจฐเจฃเจจ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ script.js. เจฌเจฆเจฒเฉ‡ เจตเจฟเฉฑเจš, เจซเฉฐเจ•เจธเจผเจจ เจตเจฟเฉฑเจš request เจฒเจˆ เจ‡เฉฑเจ• เจธเจฌเจ•เจตเฉ‡เจฐเฉ€ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ location = /sub-query, เจ‡เฉฑเจ• เจตเจฟเจงเฉ€ เจจเจพเจฒ (เจฎเฉŒเจœเฉ‚เจฆเจพ เจ‰เจฆเจพเจนเจฐเจจ GET เจตเจฟเฉฑเจš) เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸ เจคเฉ‹เจ‚ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆ (r), เจœเจฆเฉ‹เจ‚ เจ‡เจธ เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจฌเฉเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจคเจพเจ‚ เจธเจชเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจชเจพเจธ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค subrequest เจœเจตเจพเจฌ เจซเฉฐเจ•เจธเจผเจจ เจตเจฟเฉฑเจš เจ•เจพเจฐเจตเจพเจˆ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€ call_back.

S3 เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ

เจจเจฟเฉฑเจœเฉ€ S3 เจธเจŸเฉ‹เจฐเฉ‡เจœ เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเจจ เจฒเจˆ, เจธเจพเจจเฉ‚เฉฐ เจฒเฉ‹เฉœ เจนเฉˆ:

ACCESS_KEY

SECRET_KEY

S3_BUCKET

เจตเจฐเจคเฉ€ เจ—เจˆ http เจตเจฟเจงเฉ€ เจคเฉ‹เจ‚, เจฎเฉŒเจœเฉ‚เจฆเจพ เจฎเจฟเจคเฉ€/เจธเจฎเจพเจ‚, S3_NAME เจ…เจคเฉ‡ URI, เจ‡เฉฑเจ• เจ–เจพเจธ เจ•เจฟเจธเจฎ เจฆเฉ€ เจธเจคเจฐ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจœเฉ‹ เจ•เจฟ SECRET_KEY เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ (HMAC_SHA1) เจธเจพเจˆเจจ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค เจ…เฉฑเจ—เฉ‡ เจ‡เฉฑเจ• เจฒเจพเจˆเจจ เจตเจฐเจ—เฉ€ เจนเฉˆ AWS $ACCESS_KEY:$HASH, เจ…เจงเจฟเจ•เจพเจฐ เจธเจฟเจฐเจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจตเจฐเจคเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ‰เจนเฉ€ เจฎเจฟเจคเฉ€/เจธเจฎเจพเจ‚ เจœเฉ‹ เจชเจฟเจ›เจฒเฉ‡ เจชเฉœเจพเจ… เจตเจฟเฉฑเจš เจธเจŸเฉเจฐเจฟเฉฐเจ— เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจตเจฐเจคเจฟเจ† เจ—เจฟเจ† เจธเฉ€ เจธเจฟเจฐเจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ X-amz-date. เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจ‡เจน เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ:

nginx.conf

load_module modules/ngx_http_js_module.so;
http {
  js_import   s3      from     s3.js;

  js_set      $s3_datetime     s3.date_now;
  js_set      $s3_auth         s3.s3_sign;

server {
  listen 8080;
  ...
  location ~* /s3-query/(?<s3_path>.*) {
    internal;

    proxy_set_header    X-amz-date     $s3_datetime;
    proxy_set_header    Authorization  $s3_auth;

    proxy_pass          $s3_endpoint/$s3_path;
  }

  location ~ "^/(?<prefix>[w-]*)[/]?(?<postfix>[w-.]*)$" {
    js_content s3.request;
  }
}

s3.js(AWS เจธเจพเจˆเจจ v2 เจชเฉเจฐเจฎเจพเจฃเฉ€เจ•เจฐเจจ เจ‰เจฆเจพเจนเจฐเจจ, เจจเจพเจชเจธเฉฐเจฆ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจฌเจฆเจฒเฉ€ เจ—เจˆ)

var crypt = require('crypto');

var s3_bucket = process.env.S3_BUCKET;
var s3_access_key = process.env.S3_ACCESS_KEY;
var s3_secret_key = process.env.S3_SECRET_KEY;
var _datetime = new Date().toISOString().replace(/[:-]|.d{3}/g, '');

function date_now() {
  return _datetime
}

function s3_sign(r) {
  var s2s = r.method + 'nnnn';

  s2s += `x-amz-date:${date_now()}n`;
  s2s += '/' + s3_bucket;
  s2s += r.uri.endsWith('/') ? '/' : r.variables.s3_path;

  return `AWS ${s3_access_key}:${crypt.createHmac('sha1', s3_secret_key).update(s2s).digest('base64')}`;
}

function request(r) {
  var v = r.variables;

  function call_back(resp) {
    r.return(resp.status, resp.responseBody);
  }

  var _subrequest_uri = r.uri;
  if (r.uri === '/') {
    // root
    _subrequest_uri = '/?delimiter=/';

  } else if (v.prefix !== '' && v.postfix === '') {
    // directory
    var slash = v.prefix.endsWith('/') ? '' : '/';
    _subrequest_uri = '/?prefix=' + v.prefix + slash;
  }

  r.subrequest(`/s3-query${_subrequest_uri}`, { method: r.method }, call_back);
}

export default {request, s3_sign, date_now}

เจฌเจพเจฐเฉ‡ เจ‡เฉฑเจ• เจ›เฉ‹เจŸเจพ เจœเจฟเจนเจพ เจตเจฟเจ†เจ–เจฟเจ† _subrequest_uri: เจ‡เจน เจ‡เฉฑเจ• เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจนเฉˆ เจœเฉ‹, เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ uri 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ, S3 เจจเฉ‚เฉฐ เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ "เจฐเฉ‚เจŸ" เจฆเฉ€ เจธเจฎเจ—เจฐเฉ€ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจกเฉ€เจฒเฉ€เจฎเฉ€เจŸเจฐ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเฉ€ เจ‡เฉฑเจ• เจฏเฉ‚เจฐเฉ€ เจฌเฉ‡เจจเจคเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค delimiter, เจœเฉ‹ เจ•เจฟ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€เจ†เจ‚ (PyPI เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš, เจธเจพเจฐเฉ‡ เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€) เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐเฉ€, เจธเจพเจฐเฉ‡ CommonPrefixes xml เจคเฉฑเจคเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉ‚เจšเฉ€ เจตเจพเจชเจธ เจ•เจฐเฉ‡เจ—เจพเฅค เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจ–เจพเจธ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ (เจธเจพเจฐเฉ‡ เจชเฉˆเจ•เฉ‡เจœ เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€) เจตเจฟเฉฑเจš เจธเจฎเฉฑเจ—เจฐเฉ€ เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉ‚เจšเฉ€ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจคเจพเจ‚ uri เจฌเฉ‡เจจเจคเฉ€ เจตเจฟเฉฑเจš เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ (เจชเฉˆเจ•เฉ‡เจœ) เจฆเฉ‡ เจจเจพเจฎ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจ…เจ—เฉ‡เจคเจฐ เจ–เฉ‡เจคเจฐ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจœเฉ‹ เจœเจผเจฐเฉ‚เจฐเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจฒเฉˆเจธเจผ / เจจเจพเจฒ เจ–เจคเจฎ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจจเจนเฉ€เจ‚ เจคเจพเจ‚, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจฆเฉ€ เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจŸเฉฑเจ•เจฐ เจธเฉฐเจญเจต เจนเฉˆเฅค เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€เจ†เจ‚ เจนเจจ aiohttp-request เจ…เจคเฉ‡ aiohttp-requests เจ…เจคเฉ‡ เจœเฉ‡เจ•เจฐ เจฌเฉ‡เจจเจคเฉ€ เจจเจฟเจธเจผเจšเจฟเจค เจ•เจฐเจฆเฉ€ เจนเฉˆ /?prefix=aiohttp-request, เจซเจฟเจฐ เจœเจตเจพเจฌ เจตเจฟเฉฑเจš เจฆเฉ‹เจตเฉ‡เจ‚ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€เจ†เจ‚ เจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจธเจผเจพเจฎเจฒ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค เจœเฉ‡ เจ…เฉฐเจค เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจธเจฒเฉˆเจธเจผ เจนเฉˆ, /?prefix=aiohttp-request/, เจซเจฟเจฐ เจœเจตเจพเจฌ เจตเจฟเฉฑเจš เจธเจฟเจฐเจซเจผ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค เจ…เจคเฉ‡ เจœเฉ‡เจ•เจฐ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจฆเฉ€ เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจคเจพเจ‚ เจจเจคเฉ€เจœเจพ uri เจ…เจธเจฒ เจ‡เฉฑเจ• เจคเฉ‹เจ‚ เจตเฉฑเจ–เจฐเจพ เจจเจนเฉ€เจ‚ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค

Nginx เจจเฉ‚เฉฐ เจธเฉ‡เจต เจ…เจคเฉ‡ เจฐเฉ€เจธเจŸเจพเจฐเจŸ เจ•เจฐเฉ‹เฅค เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ Nginx เจฆเจพ เจชเจคเจพ เจฆเจพเจ–เจฒ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจฌเฉ‡เจจเจคเฉ€ เจฆเจพ เจจเจคเฉ€เจœเจพ XML เจนเฉ‹เจตเฉ‡เจ—เจพ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ:

เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€เจ†เจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€

<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Name>myback-space</Name>
  <Prefix></Prefix>
  <Marker></Marker>
  <MaxKeys>10000</MaxKeys>
  <Delimiter>/</Delimiter>
  <IsTruncated>false</IsTruncated>
  <CommonPrefixes>
    <Prefix>new/</Prefix>
  </CommonPrefixes>
  <CommonPrefixes>
    <Prefix>old/</Prefix>
  </CommonPrefixes>
</ListBucketResult>

เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€เจ†เจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจฟเจฐเจซเจผ เจคเฉฑเจคเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡เจ—เฉ€ CommonPrefixes.

เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจตเจฟเฉฑเจš เจธเจพเจกเฉ‡ เจชเจคเฉ‡ เจตเจฟเฉฑเจš เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจœเฉ‹เฉœ เจ•เฉ‡, เจ…เจธเฉ€เจ‚ XML เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ‡เจธเจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจตเฉ€ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจพเจ‚เจ—เฉ‡:

เจ‡เฉฑเจ• เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€

<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Name> myback-space</Name>
  <Prefix>old/</Prefix>
  <Marker></Marker>
  <MaxKeys>10000</MaxKeys>
  <Delimiter></Delimiter>
  <IsTruncated>false</IsTruncated>
  <Contents>
    <Key>old/giphy.mp4</Key>
    <LastModified>2020-08-21T20:27:46.000Z</LastModified>
    <ETag>&#34;00000000000000000000000000000000-1&#34;</ETag>
    <Size>1350084</Size>
    <Owner>
      <ID>02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4</ID>
      <DisplayName></DisplayName>
    </Owner>
    <StorageClass>STANDARD</StorageClass>
  </Contents>
  <Contents>
    <Key>old/hsd-k8s.jpg</Key>
    <LastModified>2020-08-31T16:40:01.000Z</LastModified>
    <ETag>&#34;b2d76df4aeb4493c5456366748218093&#34;</ETag>
    <Size>93183</Size>
    <Owner>
      <ID>02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4</ID>
      <DisplayName></DisplayName>
    </Owner>
    <StorageClass>STANDARD</StorageClass>
  </Contents>
</ListBucketResult>

เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ…เจธเฉ€เจ‚ เจธเจฟเจฐเจซ เจคเฉฑเจค เจฒเจตเจพเจ‚เจ—เฉ‡ Key.

เจธเจญ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจธเจฎเฉฑเจ—เจฐเฉ€-เจ•เจฟเจธเจฎ เจฆเฉ‡ เจธเจฟเจฐเจฒเฉ‡เจ– เจจเฉ‚เฉฐ เจŸเฉˆเจ•เจธเจŸ/html เจจเจพเจฒ เจฌเจฆเจฒ เจ•เฉ‡, เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚ XML เจจเฉ‚เฉฐ เจชเจพเจฐเจธ เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ HTML เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจญเฉ‡เจœเจฃเจพ เจฌเจพเจ•เฉ€ เจนเฉˆเฅค

function request(r) {
  var v = r.variables;

  function call_back(resp) {
    var body = resp.responseBody;

    if (r.method !== 'PUT' && resp.status < 400 && v.postfix === '') {
      r.headersOut['Content-Type'] = "text/html; charset=utf-8";
      body = toHTML(body);
    }

    r.return(resp.status, body);
  }
  
  var _subrequest_uri = r.uri;
  ...
}

function toHTML(xml_str) {
  var keysMap = {
    'CommonPrefixes': 'Prefix',
    'Contents': 'Key',
  };

  var pattern = `<k>(?<v>.*?)</k>`;
  var out = [];

  for(var group_key in keysMap) {
    var reS;
    var reGroup = new RegExp(pattern.replace(/k/g, group_key), 'g');

    while(reS = reGroup.exec(xml_str)) {
      var data = new RegExp(pattern.replace(/k/g, keysMap[group_key]), 'g');
      var reValue = data.exec(reS);
      var a_text = '';

      if (group_key === 'CommonPrefixes') {
        a_text = reValue.groups.v.replace(///g, '');
      } else {
        a_text = reValue.groups.v.split('/').slice(-1);
      }

      out.push(`<a href="/pa/${reValue.groups.v}">${a_text}</a>`);
    }
  }

  return '<html><body>n' + out.join('</br>n') + 'n</html></body>'
}

PyPI เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ

เจ…เจธเฉ€เจ‚ เจœเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจœเจพเจฃเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ 'เจคเฉ‡ เจ•เจฟเจคเฉ‡ เจตเฉ€ เจ•เฉเจ เจจเจนเฉ€เจ‚ เจŸเฉเฉฑเจŸเจฆเจพ เจนเฉˆเฅค

# ะกะพะทะดะฐะตะผ ะดะปั ั‚ะตัั‚ะพะฒ ะฝะพะฒะพะต ะพะบั€ัƒะถะตะฝะธะต
python3 -m venv venv
. ./venv/bin/activate

# ะกะบะฐั‡ะธะฒะฐะตะผ ั€ะฐะฑะพั‡ะธะต ะฟะฐะบะตั‚ั‹.
pip download aiohttp

# ะ—ะฐะณั€ัƒะถะฐะตะผ ะฒ ะฟั€ะธะฒะฐั‚ะฝัƒัŽ ั€ะตะฟัƒ
for wheel in *.whl; do curl -T $wheel http://localhost:8080/${wheel%%-*}/$wheel; done

rm -f *.whl

# ะฃัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ะธะท ะฟั€ะธะฒะฐั‚ะฝะพะน ั€ะตะฟั‹
pip install aiohttp -i http://localhost:8080

เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจฒเจฟเจฌเจธ เจจเจพเจฒ เจฆเฉเจนเจฐเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚เฅค

# ะกะพะทะดะฐะตะผ ะดะปั ั‚ะตัั‚ะพะฒ ะฝะพะฒะพะต ะพะบั€ัƒะถะตะฝะธะต
python3 -m venv venv
. ./venv/bin/activate

pip install setuptools wheel
python setup.py bdist_wheel
for wheel in dist/*.whl; do curl -T $wheel http://localhost:8080/${wheel%%-*}/$wheel; done

pip install our_pkg --extra-index-url http://localhost:8080

CI เจตเจฟเฉฑเจš, เจ‡เฉฑเจ• เจชเฉˆเจ•เฉ‡เจœ เจฌเจฃเจพเจ‰เจฃเจพ เจ…เจคเฉ‡ เจฒเฉ‹เจก เจ•เจฐเจจเจพ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ:

pip install setuptools wheel
python setup.py bdist_wheel

curl -sSfT dist/*.whl -u "gitlab-ci-token:${CI_JOB_TOKEN}" "https://pypi.our-domain.com/${CI_PROJECT_NAME}"

เจชเฉเจฐเจฎเจพเจฃเจฟเจ•เจคเจพ

Gitlab เจตเจฟเฉฑเจš เจฌเจพเจนเจฐเฉ€ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจฆเฉ€ เจชเฉเจฐเจฎเจพเจฃเจฟเจ•เจคเจพ/เจชเฉเจฐเจฎเจพเจฃเฉ€เจ•เจฐเจจ เจฒเจˆ JWT เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ เจธเฉฐเจญเจต เจนเฉˆเฅค Nginx เจตเจฟเฉฑเจš auth_request เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฟเจต เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจ…เจธเฉ€เจ‚ เจชเฉเจฐเจฎเจพเจฃเจฟเจ•เจคเจพ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจธเจ•เฉเจฐเจฟเจชเจŸ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจซเฉฐเจ•เจธเจผเจจ เจ•เจพเจฒ เจฐเฉฑเจ–เจฃ เจตเจพเจฒเฉ€ เจธเจฌ-เจฐเจฟเจตเฉˆเจธเจŸ เจฒเจˆ เจฐเฉ€เจกเจพเจ‡เจฐเฉˆเจ•เจŸ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค เจธเจ•เฉเจฐเจฟเจชเจŸ Gitlab url เจฒเจˆ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจธเจฌ-เจฐเจฟเจตเฉ‡เจธเจŸ เจ•เจฐเฉ‡เจ—เฉ€ เจ…เจคเฉ‡ เจœเฉ‡เจ•เจฐ เจชเฉเจฐเจฎเจพเจฃเจฟเจ•เจคเจพ เจกเฉ‡เจŸเจพ เจธเจนเฉ€ เจขเฉฐเจ— เจจเจพเจฒ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€, เจคเจพเจ‚ Gitlab เจ•เฉ‹เจก 200 เจตเจพเจชเจธ เจ•เจฐเฉ‡เจ—เจพ เจ…เจคเฉ‡ เจชเฉˆเจ•เฉ‡เจœ เจจเฉ‚เฉฐ เจ…เฉฑเจชเจฒเฉ‹เจก/เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฑเจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€เฅค เจ•เจฟเจ‰เจ‚ เจจเจพ เจ‡เฉฑเจ• เจธเจฌเจ•เจตเฉ‡เจฐเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจคเฉเจฐเฉฐเจค Gitlab เจจเฉ‚เฉฐ เจกเฉ‡เจŸเจพ เจญเฉ‡เจœเฉ‹? เจ•เจฟเจ‰เจ‚เจ•เจฟ เจคเจฆ เจธเจพเจจเฉ‚เฉฐ Nginx เจธเฉฐเจฐเจšเจจเจพ เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจนเจฐ เจตเจพเจฐ เจธเฉฐเจชเจพเจฆเจฟเจค เจ•เจฐเจจเจพ เจชเจเจ—เจพ เจœเจฆเฉ‹เจ‚ เจ…เจธเฉ€เจ‚ เจ…เจงเจฟเจ•เจพเจฐ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจฌเจฆเจฒเจพเจ… เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจ…เจคเฉ‡ เจ‡เจน เจ‡เฉฑเจ• เจฌเจนเฉเจค เจฎเฉเจธเจผเจ•เจฒ เจ•เฉฐเจฎ เจนเฉˆ. เจจเจพเจฒ เจนเฉ€, เจœเฉ‡เจ•เจฐ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ‡เฉฑเจ• เจฐเฉ€เจก-เจ“เจจเจฒเฉ€ เจฐเฉ‚เจŸ เจซเจพเจˆเจฒ เจธเจฟเจธเจŸเจฎ เจจเฉ€เจคเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจ‡เจน nginx.conf เจจเฉ‚เฉฐ configmap เจฆเฉเจ†เจฐเจพ เจคเจฌเจฆเฉ€เจฒ เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจนเฉ‹เจฐ เจตเฉ€ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐเจคเจพ เจœเฉ‹เฉœเจฆเจพ เจนเฉˆเฅค เจ…เจคเฉ‡ เจ‡เฉฑเจ•เฉ‹ เจธเจฎเฉ‡เจ‚ เจตเจพเจฒเฉ€เจ…เจฎ (เจชเฉ€เจตเฉ€เจธเฉ€) เจ…เจคเฉ‡ เจฐเฉ€เจก-เจ“เจจเจฒเฉ€ เจฐเฉ‚เจŸ เจซเจพเจˆเจฒ เจธเจฟเจธเจŸเจฎ (เจ‡เจน เจตเฉ€ เจนเฉเฉฐเจฆเจพ เจนเฉˆ) เจฆเฉ‡ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจฐเฉ‹เจ•เจฃ เจตเจพเจฒเฉ€เจ†เจ‚ เจจเฉ€เจคเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจธเฉฐเจฐเจšเจจเจพเจฎเฉˆเจช เจฆเฉเจ†เจฐเจพ Nginx เจจเฉ‚เฉฐ เจธเฉฐเจฐเจšเจฟเจค เจ•เจฐเจจเจพ เจฌเจฟเจฒเจ•เฉเจฒ เจ…เจธเฉฐเจญเจต เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

NJS เจ‡เฉฐเจŸเจฐเจฎเฉ€เจกเฉ€เจเจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจธเจพเจจเฉ‚เฉฐ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ nginx เจธเฉฐเจฐเจšเจจเจพ เจตเจฟเฉฑเจš เจจเจฟเจฐเจงเจพเจฐเจค เจฎเจพเจชเจฆเฉฐเจกเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃ เจฆเจพ เจฎเฉŒเจ•เจพ เจฎเจฟเจฒเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจธเจ•เฉเจฐเจฟเจชเจŸ เจตเจฟเฉฑเจš เจ•เฉเจ เจœเจพเจ‚เจšเจพเจ‚ เจ•เจฐเจฆเฉ‡ เจนเจจ (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• เจ—เจฒเจค เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจจเจฟเจฐเจงเจพเจฐเจฟเจค URL)เฅค

nginx.conf

location = /auth-provider {
  internal;

  proxy_pass $auth_url;
}

location = /auth {
  internal;

  proxy_set_header Content-Length "";
  proxy_pass_request_body off;
  js_content auth.auth;
}

location ~ "^/(?<prefix>[w-]*)[/]?(?<postfix>[w-.]*)$" {
  auth_request /auth;

  js_content s3.request;
}

s3.js

var env = process.env;
var env_bool = new RegExp(/[Tt]rue|[Yy]es|[Oo]n|[TtYy]|1/);
var auth_disabled  = env_bool.test(env.DISABLE_AUTH);
var gitlab_url = env.AUTH_URL;

function url() {
  return `${gitlab_url}/jwt/auth?service=container_registry`
}

function auth(r) {
  if (auth_disabled) {
    r.return(202, '{"auth": "disabled"}');
    return null
  }

  r.subrequest('/auth-provider',
                {method: 'GET', body: ''},
                function(res) {
                  r.return(res.status, "");
                });
}

export default {auth, url}

เจธเจญ เจคเฉ‹เจ‚ เจตเฉฑเจง เจธเฉฐเจญเจพเจตเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจ‡เจน เจธเจตเจพเจฒ เจชเฉˆเจฆเจพ เจนเฉเฉฐเจฆเจพ เจนเฉˆ: -เจ•เจฟเจ‰เจ‚ เจจเจพ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ‡ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹? เจธเจญ เจ•เฉเจ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ‰เฉฑเจฅเฉ‡ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ! เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, var AWS = require('aws-sdk') เจ…เจคเฉ‡ S3 เจชเฉเจฐเจฎเจพเจฃเจฟเจ•เจคเจพ เจจเจพเจฒ "เจฌเจพเจˆเจ•" เจฒเจฟเจ–เจฃ เจฆเฉ€ เจ•เฉ‹เจˆ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ!

เจ†เจ‰ เจจเฉเจ•เจธเจพเจจ เจตเฉฑเจฒ เจตเจงเฉ€เจ

เจฎเฉ‡เจฐเฉ‡ เจฒเจˆ, เจฌเจพเจนเจฐเฉ€ JS เจฎเฉ‹เจกเฉ€เจŠเจฒ เจ†เจฏเจพเจค เจ•เจฐเจจ เจฆเฉ€ เจ…เจธเจฎเจฐเฉฑเจฅเจพ เจ‡เฉฑเจ• เจ•เฉ‹เจเจพ, เจชเจฐ เจ‰เจฎเฉ€เจฆ เจ•เฉ€เจคเฉ€ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจฌเจฃ เจ—เจˆ. เจ‰เจชเจฐเฉ‹เจ•เจค เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš เจฆเจฐเจธเจพเจˆ เจฒเฉ‹เฉœ ('เจ•เฉเจฐเจฟเจชเจŸเฉ‹') เจนเฉˆ เจฌเจฟเจฒเจก-เจ‡เจจ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจฒเจˆ เจธเจฟเจฐเจซ เจ•เฉฐเจฎ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจคเฉ‹เจ‚ เจ•เฉ‹เจก เจฆเฉ€ เจฎเฉเฉœ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเจพ เจ•เฉ‹เจˆ เจคเจฐเฉ€เจ•เจพ เจตเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ เจ…เจคเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจธเจจเฉ‚เฉฐ เจตเฉฑเจ–-เจตเฉฑเจ– เจซเจพเจˆเจฒเจพเจ‚ เจตเจฟเฉฑเจš เจ•เจพเจชเฉ€ เจ…เจคเฉ‡ เจชเฉ‡เจธเจŸ เจ•เจฐเจจเจพ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจฎเฉˆเจจเฉ‚เฉฐ เจ‰เจฎเฉ€เจฆ เจนเฉˆ เจ•เจฟ เจ•เจฟเจธเฉ‡ เจฆเจฟเจจ เจ‡เจน เจ•เจพเจฐเจœเจธเจผเฉ€เจฒเจคเจพ เจฒเจพเจ—เฉ‚ เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เฉ€เฅค

Nginx เจตเจฟเฉฑเจš เจฎเฉŒเจœเฉ‚เจฆเจพ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฒเจˆ เจ•เฉฐเจชเจฐเฉˆเจธเจผเจจ เจจเฉ‚เฉฐ เจตเฉ€ เจ…เจฏเฉ‹เจ— เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ gzip off;

เจ•เจฟเจ‰เจ‚เจ•เจฟ NJS เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ gzip เจฎเฉ‹เจกเฉ€เจŠเจฒ เจจเจนเฉ€เจ‚ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจจเฉˆเจ•เจŸ เจ•เจฐเจจเจพ เจ…เจธเฉฐเจญเจต เจนเฉˆ; เจ‡เจธเจฒเจˆ, เจธเฉฐเจ•เฉเจšเจฟเจค เจกเฉ‡เจŸเจพ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฆเจพ เจ•เฉ‹เจˆ เจคเจฐเฉ€เจ•เจพ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจ‡เจน เจธเฉฑเจš เจนเฉˆ เจ•เจฟ เจ‡เจธ เจ•เฉ‡เจธ เจฒเจˆ เจ‡เจน เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ˜เจŸเจพเจ“ เจจเจนเฉ€เจ‚ เจนเฉˆ. เจ‡เฉฑเจฅเฉ‡ เจฌเจนเฉเจค เจธเจพเจฐเจพ เจŸเฉˆเจ•เจธเจŸ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ…เจคเฉ‡ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจธเฉฐเจ•เฉเจšเจฟเจค เจนเจจ เจ…เจคเฉ‡ เจตเจพเจงเฉ‚ เจ•เฉฐเจชเจฐเฉˆเจธเจผเจจ เจ‰เจนเจจเจพเจ‚ เจฆเฉ€ เจฌเจนเฉเจค เจœเจผเจฟเจ†เจฆเจพ เจฎเจฆเจฆ เจจเจนเฉ€เจ‚ เจ•เจฐเฉ‡เจ—เจพ. เจจเจพเจฒ เจนเฉ€, เจ‡เจน เจ…เจœเจฟเจนเฉ€ เจฒเฉ‹เจก เจ•เฉ€เจคเฉ€ เจœเจพเจ‚ เจจเจพเจœเจผเฉเจ• เจธเฉ‡เจตเจพ เจจเจนเฉ€เจ‚ เจนเฉˆ เจ•เจฟ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจฎเฉฑเจ—เจฐเฉ€ เจจเฉ‚เฉฐ เจ•เฉเจ เจฎเจฟเจฒเฉ€เจธเจ•เจฟเฉฐเจŸ เจคเฉ‡เจœเจผเฉ€ เจจเจพเจฒ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจ เจฒเจˆ เจชเจฐเฉ‡เจธเจผเจพเจจ เจนเฉ‹เจฃเจพ เจชเจเจ—เจพเฅค

เจธเจ•เฉเจฐเจฟเจชเจŸ เจจเฉ‚เฉฐ เจกเฉ€เจฌเฉฑเจ— เจ•เจฐเจจ เจตเจฟเฉฑเจš เจฒเฉฐเจฌเจพ เจธเจฎเจพเจ‚ เจฒเฉฑเจ—เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจน error.log เจตเจฟเฉฑเจš "เจชเฉเจฐเจฟเฉฐเจŸเจธ" เจฐเจพเจนเฉ€เจ‚ เจนเฉ€ เจธเฉฐเจญเจต เจนเฉˆเฅค เจธเฉˆเฉฑเจŸ เจฒเฉŒเจ—เจฟเฉฐเจ— เจชเฉฑเจงเจฐ เจฆเฉ€ เจœเจพเจฃเจ•เจพเจฐเฉ€, เจšเฉ‡เจคเจพเจตเจจเฉ€ เจœเจพเจ‚ เจ—เจฒเจคเฉ€ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเจฟเจ†เจ‚, เจ•เฉเจฐเจฎเจตเจพเจฐ 3 เจตเจฟเจงเฉ€เจ†เจ‚ r.log, r.warn, r.error เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ เจธเฉฐเจญเจต เจนเฉˆเฅค เจฎเฉˆเจ‚ Chrome (v8) เจœเจพเจ‚ njs เจ•เฉฐเจธเฉ‹เจฒ เจŸเฉ‚เจฒ เจตเจฟเฉฑเจš เจ•เฉเจ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจกเฉ€เจฌเฉฑเจ— เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจฆเจพ เจนเจพเจ‚, เจชเจฐ เจ‰เฉฑเจฅเฉ‡ เจนเจฐ เจšเฉ€เจœเจผ เจฆเฉ€ เจœเจพเจ‚เจš เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพ เจธเจ•เจฆเฉ€. เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจกเฉ€เจฌเฉฑเจ— เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡, เจ‰เจฐเจซเจผ เจซเฉฐเจ•เจธเจผเจจเจฒ เจŸเฉˆเจธเจŸเจฟเฉฐเจ—, เจ‡เจคเจฟเจนเจพเจธ เจ•เฉเจ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ:

docker-compose restart nginx
curl localhost:8080/
docker-compose logs --tail 10 nginx

เจ…เจคเฉ‡ เจ…เจœเจฟเจนเฉ‡ เจธเฉˆเจ‚เจ•เฉœเฉ‡ เจ•เฉเจฐเจฎ เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจเฅค

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

ES6 เจฒเจˆ เจ•เฉ‹เจˆ เจชเฉ‚เจฐเจพ เจธเจฎเจฐเจฅเจจ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

เจ•เฉเจ เจนเฉ‹เจฐ เจ•เจฎเฉ€เจ†เจ‚ เจนเฉ‹ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจ, เจชเจฐ เจฎเฉˆเจจเฉ‚เฉฐ เจนเฉ‹เจฐ เจ•เฉเจ เจจเจนเฉ€เจ‚ เจฎเจฟเจฒเจฟเจ†เฅค เจœเจพเจฃเจ•เจพเจฐเฉ€ เจธเจพเจ‚เจเฉ€ เจ•เจฐเฉ‹ เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ NJS เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเจพ เจจเจ•เจพเจฐเจพเจคเจฎเจ• เจ…เจจเฉเจญเจต เจนเฉˆเฅค

เจธเจฟเฉฑเจŸเจพ

NJS เจ‡เฉฑเจ• เจนเจฒเจ•เจพ เจ“เจชเจจ-เจธเฉ‹เจฐเจธ เจฆเฉเจญเจพเจธเจผเฉ€เจ เจนเฉˆ เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ Nginx เจตเจฟเฉฑเจš เจตเฉฑเจ–-เจตเฉฑเจ– JavaScript เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจ‡เจธเจฆเฉ‡ เจตเจฟเจ•เจพเจธ เจฆเฉ‡ เจฆเฉŒเจฐเจพเจจ, เจชเฉเจฐเจฆเจฐเจธเจผเจจ 'เจคเฉ‡ เจฌเจนเฉเจค เจงเจฟเจ†เจจ เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจธเฉ€. เจฌเฉ‡เจธเจผเฉฑเจ•, เจ…เจœเฉ‡ เจตเฉ€ เจฌเจนเฉเจค เจ•เฉเจ เจ—เฉเฉฐเจฎ เจนเฉˆ, เจชเจฐ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ›เฉ‹เจŸเฉ€ เจŸเฉ€เจฎ เจฆเฉเจ†เจฐเจพ เจตเจฟเจ•เจธเจค เจ•เฉ€เจคเจพ เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‰เจน เจธเจฐเจ—เจฐเจฎเฉ€ เจจเจพเจฒ เจจเจตเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœ เจฐเจนเฉ‡ เจนเจจ เจ…เจคเฉ‡ เจฌเฉฑเจ— เจซเจฟเจ•เจธ เจ•เจฐ เจฐเจนเฉ‡ เจนเจจ. เจฎเฉˆเจจเฉ‚เฉฐ เจ‰เจฎเฉ€เจฆ เจนเฉˆ เจ•เจฟ เจ•เจฟเจธเฉ‡ เจฆเจฟเจจ NJS เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฌเจพเจนเจฐเฉ€ เจฎเฉˆเจกเจฟเจŠเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเฉ‡เจตเฉ‡เจ—เจพ, เจœเฉ‹ เจ•เจฟ Nginx เจ•เจพเจฐเจœเจ•เฉเจธเจผเจฒเจคเจพ เจจเฉ‚เฉฐ เจฒเจ—เจญเจ— เจฌเฉ‡เจ…เฉฐเจค เจฌเจฃเจพ เจฆเฉ‡เจตเฉ‡เจ—เจพ. เจชเจฐ เจ‡เฉฑเจฅเฉ‡ NGINX เจชเจฒเฉฑเจธ เจนเฉˆ เจ…เจคเฉ‡ เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจธเฉฐเจญเจพเจตเจจเจพ เจนเฉˆ เจ•เจฟ เจ•เฉ‹เจˆ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจจเจนเฉ€เจ‚ เจนเฉ‹เจฃเจ—เฉ€เจ†เจ‚!

เจฒเฉ‡เจ– เจฒเจˆ เจชเฉ‚เจฐเฉ‡ เจ•เฉ‹เจก เจจเจพเจฒ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€

njs-pypi AWS เจธเจพเจˆเจจ v4 เจธเจนเจฟเจฏเฉ‹เจ— เจจเจพเจฒ

ngx_http_js_module เจฎเฉ‹เจกเฉ€เจŠเจฒ เจฆเฉ‡ เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจฆเจพ เจตเฉ‡เจฐเจตเจพ

เจ…เจงเจฟเจ•เจพเจฐเจค NJS เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ ะธ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ

เจฆเจฎเจฟเฉฑเจคเจฐเฉ€ เจตเฉ‹เจฒเจฟเฉฐเจŸเจธเฉ‡เจต เจคเฉ‹เจ‚ NJS เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚

njs - nginx เจตเจฟเฉฑเจš เจฎเฉ‚เจฒ JavaScript เจธเจ•เฉเจฐเจฟเจชเจŸเจฟเฉฐเจ— / เจธเฉ‡เจ‚เจŸ เจนเจพเจˆเจฒเฉ‹เจก++ 2019 เจตเจฟเจ–เฉ‡ เจฆเจฎเจฟเฉฑเจคเจฐเฉ€ เจตเฉ‹เจฒเจจเฉ€เจต เจฆเฉเจ†เจฐเจพ เจญเจพเจธเจผเจฃ

เจ‰เจคเจชเจพเจฆเจจ เจตเจฟเฉฑเจš NJS / เจนเจพเจˆเจฒเฉ‹เจก++ 2019 'เจคเฉ‡ เจตเฉˆเจธเฉ€เจฒเฉ€ เจธเฉ‹เจธเจผเจจเฉ€เจ•เฉ‹เจต เจฆเฉเจ†เจฐเจพ เจญเจพเจธเจผเจฃ

AWS เจตเจฟเฉฑเจš REST เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ 'เจคเฉ‡ เจนเจธเจคเจพเจ–เจฐ เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจชเฉเจฐเจฎเจพเจฃเจฟเจค เจ•เจฐเจจเจพ

เจธเจฐเฉ‹เจค: www.habr.com