├── 1 ├── apache │ ├── Dockerfile │ └── docker-entrypoint.sh └── fpm │ ├── Dockerfile │ └── docker-entrypoint.sh ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── README.md └── compose.yml /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | # This is a basic workflow to help you get started with Actions 2 | 3 | name: CI 4 | 5 | # Controls when the workflow will run 6 | on: 7 | # Triggers the workflow on push or pull request events but only for the main branch 8 | push: 9 | branches: [ master ] 10 | pull_request: 11 | branches: [ master ] 12 | 13 | # Allows you to run this workflow manually from the Actions tab 14 | workflow_dispatch: 15 | 16 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 17 | jobs: 18 | # This workflow contains a single job called "build" 19 | test: 20 | # The type of runner that the job will run on 21 | runs-on: ubuntu-latest 22 | 23 | # Steps represent a sequence of tasks that will be executed as part of the job 24 | steps: 25 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 26 | - uses: actions/checkout@v2 27 | 28 | # Runs a single command using the runners shell 29 | - name: Build Apache 30 | run: docker build 1/apache 31 | 32 | # Runs a set of commands using the runners shell 33 | - name: Build FPM 34 | run: docker build 1/fpm 35 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .*.swp 2 | backdrop.tar.gz 3 | *.backup -------------------------------------------------------------------------------- /1/apache/Dockerfile: -------------------------------------------------------------------------------- 1 | # from https://backdropcms.org/requirements 2 | FROM php:8.3-apache 3 | 4 | RUN a2enmod rewrite 5 | 6 | # install the PHP extensions we need 7 | RUN apt-get update && apt-get install -y --no-install-recommends libzip-dev libonig-dev libpng-dev libjpeg-dev libpq-dev \ 8 | && rm -rf /var/lib/apt/lists/* \ 9 | && docker-php-ext-configure gd --with-jpeg=/usr \ 10 | && docker-php-ext-install gd mbstring pdo pdo_mysql pdo_pgsql zip 11 | 12 | WORKDIR /var/www/html 13 | 14 | # https://github.com/backdrop/backdrop/releases 15 | ENV BACKDROP_VERSION=1.31.0 16 | ENV BACKDROP_MD5=0204d479a71ac692039a9f7b1e50409f 17 | 18 | RUN curl -fSL "https://github.com/backdrop/backdrop/archive/refs/tags/${BACKDROP_VERSION}.tar.gz" -o backdrop.tar.gz \ 19 | && echo "${BACKDROP_MD5} *backdrop.tar.gz" | md5sum -c - \ 20 | && tar -xz --strip-components=1 -f backdrop.tar.gz \ 21 | && rm backdrop.tar.gz \ 22 | && chown -R www-data:www-data sites files 23 | 24 | # Add custom entrypoint to set BACKDROP_SETTINGS correctly 25 | COPY docker-entrypoint.sh /entrypoint.sh 26 | 27 | ENTRYPOINT ["/entrypoint.sh"] 28 | CMD ["apache2-foreground"] 29 | -------------------------------------------------------------------------------- /1/apache/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [[ "$1" == apache2* ]] || [ "$1" == php-fpm ]; then 5 | if [ -n "$MYSQL_PORT_3306_TCP" ]; then 6 | if [ -z "$BACKDROP_DB_HOST" ]; then 7 | BACKDROP_DB_HOST='mysql' 8 | else 9 | echo >&2 'warning: both BACKDROP_DB_HOST and MYSQL_PORT_3306_TCP found' 10 | echo >&2 " Connecting to BACKDROP_DB_HOST ($BACKDROP_DB_HOST)" 11 | echo >&2 ' instead of the linked mysql container' 12 | fi 13 | fi 14 | 15 | if [ -z "$BACKDROP_DB_HOST" ]; then 16 | echo >&2 'error: missing BACKDROP_DB_HOST and MYSQL_PORT_3306_ADDR environment variables' 17 | echo >&2 ' Did you forget to --link some_mysql_container:mysql or set an external db' 18 | echo >&2 ' with -e BACKDROP_DB_HOST=hostname?' 19 | exit 1 20 | fi 21 | 22 | # if we're linked to MySQL and thus have credentials already, let's use them 23 | : ${BACKDROP_DB_USER:=${MYSQL_ENV_MYSQL_USER:-root}} 24 | if [ "$BACKDROP_DB_USER" = 'root' ]; then 25 | : ${BACKDROP_DB_PASSWORD:=$MYSQL_ENV_MYSQL_ROOT_PASSWORD} 26 | fi 27 | 28 | : ${BACKDROP_DB_PASSWORD:=$MYSQL_ENV_MYSQL_PASSWORD} 29 | : ${BACKDROP_DB_NAME:=${MYSQL_ENV_MYSQL_DATABASE:-backdrop}} 30 | : ${BACKDROP_DB_PORT:=${MYSQL_ENV_MYSQL_PORT:-3306}} 31 | : ${BACKDROP_DB_DRIVER:=${MYSQL_ENV_MYSQL_DRIVER:-mysql}} 32 | 33 | if [ -z "$BACKDROP_DB_PASSWORD" ]; then 34 | echo >&2 'error: missing required BACKDROP_DB_PASSWORD environment variable' 35 | echo >&2 ' Did you forget to -e BACKDROP_DB_PASSWORD=... ?' 36 | echo >&2 37 | echo >&2 ' (Also of interest might be BACKDROP_DB_USER and BACKDROP_DB_NAME.)' 38 | exit 1 39 | fi 40 | 41 | # lets construct our BACKDROP_SETTINGS and pass them into apache or fpm 42 | export BACKDROP_SETTINGS="{\"databases\":{\"default\":{\"default\":{\"host\":\"$BACKDROP_DB_HOST\",\"port\":$BACKDROP_DB_PORT,\"username\":\"$BACKDROP_DB_USER\",\"password\":\"$BACKDROP_DB_PASSWORD\",\"database\":\"$BACKDROP_DB_NAME\",\"driver\":\"$BACKDROP_DB_DRIVER\"}}}}" 43 | if [[ "$1" == apache2* ]]; then 44 | echo "PassEnv BACKDROP_SETTINGS" > /etc/apache2/conf-enabled/backdrop.conf 45 | elif [[ "$1" == php-fpm* ]]; then 46 | POOL_ENV_LINE="env['BACKDROP_SETTINGS'] = $BACKDROP_SETTINGS" 47 | POOL_FILE=/usr/local/etc/php-fpm.d/www.conf 48 | grep -q "$POOL_ENV_LINE" "$POOL_FILE" || echo "$POOL_ENV_LINE" >> "$POOL_FILE" 49 | fi 50 | 51 | fi 52 | 53 | exec "$@" 54 | -------------------------------------------------------------------------------- /1/fpm/Dockerfile: -------------------------------------------------------------------------------- 1 | # from https://backdropcms.org/requirements 2 | FROM php:8.3-fpm 3 | 4 | # install the PHP extensions we need 5 | RUN apt-get update && apt-get install -y libzip-dev libonig-dev libpng-dev libjpeg-dev libpq-dev \ 6 | && rm -rf /var/lib/apt/lists/* \ 7 | && docker-php-ext-configure gd --with-jpeg=/usr \ 8 | && docker-php-ext-install gd mbstring pdo pdo_mysql pdo_pgsql zip 9 | 10 | WORKDIR /var/www/html 11 | 12 | # https://github.com/backdrop/backdrop/releases 13 | ENV BACKDROP_VERSION=1.31.0 14 | ENV BACKDROP_MD5=0204d479a71ac692039a9f7b1e50409f 15 | 16 | RUN curl -fSL "https://github.com/backdrop/backdrop/archive/${BACKDROP_VERSION}.tar.gz" -o backdrop.tar.gz \ 17 | && echo "${BACKDROP_MD5} *backdrop.tar.gz" | md5sum -c - \ 18 | && tar -xz --strip-components=1 -f backdrop.tar.gz \ 19 | && rm backdrop.tar.gz \ 20 | && chown -R www-data:www-data sites files 21 | 22 | # Add custom entrypoint to set BACKDROP_SETTINGS correctly 23 | COPY docker-entrypoint.sh /entrypoint.sh 24 | 25 | ENTRYPOINT ["/entrypoint.sh"] 26 | CMD ["php-fpm"] 27 | -------------------------------------------------------------------------------- /1/fpm/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | if [[ "$1" == apache2* ]] || [ "$1" == php-fpm ]; then 5 | if [ -n "$MYSQL_PORT_3306_TCP" ]; then 6 | if [ -z "$BACKDROP_DB_HOST" ]; then 7 | BACKDROP_DB_HOST='mysql' 8 | else 9 | echo >&2 'warning: both BACKDROP_DB_HOST and MYSQL_PORT_3306_TCP found' 10 | echo >&2 " Connecting to BACKDROP_DB_HOST ($BACKDROP_DB_HOST)" 11 | echo >&2 ' instead of the linked mysql container' 12 | fi 13 | fi 14 | 15 | if [ -z "$BACKDROP_DB_HOST" ]; then 16 | echo >&2 'error: missing BACKDROP_DB_HOST and MYSQL_PORT_3306_ADDR environment variables' 17 | echo >&2 ' Did you forget to --link some_mysql_container:mysql or set an external db' 18 | echo >&2 ' with -e BACKDROP_DB_HOST=hostname?' 19 | exit 1 20 | fi 21 | 22 | # if we're linked to MySQL and thus have credentials already, let's use them 23 | : ${BACKDROP_DB_USER:=${MYSQL_ENV_MYSQL_USER:-root}} 24 | if [ "$BACKDROP_DB_USER" = 'root' ]; then 25 | : ${BACKDROP_DB_PASSWORD:=$MYSQL_ENV_MYSQL_ROOT_PASSWORD} 26 | fi 27 | 28 | : ${BACKDROP_DB_PASSWORD:=$MYSQL_ENV_MYSQL_PASSWORD} 29 | : ${BACKDROP_DB_NAME:=${MYSQL_ENV_MYSQL_DATABASE:-backdrop}} 30 | : ${BACKDROP_DB_PORT:=${MYSQL_ENV_MYSQL_PORT:-3306}} 31 | : ${BACKDROP_DB_DRIVER:=${MYSQL_ENV_MYSQL_DRIVER:-mysql}} 32 | 33 | if [ -z "$BACKDROP_DB_PASSWORD" ]; then 34 | echo >&2 'error: missing required BACKDROP_DB_PASSWORD environment variable' 35 | echo >&2 ' Did you forget to -e BACKDROP_DB_PASSWORD=... ?' 36 | echo >&2 37 | echo >&2 ' (Also of interest might be BACKDROP_DB_USER and BACKDROP_DB_NAME.)' 38 | exit 1 39 | fi 40 | 41 | # lets construct our BACKDROP_SETTINGS and pass them into apache or fpm 42 | export BACKDROP_SETTINGS="{\"databases\":{\"default\":{\"default\":{\"host\":\"$BACKDROP_DB_HOST\",\"port\":$BACKDROP_DB_PORT,\"username\":\"$BACKDROP_DB_USER\",\"password\":\"$BACKDROP_DB_PASSWORD\",\"database\":\"$BACKDROP_DB_NAME\",\"driver\":\"$BACKDROP_DB_DRIVER\"}}}}" 43 | if [[ "$1" == apache2* ]]; then 44 | echo "PassEnv BACKDROP_SETTINGS" > /etc/apache2/conf-enabled/backdrop.conf 45 | elif [[ "$1" == php-fpm* ]]; then 46 | POOL_ENV_LINE="env['BACKDROP_SETTINGS'] = $BACKDROP_SETTINGS" 47 | POOL_FILE=/usr/local/etc/php-fpm.d/www.conf 48 | grep -q "$POOL_ENV_LINE" "$POOL_FILE" || echo "$POOL_ENV_LINE" >> "$POOL_FILE" 49 | fi 50 | 51 | fi 52 | 53 | exec "$@" 54 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Table of Contents 2 | 3 | 1. [Supported tags and Dockerfile links](#supported-releases) 4 | 2. [Launch Backdrop using Docker](#launch-backdrop-using-docker) 5 | 3. [About Docker](#about-docker) 6 | 4. [About Backdrop](#about-backdrop) 7 | 8 | # Supported tags and Dockerfile links 9 | 10 | 11 | - [`1.31.0-apache`, `1.31.0`, `1-apache`, `1` (*1/apache/Dockerfile*)](https://github.com/kalabox/backdrop-docker/blob/master/1/apache/Dockerfile) 12 | - [`1.31.0-fpm`, `1-fpm` (*1/fpm/Dockerfile*)](https://github.com/kalabox/backdrop-docker/blob/master/1/fpm/Dockerfile) 13 | 14 | 15 | # Launch Backdrop using Docker 16 | 17 | > [!TIP] 18 | > You **do not need** to clone this repository in order to launch Backdrop using Docker. 19 | 20 | This section explains how to launch Backdrop CMS as a Docker container application. 21 | 22 | The process of "spinning up" Backdrop as a Docker container application involves: 23 | 24 | 1) Ensuring Docker is installed on the host machine 25 | 2) Creating a named directory to hold Docker configuration file(s) 26 | 3) Creating a new Docker startup file (usually called: a _Docker Compose_ file) referencing a Backdrop Docker Image 27 | 4) Launching Docker in such a way that it processes the new Docker startup file (using the command `docker compose`) 28 | 29 | ## Step 1: Ensure Docker is Installed on the Host Machine 30 | 31 | [Click here to see Docker's installation instructions for Windows, Mac and Linux](https://www.docker.com/get-started) 32 | 33 | The following example checks for the existence of Docker on a Linux host: 34 | 35 | ``` 36 | docker -v 37 | Docker version 27.4.1, build b9d17ea 38 | ``` 39 | 40 | ## Step 2: Create a Named Directory to Hold Docker Configuration File(s) 41 | 42 | The following example creates a directory named `backdrop-eval` for the purpose of holding Docker configuration file(s) on a Linux host (the folder is created inside of the current directory which could be the home of the logged-in user or another directory within it). 43 | 44 | ``` 45 | mkdir backdrop-eval 46 | cd backdrop-eval 47 | ``` 48 | 49 | ## Step 3: Create a New Docker Startup (i.e. _Docker compose_) File Referencing a Backdrop Docker Image 50 | 51 | Docker offers a way to launch docker images that need to work together as an application. Such files are called _Docker compose_ files and are usually used when more than one Docker image is needed by the application. In the case of Backdrop, it is not sufficient to run the Backdrop Docker image which contains an Apache PHP application. Additionally, a MySQL database server is also needed. Hence, to "spin up" the Backdrop application (which involves running these two images), a Docker compose file is conveniently used. 52 | 53 | This is the `compose.yml` file, which contains all the settings needed to help Docker set up ad run the two containers, in a manner that allows them to interoperate as an application. 54 | 55 | The following example `compose.yml` file (located in the named directory created in Step 2) will conveniently _orchestrate_ the launch of the Backdrop and the MySQL Docker images: 56 | 57 | ``` 58 | services: 59 | backdrop: 60 | image: backdrop:latest 61 | container_name: backdrop 62 | ports: 63 | - 8080:80 64 | environment: 65 | BACKDROP_DB_HOST: mysql 66 | BACKDROP_DB_USER: backdrop 67 | BACKDROP_DB_PASSWORD: backdrop 68 | 69 | mysql: 70 | image: mysql:latest 71 | container_name: mysql 72 | environment: 73 | MYSQL_USER: backdrop 74 | MYSQL_PASSWORD: backdrop 75 | MYSQL_DATABASE: backdrop 76 | MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' 77 | ``` 78 | 79 | > [!NOTE] 80 | > The Docker compose file above is a bare minimum for testing Backdrop locally. In the case of running Backdrop on a server using Docker, which is often described as "production", the file will likely need to be modified. The modifications involved are beyond the scope of this README file. 81 | 82 | ## Step 4: Launch docker in Such a Way That it Processes the New Docker Startup File 83 | 84 | While in the `docker-eval` directory, enter the following command: 85 | 86 | ``` 87 | docker compose up 88 | ``` 89 | 90 | This command instructs Docker to process the `compose.yml` startup file located in the same directory. 91 | 92 | The screen should immediately begin to fill with startup messages as docker processes the compose file and launches the service Docker images referenced within it. After a minute or so, the pace of new messages should settle down, with just status messages being displayed (which are preceded by `backdrop` or `mysql`, referring to the service from which the status message is being emitted). At this point, the Backdrop installation screen should be accessible via a web browser. 93 | 94 | ## Next Steps/Troubleshooting 95 | 96 | ### How to Access Backdrop in a Local Docker Container 97 | 98 | If the web browser is running on **the same machine** as Docker, the Backdrop installation screen should be accessible at http://localhost:8088 99 | 100 | ### How to Access Backdrop in a Remote Docker Container 101 | 102 | If the web browser is running on **a different machine** than the one running docker, Backdrop should be accessible at http://{host-ip}:8088 (where `{host-ip}` is the IP address of the machine running Docker). 103 | 104 | ### Backdrop Installation - Database Credentials 105 | 106 | Don't forget that the Backdrop install process requires the following database credentials to move onward: 107 | 108 | ``` 109 | User: backdrop 110 | Password: backdrop 111 | Database: backdrop 112 | ``` 113 | 114 | ### Validating Backdrop-Related Docker Containers 115 | 116 | Validating that Docker indeed constructed a valid runtime environment for Backdrop may be accomplished with the following command: 117 | 118 | ``` 119 | docker ps 120 | ``` 121 | 122 | The resulting listing should include two Docker containers: 123 | 124 | - One for the MySQL database server that Backdrop requires (mysql) 125 | - One for Backdrop itself (backdrop) 126 | 127 | ### How to Access the Backdrop host 128 | 129 | Accessing the Backdrop host can be accomplished by issuing the following command on the machine running Docker: 130 | 131 | ``` 132 | docker exec -it backdrop bash 133 | ``` 134 | 135 | This will result in creating a shell session _inside_ the container. To confirm this, try to browse the root of the filesystem and notice how it is different from your local root fileysytem: 136 | ``` 137 | ls / 138 | ``` 139 | 140 | ### Trying Out Other Docker Images 141 | 142 | The example `compose.yml` above specifically references the `backdrop` Docker image. 143 | 144 | This is just in order to get people new to Docker quickly and easily started. Once someone becomes more familiar with Docker and how it is used to "spin up" the Backdrop application, there is no reason why they wouldn't want to try other Backdrop Docker images on Docker Hub or specific versions of the same image (using the [available tags](https://hub.docker.com/_/backdrop/tags)). 145 | 146 | To accomplish that, the only thing that needs be done is change the image specifier in the `backdrop` section of the `compose.yml` file. The general format to identify a specific Docker image is: 147 | 148 | ``` 149 | services: 150 | backdrop: 151 | image: {repository}/{image}:{tag} 152 | ``` 153 | 154 | The image specifier is made up of the following parts: 155 | | Part | Mandatory? | Default Value | Description | 156 | |------|------------|---------------|-------------| 157 | | `{repository}` | No | `docker.io` | is the URL at which a Docker image repository is serving a catalogue/collection of Docker images. When omitted, this defaults to [Docker Hub](https://hub.docker.com/). | 158 | | `{image}` | Yes | - | is the name of the Docker image on the Docker repository. | 159 | | `{tag}` | No | `latest` | is a variation of the image. When omitted, it defaults to "latest" (also called [the default image](#what-is-a-default-docker-image)). | 160 | 161 | > [!NOTE] 162 | > Depending on which parts are stated and which ones are omitted, you can encounter one of a few image specifier forms such as `{repository}/{image}`, `{image}:{tag}`, `{image}`, or `{repository}/{tag}`. 163 | 164 | To view all the tags associated with the [official Backdrop image](#what-is-a-backdrop-docker-official-image) on Docker Hub, you can [click here](https://hub.docker.com/_/backdrop/tags). 165 | 166 | ### Building and Using Your Modified Backdrop Docker Image 167 | 168 | Instead of using an image specifier in the `image` field in `compose.yml`. It is possible to point to a local directory containining a [Dockerfile](#what-is-a-dockerfile), as follows: 169 | 170 | ``` 171 | services: 172 | backdrop: 173 | image: 174 | context: ./1/apache 175 | ``` 176 | 177 | In this case, the `docker compose` command would search the current folder (the folder in which the `compose.yml` file resides) for a subfolder named `1`, in which another subfolder `apache` exists, and look for a file called `Dockerfile` there (with a capitalized `D`). Inside of this file, are instructions on how to create a custom image using the [Dockerfile syntax](https://docs.docker.com/reference/dockerfile/). 178 | 179 | Example Dockerfiles for building Backdrop Docker images are found in this repository in the following locations: 180 | - [/1/apache/Dockerfile](./1/apache/Dockerfile): is a Dockerfile that can be used to build a Docker image that uses Apache as an underlying server. 181 | - [/1/fpm/Dockerfile](./1/fpm/Dockerfile): is a Dockerfile that can be used to build a Docker image that uses Nginx as an underlying server. 182 | 183 | > [!NOTE] 184 | > Similar versions using either Apache or Nginx also exist on Docker Hub (using the `apache` and `fpm` tags, specifically), so unless the current images on Docker Hub are broken or that you want to modify these images, there won't usually be a need for you to build your own images as explained here. 185 | 186 | # About Docker 187 | 188 | ![logo](https://raw.githubusercontent.com/docker-library/docs/c350af05d3fac7b5c3f6327ac82fe4d990d8729c/docker/logo.png) 189 | 190 | ## What is Docker? 191 | 192 | Docker started off as a way to create "portable" linux applications, ones that can run on any OS as long as it has a Linux kernel. 193 | 194 | A good way to start to understand Docker is by learning about `chroot` and how it allowed us to fool the application we are running under Linux into thinking that the current folder holds the entirety of the root filesystem. Docker was born out of the desire to offer complete isolation for the running process from the current OS, not only in storage (as `chroot` accomplished), but also in device/process/user/network spaces. This involved leveraging other features of the Linux kernel similar to `chroot` to achive all of these types of isolation. Today, Docker offers a way to run processes along with their depedencies, all packaged together and while only requiring a Linux kernel. 195 | 196 | _Functionally and practically speaking, Docker offers two main services:_ 197 | 198 | - Docker provides a way to **build and run** portable applications. A Docker image is the portable application's executable and a Docker container is the portable application's running instance. These two concepts are simply referred to as _images_ and _containers_ in Docker. 199 | 200 | - Docker provides a way to **orchestrate** the building and running of multiple images/containers in tandem. This feature has been traditionally packaged as a separate tool called `docker-compose` but is now included with Docker itself, which is invoked using the subcommand `docker compose` and relies on the [Docker Compose file](https://github.com/compose-spec/compose-spec) syntax. 201 | 202 | ## What is a Dockerfile? 203 | 204 | A Dockerfile is a human-redable build script for building Docker images. The image is built using the `docker build` or `docker buildx build` commands. There is no short name for a Dockerfile, they are simply referred to as a "Dockerfile". 205 | 206 | ## What is a Docker Image? 207 | 208 | A Docker Image (or simply an "image") is the result of a Docker build process. It can be uploaded to Docker Hub or other registries and shared with others this way. 209 | 210 | ## What is a Backdrop Docker Official Image? 211 | 212 | A Backdrop Docker Official Image is a Docker image that is understood to be issued and maintained by the people behind Backdrop iteself, rather than being developed by members of the community (since everyone can build and upload Docker images to Docker Hub). These images have been prepared by the Backdrop CMS Project Team in order to spread awareness about Backdrop CMS and to help people quickly and easily deploy Backdrop CMS for evaluation purposes. 213 | 214 | ### What is a Default Docker Image? 215 | 216 | The default Docker image is the one that is installed by default by Docker when an incomplete image specifier is supplied (i.e. omitting the "tag" part). This capability was mostly developed for convenience, but it can also be thought of as a "catchall" or "fallback" strategy. This is usually the image with the tag "latest". 217 | 218 | ### What Other Docker Images are There? 219 | 220 | Alternative to the default Docker image, Backdrop and other projects may offer tagged images for specific versions, or alternative configurations (for example, Backdrop offers two varieties of images depending on the underlying web server). 221 | 222 | [Click here to see a complete list of available Backdrop Official Docker Image tags](https://hub.docker.com/_/backdrop/tags) 223 | 224 | # About Backdrop 225 | ![logo](https://backdropcms.org/files/inline-images/Backdrop-Logo-Horizontal_0.png) 226 | 227 | ## What is Backdrop? 228 | 229 | _**TL;DR: Backdrop is an exciting and promising way forward for organizations seeking a means of leaving legacy Drupal behind in such a way that existing investments in Drupal-related time, energy, people and money are not wasted or abandoned.**_ 230 | 231 | Backdrop is a web application development framework frequenty deployed in the guise of a Content Management System (or "website") for use by: 232 | 233 | - Primary, Secondary and Tertiary Educational Institutions 234 | - National, Regional and Municipal Governments 235 | - Small & Medium Sized Enterprises 236 | - Non-Governmental Organizations 237 | - Non-Profit Organizations 238 | 239 | ## Guiding Principles 240 | Among the leading principles that guide the Backdrop ethos are compatibility, reliability, predictability and managed complexity. Other principles include humility, teamwork and dependability. 241 | 242 | ## History 243 | Backdrop started off as a "fork" of the immensely popular Drupal 7 Content Management System. The genesis of that event was the release of Drupal 8, which introduced an explosion of uncertainty, complexity and cost into the wider Drupal community. Every subsequent Drupal release, until recently, has a similar impact, leaving stakeholders confused and unhappy about what they should do with their Drpual-based websites as they rapidly devolved from "legacy" to "unsupported" status in the eyes of Drupal. 244 | 245 | ## Present Day Situation 246 | Many production Drupal websites are currently deployed on an "unsupported" version of Drupal (5, 6, 7, 8, 9). In fact, "unsupported" websites currently comprise the **majority** of present-day Drupal deployments, with Drupal 7 representing over a third of the total number. 247 | 248 | 249 | ## Compatibility 250 | The Backdrop principle of compatibility resulted in the creation of a "Drupal compatibility layer" in Backdrop very early in its evolution. This highly useful Backdrop feature has become a bit of a "secret weapon" because "unsuppoted" Drupal code needs only to be slighty altered to then be hosted in a fully supported version of Backdrop. This is especially the case for "unsupported" Drupal 7 code, as that was the base product from which Backdrop was derived. The selection of Drupal 7 as the basis for Backdrop was no accident. When Backdrop was launched, Drupal 7 was the latest and most popular version of Drupal, with the best-developed ecosystem of contributed modules and themes. Today, over a decade later, the Drupal 7 ecosystem is simply massive, with over 16,000 contributed modules and themes. This staggering amount of innovation has resulted from a distributed development model supported by thousands of dedicated and loyal developers, agencies and companies that relied on Drupal 7 on a daily basis. The result of ths collective effort is a body of work comprised of over 150,000 distinct pieces of freely available intellectual property that range across every conceivable organizational model and business problem...and all of them are available to Backdrop. 251 | 252 | ## Cost of Adoption 253 | Converting a Drupal website to Backdrop can take a fraction of the time and expense required to migrate to other CMS systems (Wordpress, Magento) or to move onto a cloud-based solution (WIX or Shopify). Most notably, a Drupal to Backdrop conversion is often faster and cheaper than a Drupal to Drupal upgrade - mostly due to how complicated more recent versions of Drupal have become. To date, hundreds of organizations have chosen Backdrop because they have concluded that Backdrop is the fastest, easiest and least expensive way for them to move forward. 254 | 255 | ## Track Record 256 | Since 2013, Backdrop has remained true to its key principles. Today, the Backdrop story is marked by a series of increasingly significant achievements. Backdrop has always been continually improved, and keeps up to date with the latest developments in web technology and approaches, including DLT and AI. Backdrop is upgraded in a predictable and methodical way, with planned updates occurring every six months. Major releases of Backdrop have been (and will be) supported for an extremely long time. New Backdrop functionality is arriving ever more frequently as more and more Drupal modules are converted. Finally, Backdrop has a proven, dedicated, mature, experienced and highly professional project team. 257 | 258 | # License 259 | 260 | View [license information](https://www.drupal.org/licensing/faq) for the software contained in this image. 261 | 262 | # Feedback 263 | 264 | ## Issue Queue(s) 265 | - [Backdrop CMS Core Issue Queue](https://github.com/backdrop/backdrop-issues/issues) 266 | - [Backdrop CMS Contrib at Github.com](https://github.com/backdrop-contrib) - Each contrib project has it's own issue queue. 267 | 268 | ## Documentation 269 | - [Backdrop CMS Documentation](https://docs.backdropcms.org/) 270 | 271 | ## Contributing 272 | - [Contribute to the Backdrop CMS Open Source Project](https://docs.backdropcms.org/documentation/contributors-guide) 273 | -------------------------------------------------------------------------------- /compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | backdrop: 3 | image: backdrop:latest 4 | container_name: backdrop 5 | ports: 6 | - 8088:80 7 | environment: 8 | BACKDROP_DB_HOST: mysql 9 | BACKDROP_DB_USER: backdrop 10 | BACKDROP_DB_PASSWORD: backdrop 11 | 12 | mysql: 13 | image: mysql:latest 14 | container_name: mysql 15 | environment: 16 | MYSQL_USER: backdrop 17 | MYSQL_PASSWORD: backdrop 18 | MYSQL_DATABASE: backdrop 19 | MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' 20 | --------------------------------------------------------------------------------