feat: support running using Docker Compose
This commit adds a Docker Compose file which will run the application using docker. The application is fronted by Traefik, and runs using PHP-fpm. nginx is used to accept queries from Traefik and relay them to the PHP-fpm containers (Traefik doesn't support FastCGI directly). Sessions are shared between the various PHP containers using memcached. Part of this work is based on [this repo](https://github.com/wandersonwhcr/docker-nginx-php-fpm)
This commit is contained in:
parent
bdf56ece83
commit
5110ded7e5
8 changed files with 201 additions and 0 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,3 +1,4 @@
|
||||||
includes/config.inc.php
|
includes/config.inc.php
|
||||||
database/config.sql
|
database/config.sql
|
||||||
site/.htaccess
|
site/.htaccess
|
||||||
|
docker/.env
|
||||||
|
|
37
docker/Dockerfile
Normal file
37
docker/Dockerfile
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
# syntax=docker/dockerfile:1.7-labs
|
||||||
|
ARG PHP_VERSION=8.3
|
||||||
|
ARG POSTGRESQL_VERSION=17
|
||||||
|
|
||||||
|
#
|
||||||
|
# Application image
|
||||||
|
#
|
||||||
|
|
||||||
|
FROM php:${PHP_VERSION}-fpm-alpine AS application
|
||||||
|
|
||||||
|
RUN <<EOF
|
||||||
|
set -e
|
||||||
|
apk add --no-cache fcgi unzip postgresql-dev libmemcached-dev \
|
||||||
|
libmemcached autoconf pkgconfig g++ zlib-dev make
|
||||||
|
docker-php-ext-install pgsql pdo pdo_pgsql
|
||||||
|
pecl install memcached
|
||||||
|
docker-php-ext-enable memcached
|
||||||
|
mkdir -p /var/www/tasks
|
||||||
|
echo "pm.status_path = /status" >> /usr/local/etc/php-fpm.d/zz-docker.conf
|
||||||
|
echo "chdir = /var/www/tasks/site" >> /usr/local/etc/php-fpm.d/zz-docker.conf
|
||||||
|
curl --silent --remote-name https://raw.githubusercontent.com/renatomefi/php-fpm-healthcheck/v0.5.0/php-fpm-healthcheck
|
||||||
|
install --owner root --group root --mode 755 php-fpm-healthcheck /usr/local/bin/php-fpm-healthcheck
|
||||||
|
rm -rf php-fpm-healthcheck
|
||||||
|
mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
|
||||||
|
EOF
|
||||||
|
HEALTHCHECK --interval=5s \
|
||||||
|
CMD php-fpm-healthcheck || exit 1
|
||||||
|
|
||||||
|
COPY --parents site includes arse /var/www/tasks/
|
||||||
|
|
||||||
|
#
|
||||||
|
# Database image
|
||||||
|
#
|
||||||
|
|
||||||
|
FROM postgres:${POSTGRESQL_VERSION} AS database
|
||||||
|
RUN mkdir /opt/tasks
|
||||||
|
COPY --parents database.sql database /opt/tasks/
|
15
docker/app-config.inc.php
Normal file
15
docker/app-config.inc.php
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
ini_set('session.save_handler', 'memcached');
|
||||||
|
ini_set('session.save_path', getenv('MEMCACHED_HOST') . ':11211');
|
||||||
|
|
||||||
|
$config[ 'core' ][ 'db' ][ 'host' ] = getenv('DB_HOST');
|
||||||
|
$config[ 'core' ][ 'db' ][ 'name' ] = getenv('DB_NAME');
|
||||||
|
$config[ 'core' ][ 'db' ][ 'user' ] = getenv('DB_USER');
|
||||||
|
$config[ 'core' ][ 'db' ][ 'password' ] = file_get_contents(getenv('DB_PASSWORD_FILE'));
|
||||||
|
|
||||||
|
$config[ 'core' ][ 'pages' ][ 'baseURL' ] = getenv('BASE_URL') ?: null;
|
||||||
|
$config[ 'core' ][ 'pages' ][ 'baseTitle' ] = 'Tasks';
|
||||||
|
|
||||||
|
/* Minimal time before a completed task can be deleted. The default is one week. */
|
||||||
|
// $config[ 't-data' ][ 'minDeletionTime' ] = 7 * 3600 * 24;
|
93
docker/compose.yml
Normal file
93
docker/compose.yml
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
name: tasks
|
||||||
|
|
||||||
|
services:
|
||||||
|
|
||||||
|
database:
|
||||||
|
container_name: ${COMPOSE_PROJECT_NAME}-database
|
||||||
|
build:
|
||||||
|
context: ..
|
||||||
|
dockerfile: ./docker/Dockerfile
|
||||||
|
target: database
|
||||||
|
args:
|
||||||
|
POSTGRESQL_VERSION: ${POSTGRESQL_VERSION:-17}
|
||||||
|
restart: always
|
||||||
|
shm_size: 128mb
|
||||||
|
volumes:
|
||||||
|
- database:/var/lib/postgresql/data
|
||||||
|
configs:
|
||||||
|
- source: db_config
|
||||||
|
target: /opt/tasks/database/config.sql
|
||||||
|
- source: db_loader
|
||||||
|
target: /docker-entrypoint-initdb.d/init-sql.sh
|
||||||
|
environment:
|
||||||
|
DB_NAME: ${DB_NAME}
|
||||||
|
DB_USER: ${DB_USER}
|
||||||
|
DB_PASSWORD_FILE: /run/secrets/db_password
|
||||||
|
POSTGRES_PASSWORD_FILE: /run/secrets/pg_password
|
||||||
|
secrets:
|
||||||
|
- db_password
|
||||||
|
- pg_password
|
||||||
|
|
||||||
|
application:
|
||||||
|
build:
|
||||||
|
context: ..
|
||||||
|
dockerfile: ./docker/Dockerfile
|
||||||
|
target: application
|
||||||
|
args:
|
||||||
|
PHP_VERSION: ${PHP_VERSION:-8.3}
|
||||||
|
user: ${UID:-1000}:${GID:-1000}
|
||||||
|
configs:
|
||||||
|
- source: app_config
|
||||||
|
target: /var/www/tasks/includes/config.inc.php
|
||||||
|
environment:
|
||||||
|
BASE_URL: ${BASE_URL}
|
||||||
|
DB_HOST: database
|
||||||
|
DB_NAME: ${DB_NAME}
|
||||||
|
DB_USER: ${DB_USER}
|
||||||
|
DB_PASSWORD_FILE: /run/secrets/db_password
|
||||||
|
MEMCACHED_HOST: memcached
|
||||||
|
secrets:
|
||||||
|
- db_password
|
||||||
|
|
||||||
|
nginx:
|
||||||
|
image: nginx:${NGINX_VERSION:-1.19}-alpine
|
||||||
|
labels:
|
||||||
|
- traefik.enable=true
|
||||||
|
- traefik.http.routers.default.rule=Host(`${PHP_HOSTNAME:-localhost}`)
|
||||||
|
- traefik.port=80
|
||||||
|
volumes:
|
||||||
|
- ./nginx-templates:/etc/nginx/templates:ro
|
||||||
|
- ../site:/var/www/tasks/site:ro
|
||||||
|
|
||||||
|
memcached:
|
||||||
|
image: memcached:${MEMCACHED_VERSION:-1.6}-alpine
|
||||||
|
|
||||||
|
traefik:
|
||||||
|
container_name: ${COMPOSE_PROJECT_NAME}-traefik
|
||||||
|
image: traefik:${TRAEFIX_VERSION:-2.4}
|
||||||
|
ports:
|
||||||
|
- ${HOST_PORT}:80
|
||||||
|
volumes:
|
||||||
|
- "/var/run/docker.sock:/var/run/docker.sock:ro"
|
||||||
|
command:
|
||||||
|
- --entrypoints.web.address=:80
|
||||||
|
- --log.level=DEBUG
|
||||||
|
- --providers.docker.exposedbydefault=false
|
||||||
|
- --providers.docker=true
|
||||||
|
|
||||||
|
configs:
|
||||||
|
app_config:
|
||||||
|
file: ./app-config.inc.php
|
||||||
|
db_config:
|
||||||
|
file: ./db-config.sql
|
||||||
|
db_loader:
|
||||||
|
file: ./init-sql.sh
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
database:
|
||||||
|
|
||||||
|
secrets:
|
||||||
|
db_password:
|
||||||
|
environment: DB_PASSWORD
|
||||||
|
pg_password:
|
||||||
|
environment: PG_PASSWORD
|
6
docker/db-config.sql
Normal file
6
docker/db-config.sql
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
\getenv db_name DB_NAME
|
||||||
|
\getenv webapp_user DB_USER
|
||||||
|
\getenv webapp_password DB_PASSWORD
|
||||||
|
|
||||||
|
CREATE ROLE :webapp_user WITH LOGIN ENCRYPTED PASSWORD :'webapp_password';
|
||||||
|
CREATE DATABASE :db_name WITH TEMPLATE=template0 ENCODING='UTF8';
|
23
docker/env.example
Normal file
23
docker/env.example
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# Version of software components
|
||||||
|
MEMCACHED_VERSION=1.6
|
||||||
|
NGINX_VERSION=1.19
|
||||||
|
PHP_VERSION=8.3
|
||||||
|
POSTGRESQL_VERSION=17
|
||||||
|
TRAEFIX_VERSION=2.4
|
||||||
|
|
||||||
|
# Port to bind on the host
|
||||||
|
HOST_PORT=80
|
||||||
|
# UID and GID to run php-fpm as
|
||||||
|
UID=1000
|
||||||
|
GID=1000
|
||||||
|
# PostgreSQL superuser password
|
||||||
|
PG_PASSWORD=...
|
||||||
|
# Database name
|
||||||
|
DB_NAME=tasks
|
||||||
|
# Database access username
|
||||||
|
DB_USER=tasks
|
||||||
|
# Database access password
|
||||||
|
DB_PASSWORD=...
|
||||||
|
|
||||||
|
# Base URL, if autodetection fails
|
||||||
|
BASE_URL=
|
5
docker/init-sql.sh
Normal file
5
docker/init-sql.sh
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
cd /opt/tasks
|
||||||
|
DB_PASSWORD="`cat "$DB_PASSWORD_FILE"`" psql -vON_ERROR_STOP=1 -f database.sql
|
21
docker/nginx-templates/default.conf.template
Normal file
21
docker/nginx-templates/default.conf.template
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
|
||||||
|
index index.php;
|
||||||
|
root /var/www/tasks/site;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri /index.php$request_uri;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
location /index.php/ {
|
||||||
|
fastcgi_pass application:9000;
|
||||||
|
|
||||||
|
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_param PATH_INFO $fastcgi_path_info;
|
||||||
|
fastcgi_param SCRIPT_NAME "/index.php";
|
||||||
|
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue