nginx کے لیے تشکیلات کی تخلیق، ایک پل کی درخواست کی تاریخ

سلام، ساتھیوں۔ میرے جنگی سرورز پر خوبصورت نگنکس 2006 سے چل رہا ہے اور اس کی انتظامیہ کے سالوں میں میں نے بہت ساری تشکیلات اور ٹیمپلیٹس جمع کیے ہیں۔ میں نے nginx کی بہت تعریف کی اور کسی طرح یہ پتہ چلا کہ میں نے حب پر ایک nginx حب بھی شروع کر دیا ہے، m/
دوستوں نے مجھ سے کہا کہ میں ان کے لیے ایک ڈویلپمنٹ فارم قائم کروں، اور اپنے مخصوص سانچوں کو گھسیٹنے کے بجائے مجھے ایک دلچسپ پروجیکٹ یاد آگیا۔ nginxconfig.io، جو شیلف پر ترتیب کو بکھیرتا ہے اور lets encrypt وغیرہ کے لیے سب کچھ تیار کرتا ہے۔ میں نے سوچا، کیوں نہیں؟ تاہم، مجھے اس حقیقت سے غصہ آیا کہ nginxconfig مجھے wget/fetch/curl کا استعمال کرتے ہوئے اسے براہ راست سرور پر اپ لوڈ کرنے کی اجازت دیئے بغیر، براؤزر میں زپ آرکائیو ڈاؤن لوڈ کرنے کی پیشکش کرتا ہے۔ کیا بکواس ہے، مجھے براؤزر میں اس کی ضرورت کیوں ہے، مجھے کنسول سے سرور پر اس کی ضرورت ہے۔ غصے میں، میں پروجیکٹ کی ہمت دیکھنے کے لیے گیتھب گیا، جس کی وجہ سے اس کا کانٹا نکل گیا اور نتیجے کے طور پر، ایک پل کی درخواست ہوئی۔ جس کے بارے میں میں نہ لکھتا اگر یہ دلچسپ نہ ہوتا 😉

nginx کے لیے تشکیلات کی تخلیق، ایک پل کی درخواست کی تاریخ

بلاشبہ، ذرائع کو کھودنے سے پہلے، میں نے دیکھا کہ کروم کنفیگس کے ساتھ تیار کردہ زپ آرکائیو کو کہاں کھینچتا ہے، اور وہاں "بلاب:" سے شروع ہونے والا ایک پتہ میرا انتظار کر رہا تھا، افوہ۔ یہ پہلے ہی واضح ہو چکا ہے کہ سروس راستے میں کچھ بھی پیدا نہیں کرتی ہے، درحقیقت، یہ سب js نے کیا ہے۔ درحقیقت، زپ آرکائیو کلائنٹ، براؤزر، اور جاوا اسکرپٹ خود تیار کرتا ہے۔ وہ. خوبصورتی یہ ہے کہ پروجیکٹ nginxconfig.io صرف ایک HTML صفحہ کے طور پر محفوظ کیا جا سکتا ہے، کچھ پر اپ لوڈ کیا جا سکتا ہے۔ narod.ru اور یہ کام کرے گا۔ تخلیق شدہ آرکائیو کو براؤزر کے ساتھ ڈاؤن لوڈ کریں، اور پھر اسے 2019 میں nc کا استعمال کرتے ہوئے سرور پر منتقل کریں؟ میں نے اپنے آپ کو نتیجہ خیز ترتیب کو براہ راست سرور پر ڈاؤن لوڈ کرنے کا راستہ تلاش کرنے کا کام مقرر کیا۔
پروجیکٹ کو فورک کرنے کے بعد، میں نے سوچنا شروع کیا کہ میرے آپشنز کیا ہیں۔ یہ کام اس وجہ سے پیچیدہ تھا کہ میں اس شرط سے انحراف نہیں کرنا چاہتا تھا کہ پروجیکٹ کو بغیر کسی بیک اینڈ کے خالص فرنٹ اینڈ رہنا چاہیے۔ بلاشبہ، سب سے آسان حل یہ ہوگا کہ نوڈجز کو کھینچیں اور اسے براہ راست لنکس کا استعمال کرتے ہوئے کنفیگس کے ساتھ آرکائیو بنانے پر مجبور کریں۔
اصل میں، بہت سے اختیارات نہیں تھے. زیادہ واضح طور پر، صرف ایک ذہن میں آیا. ہمیں کنفیگرز سیٹ اپ کرنے اور ایک لنک حاصل کرنے کی ضرورت ہے جسے ہم سرور کنسول میں کاپی کر کے زپ آرکائیو حاصل کر سکتے ہیں۔
نتیجے میں زپ آرکائیو میں کئی ٹیکسٹ فائلوں کا وزن تھوڑا سا تھا، لفظی طور پر چند کلو بائٹس۔ واضح حل یہ تھا کہ تیار کردہ زپ آرکائیو سے بیس 64 سٹرنگ حاصل کی جائے اور اسے بفر میں پھینک دیا جائے، جبکہ سرور پر کنسول میں کمانڈ کے ساتھ

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

