nginx рдХреЛ рд▓рд╛рдЧрд┐ рдХрдиреНрдлрд┐рдЧрд╣рд░реВ рдХреЛ рдЙрддреНрдкрд╛рджрди, рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЛ рдЗрддрд┐рд╣рд╛рд╕

рдЕрднрд┐рд╡рд╛рджрди, рдХрдорд░реЗрдбрд╣рд░реВред рдореЗрд░реЛ рд▓рдбрд╛рдИ рд╕рд░реНрднрд░рд╣рд░реВрдорд╛ рд╕реБрдиреНрджрд░ nginx 2006 рджреЗрдЦрд┐ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫ рд░ рдпрд╕рдХреЛ рдкреНрд░рд╢рд╛рд╕рди рдХреЛ рд╡рд░реНрд╖ рдорд╛ рдореИрд▓реЗ рдзреЗрд░реИ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯрд╣рд░реВ рдЬрдореНрдорд╛ рдЧрд░реЗрдХреЛ рдЫреБред рдореИрд▓реЗ nginx рдХреЛ рдзреЗрд░реИ рдкреНрд░рд╢рдВрд╕рд╛ рдЧрд░реЗрдВ рд░ рдХреБрдиреИ рди рдХреБрдиреИ рд░реВрдкрдорд╛ рдпреЛ рдмрд╛рд╣рд┐рд░ рдЖрдпреЛ рдХрд┐ рдореИрд▓реЗ рд╣рдмрдорд╛ nginx рд╣рдм рдкрдирд┐ рд╕реБрд░реБ рдЧрд░реЗрдВ, m/ show off
рд╕рд╛рдереАрд╣рд░реВрд▓реЗ рдорд▓рд╛рдИ рдЙрдиреАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╡рд┐рдХрд╛рд╕ рдлрд╛рд░реНрдо рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рдЖрдЧреНрд░рд╣ рдЧрд░реЗ, рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдореЗрд░реЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯрд╣рд░реВ рддрд╛рдиреНрдиреБрдХреЛ рд╕рдЯреНрдЯрд╛, рдореИрд▓реЗ рдПрдЙрдЯрд╛ рд░реЛрдЪрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдореНрдЭреЗред nginxconfig.io, рдЬрд╕рд▓реЗ рд╕реЗрд▓реНрдлрд╣рд░реВрдорд╛ рдХрдиреНрдлрд┐рдЧрд╣рд░реВ рдЫрд░реНрдЫ рд░ lets encrypt, рдЖрджрд┐рдХрд╛ рд▓рд╛рдЧрд┐ рд╕рдмреИ рдХреБрд░рд╛ рддрдпрд╛рд░ рдЧрд░реНрджрдЫред рдореИрд▓реЗ рд╕реЛрдЪреЗрдВ, рдХрд┐рди рдирд╣реЛрд╕реН ? рдЬреЗ рд╣реЛрд╕реН, рдо рдпрд╕ рддрдереНрдпрдмрд╛рдЯ рд░рд┐рд╕рд╛рдПрдХреЛ рдерд┐рдПрдБ рдХрд┐ nginxconfig рд▓реЗ рдорд▓рд╛рдИ wget/fetch/curl рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рд░реНрднрд░рдорд╛ рд╕рд┐рдзреИ рдЕрдкрд▓реЛрдб рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рдирджрд┐рдИ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ zip рд╕рдВрдЧреНрд░рд╣ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди рдкреНрд░рд╕реНрддрд╛рд╡ рдЧрд░реНрджрдЫред рдХреЗ рдмрдХрд╡рд╛рд╕, рдорд▓рд╛рдИ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рдХрд┐рди рдЪрд╛рд╣рд┐рдиреНрдЫ, рдорд▓рд╛рдИ рдпреЛ рдХрдиреНрд╕реЛрд▓рдмрд╛рдЯ рд╕рд░реНрднрд░рдорд╛ рдЪрд╛рд╣рд┐рдиреНрдЫред рд░рд┐рд╕рд╛рдПрдХреЛ, рдо рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╣рд┐рдореНрдордд рд╣реЗрд░реНрди github рдЧрдПрдБ, рдЬрд╕рд▓реЗ рдпрд╕рдХреЛ рдлреЛрд░реНрдХ рдирд┐рдореНрддреНрдпрд╛рдпреЛ рд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкреБрд▓ рдЕрдиреБрд░реЛрдзред рдЬреБрди рд░реЛрдЪрдХ рдирднрдПрдХреЛ рднрдП рдо рдпрд╕рдмрд╛рд░реЗ рд▓реЗрдЦреНрджрд┐рдирдереЗрдБ ЁЯШЙ

