ГСнСрация ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠ² для nginx, история ΠΎΠ΄Π½ΠΎΠ³ΠΎ pull request

ΠŸΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽ, Ρ‚ΠΎΠ²Π°Ρ€ΠΈΡ‰ΠΈ. На ΠΌΠΎΠΈΡ… Π±ΠΎΠ΅Π²Ρ‹Ρ… сСрвСрах прСкрасный nginx крутится с 2006 Π³ΠΎΠ΄Π° ΠΈ Π·Π° Π³ΠΎΠ΄Ρ‹ Π΅Π³ΠΎ администрирования я Π½Π°ΠΊΠΎΠΏΠΈΠ» ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠ² ΠΈ шаблонов. Π― ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°Ρ…Π²Π°Π»ΠΈΠ²Π°Π» nginx ΠΈ ΠΊΠ°ΠΊ-Ρ‚ΠΎ Ρ‚Π°ΠΊ Π²Ρ‹ΡˆΠ»ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Ρ…Π°Π± nginx Π½Π° Ρ…Π°Π±Ρ€Π΅ Ρ‚ΠΎΠΆΠ΅ Π·Π°Π²Ρ‘Π» я, ΠΏΠΎΠ½Ρ‚Ρ‹ m/
Π”Ρ€ΡƒΠ·ΡŒΡ попросили ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ ΠΈΠΌ Π΄Π΅Π²Π΅Π»ΠΎΠΏΠ΅Ρ€ΡΠΊΡƒΡŽ Ρ„Π΅Ρ€ΠΌΡƒ ΠΈ вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚Π°Ρ‰ΠΈΡ‚ΡŒ ΠΈΠΌ свои спСцифичСскиС ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, я вспомнил ΠΏΡ€ΠΎ интСрСсный ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ nginxconfig.io, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ раскидываСт ΠΏΠΎ ΠΏΠΎΠ»ΠΊΠ°ΠΌ ΠΈ для lets encrypt всё Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ ΠΈΡ‚ΠΏ. Π― ΠΈ ΠΏΠΎΠ΄ΡƒΠΌΠ°Π», ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ ΠΈ Π½Π΅Ρ‚? Однако, ΠΌΠ½Π΅ бСсил Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ nginxconfig ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΌΠ½Π΅ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ zip Π°Ρ€Ρ…ΠΈΠ² Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€, Π½Π΅ позволяя ΡΠ»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ сразу Π½Π° сСрвак ΠΏΠΎ срСдствам wget/fetch/curl. Π§Ρ‚ΠΎ Π·Π° Π±Ρ€Π΅Π΄, Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ ΠΌΠ½Π΅ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅, ΠΌΠ½Π΅ ΠΎΠ½ Π½ΡƒΠΆΠ΅Π½ Π½Π° сСрвСрС ΠΈΠ· консоли. Разозлившись, я Π·Π°Π»Π΅Π· Π½Π° github ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ кишки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ Π΅Π³ΠΎ Ρ„ΠΎΡ€ΠΊΡƒ ΠΈ, ΠΊΠ°ΠΊ слСдствиС, pull request`Ρƒ. О ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ я Π±Ρ‹ Π½Π΅ стал ΠΏΠΈΡΠ°Ρ‚ΡŒ, Ссли Π±Ρ‹ ΠΎΠ½ Π½Π΅ Π±Ρ‹Π» интСрСсным πŸ˜‰

ГСнСрация ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠ² для nginx, история ΠΎΠ΄Π½ΠΎΠ³ΠΎ pull request

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΊΠΎΠ²Ρ‹Ρ€ΡΡ‚ΡŒ исходники, я посмотрСл ΠΎΡ‚ΠΊΡƒΠ΄Π° Ρ…Ρ€ΠΎΠΌ тянСт сгСнСрСнный zip Π°Ρ€Ρ…ΠΈΠ² с ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°ΠΌΠΈ, Π° Ρ‚Π°ΠΌ мСня ΠΆΠ΄Π°Π» адрСс, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉΡΡ с Β«blob:Β», ΠΎΠΏΠΏΠ°. Π£ΠΆΠ΅ стало понятно, Ρ‡Ρ‚ΠΎ ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ сСрвис Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΏΠΎ Ρ„Π°ΠΊΡ‚Ρƒ, Ρ‡Ρ‚ΠΎ это всё Π΄Π΅Π»Π°Π΅Ρ‚ js. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, zip Π°Ρ€Ρ…ΠΈΠ² Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ сам ΠΊΠ»ΠΈΠ΅Π½Ρ‚, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€, javascript. Π’.Π΅. ΠΏΡ€Π΅Π»Π΅ΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ nginxconfig.io ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ просто сохранён ΠΊΠ°ΠΊ html страница, Π·Π°Π»ΠΈΡ‚ Π½Π° ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ narod.ru ΠΈ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ ) Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π·Π°Π±Π°Π²Π½ΠΎΠ΅ ΠΈ интСрСсноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΎΠ½ΠΎ ΠΆΡƒΡ‚ΠΊΠΎ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ для настройки сСрвСров, собствСнно, ΠΈΠΌΠ΅Π½Π½ΠΎ для Ρ‚ΠΎΠ³ΠΎ, для Ρ‡Π΅Π³ΠΎ этот ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ создавался. ΠšΠ°Ρ‡Π°Ρ‚ΡŒ сгСнСрСнный Π°Ρ€Ρ…ΠΈΠ² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠΌ, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° сСрвСр с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ nc… Π² 2019 Π³ΠΎΠ΄Ρƒ? Π― поставил ΠΏΠ΅Ρ€Π΅Π΄ собой Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π°ΠΉΡ‚ΠΈ способ ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ сразу Π½Π° сСрвСр.
Π‘Π΄Π΅Π»Π°Π² Ρ„ΠΎΡ€ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, я Π½Π°Ρ‡Π°Π» Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρƒ мСня Π΅ΡΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹. Π—Π°Π΄Π°Ρ‡Π° ΡƒΡΠ»ΠΎΠΆΠ½ΡΠ»ΠΎΡΡŒ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ я Π½Π΅ Ρ…ΠΎΡ‚Π΅Π» ΠΎΡ‚Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ условия, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ чистым front-end, Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ back-end. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, самоС простоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ nodejs ΠΈ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ€Ρ…ΠΈΠ² с ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°ΠΌΠΈ ΠΏΠΎ прямым ссылкам.
Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², собствСнно, Π±Ρ‹Π»ΠΎ Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ. Π’ΠΎΡ‡Π½Π΅Π΅, Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ ΠΏΡ€ΠΈΡˆΡ‘Π» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½. Нам Π½Π°Π΄ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ссылку, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ смоТСм ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² консоль сСрвСра, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ zip Π°Ρ€Ρ…ΠΈΠ².
НСсколько тСкстовых Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΠΎΠΌ zip Π°Ρ€Ρ…ΠΈΠ²Π΅ вСсили совсСм Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ, Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ нСсколько ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ base64 строку ΠΈΠ· сгСнСрированного zip Π°Ρ€Ρ…ΠΈΠ²Π° ΠΈ ΠΊΠΈΠ½ΡƒΡ‚ΡŒ Π΅Ρ‘ Π² Π±ΡƒΡ„Π΅Ρ€, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π½Π° сСрвСрС ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Π² консоли

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

ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ этот самый zip Ρ„Π°ΠΉΠ».

nginxconfig.io Π±Ρ‹Π» написан Π½Π° AngularJS, Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΈΠ»ΠΎΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠ΄Π° ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΈΡΡŒ Π±Ρ‹, Ссли Π±Ρ‹ Π°Π²Ρ‚ΠΎΡ€ Π½Π΅ Π²Ρ‹Π±Ρ€Π°Π» Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ js Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ. Π—Π°Ρ‚ΠΎ прСкрасно ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽ, насколько ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ красивСС ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ всё это Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° VueJS, хотя это ΡƒΠΆΠ΅ совсСм другая Ρ‚Π΅ΠΌ.
Π’ сурсах ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ 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',
	});
};

всё достаточно просто, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ jszip создаётся zip, ΠΊΡƒΠ΄Π° кладутся Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ. ПослС создания zip Π°Ρ€Ρ…ΠΈΠ²Π°, js скармливаСт Π΅Π³ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ FileSaver.js:

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

Π³Π΄Π΅ content, это ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ blob ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ zip Π°Ρ€Ρ…ΠΈΠ²Π°.

Ок, всё Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ Π½Π°Π΄ΠΎ Π±Ρ‹Π»ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, это Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½Ρƒ ΠΊΠ½ΠΎΠΏΠΊΡƒ рядом ΠΈ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° Π½Π΅Ρ‘ Π½Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ zip Π°Ρ€Ρ…ΠΈΠ² Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€, Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ· Π½Π΅Π³ΠΎ base64 ΠΊΠΎΠ΄. НСмного пошаманив, я ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» 2 ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, вмСсто ΠΎΠ΄Π½ΠΎΠ³ΠΎ 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',
	});
};

Как Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ самого zip Π°Ρ€Ρ…ΠΈΠ²Π° я вынСс Π² ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ generateZip, Π½Ρƒ ΠΈ Ρ‚.ΠΊ. это AngularJS, Π΄Π° ΠΈ сам Π°Π²Ρ‚ΠΎΡ€ придСрТиваСтся колбэков, Π½Π΅ стал Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ‡Π΅Ρ€Π΅Π· промисы. downloadZip ΠΏΠΎ ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π΄Π΅Π»Π°Π» saveAs, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ downloadBase64 Π΄Π΅Π»Π°Π» Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. ΠœΡ‹ создаём FileReader ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΡ€ΠΈΡˆΠ΅Π΄ΡˆΠΈΠΉ ΠΊ Π½Π°ΠΌ Π² html5 ΠΈ Π²ΠΏΠΎΠ»Π½Π΅ ΡƒΠΆΠ΅ доступный для использования. ΠšΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π² своё врСмя, ΡƒΠΌΠ΅Π΅Ρ‚ ΠΈΠ· blob Π΄Π΅Π»Π°Ρ‚ΡŒ base64 строку, Ρ‚ΠΎΡ‡Π½Π΅Π΅ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚ DataURL строку, Π½ΠΎ Π½Π°ΠΌ это Π½Π΅ Ρ‚Π°ΠΊ Π²Π°ΠΆΠ½ΠΎ, Ρ‚.ΠΊ. DataURL содСрТит ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π°Π΄ΠΎ. Π‘ΠΈΠ½Π³ΠΎ, нСбольшая Π·Π°ΠΊΠΎΠ²Ρ‹Ρ€ΠΊΠ° ΠΆΠ΄Π°Π»Π° мСня ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ всё это Π² Π±ΡƒΡ„Π΅Ρ€. Автор использовал Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ clipboardjs, которая позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ ΠΎΠ±ΠΌΠ΅Π½Π° Π±Π΅Π· flash ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π½Π° основС Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ тСкста. Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ я Ρ€Π΅ΡˆΠΈΠ» ΠΊΠ»Π°ΡΡ‚ΡŒ ΠΌΠΎΠΉ base64 Π² элСмСнт с display:none;, Π½ΠΎ Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Ρƒ мСня Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² Π±ΡƒΡ„Π΅Ρ€ ΠΎΠ±ΠΌΠ΅Π½Π°, Ρ‚.ΠΊ. выдСлСния Π½Π΅ происходит. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, вмСсто display:none; я сдСлал

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

Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΠΌΠ½Π΅ ΠΈ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ элСмСнт с Π³Π»Π°Π· ΠΈ ΠΏΠΎ Ρ„Π°ΠΊΡ‚Ρƒ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° страницС. Вуаля, Π·Π°Π΄Π°Ρ‡Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°, ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° мою ΠΊΠ½ΠΎΠΏΠΊΡƒ, Π² Π±ΡƒΡ„Π΅Ρ€ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π»Π°ΡΡŒ строка Π²ΠΈΠ΄Π°:

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

ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я просто вставлял Π² консоль Π½Π° сСрвСрС ΠΈ Ρ‚ΡƒΡ‚ ΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π» zip Π°Ρ€Ρ…ΠΈΠ² со всСми ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°ΠΌΠΈ.
Ну ΠΈ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, я Π·Π°ΠΊΠΈΠ½ΡƒΠ» pull request Π°Π²Ρ‚ΠΎΡ€Ρƒ, Ρ‚.ΠΊ. ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΈ ΠΆΠΈΠ²ΠΎΠΉ, ΠΌΠ½Π΅ хочСтся ΠΈ обновлСния ΠΎΡ‚ Π°Π²Ρ‚ΠΎΡ€Π° Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈ свою ΠΊΠ½ΠΎΠΏΠΎΠΏΡ‡ΠΊΡƒ ΠΈΠΌΠ΅Ρ‚ΡŒ ) ΠšΠΎΠΌΡƒ интСрСсно, Π²ΠΎΡ‚ ΠΌΠΎΠΉ Ρ„ΠΎΡ€ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ сам pull request, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ я исправил/Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΠ».
ВсСм Π±ΠΎΠ΄Ρ€ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ )

ГСнСрация ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠ² для nginx, история ΠΎΠ΄Π½ΠΎΠ³ΠΎ pull request

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com