ہم اسی زپ فائل کو بنا سکتے ہیں۔

nginxconfig.io AngularJS میں لکھا گیا تھا، میں سوچ بھی نہیں سکتا کہ اگر مصنف نے رد عمل والے js فریم ورک کا انتخاب نہ کیا ہوتا تو کتنے کلومیٹر کوڈ کی ضرورت ہوتی۔ لیکن میں بخوبی اندازہ لگا سکتا ہوں کہ VueJS میں یہ سب کتنا آسان اور خوبصورت ہو سکتا ہے، حالانکہ یہ بالکل مختلف موضوع ہے۔
پروجیکٹ کے وسائل میں ہم زپ آرکائیو بنانے کا طریقہ دیکھتے ہیں:

$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 ایک زپ بنائی جاتی ہے جہاں کنفیگریشن فائلیں رکھی جاتی ہیں۔ زپ آرکائیو بنانے کے بعد، js اسے لائبریری کا استعمال کرتے ہوئے براؤزر میں فیڈ کرتا ہے۔ FileSaver.js:

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

جہاں مواد زپ آرکائیو کے نتیجے میں بلاب آبجیکٹ ہے۔

ٹھیک ہے، مجھے بس اس کے آگے ایک اور بٹن شامل کرنا تھا اور جب میں اس پر کلک کرتا ہوں، تو میں نتیجے میں آنے والے زپ آرکائیو کو براؤزر میں محفوظ نہیں کروں گا، بلکہ اس سے بیس 64 کوڈ حاصل کروں گا۔ تھوڑا سا چکر لگانے کے بعد، مجھے صرف ایک ڈاؤن لوڈ زپ کے بجائے 2 طریقے ملے۔

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

جیسا کہ آپ نے دیکھا ہو گا، میں نے خود زپ آرکائیو کی نسل کو پرائیویٹ generateZip طریقہ پر منتقل کر دیا ہے، وغیرہ۔ یہ AngularJS ہے، اور مصنف خود کال بیکس پر قائم ہے اور وعدوں کے ذریعے اس پر عمل درآمد نہیں کیا۔ downloadZip نے پھر بھی saveAs کو آؤٹ پٹ کے طور پر کیا، جبکہ downloadBase64 نے کچھ مختلف کیا۔ ہم ایک فائل ریڈر آبجیکٹ بناتے ہیں جو ہمارے پاس HTML5 میں آیا تھا اور پہلے ہی کافی ہے۔ قابل رسائی استعمال کیلئے. جو، ایک وقت میں، ایک بلاب سے بیس 64 سٹرنگ بنا سکتا ہے، یا اس کے بجائے، یہ ڈیٹا یو آر ایل سٹرنگ بناتا ہے، لیکن یہ ہمارے لیے اتنا اہم نہیں ہے، کیونکہ DataURL میں بالکل وہی ہوتا ہے جس کی ہمیں ضرورت ہے۔ بنگو، جب میں نے یہ سب کچھ بفر میں ڈالنے کی کوشش کی تو ایک چھوٹی سی رکاوٹ میرا انتظار کر رہی تھی۔ مصنف نے اس منصوبے میں لائبریری کا استعمال کیا۔ clipboardjs، جو آپ کو منتخب متن کی بنیاد پر فلیش آبجیکٹ کے بغیر کلپ بورڈ کے ساتھ کام کرنے کی اجازت دیتا ہے۔ ابتدائی طور پر، میں نے اپنے بیس 64 کو ڈسپلے:کوئی نہیں؛ والے عنصر میں رکھنے کا فیصلہ کیا، لیکن اس معاملے میں میں اسے کلپ بورڈ پر نہیں رکھ سکا کیونکہ کوئی جدائی نہیں ہوتی. اس لیے ڈسپلے کی بجائے:none; میں نے کیا۔

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

جس نے مجھے دونوں عنصر کو دیکھنے سے چھپانے اور اسے صفحہ پر چھوڑنے کی اجازت دی۔ Voila، کام مکمل ہو گیا، جب میں نے اپنے بٹن پر کلک کیا تو بفر میں اس طرح کی ایک لائن رکھی گئی:

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

جسے میں نے سرور پر کنسول میں آسانی سے چسپاں کیا اور فوری طور پر تمام تشکیلات کے ساتھ ایک زپ آرکائیو موصول ہوا۔
اور، یقینا، میں نے مصنف کو پل کی درخواست بھیجی، کیونکہ... پروجیکٹ فعال اور جاندار ہے، میں مصنف سے اپ ڈیٹس دیکھنا چاہتا ہوں اور میرا اپنا بٹن ہے) دلچسپی رکھنے والوں کے لیے یہ ہے میرا کانٹا پروجیکٹ اور خود درخواست ھیںچو، جہاں آپ دیکھ سکتے ہیں کہ میں نے کیا درست/شامل کیا ہے۔
سب کو ترقی مبارک ہو)

nginx کے لیے تشکیلات کی تخلیق، ایک پل کی درخواست کی تاریخ

ماخذ: www.habr.com

نیا تبصرہ شامل کریں