vaultwarden-install.sh 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #!/usr/bin/env bash -ex
  2. set -euo pipefail
  3. shopt -s inherit_errexit nullglob
  4. YW=`echo "\033[33m"`
  5. RD=`echo "\033[01;31m"`
  6. BL=`echo "\033[36m"`
  7. GN=`echo "\033[1;92m"`
  8. CL=`echo "\033[m"`
  9. RETRY_NUM=10
  10. RETRY_EVERY=3
  11. NUM=$RETRY_NUM
  12. CM="${GN}✓${CL}"
  13. CROSS="${RD}✗${CL}"
  14. BFR="\\r\\033[K"
  15. HOLD="-"
  16. function msg_info() {
  17. local msg="$1"
  18. echo -ne " ${HOLD} ${YW}${msg}..."
  19. }
  20. function msg_ok() {
  21. local msg="$1"
  22. echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
  23. }
  24. msg_info "Setting up Container OS "
  25. sed -i "/$LANG/ s/\(^# \)//" /etc/locale.gen
  26. locale-gen >/dev/null
  27. while [ "$(hostname -I)" = "" ]; do
  28. 1>&2 echo -en "${CROSS}${RD} No Network! "
  29. sleep $RETRY_EVERY
  30. ((NUM--))
  31. if [ $NUM -eq 0 ]
  32. then
  33. 1>&2 echo -e "${CROSS}${RD} No Network After $RETRY_NUM Tries${CL}"
  34. exit 1
  35. fi
  36. done
  37. msg_ok "Set up Container OS"
  38. msg_ok "Network Connected: ${BL}$(hostname -I)"
  39. msg_info "Updating Container OS"
  40. apt update &>/dev/null
  41. apt-get -qqy upgrade &>/dev/null
  42. msg_ok "Updated Container OS"
  43. msg_info "Installing Dependencies"
  44. apt-get update &>/dev/null
  45. apt-get -qqy install \
  46. git \
  47. nano \
  48. wget \
  49. htop \
  50. pkg-config \
  51. openssl \
  52. libssl1.1 \
  53. libssl-dev \
  54. curl \
  55. sudo &>/dev/null
  56. msg_ok "Installed Dependencies"
  57. msg_info "Installing Build Essentials"
  58. apt-get install -y build-essential &>/dev/null
  59. msg_ok "Installed Build Essentials"
  60. msg_info "Installing Rust"
  61. curl https://sh.rustup.rs -sSf | sh -s -- -y &>/dev/null
  62. echo 'export PATH=~/.cargo/bin:$PATH' >> ~/.bashrc &>/dev/null
  63. export PATH=~/.cargo/bin:$PATH &>/dev/null
  64. which rustc &>/dev/null
  65. msg_ok "Installed Rust"
  66. msg_info "Installing Node.js"
  67. curl -fsSL https://deb.nodesource.com/setup_16.x | bash - &>/dev/null
  68. apt-get install -y nodejs &>/dev/null
  69. npm -g install npm@7 &>/dev/null
  70. which npm &>/dev/null
  71. npm i npm@latest -g &>/dev/null
  72. msg_ok "Installed Node.js"
  73. msg_info "Building Vaultwarden (Patience)"
  74. git clone https://github.com/dani-garcia/vaultwarden &>/dev/null
  75. pushd vaultwarden &>/dev/null
  76. cargo clean &>/dev/null
  77. cargo build --features sqlite --release &>/dev/null
  78. file target/release/vaultwarden &>/dev/null
  79. msg_ok "Built Vaultwarden"
  80. msg_info "Building Web-Vault"
  81. pushd target/release/ &>/dev/null
  82. git clone --recurse-submodules https://github.com/bitwarden/web.git web-vault.git &>/dev/null
  83. cd web-vault.git &>/dev/null
  84. git checkout v2.25.1 &>/dev/null
  85. git submodule update --init --recursive &>/dev/null
  86. wget https://raw.githubusercontent.com/dani-garcia/bw_web_builds/master/patches/v2.25.0.patch &>/dev/null
  87. git apply v2.25.0.patch &>/dev/null
  88. npm ci --silent --legacy-peer-deps &>/dev/null
  89. npm audit fix --silent --legacy-peer-deps || true &>/dev/null
  90. npm run --silent dist:oss:selfhost &>/dev/null
  91. cp -a build ../web-vault &>/dev/null
  92. cd ..
  93. mkdir data
  94. msg_ok "Built Web-Vault"
  95. msg_info "Creating Service"
  96. cp ../../.env.template /etc/vaultwarden.env &>/dev/null
  97. cp vaultwarden /usr/bin/vaultwarden &>/dev/null
  98. chmod +x /usr/bin/vaultwarden &>/dev/null
  99. useradd -m -d /var/lib/vaultwarden vaultwarden &>/dev/null
  100. sudo cp -R data /var/lib/vaultwarden/ &>/dev/null
  101. cp -R web-vault /var/lib/vaultwarden/ &>/dev/null
  102. chown -R vaultwarden:vaultwarden /var/lib/vaultwarden &>/dev/null
  103. service_path="/etc/systemd/system/vaultwarden.service" &>/dev/null
  104. echo "[Unit]
  105. Description=Bitwarden Server (Powered by Vaultwarden)
  106. Documentation=https://github.com/dani-garcia/vaultwarden
  107. After=network.target
  108. [Service]
  109. User=vaultwarden
  110. Group=vaultwarden
  111. EnvironmentFile=/etc/vaultwarden.env
  112. ExecStart=/usr/bin/vaultwarden
  113. LimitNOFILE=1048576
  114. PrivateTmp=true
  115. PrivateDevices=true
  116. ProtectHome=true
  117. ProtectSystem=strict
  118. WorkingDirectory=/var/lib/vaultwarden
  119. ReadWriteDirectories=/var/lib/vaultwarden
  120. AmbientCapabilities=CAP_NET_BIND_SERVICE
  121. [Install]
  122. WantedBy=multi-user.target" > $service_path
  123. systemctl daemon-reload
  124. systemctl enable vaultwarden.service &>/dev/null
  125. systemctl start vaultwarden.service &>/dev/null
  126. msg_ok "Created Service"
  127. PASS=$(grep -w "root" /etc/shadow | cut -b6);
  128. if [[ $PASS != $ ]]; then
  129. msg_info "Customizing Container"
  130. rm /etc/motd
  131. rm /etc/update-motd.d/10-uname
  132. touch ~/.hushlogin
  133. GETTY_OVERRIDE="/etc/systemd/system/container-getty@1.service.d/override.conf"
  134. mkdir -p $(dirname $GETTY_OVERRIDE)
  135. cat << EOF > $GETTY_OVERRIDE
  136. [Service]
  137. ExecStart=
  138. ExecStart=-/sbin/agetty --autologin root --noclear --keep-baud tty%I 115200,38400,9600 \$TERM
  139. EOF
  140. systemctl daemon-reload
  141. systemctl restart $(basename $(dirname $GETTY_OVERRIDE) | sed 's/\.d//')
  142. msg_ok "Customized Container"
  143. fi
  144. msg_info "Cleaning up"
  145. apt-get autoremove >/dev/null
  146. apt-get autoclean >/dev/null
  147. rm -rf /var/{cache,log}/* /var/lib/apt/lists/*
  148. msg_ok "Cleaned"