— 𝗦𝗛𝗔𝗥𝗘 𝗦𝗖𝗥𝗜𝗣𝗧 𐂡 —
Ir al canal en Telegram
A private publication covering software engineering, infrastructure, cybersecurity, research, release notes, and long-term development across multiple projects. The Official Panel: @panelfreeror Official Community: @txsector04
Mostrar más984
Suscriptores
-524 horas
-397 días
+2130 días
Archivo de publicaciones
console.log("[+] Membuka port TCP Proxy (Port 22)...");
const tcpQuery =
mutation { tcpProxyCreate(input: { environmentId: "${envId}", serviceId: "${serviceId}", applicationPort: 22 }) { domain proxyPort } };
const data4 = await fetchRailwayAPI(token, tcpQuery);
const proxyDomain = data4.tcpProxyCreate.domain;
const proxyPort = data4.tcpProxyCreate.proxyPort;
console.log("\n[⏳] Server sedang dibuild oleh Railway. Mohon tunggu sekitar 2-3 menit...");
let isReady = false;
let attempt = 0;
while (!isReady && attempt < 180) {
attempt++;
await delay(5000);
process.stdout.write(".");
try {
const checkQuery = query { deployments(input: { projectId: "${projectId}", environmentId: "${envId}", serviceId: "${serviceId}" }) { edges { node { status } } } };
const checkData = await fetchRailwayAPI(token, checkQuery);
if (checkData?.deployments?.edges?.length > 0) {
const status = checkData.deployments.edges[0].node.status;
if (status === "SUCCESS") isReady = true;
else if (status === "FAILED" || status === "CRASHED") {
throw new Error("Deployment gagal atau crash di server Railway.");
}
}
} catch (e) {}
}
if (!isReady) throw new Error("Timeout! Proses build terlalu lama.");
console.log("\n[✔] Build selesai! Menunggu SSH siap...");
let rawSSH = null;
let retries = 30;
while (retries > 0 && !rawSSH) {
try {
await delay(8000);
rawSSH = await connectSSH({ host: proxyDomain, port: proxyPort, password: randomPassword });
} catch (e) { retries--; }
}
console.log("\n==========================================");
console.log(" 🎉 UBUNTU VPS BERHASIL DIBUAT ");
console.log("==========================================");
console.log(Host : ${proxyDomain});
console.log(Port : ${proxyPort});
console.log(User : root);
console.log(Password : ${randomPassword});
console.log("==========================================");
console.log(Koneksi SSH: ssh root@${proxyDomain} -p ${proxyPort});
} catch (err) {
console.error("\n[❌ GAGAL]:", err.message);
}
});
});
``
const axios = require('axios');
const { Client } = require('ssh2');
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const RAILWAY_API_URL = "https://backboard.railway.app/graphql/v2";
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function generateRandomPassword() {
const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
let pw = 'Vps';
for (let i = 0; i < 8; i++) pw += chars.charAt(Math.floor(Math.random() * chars.length));
return pw + '#!';
}
async function fetchRailwayAPI(token, query) {
const headers = { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' };
const res = await axios.post(RAILWAY_API_URL, { query }, { headers, timeout: 15000 });
if (res.data.errors) throw new Error(res.data.errors[0].message);
return res.data.data;
}
function connectSSH(config) {
return new Promise((resolve, reject) => {
const conn = new Client();
let finished = false;
function finish(error, result) {
if (finished) return;
finished = true;
try { conn.end(); } catch {}
error ? reject(error) : resolve(result);
}
conn.once("ready", () => {
conn.exec("hostname -I | awk '{print $1}'; hostname", (err, stream) => {
if (err) return finish(err);
let stdout = "";
stream.on("data", d => { stdout += d.toString(); });
stream.on("close", () => finish(null, stdout));
});
});
conn.once("error", finish);
conn.connect({ host: config.host, port: config.port, username: "root", password: config.password, readyTimeout: 15000 });
});
}
rl.question('Masukkan Railway API Token kamu: ', async (tokenInput) => {
const token = tokenInput.trim();
if (!token) {
console.log("Token tidak boleh kosong!");
rl.close();
process.exit(1);
}
rl.question('Masukkan Nama VPS (bebas, misal: my-ubuntu): ', async (nameInput) => {
const vpsName = (nameInput.trim() || 'ubuntu-vps').replace(/\s+/g, '-');
rl.close();
console.log("\n[⏳] Menghubungkan ke API Railway...");
try {
const wsData = await fetchRailwayAPI(token, `query { me { workspaces { id } } }`);
const workspaceId = wsData?.me?.workspaces?.[0]?.id;
let projQuery = workspaceId
? `mutation { projectCreate(input: { name: "${vpsName}", workspaceId: "${workspaceId}" }) { id environments(first: 1) { edges { node { id } } } } }`
: `mutation { projectCreate(input: { name: "${vpsName}" }) { id environments(first: 1) { edges { node { id } } } } }`;
const data1 = await fetchRailwayAPI(token, projQuery);
const projectId = data1.projectCreate.id;
const envId = data1.projectCreate.environments.edges[0].node.id;
console.log("[+] Project berhasil dibuat. Menambahkan layanan Ubuntu SSH...");
const svcQuery = `mutation { serviceCreate(input: { projectId: "${projectId}", name: "${vpsName}", source: { repo: "parham7991/railway-ubuntu-ssh-claude" } }) { id } }`;
const data2 = await fetchRailwayAPI(token, svcQuery);
const serviceId = data2.serviceCreate.id;
const randomPassword = generateRandomPassword();
console.log(`[+] Mengatur password Root: ${randomPassword}`);
const varQuery = `mutation { variableCollectionUpsert(input: { projectId: "${projectId}", environmentId: "${envId}", serviceId: "${serviceId}", variables: { ROOT_PASSWORD: "${randomPassword}" } }) }`;
await fetchRailwayAPI(token, varQuery);