เด…เด‚เด—เต€เด•เดพเดฐเดตเตเด‚ S3 เด‰เด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดžเดพเตป เดŽเดจเตเดฑเต† เดธเตเดตเดจเตเดคเด‚ PyPI เดถเต‡เด–เดฐเด‚ เด‰เดฃเตเดŸเดพเด•เตเด•เดฟ. Nginx-เตฝ

เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ, Nginx Inc เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเดšเตเดš Nginx-เดจเตเดณเตเดณ JavaScript เดตเตเดฏเดพเด–เตเดฏเดพเดคเดพเดตเดพเดฏ NJS-เดฎเดพเดฏเดฟ เดŽเดจเตเดฑเต† เด…เดจเตเดญเดตเด‚ เดชเด™เตเด•เดฟเดŸเดพเตป เดžเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต, เด’เดฐเต เดฏเดฅเดพเตผเดคเตเดฅ เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดคเดฟเดจเตเดฑเต† เดชเตเดฐเดงเดพเดจ เด•เดดเดฟเดตเตเด•เตพ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต. Nginx-เดจเตเดฑเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ JavaScript-เดจเตเดฑเต† เด’เดฐเต เด‰เดชเดตเดฟเดญเดพเด—เดฎเดพเดฃเต NJS. เดŽเดจเตเดจ เดšเต‹เดฆเตเดฏเดคเตเดคเดฟเดจเต เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดตเตเดฏเดพเด–เตเดฏเดพเดคเดพเดตเต ??? เดฆเดฟเดฎเดฟเดคเตเดฐเดฟ เดตเต‹เดณเดฟเดจเตเดฑเตเดธเต†เดตเต เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เด‰เดคเตเดคเดฐเด‚ เดจเตฝเด•เดฟ. เดšเตเดฐเตเด•เตเด•เดคเตเดคเดฟเตฝ: NJS nginx-way เด†เดฃเต, เด•เต‚เดŸเดพเดคเต† JavaScript เด•เต‚เดŸเตเดคเตฝ เดชเตเดฐเต‹เด—เดฎเดจเดชเดฐเดตเตเด‚ "เดจเต‡เดฑเตเดฑเต€เดตเต" เด†เดฃเต, เดฒเตเดตเดพเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏเดฟ GC เด‡เดฒเตเดฒเดพเดคเตเดคเดคเตเดฎเดพเดฃเต.

เดตเดณเดฐเต†เด•เตเด•เดพเดฒเด‚ เดฎเตเดฎเตเดชเตโ€ฆ

เดŽเดจเตเดฑเต† เด…เดตเดธเดพเดจ เดœเต‹เดฒเดฟเดฏเดฟเตฝ, เดกเต‹เด•เตเด•เตผ-เด•เดฎเตเดชเต‹เดธเต, เดกเดฟเตปเดกเต, เดฎเดฑเตเดฑเต เดกเดฟเดฒเตˆเดฑเตเดฑเตเด•เตพ เดŽเดจเตเดจเดฟเดตเดฏเตเดณเตเดณ เดจเดฟเดฐเดตเดงเดฟ เดฎเต‹เดŸเตเดŸเตเดฒเดฟ เดธเดฟเด/เดธเดฟเดกเดฟ เดชเตˆเดชเตเดชเตเดฒเตˆเดจเตเด•เดณเตเดณเตเดณ เด—เดฟเดฑเตเดฑเตเดฒเดพเดฌเต เดŽเดจเดฟเด•เตเด•เต เดชเดพเดฐเดฎเตเดชเดฐเตเดฏเดฎเดพเดฏเดฟ เดฒเดญเดฟเดšเตเดšเต, เด…เดต เด•เดจเดฟเด•เตเด•เต‹ เดฑเต†เดฏเดฟเดฒเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดฑเตเดฑเดฟ. CI-เดฏเดฟเตฝ เดฎเตเดฎเตเดชเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดฟเดฐเตเดจเตเดจ เดšเดฟเดคเตเดฐเด™เตเด™เตพ เด…เดตเดฏเตเดŸเต† เดฏเดฅเดพเตผเดคเตเดฅ เดฐเต‚เดชเดคเตเดคเดฟเตฝ เดจเต€เด•เตเด•เดฟ. เดจเดฎเตเดฎเตเดŸเต† เด—เดฟเดฑเตเดฑเตโ€Œเดฒเดพเดฌเต เดเดชเดฟ เดฎเดพเดฑเดฟ เดธเดฟเด เดฎเดคเตเดคเด™เตเด™เดฏเดพเดฏเดฟ เดฎเดพเดฑเตเดจเตเดจเดคเต เดตเดฐเต† เด…เดตเตผ เดถเดฐเดฟเดฏเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดšเตเดšเต. เดธเดฟเดเดฏเดฟเตฝ เดชเด™เตเด•เต†เดŸเตเดคเตเดค เดกเต‹เด•เตเด•เตผ เดšเดฟเดคเตเดฐเด™เตเด™เดณเดฟเดฒเตŠเดจเตเดจเดฟเตฝ เดœเดฟเดฑเตเดฑเต เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด…เดคเต เดชเตˆเดคเตเดคเตบ เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เตพ ssh เดตเดดเดฟ เดตเดฒเดฟเดšเตเดšเต เดŽเดจเตเดจเดคเดพเดฃเต เดชเตเดฐเดถเตเดจเด‚. ssh-เดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดธเตเดตเด•เดพเดฐเตเดฏ เด•เต€ เด†เดตเดถเตเดฏเดฎเดพเดฃเต, เด•เต‚เดŸเดพเดคเต†... เด…เดคเต known_hosts-เดจเต‹เดŸเตŠเดชเตเดชเด‚ เดšเดฟเดคเตเดฐเดคเตเดคเดฟเตฝ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเต. เดฏเดฅเดพเตผเดคเตเดฅ IP-เดฏเตเด‚ known_hosts-เตฝ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเตเดณเตเดณเดคเตเด‚ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เดชเตŠเดฐเตเดคเตเดคเด•เตเด•เต‡เดŸเต เด•เดพเดฐเดฃเด‚ เด’เดฐเต เด•เต€ เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃ เดชเดฟเดถเด•เต เด•เดพเดฐเดฃเด‚ เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ CI เดชเดฐเดพเดœเดฏเดชเตเดชเต†เดŸเตเดŸเต. เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดกเต‹เด•เตเด•เตเดซเดฏเดฒเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เดชเตเดคเดฟเดฏ เดšเดฟเดคเตเดฐเด‚ เดชเต†เดŸเตเดŸเต†เดจเตเดจเต เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เตเด•เดฏเตเด‚ เด“เดชเตเดทเตป เดšเต‡เตผเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดคเต StrictHostKeyChecking no. เดŽเดจเตเดจเดพเตฝ เดฎเต‹เดถเด‚ เดฐเตเดšเดฟ เดคเตเดŸเตผเดจเตเดจเต, เดฒเดฟเดฌเตเด•เตพ เด’เดฐเต เดธเตเดตเด•เดพเดฐเตเดฏ PyPI เดถเต‡เด–เดฐเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดฑเตเดฑเดพเดจเตเดณเตเดณ เด†เด—เตเดฐเดนเด‚ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเต. เดธเตเดตเด•เดพเดฐเตเดฏ PyPI-เดฏเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดฑเดฟเดฏเดคเดฟเดจเต เดถเต‡เดทเดฎเตเดณเตเดณ เด’เดฐเต เด…เดงเดฟเด• เดฌเต‹เดฃเดธเต, เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดชเตˆเดชเตเดชเต เดฒเตˆเดจเตเด‚ เด†เดตเดถเตเดฏเด•เดคเด•เดณเตเดŸเต† เด’เดฐเต เดธเดพเดงเดพเดฐเดฃ เดตเดฟเดตเดฐเดฃเดตเตเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต.

เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดคเตเดคเต, เดฎเดพเดจเตเดฏเดฐเต‡!

เดžเด™เตเด™เตพ เดŽเดฒเตเดฒเดพเด‚ เด•เตเดฒเต—เดกเตเด•เดณเดฟเดฒเตเด‚ เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเตเด•เดณเดฟเดฒเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดตเดธเดพเดจเด‚ เด’เดฐเต เดšเต†เดฑเดฟเดฏ เดธเต‡เดตเดจเด‚ เดฒเดญเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเดšเตเดšเต, เด…เดคเต เดฌเดพเดนเตเดฏ เดธเด‚เดญเดฐเดฃเดฎเตเดณเตเดณ เด’เดฐเต เดธเตโ€Œเดฑเตเดฑเต‡เดฑเตเดฑเตโ€Œเดฒเต†เดธเต เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเตผ เด†เดฏเดฟเดฐเตเดจเตเดจเต. เดถเดฐเดฟ, เดžเด™เตเด™เตพ S3 เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ, เด…เดคเดฟเดจเต เดฎเตเตปเด—เดฃเดจ เดจเตฝเด•เดฟ. เด•เต‚เดŸเดพเดคเต†, เดธเดพเดงเตเดฏเดฎเต†เด™เตเด•เดฟเตฝ, gitlab-เตฝ เด†เดงเดฟเด•เดพเดฐเดฟเด•เดคเดฏเต‹เดŸเต† (เด†เดตเดถเตเดฏเดฎเต†เด™เตเด•เดฟเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เดคเต เดšเต‡เตผเด•เตเด•เดพเดตเตเดจเตเดจเดคเดพเดฃเต).

