Browse Source
This includes migrations as well as Dockerfile's for amd64. The biggest change is that replace_into isn't supported by Diesel for the PostgreSQL backend, instead requiring the use of on_conflict. This unfortunately requires a branch for save() on all of the models currently using replace_into.pull/621/head
18 changed files with 724 additions and 12 deletions
@ -0,0 +1,103 @@ |
|||
# Using multistage build: |
|||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|||
####################### VAULT BUILD IMAGE ####################### |
|||
FROM alpine:3.10 as vault |
|||
|
|||
ENV VAULT_VERSION "v2.12.0" |
|||
|
|||
ENV URL "https://github.com/dani-garcia/bw_web_builds/releases/download/$VAULT_VERSION/bw_web_$VAULT_VERSION.tar.gz" |
|||
|
|||
RUN apk add --no-cache --upgrade \ |
|||
curl \ |
|||
tar |
|||
|
|||
RUN mkdir /web-vault |
|||
WORKDIR /web-vault |
|||
|
|||
SHELL ["/bin/ash", "-eo", "pipefail", "-c"] |
|||
|
|||
RUN curl -L $URL | tar xz |
|||
RUN ls |
|||
|
|||
########################## BUILD IMAGE ########################## |
|||
# We need to use the Rust build image, because |
|||
# we need the Rust compiler and Cargo tooling |
|||
FROM rust:1.36 as build |
|||
|
|||
# set mysql backend |
|||
ARG DB=postgresql |
|||
|
|||
# Using bundled SQLite, no need to install it |
|||
# RUN apt-get update && apt-get install -y\ |
|||
# --no-install-recommends \ |
|||
# sqlite3\ |
|||
# && rm -rf /var/lib/apt/lists/* |
|||
|
|||
# Install MySQL package |
|||
RUN apt-get update && apt-get install -y \ |
|||
--no-install-recommends \ |
|||
libpq-dev \ |
|||
&& rm -rf /var/lib/apt/lists/* |
|||
|
|||
# Creates a dummy project used to grab dependencies |
|||
RUN USER=root cargo new --bin app |
|||
WORKDIR /app |
|||
|
|||
# Copies over *only* your manifests and build files |
|||
COPY ./Cargo.* ./ |
|||
COPY ./rust-toolchain ./rust-toolchain |
|||
COPY ./build.rs ./build.rs |
|||
|
|||
# Builds your dependencies and removes the |
|||
# dummy project, except the target folder |
|||
# This folder contains the compiled dependencies |
|||
RUN cargo build --features ${DB} --release |
|||
RUN find . -not -path "./target*" -delete |
|||
|
|||
# Copies the complete project |
|||
# To avoid copying unneeded files, use .dockerignore |
|||
COPY . . |
|||
|
|||
# Make sure that we actually build the project |
|||
RUN touch src/main.rs |
|||
|
|||
# Builds again, this time it'll just be |
|||
# your actual source files being built |
|||
RUN cargo build --features ${DB} --release |
|||
|
|||
######################## RUNTIME IMAGE ######################## |
|||
# Create a new stage with a minimal image |
|||
# because we already have a binary built |
|||
FROM debian:stretch-slim |
|||
|
|||
ENV ROCKET_ENV "staging" |
|||
ENV ROCKET_PORT=80 |
|||
ENV ROCKET_WORKERS=10 |
|||
|
|||
# Install needed libraries |
|||
RUN apt-get update && apt-get install -y \ |
|||
--no-install-recommends \ |
|||
openssl \ |
|||
ca-certificates \ |
|||
curl \ |
|||
libpq5 \ |
|||
&& rm -rf /var/lib/apt/lists/* |
|||
|
|||
RUN mkdir /data |
|||
VOLUME /data |
|||
EXPOSE 80 |
|||
EXPOSE 3012 |
|||
|
|||
# Copies the files from the context (Rocket.toml file and web-vault) |
|||
# and the binary from the "build" stage to the current stage |
|||
COPY Rocket.toml . |
|||
COPY --from=vault /web-vault ./web-vault |
|||
COPY --from=build app/target/release/bitwarden_rs . |
|||
|
|||
COPY docker/healthcheck.sh ./healthcheck.sh |
|||
|
|||
HEALTHCHECK --interval=30s --timeout=3s CMD sh healthcheck.sh || exit 1 |
|||
|
|||
# Configures the startup! |
|||
CMD ["./bitwarden_rs"] |
@ -0,0 +1,85 @@ |
|||
# Using multistage build: |
|||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|||
####################### VAULT BUILD IMAGE ####################### |
|||
FROM alpine:3.10 as vault |
|||
|
|||
ENV VAULT_VERSION "v2.12.0" |
|||
|
|||
ENV URL "https://github.com/dani-garcia/bw_web_builds/releases/download/$VAULT_VERSION/bw_web_$VAULT_VERSION.tar.gz" |
|||
|
|||
RUN apk add --no-cache --upgrade \ |
|||
curl \ |
|||
tar |
|||
|
|||
RUN mkdir /web-vault |
|||
WORKDIR /web-vault |
|||
|
|||
SHELL ["/bin/ash", "-eo", "pipefail", "-c"] |
|||
|
|||
RUN curl -L $URL | tar xz |
|||
RUN ls |
|||
|
|||
########################## BUILD IMAGE ########################## |
|||
# Musl build image for statically compiled binary |
|||
FROM clux/muslrust:nightly-2019-07-08 as build |
|||
|
|||
# set mysql backend |
|||
ARG DB=postgresql |
|||
|
|||
ENV USER "root" |
|||
|
|||
# Install needed libraries |
|||
RUN apt-get update && apt-get install -y \ |
|||
--no-install-recommends \ |
|||
libpq-dev \ |
|||
&& rm -rf /var/lib/apt/lists/* |
|||
|
|||
WORKDIR /app |
|||
|
|||
# Copies the complete project |
|||
# To avoid copying unneeded files, use .dockerignore |
|||
COPY . . |
|||
|
|||
RUN rustup target add x86_64-unknown-linux-musl |
|||
|
|||
# Make sure that we actually build the project |
|||
RUN touch src/main.rs |
|||
|
|||
# Build |
|||
RUN cargo build --features ${DB} --release |
|||
|
|||
######################## RUNTIME IMAGE ######################## |
|||
# Create a new stage with a minimal image |
|||
# because we already have a binary built |
|||
FROM alpine:3.10 |
|||
|
|||
ENV ROCKET_ENV "staging" |
|||
ENV ROCKET_PORT=80 |
|||
ENV ROCKET_WORKERS=10 |
|||
ENV SSL_CERT_DIR=/etc/ssl/certs |
|||
|
|||
# Install needed libraries |
|||
RUN apk add --no-cache \ |
|||
openssl \ |
|||
postgresql-libs \ |
|||
curl \ |
|||
ca-certificates |
|||
|
|||
RUN mkdir /data |
|||
VOLUME /data |
|||
EXPOSE 80 |
|||
EXPOSE 3012 |
|||
|
|||
# Copies the files from the context (Rocket.toml file and web-vault) |
|||
# and the binary from the "build" stage to the current stage |
|||
COPY Rocket.toml . |
|||
COPY --from=vault /web-vault ./web-vault |
|||
COPY --from=build /app/target/x86_64-unknown-linux-musl/release/bitwarden_rs . |
|||
|
|||
COPY docker/healthcheck.sh ./healthcheck.sh |
|||
|
|||
HEALTHCHECK --interval=30s --timeout=3s CMD sh healthcheck.sh || exit 1 |
|||
|
|||
# Configures the startup! |
|||
CMD ["./bitwarden_rs"] |
@ -0,0 +1,13 @@ |
|||
DROP TABLE devices; |
|||
DROP TABLE attachments; |
|||
DROP TABLE users_collections; |
|||
DROP TABLE users_organizations; |
|||
DROP TABLE folders_ciphers; |
|||
DROP TABLE ciphers_collections; |
|||
DROP TABLE twofactor; |
|||
DROP TABLE invitations; |
|||
DROP TABLE collections; |
|||
DROP TABLE folders; |
|||
DROP TABLE ciphers; |
|||
DROP TABLE users; |
|||
DROP TABLE organizations; |
@ -0,0 +1,121 @@ |
|||
CREATE TABLE users ( |
|||
uuid CHAR(36) NOT NULL PRIMARY KEY, |
|||
created_at TIMESTAMP NOT NULL, |
|||
updated_at TIMESTAMP NOT NULL, |
|||
email VARCHAR(255) NOT NULL UNIQUE, |
|||
name TEXT NOT NULL, |
|||
password_hash BYTEA NOT NULL, |
|||
salt BYTEA NOT NULL, |
|||
password_iterations INTEGER NOT NULL, |
|||
password_hint TEXT, |
|||
akey TEXT NOT NULL, |
|||
private_key TEXT, |
|||
public_key TEXT, |
|||
totp_secret TEXT, |
|||
totp_recover TEXT, |
|||
security_stamp TEXT NOT NULL, |
|||
equivalent_domains TEXT NOT NULL, |
|||
excluded_globals TEXT NOT NULL, |
|||
client_kdf_type INTEGER NOT NULL DEFAULT 0, |
|||
client_kdf_iter INTEGER NOT NULL DEFAULT 100000 |
|||
); |
|||
|
|||
CREATE TABLE devices ( |
|||
uuid CHAR(36) NOT NULL PRIMARY KEY, |
|||
created_at TIMESTAMP NOT NULL, |
|||
updated_at TIMESTAMP NOT NULL, |
|||
user_uuid CHAR(36) NOT NULL REFERENCES users (uuid), |
|||
name TEXT NOT NULL, |
|||
atype INTEGER NOT NULL, |
|||
push_token TEXT, |
|||
refresh_token TEXT NOT NULL, |
|||
twofactor_remember TEXT |
|||
); |
|||
|
|||
CREATE TABLE organizations ( |
|||
uuid VARCHAR(40) NOT NULL PRIMARY KEY, |
|||
name TEXT NOT NULL, |
|||
billing_email TEXT NOT NULL |
|||
); |
|||
|
|||
CREATE TABLE ciphers ( |
|||
uuid CHAR(36) NOT NULL PRIMARY KEY, |
|||
created_at TIMESTAMP NOT NULL, |
|||
updated_at TIMESTAMP NOT NULL, |
|||
user_uuid CHAR(36) REFERENCES users (uuid), |
|||
organization_uuid CHAR(36) REFERENCES organizations (uuid), |
|||
atype INTEGER NOT NULL, |
|||
name TEXT NOT NULL, |
|||
notes TEXT, |
|||
fields TEXT, |
|||
data TEXT NOT NULL, |
|||
favorite BOOLEAN NOT NULL, |
|||
password_history TEXT |
|||
); |
|||
|
|||
CREATE TABLE attachments ( |
|||
id CHAR(36) NOT NULL PRIMARY KEY, |
|||
cipher_uuid CHAR(36) NOT NULL REFERENCES ciphers (uuid), |
|||
file_name TEXT NOT NULL, |
|||
file_size INTEGER NOT NULL, |
|||
akey TEXT |
|||
); |
|||
|
|||
CREATE TABLE folders ( |
|||
uuid CHAR(36) NOT NULL PRIMARY KEY, |
|||
created_at TIMESTAMP NOT NULL, |
|||
updated_at TIMESTAMP NOT NULL, |
|||
user_uuid CHAR(36) NOT NULL REFERENCES users (uuid), |
|||
name TEXT NOT NULL |
|||
); |
|||
|
|||
CREATE TABLE collections ( |
|||
uuid VARCHAR(40) NOT NULL PRIMARY KEY, |
|||
org_uuid VARCHAR(40) NOT NULL REFERENCES organizations (uuid), |
|||
name TEXT NOT NULL |
|||
); |
|||
|
|||
CREATE TABLE users_collections ( |
|||
user_uuid CHAR(36) NOT NULL REFERENCES users (uuid), |
|||
collection_uuid CHAR(36) NOT NULL REFERENCES collections (uuid), |
|||
read_only BOOLEAN NOT NULL DEFAULT false, |
|||
PRIMARY KEY (user_uuid, collection_uuid) |
|||
); |
|||
|
|||
CREATE TABLE users_organizations ( |
|||
uuid CHAR(36) NOT NULL PRIMARY KEY, |
|||
user_uuid CHAR(36) NOT NULL REFERENCES users (uuid), |
|||
org_uuid CHAR(36) NOT NULL REFERENCES organizations (uuid), |
|||
|
|||
access_all BOOLEAN NOT NULL, |
|||
akey TEXT NOT NULL, |
|||
status INTEGER NOT NULL, |
|||
atype INTEGER NOT NULL, |
|||
|
|||
UNIQUE (user_uuid, org_uuid) |
|||
); |
|||
|
|||
CREATE TABLE folders_ciphers ( |
|||
cipher_uuid CHAR(36) NOT NULL REFERENCES ciphers (uuid), |
|||
folder_uuid CHAR(36) NOT NULL REFERENCES folders (uuid), |
|||
PRIMARY KEY (cipher_uuid, folder_uuid) |
|||
); |
|||
|
|||
CREATE TABLE ciphers_collections ( |
|||
cipher_uuid CHAR(36) NOT NULL REFERENCES ciphers (uuid), |
|||
collection_uuid CHAR(36) NOT NULL REFERENCES collections (uuid), |
|||
PRIMARY KEY (cipher_uuid, collection_uuid) |
|||
); |
|||
|
|||
CREATE TABLE twofactor ( |
|||
uuid CHAR(36) NOT NULL PRIMARY KEY, |
|||
user_uuid CHAR(36) NOT NULL REFERENCES users (uuid), |
|||
atype INTEGER NOT NULL, |
|||
enabled BOOLEAN NOT NULL, |
|||
data TEXT NOT NULL, |
|||
UNIQUE (user_uuid, atype) |
|||
); |
|||
|
|||
CREATE TABLE invitations ( |
|||
email VARCHAR(255) NOT NULL PRIMARY KEY |
|||
); |
@ -0,0 +1,172 @@ |
|||
table! { |
|||
attachments (id) { |
|||
id -> Text, |
|||
cipher_uuid -> Text, |
|||
file_name -> Text, |
|||
file_size -> Integer, |
|||
akey -> Nullable<Text>, |
|||
} |
|||
} |
|||
|
|||
table! { |
|||
ciphers (uuid) { |
|||
uuid -> Text, |
|||
created_at -> Timestamp, |
|||
updated_at -> Timestamp, |
|||
user_uuid -> Nullable<Text>, |
|||
organization_uuid -> Nullable<Text>, |
|||
atype -> Integer, |
|||
name -> Text, |
|||
notes -> Nullable<Text>, |
|||
fields -> Nullable<Text>, |
|||
data -> Text, |
|||
favorite -> Bool, |
|||
password_history -> Nullable<Text>, |
|||
} |
|||
} |
|||
|
|||
table! { |
|||
ciphers_collections (cipher_uuid, collection_uuid) { |
|||
cipher_uuid -> Text, |
|||
collection_uuid -> Text, |
|||
} |
|||
} |
|||
|
|||
table! { |
|||
collections (uuid) { |
|||
uuid -> Text, |
|||
org_uuid -> Text, |
|||
name -> Text, |
|||
} |
|||
} |
|||
|
|||
table! { |
|||
devices (uuid) { |
|||
uuid -> Text, |
|||
created_at -> Timestamp, |
|||
updated_at -> Timestamp, |
|||
user_uuid -> Text, |
|||
name -> Text, |
|||
atype -> Integer, |
|||
push_token -> Nullable<Text>, |
|||
refresh_token -> Text, |
|||
twofactor_remember -> Nullable<Text>, |
|||
} |
|||
} |
|||
|
|||
table! { |
|||
folders (uuid) { |
|||
uuid -> Text, |
|||
created_at -> Timestamp, |
|||
updated_at -> Timestamp, |
|||
user_uuid -> Text, |
|||
name -> Text, |
|||
} |
|||
} |
|||
|
|||
table! { |
|||
folders_ciphers (cipher_uuid, folder_uuid) { |
|||
cipher_uuid -> Text, |
|||
folder_uuid -> Text, |
|||
} |
|||
} |
|||
|
|||
table! { |
|||
invitations (email) { |
|||
email -> Text, |
|||
} |
|||
} |
|||
|
|||
table! { |
|||
organizations (uuid) { |
|||
uuid -> Text, |
|||
name -> Text, |
|||
billing_email -> Text, |
|||
} |
|||
} |
|||
|
|||
table! { |
|||
twofactor (uuid) { |
|||
uuid -> Text, |
|||
user_uuid -> Text, |
|||
atype -> Integer, |
|||
enabled -> Bool, |
|||
data -> Text, |
|||
} |
|||
} |
|||
|
|||
table! { |
|||
users (uuid) { |
|||
uuid -> Text, |
|||
created_at -> Timestamp, |
|||
updated_at -> Timestamp, |
|||
email -> Text, |
|||
name -> Text, |
|||
password_hash -> Binary, |
|||
salt -> Binary, |
|||
password_iterations -> Integer, |
|||
password_hint -> Nullable<Text>, |
|||
akey -> Text, |
|||
private_key -> Nullable<Text>, |
|||
public_key -> Nullable<Text>, |
|||
totp_secret -> Nullable<Text>, |
|||
totp_recover -> Nullable<Text>, |
|||
security_stamp -> Text, |
|||
equivalent_domains -> Text, |
|||
excluded_globals -> Text, |
|||
client_kdf_type -> Integer, |
|||
client_kdf_iter -> Integer, |
|||
} |
|||
} |
|||
|
|||
table! { |
|||
users_collections (user_uuid, collection_uuid) { |
|||
user_uuid -> Text, |
|||
collection_uuid -> Text, |
|||
read_only -> Bool, |
|||
} |
|||
} |
|||
|
|||
table! { |
|||
users_organizations (uuid) { |
|||
uuid -> Text, |
|||
user_uuid -> Text, |
|||
org_uuid -> Text, |
|||
access_all -> Bool, |
|||
akey -> Text, |
|||
status -> Integer, |
|||
atype -> Integer, |
|||
} |
|||
} |
|||
|
|||
joinable!(attachments -> ciphers (cipher_uuid)); |
|||
joinable!(ciphers -> organizations (organization_uuid)); |
|||
joinable!(ciphers -> users (user_uuid)); |
|||
joinable!(ciphers_collections -> ciphers (cipher_uuid)); |
|||
joinable!(ciphers_collections -> collections (collection_uuid)); |
|||
joinable!(collections -> organizations (org_uuid)); |
|||
joinable!(devices -> users (user_uuid)); |
|||
joinable!(folders -> users (user_uuid)); |
|||
joinable!(folders_ciphers -> ciphers (cipher_uuid)); |
|||
joinable!(folders_ciphers -> folders (folder_uuid)); |
|||
joinable!(twofactor -> users (user_uuid)); |
|||
joinable!(users_collections -> collections (collection_uuid)); |
|||
joinable!(users_collections -> users (user_uuid)); |
|||
joinable!(users_organizations -> organizations (org_uuid)); |
|||
joinable!(users_organizations -> users (user_uuid)); |
|||
|
|||
allow_tables_to_appear_in_same_query!( |
|||
attachments, |
|||
ciphers, |
|||
ciphers_collections, |
|||
collections, |
|||
devices, |
|||
folders, |
|||
folders_ciphers, |
|||
invitations, |
|||
organizations, |
|||
twofactor, |
|||
users, |
|||
users_collections, |
|||
users_organizations, |
|||
); |
Loading…
Reference in new issue