Ġenerazzjoni ta 'konfigurazzjonijiet għal nginx, storja ta' talba waħda ta 'ġibda

Tislijiet, sħabi. Beautiful fuq is-servers tal-ġlieda tiegħi nginx ilha taħdem mill-2006 u matul is-snin tal-amministrazzjoni tagħha akkumulajt ħafna konfigurazzjonijiet u mudelli. Faħħar ħafna nginx u b'xi mod irriżulta li anke bdejt hub nginx fuq il-hub, ukoll, turi m/
Il-ħbieb talbuni nwaqqaf razzett ta’ żvilupp għalihom, u minflok kaxkruhom il-mudelli speċifiċi tiegħi, ftakart fi proġett interessanti nginxconfig.io, li jxerred il-konfigurazzjonijiet fuq l-ixkafef u jipprepara kollox għal lets encrypt, eċċ. Ħsibt, għaliex le? Madankollu, kont infurjat bil-fatt li nginxconfig joffrini li tniżżel l-arkivju zip fil-browser, mingħajr ma tħallini ntellah direttament fuq is-server billi tuża wget/fetch/curl. Liema nonsense, għaliex għandi bżonnha fil-browser, għandi bżonnha fuq is-server mill-console. Irrabjata, mort fuq github biex nara l-imsaren tal-proġett, li wassal għall-furketta tiegħu u, bħala riżultat, talba ta 'ġibda. Li ma niktebx li kieku ma kienx interessanti 😉

Ġenerazzjoni ta 'konfigurazzjonijiet għal nginx, storja ta' talba waħda ta 'ġibda

Naturalment, qabel ma ħaffer fis-sorsi, ħarist lejn fejn Chrome jiġbed l-arkivju zip iġġenerat b'konfigurazzjonijiet, u hemm indirizz li jibda b'"blob:" kien qed jistenni, oops. Diġà deher ċar li s-servizz ma jiġġenera xejn tul it-triq, fil-fatt, dan kollu jsir minn js. Tabilħaqq, l-arkivju zip huwa ġġenerat mill-klijent, il-brawżer, u l-javascript innifsu. Dawk. is-sbuħija hija li l-proġett nginxconfig.io jistgħu jiġu ssejvjati sempliċiment bħala paġna html, imtella fuq xi wħud narod.ru u se taħdem) Din hija soluzzjoni umoristiċi u interessanti ħafna, madankollu, hija terriblement inkonvenjenti għat-twaqqif ta 'servers, fil-fatt, eżattament għal dak li nħoloq dan il-proġett. Niżżel l-arkivju ġġenerat b'browser, u mbagħad ittrasferih fuq is-server billi tuża nc... fl-2019? I stabbilixxa lili nnifsi l-kompitu li nsib mod biex tniżżel il-konfigurazzjoni li tirriżulta direttament fuq is-server.
Wara li għamilt il-proġett, bdejt naħseb dwar x'kienu l-għażliet tiegħi. Il-kompitu kien ikkumplikat mill-fatt li ma ridtx niddevja mill-kundizzjoni li l-proġett għandu jibqa 'front-end pur, mingħajr ebda back-end. Naturalment, l-aktar soluzzjoni sempliċi tkun li tiġbed in-nodejs u ġġiegħel tiġġenera arkivju b'konfigurazzjonijiet bl-użu ta 'links diretti.
Fil-fatt, ma kienx hemm ħafna għażliet. B'mod aktar preċiż, wieħed biss ġie f'moħħi. Irridu nwaqqfu l-konfigurazzjonijiet u nġibu link li nistgħu nikkopjaw fuq il-console tas-server biex niksbu arkivju zip.
Diversi fajls tat-test fl-arkivju zip li rriżulta kienu jiżnu pjuttost ftit, litteralment ftit kilobytes. Is-soluzzjoni ovvja kienet li tikseb is-sekwenza base64 mill-arkivju zip iġġenerat u tarmiha fil-buffer, filwaqt li fuq is-server bil-kmand fil-console

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

nistgħu noħolqu dan l-istess fajl zip.

nginxconfig.io inkiteb f'AngularJS, lanqas nista' nimmaġina liema kilometri ta 'kodiċi kienu jkunu meħtieġa kieku l-awtur ma għażilx qafas js reattiv. Imma nista 'nimmaġina perfettament kemm dan kollu jista' jiġi implimentat f'VueJS aktar sempliċi u sabiħ, għalkemm dan huwa suġġett kompletament differenti.
Fir-riżorsi tal-proġett naraw metodu biex jiġi ġġenerat arkivju 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',
	});
};

kollox huwa pjuttost sempliċi, bl-użu tal-librerija jszip Jinħoloq zip fejn jitqiegħdu l-fajls tal-konfigurazzjoni. Wara li ħoloq l-arkivju zip, js jagħtih lill-browser billi juża l-librerija FileSaver.js:

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

fejn il-kontenut huwa l-oġġett blob li jirriżulta tal-arkivju zip.

Ok, kull ma kelli nagħmel kien li nżid buttuna oħra ħdejha u meta kklikkja fuqha, ma kontx insalva l-arkivju zip li jirriżulta fil-browser, iżda nikseb il-kodiċi base64 minnu. Wara li ddawwar ftit, sibt 2 metodi, minflok downloadZip wieħed biss:

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

Kif forsi ndunajt, ċċaqlaqt il-ġenerazzjoni tal-arkivju zip innifsu għall-metodu privat generateZip, eċċ. Dan huwa AngularJS, u l-awtur innifsu jżomm ma 'callbacks u ma implimentahx permezz ta' wegħdiet. downloadZip xorta għamel saveAs bħala output, filwaqt li downloadBase64 għamel xi ħaġa kemmxejn differenti. Noħolqu oġġett FileReader li wasal għandna f'html5 u diġà huwa pjuttost aċċessibbli għall-użu. Li, f'ħin wieħed, jista 'jagħmel string base64 minn blob, jew aħjar, jagħmel string DataURL, iżda dan mhux daqshekk importanti għalina, għaliex DataURL fih eżattament dak li neħtieġu. Bingo, ftit snag tistennieni meta ppruvajt inpoġġi dan kollu fil-buffer. L-awtur uża l-librerija fil-proġett clipboardjs, li jippermettilek taħdem mal-clipboard mingħajr oġġetti flash, ibbażata fuq it-test magħżul. Inizjalment, iddeċidejt li npoġġi l-base64 tiegħi f'element b'display:none;, iżda f'dan il-każ ma stajtx inpoġġiha fuq il-clipboard għax ma sseħħ l-ebda separazzjoni. Għalhekk, minflok wiri: xejn; Jien għamilt

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

li ppermettili kemm naħbi l-element mill-vista kif ukoll inħallih fil-paġna. Voila, il-kompitu tlesta, meta għafast fuq il-buttuna tiegħi, linja bħal din tqiegħdet fil-buffer:

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

li sempliċement daħħalt fil-console fuq is-server u immedjatament irċivejt arkivju zip bil-konfigurazzjonijiet kollha.
U, ovvjament, bgħatt pull request lill-awtur, għax... il-proġett huwa attiv u ħaj, nixtieq nara aġġornamenti mill-awtur u jkolli l-buttuna tiegħi) Għal dawk interessati, hawn qiegħed il-furketta tiegħi proġett u lilu nnifsu tiġbed it-talba, fejn tista' tara dak li kkoreġejt/żidt.
Żvilupp it-tajjeb lil kulħadd)

Ġenerazzjoni ta 'konfigurazzjonijiet għal nginx, storja ta' talba waħda ta 'ġibda

Sors: www.habr.com

Żid kumment