nginx рдХреЛ рд▓рд╛рдЧрд┐ рдХрдиреНрдлрд┐рдЧрд╣рд░реВ рдХреЛ рдЙрддреНрдкрд╛рджрди, рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЛ рдЗрддрд┐рд╣рд╛рд╕

рдЕрд╡рд╢реНрдп рдкрдирд┐, рд╕реНрд░реЛрддрд╣рд░реВрдорд╛ рдЦрдиреНрдиреЗ рдЕрдШрд┐, рдореИрд▓реЗ рдХреНрд░реЛрдорд▓реЗ рдХрдиреНрдлрд┐рдЧрд╣рд░реВрдХрд╛ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рдЬрд┐рдк рд╕рдВрдЧреНрд░рд╣рд▓рд╛рдИ рдХрд╣рд╛рдБ рддрд╛рдиреНрджрдЫ, рд░ рддреНрдпрд╣рд╛рдБ "рдмреНрд▓рдм:" рдмрд╛рдЯ рд╕реБрд░реБ рд╣реБрдиреЗ рдареЗрдЧрд╛рдирд╛ рдореЗрд░реЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрд┐рд░рд╣реЗрдХреЛ рдерд┐рдпреЛ, рдЙрдлреНред рдпреЛ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕реНрдкрд╖реНрдЯ рднрдПрдХреЛ рдЫ рдХрд┐ рд╕реЗрд╡рд╛рд▓реЗ рдмрд╛рдЯреЛрдорд╛ рдХреЗрд╣рд┐ рдЙрддреНрдкрдиреНрди рдЧрд░реНрджреИрди, рд╡рд╛рд╕реНрддрд╡рдорд╛, рдпреЛ рд╕рдмреИ js рджреНрд╡рд╛рд░рд╛ рдЧрд░рд┐рдПрдХреЛ рдЫред рд╡рд╛рд╕реНрддрд╡рдорд╛, zip рдЕрднрд┐рд▓реЗрдЦ рдЧреНрд░рд╛рд╣рдХ, рдмреНрд░рд╛рдЙрдЬрд░, рд░ рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдлреИрд▓реЗ рдЙрддреНрдкрдиреНрди рдЧрд░реЗрдХреЛ рдЫред рддреАред рд╕реБрдиреНрджрд░рддрд╛ рдпреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реЛ nginxconfig.io рдХреЗрд╡рд▓ html рдкреГрд╖реНрдардХреЛ рд░реВрдкрдорд╛ рдмрдЪрдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдХреЗрд╣рд┐рдорд╛ рдЕрдкрд▓реЛрдб narod.ru рд░ рдпрд╕рд▓реЗ рдХрд╛рдо рдЧрд░реНрдиреЗрдЫ) рдпреЛ рдПрдХ рдзреЗрд░реИ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд░ рдЪрд╛рдЦрд▓рд╛рдЧреНрджреЛ рд╕рдорд╛рдзрд╛рди рд╣реЛ, рддрдерд╛рдкрд┐, рд╕рд░реНрднрд░рд╣рд░реВ рд╕реЗрдЯрдЕрдк рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдпреЛ рдЕрддреНрдпрдиреНрддреИ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЫ, рд╡рд╛рд╕реНрддрд╡рдорд╛, рд╡рд╛рд╕реНрддрд╡рдорд╛ рдпреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред рдмреНрд░рд╛рдЙрдЬрд░рдХреЛ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рдЕрднрд┐рд▓реЗрдЦ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд░ рддреНрдпрд╕рдкрдЫрд┐ 2019 рдорд╛ nc рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рд░реНрднрд░рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН? рдореИрд▓реЗ рдирддрд┐рдЬрд╛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╕рд┐рдзреИ рд╕рд░реНрднрд░рдорд╛ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреЗ рддрд░рд┐рдХрд╛ рдЦреЛрдЬреНрдиреЗ рдХрд╛рдо рдЖрдлреИрд▓рд╛рдИ рд╕реЗрдЯ рдЧрд░реЗрдВред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлреЛрд░реНрдХ рдЧрд░реЗрдкрдЫрд┐, рдореИрд▓реЗ рдореЗрд░рд╛ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдХреЗ рд╣реБрдиреН рднрдиреЗрд░ рд╕реЛрдЪреНрди рдерд╛рд▓реЗрдВред рдХреБрдиреИ рдкрдирд┐ рдмреНрдпрд╛рдХ-рдПрдиреНрдб рдмрд┐рдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрджреНрдз рдлреНрд░рдиреНрдЯ-рдПрдиреНрдб рд░рд╣рдиреБрдкрд░реНрдЫ рднрдиреНрдиреЗ рд╢рд░реНрддрдмрд╛рдЯ рдо рд╡рд┐рдЪрд▓рд┐рдд рд╣реБрди рдЪрд╛рд╣рдиреНрдирдБ рднрдиреНрдиреЗ рддрдереНрдпрд▓реЗ рдЧрд░реНрджрд╛ рдХрд╛рдо рдЬрдЯрд┐рд▓ рдерд┐рдпреЛред рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рднрдиреЗрдХреЛ рдиреЛрдбрдЬрд╣рд░реВ рддрд╛рдиреНрдиреБ рд░ рдпрд╕рд▓рд╛рдИ рдкреНрд░рддреНрдпрдХреНрд╖ рд▓рд┐рдЩреНрдХрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирд╣рд░реВрд╕рдБрдЧ рд╕рдЩреНрдЧреНрд░рд╣ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рдмрд╛рдзреНрдп рдкрд╛рд░реНрдиреБ рд╣реЛред
рд╡рд╛рд╕реНрддрд╡рдорд╛, рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдерд┐рдПрдирдиреНред рдЕрдЭ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛, рдХреЗрд╡рд▓ рдПрдХ рджрд┐рдорд╛рдЧрдорд╛ рдЖрдпреЛред рд╣рд╛рдореАрд▓реЗ рдХрдиреНрдлрд┐рдЧрд╣рд░реВ рд╕реЗрдЯ рдЕрдк рдЧрд░реНрди рд░ zip рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рд░реНрднрд░ рдХрдиреНрд╕реЛрд▓рдорд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрди рд╕рдХреНрдиреЗ рд▓рд┐рдЩреНрдХ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк zip рдЕрднрд┐рд▓реЗрдЦрдорд╛ рдзреЗрд░реИ рдкрд╛рда рдлрд╛рдЗрд▓рд╣рд░реВ рдПрдХрджрдо рдереЛрд░реИ, рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдкрдорд╛ рдХреЗрд╣реА рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рддреМрд▓рд┐рдПред рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдЙрддреНрдкрдиреНрди рдЧрд░рд┐рдПрдХреЛ zip рд╕рдВрдЧреНрд░рд╣рдмрд╛рдЯ base64 рд╕реНрдЯреНрд░рд┐рдЩ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд░ рдпрд╕рд▓рд╛рдИ рдмрдлрд░рдорд╛ рдлреНрдпрд╛рдБрдХреНрдиреБ рдерд┐рдпреЛ, рд╕рд░реНрднрд░рдорд╛ рдХрдиреНрд╕реЛрд▓рдорд╛ рдЖрджреЗрд╢рдХреЛ рд╕рд╛рдердорд╛ред

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 рд╕рдВрдЧреНрд░рд╣ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрдкрдЫрд┐, js рд▓реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рдлрд┐рдб рдЧрд░реНрджрдЫ FileSaver.js:

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

рдЬрд╣рд╛рдБ рд╕рд╛рдордЧреНрд░реА zip рдЕрднрд┐рд▓реЗрдЦрдХреЛ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмреНрд▓рдм рд╡рд╕реНрддреБ рд╣реЛред

рдареАрдХ рдЫ, рдореИрд▓реЗ рддреНрдпрд╕рдХреЛ рдЫреЗрдЙрдорд╛ рдЕрд░реНрдХреЛ рдмрдЯрди рдердкреНрдиреБ рдкрд░реНрдиреЗ рдерд┐рдпреЛ рд░ рдЬрдм рдореИрд▓реЗ рдпрд╕рдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реЗрдВ, рдореИрд▓реЗ рдирддрд┐рдЬрд╛рдХреЛ рдЬрд┐рдк рд╕рдВрдЧреНрд░рд╣ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рдмрдЪрдд рдЧрд░реНрдиреЗ рдЫреИрди, рддрд░ рдпрд╕рдмрд╛рдЯ рдмреЗрд╕64 рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдерд┐рдПрдБред рдЕрд▓рд┐рдХрддрд┐ рдлрд┐рд▓реНрдбрд┐рдЩ рдЧрд░рд┐рд╕рдХреЗрдкрдЫрд┐, рдореИрд▓реЗ рдПрдЙрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдЬрд┐рдкрдХреЛ рд╕рдЯреНрдЯрд╛рдорд╛ реи рд╡рдЯрд╛ рд╡рд┐рдзрд┐ рдкрд╛рдПрдБ:

$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 рдорд╛ рдЖрдпреЛ рд░ рдкрд╣рд┐рд▓реЗ рдиреИ рдкрд░реНрдпрд╛рдкреНрдд рдЫ рд╕реБрд▓рдн рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ред рдЬреБрди, рдПрдХ рд╕рдордпрдорд╛, рдмреНрд▓рдмрдмрд╛рдЯ рдмреЗрд╕64 рд╕реНрдЯреНрд░рд┐рдЩ рдмрдирд╛рдЙрди рд╕рдХреНрдЫ, рд╡рд╛ рдмрд░реБ, рдпрд╕рд▓реЗ DataURL рд╕реНрдЯреНрд░рд┐рдЩ рдмрдирд╛рдЙрдБрдЫ, рддрд░ рдпреЛ рд╣рд╛рдореНрд░реЛ рд▓рд╛рдЧрд┐ рддреНрдпрддрд┐ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫреИрди, рдХрд┐рдирднрдиреЗ DataURL рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдЪрд╛рд╣рд┐рдиреЗ рдХреБрд░рд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред рдмрд┐рдВрдЧреЛ, рдореИрд▓реЗ рдпреЛ рд╕рдмреИ рдмрдлрд░рдорд╛ рд░рд╛рдЦреНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджрд╛ рдПрдЙрдЯрд╛ рд╕рд╛рдиреЛ рд╕реНрдиреНрдпрд╛рдЧрд▓реЗ рдорд▓рд╛рдИ рдкрд░реНрдЦрд┐рд░рд╣реЗрдХреЛ рдерд┐рдпреЛред рд▓реЗрдЦрдХрд▓реЗ рдпрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрднрдпреЛ clipboardjs, рдЬрд╕рд▓реЗ рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдЪрдпрди рдЧрд░рд┐рдПрдХреЛ рдкрд╛рдардорд╛ рдЖрдзрд╛рд░рд┐рдд рдлреНрд▓реНрдпрд╛рд╕ рд╡рд╕реНрддреБрд╣рд░реВ рдмрд┐рдирд╛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдбрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рд╕реБрд░реБрдорд╛, рдореИрд▓реЗ рдореЗрд░реЛ base64 рд▓рд╛рдИ рдбрд┐рд╕реНрдкреНрд▓реЗ: рдХреБрдиреИ рдкрдирд┐ рддрддреНрд╡рдорд╛ рд░рд╛рдЦреНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВ, рддрд░ рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдореИрд▓реЗ рдпрд╕рд▓рд╛рдИ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдбрдорд╛ рд░рд╛рдЦреНрди рд╕рдХрд┐рди рдХрд┐рдирднрдиреЗ рдХреБрдиреИ рдкреГрдердХреНрдХрд░рдг рд╣реБрдБрджреИрдиред рддреНрдпрд╕рдХрд╛рд░рдг, рдкреНрд░рджрд░реНрд╢рдирдХреЛ рд╕рдЯреНрдЯрд╛: рдХреБрдиреИ рдкрдирд┐ рдЫреИрди; рдореИрд▓реЗ рдЧрд░реЗрдБ

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

рдЬрд╕рд▓реЗ рдорд▓рд╛рдИ рджреГрд╢реНрдпрдмрд╛рдЯ рддрддреНрд╡ рд▓реБрдХрд╛рдЙрди рд░ рд╡рд╛рд╕реНрддрд╡рдорд╛ рдкреГрд╖реНрдардорд╛ рдЫреЛрдбреНрди рдЕрдиреБрдорддрд┐ рджрд┐рдпреЛред рднреЛрдЗрд▓рд╛, рдХрд╛рд░реНрдп рдкреВрд░рд╛ рднрдпреЛ, рдЬрдм рдореИрд▓реЗ рдореЗрд░реЛ рдмрдЯрдирдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реЗрдВ, рдпрд╕реНрддреЛ рд▓рд╛рдЗрди рдмрдлрд░рдорд╛ рд░рд╛рдЦрд┐рдПрдХреЛ рдерд┐рдпреЛ:

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

рдЬреБрди рдореИрд▓реЗ рдХреЗрд╡рд▓ рд╕рд░реНрднрд░рдорд╛ рдХрдиреНрд╕реЛрд▓рдорд╛ рдЯрд╛рдБрд╕реЗрдВ рд░ рддреБрд░реБрдиреНрддреИ рд╕рдмреИ рдХрдиреНрдлрд┐рдЧрд╣рд░реВрдХрд╛ рд╕рд╛рде рдЬрд┐рдк рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдЧрд░реЗрдВред
рд░, рдЕрд╡рд╢реНрдп рдкрдирд┐, рдореИрд▓реЗ рд▓реЗрдЦрдХрд▓рд╛рдИ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкрдард╛рдПрдБ, рдХрд┐рдирдХрд┐ ... рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдХреНрд░рд┐рдп рд░ рдЬреАрд╡рдиреНрдд рдЫ, рдо рд▓реЗрдЦрдХрдмрд╛рдЯ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХрд╣рд░реВ рд╣реЗрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ рд░ рдореЗрд░реЛ рдЖрдлреНрдиреИ рдмрдЯрди рдЫ) рд░реБрдЪрд┐ рд░рд╛рдЦреНрдиреЗрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐, рдпреЛ рдпрд╣рд╛рдБ рдЫ рдореЗрд░реЛ рдХрд╛рдБрдЯрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд░ рдо рдЕрдиреБрд░реЛрдз рддрд╛рдиреНрдиреБрд╣реЛрд╕реН, рдЬрд╣рд╛рдБ рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдореИрд▓реЗ рдХреЗ рд╕реБрдзрд╛рд░ рдЧрд░реЗрдХреЛ/рдердкреЗрдВред
рд╕рдмреИрдХреЛ рдмрд┐рдХрд╛рд╕рдХреЛ рд╢реБрднрдХрд╛рдордирд╛)

nginx рдХреЛ рд▓рд╛рдЧрд┐ рдХрдиреНрдлрд┐рдЧрд╣рд░реВ рдХреЛ рдЙрддреНрдкрд╛рджрди, рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЛ рдЗрддрд┐рд╣рд╛рд╕

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди