Nifşa mîhengan ji bo nginx, dîroka yek daxwaza kişandinê

Silav hevalno. Li ser serverên min ên şerker xweş nginx ji sala 2006-an vir ve tê xebitandin û di salên rêveberiya wê de min gelek konfigurasyon û şablon berhev kirine. Min pir pesnê nginx da û bi rengekî derket holê ku min li ser hubê jî dest bi navgînek nginx kir, m/
Hevalan ji min xwestin ku ez ji wan re zeviyek pêşkeftinê saz bikim, û li şûna ku ez wan şablonên xwe yên taybetî bikişînim, projeyek balkêş hat bîra min. nginxconfig.io, ku mîhengan li ser refikan belav dike û her tiştî ji bo şîfrekirinê amade dike, hwd. Ez fikirîm, çima na? Lêbelê, ez ji vê yekê aciz bûm ku nginxconfig ji min re pêşkêş dike ku ez arşîva zip-ê li gerokê dakêşim, bêyî ku ez bihêlim ku ez wê rasterast li serverê bi karanîna wget/fetch/curl bar bikim. Çi bêaqil e, çima ez di gerokê de hewce dikim, ez li ser serverê ji konsolê hewce dikim. Hêrs bûm, ez çûm githubê da ku ez rûkeniya projeyê bibînim, ku rê li ber qurmê wê û, di encamê de, daxwazek kişandinê vekir. Ku ne balkêş bûya ez ê li ser nenivîsim 😉

Nifşa mîhengan ji bo nginx, dîroka yek daxwaza kişandinê

Bê guman, berî ku ez li çavkaniyan bigerim, min nihêrî ku Chrome arşîva zip-ê ya çêkirî bi mîhengan dikişîne, û li wir navnîşek ku bi "blob:" dest pê dike li benda min bû, oops. Jixwe eşkere bûye ku karûbar di rê de tiştek çê nake, bi rastî, ew hemî ji hêla js ve tê kirin. Bi rastî, arşîva zip ji hêla xerîdar, gerok û javascript bixwe ve tê çêkirin. Ewan. bedewî ew proje ye nginxconfig.io dikare bi hêsanî wekî rûpelek html-ê were hilanîn, li hinan were barkirin narod.ru û ew ê bixebite) Ev çareseriyek pir xweş û balkêş e, lêbelê, ew ji bo sazkirina serveran pir nerehet e, bi rastî, tam ji bo ku ev proje hatî afirandin. Arşîva hatî çêkirin bi gerokek dakêşin, û dûv re wê bi karanîna nc ... di sala 2019-an de veguhezînin serverê? Min ji xwe re peywirek da ku ez rêyek bibînim ku veavakirina encam rasterast li serverê dakêşim.
Piştî ku proje çewisand, min dest pê kir ku bifikirim ka vebijarkên min çi ne. Erk ji ber vê yekê tevlihev bû ku min nexwest ji şertê ku proje pêşekek paqij bimîne, bêyî paşverû bimîne. Bê guman, çareseriya herî hêsan dê ev be ku hûn nodejs bikişîne û wê neçar bike ku arşîvek bi mîhengan bi karanîna girêdanên rasterast çêbike.
Bi rastî, gelek vebijark tune bûn. Bi rastî, tenê yek hat bîra min. Pêdivî ye ku em mîhengan saz bikin û lînka ku em dikarin li konsolê serverê kopî bikin bistînin da ku arşîvek zip bistînin.
Di arşîva zip a encam de çend pelên nivîsê pir giran bûn, bi rastî çend kilobyte. Çareseriya eşkere ev bû ku hûn rêzika base64-ê ji arşîva zipê ya hatî çêkirin bistînin û bavêjin nav tamponê, dema ku li serverê bi fermana di konsolê de bû.

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

em dikarin heman pelê zip biafirînin.

nginxconfig.io di AngularJS de hate nivîsandin, ez nikarim xeyal bikim ku heke nivîskar çarçoveyek js-a reaktîf hilbijartibe dê kîjan kîlometre kod hewce bûya. Lê ez dikarim bêkêmasî bifikirim ka ev hemî sadetir û xweşiktir dikarin di VueJS de bêne bicîh kirin, her çend ev mijarek bi tevahî cûda ye.
Di çavkaniyên projeyê de em rêbazek ji bo afirandina arşîvek zip dibînin:

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

her tişt pir hêsan e, bi karanîna pirtûkxaneyê jszip Zipek tê çêkirin ku pelên vesazkirinê lê têne danîn. Piştî afirandina arşîva zip-ê, js wê bi karanîna pirtûkxaneyê bi gerokê dide FileSaver.js:

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

li ku derê naverok armanca blobê ya encam a arşîva zip e.

Ok, ya ku min bikira ev bû ku bişkokek din li tenişta wê zêde bikim û gava ku min lê bikira, ez ê arşîva zipê ya encam li gerokê xilas nekim, lê koda base64 jê bistînim. Piştî ku hinekî li dora xwe geriyam, li şûna yek dakêşana Zip, min 2 rêbaz girtin:

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

Wekî ku we ferq kiriye, min nifşê arşîva zip bi xwe veguhezand rêbaza generalZip ya taybet, û hwd. Ev AngularJS e, û nivîskar bixwe jî li ser bangawaziyan disekine û wê bi sozan pêk neaniye. downloadZip hîn jî saveAs wekî encamek kir, dema ku downloadBase64 tiştek hinekî cûda kir. Em hêmanek FileReader a ku di html5-ê de ji me re hat û jixwe pir e diafirînin navketî ji bo bikaranîna. Kîjan yek carî, dikare ji blobê rêzek base64 çêbike, an bêtir, ew rêzek DataURL çêdike, lê ev ji bo me ne ew qas girîng e, ji ber ku DataURL tam tiştê ku em hewce dike dihewîne. Bingo, dema ku min hewl da ku ez van hemîyan têxim nav tamponê, kêşek piçûk li benda min bû. Nivîskar di projeyê de pirtûkxane bikar anî clipboardjs, ku destûrê dide te ku hûn li ser bingeha nivîsa hilbijartî, bêyî hêmanên flashê bi clipboard re bixebitin. Di destpêkê de, min biryar da ku ez base64-a xwe têxim nav hêmanek bi pêşandan: tune;, lê di vê rewşê de min nekarî wê bixim ser clipboard ji ber ku cudabûn çênabe. Ji ber vê yekê, li şûna nîşan bide: tune; Min kir

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

ku hişt ku ez hem elementê ji ber çavan veşêrim û hem jî bi rastî li ser rûpelê bihêlim. Voila, peywir qediya, gava ku min li bişkoja xwe bikira, rêzek weha di tamponê de hate danîn:

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

ya ku min bi tenê di konsolê de li ser serverê vekir û tavilê arşîvek zip bi hemî veavakirinan wergirt.
Û, bê guman, min daxwaznameyek kişandinê ji nivîskar re şand, ji ber ku ... proje çalak û zindî ye, ez dixwazim nûvekirinên nivîskar bibînim û bişkojka xwe hebe) Ji bo kesên eleqedar, li vir e qaça min proje û xwe daxwaza vekişînê, li ku derê hûn dikarin bibînin ku min çi rast kir / lê zêde kir.
Pêşkeftina herkesî pîroz be)

Nifşa mîhengan ji bo nginx, dîroka yek daxwaza kişandinê

Source: www.habr.com

Add a comment