File size: 4,389 Bytes
9705b6c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
const { execSync } = require('child_process');
const path = require('path');
const { askQuestion, isDockerRunning, deleteNodeModules, silentExit } = require('./helpers');
const config = {
bun: process.argv.includes('-b'),
local: process.argv.includes('-l'),
docker: process.argv.includes('-d'),
singleCompose: process.argv.includes('-s'),
useSudo: process.argv.includes('--sudo'),
skipGit: process.argv.includes('-g'),
};
// Set the directories
const rootDir = path.resolve(__dirname, '..');
const directories = [
rootDir,
path.resolve(rootDir, 'packages', 'data-provider'),
path.resolve(rootDir, 'client'),
path.resolve(rootDir, 'api'),
];
async function updateConfigWithWizard() {
if (!config.docker && !config.singleCompose) {
config.docker = (await askQuestion('Are you using Docker? (y/n): '))
.toLowerCase()
.startsWith('y');
}
if (config.docker && !config.singleCompose) {
config.singleCompose = !(
await askQuestion('Are you using the default docker-compose file? (y/n): ')
)
.toLowerCase()
.startsWith('y');
}
}
async function validateDockerRunning() {
if (!config.docker && config.singleCompose) {
config.docker = true;
}
if (config.docker && !isDockerRunning()) {
console.red(
'Error: Docker is not running. You will need to start Docker Desktop or if using linux/mac, run `sudo systemctl start docker`',
);
silentExit(1);
}
}
(async () => {
const showWizard = !config.local && !config.docker && !config.singleCompose;
if (showWizard) {
await updateConfigWithWizard();
}
console.green(
'Starting update script, this may take a minute or two depending on your system and network.',
);
await validateDockerRunning();
const { docker, singleCompose, useSudo, skipGit, bun } = config;
const sudo = useSudo ? 'sudo ' : '';
if (!skipGit) {
// Fetch latest repo
console.purple('Fetching the latest repo...');
execSync('git fetch origin', { stdio: 'inherit' });
// Switch to main branch
console.purple('Switching to main branch...');
execSync('git checkout main', { stdio: 'inherit' });
// Git pull origin main
console.purple('Pulling the latest code from main...');
execSync('git pull origin main', { stdio: 'inherit' });
}
if (docker) {
console.purple('Removing previously made Docker container...');
const downCommand = `${sudo}docker-compose ${
singleCompose ? '-f ./docs/dev/single-compose.yml ' : ''
}down`;
console.orange(downCommand);
execSync(downCommand, { stdio: 'inherit' });
console.purple('Pruning all LibreChat Docker images...');
const imageName = singleCompose ? 'librechat_single' : 'librechat';
try {
execSync(`${sudo}docker rmi ${imageName}:latest`, { stdio: 'inherit' });
} catch (e) {
console.purple('Failed to remove Docker image librechat:latest. It might not exist.');
}
console.purple('Removing all unused dangling Docker images...');
execSync(`${sudo}docker image prune -f`, { stdio: 'inherit' });
console.purple('Building new LibreChat image...');
const buildCommand = `${sudo}docker-compose ${
singleCompose ? '-f ./docs/dev/single-compose.yml ' : ''
}build`;
console.orange(buildCommand);
execSync(buildCommand, { stdio: 'inherit' });
} else {
// Delete all node_modules
directories.forEach(deleteNodeModules);
// Run npm cache clean --force
console.purple('Cleaning npm cache...');
execSync('npm cache clean --force', { stdio: 'inherit' });
// Install dependencies
console.purple('Installing dependencies...');
execSync('npm ci', { stdio: 'inherit' });
// Build client-side code
console.purple('Building frontend...');
execSync(bun ? 'bun b:client' : 'npm run frontend', { stdio: 'inherit' });
}
let startCommand = 'npm run backend';
if (docker) {
startCommand = `${sudo}docker-compose ${
singleCompose ? '-f ./docs/dev/single-compose.yml ' : ''
}up`;
}
console.green('Your LibreChat app is now up to date! Start the app with the following command:');
console.purple(startCommand);
console.orange(
'Note: it\'s also recommended to clear your browser cookies and localStorage for LibreChat to assure a fully clean installation.',
);
console.orange('Also: Don\'t worry, your data is safe :)');
})();
|