Uzalishaji wa usanidi wa nginx, historia ya ombi moja la kuvuta

Salamu, wandugu. Nzuri kwenye seva zangu za mapigano nginx imekuwa ikifanya kazi tangu 2006 na kwa miaka mingi ya usimamizi wake nimekusanya usanidi na violezo vingi. Nilisifu nginx sana na kwa njia fulani ikawa kwamba hata nilianzisha kitovu cha nginx kwenye kitovu, pia, ninaonyesha m/
Marafiki waliniuliza niwawekee shamba la maendeleo, na badala ya kuwaburuta violezo vyangu mahususi, nilikumbuka mradi wa kuvutia. nginxconfig.io, ambayo hutawanya usanidi kwenye rafu na kuandaa kila kitu kwa lets encrypt, nk. Nilifikiri, kwa nini sivyo? Walakini, nilikasirishwa na ukweli kwamba nginxconfig inanipa kupakua kumbukumbu ya zip kwenye kivinjari, bila kuniruhusu kuipakia moja kwa moja kwa seva kwa kutumia wget/fetch/curl. Ni upuuzi gani, kwa nini ninahitaji kwenye kivinjari, ninahitaji kwenye seva kutoka kwa koni. Kwa hasira, nilikwenda kwa github ili kuona utumbo wa mradi huo, ambao ulisababisha uma wake na, kwa sababu hiyo, ombi la kuvuta. Ambayo nisingeandika ikiwa haipendezi πŸ˜‰

Uzalishaji wa usanidi wa nginx, historia ya ombi moja la kuvuta

Bila shaka, kabla ya kuchimba kwenye vyanzo, niliangalia ambapo Chrome huchota kumbukumbu ya zip iliyozalishwa na usanidi, na pale anwani inayoanza na "blob:" ilikuwa inaningoja, lo! Tayari imekuwa wazi kuwa huduma haitoi chochote njiani, kwa kweli, yote yanafanywa na js. Hakika, kumbukumbu ya zip inatolewa na mteja, kivinjari, na javascript yenyewe. Wale. uzuri ni kwamba mradi nginxconfig.io inaweza kuhifadhiwa tu kama ukurasa wa html, kupakiwa kwa baadhi narod.ru na itafanya kazi) Hii ni suluhisho la kuchekesha na la kufurahisha sana, hata hivyo, ni ngumu sana kwa kusanidi seva, kwa kweli, haswa kwa kile mradi huu uliundwa. Pakua kumbukumbu iliyotengenezwa na kivinjari, kisha uihamishe kwa seva ukitumia nc... mwaka wa 2019? Nilijiwekea kazi ya kutafuta njia ya kupakua usanidi unaosababishwa moja kwa moja kwa seva.
Baada ya kugawa mradi, nilianza kufikiria chaguzi zangu ni nini. Kazi hiyo ilikuwa ngumu na ukweli kwamba sikutaka kuachana na hali ya kuwa mradi huo unapaswa kubaki mbele safi, bila mwisho wowote. Kwa kweli, suluhisho rahisi zaidi itakuwa kuvuta nodejs na kuilazimisha kutoa kumbukumbu na usanidi kwa kutumia viungo vya moja kwa moja.
Kwa kweli, hakukuwa na chaguzi nyingi. Kwa usahihi, ni moja tu iliyokuja akilini. Tunahitaji kusanidi mipangilio na kupata kiungo ambacho tunaweza kunakili kwenye dashibodi ya seva ili kupata kumbukumbu ya zip.
Faili kadhaa za maandishi katika hifadhi ya zip iliyosababishwa zilikuwa na uzito kidogo, kilobaiti chache. Suluhisho dhahiri lilikuwa kupata kamba ya base64 kutoka kwa kumbukumbu ya zip iliyotengenezwa na kuitupa kwenye buffer, wakati kwenye seva na amri kwenye koni.

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

tunaweza kuunda faili hii ya zip.

nginxconfig.io iliandikwa kwa AngularJS, siwezi hata kufikiria ni kilomita gani za nambari zingehitajika ikiwa mwandishi hangechagua mfumo tendaji wa js. Lakini naweza kufikiria kikamilifu jinsi hii yote rahisi na nzuri zaidi inaweza kutekelezwa katika VueJS, ingawa hii ni mada tofauti kabisa.
Katika rasilimali za mradi tunaona njia ya kutengeneza kumbukumbu ya zip:

$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',
	});
};

kila kitu ni rahisi sana, kwa kutumia maktaba jszip Zip imeundwa ambapo faili za usanidi zimewekwa. Baada ya kuunda kumbukumbu ya zip, js inalisha kwa kivinjari kwa kutumia maktaba FileSaver.js:

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

ambapo yaliyomo ni matokeo ya kipengee cha hifadhi ya zip.

Sawa, nilichohitaji kufanya ni kuongeza kitufe kingine kando yake na nilipobofya, singehifadhi kumbukumbu ya zip iliyosababishwa kwenye kivinjari, lakini pata msimbo wa base64 kutoka kwake. Baada ya kuzunguka kidogo, nilipata njia 2, badala ya kupakuaZip moja tu:

$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',
	});
};

Kama unaweza kuwa umegundua, nilihamisha kizazi cha kumbukumbu ya zip kwa njia ya kibinafsi ya generateZip, na kadhalika. Hii ni AngularJS, na mwandishi mwenyewe anashikilia kwa kurudi nyuma na hakuitekeleza kupitia ahadi. downloadZip bado ilifanya saveAs kama pato, wakati downloadBase64 ilifanya kitu tofauti kidogo. Tunaunda kitu cha FileReader ambacho kilitujia katika html5 na tayari iko kabisa kupatikana kwa matumizi. Ambayo, kwa wakati mmoja, inaweza kutengeneza kamba ya base64 kutoka kwa blob, au tuseme, hufanya kamba ya DataURL, lakini hii sio muhimu sana kwetu, kwa sababu. DataURL ina kile tunachohitaji. Bingo, konokono kidogo liliningoja nilipojaribu kuweka haya yote kwenye bafa. Mwandishi alitumia maktaba katika mradi huo clipboardjs, ambayo inakuwezesha kufanya kazi na clipboard bila vitu vya flash, kulingana na maandishi yaliyochaguliwa. Hapo awali, niliamua kuweka base64 yangu kwenye kipengee kilicho na display:none;, lakini katika kesi hii sikuweza kuiweka kwenye ubao wa kunakili kwa sababu. hakuna utengano unaotokea. Kwa hiyo, badala ya kuonyesha:hakuna; nilifanya

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

ambayo iliniruhusu kuficha kitu hicho kisionekane na kwa kweli kukiacha kwenye ukurasa. Voila, kazi hiyo ilikamilishwa, nilipobofya kitufe changu, mstari kama huu uliwekwa kwenye buffer:

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

ambayo nilibandika tu kwenye koni kwenye seva na mara moja nikapokea kumbukumbu ya zip na usanidi wote.
Na, kwa kweli, nilituma ombi la kuvuta kwa mwandishi, kwa sababu ... mradi ni hai na hai, ningependa kuona sasisho kutoka kwa mwandishi na kuwa na kitufe changu) Kwa wale wanaopenda, hii hapa uma wangu mradi na mimi mwenyewe vuta ombi, ambapo unaweza kuona kile nilichosahihisha/kuongeza.
Maendeleo ya furaha kila mtu)

Uzalishaji wa usanidi wa nginx, historia ya ombi moja la kuvuta

Chanzo: mapenzi.com

Kuongeza maoni