├── .github └── workflows │ └── deploy.yml ├── Dockerfile ├── LICENSE ├── README.md ├── agendav.conf ├── docker-compose.yml ├── pre-env.sh ├── run.sh └── settings.php /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: build and push image to ghcr 2 | 3 | on: 4 | push: 5 | tags: 6 | - '*' 7 | 8 | env: 9 | REGISTRY: ghcr.io 10 | IMAGE_NAME: ${{ github.repository }} 11 | 12 | jobs: 13 | 14 | docker-deploy: 15 | runs-on: ubuntu-latest 16 | permissions: 17 | contents: read 18 | packages: write 19 | 20 | steps: 21 | - name: checkout repo 22 | uses: actions/checkout@v3 23 | 24 | - name: Set up QEMU 25 | uses: docker/setup-qemu-action@v2 26 | 27 | - name: Set up Docker Buildx 28 | uses: docker/setup-buildx-action@v2 29 | 30 | - name: login to ${{ env.REGISTRY }} 31 | uses: docker/login-action@v2 32 | with: 33 | registry: ${{ env.REGISTRY }} 34 | username: ${{ github.actor }} 35 | password: ${{ secrets.GITHUB_TOKEN }} 36 | 37 | - name: extract docker metadata 38 | id: meta 39 | uses: docker/metadata-action@v4 40 | with: 41 | images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} 42 | 43 | - name: build and push 44 | uses: docker/build-push-action@v4 45 | with: 46 | context: . 47 | push: true 48 | tags: ${{ steps.meta.outputs.tags }} 49 | platforms: linux/amd64,linux/arm64 50 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ARG PHP_VERSION=8.2 2 | 3 | FROM debian:bullseye-slim as downloader 4 | 5 | ENV AGENDAV_VERSION 2.6.0 6 | 7 | ADD https://github.com/agendav/agendav/releases/download/$AGENDAV_VERSION/agendav-$AGENDAV_VERSION.tar.gz /tmp/ 8 | 9 | RUN cd /tmp && \ 10 | tar -xf agendav-$AGENDAV_VERSION.tar.gz -C /tmp && \ 11 | mv /tmp/agendav-$AGENDAV_VERSION /tmp/agendav 12 | 13 | 14 | FROM php:${PHP_VERSION}-apache-bullseye 15 | 16 | MAINTAINER Ruslan Nagimov 17 | 18 | ENV APACHE_RUN_USER=www-data 19 | ENV APACHE_RUN_GROUP=www-data 20 | ENV APACHE_LOG_DIR=/var/log/apache2 21 | ENV APACHE_LOCK_DIR=/var/lock/apache2 22 | ENV APACHE_PID_FILE=/var/run/apache2/apache2.pid 23 | ENV TERM=xterm 24 | ENV AGENDAV_TIMEZONE=UTC 25 | ENV PHP_INI_DIR /usr/local/etc/php 26 | 27 | ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/ 28 | 29 | RUN apt-get update && \ 30 | apt-get install -y apt-transport-https \ 31 | ca-certificates && \ 32 | chmod +x /usr/local/bin/install-php-extensions && \ 33 | install-php-extensions mbstring xml pdo_sqlite && \ 34 | rm /usr/local/bin/install-php-extensions && \ 35 | apt-get clean && \ 36 | rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 37 | 38 | COPY --from=downloader --chown=www-data:www-data /tmp/agendav /var/www/agendav 39 | 40 | COPY agendav.conf /etc/apache2/sites-available/agendav.conf 41 | COPY settings.php /var/www/agendav/web/config/settings.php 42 | COPY run.sh /usr/local/bin/run.sh 43 | COPY pre-env.sh /tmp/pre-env.sh 44 | 45 | ADD https://curl.se/ca/cacert.pem /etc/ssl/certs/ 46 | 47 | RUN chmod +x /tmp/pre-env.sh && \ 48 | chmod 644 /etc/ssl/certs/cacert.pem && \ 49 | chown -R www-data:www-data ${PHP_INI_DIR} && \ 50 | chown -R www-data:www-data /var/run/apache2 && \ 51 | chmod 755 ${APACHE_LOG_DIR} && \ 52 | chown -R www-data:www-data ${APACHE_LOG_DIR} && \ 53 | cp ${PHP_INI_DIR}/php.ini-production ${PHP_INI_DIR}/php.ini && \ 54 | echo 'date.timezone = "AGENDAV_TIMEZONE"' >> ${PHP_INI_DIR}/php.ini && \ 55 | echo 'magic_quotes_runtime = false' >> ${PHP_INI_DIR}/php.ini && \ 56 | echo 'openssl.cafile = "/etc/ssl/certs/cacert.pem"' >> ${PHP_INI_DIR}/php.ini && \ 57 | echo 'curl.cainfo = "/etc/ssl/certs/cacert.pem"' >> ${PHP_INI_DIR}/php.ini && \ 58 | /bin/bash /tmp/pre-env.sh && \ 59 | rm /tmp/pre-env.sh && \ 60 | cd /var/www/agendav && \ 61 | mkdir -p /var/agendav && \ 62 | touch /var/agendav/db.sqlite && \ 63 | chown -R www-data:www-data /var/agendav && \ 64 | chmod 640 /var/agendav/db.sqlite && \ 65 | yes | php agendavcli migrations:migrate && \ 66 | chmod +x /usr/local/bin/run.sh && \ 67 | a2ensite agendav.conf && \ 68 | a2dissite 000-default && \ 69 | a2enmod rewrite && \ 70 | echo "Listen 127.0.0.1:8080" > /etc/apache2/ports.conf && \ 71 | service apache2 restart && \ 72 | service apache2 stop && \ 73 | echo "Listen 8080" > /etc/apache2/ports.conf 74 | 75 | RUN ln -sf /dev/stdout ${APACHE_LOG_DIR}/access.log \ 76 | && ln -sf /dev/stderr ${APACHE_LOG_DIR}/error.log \ 77 | && ln -sf /dev/stderr ${APACHE_LOG_DIR}/davi-error.log 78 | 79 | EXPOSE 8080 80 | 81 | USER www-data 82 | 83 | ENTRYPOINT ["/usr/local/bin/run.sh"] 84 | 85 | CMD ["apache2"] 86 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Ruslan Nagimov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # agendav-docker 2 | 3 | Docker image for [AgenDAV - CalDAV web client](https://github.com/agendav/agendav). AgenDAV requires a CalDAV server running alongside (Baïkal, DAViCal, etc.). The address of CalDAV server must be specified in `AGENDAV_CALDAV_SERVER` env, e.g. `AGENDAV_CALDAV_SERVER=https://baikal.server.com/cal.php` or `AGENDAV_CALDAV_SERVER=https://radicale.server.svc.com:5232/%u` 4 | 5 | **Note regarding use of Baïkal back-end**: `WebDAV authentication type` must be set to `Basic` during Baïkal initialization. 6 | 7 | Since this image only carries a front-end for CalDAV, there's no provision for persistency. Running agendav statelessly has no drawbacks since agendav itself is not customizable. 8 | 9 | Standard `php:apache` base image is used. The build is not optimized for size or compilation time. 10 | 11 | ## Supported tags 12 | 13 | See [packages](https://ghcr.io/nagimov/agendav-docker) 14 | 15 | ## Environment Variables 16 | 17 | Note: **all environment variables are mandatory** and must be set via [`docker-compose.yml`](https://github.com/nagimov/agendav-docker/blob/master/docker-compose.yml) or via `-e` option of `docker run ...` 18 | 19 | | Environment Variable | Example | 20 | | --------------------------- | ------------------------------------- | 21 | | `AGENDAV_SERVER_NAME` | `127.0.0.1` | 22 | | `AGENDAV_TITLE` | `"Welcome to Example Agendav Server"` | 23 | | `AGENDAV_FOOTER` | `"Hosted by Example Company"` | 24 | | `AGENDAV_CALDAV_SERVER` | `https://baikal.example.com/cal.php` | 25 | | `AGENDAV_CALDAV_PUBLIC_URL` | `https://baikal.example.com` | 26 | | [`AGENDAV_TIMEZONE`][phptz] | `America/Denver`, `Europe/Berlin` | 27 | | `AGENDAV_WEEKSTART` | `0` (Sunday) or `1` (Monday) | 28 | | `AGENDAV_LANG` | `en` | 29 | | `AGENDAV_LOG_DIR` | `/tmp/` | 30 | 31 | ## Deployment 32 | 33 | - use provided [`docker-compose.yml`](https://github.com/nagimov/agendav-docker/blob/master/docker-compose.yml) and deploy via `docker-compose up` 34 | - or deploy via `docker run`: 35 | ``` 36 | docker pull ghcr.io/nagimov/agendav-docker:latest 37 | docker run -d --name=agendav \ 38 | -p 80:8080 \ 39 | -e AGENDAV_SERVER_NAME=127.0.0.1 \ 40 | -e AGENDAV_TITLE="Welcome to Example Agendav Server" \ 41 | -e AGENDAV_FOOTER="Hosted by Example Company" \ 42 | -e AGENDAV_CALDAV_SERVER=https://baikal.example.com/cal.php \ 43 | -e AGENDAV_CALDAV_PUBLIC_URL=https://baikal.example.com \ 44 | -e AGENDAV_TIMEZONE=UTC \ 45 | -e AGENDAV_LANG=en \ 46 | -e AGENDAV_LOG_DIR=/tmp/ \ 47 | ghcr.io/nagimov/agendav-docker:latest 48 | ``` 49 | 50 | [phptz]: https://www.php.net/manual/en/timezones.php 51 | -------------------------------------------------------------------------------- /agendav.conf: -------------------------------------------------------------------------------- 1 | 2 | DocumentRoot /var/www/agendav/web/public 3 | ServerName ${AGENDAV_SERVER_NAME} 4 | ErrorLog ${APACHE_LOG_DIR}/davi-error.log 5 | LogLevel warn 6 | CustomLog ${APACHE_LOG_DIR}/access.log combined 7 | 8 | RewriteEngine On 9 | RewriteCond %{REQUEST_FILENAME} !-f 10 | RewriteRule ^ index.php [QSA,L] 11 | 12 | 13 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "2" 2 | 3 | services: 4 | agendav: 5 | image: ghcr.io/nagimov/agendav-docker:latest 6 | container_name: agendav 7 | environment: 8 | - AGENDAV_SERVER_NAME=127.0.0.1 9 | - AGENDAV_TITLE=Welcome to Example Agendav Server 10 | - AGENDAV_FOOTER=Hosted by Example Company 11 | - AGENDAV_CALDAV_SERVER=https://baikal.example.com/cal.php 12 | - AGENDAV_CALDAV_PUBLIC_URL=https://baikal.example.com 13 | - AGENDAV_TIMEZONE=UTC 14 | - AGENDAV_LANG=en 15 | - AGENDAV_LOG_DIR=/tmp/ 16 | - AGENDAV_WEEKSTART=1 17 | ports: 18 | - "80:8080" 19 | -------------------------------------------------------------------------------- /pre-env.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | CONFIG_FILE="/var/www/agendav/web/config/settings.php" 4 | sed -i -e "s/AGENDAV_DB_NAME/$( echo "${AGENDAV_DB_NAME}" | sed -e 's/[\/}]/\\&/g')/" ${CONFIG_FILE} 5 | sed -i -e "s/AGENDAV_DB_USER/$( echo "${AGENDAV_DB_USER}" | sed -e 's/[\/}]/\\&/g')/" ${CONFIG_FILE} 6 | sed -i -e "s/AGENDAV_DB_PASSWORD/$( echo "${AGENDAV_DB_PASSWORD}" | sed -e 's/[\/}]/\\&/g')/" ${CONFIG_FILE} 7 | sed -i -e "s/AGENDAV_TIMEZONE/$( echo "${AGENDAV_TIMEZONE}" | sed -e 's/[\/}]/\\&/g')/" ${CONFIG_FILE} 8 | sed -i -e "s/AGENDAV_WEEKSTART/$( echo "${AGENDAV_WEEKSTART}" | sed -e 's/[\/}]/\\&/g')/" ${CONFIG_FILE} 9 | CONFIG_FILE="${PHP_INI_DIR}/php.ini" 10 | sed -i -e "s/AGENDAV_TIMEZONE/$( echo "${AGENDAV_TIMEZONE}" | sed -e 's/[\/}]/\\&/g')/" ${CONFIG_FILE} 11 | -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | CONFIG_FILE="/var/www/agendav/web/config/settings.php" 4 | sed -i -e "s/AGENDAV_TITLE/$( echo "${AGENDAV_TITLE}" | sed -e 's/[\/}]/\\&/g')/" ${CONFIG_FILE} 5 | sed -i -e "s/AGENDAV_FOOTER/$( echo "${AGENDAV_FOOTER}" | sed -e 's/[\/}]/\\&/g')/" ${CONFIG_FILE} 6 | sed -i -e "s/AGENDAV_CALDAV_SERVER/$( echo "${AGENDAV_CALDAV_SERVER}" | sed -e 's/[\/}]/\\&/g')/" ${CONFIG_FILE} 7 | sed -i -e "s/AGENDAV_CALDAV_PUBLIC_URL/$( echo "${AGENDAV_CALDAV_PUBLIC_URL:-$AGENDAV_CALDAV_SERVER}" | sed -e 's/[\/}]/\\&/g')/" ${CONFIG_FILE} 8 | sed -i -e "s/UTC/$( echo "${AGENDAV_TIMEZONE}" | sed -e 's/[\/}]/\\&/g')/" ${CONFIG_FILE} 9 | sed -i -e "s/AGENDAV_LANG/$( echo "${AGENDAV_LANG}" | sed -e 's/[\/}]/\\&/g')/" ${CONFIG_FILE} 10 | sed -i -e "s/AGENDAV_LOG_DIR/$( echo "${AGENDAV_LOG_DIR}" | sed -e 's/[\/}]/\\&/g')/" ${CONFIG_FILE} 11 | sed -i -e "s/AGENDAV_WEEKSTART/$( echo "${AGENDAV_WEEKSTART}" | sed -e 's/[\/}]/\\&/g')/" ${CONFIG_FILE} 12 | CONFIG_FILE="${PHP_INI_DIR}/php.ini" 13 | sed -i -e "s/UTC/$( echo "${AGENDAV_TIMEZONE}" | sed -e 's/[\/}]/\\&/g')/" ${CONFIG_FILE} 14 | 15 | if [ "x$1" = 'xapache2' ]; then 16 | echo "Start webserver" 17 | exec /usr/sbin/apache2ctl -D FOREGROUND 18 | else 19 | exec "$@" 20 | fi 21 | -------------------------------------------------------------------------------- /settings.php: -------------------------------------------------------------------------------- 1 | '/var/agendav/db.sqlite', 13 | 'driver' => 'pdo_sqlite', 14 | ]; 15 | // Log path 16 | $app['log.path'] = 'AGENDAV_LOG_DIR'; 17 | // Base URL 18 | $app['caldav.baseurl'] = 'AGENDAV_CALDAV_SERVER'; 19 | // Authentication method required by CalDAV server (basic or digest) 20 | $app['caldav.authmethod'] = 'basic'; 21 | // Whether to show public CalDAV urls 22 | $app['caldav.publicurls'] = true; 23 | // Whether to show public CalDAV urls 24 | $app['caldav.baseurl.public'] = 'AGENDAV_CALDAV_PUBLIC_URL'; 25 | // Default timezone 26 | $app['defaults.timezone'] = 'AGENDAV_TIMEZONE'; 27 | // Default languajge 28 | $app['defaults.language'] = 'AGENDAV_LANG'; 29 | // Default time format. Options: '12' / '24' 30 | $app['defaults.time.format'] = '24'; 31 | /* 32 | * Default date format. Options: 33 | * 34 | * - ymd: YYYY-mm-dd 35 | * - dmy: dd-mm-YYYY 36 | * - mdy: mm-dd-YYYY 37 | */ 38 | $app['defaults.date_format'] = 'ymd'; 39 | // Default first day of week. Options: 0 (Sunday), 1 (Monday) 40 | $app['defaults.weekstart'] = 'AGENDAV_WEEKSTART'; 41 | // Logout redirection. Optional 42 | $app['logout.redirection'] = ''; 43 | // Calendar sharing 44 | $app['calendar.sharing'] = true; 45 | --------------------------------------------------------------------------------