Никита Круглицкий 2bee1f5d79 deploy.sh -> deploy.js
2025-08-15 19:28:07 +06:00

85 lines
2.4 KiB
JavaScript

import { execSync } from 'node:child_process'
import fs from 'node:fs'
import path from 'node:path'
import readline from 'node:readline'
import SftpClient from 'ssh2-sftp-client'
const HOST = '92.53.106.114'
const USERNAME = 'cs21601'
const REMOTE_BASE = '/home/c/cs21601/quantum'
const LOCAL_DIST = path.resolve('./dist')
const LOCAL_SRC_ARCHIVE = path.resolve('./src.zip')
const DATE = new Date().toISOString().replace(/[-:]/g, '').replace(/\..+/, '');
(async () => {
try {
const password = await ask(`Введите пароль для ${USERNAME}@${HOST}: `)
// 1) yarn build
execSync('yarn build', { stdio: 'inherit' })
// 2) git archive
execSync(`git archive --format=zip --output=${LOCAL_SRC_ARCHIVE} main`, { stdio: 'inherit' })
const sftp = new SftpClient()
await sftp.connect({
host: HOST,
port: 22,
username: USERNAME,
password,
})
// 3) Переименование public_html
try {
await sftp.rename(`${REMOTE_BASE}/public_html`, `${REMOTE_BASE}/public_html_${DATE}`)
console.log('✅ Папка public_html переименована')
}
catch {
console.log('⚠️ public_html не найдена, пропускаю переименование')
}
// 4) Загрузка dist
await sftp.mkdir(`${REMOTE_BASE}/public_html`, true)
await uploadDir(sftp, LOCAL_DIST, `${REMOTE_BASE}/public_html`)
// 5) Загрузка src.zip
await sftp.mkdir(`${REMOTE_BASE}/src`, true)
await sftp.put(LOCAL_SRC_ARCHIVE, `${REMOTE_BASE}/src.zip`)
await sftp.end()
console.log('🎉 Деплой завершён успешно!')
}
catch (err) {
console.error('❌ Ошибка деплоя:', err.message)
process.exit(1)
}
})()
function ask(query) {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
})
return new Promise((resolve) => {
rl.question(query, (value) => {
rl.close()
resolve(value)
})
})
}
async function uploadDir(sftp, localDir, remoteDir) {
const items = fs.readdirSync(localDir)
for (const item of items) {
const localPath = path.join(localDir, item)
const remotePath = `${remoteDir}/${item}`
if (fs.lstatSync(localPath).isDirectory()) {
await sftp.mkdir(remotePath, true)
await uploadDir(sftp, localPath, remotePath)
}
else {
await sftp.put(localPath, remotePath)
}
}
}