| | 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'), |
| | }; |
| |
|
| | |
| | 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) { |
| | |
| | console.purple('Fetching the latest repo...'); |
| | execSync('git fetch origin', { stdio: 'inherit' }); |
| |
|
| | |
| | console.purple('Switching to main branch...'); |
| | execSync('git checkout main', { stdio: 'inherit' }); |
| |
|
| | |
| | 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 { |
| | |
| | directories.forEach(deleteNodeModules); |
| |
|
| | |
| | console.purple('Cleaning npm cache...'); |
| | execSync('npm cache clean --force', { stdio: 'inherit' }); |
| |
|
| | |
| | console.purple('Installing dependencies...'); |
| | execSync('npm ci', { stdio: 'inherit' }); |
| |
|
| | |
| | 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 :)'); |
| | })(); |
| |
|