2021-08-03 00:26:17 +02:00
|
|
|
ARG BUILDPLATFORM=linux/amd64
|
|
|
|
ARG TARGETPLATFORM
|
2023-04-15 21:20:29 +02:00
|
|
|
ARG ALPINE_VERSION=3.17
|
2023-03-25 00:20:39 +01:00
|
|
|
ARG PHP_VERSION=8.1-alpine${ALPINE_VERSION}
|
2022-07-22 16:28:11 +02:00
|
|
|
ARG COMPOSER_VERSION=2.3
|
2021-08-02 17:27:21 +02:00
|
|
|
ARG SUPERVISORD_VERSION=v0.7.3
|
2021-07-29 23:44:30 +02:00
|
|
|
|
2022-03-09 13:04:58 +01:00
|
|
|
ARG UID=1000
|
|
|
|
ARG GID=1000
|
|
|
|
|
2021-08-03 00:26:17 +02:00
|
|
|
FROM --platform=${BUILDPLATFORM} composer:${COMPOSER_VERSION} AS build-composer
|
2021-07-29 23:44:30 +02:00
|
|
|
FROM composer:${COMPOSER_VERSION} AS composer
|
2021-08-02 17:27:21 +02:00
|
|
|
FROM qmcgaw/binpot:supervisord-${SUPERVISORD_VERSION} AS supervisord
|
2021-07-29 23:44:30 +02:00
|
|
|
|
2021-08-03 03:14:54 +02:00
|
|
|
FROM --platform=${BUILDPLATFORM} php:${PHP_VERSION} AS vendor
|
2022-03-09 13:04:58 +01:00
|
|
|
ARG UID=1000
|
|
|
|
ARG GID=1000
|
2021-08-04 16:16:39 +02:00
|
|
|
COPY --from=build-composer --chown=${UID}:${GID} /usr/bin/composer /usr/bin/composer
|
2021-08-04 17:03:28 +02:00
|
|
|
RUN apk add --no-cache unzip
|
2022-05-09 23:50:36 +02:00
|
|
|
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
|
|
|
|
RUN chmod +x /usr/local/bin/install-php-extensions && \
|
|
|
|
install-php-extensions gd bcmath
|
2021-08-03 00:18:18 +02:00
|
|
|
WORKDIR /srv
|
2022-07-25 14:51:44 +02:00
|
|
|
COPY artisan composer.json composer.lock ./
|
2021-08-03 00:18:18 +02:00
|
|
|
COPY database ./database
|
|
|
|
RUN composer install --prefer-dist --no-scripts --no-dev --no-autoloader
|
2021-08-04 17:03:28 +02:00
|
|
|
RUN composer dump-autoload --no-scripts --no-dev --optimize
|
2021-08-03 00:18:18 +02:00
|
|
|
|
2021-08-03 03:25:42 +02:00
|
|
|
FROM --platform=${BUILDPLATFORM} vendor AS test
|
|
|
|
COPY . .
|
2022-05-10 01:13:54 +02:00
|
|
|
RUN mv .env.testing .env
|
2021-08-03 03:25:42 +02:00
|
|
|
RUN composer install
|
|
|
|
RUN php artisan key:generate
|
|
|
|
ENTRYPOINT [ "/srv/vendor/bin/phpunit" ]
|
|
|
|
|
2021-08-04 17:03:28 +02:00
|
|
|
FROM alpine:${ALPINE_VERSION}
|
2021-08-04 16:16:39 +02:00
|
|
|
ARG UID=1000
|
|
|
|
ARG GID=1000
|
|
|
|
|
2021-07-31 19:30:37 +02:00
|
|
|
# Composer 2
|
2021-08-04 16:16:39 +02:00
|
|
|
COPY --from=composer --chown=${UID}:${GID} /usr/bin/composer /usr/bin/composer
|
2021-08-02 17:27:21 +02:00
|
|
|
# Supervisord from https://github.com/ochinchina/supervisord
|
2021-08-04 16:16:39 +02:00
|
|
|
COPY --from=supervisord --chown=${UID}:${GID} /bin /usr/local/bin/supervisord
|
2021-07-31 19:30:37 +02:00
|
|
|
|
2021-07-29 23:44:30 +02:00
|
|
|
# Install PHP and PHP system dependencies
|
2021-08-04 17:03:28 +02:00
|
|
|
RUN apk add --update --no-cache \
|
2021-07-31 19:30:37 +02:00
|
|
|
# PHP
|
2023-04-15 10:19:58 +02:00
|
|
|
php81 \
|
2021-08-04 17:03:28 +02:00
|
|
|
# Composer dependencies
|
2023-04-15 10:19:58 +02:00
|
|
|
php81-phar \
|
2023-06-03 18:10:09 +02:00
|
|
|
# PHP SQLite & MySQL/MariaDB drivers
|
|
|
|
php81-pdo_sqlite php81-sqlite3 php81-pdo_mysql \
|
2021-07-31 19:30:37 +02:00
|
|
|
# PHP extensions
|
2023-04-15 10:19:58 +02:00
|
|
|
php81-xml php81-gd php81-mbstring php81-tokenizer php81-fileinfo php81-bcmath php81-ctype php81-dom \
|
2021-08-04 17:03:28 +02:00
|
|
|
# Runtime dependencies
|
2023-04-15 10:19:58 +02:00
|
|
|
php81-session php81-openssl \
|
2021-08-02 17:27:21 +02:00
|
|
|
# Nginx and PHP FPM to serve over HTTP
|
2023-04-15 10:19:58 +02:00
|
|
|
php81-fpm nginx
|
2021-07-29 23:44:30 +02:00
|
|
|
|
2021-07-31 19:30:37 +02:00
|
|
|
# PHP FPM configuration
|
2021-08-04 16:16:39 +02:00
|
|
|
# Change username and ownership in php-fpm pool config
|
2023-04-15 10:33:54 +02:00
|
|
|
RUN sed -i '/user = nobody/d' /etc/php81/php-fpm.d/www.conf && \
|
|
|
|
sed -i '/group = nobody/d' /etc/php81/php-fpm.d/www.conf && \
|
|
|
|
sed -i '/listen.owner/d' /etc/php81/php-fpm.d/www.conf && \
|
|
|
|
sed -i '/listen.group/d' /etc/php81/php-fpm.d/www.conf
|
2021-07-30 00:26:58 +02:00
|
|
|
# Pre-create files with the correct permissions
|
2021-07-29 23:44:30 +02:00
|
|
|
RUN mkdir /run/php && \
|
2023-04-15 10:33:54 +02:00
|
|
|
chown ${UID}:${GID} /run/php /var/log/php81 && \
|
|
|
|
chmod 700 /run/php /var/log/php81
|
2021-07-29 23:44:30 +02:00
|
|
|
|
2022-05-20 14:37:28 +02:00
|
|
|
# NGINX
|
|
|
|
# Clean up
|
|
|
|
RUN rm /etc/nginx/nginx.conf && \
|
|
|
|
chown -R ${UID}:${GID} /var/lib/nginx
|
|
|
|
# configuration
|
2021-07-29 23:44:30 +02:00
|
|
|
EXPOSE 8000/tcp
|
2021-08-04 17:03:28 +02:00
|
|
|
RUN touch /run/nginx/nginx.pid /var/lib/nginx/logs/error.log && \
|
|
|
|
chown ${UID}:${GID} /run/nginx/nginx.pid /var/lib/nginx/logs/error.log
|
2021-08-04 16:16:39 +02:00
|
|
|
COPY --chown=${UID}:${GID} docker/nginx.conf /etc/nginx/nginx.conf
|
2021-08-02 16:40:10 +02:00
|
|
|
RUN nginx -t
|
2021-07-29 23:44:30 +02:00
|
|
|
|
2021-08-02 17:27:21 +02:00
|
|
|
# Supervisord configuration
|
2021-08-04 16:16:39 +02:00
|
|
|
COPY --chown=${UID}:${GID} docker/supervisord.conf /etc/supervisor/supervisord.conf
|
2021-08-02 17:27:21 +02:00
|
|
|
|
2021-07-29 23:44:30 +02:00
|
|
|
# Create end user directory
|
|
|
|
RUN mkdir -p /2fauth && \
|
2021-08-04 16:16:39 +02:00
|
|
|
chown -R ${UID}:${GID} /2fauth && \
|
2021-07-29 23:44:30 +02:00
|
|
|
chmod 700 /2fauth
|
|
|
|
|
|
|
|
# Create /srv internal directory
|
|
|
|
WORKDIR /srv
|
2021-08-04 16:16:39 +02:00
|
|
|
RUN chown -R ${UID}:${GID} /srv && \
|
2021-07-29 23:44:30 +02:00
|
|
|
chmod 700 /srv
|
|
|
|
|
|
|
|
# Run without root
|
2021-08-04 16:16:39 +02:00
|
|
|
USER ${UID}:${GID}
|
2021-07-29 23:44:30 +02:00
|
|
|
|
|
|
|
# Dependencies
|
2021-08-04 16:16:39 +02:00
|
|
|
COPY --from=vendor --chown=${UID}:${GID} /srv/vendor /srv/vendor
|
2021-07-29 23:44:30 +02:00
|
|
|
|
|
|
|
# Copy the rest of the code
|
2021-08-04 16:16:39 +02:00
|
|
|
COPY --chown=${UID}:${GID} . .
|
2021-08-04 17:03:28 +02:00
|
|
|
# RUN composer dump-autoload --no-scripts --no-dev --optimize
|
2021-07-29 23:44:30 +02:00
|
|
|
|
|
|
|
# Entrypoint
|
2021-07-29 23:51:16 +02:00
|
|
|
ENTRYPOINT [ "/usr/local/bin/entrypoint.sh" ]
|
2021-08-04 16:16:39 +02:00
|
|
|
COPY --chown=${UID}:${GID} docker/entrypoint.sh /usr/local/bin/entrypoint.sh
|
2021-07-31 16:50:32 +02:00
|
|
|
RUN chmod 500 /usr/local/bin/entrypoint.sh
|
2021-07-29 23:44:30 +02:00
|
|
|
|
|
|
|
ENV \
|
2022-03-31 09:36:12 +02:00
|
|
|
# You can change the name of the app
|
|
|
|
APP_NAME=2FAuth \
|
|
|
|
# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation.
|
|
|
|
# Never set it to "testing".
|
|
|
|
APP_ENV=local \
|
|
|
|
# Set to true if you want to see debug information in error screens.
|
|
|
|
APP_DEBUG=false \
|
|
|
|
# This should be your email address
|
|
|
|
SITE_OWNER=mail@example.com \
|
|
|
|
# The encryption key for our database and sessions. Keep this very secure.
|
|
|
|
# If you generate a new one all existing data must be considered LOST.
|
|
|
|
# Change it to a string of exactly 32 chars or use command `php artisan key:generate` to generate it
|
|
|
|
APP_KEY=SomeRandomStringOf32CharsExactly \
|
2023-08-25 13:49:52 +02:00
|
|
|
# This variable must match your installation's external address.
|
|
|
|
# Webauthn won't work otherwise.
|
2022-03-31 09:36:12 +02:00
|
|
|
APP_URL=http://localhost \
|
|
|
|
# Turn this to true if you want your app to react like a demo.
|
|
|
|
# The Demo mode reset the app content every hours and set a generic demo user.
|
|
|
|
IS_DEMO_APP=false \
|
|
|
|
# The log channel defines where your log entries go to.
|
|
|
|
# 'daily' is the default logging mode giving you 5 daily rotated log files in /storage/logs/.
|
|
|
|
# Several other options exist. You can use 'single' for one big fat error log (not recommended).
|
|
|
|
# Also available are 'syslog', 'errorlog' and 'stdout' which will log to the system itself.
|
|
|
|
LOG_CHANNEL=daily \
|
|
|
|
# Log level. You can set this from least severe to most severe:
|
|
|
|
# debug, info, notice, warning, error, critical, alert, emergency
|
|
|
|
# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably
|
|
|
|
# nothing will get logged, ever.
|
2022-07-21 15:44:58 +02:00
|
|
|
LOG_LEVEL=notice \
|
2022-03-31 09:36:12 +02:00
|
|
|
# Database config & credentials
|
|
|
|
# DB_CONNECTION can only be sqlite
|
|
|
|
DB_CONNECTION=sqlite \
|
|
|
|
DB_DATABASE="/srv/database/database.sqlite" \
|
|
|
|
# If you're looking for performance improvements, you could install memcached.
|
|
|
|
CACHE_DRIVER=file \
|
|
|
|
SESSION_DRIVER=file \
|
|
|
|
# Mail settings
|
|
|
|
# Refer your email provider documentation to configure your mail settings
|
|
|
|
# Set a value for every available setting to avoid issue
|
|
|
|
MAIL_DRIVER=log \
|
|
|
|
MAIL_HOST=smtp.mailtrap.io \
|
|
|
|
MAIL_PORT=2525 \
|
|
|
|
MAIL_FROM=changeme@example.com \
|
|
|
|
MAIL_USERNAME=null \
|
|
|
|
MAIL_PASSWORD=null \
|
|
|
|
MAIL_ENCRYPTION=null \
|
|
|
|
MAIL_FROM_NAME=null \
|
|
|
|
MAIL_FROM_ADDRESS=null \
|
2023-03-16 15:57:22 +01:00
|
|
|
# API settings
|
|
|
|
# The maximum number of API calls in a minute from the same IP.
|
|
|
|
# Once reached, all requests from this IP will be rejected until the minute has elapsed.
|
|
|
|
# Set to null to disable the API throttling.
|
|
|
|
THROTTLE_API=60 \
|
2022-03-31 09:36:12 +02:00
|
|
|
# Authentication settings
|
2023-03-16 15:57:22 +01:00
|
|
|
# The number of times per minute a user can fail to log in before being locked out.
|
|
|
|
# Once reached, all login attempts will be rejected until the minute has elapsed.
|
|
|
|
# This setting applies to both email/password and webauthn login attemps.
|
|
|
|
LOGIN_THROTTLE=5 \
|
2022-03-31 09:36:12 +02:00
|
|
|
# The default authentication guard
|
|
|
|
# Supported:
|
|
|
|
# 'web-guard' : The Laravel built-in auth system (default if nulled)
|
|
|
|
# 'reverse-proxy-guard' : When 2FAuth is deployed behind a reverse-proxy that handle authentication
|
|
|
|
# WARNING
|
|
|
|
# When using 'reverse-proxy-guard' 2FAuth only look for the dedicated headers and skip all other built-in
|
|
|
|
# authentication checks. That means your proxy is fully responsible of the authentication process, 2FAuth will
|
|
|
|
# trust him as long as headers are presents.
|
2022-05-10 12:52:05 +02:00
|
|
|
AUTHENTICATION_GUARD=web-guard \
|
2022-03-31 09:36:12 +02:00
|
|
|
# Name of the HTTP headers sent by the reverse proxy that identifies the authenticated user at proxy level.
|
|
|
|
# Check your proxy documentation to find out how these headers are named (i.e 'REMOTE_USER', 'REMOTE_EMAIL', etc...)
|
|
|
|
# (only relevant when AUTHENTICATION_GUARD is set to 'reverse-proxy-guard')
|
2022-05-10 12:52:05 +02:00
|
|
|
AUTH_PROXY_HEADER_FOR_USER=null \
|
|
|
|
AUTH_PROXY_HEADER_FOR_EMAIL=null \
|
2022-05-17 00:16:59 +02:00
|
|
|
# Custom logout URL to open when using an auth proxy.
|
|
|
|
PROXY_LOGOUT_URL=null \
|
2022-03-31 09:36:12 +02:00
|
|
|
# WebAuthn settings
|
|
|
|
# Relying Party name, aka the name of the application. If null, defaults to APP_NAME
|
2022-05-10 12:52:05 +02:00
|
|
|
WEBAUTHN_NAME=2FAuth \
|
2022-03-31 09:36:12 +02:00
|
|
|
# Relying Party ID. If null, the device will fill it internally.
|
2023-08-25 13:49:52 +02:00
|
|
|
# See https://webauthn-doc.spomky-labs.com/prerequisites/the-relying-party#how-to-determine-the-relying-party-id
|
2022-05-10 15:34:51 +02:00
|
|
|
WEBAUTHN_ID=null \
|
2022-03-31 09:36:12 +02:00
|
|
|
# Optional image data in BASE64 (128 bytes maximum) or an image url
|
2023-08-25 13:49:52 +02:00
|
|
|
# See https://webauthn-doc.spomky-labs.com/prerequisites/the-relying-party#relying-party-icon
|
2022-05-10 15:34:51 +02:00
|
|
|
WEBAUTHN_ICON=null \
|
2022-03-31 09:36:12 +02:00
|
|
|
# Use this setting to control how user verification behave during the
|
|
|
|
# WebAuthn authentication flow.
|
|
|
|
#
|
|
|
|
# Most authenticators and smartphones will ask the user to actively verify
|
|
|
|
# themselves for log in. For example, through a touch plus pin code,
|
|
|
|
# password entry, or biometric recognition (e.g., presenting a fingerprint).
|
|
|
|
# The intent is to distinguish one user from any other.
|
|
|
|
#
|
|
|
|
# Supported:
|
|
|
|
# 'required': Will ALWAYS ask for user verification
|
|
|
|
# 'preferred' (default) : Will ask for user verification IF POSSIBLE
|
|
|
|
# 'discouraged' : Will NOT ask for user verification (for example, to minimize disruption to the user interaction flow)
|
2022-05-10 12:52:05 +02:00
|
|
|
WEBAUTHN_USER_VERIFICATION=preferred \
|
2022-04-14 11:34:40 +02:00
|
|
|
# Use this setting to declare trusted proxied.
|
|
|
|
# Supported:
|
|
|
|
# '*': to trust any proxy
|
|
|
|
# A comma separated IP list: The list of proxies IP to trust
|
2022-05-10 15:34:51 +02:00
|
|
|
TRUSTED_PROXIES=null \
|
2022-03-31 09:36:12 +02:00
|
|
|
# Leave the following configuration vars as is.
|
|
|
|
# Unless you like to tinker and know what you're doing.
|
|
|
|
BROADCAST_DRIVER=log \
|
|
|
|
QUEUE_DRIVER=sync \
|
2022-07-18 14:30:09 +02:00
|
|
|
SESSION_LIFETIME=120 \
|
2022-03-31 09:36:12 +02:00
|
|
|
REDIS_HOST=127.0.0.1 \
|
|
|
|
REDIS_PASSWORD=null \
|
|
|
|
REDIS_PORT=6379 \
|
|
|
|
PUSHER_APP_ID= \
|
|
|
|
PUSHER_APP_KEY= \
|
|
|
|
PUSHER_APP_SECRET= \
|
|
|
|
PUSHER_APP_CLUSTER=mt1 \
|
|
|
|
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" \
|
|
|
|
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" \
|
|
|
|
MIX_ENV=local
|
2021-07-29 23:44:30 +02:00
|
|
|
|
2021-08-03 15:24:33 +02:00
|
|
|
ARG VERSION=unknown
|
|
|
|
ARG CREATED="an unknown date"
|
|
|
|
ARG COMMIT=unknown
|
2021-08-04 16:19:24 +02:00
|
|
|
ENV \
|
|
|
|
VERSION=${VERSION} \
|
|
|
|
CREATED=${CREATED} \
|
|
|
|
COMMIT=${COMMIT}
|
2021-08-03 15:24:33 +02:00
|
|
|
LABEL \
|
|
|
|
org.opencontainers.image.authors="https://github.com/Bubka" \
|
|
|
|
org.opencontainers.image.version=$VERSION \
|
|
|
|
org.opencontainers.image.created=$CREATED \
|
|
|
|
org.opencontainers.image.revision=$COMMIT \
|
|
|
|
org.opencontainers.image.url="https://github.com/Bubka/2FAuth" \
|
|
|
|
org.opencontainers.image.documentation="https://hub.docker.com/r/2fauth/2fauth" \
|
|
|
|
org.opencontainers.image.source="https://github.com/Bubka/2FAuth" \
|
|
|
|
org.opencontainers.image.title="2fauth" \
|
|
|
|
org.opencontainers.image.description="A web app to manage your Two-Factor Authentication (2FA) accounts and generate their security codes"
|