Skip to content
Snippets Groups Projects
Commit d8aea92a authored by jurgenhaas's avatar jurgenhaas
Browse files

Merge branch 'develop' into 'main'

Merging develop into main

See merge request !7
parents b367a7aa 8bb8c24b
No related branches found
No related tags found
1 merge request!7Merging develop into main
Pipeline #521957 passed
......@@ -25,15 +25,17 @@
"docs": "https://devops-tools.docs.lakedrops.com/composer/plugin/d4d/"
},
"require": {
"ext-json": "*",
"php": ">=7.2",
"ext-json": "*",
"composer-plugin-api": "^1||^2",
"henrywhitaker3/healthchecks-io": "^1.0",
"lakedrops/ahoy": "^1.5||dev-main",
"lakedrops/composer-json-utils": "^2.0||dev-main",
"lakedrops/docker-traefik": "^3.0||dev-main"
},
"require-dev": {
"composer/composer": "^1||^2",
"lakedrops/drupal-environment": "^3.0",
"phpunit/phpunit": "^8.4"
},
"minimum-stability": "dev",
......@@ -45,5 +47,10 @@
},
"extra": {
"class": "LakeDrops\\Docker4Drupal\\Plugin"
},
"config": {
"allow-plugins": {
"lakedrops/ahoy": true
}
}
}
......@@ -2,6 +2,11 @@
namespace LakeDrops\Docker4Drupal;
use Henrywhitaker3\Healthchecks\Exceptions\HealthchecksAccountLimitReachedException;
use Henrywhitaker3\Healthchecks\Exceptions\HealthchecksFailureException;
use Henrywhitaker3\Healthchecks\Exceptions\HealthchecksUnauthorisedException;
use Henrywhitaker3\Healthchecks\Exceptions\HealthchecksUuidNotFoundException;
use Henrywhitaker3\Healthchecks\HealthchecksManager;
use LakeDrops\Component\Composer\BaseHandler;
use LakeDrops\DockerTraefik\Traefik;
use LakeDrops\DrupalEnvironment\Handler as DrupalEnvironment;
......@@ -47,7 +52,7 @@ class Handler extends BaseHandler {
$this->getDockerGateway() :
$this->getLocalIpv4('docker0'),
'proxy' => ($this->isCiContext() || $this->isLocalDevMode()) ?
$this->getDockerProxy($projectname) :
$this->getDockerProxy() :
FALSE,
],
'traefik' => [
......@@ -514,8 +519,85 @@ class Handler extends BaseHandler {
'dest' => $projectRoot . '/backup',
'condition' => $this->config->readValue(['backup', 'enable']),
];
// Manage crontabs and optionally add them to heathcheck-io
$hj_api_url = getenv('HEALTHCHECK_API_URL');
$hj_api_key = getenv('HEALTHCHECK_API_KEY');
$hj_api_channels = getenv('HEALTHCHECK_API_CHANNELS');
$hj_project = $this->config->readValue('projectname');
$hj_branch = getenv('CI_COMMIT_BRANCH');
$hj_checks = [];
$hj_manager = NULL;
if (!empty($hj_api_url) && !empty($hj_api_key)) {
$hj_manager = new HealthchecksManager($hj_api_key, $hj_api_url);
try {
$hj_checks = $hj_manager->listChecks();
}
catch (HealthchecksFailureException | HealthchecksUnauthorisedException $e) {
// Ignoring this for now.
}
}
foreach ($this->config->readValue('crontabs') ?? [] as $user => $tasks) {
if (empty($tasks)) {
if (!is_array($tasks)) {
continue;
}
$activeTasks = [];
foreach ($tasks as $task) {
$disabled = !empty($task['disabled']);
$command = $task['command'];
if (isset($hj_manager)) {
unset($task['disabled'], $task['command']);
$task['channels'] = $hj_api_channels;
$task['tags'] = implode(' ', ['d4d', $hj_project, $hj_branch]);
$check = NULL;
foreach ($hj_checks as $existing) {
$tags = explode(' ', $existing['tags']);
if ($task['name'] === $existing['name'] && in_array('d4d', $tags, TRUE) && in_array($hj_project, $tags, TRUE) && in_array($hj_branch, $tags, TRUE)) {
$check = $existing;
break;
}
}
if (!$check) {
if ($disabled) {
// This task is disabled. As it doesn't exist yet, nothing to do.
continue;
}
try {
$check = $hj_manager->createCheck($task);
}
catch (HealthchecksAccountLimitReachedException | HealthchecksUnauthorisedException $e) {
// Ignoring this for now.
}
}
else {
$changed = FALSE;
foreach ($task as $key => $value) {
if (!isset($check[$key]) || $check[$key] !== $value) {
$changed = TRUE;
}
}
if ($changed) {
$parts = explode('/', $check['ping_url']);
$uuid = array_pop($parts);
try {
$check = $hj_manager->updateCheck($uuid, $task);
}
catch (HealthchecksFailureException | HealthchecksUuidNotFoundException | HealthchecksAccountLimitReachedException | HealthchecksUnauthorisedException $e) {
// Ignoring this for now.
}
}
}
if ($check) {
$command .= ' && curl -fsS --retry 5 -o /dev/null ' . $check['ping_url'];
}
}
if (!$disabled) {
$activeTasks[] = $command;
}
}
if (empty($activeTasks)) {
$files[$user] = [
'dest' => $projectRoot . '/crontabs',
'delete' => TRUE,
......@@ -525,7 +607,7 @@ class Handler extends BaseHandler {
$files[$user] = [
'source' => 'crontabs/template.twig',
'dest' => $projectRoot . '/crontabs',
'options' => $tasks,
'options' => $activeTasks,
];
}
}
......@@ -574,11 +656,9 @@ class Handler extends BaseHandler {
}
/**
* @param string $projectname
*
* @return string
*/
private function getDockerProxy(string $projectname): string {
private function getDockerProxy(): string {
foreach ($this->readNetworkConfig()['Containers'] as $container) {
if (isset($container['Name']) && in_array($container['Name'], ['traefik_traefik_1', 'traefik-traefik-1'])) {
return explode('/', $container['IPv4Address'])[0];
......@@ -623,7 +703,7 @@ class Handler extends BaseHandler {
exec('docker container inspect ' . $id, $output);
return json_decode(implode('', $output), TRUE)[0];
}
catch (Exception $ex) {
catch (\Exception $ex) {
// Ignore.
}
return [
......@@ -643,7 +723,7 @@ class Handler extends BaseHandler {
exec('docker network inspect traefik-public', $output);
return json_decode(implode('', $output), TRUE)[0];
}
catch (Exception $ex) {
catch (\Exception $ex) {
// Ignore.
}
return [
......
......@@ -21,12 +21,11 @@ services:
MYSQL_USER: drupal
MYSQL_PASSWORD: drupal
MYSQL_LOG_CONSOLE: 0
{% if drupal.live|default(0) %}
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
{% if drupal.live|default(0) %}
- {{ projectrootdb }}:/var/lib/mysql
{% if backup.enable|default(0) %}
- {{ projectrootbackup }}/db:/var/backups/mysql
{% endif %}
{% endif %}
{% if not drupal.live|default(0) %}
......@@ -39,6 +38,9 @@ services:
MYSQL_USER: drupal
MYSQL_PASSWORD: drupal
MYSQL_LOG_CONSOLE: 0
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
{% endif %}
php:
......@@ -82,6 +84,8 @@ services:
SSH_AUTH_SOCK: /ssh-agent
{% endif %}
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- {{ projectroot }}:/var/www/html
- {{ projectroot }}/drush:/etc/drush
{% if drupal.live|default(0) %}
......@@ -120,6 +124,8 @@ services:
SSH_AUTH_SOCK: /ssh-agent
{% endif %}
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- {{ projectroot }}:/var/www/html
- {{ projectroot }}/drush:/etc/drush
- {{ projectrootfiles }}:/data/default
......@@ -166,6 +172,8 @@ services:
{{ webserver.type|upper }}_BACKEND_HOST: php
{{ webserver.type|upper }}_SERVER_ROOT: /var/www/html/{{ webRoot }}/
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- {{ projectroot }}:/var/www/html
{% if drupal.live|default(0) %}
- {{ projectrootfiles }}:/data/default
......@@ -214,6 +222,9 @@ services:
VARNISH_SECRET: secret
VARNISH_BACKEND_HOST: {{ webserver.type }}
VARNISH_BACKEND_PORT: 80
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
labels:
traefik.enable: 'true'
traefik.docker.network: traefik-public
......@@ -223,10 +234,12 @@ services:
redis:
image: 'wodby/redis:{{ redis.version }}'
{% if drupal.live|default(0) %}
restart: unless-stopped
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
{% if drupal.live|default(0) %}
- {{ projectrootredis }}:/data
restart: unless-stopped
{% endif %}
{% if not drupal.live|default(0) %}
......@@ -238,6 +251,9 @@ services:
- default
environment:
ADMINER_SALT: adminer-salt
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
labels:
traefik.enable: 'true'
traefik.docker.network: traefik-public
......@@ -257,6 +273,9 @@ services:
PMA_PASSWORD: drupal
PHP_UPLOAD_MAX_FILESIZE: 1G
PHP_MAX_INPUT_VARS: 1G
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
labels:
traefik.enable: 'true'
traefik.docker.network: traefik-public
......@@ -275,6 +294,9 @@ services:
- default
environment:
SOLR_HEAP: 1024m
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
labels:
traefik.enable: 'true'
traefik.docker.network: traefik-public
......@@ -295,6 +317,8 @@ services:
MH_OUTGOING_SMTP: /test/mhout.json
privileged: true
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- {{ projectroot }}/tests/mhout.json:/test/mhout.json
labels:
traefik.enable: 'true'
......@@ -325,6 +349,8 @@ services:
traefik.http.services.{{ projectname }}_nodejs.loadbalancer.server.port: 8080
traefik.http.routers.nodejs-{{ projectname }}.rule: Host(`nodejs-{{ projectdomain }}`)
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- {{ projectroot }}/{{ node.path }}:/app
command: sh -c 'npm install && npm run start'
......@@ -342,6 +368,8 @@ services:
expose:
- '3000'
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- {{ projectroot }}/{{ node.path }}:/app
command: sh -c 'npm install && npm run start'
{% endif %}
......@@ -352,6 +380,9 @@ services:
{% if drupal.live|default(0) %}
restart: unless-stopped
{% endif %}
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
{% endif %}
{% if rsyslog.enable %}
......@@ -360,6 +391,9 @@ services:
{% if drupal.live|default(0) %}
restart: unless-stopped
{% endif %}
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
{% endif %}
{% if athenapdf.enable %}
......@@ -375,6 +409,9 @@ services:
WEAVER_MAX_CONVERSION_QUEUE: 50
WEAVER_WORKER_TIMEOUT: 90
WEAVER_CONVERSION_FALLBACK: false
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
{% endif %}
{% if blackfire.enable and not drupal.live|default(0) %}
......@@ -383,6 +420,9 @@ services:
environment:
BLACKFIRE_SERVER_ID: '{{ blackfire.id }}'
BLACKFIRE_SERVER_TOKEN: '{{ blackfire.token }}'
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
{% endif %}
{% if webgrind.enable and not drupal.live|default(0) %}
......@@ -400,6 +440,8 @@ services:
traefik.http.services.{{ projectname }}_webgrind.loadbalancer.server.port: 8080
traefik.http.routers.webgrind-{{ projectname }}.rule: Host(`webgrind-{{ projectdomain }}`)
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- {{ projectroot }}/files:/mnt/files
{% endif %}
{% if selenium.enable and not drupal.live|default(0) %}
......@@ -407,6 +449,8 @@ services:
hub:
image: 'elgalu/selenium'
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- /dev/shm:/dev/shm
privileged: true
environment:
......@@ -423,6 +467,8 @@ services:
depends_on:
- hub
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- /dev/shm:/dev/shm
privileged: true
environment:
......@@ -457,6 +503,9 @@ services:
ports:
- 9200
- 9300
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
{% endif %}
{% if drupal.live|default(0) %}
{% if backup.enable|default(0) %}
......@@ -465,14 +514,14 @@ services:
image: 'b3vis/borgmatic:{{ backup.version }}'
restart: unless-stopped
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- {{ projectrootfiles }}:/mnt/source:ro
- {{ projectrootbackup }}/files:/mnt/borg-repository
- {{ projectroot }}/backup:/etc/borgmatic.d/
- {{ projectrootbackup }}/config:/root/.config/borg
- {{ projectrootbackup }}/ssh:/root/.ssh
- {{ projectrootbackup }}/cache:/root/.cache/borg
environment:
TZ: Europe/Berlin
env_file: ../backup/.env
{% endif %}
{% endif %}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment