From a9293f52d6b3f643536d320a5d6c78f397e8f3d7 Mon Sep 17 00:00:00 2001 From: okxlin Date: Wed, 28 Jun 2023 23:40:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0bitwarden=E5=88=B0?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/bitwarden/1.28.1/.env.sample | 3 + apps/bitwarden/1.28.1/data.yml | 17 ++++ apps/bitwarden/1.28.1/docker-compose.yml | 18 +++++ apps/bitwarden/README.md | 95 +++++++++++++++++++++++ apps/bitwarden/data.yml.bak | 20 +++++ apps/bitwarden/latest/.env.sample | 3 + apps/bitwarden/latest/data.yml | 17 ++++ apps/bitwarden/latest/docker-compose.yml | 18 +++++ apps/bitwarden/logo.png | Bin 0 -> 16591 bytes 9 files changed, 191 insertions(+) create mode 100644 apps/bitwarden/1.28.1/.env.sample create mode 100644 apps/bitwarden/1.28.1/data.yml create mode 100644 apps/bitwarden/1.28.1/docker-compose.yml create mode 100644 apps/bitwarden/README.md create mode 100644 apps/bitwarden/data.yml.bak create mode 100644 apps/bitwarden/latest/.env.sample create mode 100644 apps/bitwarden/latest/data.yml create mode 100644 apps/bitwarden/latest/docker-compose.yml create mode 100644 apps/bitwarden/logo.png diff --git a/apps/bitwarden/1.28.1/.env.sample b/apps/bitwarden/1.28.1/.env.sample new file mode 100644 index 00000000..cca679a1 --- /dev/null +++ b/apps/bitwarden/1.28.1/.env.sample @@ -0,0 +1,3 @@ +CONTAINER_NAME="bitwarden" +PANEL_APP_PORT_HTTP="40031" +DATA_PATH="./data" diff --git a/apps/bitwarden/1.28.1/data.yml b/apps/bitwarden/1.28.1/data.yml new file mode 100644 index 00000000..4812fc50 --- /dev/null +++ b/apps/bitwarden/1.28.1/data.yml @@ -0,0 +1,17 @@ +additionalProperties: + formFields: + - default: 40031 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number + - default: ./data + edit: true + envKey: DATA_PATH + labelEn: Data folder path + labelZh: 数据文件夹路径 + required: true + type: text diff --git a/apps/bitwarden/1.28.1/docker-compose.yml b/apps/bitwarden/1.28.1/docker-compose.yml new file mode 100644 index 00000000..73100059 --- /dev/null +++ b/apps/bitwarden/1.28.1/docker-compose.yml @@ -0,0 +1,18 @@ +version: '3' +services: + bitwarden: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:80" + volumes: + - "${DATA_PATH}:/data" + image: vaultwarden/server:1.28.1-alpine + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/bitwarden/README.md b/apps/bitwarden/README.md new file mode 100644 index 00000000..dc98d41d --- /dev/null +++ b/apps/bitwarden/README.md @@ -0,0 +1,95 @@ +### Alternative implementation of the Bitwarden server API written in Rust and compatible with [upstream Bitwarden clients](https://bitwarden.com/download/)*, perfect for self-hosted deployment where running the official resource-heavy service might not be ideal. + +📢 Note: This project was known as Bitwarden_RS and has been renamed to separate itself from the official Bitwarden server in the hopes of avoiding confusion and trademark/branding issues. Please see [#1642](https://github.com/dani-garcia/vaultwarden/discussions/1642) for more explanation. + +--- +[![Build](https://github.com/dani-garcia/vaultwarden/actions/workflows/build.yml/badge.svg)](https://github.com/dani-garcia/vaultwarden/actions/workflows/build.yml) +[![ghcr.io](https://img.shields.io/badge/ghcr.io-download-blue)](https://github.com/dani-garcia/vaultwarden/pkgs/container/vaultwarden) +[![Docker Pulls](https://img.shields.io/docker/pulls/vaultwarden/server.svg)](https://hub.docker.com/r/vaultwarden/server) +[![Quay.io](https://img.shields.io/badge/Quay.io-download-blue)](https://quay.io/repository/vaultwarden/server) +[![Dependency Status](https://deps.rs/repo/github/dani-garcia/vaultwarden/status.svg)](https://deps.rs/repo/github/dani-garcia/vaultwarden) +[![GitHub Release](https://img.shields.io/github/release/dani-garcia/vaultwarden.svg)](https://github.com/dani-garcia/vaultwarden/releases/latest) +[![AGPL-3.0 Licensed](https://img.shields.io/github/license/dani-garcia/vaultwarden.svg)](https://github.com/dani-garcia/vaultwarden/blob/main/LICENSE.txt) +[![Matrix Chat](https://img.shields.io/matrix/vaultwarden:matrix.org.svg?logo=matrix)](https://matrix.to/#/#vaultwarden:matrix.org) + +Image is based on [Rust implementation of Bitwarden API](https://github.com/dani-garcia/vaultwarden). + +**This project is not associated with the [Bitwarden](https://bitwarden.com/) project nor Bitwarden, Inc.** + +#### ⚠️**IMPORTANT**⚠️: When using this server, please report any bugs or suggestions to us directly (look at the bottom of this page for ways to get in touch), regardless of whatever clients you are using (mobile, desktop, browser...). DO NOT use the official support channels. + +--- + +## Features + +Basically full implementation of Bitwarden API is provided including: + + * Organizations support + * Attachments and Send + * Vault API support + * Serving the static files for Vault interface + * Website icons API + * Authenticator and U2F support + * YubiKey and Duo support + * Emergency Access + +## Installation +Pull the docker image and mount a volume from the host for persistent storage: + +```sh +docker pull vaultwarden/server:latest +docker run -d --name vaultwarden -v /vw-data/:/data/ -p 80:80 vaultwarden/server:latest +``` +This will preserve any persistent data under /vw-data/, you can adapt the path to whatever suits you. + +**IMPORTANT**: Most modern web browsers, disallow the use of Web Crypto APIs in insecure contexts. In this case, you might get an error like `Cannot read property 'importKey'`. To solve this problem, you need to access the web vault via HTTPS or localhost. + +This can be configured in [vaultwarden directly](https://github.com/dani-garcia/vaultwarden/wiki/Enabling-HTTPS) or using a third-party reverse proxy ([some examples](https://github.com/dani-garcia/vaultwarden/wiki/Proxy-examples)). + +If you have an available domain name, you can get HTTPS certificates with [Let's Encrypt](https://letsencrypt.org/), or you can generate self-signed certificates with utilities like [mkcert](https://github.com/FiloSottile/mkcert). Some proxies automatically do this step, like Caddy (see examples linked above). + +## Usage +See the [vaultwarden wiki](https://github.com/dani-garcia/vaultwarden/wiki) for more information on how to configure and run the vaultwarden server. + +## Get in touch +To ask a question, offer suggestions or new features or to get help configuring or installing the software, please use [GitHub Discussions](https://github.com/dani-garcia/vaultwarden/discussions) or [the forum](https://vaultwarden.discourse.group/). + +If you spot any bugs or crashes with vaultwarden itself, please [create an issue](https://github.com/dani-garcia/vaultwarden/issues/). Make sure you are on the latest version and there aren't any similar issues open, though! + +If you prefer to chat, we're usually hanging around at [#vaultwarden:matrix.org](https://matrix.to/#/#vaultwarden:matrix.org) room on Matrix. Feel free to join us! + +### Sponsors +Thanks for your contribution to the project! + + + + + + + + + + +
+ + Chris Alfano + +
+ + Numberly + +
diff --git a/apps/bitwarden/data.yml.bak b/apps/bitwarden/data.yml.bak new file mode 100644 index 00000000..58192b24 --- /dev/null +++ b/apps/bitwarden/data.yml.bak @@ -0,0 +1,20 @@ +name: Bitwarden +tags: + - 工具 +title: 一个开源的密码管理服务 +type: 工具 +description: 一个开源的密码管理服务 +additionalProperties: + key: bitwarden + name: Bitwarden + tags: + - Tool + shortDescZh: 一个开源的密码管理服务 + shortDescEn: An open source password management service + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://bitwarden.com/ + github: https://github.com/dani-garcia/vaultwarden + document: https://github.com/dani-garcia/vaultwarden/wiki \ No newline at end of file diff --git a/apps/bitwarden/latest/.env.sample b/apps/bitwarden/latest/.env.sample new file mode 100644 index 00000000..cca679a1 --- /dev/null +++ b/apps/bitwarden/latest/.env.sample @@ -0,0 +1,3 @@ +CONTAINER_NAME="bitwarden" +PANEL_APP_PORT_HTTP="40031" +DATA_PATH="./data" diff --git a/apps/bitwarden/latest/data.yml b/apps/bitwarden/latest/data.yml new file mode 100644 index 00000000..4812fc50 --- /dev/null +++ b/apps/bitwarden/latest/data.yml @@ -0,0 +1,17 @@ +additionalProperties: + formFields: + - default: 40031 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number + - default: ./data + edit: true + envKey: DATA_PATH + labelEn: Data folder path + labelZh: 数据文件夹路径 + required: true + type: text diff --git a/apps/bitwarden/latest/docker-compose.yml b/apps/bitwarden/latest/docker-compose.yml new file mode 100644 index 00000000..2d7137d6 --- /dev/null +++ b/apps/bitwarden/latest/docker-compose.yml @@ -0,0 +1,18 @@ +version: '3' +services: + bitwarden: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:80" + volumes: + - "${DATA_PATH}:/data" + image: vaultwarden/server:latest + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/bitwarden/logo.png b/apps/bitwarden/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c6fac3dd3b12905c9972dd9089bafb00c003ab GIT binary patch literal 16591 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 `pfW1n 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