เด’เดฐเต เดฆเตเดฐเตเดค เดคเดฟเดฐเดฏเตฝ เดจเดฟเดฐเดตเดงเดฟ เดซเดฒเด™เตเด™เตพ เดจเตฝเด•เดฟ: s3pypi, pypicloud เด•เต‚เดŸเดพเดคเต† เดŸเต‡เดฃเดฟเดชเตเดชเตเด•เตพเด•เตเด•เดพเดฏเดฟ html เดซเดฏเดฒเตเด•เตพ "เดฎเดพเดจเตเดตเตฝ" เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เด“เดชเตเดทเตป. เด…เดตเดธเดพเดจ เด“เดชเตเดทเตป เดธเตเดตเดฏเด‚ เด…เดชเตเดฐเดคเตเดฏเด•เตเดทเดฎเดพเดฏเดฟ.

s3pypi: เด‡เดคเต S3 เดนเต‹เดธเตเดฑเตเดฑเดฟเด‚เด—เต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต cli เด†เดฃเต. เดžเด™เตเด™เตพ เดซเดฏเดฒเตเด•เตพ เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ html เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด…เดคเต‡ เดฌเด•เตเด•เดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด—เดพเตผเดนเดฟเด• เด‰เดชเดฏเต‹เด—เดคเตเดคเดฟเดจเต เด…เดจเตเดฏเต‹เดœเตเดฏเด‚.

pypicloud: เด‡เดคเตŠเดฐเต เดฐเดธเด•เดฐเดฎเดพเดฏ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดชเต‹เดฒเต† เดคเต‹เดจเตเดจเดฟ, เดชเด•เตเดทเต‡ เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเตป เดตเดพเดฏเดฟเดšเตเดšเดคเดฟเดจเตเดถเต‡เดทเด‚ เดžเดพเตป เดจเดฟเดฐเดพเดถเดจเดพเดฏเดฟ. เดจเดฒเตเดฒ เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเดจเตเด‚ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด†เดตเดถเตเดฏเด™เตเด™เตพเด•เตเด•เดจเตเดธเดฐเดฟเดšเตเดšเต เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเตเด‚ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเดฟเดŸเตเดŸเตเด‚, เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ เด…เดคเต เด…เดจเดพเดตเดถเตเดฏเดตเตเด‚ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเดพเตป เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเดณเตเดณเดคเตเดฎเดพเดฏเดฟ เดฎเดพเดฑเดฟ. เดจเดฟเด™เตเด™เดณเตเดŸเต† เดŸเดพเดธเตโ€Œเด•เตเด•เตเด•เตพเด•เตเด•เต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฏ เดฐเต€เดคเดฟเดฏเดฟเตฝ เด•เต‹เดกเต เดถเดฐเดฟเดฏเดพเด•เตเด•เดพเตป, เด…เด•เตเด•เดพเดฒเดคเตเดคเต† เด•เดฃเด•เตเด•เตเด•เตพ เดชเตเดฐเด•เดพเดฐเด‚, 3-5 เดฆเดฟเดตเดธเดฎเต†เดŸเตเด•เตเด•เตเด‚. เดธเต‡เดตเดจเดคเตเดคเดฟเดจเต เด’เดฐเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเตเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เดฎเดฑเตเดฑเตŠเดจเตเดจเตเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเดพเดจเดพเด•เดพเดคเตเดค เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ เดžเด™เตเด™เตพ เด…เดคเต เด‰เดชเต‡เด•เตเดทเดฟเดšเตเดšเต.

เด•เต‚เดŸเตเดคเตฝ เด†เดดเดคเตเดคเดฟเดฒเตเดณเตเดณ เดคเดฟเดฐเดฏเตฝ Nginx, ngx_aws_auth เดŽเดจเตเดจเดคเดฟเดจเดพเดฏเตเดณเตเดณ เด’เดฐเต เดฎเตŠเดกเตเดฏเต‚เตพ เดจเตฝเด•เดฟ. เด…เดตเดจเตเดฑเต† เดชเดฐเดฟเดถเต‹เดงเดจเดฏเตเดŸเต† เดซเดฒเด‚ เดฌเตเดฐเต—เดธเดฑเดฟเตฝ XML เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเดšเตเดšเต, เด…เดคเต S3 เดฌเด•เตเด•เดฑเตเดฑเดฟเดจเตเดฑเต† เด‰เดณเตเดณเดŸเด•เตเด•เด‚ เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเต. เดคเดฟเดฐเดšเตเดšเดฟเตฝ เดธเดฎเดฏเดคเตเดคเต เด…เดตเดธเดพเดจ เด•เดฎเตเดฎเดฟเดฑเตเดฑเต เด’เดฐเต เดตเตผเดทเด‚ เดฎเตเดฎเตเดชเดพเดฏเดฟเดฐเตเดจเตเดจเต. เดถเต‡เด–เดฐเด‚ เด‰เดชเต‡เด•เตเดทเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดŸเดคเดพเดฏเดฟ เด•เดพเดฃเดชเตเดชเต†เดŸเตเดŸเต.

เด‰เดฑเดตเดฟเดŸเดคเตเดคเดฟเตฝ เดชเต‹เดฏเดฟ เดตเดพเดฏเดฟเดšเตเดšเตเด•เตŠเดฃเตเดŸเต PEP-503 เดˆเดšเตเดšเดฏเดฟเตฝ XML HTML เด†เดฏเดฟ เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเดพเดฎเต†เดจเตเดจเตเด‚ pip-เดจเต เดจเตฝเด•เดพเดฎเต†เดจเตเดจเตเด‚ เดžเดพเตป เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดฟ. Nginx, S3 เดŽเดจเตเดจเดฟเดตเดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด•เตเดฑเดšเตเดšเตเด•เต‚เดŸเดฟ เด—เต‚เด—เดฟเตพ เดšเต†เดฏเตเดคเดคเดฟเดจเต เดถเต‡เดทเด‚, Nginx-เดจเตเดณเตเดณ JS-เตฝ เดŽเดดเตเดคเดฟเดฏ S3-เดฒเต† เดชเตเดฐเดพเดฎเดพเดฃเต€เด•เดฐเดฃเดคเตเดคเดฟเดจเตเดฑเต† เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดžเดพเตป เด•เดฃเตเดŸเต. เด…เด™เตเด™เดจเต†เดฏเดพเดฃเต เดžเดพเตป NJS เดจเต† เดชเดฐเดฟเดšเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเดคเต.

เดˆ เด‰เดฆเดพเดนเดฐเดฃเด‚ เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเดฏเดฟ เดŽเดŸเตเดคเตเดคเดพเตฝ, เด’เดฐเต เดฎเดฃเดฟเด•เตเด•เต‚เดฑเดฟเดจเต เดถเต‡เดทเด‚ เดžเดพเตป เดŽเดจเตเดฑเต† เดฌเตเดฐเต—เดธเดฑเดฟเตฝ ngx_aws_auth เดฎเตŠเดกเตเดฏเต‚เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด…เดคเต‡ XML เด•เดฃเตเดŸเต, เดชเด•เตเดทเต‡ เดŽเดฒเตเดฒเดพเด‚ เด‡เดคเดฟเดจเด•เด‚ JS-เตฝ เดŽเดดเตเดคเดฟเดฏเดฟเดฐเตเดจเตเดจเต.

เดŽเดจเดฟเด•เตเด•เต nginx เดชเดฐเดฟเดนเดพเดฐเด‚ เดถเดฐเดฟเด•เตเด•เตเด‚ เด‡เดทเตเดŸเดชเตเดชเต†เดŸเตเดŸเต. เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดจเดฒเตเดฒ เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเดจเตเด‚ เดจเดฟเดฐเดตเดงเดฟ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเตเด‚, เดฐเดฃเตเดŸเดพเดฎเดคเดพเดฏเดฟ, เดซเดฏเดฒเตเด•เดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต Nginx-เดจเตเดฑเต† เดŽเดฒเตเดฒเดพ เด—เตเดฃเด™เตเด™เดณเตเด‚ เดžเด™เตเด™เตพเด•เตเด•เต เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเต (เดฌเต‹เด•เตโ€Œเดธเดฟเดจเต เดชเตเดฑเดคเตเดคเต), เดฎเต‚เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, Nginx-เดจเดพเดฏเดฟ เด•เต‹เตบเดซเดฟเด—เดฑเตเด•เตพ เดŽเด™เตเด™เดจเต† เดŽเดดเตเดคเดฃเดฎเต†เดจเตเดจเต เด…เดฑเดฟเดฏเตเดจเตเดจ เด†เตผเด•เตเด•เตเด‚ เดŽเดจเตเดคเดพเดฃเต†เดจเตเดจเต เดฎเดจเดธเดฟเดฒเดพเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚. เดชเตˆเดคเตเดคเตบ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด—เต‹ (เด†เดฆเตเดฏเด‚ เดฎเตเดคเตฝ เดŽเดดเตเดคเดฟเดฏเดพเตฝ) เดจเต†เด•เตโ€Œเดธเดธเต เดชเดฐเดพเดฎเตผเดถเดฟเด•เตเด•เดพเดคเต† เดคเดพเดฐเดคเดฎเตเดฏเดชเตเดชเต†เดŸเตเดคเตเดคเตเดฎเตเดชเต‹เตพ เดฎเดฟเดจเดฟเดฎเดฒเดฟเดธเดตเตเด‚ เดŽเดจเดฟเด•เตเด•เต เด’เดฐเต เดชเตเดฒเดธเต เด†เดฃเต.

TL;DR 2 เดฆเดฟเดตเดธเดคเตเดคเดฟเดจเต เดถเต‡เดทเด‚, PyPi-เดฏเตเดŸเต† เดŸเต†เดธเตเดฑเตเดฑเต เดชเดคเดฟเดชเตเดชเต เด‡เดคเดฟเดจเด•เด‚ CI-เดฏเดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต.

เด‡เดคเต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต?

เดฎเตŠเดกเตเดฏเต‚เตพ Nginx-เดฒเต‡เด•เตเด•เต เดฒเต‹เดกเตเดšเต†เดฏเตโ€Œเดคเต ngx_http_js_module, เด”เดฆเตเดฏเต‹เด—เดฟเด• เดกเต‹เด•เตเด•เตผ เดšเดฟเดคเตเดฐเดคเตเดคเดฟเตฝ เด‰เตพเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต. เดจเดฟเตผเดฆเตเดฆเต‡เดถเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดžเด™เตเด™เตพ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด‡เดฑเด•เตเด•เตเดฎเดคเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจเต js_importNginx เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเดฟเดฒเต‡เด•เตเด•เต. เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเต‡เดถเดชเตเดฐเด•เดพเดฐเดฎเดพเดฃเต เดซเด‚เด—เตโ€Œเดทเดจเต† เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเดคเต js_content. เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดธเดœเตเดœเดฎเดพเด•เตเด•เดพเตป เดจเดฟเตผเดฆเตเดฆเต‡เดถเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต js_set, เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดฟเตฝ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดซเด‚เด—เตเดทเตป เดฎเดพเดคเตเดฐเด‚ เด’เดฐเต เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเดพเดฏเดฟ เดŽเดŸเตเด•เตเด•เตเดจเตเดจเต. เดŽเดจเตเดจเดพเตฝ เดจเดฎเตเด•เตเด•เต NJS-เตฝ Nginx เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฎเดพเดคเตเดฐเดฎเต‡ เดธเดฌเตเด•เตเดตเดฑเดฟเด•เตพ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเต‚, เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ 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), เดˆ เดซเด‚เด—เตโ€Œเดทเตป เดตเดฟเดณเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดชเดฐเต‹เด•เตเดทเดฎเดพเดฏเดฟ เด•เดŸเดจเตเดจเตเดชเต‹เด•เตเดจเตเดจเต. เดธเดฌเตโ€Œเด•เตเดตเดธเตเดฑเตเดฑเต เดชเตเดฐเดคเดฟเด•เดฐเดฃเด‚ เดซเด‚เด—เตโ€Œเดทเดจเดฟเตฝ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเด‚ 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, เดกเดฏเดฑเด•เตโ€ŒเดŸเดฑเดฟเด•เดณเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸ เดŽเดฒเตเดฒเดพ เด•เต‹เดฎเตบเดชเตเดฐเดฟเดซเดฟเด•เตโ€Œเดธเดธเต xml เด˜เดŸเด•เด™เตเด™เดณเตเดŸเต†เดฏเตเด‚ เด’เดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเด‚ (PyPI-เดฏเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดŽเดฒเตเดฒเดพ เดชเดพเด•เตเด•เต‡เดœเตเด•เดณเตเดŸเต†เดฏเตเด‚ เด’เดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต). เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตโ€ŒเดŸ เดกเดฏเดฑเด•เตโ€ŒเดŸเดฑเดฟเดฏเดฟเตฝ (เดŽเดฒเตเดฒเดพ เดชเดพเด•เตเด•เต‡เดœเต เดชเดคเดฟเดชเตเดชเตเด•เดณเตเดŸเต†เดฏเตเด‚ เด’เดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต) เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‰เดณเตเดณเดŸเด•เตเด•เด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต เดฒเดญเดฟเด•เตเด•เดฃเดฎเต†เด™เตเด•เดฟเตฝ, uri เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเดฟเตฝ เดกเดฏเดฑเด•เตโ€ŒเดŸเดฑเดฟเดฏเตเดŸเต† เดชเต‡เดฐเต‹เดŸเตเด•เต‚เดŸเดฟเดฏ เด’เดฐเต เดชเตเดฐเดฟเดซเดฟเด•เตโ€Œเดธเต เดซเต€เตฝเดกเต เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚ (เดชเดพเด•เตเด•เต‡เดœเต) เดจเดฟเตผเดฌเดจเตเดงเดฎเดพเดฏเตเด‚ เด’เดฐเต เดธเตเดฒเดพเดทเดฟเตฝ เด…เดตเดธเดพเดจเดฟเด•เตเด•เตเดจเตเดจ /. เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด’เดฐเต เดกเดฏเดฑเด•เตเดŸเดฑเดฟเดฏเตเดŸเต† เด‰เดณเตเดณเดŸเด•เตเด•เด‚ เด†เดตเดถเตเดฏเดชเตเดชเต†เดŸเตเดฎเตเดชเต‹เตพ เด•เต‚เดŸเตเดŸเดฟเดฏเดฟเดŸเดฟเด•เตพ เดธเดพเดงเตเดฏเดฎเดพเดฃเต, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต. aiohttp-request, aiohttp-เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เดŽเดจเตเดจเต€ เดกเดฏเดฑเด•เตโ€ŒเดŸเดฑเดฟเด•เตพ เด‰เดฃเตเดŸเต, เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ /?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.

เดคเดคเตเดซเดฒเดฎเดพเดฏเตเดฃเตเดŸเดพเด•เตเดจเตเดจ 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="/ml/${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 เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเตฝ เดŽเดกเดฟเดฑเตเดฑเต เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดฟเดตเดฐเตเด‚, เด‡เดคเต เดคเดฟเด•เดšเตเดšเตเด‚ เดฎเดŸเตเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจ เดœเต‹เดฒเดฟเดฏเดพเดฃเต. เด•เต‚เดŸเดพเดคเต†, Kubernetes เด’เดฐเต เดฑเต€เดกเต-เด’เตบเดฒเดฟ เดฑเต‚เดŸเตเดŸเต เดซเดฏเตฝเดธเดฟเดธเตเดฑเตเดฑเด‚ เดจเดฏเดฎเดพเดฃเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต†เด™เตเด•เดฟเตฝ, เด•เต‹เตบเดซเดฟเด—เตเดฎเดพเดชเตเดชเต เดตเดดเดฟ nginx.conf เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด‡เดคเต เด•เต‚เดŸเตเดคเตฝ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดค เดจเตฝเด•เตเดจเตเดจเต. เดตเต‹เดณเตเดฏเด™เตเด™เดณเตเดŸเต† (pvc) เด•เดฃเด•เตเดทเตป เดจเดฟเดฐเต‹เดงเดฟเด•เตเด•เตเดจเตเดจ เดจเดฏเด™เตเด™เดณเตเด‚ เดฑเต€เดกเต-เด’เตบเดฒเดฟ เดฑเต‚เดŸเตเดŸเต เดซเดฏเตฝเดธเดฟเดธเตเดฑเตเดฑเดตเตเด‚ (เด‡เดคเตเด‚ เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเต) เด’เดฐเต‡เดธเดฎเดฏเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด•เต‹เตบเดซเดฟเด—เตเดฎเดพเดชเตเดชเต เดตเดดเดฟ 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 = เด†เดตเดถเตเดฏเด‚('aws-sdk') เด•เต‚เดŸเดพเดคเต† S3 เด†เดงเดฟเด•เดพเดฐเดฟเด•เดคเดฏเต‹เดŸเต† เด’เดฐเต "เดฌเตˆเด•เตเด•เต" เดŽเดดเตเดคเต‡เดฃเตเดŸ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ!

เดจเดฎเตเด•เตเด•เต เดชเต‹เดฐเดพเดฏเตเดฎเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เดพเด‚

เดŽเดจเตเดจเต† เดธเด‚เดฌเดจเตเดงเดฟเดšเตเดšเดฟเดŸเดคเตเดคเต‹เดณเด‚, เดฌเดพเดนเตเดฏ JS เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เตพ เด‡เดฑเด•เตเด•เตเดฎเดคเดฟ เดšเต†เดฏเตเดฏเดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเดฟเดฒเตเดฒเดพเดฏเตเดฎ เด…เดธเตเด–เด•เดฐเดตเตเด‚ เดŽเดจเตเดจเดพเตฝ เดชเตเดฐเดคเต€เด•เตเดทเดฟเดšเตเดšเดคเตเดฎเดพเดฏ เด’เดฐเต เดธเดตเดฟเดถเต‡เดทเดคเดฏเดพเดฏเดฟ เดฎเดพเดฑเดฟ. เดฎเตเด•เดณเดฟเดฒเต† เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเตฝ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เด†เดตเดถเตเดฏเด‚ ('เด•เตเดฐเดฟเดชเตเดฑเตเดฑเต‹') เด†เดฃเต เดฌเดฟเตฝเดฑเตเดฑเต-เด‡เตป เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เตพ เด…เดตเตผเด•เตเด•เตเดตเต‡เดฃเตเดŸเดฟ เดฎเดพเดคเตเดฐเด‚ เดชเตเดฐเดตเตƒเดคเตเดคเดฟเด•เตพ เด†เดตเดถเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต. เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด•เต‹เดกเต เดตเต€เดฃเตเดŸเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด’เดฐเต เดฎเดพเตผเด—เดตเตเดฎเดฟเดฒเตเดฒ, เดจเดฟเด™เตเด™เตพ เด…เดคเต เดตเตเดฏเดคเตเดฏเดธเตเดค เดซเดฏเดฒเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดชเด•เตผเดคเตเดคเดฟ เด’เดŸเตเดŸเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดŽเดจเตเดจเต†เด™เตเด•เดฟเดฒเตเด‚ เดˆ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดฎเต†เดจเตเดจเต เดžเดพเตป เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต.

