Cynhyrchu cyfluniadau ar gyfer nginx, hanes cais un tynnu

Cyfarchion, cymrodyr. Hardd ar fy gweinyddion ymladd nginx wedi bod yn rhedeg ers 2006 a thros y blynyddoedd o weinyddu rwyf wedi cronni llawer o gyfluniadau a thempledi. Canmolais llawer o nginx a rhywsut daeth i'r amlwg fy mod hyd yn oed wedi dechrau canolbwynt nginx ar y canolbwynt, hefyd, dangoswch m/
Gofynnodd ffrindiau i mi sefydlu fferm ddatblygu ar eu cyfer, ac yn lle llusgo fy nhempledi penodol iddynt, cofiais am brosiect diddorol nginxconfig.io, sy'n gwasgaru cyfluniadau ar y silffoedd ac yn paratoi popeth ar gyfer gosod amgryptio, ac ati. Roeddwn i'n meddwl, pam lai? Fodd bynnag, cefais fy nghynhyrfu gan y ffaith bod nginxconfig yn cynnig imi lawrlwytho'r archif sip i'r porwr, heb ganiatΓ‘u imi ei uwchlwytho'n uniongyrchol i'r gweinydd gan ddefnyddio wget/fetch/curl. Pa nonsens, pam mae ei angen arnaf yn y porwr, mae ei angen arnaf ar y gweinydd o'r consol. Yn ddig, es i github i weld perfedd y prosiect, a arweiniodd at ei fforc ac, o ganlyniad, cais tynnu. Na fyddwn i'n ysgrifennu amdano pe na bai'n ddiddorol πŸ˜‰

Cynhyrchu cyfluniadau ar gyfer nginx, hanes cais un tynnu

Wrth gwrs, cyn cloddio i mewn i'r ffynonellau, edrychais ar ble mae Chrome yn tynnu'r archif sip a gynhyrchir gyda chyfluniadau, ac roedd cyfeiriad yn dechrau gyda "blob:" yn aros amdanaf, wps. Mae eisoes wedi dod yn amlwg nad yw'r gwasanaeth yn cynhyrchu unrhyw beth ar hyd y ffordd, mewn gwirionedd, mae'r cyfan yn cael ei wneud gan js. Yn wir, mae'r archif zip yn cael ei gynhyrchu gan y cleient, porwr, a javascript ei hun. Y rhai. y harddwch yw bod y prosiect nginxconfig.io gellir ei gadw'n syml fel tudalen html, ei lanlwytho i rai narod.ru a bydd yn gweithio) Mae hwn yn ddatrysiad doniol a diddorol iawn, fodd bynnag, mae'n hynod anghyfleus ar gyfer sefydlu gweinyddwyr, mewn gwirionedd, yn union ar gyfer yr hyn y crΓ«wyd y prosiect hwn. Dadlwythwch yr archif a gynhyrchir gyda phorwr, ac yna ei drosglwyddo i'r gweinydd gan ddefnyddio nc... yn 2019? Gosodais y dasg i mi fy hun o ddod o hyd i ffordd i lawrlwytho'r cyfluniad canlyniadol yn uniongyrchol i'r gweinydd.
Ar Γ΄l fforchio'r prosiect, dechreuais feddwl beth oedd fy opsiynau. Cymhlethwyd y dasg gan y ffaith nad oeddwn am wyro oddi wrth yr amod y dylai'r prosiect barhau i fod yn ben blaen pur, heb unrhyw Γ΄l-ben. Wrth gwrs, yr ateb symlaf fyddai tynnu nodejs i fyny a'i orfodi i gynhyrchu archif gyda chyfluniadau gan ddefnyddio dolenni uniongyrchol.
Mewn gwirionedd, nid oedd llawer o opsiynau. Yn fwy manwl gywir, dim ond un ddaeth i'r meddwl. Mae angen i ni sefydlu'r configs a chael dolen y gallwn ei chopΓ―o i'r consol gweinydd i gael archif zip.
Roedd sawl ffeil testun yn yr archif sip a ddeilliodd o hynny yn pwyso cryn dipyn, yn llythrennol ychydig cilobeit. Yr ateb amlwg oedd cael y llinyn base64 o'r archif zip a gynhyrchir a'i daflu i'r byffer, tra ar y gweinydd gyda'r gorchymyn yn y consol

echo 'base64string' | base64 --decode > config.zip

gallem greu'r un ffeil zip hon.

nginxconfig.io wedi'i ysgrifennu yn AngularJS, ni allaf hyd yn oed ddychmygu pa gilometrau o god y byddai eu hangen pe na bai'r awdur wedi dewis fframwaith js adweithiol. Ond gallaf ddychmygu'n berffaith faint yn symlach a harddach y gellid gweithredu hyn i gyd yn VueJS, er bod hwn yn bwnc hollol wahanol.
Yn adnoddau'r prosiect gwelwn ddull ar gyfer cynhyrchu archif sip:

$scope.downloadZip = function() {
	var zip = new JSZip();

	var sourceCodes = $window.document.querySelectorAll('main .file .code.source');

	for (var i = 0; i < sourceCodes.length; i++) {
		var sourceCode = sourceCodes[i];

		var name	= sourceCode.dataset.filename;
		var content	= sourceCode.children[0].children[0].innerText;

		if (!$scope.isSymlink() && name.match(/^sites-available//)) {
			name = name.replace(/^sites-available//, 'sites-enabled/');
		}

		zip.file(name, content);

		if (name.match(/^sites-available//)) {
			zip.file(name.replace(/^sites-available//, 'sites-enabled/'), '../' + name, {
				unixPermissions: parseInt('120755', 8),
			});
		}
	}

	zip.generateAsync({
		type: 'blob',
		platform: 'UNIX',
	}).then(function(content) {
		saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
	});

	gtag('event', $scope.getDomains().join(','), {
		event_category: 'download_zip',
	});
};

mae popeth yn eithaf syml, gan ddefnyddio'r llyfrgell jszip CrΓ«ir sip lle gosodir y ffeiliau ffurfweddu. Ar Γ΄l creu'r archif sip, mae js yn ei fwydo i'r porwr gan ddefnyddio'r llyfrgell FfeilSaver.js:

saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');

lle mae cynnwys yn wrthrych blob canlyniadol yr archif sip.

Iawn, y cyfan roedd yn rhaid i mi ei wneud oedd ychwanegu botwm arall wrth ei ymyl a phan gliciais arno, ni fyddwn yn arbed yr archif zip canlyniadol i'r porwr, ond yn cael y cod base64 ohono. Ar Γ΄l chwarae o gwmpas ychydig, cefais 2 ddull, yn lle dim ond un downloadZip:

$scope.downloadZip = function() {
	generateZip(function (content) {
		saveAs(content, 'nginxconfig.io-' + $scope.getDomains().join(',') + '.zip');
	});

	gtag('event', $scope.getDomains().join(','), {
		event_category: 'download_zip',
	});
};
$scope.downloadBase64 = function() {
	generateZip(function (content) {
		var reader = new FileReader();
		reader.readAsDataURL(content);
		reader.onloadend = function() {
			var base64 = reader.result.replace(/^data:.+;base64,/, '');
			// Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ base64 ΠΊΠ°ΠΊ Ρ€Π°Π· Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠ½Π΅ zip Π°Ρ€Ρ…ΠΈΠ² Π² Π²ΠΈΠ΄Π΅ base64 строки
		}
	});

	gtag('event', $scope.getDomains().join(','), {
		event_category: 'download_base64',
	});
};

Fel y gallech fod wedi sylwi, symudais genhedlaeth yr archif zip ei hun i'r dull generaduZip preifat, ac ati. AngularJS yw hwn, ac mae'r awdur ei hun yn glynu at alwadau'n Γ΄l ac ni wnaeth ei weithredu trwy addewidion. Roedd downloadZip yn dal i arbedAs fel allbwn, tra bod downloadBase64 wedi gwneud rhywbeth ychydig yn wahanol. Rydym yn creu gwrthrych FileReader a ddaeth atom yn html5 ac sydd eisoes yn eithaf hygyrch ar gyfer defnydd. Sydd, ar un adeg, yn gallu gwneud llinyn base64 o blob, neu yn hytrach, mae'n gwneud llinyn DataURL, ond nid yw hyn mor bwysig i ni, oherwydd Mae DataURL yn cynnwys yn union yr hyn sydd ei angen arnom. Bingo, roedd ychydig bach o snag yn fy aros pan geisiais roi hyn i gyd yn y byffer. Defnyddiodd yr awdur y llyfrgell yn y prosiect clipfwrddjs, sy'n eich galluogi i weithio gyda'r clipfwrdd heb wrthrychau fflach, yn seiliedig ar y testun a ddewiswyd. I ddechrau, penderfynais roi fy sylfaen64 mewn elfen gydag arddangosfa: dim;, ond yn yr achos hwn ni allwn ei roi ar y clipfwrdd oherwydd dim gwahaniad yn digwydd. Felly, yn lle arddangos: dim; mi wnes i

position: absolute;
z-index: -1;
opacity: 0;

a oedd yn caniatΓ‘u i mi guddio'r elfen o'r golwg a'i gadael ar y dudalen. Voila, cwblhawyd y dasg, pan gliciais ar fy botwm, gosodwyd llinell fel hon yn y byffer:

echo 'base64string' | base64 --decode > config.zip

a gludais i mewn i'r consol ar y gweinydd a derbyniais archif sip ar unwaith gyda'r holl gyfluniadau.
Ac, wrth gwrs, anfonais gais tynnu at yr awdur, oherwydd ... mae'r prosiect yn weithgar ac yn fywiog, hoffwn weld diweddariadau gan yr awdur a chael fy botwm fy hun) I'r rhai sydd Γ’ diddordeb, dyma hi fy fforch prosiect ac ef ei hun cais tynnu, lle gallwch chi weld beth wnes i ei gywiro/ychwanegu.
Datblygiad hapus pawb)

Cynhyrchu cyfluniadau ar gyfer nginx, hanes cais un tynnu

Ffynhonnell: hab.com

Ychwanegu sylw