diff --git a/scripts/bitwarden.ps1 b/scripts/bitwarden.ps1 index e57c7ad52..3d4f70ac4 100644 --- a/scripts/bitwarden.ps1 +++ b/scripts/bitwarden.ps1 @@ -1,171 +1,3 @@ -param ( - [switch] $install, - [switch] $start, - [switch] $restart, - [switch] $stop, - [switch] $update, - [switch] $rebuild, - [switch] $updateconf, - [switch] $renewcert, - [switch] $updatedb, - [switch] $updaterun, - [switch] $updateself, - [switch] $uninstall, - [switch] $help, - [string] $output = "" -) - -# Setup - $scriptPath = $MyInvocation.MyCommand.Path -$dir = Split-Path -Parent $MyInvocation.MyCommand.Path -if ($output -eq "") { - $output = "${dir}\bwdata" -} - -$scriptsDir = "${output}\scripts" -$githubBaseUrl = "https://raw.githubusercontent.com/bitwarden/server/master" - -# Please do not create pull requests modifying the version numbers. -$coreVersion = "1.46.2" -$webVersion = "2.26.1" -$keyConnectorVersion = "1.0.1" - -# Functions - -function Get-Self { - Invoke-RestMethod -OutFile $scriptPath -Uri "${githubBaseUrl}/scripts/bitwarden.ps1" -} - -function Get-Run-File { - if (!(Test-Path -Path $scriptsDir)) { - New-Item -ItemType directory -Path $scriptsDir | Out-Null - } - Invoke-RestMethod -OutFile $scriptsDir\run.ps1 -Uri "${githubBaseUrl}/scripts/run.ps1" -} - -function Test-Output-Dir-Exists { - if (!(Test-Path -Path $output)) { - throw "Cannot find a Bitwarden installation at $output." - } -} - -function Test-Output-Dir-Not-Exists { - if (Test-Path -Path "$output\docker") { - throw "Looks like Bitwarden is already installed at $output." - } -} - -function Show-Commands { - Write-Line " -Available commands: - --install --start --restart --stop --update --updatedb --updaterun --updateself --updateconf --uninstall --renewcert --rebuild --help - -See more at https://bitwarden.com/help/article/install-on-premise/#script-commands-reference -" -} - -function Write-Line($str) { - if($env:BITWARDEN_QUIET -ne "true") { - Write-Host $str - } -} - -# Intro - -$year = (Get-Date).year - -Write-Line @' - _ _ _ _ -| |__ (_) |___ ____ _ _ __ __| | ___ _ __ -| '_ \| | __\ \ /\ / / _` | '__/ _` |/ _ \ '_ \ -| |_) | | |_ \ V V / (_| | | | (_| | __/ | | | -|_.__/|_|\__| \_/\_/ \__,_|_| \__,_|\___|_| |_| -'@ - -Write-Line " -Open source password management solutions -Copyright 2015-${year}, 8bit Solutions LLC -https://bitwarden.com, https://github.com/bitwarden - -=================================================== -" - -if($env:BITWARDEN_QUIET -ne "true") { - Write-Line "bitwarden.ps1 version ${coreVersion}" - docker --version - docker-compose --version -} - -Write-Line "" - -# Commands - -if ($install) { - Test-Output-Dir-Not-Exists - New-Item -ItemType directory -Path $output -ErrorAction Ignore | Out-Null - Get-Run-File - Invoke-Expression "& `"$scriptsDir\run.ps1`" -install -outputDir `"$output`" -coreVersion $coreVersion -webVersion $webVersion -keyConnectorVersion $keyConnectorVersion" -} -elseif ($start -Or $restart) { - Test-Output-Dir-Exists - Invoke-Expression "& `"$scriptsDir\run.ps1`" -restart -outputDir `"$output`" -coreVersion $coreVersion -webVersion $webVersion -keyConnectorVersion $keyConnectorVersion" -} -elseif ($update) { - Test-Output-Dir-Exists - Get-Run-File - Invoke-Expression "& `"$scriptsDir\run.ps1`" -update -outputDir `"$output`" -coreVersion $coreVersion -webVersion $webVersion -keyConnectorVersion $keyConnectorVersion" -} -elseif ($rebuild) { - Test-Output-Dir-Exists - Invoke-Expression "& `"$scriptsDir\run.ps1`" -rebuild -outputDir `"$output`" -coreVersion $coreVersion -webVersion $webVersion -keyConnectorVersion $keyConnectorVersion" -} -elseif ($updateconf) { - Test-Output-Dir-Exists - Invoke-Expression "& `"$scriptsDir\run.ps1`" -updateconf -outputDir `"$output`" -coreVersion $coreVersion -webVersion $webVersion -keyConnectorVersion $keyConnectorVersion" -} -elseif ($updatedb) { - Test-Output-Dir-Exists - Invoke-Expression "& `"$scriptsDir\run.ps1`" -updatedb -outputDir `"$output`" -coreVersion $coreVersion -webVersion $webVersion -keyConnectorVersion $keyConnectorVersion" -} -elseif ($stop) { - Test-Output-Dir-Exists - Invoke-Expression "& `"$scriptsDir\run.ps1`" -stop -outputDir `"$output`" -coreVersion $coreVersion -webVersion $webVersion -keyConnectorVersion $keyConnectorVersion" -} -elseif ($renewcert) { - Test-Output-Dir-Exists - Invoke-Expression "& `"$scriptsDir\run.ps1`" -renewcert -outputDir `"$output`" -coreVersion $coreVersion -webVersion $webVersion -keyConnectorVersion $keyConnectorVersion" -} -elseif ($updaterun) { - Test-Output-Dir-Exists - Get-Run-File -} -elseif ($updateself) { - Get-Self - Write-Line "Updated self." -} -elseif ($uninstall) { - Test-Output-Dir-Exists - Invoke-Expression "& `"$scriptsDir\run.ps1`" -uninstall -outputDir `"$output`" " -} -elseif ($help) { - Show-Commands -} -else { - Write-Line "No command found." - Write-Line "" - Show-Commands -} +Invoke-RestMethod -OutFile $scriptPath -Uri "https://go.btwrdn.co/bw-ps" +Write-Output "We have moved our self-hosted scripts to their own repository (https://github.com/bitwarden/self-host). Your 'bitwarden.ps1' script has been automatically upgraded. Please run it again." diff --git a/scripts/bitwarden.sh b/scripts/bitwarden.sh index 013e7d283..4f9da295d 100755 --- a/scripts/bitwarden.sh +++ b/scripts/bitwarden.sh @@ -7,168 +7,25 @@ cat << "EOF" | '_ \| | __\ \ /\ / / _` | '__/ _` |/ _ \ '_ \ | |_) | | |_ \ V V / (_| | | | (_| | __/ | | | |_.__/|_|\__| \_/\_/ \__,_|_| \__,_|\___|_| |_| - EOF cat << EOF Open source password management solutions Copyright 2015-$(date +'%Y'), 8bit Solutions LLC https://bitwarden.com, https://github.com/bitwarden - =================================================== - EOF -# Setup - DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" SCRIPT_NAME=$(basename "$0") SCRIPT_PATH="$DIR/$SCRIPT_NAME" -OUTPUT="$DIR/bwdata" -if [ $# -eq 2 ] +BITWARDEN_SCRIPT_URL="https://go.btwrdn.co/bw-sh" + +if curl -L -s -w "http_code %{http_code}" -o $SCRIPT_PATH.1 $BITWARDEN_SCRIPT_URL | grep -q "^http_code 20[0-9]" then - OUTPUT=$2 -fi -if command -v docker-compose &> /dev/null -then - dccmd='docker-compose' + mv $SCRIPT_PATH.1 $SCRIPT_PATH + chmod u+x $SCRIPT_PATH + echo "We have moved our self-hosted scripts to their own repository (https://github.com/bitwarden/self-host). Your 'bitwarden.sh' script has been automatically upgraded. Please run it again." else - dccmd='docker compose' + rm -f $SCRIPT_PATH.1 fi - -SCRIPTS_DIR="$OUTPUT/scripts" -GITHUB_BASE_URL="https://raw.githubusercontent.com/bitwarden/server/master" - -# Please do not create pull requests modifying the version numbers. -COREVERSION="1.46.2" -WEBVERSION="2.26.1" -KEYCONNECTORVERSION="1.0.1" - -echo "bitwarden.sh version $COREVERSION" -docker --version -if [[ "$dccmd" == "docker compose" ]]; then - $dccmd version -else - $dccmd --version -fi - -echo "" - -# Functions - -function downloadSelf() { - if curl -s -w "http_code %{http_code}" -o $SCRIPT_PATH.1 $GITHUB_BASE_URL/scripts/bitwarden.sh | grep -q "^http_code 20[0-9]" - then - mv $SCRIPT_PATH.1 $SCRIPT_PATH - chmod u+x $SCRIPT_PATH - else - rm -f $SCRIPT_PATH.1 - fi -} - -function downloadRunFile() { - if [ ! -d "$SCRIPTS_DIR" ] - then - mkdir $SCRIPTS_DIR - fi - curl -s -o $SCRIPTS_DIR/run.sh $GITHUB_BASE_URL/scripts/run.sh - chmod u+x $SCRIPTS_DIR/run.sh - rm -f $SCRIPTS_DIR/install.sh -} - -function checkOutputDirExists() { - if [ ! -d "$OUTPUT" ] - then - echo "Cannot find a Bitwarden installation at $OUTPUT." - exit 1 - fi -} - -function checkOutputDirNotExists() { - if [ -d "$OUTPUT/docker" ] - then - echo "Looks like Bitwarden is already installed at $OUTPUT." - exit 1 - fi -} - -function listCommands() { -cat << EOT -Available commands: - -install -start -restart -stop -update -updatedb -updaterun -updateself -updateconf -uninstall -renewcert -rebuild -help - -See more at https://bitwarden.com/help/article/install-on-premise/#script-commands-reference - -EOT -} - -# Commands - -case $1 in - "install") - checkOutputDirNotExists - mkdir -p $OUTPUT - downloadRunFile - $SCRIPTS_DIR/run.sh install $OUTPUT $COREVERSION $WEBVERSION $KEYCONNECTORVERSION - ;; - "start" | "restart") - checkOutputDirExists - $SCRIPTS_DIR/run.sh restart $OUTPUT $COREVERSION $WEBVERSION $KEYCONNECTORVERSION - ;; - "update") - checkOutputDirExists - downloadRunFile - $SCRIPTS_DIR/run.sh update $OUTPUT $COREVERSION $WEBVERSION $KEYCONNECTORVERSION - ;; - "rebuild") - checkOutputDirExists - $SCRIPTS_DIR/run.sh rebuild $OUTPUT $COREVERSION $WEBVERSION $KEYCONNECTORVERSION - ;; - "updateconf") - checkOutputDirExists - $SCRIPTS_DIR/run.sh updateconf $OUTPUT $COREVERSION $WEBVERSION $KEYCONNECTORVERSION - ;; - "updatedb") - checkOutputDirExists - $SCRIPTS_DIR/run.sh updatedb $OUTPUT $COREVERSION $WEBVERSION $KEYCONNECTORVERSION - ;; - "stop") - checkOutputDirExists - $SCRIPTS_DIR/run.sh stop $OUTPUT $COREVERSION $WEBVERSION $KEYCONNECTORVERSION - ;; - "renewcert") - checkOutputDirExists - $SCRIPTS_DIR/run.sh renewcert $OUTPUT $COREVERSION $WEBVERSION $KEYCONNECTORVERSION - ;; - "updaterun") - checkOutputDirExists - downloadRunFile - ;; - "updateself") - downloadSelf && echo "Updated self." && exit - ;; - "uninstall") - checkOutputDirExists - $SCRIPTS_DIR/run.sh uninstall $OUTPUT - ;; - "help") - listCommands - ;; - *) - echo "No command found." - echo - listCommands -esac diff --git a/scripts/run.ps1 b/scripts/run.ps1 index b56e65811..a2b5b438a 100644 --- a/scripts/run.ps1 +++ b/scripts/run.ps1 @@ -1,293 +1,16 @@ -param ( - [string]$outputDir = "../.", - [string]$coreVersion = "latest", - [string]$webVersion = "latest", - [string]$keyConnectorVersion = "latest", - [switch] $install, - [switch] $start, - [switch] $restart, - [switch] $stop, - [switch] $pull, - [switch] $updateconf, - [switch] $uninstall, - [switch] $renewcert, - [switch] $updatedb, - [switch] $update -) - -# Setup - -$dockerDir = "${outputDir}\docker" -$setupQuiet = 0 -$qFlag = "" -$quietPullFlag = "" -$certbotHttpPort = "80" -$certbotHttpsPort = "443" -if ($env:BITWARDEN_QUIET -eq "true") { - $setupQuiet = 1 - $qFlag = " -q" - $quietPullFlag = " --quiet-pull" -} -if ("${env:BITWARDEN_CERTBOT_HTTP_PORT}" -ne "") { - $certbotHttpPort = $env:BITWARDEN_CERTBOT_HTTP_PORT -} -if ("${env:BITWARDEN_CERTBOT_HTTPS_PORT}" -ne "") { - $certbotHttpsPort = $env:BITWARDEN_CERTBOT_HTTPS_PORT -} - -# Functions - -function Install() { - [string]$letsEncrypt = "n" - Write-Host "(!) " -f cyan -nonewline - [string]$domain = $( Read-Host "Enter the domain name for your Bitwarden instance (ex. bitwarden.example.com)" ) - echo "" - - if ($domain -eq "") { - $domain = "localhost" - } - - if ($domain -ne "localhost") { - Write-Host "(!) " -f cyan -nonewline - $letsEncrypt = $( Read-Host "Do you want to use Let's Encrypt to generate a free SSL certificate? (y/n)" ) - echo "" - - if ($letsEncrypt -eq "y") { - Write-Host "(!) " -f cyan -nonewline - [string]$email = $( Read-Host ("Enter your email address (Let's Encrypt will send you certificate " + - "expiration reminders)") ) - echo "" - - $letsEncryptPath = "${outputDir}/letsencrypt" - if (!(Test-Path -Path $letsEncryptPath )) { - New-Item -ItemType directory -Path $letsEncryptPath | Out-Null - } - Invoke-Expression ("docker pull{0} certbot/certbot" -f "") #TODO: qFlag - $certbotExp = "docker run -it --rm --name certbot -p ${certbotHttpsPort}:443 -p ${certbotHttpPort}:80 " + ` - "-v ${outputDir}/letsencrypt:/etc/letsencrypt/ certbot/certbot " + ` - "certonly{0} --standalone --noninteractive --agree-tos --preferred-challenges http " + ` - "--email ${email} -d ${domain} --logs-dir /etc/letsencrypt/logs" - Invoke-Expression ($certbotExp -f $qFlag) - } - } - - Write-Host "(!) " -f cyan -nonewline - [string]$database = $( Read-Host "Enter the database name for your Bitwarden instance (ex. vault): ") - echo "" - - if ($database -eq "") { - $database = "vault" - } - - Pull-Setup - docker run -it --rm --name setup -v ${outputDir}:/bitwarden bitwarden/setup:$coreVersion ` - dotnet Setup.dll -install 1 -domain ${domain} -letsencrypt ${letsEncrypt} ` - -os win -corev $coreVersion -webv $webVersion -keyconnectorv $keyConnectorVersion -q $setupQuiet -dbname "$database" -} - -function Docker-Compose-Up { - Docker-Compose-Files - Docker-Compose-Volumes - Invoke-Expression ("docker-compose up -d{0}" -f $quietPullFlag) -} - -function Docker-Compose-Down { - Docker-Compose-Files - if ((Invoke-Expression ("docker-compose ps{0}" -f "") | Measure-Object -Line).lines -gt 2 ) { - Invoke-Expression ("docker-compose down{0}" -f "") #TODO: qFlag +$scriptPath = $MyInvocation.MyCommand.Path +$bitwardenPath = Split-Path $scriptPath | Split-Path | Split-Path +$files = Get-ChildItem $bitwardenPath +$scriptFound = $false +foreach ($file in $files) { + if ($file.Name -eq "bitwarden.ps1") { + $scriptFound = $true + Invoke-RestMethod -OutFile "$($bitwardenPath)/bitwarden.ps1" -Uri "https://go.btwrdn.co/bw-ps" + Write-Output "We have moved our self-hosted scripts to their own repository (https://github.com/bitwarden/self-host). Your 'bitwarden.ps1' script has been automatically upgraded. Please run it again." + break } } -function Docker-Compose-Pull { - Docker-Compose-Files - Invoke-Expression ("docker-compose pull{0}" -f $qFlag) -} - -function Docker-Compose-Files { - if (Test-Path -Path "${dockerDir}\docker-compose.override.yml" -PathType leaf) { - $env:COMPOSE_FILE = "${dockerDir}\docker-compose.yml;${dockerDir}\docker-compose.override.yml" - } - else { - $env:COMPOSE_FILE = "${dockerDir}\docker-compose.yml" - } - $env:COMPOSE_HTTP_TIMEOUT = "300" -} - -function Docker-Compose-Volumes { - Create-Dir "core" - Create-Dir "core/attachments" - Create-Dir "logs" - Create-Dir "logs/admin" - Create-Dir "logs/api" - Create-Dir "logs/events" - Create-Dir "logs/icons" - Create-Dir "logs/identity" - Create-Dir "logs/mssql" - Create-Dir "logs/nginx" - Create-Dir "logs/notifications" - Create-Dir "logs/sso" - Create-Dir "logs/portal" - Create-Dir "mssql/backups" - Create-Dir "mssql/data" -} - -function Create-Dir($str) { - $outPath = "${outputDir}/$str" - if (!(Test-Path -Path $outPath )) { - Write-Line "Creating directory $outPath" - New-Item -ItemType directory -Path $outPath | Out-Null - } -} - -function Docker-Prune { - docker image prune --all --force --filter="label=com.bitwarden.product=bitwarden" ` - --filter="label!=com.bitwarden.project=setup" -} - -function Update-Lets-Encrypt { - if (Test-Path -Path "${outputDir}\letsencrypt\live") { - Invoke-Expression ("docker pull{0} certbot/certbot" -f "") #TODO: qFlag - $certbotExp = "docker run -it --rm --name certbot -p ${certbotHttpsPort}:443 -p ${certbotHttpPort}:80 " + ` - "-v ${outputDir}/letsencrypt:/etc/letsencrypt/ certbot/certbot " + ` - "renew{0} --logs-dir /etc/letsencrypt/logs" -f $qFlag - Invoke-Expression $certbotExp - } -} - -function Force-Update-Lets-Encrypt { - if (Test-Path -Path "${outputDir}\letsencrypt\live") { - Invoke-Expression ("docker pull{0} certbot/certbot" -f "") #TODO: qFlag - $certbotExp = "docker run -it --rm --name certbot -p ${certbotHttpsPort}:443 -p ${certbotHttpPort}:80 " + ` - "-v ${outputDir}/letsencrypt:/etc/letsencrypt/ certbot/certbot " + ` - "renew{0} --logs-dir /etc/letsencrypt/logs --force-renew" -f $qFlag - Invoke-Expression $certbotExp - } -} - -function Update-Database { - Pull-Setup - Docker-Compose-Files - $mssqlId = docker-compose ps -q mssql - docker run -it --rm --name setup --network container:$mssqlId ` - -v ${outputDir}:/bitwarden bitwarden/setup:$coreVersion ` - dotnet Setup.dll -update 1 -db 1 -os win -corev $coreVersion -webv $webVersion ` - -keyconnectorv $keyConnectorVersion -q $setupQuiet - Write-Line "Database update complete" -} - -function Update([switch] $withpull) { - if ($withpull) { - Pull-Setup - } - docker run -it --rm --name setup -v ${outputDir}:/bitwarden bitwarden/setup:$coreVersion ` - dotnet Setup.dll -update 1 -os win -corev $coreVersion -webv $webVersion ` - -keyconnectorv $keyConnectorVersion -q $setupQuiet -} - -function Uninstall() { - $keepDatabase = $(Write-Host "(WARNING: UNINSTALL STARTED) Would you like to save the database files? (y/n)" -f red -nonewline) + $(Read-host) - if ($keepDatabase -eq "y") { - Write-Host "Saving database." - Compress-Archive -Path "${outputDir}\mssql" -DestinationPath ".\bitwarden_database.zip" - Write-Host "(SAVED DATABASE FILES: YES) `n(WARNING: ALL DATA WILL BE REMOVED, INCLUDING THE FOLDER $outputDir) " -f red -nonewline - $uninstallAction = $( Read-Host "Are you sure you want to uninstall Bitwarden? (y/n)" ) - } else { - Write-Host "(WARNING: ALL DATA WILL BE REMOVED, INCLUDING THE FOLDER $outputDir) " -f red -nonewline - $uninstallAction = $( Read-Host "Are you sure you want to uninstall Bitwarden? (y/n)" ) - } - - - if ($uninstallAction -eq "y") { - Write-Host "uninstalling Bitwarden..." - Docker-Compose-Down - Write-Host "Removing $outputDir" - Remove-Item -Path $outputDir -Force -Recurse - Write-Host "Bitwarden uninstall complete!" - } else { - Write-Host "Bitwarden uninstall canceled." - Exit - } - - Write-Host "(!) " -f red -nonewline - $purgeAction = $( Read-Host "Would you like to purge all local Bitwarden container images? (y/n)" ) - - if ($purgeAction -eq "y") { - Docker-Prune - } -} - -function Print-Environment { - Pull-Setup - docker run -it --rm --name setup -v ${outputDir}:/bitwarden bitwarden/setup:$coreVersion ` - dotnet Setup.dll -printenv 1 -os win -corev $coreVersion -webv $webVersion ` - -keyconnectorv $keyConnectorVersion -q $setupQuiet -} - -function Restart { - Docker-Compose-Down - Docker-Compose-Pull - Update-Lets-Encrypt - Docker-Compose-Up - Print-Environment -} - -function Cert-Restart { - Docker-Compose-Down - Docker-Compose-Pull - Force-Update-Lets-Encrypt - Docker-Compose-Up - Print-Environment -} - - -function Pull-Setup { - Invoke-Expression ("docker pull{0} bitwarden/setup:${coreVersion}" -f "") #TODO: qFlag -} - -function Write-Line($str) { - if ($env:BITWARDEN_QUIET -ne "true") { - Write-Host $str - } -} - -# Commands - -if ($install) { - Install -} -elseif ($start -Or $restart) { - Restart -} -elseif ($pull) { - Docker-Compose-Pull -} -elseif ($stop) { - Docker-Compose-Down -} -elseif ($renewcert) { - Cert-Restart -} -elseif ($updateconf) { - Docker-Compose-Down - Update -withpull -} -elseif ($updatedb) { - Update-Database -} -elseif ($update) { - Docker-Compose-Down - Update -withpull - Restart - Docker-Prune - Write-Line "Pausing 60 seconds for database to come online. Please wait..." - Start-Sleep -s 60 - Update-Database -} -elseif ($uninstall) { - Docker-Compose-Down - Uninstall -} -elseif ($rebuild) { - Docker-Compose-Down - Update +if (-not $scriptFound) { + Write-Output "We have moved our self-hosted scripts to their own repository (https://github.com/bitwarden/self-host). Please run 'bitwarden.ps1 -updateself' before updating." } diff --git a/scripts/run.sh b/scripts/run.sh index 98a19566c..65828bd2f 100755 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -1,343 +1,45 @@ #!/usr/bin/env bash set -e -# Setup -if command -v docker-compose &> /dev/null -then - dccmd='docker-compose' -else - dccmd='docker compose' -fi +cat << "EOF" + _ _ _ _ +| |__ (_) |___ ____ _ _ __ __| | ___ _ __ +| '_ \| | __\ \ /\ / / _` | '__/ _` |/ _ \ '_ \ +| |_) | | |_ \ V V / (_| | | | (_| | __/ | | | +|_.__/|_|\__| \_/\_/ \__,_|_| \__,_|\___|_| |_| +EOF -CYAN='\033[0;36m' -RED='\033[1;31m' -NC='\033[0m' # No Color +cat << EOF +Open source password management solutions +Copyright 2015-$(date +'%Y'), 8bit Solutions LLC +https://bitwarden.com, https://github.com/bitwarden +=================================================== +EOF DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +BITWARDEN_SCRIPT_URL="https://go.btwrdn.co/bw-sh" -OUTPUT_DIR=".." -if [ $# -gt 1 ] -then - OUTPUT_DIR=$2 -fi +cd $DIR +cd ../../ -COREVERSION="latest" -if [ $# -gt 2 ] -then - COREVERSION=$3 -fi +FOUND=false -WEBVERSION="latest" -if [ $# -gt 3 ] -then - WEBVERSION=$4 -fi - -KEYCONNECTORVERSION="latest" -if [ $# -gt 4 ] -then - KEYCONNECTORVERSION=$5 -fi - -OS="lin" -[ "$(uname)" == "Darwin" ] && OS="mac" -ENV_DIR="$OUTPUT_DIR/env" -DOCKER_DIR="$OUTPUT_DIR/docker" - -# Initialize UID/GID which will be used to run services from within containers -if ! grep -q "^LOCAL_UID=" $ENV_DIR/uid.env 2>/dev/null || ! grep -q "^LOCAL_GID=" $ENV_DIR/uid.env 2>/dev/null -then - LUID="LOCAL_UID=`id -u $USER`" - [ "$LUID" == "LOCAL_UID=0" ] && LUID="LOCAL_UID=65534" - LGID="LOCAL_GID=`id -g $USER`" - [ "$LGID" == "LOCAL_GID=0" ] && LGID="LOCAL_GID=65534" - mkdir -p $ENV_DIR - echo $LUID >$ENV_DIR/uid.env - echo $LGID >>$ENV_DIR/uid.env -fi - -# Functions - -function install() { - LETS_ENCRYPT="n" - echo -e -n "${CYAN}(!)${NC} Enter the domain name for your Bitwarden instance (ex. bitwarden.example.com): " - read DOMAIN - echo "" - - if [ "$DOMAIN" == "" ] +for i in *.sh; do + if [ $i = "bitwarden.sh" ] + then + FOUND=true + if curl -L -s -w "http_code %{http_code}" -o bitwarden.sh.1 $BITWARDEN_SCRIPT_URL | grep -q "^http_code 20[0-9]" then - DOMAIN="localhost" - fi - - if [ "$DOMAIN" != "localhost" ] - then - echo -e -n "${CYAN}(!)${NC} Do you want to use Let's Encrypt to generate a free SSL certificate? (y/n): " - read LETS_ENCRYPT - echo "" - - if [ "$LETS_ENCRYPT" == "y" ] - then - echo -e -n "${CYAN}(!)${NC} Enter your email address (Let's Encrypt will send you certificate expiration reminders): " - read EMAIL - echo "" - - mkdir -p $OUTPUT_DIR/letsencrypt - docker pull certbot/certbot - docker run -it --rm --name certbot -p 80:80 -v $OUTPUT_DIR/letsencrypt:/etc/letsencrypt/ certbot/certbot \ - certonly --standalone --noninteractive --agree-tos --preferred-challenges http \ - --email $EMAIL -d $DOMAIN --logs-dir /etc/letsencrypt/logs - fi - fi - - echo -e -n "${CYAN}(!)${NC} Enter the database name for your Bitwarden instance (ex. vault): " - read DATABASE - echo "" - - if [ "$DATABASE" == "" ] - then - DATABASE="vault" - fi - - pullSetup - docker run -it --rm --name setup -v $OUTPUT_DIR:/bitwarden \ - --env-file $ENV_DIR/uid.env bitwarden/setup:$COREVERSION \ - dotnet Setup.dll -install 1 -domain $DOMAIN -letsencrypt $LETS_ENCRYPT -os $OS \ - -corev $COREVERSION -webv $WEBVERSION -dbname "$DATABASE" -keyconnectorv $KEYCONNECTORVERSION -} - -function dockerComposeUp() { - dockerComposeFiles - dockerComposeVolumes - $dccmd up -d -} - -function dockerComposeDown() { - dockerComposeFiles - if [ $($dccmd ps | wc -l) -gt 2 ]; then - $dccmd down - fi -} - -function dockerComposePull() { - dockerComposeFiles - $dccmd pull -} - -function dockerComposeFiles() { - if [ -f "${DOCKER_DIR}/docker-compose.override.yml" ] - then - export COMPOSE_FILE="$DOCKER_DIR/docker-compose.yml:$DOCKER_DIR/docker-compose.override.yml" + mv bitwarden.sh.1 bitwarden.sh + chmod u+x bitwarden.sh + echo "We have moved our self-hosted scripts to their own repository (https://github.com/bitwarden/self-host). Your 'bitwarden.sh' script has been automatically upgraded. Please run it again." else - export COMPOSE_FILE="$DOCKER_DIR/docker-compose.yml" + rm -f bitwarden.sh.1 fi - export COMPOSE_HTTP_TIMEOUT="300" -} + fi +done -function dockerComposeVolumes() { - createDir "core" - createDir "core/attachments" - createDir "logs" - createDir "logs/admin" - createDir "logs/api" - createDir "logs/events" - createDir "logs/icons" - createDir "logs/identity" - createDir "logs/mssql" - createDir "logs/nginx" - createDir "logs/notifications" - createDir "logs/sso" - createDir "logs/portal" - createDir "mssql/backups" - createDir "mssql/data" -} - -function createDir() { - if [ ! -d "${OUTPUT_DIR}/$1" ] - then - echo "Creating directory $OUTPUT_DIR/$1" - mkdir -p $OUTPUT_DIR/$1 - fi -} - -function dockerPrune() { - docker image prune --all --force --filter="label=com.bitwarden.product=bitwarden" \ - --filter="label!=com.bitwarden.project=setup" -} - -function updateLetsEncrypt() { - if [ -d "${OUTPUT_DIR}/letsencrypt/live" ] - then - docker pull certbot/certbot - docker run -i --rm --name certbot -p 443:443 -p 80:80 \ - -v $OUTPUT_DIR/letsencrypt:/etc/letsencrypt/ certbot/certbot \ - renew --logs-dir /etc/letsencrypt/logs - fi -} - -function forceUpdateLetsEncrypt() { - if [ -d "${OUTPUT_DIR}/letsencrypt/live" ] - then - docker pull certbot/certbot - docker run -i --rm --name certbot -p 443:443 -p 80:80 \ - -v $OUTPUT_DIR/letsencrypt:/etc/letsencrypt/ certbot/certbot \ - renew --logs-dir /etc/letsencrypt/logs --force-renew - fi -} - -function updateDatabase() { - pullSetup - dockerComposeFiles - MSSQL_ID=$($dccmd ps -q mssql) - docker run -i --rm --name setup --network container:$MSSQL_ID \ - -v $OUTPUT_DIR:/bitwarden --env-file $ENV_DIR/uid.env bitwarden/setup:$COREVERSION \ - dotnet Setup.dll -update 1 -db 1 -os $OS -corev $COREVERSION -webv $WEBVERSION -keyconnectorv $KEYCONNECTORVERSION - echo "Database update complete" -} - -function updatebw() { - KEY_CONNECTOR_ENABLED=$(grep -A3 'enable_key_connector:' $OUTPUT_DIR/config.yml | tail -n1 | awk '{ print $2}') - CORE_ID=$($dccmd ps -q admin) - WEB_ID=$($dccmd ps -q web) - if [ "$KEY_CONNECTOR_ENABLED" = true ]; - then - KEYCONNECTOR_ID=$($dccmd ps -q key-connector) - fi - - if [ $KEYCONNECTOR_ID ] && - docker inspect --format='{{.Config.Image}}:' $CORE_ID | grep -F ":$COREVERSION:" | grep -q ":[0-9.]*:$" && - docker inspect --format='{{.Config.Image}}:' $WEB_ID | grep -F ":$WEBVERSION:" | grep -q ":[0-9.]*:$" && - docker inspect --format='{{.Config.Image}}:' $KEYCONNECTOR_ID | grep -F ":$KEYCONNECTORVERSION:" | grep -q ":[0-9.]*:$" - then - echo "Update not needed" - exit - elif - docker inspect --format='{{.Config.Image}}:' $CORE_ID | grep -F ":$COREVERSION:" | grep -q ":[0-9.]*:$" && - docker inspect --format='{{.Config.Image}}:' $WEB_ID | grep -F ":$WEBVERSION:" | grep -q ":[0-9.]*:$" - then - echo "Update not needed" - exit - fi - dockerComposeDown - update withpull - restart - dockerPrune - echo "Pausing 60 seconds for database to come online. Please wait..." - sleep 60 -} - -function update() { - if [ "$1" == "withpull" ] - then - pullSetup - fi - docker run -i --rm --name setup -v $OUTPUT_DIR:/bitwarden \ - --env-file $ENV_DIR/uid.env bitwarden/setup:$COREVERSION \ - dotnet Setup.dll -update 1 -os $OS -corev $COREVERSION -webv $WEBVERSION -keyconnectorv $KEYCONNECTORVERSION -} - -function uninstall() { - echo -e -n "${RED}(WARNING: UNINSTALL STARTED) Would you like to save the database files? (y/n): ${NC}" - read KEEP_DATABASE - - if [ "$KEEP_DATABASE" == "y" ] - then - echo "Saving database files." - tar -cvzf "./bitwarden_database.tar.gz" "$OUTPUT_DIR/mssql" - echo -e -n "${RED}(SAVED DATABASE FILES: YES): WARNING: ALL DATA WILL BE REMOVED, INCLUDING THE FOLDER $OUTPUT_DIR): Are you sure you want to uninstall Bitwarden? (y/n): ${NC}" - read UNINSTALL_ACTION - else - echo -e -n "${RED}WARNING: ALL DATA WILL BE REMOVED, INCLUDING THE FOLDER $OUTPUT_DIR): Are you sure you want to uninstall Bitwarden? (y/n): ${NC}" - read UNINSTALL_ACTION - fi - - - if [ "$UNINSTALL_ACTION" == "y" ] - then - echo "Uninstalling Bitwarden..." - dockerComposeDown - echo "Removing $OUTPUT_DIR" - rm -R $OUTPUT_DIR - echo "Removing MSSQL docker volume." - docker volume prune --force --filter="label=com.bitwarden.product=bitwarden" - echo "Bitwarden uninstall complete!" - else - echo -e -n "${CYAN}(!) Bitwarden uninstall canceled. ${NC}" - exit 1 - fi - - echo -e -n "${RED}(!) Would you like to purge all local Bitwarden container images? (y/n): ${NC}" - read PURGE_ACTION - if [ "$PURGE_ACTION" == "y" ] - then - dockerPrune - echo -e -n "${CYAN}Bitwarden uninstall complete! ${NC}" - fi - -} - -function printEnvironment() { - pullSetup - docker run -i --rm --name setup -v $OUTPUT_DIR:/bitwarden \ - --env-file $ENV_DIR/uid.env bitwarden/setup:$COREVERSION \ - dotnet Setup.dll -printenv 1 -os $OS -corev $COREVERSION -webv $WEBVERSION -keyconnectorv $KEYCONNECTORVERSION -} - -function restart() { - dockerComposeDown - dockerComposePull - updateLetsEncrypt - dockerComposeUp - printEnvironment -} - -function certRestart() { - dockerComposeDown - dockerComposePull - forceUpdateLetsEncrypt - dockerComposeUp - printEnvironment -} - -function pullSetup() { - docker pull bitwarden/setup:$COREVERSION -} - -# Commands - -case $1 in - "install") - install - ;; - "start" | "restart") - restart - ;; - "pull") - dockerComposePull - ;; - "stop") - dockerComposeDown - ;; - "renewcert") - certRestart - ;; - "updateconf") - dockerComposeDown - update withpull - ;; - "updatedb") - updateDatabase - ;; - "update") - dockerComposeFiles - updatebw - updateDatabase - ;; - "uninstall") - dockerComposeFiles - uninstall - ;; - "rebuild") - dockerComposeDown - update nopull - ;; -esac +if [ $FOUND = false ] +then + echo "We have moved our self-hosted scripts to their own repository (https://github.com/bitwarden/self-host). Please run 'bitwarden.sh updateself' before updating." +fi