diff --git a/.drone.yml b/.drone.yml index b113e6b..5b3601b 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,58 +1,27 @@ --- kind: pipeline -type: exec +type: docker name: default -environment: - DOCKER_CLI_EXPERIMENTAL: enabled - -platform: - os: linux - arch: amd64 +volumes: + - name: docker_socket + host: + path: /var/run/docker.sock steps: - - name: build + - name: build + image: alexviscreanu/buildx commands: - - |- - case $(uname -a) in - *x86_64*) - export ARCH="amd64" - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - ;; - *aarch64*) - export ARCH="arm64" - ;; - *) - export ARCH="unknown" - ;; - esac - - |- - export BUILDX_URL=$(\ - wget -q -O - https://api.github.com/repos/docker/buildx/releases/latest\ - | grep "browser_download_url.*linux-$ARCH"\ - | cut -d: -f2,3\ - | tr -d \"\ - | tr -d \ \ - ) - - mkdir -p ~/.docker/cli-plugins - - wget -O ~/.docker/cli-plugins/docker-buildx $BUILDX_URL - - chmod a+x ~/.docker/cli-plugins/docker-buildx - - docker version - - docker buildx version - - |- - echo -n $REGISTRY_PASS\ - | docker login -u $REGISTRY_USER --password-stdin $REGISTRY_HOST - - docker buildx create --name multiarch --use - - |- - docker buildx build\ - --no-cache\ - --platform linux/amd64,linux/arm64\ - --output type=image,push=true\ - --progress tty\ - --build-arg TAG=$DRONE_TAG\ - -t $REGISTRY_HOST/$IMAGE:$DRONE_TAG\ - -t $REGISTRY_HOST/$IMAGE:latest\ - . + - docker run --rm --privileged docker/binfmt:a7996909642ee92942dcd6cff44b9b95f08dad64 + - export BUILDER_ID="crosscomp-$(cat /proc/self/cgroup | head -1 | cut -d '/' -f 3)" + - docker buildx create --use --name $BUILDER_ID --driver-opt image=stargate01/buildkit + - docker buildx inspect --bootstrap + - echo $REGISTRY_PASS | docker login --username $REGISTRY_USER --password-stdin $REGISTRY_HOST + - docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --output=type=image,push=true --progress tty --build-arg TAG=$DRONE_TAG -t $REGISTRY_HOST/$IMAGE:$DRONE_TAG -t $REGISTRY_HOST/$IMAGE:latest . + - docker buildx rm $BUILDER_ID + volumes: + - name: docker_socket + path: /var/run/docker.sock environment: IMAGE: protonmail-bridge REGISTRY_HOST: registry.thegibsonhome.net @@ -63,4 +32,4 @@ steps: trigger: event: - - tag + - tag \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 50d0f0c..17eaea5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,55 +1,36 @@ # Build the ProtonMail Bridge. -FROM golang:1.18-buster as build +FROM golang:1.14-alpine as build ENV LANG C.UTF-8 - -# Install required build packages -RUN apt-get update \ - && apt-get install -y \ - bash \ - build-essential \ - curl \ +RUN apk add --no-cache \ + gcc \ git \ - libsecret-1-dev \ + libsecret-dev \ + make \ musl-dev - -# Download/build the application WORKDIR /usr/src -ARG RELEASE + ARG TAG -RUN if [ -n "$RELEASE" ]; then \ - echo "Using release $RELEASE..." \ - && curl -L -s "https://github.com/ProtonMail/proton-bridge/archive/$RELEASE.tar.gz" | tar zx \ - && export PROTON_BRIDGE="proton-bridge-$(echo $RELEASE | sed -e 's/^\(v\|br\)//')" \ - && ln -s "${PROTON_BRIDGE}" proton-bridge \ - && cd "${PROTON_BRIDGE}" \ - ; else \ - git clone https://github.com/ProtonMail/proton-bridge.git proton-bridge \ - && cd proton-bridge \ - && if [ -n "$TAG" ]; then echo "Using tags/$TAG..."; git checkout tags/$TAG; fi \ - ; fi \ - && make build-nogui +RUN git clone https://github.com/ProtonMail/proton-bridge.git proton-bridge \ + && cd proton-bridge \ + && if [ -n "$TAG" ]; then echo "Using tags/$TAG..."; git checkout tags/$TAG; fi \ + && make build-nogui # Create a container for the ProtonMail Bridge. -FROM debian:stable +FROM alpine:edge ENV LANG C.UTF-8 EXPOSE 25/tcp EXPOSE 143/tcp -COPY --from=build /usr/src/proton-bridge/proton-bridge /bin/proton-bridge -COPY --from=build /usr/src/proton-bridge/bridge /bin/bridge +COPY --from=build /usr/src/proton-bridge/Desktop-Bridge /bin/protonmail-bridge COPY entrypoint /bin/ COPY initproton /bin/ -RUN apt-get update\ - && apt-get install -y --no-install-recommends --no-install-suggests\ - libcap2\ - libsecret-1-0\ - gosu\ - gpg-agent\ - pass\ - socat\ - && rm -rf /var/lib/apt/lists/*\ - && chmod +x /bin/entrypoint\ +RUN apk add --no-cache \ + libsecret \ + pass \ + socat \ + su-exec \ + && chmod +x /bin/entrypoint \ && chmod +x /bin/initproton WORKDIR /var/lib/proton diff --git a/entrypoint b/entrypoint index 884d393..9fdd252 100755 --- a/entrypoint +++ b/entrypoint @@ -5,16 +5,8 @@ USER_ID=${PUID:-9001} GROUP_ID=${PGID:-$USER_ID} echo "Starting with UID : $USER_ID:$GROUP_ID" -GROUP=proton -if getent group $GROUP_ID > /dev/null; then - echo "Using group $GROUP with GID $GROUP_ID..." - GROUP=$(getent group $GROUP_ID | cut -d: -f1) -else - echo "Adding group $GROUP with GID $GROUP_ID..." - addgroup -g $GROUP_ID $GROUP -fi -echo "Adding user proton ($USER_ID) with group $GROUP ${GROUP_ID}..." -adduser -D -u $USER_ID -G $GROUP -h /var/lib/proton -s /bin/sh proton +addgroup -g $GROUP_ID proton +adduser -D -u $USER_ID -G proton -h /var/lib/proton -s /bin/bash proton chown -R ${USER_ID}:${GROUP_ID} /var/lib/proton export HOME=/var/lib/proton @@ -25,5 +17,4 @@ setcap 'cap_net_bind_service=+ep' /usr/bin/socat socat TCP-LISTEN:25,fork TCP:127.0.0.1:1025 & socat TCP-LISTEN:143,fork TCP:127.0.0.1:1143 & -echo "Starting ProtonMail Bridge..." -exec /usr/sbin/gosu proton "$@" +exec /sbin/su-exec proton "$@" \ No newline at end of file diff --git a/initproton b/initproton index 703ebe6..71b4103 100755 --- a/initproton +++ b/initproton @@ -1,49 +1,38 @@ -#!/bin/bash +#!/bin/bash set -eufo pipefail -BRIDGE=/bin/bridge +BRIDGE=/bin/protonmail-bridge FIFO=/tmp/fifo PRINT_INFO=${PRINT_INFO:-""} #### INIT PASS_FILE=${PASS_FILE:-} if [ -n "$PASS_FILE" ]; then + echo "Using PASS file." PASS=$(cat $PASS_FILE) fi -echo "Checking for GPG configuration..." -if ! [ -d .gnupg ]; then - echo "Generating GPG Key..." - echo -e "%no-protection\nKey-Type: RSA\nKey-Length: 4096\nName-Real: $EMAIL\nExpire-Date: 0\n%commit" \ +if ! [ -f ./initialized ]; then + echo -e "%no-protection\nKey-Type: RSA\nKey-Length: 2048\nName-Real: $EMAIL\nExpire-Date: 0\n%commit" \ | gpg --generate-key --batch -fi -echo "Checking for Password Store..." -if ! [ -d .password-store ]; then - echo "Initializing Pass..." - pass init "$EMAIL" -fi -echo "Checking for ProtonMail Bridge Cache..." -if ! [ -d ~/.cache/protonmail/bridge ]; then - echo "Logging in to ProtonMail Bridge..." + pass init pass-key COMMAND="login\n$EMAIL\n$PASSWORD" - MFA_CODE=${MFA_CODE:-} - if [ -n "$MFA_CODE" ]; then + RUN_2FA_LOGIN=${RUN_2FA_LOGIN:-} + if [ -n "$RUN_2FA_LOGIN" ]; then + echo "Using MFA code." COMMAND="$COMMAND\n$MFA_CODE" fi + echo "Executing COMMAND: $COMMAND" echo -e "$COMMAND" | $BRIDGE --cli + touch ./initialized fi if [ -n "$PRINT_INFO" ]; then - echo "Printing Info..." echo info | $BRIDGE --cli | egrep '(Username|Password)' | sort -ru fi -ARGUMENTS="--noninteractive" -LOG_LEVEL=${LOG_LEVEL:-} -if [ -n "$LOG_LEVEL" ]; then - ARGUMENTS="${ARGUMENTS} --log-level ${LOG_LEVEL}" +# Fake a terminal, so it does not quit because of EOF... +if [ ! -e "$FIFO" ]; then + mkfifo $FIFO fi - -echo "Starting ProtonMail Bridge: $BRIDGE $ARGUMENTS" -$BRIDGE --version -$BRIDGE $ARGUMENTS +cat $FIFO | $BRIDGE --cli \ No newline at end of file