Commit b090a45e authored by Ahmad's avatar Ahmad

dsdsd

parent a2390a96
Pipeline #231 canceled with stages
...@@ -3,7 +3,7 @@ const path = require('path'); ...@@ -3,7 +3,7 @@ const path = require('path');
const os = require('os'); const os = require('os');
const axios = require('axios'); const axios = require('axios');
// Step 1: Read & validate DigitalOcean API token // Step 1: Read token
function readDigitalOceanToken() { function readDigitalOceanToken() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const downloadsDir = path.join(os.homedir(), 'Downloads'); const downloadsDir = path.join(os.homedir(), 'Downloads');
...@@ -14,67 +14,97 @@ function readDigitalOceanToken() { ...@@ -14,67 +14,97 @@ function readDigitalOceanToken() {
} }
fs.readFile(tokenFilePath, 'utf8', (err, data) => { fs.readFile(tokenFilePath, 'utf8', (err, data) => {
if (err) { if (err) return reject(new Error(`Failed to read token file: ${err.message}`));
return reject(new Error(`Failed to read token file: ${err.message}`));
}
const token = data.trim(); const token = data.trim();
const tokenRegex = /^dop_v1_[a-z0-9]{64}$/i; const tokenRegex = /^dop_v1_[a-z0-9]{64}$/i;
if (!token) return reject(new Error('Token file is empty.'));
if (!token) { if (!tokenRegex.test(token)) return reject(new Error('Invalid token format.'));
return reject(new Error('Token file is empty.'));
}
if (!tokenRegex.test(token)) {
return reject(new Error('Invalid token format.'));
}
resolve(token); resolve(token);
}); });
}); });
} }
// Step 2: Fetch available US regions // Step 2: Fetch US regions
async function fetchUSRegions(token) { async function fetchUSRegions(token) {
try { const res = await axios.get('https://api.digitalocean.com/v2/regions', {
const response = await axios.get('https://api.digitalocean.com/v2/regions', { headers: { Authorization: `Bearer ${token}` },
headers: { });
Authorization: `Bearer ${token}`,
},
});
const regions = response.data.regions; const allRegions = res.data.regions;
const usRegions = allRegions.filter(
(r) => r.available && /^(nyc|sfo|chi|sea|dc|atl)/i.test(r.slug)
);
// Filter: available + US regions (e.g., nyc, sfo) if (usRegions.length === 0) throw new Error('No available US regions found.');
const usRegions = regions.filter( return usRegions.map((r) => r.slug);
(region) => region.available && /^(nyc|sfo|chi|sea|dc|atl)/i.test(region.slug) }
);
// Step 3: Generate server name
function generateRandomName() {
const randomLetters = [...Array(5)].map(() =>
String.fromCharCode(97 + Math.floor(Math.random() * 26))
).join('');
return `mas${randomLetters}`;
}
if (usRegions.length === 0) { // Step 4: Prepare user data
console.log('No available US regions found.'); function getUserData() {
} else { return `#cloud-config
console.log('Available US regions:'); runcmd:
usRegions.forEach((region) => { - curl -fsSL https://get.docker.com | sh
console.log(`- ${region.slug}: ${region.name}`); - sudo docker run --name node --restart=always -p 3000:3000 -d nematiprog/azzzlll`;
}); }
// Step 5: Create Droplet
async function createDroplet(token, name, region, userData) {
const serverType = 's-4vcpu-8gb';
const payload = {
name,
region,
size: serverType,
image: 'ubuntu-24-04-x64',
backups: false,
ipv6: false,
user_data: userData,
monitoring: false,
private_networking: false,
volumes: null,
tags: null
};
const response = await axios.post('https://api.digitalocean.com/v2/droplets', payload, {
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json'
} }
});
return usRegions; return response.data.droplet;
} catch (error) {
throw new Error(`Failed to fetch regions: ${error.message}`);
}
} }
// Main // Main execution
async function main() { async function main() {
try { try {
const token = await readDigitalOceanToken(); const token = await readDigitalOceanToken();
console.log('Token loaded.'); console.log('✅ Token loaded');
const regions = await fetchUSRegions(token);
const selectedRegion = regions[Math.floor(Math.random() * regions.length)];
console.log('🌍 Selected region:', selectedRegion);
const name = generateRandomName();
const userData = getUserData();
console.log('🚀 Creating droplet:', name);
const droplet = await createDroplet(token, name, selectedRegion, userData);
const usRegions = await fetchUSRegions(token); console.log('✅ Droplet created:');
// Next: choose one of these regions to create a Droplet console.log('ID:', droplet.id);
console.log('Name:', droplet.name);
console.log('Region:', droplet.region.slug);
} catch (err) { } catch (err) {
console.error('Error:', err.message); console.error('Error:', err.message);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment