You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

220 lines
7.0 KiB
Markdown

5 years ago
# Bitwarden_rs in docker
###### guide by example
5 years ago
![logo](https://i.imgur.com/tT3FQLJ.png)
5 years ago
4 years ago
# Purpose & Overview
5 years ago
4 years ago
Password manager.
5 years ago
* [Official site](https://bitwarden.com/)
* [Github](https://github.com/dani-garcia/bitwarden_rs)
5 years ago
* [DockerHub](https://hub.docker.com/r/bitwardenrs/server)
5 years ago
4 years ago
Bitwarden is a modern popular open source password manager
with wide cross platform support.
4 years ago
But the official Bitwarden server is bit over-engineered,
requiring Microsoft SQL server among other things,
which makes it not an ideal fit for smaller deployments
4 years ago
So here is where Bitwarden_rs by Daniel García comes in.</br>
It is a Bitwarden API implementation written in Rust.
It's very resource efficient, uses about 10MB of RAM,
and close to no CPU.</br>
4 years ago
Webapp part is build using Rocket, a web framework for Rust,
4 years ago
and user data are stored in a simple sqlite database file.
All the client apps are still officials coming from bitwarden,
only the server is a different implementation.
4 years ago
# Files and directory structure
5 years ago
4 years ago
```
4 years ago
/home/
└── ~/
└── docker/
└── bitwarden/
├── bitwarden-data/
├── .env
├── docker-compose.yml
└── bitwarden-backup-script.sh
4 years ago
```
5 years ago
4 years ago
* `bitwarden-data/` - a directory where bitwarden will store its database and other data
* `.env` - a file containing environmental variables for docker compose
* `docker-compose.yml` - a docker compose file, telling docker how to build bitwarden container
* `bitwarden-backup-script.sh` - a backup script if you want it
You only need to provide the files.</br>
The directory is created by docker compose on the first run.
4 years ago
# docker-compose
5 years ago
4 years ago
[Documentation](https://github.com/dani-garcia/bitwarden_rs/wiki/Using-Docker-Compose) on compose.
`docker-compose.yml`
```yml
version: "3"
services:
bitwarden:
image: bitwardenrs/server
container_name: bitwarden
hostname: bitwarden
restart: unless-stopped
env_file: .env
volumes:
- ./bitwarden-data/:/data/
networks:
default:
external:
name: $DEFAULT_NETWORK
```
`.env`
4 years ago
```bash
4 years ago
# GENERAL
MY_DOMAIN=blabla.org
DEFAULT_NETWORK=caddy_net
4 years ago
TZ=Europe/Bratislava
4 years ago
# BITWARDEN
ADMIN_TOKEN=YdLo1TM4MYEQ948GOVZ29IF4fABSrZMpk9
SIGNUPS_ALLOWED=false
WEBSOCKET_ENABLED=true
# USING SENDGRID FOR SENDING EMAILS
DOMAIN=https://passwd.blabla.org
SMTP_SSL=true
SMTP_EXPLICIT_TLS=true
SMTP_HOST=smtp.sendgrid.net
SMTP_PORT=465
SMTP_USERNAME=apikey
SMTP_PASSWORD=SG.MOQQegA3bgfodRN4IG2Wqwe.s23Ld4odqhOQQegf4466A4
SMTP_FROM=admin@blabla.org
```
**All containers must be on the same network**.</br>
If one does not exist yet: `docker network create caddy_net`
5 years ago
4 years ago
# Reverse proxy
5 years ago
4 years ago
Caddy v2 is used, details
[here](https://github.com/DoTheEvo/selfhosted-apps-docker/tree/master/caddy_v2).</br>
Bitwarden_rs documentation has a
[section on reverse proxy.](https://github.com/dani-garcia/bitwarden_rs/wiki/Proxy-examples)
4 years ago
`Caddyfile`
```
passwd.{$MY_DOMAIN} {
header / {
X-XSS-Protection "1; mode=block"
X-Frame-Options "DENY"
X-Robots-Tag "none"
-Server
}
encode gzip
reverse_proxy /notifications/hub/negotiate bitwarden:80
reverse_proxy /notifications/hub bitwarden:3012
reverse_proxy bitwarden:80
}
```
5 years ago
4 years ago
# Forward port 3012 TCP on your router
5 years ago
4 years ago
[WebSocket](https://youtu.be/2Nt-ZrNP22A) protocol is used for notifications,
4 years ago
so that all web based clients can immediatly sync when a change happens on the server.
5 years ago
4 years ago
* Enviromental variable `WEBSOCKET_ENABLED=true` needs to be set.</br>
* Reverse proxy needs to route `/notifications/hub` to port 3012.</br>
* Router needs to **forward port 3012** to docker host,
4 years ago
same as port 80 and 443 are forwarded.
To test if websocket works, have the desktop app open
and make changes through browser extension, or through the website.
4 years ago
Changes should immediatly appear in the desktop app. If it's not working,
4 years ago
you need to manually sync for changes to appear.
4 years ago
# Extra info
5 years ago
4 years ago
**bitwarden can be managed** at `<url>/admin` and entering `ADMIN_TOKEN`
set in the `.env` file. Especially if signups are disabled it is the only way
to invite users.
5 years ago
4 years ago
**push notifications** do not work at this moment.
[Github issue](https://github.com/dani-garcia/bitwarden_rs/issues/126).</br>
The purpose of [Push notifications](https://www.youtube.com/watch?v=8D1NAezC-Dk)
is the same to WebSocket, to tell the clients about the change on the server immediatly,
but they are for apps on mobile devices.
So you better manually sync before making changes.
4 years ago
5 years ago
---
5 years ago
![interface-pic](https://i.imgur.com/5LxEUsA.png)
4 years ago
# Update
5 years ago
5 years ago
* [watchtower](https://github.com/DoTheEvo/selfhosted-apps-docker/tree/master/watchtower) updates the image automaticly
5 years ago
* manual image update</br>
`docker-compose pull`</br>
`docker-compose up -d`</br>
`docker image prune`
4 years ago
# Backup and restore
5 years ago
4 years ago
* **backup** using [BorgBackup setup](https://github.com/DoTheEvo/selfhosted-apps-docker/tree/master/borg_backup)
5 years ago
that makes daily snapshot of the entire directory
5 years ago
* **restore**</br>
down the bitwarden container `docker-compose down`</br>
delete the entire bitwarden directory</br>
from the backup copy back the bitwarden directortory</br>
start the container `docker-compose up -d`
4 years ago
# Backup of just user data
5 years ago
4 years ago
Users data daily export using the [official procedure.](https://github.com/dani-garcia/bitwarden_rs/wiki/Backing-up-your-vault)</br>
4 years ago
For bitwarden_rs it means sqlite database dump and backing up `attachments` directory.</br>
4 years ago
4 years ago
Daily run of [BorgBackup](https://github.com/DoTheEvo/selfhosted-apps-docker/tree/master/borg_backup)
4 years ago
takes care of backing up the directory.
So only database dump is needed.
The created backup sqlite3 file is overwriten on every run of the script,
4 years ago
but that's ok since BorgBackup is making daily snapshots.
5 years ago
5 years ago
* **create a backup script**</br>
5 years ago
placed inside `bitwarden` directory on the host
5 years ago
`bitwarden-backup-script.sh`
5 years ago
```
5 years ago
#!/bin/bash
5 years ago
# CREATE SQLITE BACKUP
5 years ago
docker container exec bitwarden sqlite3 /data/db.sqlite3 ".backup '/data/BACKUP.bitwarden.db.sqlite3'"
5 years ago
```
5 years ago
the script must be **executabe** - `chmod +x bitwarden-backup-script.sh`
5 years ago
* **cronjob** on the host</br>
`crontab -e` - add new cron job</br>
`0 2 * * * /home/bastard/docker/bitwarden/bitwarden-backup-script.sh` - run it [at 02:00](https://crontab.guru/#0_2_*_*_*)</br>
`crontab -l` - list cronjobs
4 years ago
# Restore the user data
5 years ago
5 years ago
Assuming clean start.
* start the bitwarden container: `docker-compose up -d`
* let it run so it creates its file structure
* down the container `docker-compose down`
* in `bitwarden/bitwarden-data/`</br>
5 years ago
replace `db.sqlite3` with the backup one `BACKUP.bitwarden.db.sqlite3`</br>
4 years ago
replace `attachments` directory with the one from the BorgBackup repository
5 years ago
* start the container `docker-compose up -d`
5 years ago