Nginx-เดฒเต† เดจเดฟเดฒเดตเดฟเดฒเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเดพเดฏเดฟ เด•เด‚เดชเตเดฐเดทเตป เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเด•เตเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚ gzip off;

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

เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดกเต€เดฌเด—เตเด—เดฟเด‚เด—เต เดตเดณเดฐเต† เดธเดฎเดฏเดฎเต†เดŸเตเด•เตเด•เตเด‚, error.log-เดฒเต† "เดชเตเดฐเดฟเดจเตเดฑเตเด•เตพ" เดตเดดเดฟ เดฎเดพเดคเตเดฐเดฎเต‡ เด‡เดคเต เดธเดพเดงเตเดฏเดฎเดพเด•เต‚. เดธเต†เดฑเตเดฑเต เดฒเต‹เด—เดฟเด‚เด—เต เดฒเต†เดตเตฝ เด‡เตปเดซเต‹, เดฎเตเดจเตเดจเดฑเดฟเดฏเดฟเดชเตเดชเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเดฟเดถเด•เต เดŽเดจเตเดจเดฟเดตเดฏเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเต, เดฏเดฅเดพเด•เตเดฐเดฎเด‚ r.log, r.warn, r.error เดŽเดจเตเดจเดฟเด™เตเด™เดจเต† 3 เดฐเต€เดคเดฟเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚. Chrome (v8) เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ njs เด•เตบเดธเต‹เตพ เดŸเต‚เดณเดฟเตฝ เดšเดฟเดฒ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เดกเต€เดฌเด—เต เดšเต†เดฏเตเดฏเดพเตป เดžเดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเดจเตเดจเต, เดชเด•เตเดทเต‡ เดŽเดฒเตเดฒเดพเด‚ เด…เดตเดฟเดŸเต† เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ. เด•เต‹เดกเต เดกเต€เดฌเด—เตเด—เต เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ, เดซเด‚เด—เตเดทเดฃเตฝ เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต, เดšเดฐเดฟเดคเตเดฐเด‚ เด‡เดคเตเดชเต‹เดฒเต†เดฏเดพเดฃเต เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเดคเต:

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

เด…เดคเตเดคเดฐเด‚ เดจเต‚เดฑเตเด•เดฃเด•เตเด•เดฟเดจเต เดธเต€เด•เตเดตเตปเดธเตเด•เตพ เด‰เดฃเตเดŸเดพเด•เดพเด‚.

เด…เดตเดฏเตโ€Œเด•เตเด•เดพเดฏเดฟ เดธเดฌเตโ€Œเด•เตเดตเดฑเดฟเด•เดณเตเด‚ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เดณเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เต‹เดกเต เดŽเดดเตเดคเตเดจเตเดจเดคเต เด’เดฐเต เดชเดฟเดฃเดžเตเดž เด•เตเดฐเตเด•เตเด•เดพเดฏเดฟ เดฎเดพเดฑเตเดจเตเดจเต. เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เต‹เดกเดฟเดจเตเดฑเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเดŸเต† เด•เตเดฐเดฎเด‚ เด•เดฃเตเดŸเตเดชเดฟเดŸเดฟเด•เตเด•เดพเตป เดšเดฟเดฒ เดธเดฎเดฏเด™เตเด™เดณเดฟเตฝ เดจเดฟเด™เตเด™เตพ เดตเตเดฏเดคเตเดฏเดธเตเดค IDE เดตเดฟเตปเดกเต‹เด•เดณเดฟเตฝ เด“เดŸเดพเตป เดคเตเดŸเด™เตเด™เตเด‚. เด‡เดคเต เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเดณเตเดณ เด•เดพเดฐเตเดฏเดฎเดฒเตเดฒ, เดชเด•เตเดทเต‡ เดšเดฟเดฒเดชเตเดชเต‹เตพ เด‡เดคเต เดตเดณเดฐเต† เด…เดฐเต‹เดšเด•เดฎเดพเดฃเต.

ES6-เดจเต เดชเต‚เตผเดฃเตเดฃ เดชเดฟเดจเตเดคเตเดฃเดฏเดฟเดฒเตเดฒ.

เดฎเดฑเตเดฑเต เดšเดฟเดฒ เดชเต‹เดฐเดพเดฏเตเดฎเด•เตพ เด‰เดฃเตเดŸเดพเด•เดพเด‚, เดชเด•เตเดทเต‡ เดฎเดฑเตเดฑเตŠเดจเตเดจเตเด‚ เดžเดพเตป เดจเต‡เดฐเดฟเดŸเตเดŸเดฟเดŸเตเดŸเดฟเดฒเตเดฒ. NJS เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดจเต†เด—เดฑเตเดฑเต€เดตเต เด…เดจเตเดญเดตเด‚ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ เดตเดฟเดตเดฐเด™เตเด™เตพ เดชเด™เตเด•เดฟเดŸเตเด•.

