αα
αααα»αα’αααααααααααα»αα
ααα
ααααααααααα·ααααααααααααα»αααΆαα½α NJS αααααΆα’ααααααααα JavaScript αααααΆαα Nginx ααααααααΎαα‘αΎαααα Nginx Inc ααααααααΆα’αααΈαααααααΆαα
ααααααααααΆαααααααΎα§ααΆα αααααΆαααααααα NJS ααΊααΆαααα»ααααα JavaScript αααα’αα»ααααΆαα±ααα’ααααααααΈααα»αααΆααααα Nginx α αα
ααΉααααα½α
ααΆβααΌαβααΆβααΆααβααβα αΎαβ¦
αα
ααΆαααΆαα
α»αααααααααααααα»α αααα»αααΆαααα½ααααα gitlab ααΆαα½αααΉαααααα CI/CD motley ααΆα
αααΎαααΆαα½αααΉα docker-compose, dind αα·αααΆαααΈαααΆααααααααα αααααααΌαααΆαααααααα
kaniko rails α ααΌαααΆαβαααβααααΌαβααΆαβααααΎβααΈαα»αβαααα»α CI ααααΌαβααΆαβααααΆααααΈβαααα»αβααααααβααΎαβααααβαα½αααα αα½αααααΆαααααΎααΆααααΆαααααΉαααααΌααα αΌααααααααααα IP gitlab ααααααΎαααΆαααααΆααααααΌα α αΎα CI αααααα
ααΆαααα
α αααα αΆααΊααΆααΌαααΆα docker αα½ααααααΆαα
αΌααα½ααααα»α CI ααΆα git αααααΆααααΌαα»α Python ααΆαααα ssh α αααααΆαα ssh α’αααβααααΌαβααΆαβααα―ααα α αΎα... ααΆβααΆαβαα
βαααα»αβααΌαααΆαβααΆαα½αβααΉαβ know_hosts α α αΎα CI ααΆαα½αααΆααααΆαααααΆαα½αααΉαααα α»ααααα»αααΆααααααααααΆαααααααΉααααααΆαααααΆααα·ααααΈααααΆαααΆα IP αα·αααααΆαα αα·ααα½ααααααΆααααααΆαααα
αααα»α know_hosts α ααΌαααΆαααααΈαα½αααααΌαααΆααααααΌααααα»ααααΆαααΆαααα ααααΈ Dockfiles αααααΆαααααΆαα α αΎααααααΎαααααΌαααΆααααααα StrictHostKeyChecking no
. ααα»ααααααααΆαα·αα·αααα’αα
ααααΆα α αΎαααΆαααααααααΆααααΆα
ααααααΆααααΈ libs αα
ααααΆαα PyPI α―αααα ααααΆαααααααΆαααααααα αααααΆααααΈααααΌααα
PyPI α―ααα ααΊααΆααααααααααΆααααα½αααΆα αα·αααΆααα·αααααΆααααααΆαα requirement.txt
αααααΎαβααΆαβααααΎβα αΎαβαα»ααΆαβααΆααΈ!
ααΎαααααΎαααΆαα’αααΈααααααααΆααα αααα»αααα αα·α Kubernetes α αΎααα ααΈαααα ααααΎαα ααααα½αααΆαααααΆααααααΌα αα½ααααααΆαα»αααΊααααααααααΆαααααααΆαα½αααΉααααααααααα»αααΆααααα α ααΆααΆααααααΎαααΆαα, α αΆααααΆααααΈααΎαααααΎ S3, α’αΆαα·ααΆαααααΌαααΆαααααααα α±ααααΆα α αΎαααααα·αααΎα’αΆα ααααΎαα ααΆα ααΆαα½αααΉαααΆααααααααααΆαααα αααα»α gitlab (α’αααα’αΆα ααααααααΆααααααα½αα―αααααα·αααΎα αΆαααΆα α) α
ααΆαααααααααα αααααααααααααααΆα αααΎαα s3pypi, pypicloud αα·ααααααΎαααΆαα½αααΆααααααΎαα―αααΆα html αααααΆαα turnips "ααααα" α αααααΎαα α»ααααααααΆαααΆαααααα½αα
s3pypiα αααααΊααΆ cli αααααΆααααααΎααααΆαα S3 hostingα ααΎααααα»αα‘αΎαα―αααΆα αααααΎα html α αΎααααα ααααΆαα αααα»ααα»ααααα½αα ααΆααααααααΆααααΆαααααΎααααΆαααα ααααα
pypicloudα ααΆα αΆααααΌα ααΆαααααααα½αα±ααα αΆααα’αΆαααααααα½α ααα»αααααααααΆααααΈααΆαα’αΆαα―αααΆα αααα»αααΆαααΆαααα α·αααα αααααΈααΆααΆαα―αααΆαααα’ αα·ααααααααΆααααα»αααΆααααααΈαα±αααααααααα ααΉααααααΌαααΆαααααα’αααααααα ααα»ααααααΆααα·αααΆαααααα ααΆαααααααΌαααΆαααα ααα αα·ααα·ααΆααααα»αααΆαααααααα ααΆααααααααα ααΆαααααΌαα±ααααααΉααα·α αα ααΆαααααα’ααα ααααα ααΆαααΆααααΆααααααΆααα ααααααααΉαα αααΆαααα 3-5 ααααα ααααΆααααααααααΌαααΆαααΌαααααΆααα·αααααααααααα ααΎααα»αααΆα αα αααα»αααααΈαααααΎααααα·αααΎαα’αααΈαααααα
ααΆαααααααααααΈααααα αααααααααααΆαααααααααααααααΌαα»ααααααΆαα Nginx, ngx_aws_auth α ααααααααααΆαααααΎαααααααααααΆααααΊ XML ααααΌαααΆααααα αΆααα αααα»ααααααα·ααΈαα»αααααααααα αΆαααΈααΆαα·ααΆαααα»α S3 α ααΆαααααααααΆα α·αααα α»αααααααα αααααααΆααααααααααΊααΆαααΈαα½αααααΆααα»αα ααααΆααααΎααα ααααΌαααααααααα ααα
αααα
αΌααα
ααΆααααααααα·αα’αΆα
αααααα§ααΆα ααααααααΆααΌαααααΆα αα½αααααααααααααααα»αααΆαααΎααα αααα»ααααααα·ααΈαα»ααααααααααα»αααΌα XML ααΌα αααααααΎαααΌαα»α ngx_aws_auth ααα»ααααα’αααΈαααααΌαααΆαααααααα½α α αΎααα αααα»α JS α
αααα»ααα·αααΆα αΌαα α·ααααααααααααΆα nginx α ααΈαα½α α―αααΆαααα’ αα·αα§ααΆα αααααΆα αααΎα ααΈααΈα ααΎαααα½αααΆαα’αααααααααααααΆααα’αααααα Nginx αααααΆααααααΎααΆαααΆαα½αα―αααΆα (αααα αααα’αα) ααΈααΈα’αααααΆααααΆαααααααΉαααΈαααααααααααΆαααααααααααΆαα Nginx ααΉαα’αΆα ααΉαααΆααΎααΆα’αααΈα ααΆαααΌα ααΆα ααααΆααΆαααΌααα½ααααααΆαααααα»αααα ααΎαααααααααα ααΉα Python α¬ Go (ααααα·αααΎαααααααΈααΎα) αα·αααααΌααα·ααΆαααΈ nexus ααα
TL;DR αααααΆααααΈ 2 αααα ααααααΆααααααα PyPi ααααΌαααΆαααααΎααααΆαααα½α α αΎααα αααα»α CI α
ααΎααΆααααΎαααΆααααΆαααΌα ααααα ?
αααΌαα»αααααΌαααΆααααα»ααα
αααα»α Nginx ngx_http_js_module
αα½ααααα
αΌααα
αααα»αααΌαααΆα docker ααααΌαααΆαα ααΎαααΆαα
αΌαααααααΈαααααααΎααααααααΎααΆαααααΆα js_import
αα
ααΆαααααααα
ααΆαααααααα Nginx α αα»αααΆαααααΌαααΆαα α
αααααΆαααααΆα 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 ααααααααΆααααΆααααααααα’ααααααααΌαααΆααααααΎα αααααααΌαααΆαα
α»αα αααααααΆ (HMAC_SHA1) αααααααΎ SECRET_KEY α αααααΆααααΊααΆαααααΆααααΌα
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 Sign 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 α ααααα·αααΎα’αααααααΌαααΆαααα½αααΆαααΆαα·ααΆαα "root" αααα’αααααααΌααααααΎαααααΎ uri ααααααα αΆαααΈαααααΆαααααα delimiter
αααααΉααααα‘αααααααΈααααΆαα» CommonPrefixes xml ααΆααα’αααααααααΌαααααΆααΉααα (αααα»αααααΈ PyPI αααααΈαααα
ααααΆααα’αα)α ααααα·αααΎα’αααααααΌαααΆαααΎααααΈααα½αααΆααααααΈααααΆαα·ααΆαα
αααα»αααααΆααααΆαααα½α (αααααΈαααααααααα
ααααΆααα’αα) αααααααΎ 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>"00000000000000000000000000000000-1"</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>"b2d76df4aeb4493c5456366748218093"</ETag>
<Size>93183</Size>
<Owner>
<ID>02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4</ID>
<DisplayName></DisplayName>
</Owner>
<StorageClass>STANDARD</StorageClass>
</Contents>
</ListBucketResult>
ααΈαααααΈα―αααΆαααΎαααΉαααααααΆαα» Key
.
α’αααΈααααα ααααααααΊααΎααααΈααα XML αααααα α αΎαααααΎααΆα ααααΆ HTML αααααΆααααα½αααααααΆ Content-Type ααΆααααΌαααΆαα½α text/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="/km/${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
ααΎαααααΎαααααααααΆαα½α libs ααααααΎαα
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π»Ρ ΡΠ΅ΡΡΠΎΠ² Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅
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 αααααΆααααΆααααααααααΆαα/ααΆαα’αα»ααααΆαααααΆααααααΆααααα α αααααααΎααΆαααααΆα auth_request αα αααα»α Nginx ααΎαααΉαααααΌααα·ααα·αααααααααααααααΆαααα ααΆααααααΎαααααααΆαααΆαα α αα»αααΆααα αααα»αααααααΈαα ααααααΈαααΉαααααΎααααΎαααα½αααααα ααΆαα url Gitlab α αΎαααααα·αααΎαα·αααααααααααααααΆααααΆαααααΉαααααΌαααααΌαααΆααααααΆααααααΉαααααΌαααα Gitlab ααΉααααα‘αααααααΌα 200 α αΎαααΆααααα αα/ααΆααααααα ααααΉαααααΌαααΆαα’αα»ααααΆαα α ααα»α’αααΈαα·αααααΎ subquery αα½α α αΎαααααΎαα·ααααααααααΆαααα Gitlab? αααααΆααααααααα ααΎαααΉαααααΌαααααααα½αα―αααΆαααααααα ααΆαααααααα Nginx ααΆααααααααααΎαααααΎααΆαααααΆααααααΌαααΆαα½ααααα»αααΆαα’αα»ααααΆα α αΎααααααΊααΆαα·α αα ααΆααααα½αα±αααα»αααααΆααα ααααα ααααα·αααΎ Kubernetes ααααΎαααααΆαααααααααααα―αααΆαα«αααΆαααα’αΆα αααααΆααΉαααααααααΆααααα»αααααΆαααααααααααα ααααααα½α nginx.conf ααΆαααα configmap α α αΎαααΆαα·αα’αΆα αα αα½α αααααα»αααΆαααααααα ααΆαααααααα Nginx ααΆαααα configmap αααα»ααααααααΆαααααΆαααααααΎαααααΆαααα αΆαααΆααααΆααααααΆααααααΆα (pvc) αα·αααααααααα―αααΆα root ααΆαααα’αΆα (ααΆααααΎαα‘αΎαααααα) α
αααααααΎ 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') α αΎααα·αα αΆαααΆα αααααα βbikeβ ααΆαα½αααΉαααΆααααααααααΆαα S3 αα!
α αΌαααΎααααααα αααα»ααα·ααααα·
αααααΆαααααα»α α’αααααααΆααααα»αααΆαααΆαα
αΌααααΌαα»α JS ααΆααααα
ααΆαααααΆαααΆαα»αααΆααα·ααααααΆαα
α·ααα ααα»ααααααααΉααα»αα ααΆααα·αααααΆαα
αααα»αα§ααΆα αααααΆαααΎααΆαααΆα ('crypto') ααΊ
ααΆααααα αΆααααααααΌααααα·ααααααΆαααααααααα
αα
α»αααααααα
αααα»α Nginx αααααα gzip off;
αααααΆααααα·αααΆααααΌαα»α gzip αα αααα»α NJS α αΎαααΆαα·αα’αΆα αα αα½α αααααα»αααΆααααααΆααααΆ ααΌα ααααα αΎα ααΆαα·αααΆααα·ααΈααΎααααΈααααΎααΆαααΆαα½ααα·αααααααααααΆααααα αΆαααααααα αα·α ααααα·ααααααΆααΆααααααααΆααααααΈαααααα αα·αααΆαα’αααααα αααΎααα α αΎαα―αααΆααααααΆααααααααααΌαααΆααααα αΆαααα½α α αΎα α αΎαααΆααααα αΆααααααααααΉααα·ααα½ααα½αααα αααΎαααα ααΌα ααααΆαααααααα ααααα·ααααααΆααααΆααααααααααα»α α¬ααααΆααααααα αααα’αααααααΌαααααΆαααΆαα½αααΉαααΆαα ααα αΆαααΆαα·ααΆααΏαααΆαααΈαααΈαα·ααααΈαα·ααΆααΈα
ααΆαααααΆααααα α»αααααααΈαα αααΆααααααΌα α αΎαα’αΆα ααααΎαα ααΆαααααΆαααα "ααΆαααααα»ααα" αα αααα»α 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
α αΎαααΆα’αΆα ααΆαααΆααααααααΆααα
ααΆααααααααΌααααααααΎαααα½ααα αα·αα’ααααααααΆαααα½αααΆαααααα ααΆ tangle tangle α αααααααα’αααα αΆααααααΎααααααΆαααααααΆαααα»ααα·ααααα’α½α IDE ααααααααααΆαααααααΆααΆααααααααααααΆαααααααααααΆαααααΌαααααα’αααα ααΆαα·ααα·ααΆααα ααα»αααααααααααααΆααααΆαααααΆααααΆααα
αα·αααΆαααΆαααΆαααααααααααααααΆαα ES6 ααα
ααΆβα’αΆα βααΉαβααΆαβα ααα»α βααααααΆαβαα½αβα ααα½αβαααααβααα ααα»ααααβαααα»αβαα·αβααΆαβαα½αβαααααβα’αααΈβαααααβαααβααα α αααααααααααααΆα ααααα·αααΎα’αααααΆααααα·αααααα’αα·αααααΆααααα»αααΆαααααΎααααΆαα NJSα
ααα ααααΈααααα·ααααΆα
NJS ααΊααΆα’ααααααααααααααααΎαα αα αααααΆαααααααααααΆααααα’αα»ααααΆαα±ααα’αααα’αα»ααααααααααΈα JavaScript αααααααα αααα»α Nginx α αααα»αα’αα‘α»ααααααααΆαα’αα·ααααααααααααΆ ααΆαααα α·ααααα»αααΆαααααΆαααααΆααααααΌαααΆαααα α·ααααα»αααΆααα ααααααΆαα’αα»ααααα ααΆααΆααα·αααΆαα αα ααΆαα ααα»α ααααααΆαααΆα αααΎα ααα»ααααααααααααααααα»αααααΌαααΆααααααΎαα‘αΎαααααααα»αααΌα αα½α α αΎααα½ααααααα»ααααααααααΆααααααααΌααα»αααΆαααααΈα αα·ααα½ααα»αααα α»αα αααα»ααααααΉαααΆααααααΆαα½α NJS ααΉαα’αα»ααααΆαα±ααα’αααααααΆαααααΌαα»αααΆααααα αααααΉαααααΎα±αααα»αααΆα Nginx ααααΎαααααααΆαααααααααα ααα»ααααααΆα NGINX Plus α αΎαααααααΆαα·αααΆααααααααα·ααααα!
ααααα: www.habr.com