เดคเต€เดฐเตเดฎเดพเดจเด‚

Nginx-เตฝ เดตเดฟเดตเดฟเดง JavaScript เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เดญเดพเดฐเด‚ เด•เตเดฑเดžเตเดž เด’เดฐเต เด“เดชเตเดชเตบ เดธเต‹เดดเตเดธเต เด‡เดจเตเดฑเตผเดชเตเดฐเต†เดฑเตเดฑเดฑเดพเดฃเต NJS. เด…เดคเดฟเดจเตเดฑเต† เดตเดฟเด•เดธเดจ เดธเดฎเดฏเดคเตเดคเต, เดชเตเดฐเด•เดŸเดจเดคเตเดคเดฟเตฝ เดตเดฒเดฟเดฏ เดถเตเดฐเดฆเตเดง เดšเต†เดฒเตเดคเตเดคเดฟ. เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เด‡เดจเดฟเดฏเตเด‚ เด’เดฐเตเดชเดพเดŸเต เดจเดทเตโ€ŒเดŸเดฎเดพเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต, เดชเด•เตเดทเต‡ เด’เดฐเต เดšเต†เดฑเดฟเดฏ เดŸเต€เดฎเดพเดฃเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเต, เด…เดตเตผ เดธเดœเต€เดตเดฎเดพเดฏเดฟ เดชเตเดคเดฟเดฏ เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ เดšเต‡เตผเด•เตเด•เตเด•เดฏเตเด‚ เดฌเด—เตเด•เตพ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด’เดฐเต เดฆเดฟเดตเดธเด‚ NJS เดจเดฟเด™เตเด™เดณเต† เดฌเดพเดนเตเดฏ เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เตพ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดฎเต†เดจเตเดจเต เดžเดพเตป เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเต Nginx เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเต† เดเดคเดพเดฃเตเดŸเต เดชเดฐเดฟเดงเดฟเดฏเดฟเดฒเตเดฒเดพเดคเตเดคเดคเดพเด•เตเด•เตเด‚. เดŽเดจเตเดจเดพเตฝ NGINX เดชเตเดฒเดธเต เด‰เดฃเตเดŸเต, เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เดธเดตเดฟเดถเต‡เดทเดคเด•เดณเตŠเดจเตเดจเตเด‚ เด‰เดฃเตเดŸเดพเด•เดฟเดฒเตเดฒ!

เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเดพเดฏเตเดณเตเดณ เดชเต‚เตผเดฃเตเดฃ เด•เต‹เดกเตเดณเตเดณ เดถเต‡เด–เดฐเด‚

AWS เดธเตˆเตป v4 เดชเดฟเดจเตเดคเตเดฃเดฏเตเดณเตเดณ njs-pypi

ngx_http_js_module เดฎเตŠเดกเตเดฏเต‚เดณเดฟเดจเตเดฑเต† เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเดŸเต† เดตเดฟเดตเดฐเดฃเด‚

เด”เดฆเตเดฏเต‹เด—เดฟเด• NJS เดถเต‡เด–เดฐเด‚ ะธ เดชเตเดฐเดฎเดพเดฃเต€เด•เดฐเดฃเด‚

เดฆเดฟเดฎเดฟเดคเตเดฐเดฟ เดตเต‹เดณเดฟเดจเตเดฑเตเดธเต†เดตเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ NJS เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ

njs - nginx-เดฒเต† เดจเต‡เดฑเตเดฑเต€เดตเต JavaScript เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดฟเด‚เด—เต / เดธเต†เดฏเดฟเดจเตเดฑเต เดนเตˆเดฒเต‹เดกเต++ 2019-เตฝ เดฆเดฟเดฎเดฟเดคเตเดฐเดฟ เดตเต‹เตพเดจเต†เดตเต เดจเดŸเดคเตเดคเดฟเดฏ เดชเตเดฐเดธเด‚เด—เด‚

เดจเดฟเตผเดฎเตเดฎเดพเดฃเดคเตเดคเดฟเตฝ เดŽเตป.เดœเต†.เดŽเดธเต / เดนเตˆเดฒเต‹เดกเต++ 2019-เตฝ เดตเดพเดธเดฟเดฒเดฟ เดธเต‹เดทเตเดจเดฟเด•เตเด•เต‹เดตเต เดจเดŸเดคเตเดคเดฟเดฏ เดชเตเดฐเดธเด‚เด—เด‚

AWS-เตฝ REST เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด’เดชเตเดชเดฟเดŸเตเด•เดฏเตเด‚ เดชเตเดฐเดพเดฎเดพเดฃเต€เด•เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

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