Compare commits

...

187 Commits

Author SHA1 Message Date
cytopia
986f04637f
Merge pull request #957 from nickchomey/patch-1
fix typos in check-config.sh
2023-01-30 11:21:52 +01:00
nickchomey
8621ce1b55
fix typos in check-config.sh 2023-01-27 20:48:20 -06:00
cytopia
10b20c0745
Merge pull request #944 from cytopia/release/v3.0.0-beta-0.3
Release/v3.0.0 beta 0.3
2023-01-03 01:32:23 +01:00
cytopia
1c2143095a
Update PHP modules 2023-01-02 23:31:26 +01:00
cytopia
22ed5edc4e
Intranet: be more clear about watcherd restart 2023-01-02 23:29:02 +01:00
cytopia
9d23981173
Pin PHP image 2023-01-02 23:28:45 +01:00
cytopia
6fa4d4a386
Refs #919 Added host.docker.internal to connect to host system 2023-01-02 12:40:26 +01:00
cytopia
51a127dda3
Update PHP image 2023-01-02 11:29:40 +01:00
cytopia
76c6467806
Docs: Update available PHP exts 2023-01-02 00:33:09 +01:00
cytopia
617241ce42
Fixup README 2023-01-01 15:19:26 +01:00
cytopia
2fa1641bc2
Fix shellcheck 2023-01-01 15:17:49 +01:00
cytopia
de8d40822c
Adjust Readme 2023-01-01 14:37:28 +01:00
cytopia
b773fcd1b7
Adjust tests 2022-12-31 09:18:02 +01:00
cytopia
7c461870f0
Remove obsolete entries 2022-12-31 08:55:40 +01:00
cytopia
ecb674f859
Update CHANGELOG 2022-12-31 08:19:41 +01:00
cytopia
8e39202fc9
Update HTTPD server 2022-12-31 08:19:29 +01:00
cytopia
8c81bcc1a1
Fix TLD_SUFFIX section in env_example 2022-12-31 07:05:23 +01:00
cytopia
8a1a720e8c
Show PHP 8.3 link in support section 2022-12-31 07:01:12 +01:00
cytopia
fb173e0ed6
Intranet vhost: vhost table width jumping 2022-12-31 06:58:37 +01:00
cytopia
9f54138567
Intranet index: vhost table width jumping 2022-12-31 06:52:23 +01:00
cytopia
364f4aa3a6
Syntax highlighting for httpd configs 2022-12-31 06:47:59 +01:00
cytopia
c7c2b4f2cb
Update CHANGELOG 2022-12-31 06:05:51 +01:00
cytopia
0b561dfdd2
Intranet: Show wscat version 2022-12-31 06:05:19 +01:00
cytopia
794e3d8961
Intranet vhosts.php b64 encode modal html targets 2022-12-31 05:56:07 +01:00
cytopia
a84e18be67
Use TLD_SUFFIX=dvl.to which always points to 127.0.0.1 2022-12-31 05:44:25 +01:00
cytopia
894706ab09
Docs: Show available tools per version in README.md 2022-12-31 05:26:31 +01:00
cytopia
448054bece
Intranet: vhost overview now shows listening ports 2022-12-31 05:23:49 +01:00
cytopia
e18bfd3f4f
Intranet: vhosts.php Use modals to show config 2022-12-31 05:20:32 +01:00
cytopia
d1894b3eb2
Refs #798 Added ctype_xdigit check around hexdec 2022-12-31 03:33:09 +01:00
cytopia
7f3b45b387
Update REAMDE 2022-12-30 14:21:39 +01:00
cytopia
81c9bb0a93
Merge pull request #943 from cytopia/release/v3.0.0-beta-0.2
Release/v3.0.0 beta 0.2
2022-12-27 15:28:16 +01:00
cytopia
cb07f319de
Pin HTTPD server 2022-12-27 13:00:21 +01:00
cytopia
cca1744145
Bump version date 2022-12-27 12:52:19 +01:00
cytopia
9fc97586e6
Intranet: show local daemons if netstat is available 2022-12-27 12:28:42 +01:00
cytopia
2db5ffff6b
Pin PHP versions 2022-12-27 12:26:47 +01:00
cytopia
0dc1b9cafb
Intranet: Make vhost page less jumpy 2022-12-27 12:24:28 +01:00
cytopia
b05f4240f3
Update vhost-gen templates 2022-12-27 02:58:40 +01:00
cytopia
e18e923d87
Update Changelog 2022-12-26 23:01:57 +01:00
cytopia
c6e1192429
Disable linkcheck2, works locally, breaks on CI 2022-12-26 23:01:34 +01:00
cytopia
634b9af7e5
Intranet vhost page: accept HTTP 426 for project gathering 2022-12-26 22:59:13 +01:00
cytopia
a1fa5724e8
Update vhost-gen templates 2022-12-26 16:03:05 +01:00
cytopia
a786eb64b0
Update CHANGELOG 2022-12-26 14:51:25 +01:00
cytopia
01d2f4afed
Remove autostart mounts from compose override php images 2022-12-26 14:51:03 +01:00
cytopia
873abc6c4c
Update docker images 2022-12-26 14:50:37 +01:00
cytopia
1ba3cd399c
Intranet: Reverse Proxy/Websockets do not need a htdocs directory 2022-12-26 14:13:36 +01:00
cytopia
299b765652
Websock: Allow HTTP 426 for DNS check (Upgrade) 2022-12-26 14:13:01 +01:00
cytopia
6819619d8a
Merge pull request #942 from cytopia/release/v3.0.0-beta-0.1
🎅🎄🎁
2022-12-25 20:42:06 +01:00
cytopia
3ffb360c51
Update check-config.sh 2022-12-25 18:41:26 +01:00
cytopia
025b45c48c
Fix IPv6 handling 2022-12-25 18:11:25 +01:00
cytopia
10571f7b51
Intranet: Show backend type on vhost page 2022-12-25 18:06:35 +01:00
cytopia
ffba5d61b7
Remove obsolete mod/ directory 2022-12-25 17:40:02 +01:00
cytopia
200f6ce0b1
Fix volume paths in php-multi compose files 2022-12-25 17:38:40 +01:00
cytopia
8b0788b403
Add PHP version number to README files in cfg/ dir 2022-12-25 17:37:58 +01:00
cytopia
dfda00d78a
Pinned HTTPD images 2022-12-25 16:48:46 +01:00
cytopia
98f05d7570
Updated UPDATING.md 2022-12-25 16:48:32 +01:00
cytopia
a560926315
Removed obsolete supervisorctl config section 2022-12-25 16:48:15 +01:00
cytopia
e60aa4e465
Remove obsolete points from README 2022-12-25 15:59:57 +01:00
cytopia
d5858da3e0
Fix indentation 2022-12-25 15:42:10 +01:00
cytopia
c64c4553d7
Remove obsolete mounts from docker-compose 2022-12-25 15:41:21 +01:00
cytopia
55f0447ce1
Add some colored output for logs in C&C 2022-12-25 15:40:45 +01:00
cytopia
0e3b963df2
Do not rely on external supervisord.conf for C&C web interface 2022-12-24 13:28:51 +01:00
cytopia
0964c7bdd9
Fix hostnames in CHANGELOG 2022-12-24 13:01:58 +01:00
cytopia
3b1c0b25a5
docs: fix bind links 2022-12-23 23:03:13 +01:00
cytopia
32c7beda22
Fix magento install guide links 2022-12-23 22:56:36 +01:00
cytopia
794bf0c27c
Atom no longer available 2022-12-23 22:52:56 +01:00
cytopia
e51f34c1ae
Fix wrong link in docs 2022-12-23 22:28:43 +01:00
cytopia
6b80453b92
Docs announce 2022-12-23 21:42:45 +01:00
cytopia
6fa03e6961
Fix env var names in docs 2022-12-23 21:07:34 +01:00
cytopia
e3b7c2d4db
Adjust check-config.sh 2022-12-23 20:01:44 +01:00
cytopia
2b4bf59a40
Add missing mariadb config directories 2022-12-23 19:59:14 +01:00
cytopia
ee5988507e
Update CHANGELOG 2022-12-23 19:45:20 +01:00
cytopia
d354d84165
Update intranet and docker-compose 2022-12-23 19:37:50 +01:00
cytopia
f2c0372618
Update DNS server to latest version 2022-12-23 19:36:10 +01:00
cytopia
a35216fdfb
Add Docker Compose Override File for Multi PHP versions 2022-12-23 19:35:54 +01:00
cytopia
2828e837d9
Merge pull request #910 from minhchu/support-meilisearch
Add support for meilisearch
2022-12-20 10:46:40 +01:00
cytopia
685e09f76b
Merge branch 'master' into support-meilisearch 2022-12-20 00:03:23 +01:00
cytopia
04c0e27ebf
Merge pull request #920 from Cleancookie/master
shell.sh to fall back to docker compose (no dash)
2022-12-20 00:02:56 +01:00
cytopia
7645068258
Merge branch 'master' into master 2022-12-18 23:31:03 +01:00
cytopia
b5566c1c52
Merge pull request #941 from cytopia/release/v2.4.0
Release/v2.4.0
2022-12-18 22:56:34 +01:00
cytopia
826859a1cd
Merge branch 'master' into release/v2.4.0 2022-12-18 18:00:44 +01:00
cytopia
71064a7296
Update CHANGELOG 2022-12-18 15:50:47 +01:00
cytopia
f2088d63a7
Disable Drupal test due to removed drush 2022-12-18 15:49:28 +01:00
cytopia
8b70a01a16
Update CHANGELOG and version 2022-12-18 15:05:54 +01:00
cytopia
a5f28e80c3
Switching to Discord 2022-12-18 14:45:40 +01:00
cytopia
48e7133825
Intranet: Improved installed tools overview 2022-12-18 14:38:19 +01:00
cytopia
2e33d991b7
Fixed PostgreSQL database overview in intranet 2022-12-18 14:37:05 +01:00
cytopia
8227605036
Refs #940, #936, #934, #930 Update PHP versions 2022-12-18 14:35:51 +01:00
cytopia
565a5c7427
Updated MySQL versions 2022-12-18 14:34:12 +01:00
Minh Chu
eb5ecc836c
Merge branch 'cytopia:master' into support-meilisearch 2022-12-16 11:59:28 +07:00
Devilbox Bot
c165fd2ba0
Merge pull request #904 from mmcev106/large-email-support
Delayed message body loading
2022-12-13 10:35:28 +01:00
Mark McEver
d2d1ddfb63 PHP 5.3 fix 2022-12-12 13:54:33 -06:00
Mark McEver
f7c58ddbc4 Fixed email unit test 2022-12-12 10:38:31 -06:00
cytopia
8bde34caaf
Merge branch 'master' into master 2022-12-11 14:20:50 +01:00
cytopia
441adbb66d
Merge branch 'master' into support-meilisearch 2022-12-11 14:14:50 +01:00
cytopia
b5a6c0e6ad
Merge branch 'master' into large-email-support 2022-12-11 06:24:22 +01:00
cytopia
ca56dff442
Merge pull request #935 from cytopia/release/v2.3.0
WIP: Release v2.3.0
2022-12-04 13:31:13 +01:00
cytopia
7c941000c8
Updated CHANGELOG 2022-12-04 11:17:51 +01:00
cytopia
dbfd086227
Use latest docker-mysql images 2022-12-04 11:15:36 +01:00
cytopia
895558209e
Adjusted release date 2022-12-04 10:56:50 +01:00
cytopia
b6512388d7
Added recent MariaDB, Redis and PGSQL versions 2022-12-04 10:56:07 +01:00
cytopia
5cce2a8a89
Make phpPgAdmin work with PgSQL 15 2022-12-04 10:38:28 +01:00
cytopia
b00b1e77b9
Disable CakePHP integration tests 2022-12-04 04:42:43 +01:00
cytopia
f2cca91dd1
Update CHANGELOG 2022-12-02 15:37:57 +01:00
cytopia
b600f9866a
Update docker-compose 2022-12-02 15:37:57 +01:00
cytopia
aae28e7d6d
Update CHANGELOG and version 2022-12-02 15:37:56 +01:00
cytopia
fe59793304
Fix script to fetch PHP modules 2022-12-02 15:37:56 +01:00
Alex
e8a6fe51e7 shell.sh now falls back to docker compose (no dash) 2022-11-30 13:57:58 +00:00
cytopia
c5da81b83b
Merge pull request #931 from alexaandrov/fix-rabbit-docs
Fix rabbit container name typo in docs
2022-11-19 15:13:34 +01:00
Grigory Alexandrov
503667a8da Fix rabbit container name typo in docs 2022-11-12 23:33:57 +03:00
cytopia
315fb9e3c4
Merge pull request #927 from kenjis/add-setup-codeigniter4
docs: add "Setup CodeIgniter4"
2022-10-28 13:52:33 +02:00
kenjis
fc28e32b0c
Add "Setup CodeIgniter4" 2022-10-26 20:50:27 +09:00
cytopia
180eac149b
Merge pull request #926 from boodaah71/patch-1
fix typo
2022-10-21 13:41:01 +02:00
cytopia
dfb6eaec69
Merge branch 'master' into patch-1 2022-10-21 13:40:54 +02:00
cytopia
248cf5ba5f
Merge pull request #928 from kenjis/fix-docs-setup-codeigniter
docs: fix CodeIgniter3 docs link
2022-10-21 13:40:27 +02:00
cytopia
07df58f13a
Merge branch 'master' into fix-docs-setup-codeigniter 2022-10-21 13:40:15 +02:00
cytopia
3bffa62456
Merge pull request #925 from vikas5914/patch-1
Fix: Using ${var} in strings is deprecated, use {$var} instead
2022-10-21 13:38:47 +02:00
kenjis
59205dc888
docs: fix CodeIgniter3 docs link 2022-10-19 13:32:12 +09:00
Kenneth Ferguson
63437650ee
fix typo
The word 'than' is used for comparisons. The word 'then' is used for sequence of events.
2022-10-18 13:00:50 -04:00
Vikas Kapadiya
a11419e82e
Fix: Using ${var} in strings is deprecated, use {$var} instead 2022-10-13 22:44:48 +05:30
Minh Chu
fb64b0bd31 Add docs for Meilisearch 2022-08-01 00:29:03 +07:00
Minh Chu
12e613188e Add support for meilisearch 2022-07-31 01:06:13 +07:00
Mark McEver
234bdd6419 Delayed message body loading 2022-06-20 15:13:20 -05:00
cytopia
6a04527456
Merge pull request #902 from rafaelstz/patch-1
Fixing Magento 2 doc link
2022-06-02 10:44:54 +02:00
Rafael Corrêa Gomes
0bb019b8a8
Fixing Magento 2 doc link 2022-06-01 15:20:59 -04:00
cytopia
d3492e4acc
Merge pull request #897 from ahberg/master
Add custom vhost-gen yml files into gitignore
2022-05-13 17:59:36 +02:00
Anton A
4418b305de Add custom vhost-gen .yml files to .gitignore 2022-05-13 17:28:10 +02:00
cytopia
933a1c65e1
Merge pull request #896 from cytopia/cytopia-patch-1
Update bug_report.yml
2022-05-02 10:03:52 +02:00
cytopia
cabb7b07aa
Update bug_report.yml 2022-05-02 10:02:23 +02:00
cytopia
97751fad37
Merge pull request #893 from jakeparis/master
Add docs about .local on MacOS
2022-04-24 10:23:14 +02:00
Jake Paris
81d896fa93 Fix whitespace 2022-04-22 10:02:17 -04:00
Jake Paris
270cb45726 Updated docs about .local on MacOS
See #892
2022-04-22 09:59:57 -04:00
cytopia
26cbb63f00
Merge pull request #891 from cytopia/release/v2.2.0
Devilbox Release v2.2.0
2022-04-14 18:02:52 +02:00
cytopia
daefd0f927
Add announcement in docs 2022-04-14 12:05:39 +02:00
cytopia
44d1f0162f
Add PHP-FPM community image to intranet credits 2022-04-14 11:42:07 +02:00
cytopia
59619ca9c1
Update project files 2022-04-14 11:29:13 +02:00
cytopia
a6c45353bd
Adding PHP-FPM community images 2022-04-14 11:28:54 +02:00
cytopia
575782af55
Merge pull request #890 from cytopia/release/v2.1.1
Release v2.1.1
2022-04-08 10:48:44 +02:00
cytopia
56d2ab39b4
Used tagged PHP images (auto-updating)instead early release branch one 2022-04-07 22:05:20 +02:00
cytopia
c29741d119
Merge pull request #889 from cytopia/release/v2.1.0
Release v2.1.0
2022-04-06 09:29:14 +02:00
cytopia
6e2f6ca181
Use intermediate images 2022-04-05 23:15:12 +02:00
cytopia
7e85b8e609
Update project files 2022-04-05 23:15:01 +02:00
cytopia
02f6876a21
Make Devilbox arm64 compatible 2022-04-03 13:39:56 +02:00
cytopia
a5396c2213
Merge pull request #888 from cytopia/issue-bug-report
fine-tune bug report
2022-04-01 06:22:08 +02:00
cytopia
eb9cb0254f
fine-tune bug report 2022-04-01 06:21:44 +02:00
cytopia
f054b22957
Merge pull request #887 from cytopia/bug-report
Refine bug report
2022-04-01 06:16:50 +02:00
cytopia
aed9a96dfc
Refine bug report 2022-04-01 06:16:34 +02:00
cytopia
7a13143b4f
Merge pull request #886 from cytopia/issue-template-bug
Adjust templates
2022-04-01 06:04:11 +02:00
cytopia
887202db65
Adjust templates 2022-04-01 06:03:53 +02:00
cytopia
4fb67be0bd
Merge pull request #885 from cytopia/fix-templates
Enhance issue templates
2022-04-01 05:48:27 +02:00
cytopia
14bba0a140
Enhance issue templates 2022-04-01 05:47:58 +02:00
cytopia
6c2b42cbc7
Merge pull request #884 from cytopia/github-issues
Adjust issue templates
2022-04-01 05:20:25 +02:00
cytopia
19619394e3
Adjust issue templates 2022-04-01 05:19:42 +02:00
cytopia
66fe7e355d
Merge pull request #883 from cytopia/repository-organization
Repository organization
2022-04-01 05:04:03 +02:00
cytopia
ec1e5861ce
Add new GitHub issue templates 2022-04-01 05:02:23 +02:00
cytopia
fb48e5e85a
Ensure to run CI tests only for specific purposes 2022-04-01 05:01:29 +02:00
cytopia
49190e4c36
Merge pull request #881 from MrCrayon/master
Add note about MDEV-27937 MariaDB bug
2022-04-01 02:07:44 +02:00
cytopia
c3da7facb4
Update docs/support/troubleshooting.rst 2022-03-31 12:39:38 +02:00
MrCrayon
d375244920 Add note about MDEV-27937 MariaDB bug
I prefer to write code than documentation and I am not native speaker so feel free to suggest or make changes.

https://jira.mariadb.org/browse/MDEV-27937

Closes #870
2022-03-31 05:34:52 +02:00
MrCrayon
1b5522b6fa Merge branch 'master' of https://github.com/MrCrayon/devilbox 2022-03-31 05:32:52 +02:00
cytopia
68541d76ad
Merge pull request #880 from cytopia/release/v2.0.0
Release/v2.0.0
2022-03-28 20:44:37 +02:00
cytopia
96610c756b
Update project files 2022-03-28 17:13:11 +02:00
cytopia
7799740525
Added .env variable HTTPD_FLAVOUR to decide between Debian or Alpine for HTTP server 2022-03-28 17:10:51 +02:00
cytopia
8e8991896a
Remove failing services in CI 2022-03-28 17:10:50 +02:00
cytopia
cbdabb2f97
Add exceptions for PHP CI to use older PGSQL versions 2022-03-28 17:10:50 +02:00
cytopia
d45a336d65
Removed CI for MongoDB 2.8 and MongoDB 3.0 due to segfault 2022-03-28 17:10:50 +02:00
cytopia
49b919534a
Give more startup-time for CI tests 2022-03-28 17:10:49 +02:00
cytopia
0159d2a60b
Ensure CI tests run on bash shell 2022-03-28 17:10:49 +02:00
cytopia
ac07995595
Adjust version according to breaking changes 2022-03-28 17:10:48 +02:00
cytopia
4f0542b756
Add breaking changes info to CHANGELOG 2022-03-28 17:10:48 +02:00
cytopia
052be908aa
Add new CI status badges 2022-03-28 17:10:47 +02:00
cytopia
a714821dea
Use tiny Alpine version of Bind container 2022-03-28 17:10:47 +02:00
cytopia
579ae15bcc
Add exceptions for PHP CI to use older PGSQL versions 2022-03-28 17:10:46 +02:00
cytopia
f632cc247f
Fix Release version in CHANELOG 2022-03-28 17:10:46 +02:00
cytopia
fbef67daac
Rename workflows 2022-03-28 17:10:46 +02:00
cytopia
a5e0a54c5f
Reorganize integration tests 2022-03-28 17:10:45 +02:00
cytopia
71c73f7fb3
Test re-usable workflows 2022-03-28 17:10:36 +02:00
cytopia
52689f435a
Colorize test outputs 2022-03-28 17:10:35 +02:00
cytopia
3678a6799c
Fix PGSQL versions in CI 2022-03-28 17:10:34 +02:00
cytopia
014d9103db
Added CakePHP integration tests for PHP 8+ 2022-03-28 17:10:33 +02:00
cytopia
6acac7d8de
Fix CI script to detect PHP version 2022-03-28 17:10:33 +02:00
cytopia
9ac4b7399f
Fix postgresql volume definitions 2022-03-28 17:10:33 +02:00
cytopia
e3dfa7cc09
Bump version 2022-03-28 17:10:32 +02:00
cytopia
6c03253313
Changed default server versions to have arm64 support 2022-03-28 17:10:32 +02:00
cytopia
19a65b3da4
Merge pull request #877 from discorgento/fix/DOCS-xdebug3
Fix/docs xdebug3
2022-03-27 04:42:27 +02:00
Jonatan Machado
95a0109004 DOCS-xdebug3 vscode linux config 2022-03-24 18:39:20 -03:00
Jonatan Machado
0c26a6c319
Merge pull request #1 from cytopia/master
update
2022-03-24 13:50:28 -03:00
MrCrayon
c3f213b779 Release v1.10.5
-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEkSv/CQZ9D25K/rxfbVbtuGlRKKIFAmIyBQ8ACgkQbVbtuGlR
 KKLwoQ//cZI3NC/tU6Qz0bhbfW5bCRMW8ubGXuS6bjv+d/YOMn8endNj4CpB/MCD
 Rq8JrY5m0RqUXn4Ws5ExrlCZV3jpiCdWTls6HQFB0Q9nYBsDeVqBVJR6rChGBVPC
 g/jDfcNiD/J+fJjkxDqgysZi31aYlYCeqBV+98NXIPnbmKJ8OrgjeeJP3oOPAYpJ
 +f884Vj6dX1fpAwx/j+g08/j8u0lqtlWq/swhGUFFJoaNWy3Ov1hOodGZjuFGamU
 +lHWeXWdtPXUYbQfvcY0ihhjqMGBlvEJI5Z6wrZ9tIfWJAm0BRqnT2s+ExLZA3cA
 QR9P9JF48OzGZ+Byqh5SxOSiBEqbHIxdsbeQJVvX+Z8CL6r03xbl7+nKLickXnzP
 qi45qYsvI08WY+mdbPM6tLU9uV3q6bNekg616dFRmAM1alcwsslwUmTIKvVV/6bB
 ZZMwlS/m2Na1rpm51xaOodu961hde92VRv91ShxbERcGFuTQk+tMpz345XhjQhWY
 05Gi8t72MmN4QPh1yN8RWhEM0FFML0CaVGVKLzc96IlIYeDxi9KKzDanX2KY97OA
 1cS6DGnzIxw/xhk5qGKeayAg3poV7ODWpmsnvnYrSnImheCIvfKM0QRsVqCl4LJI
 9/hxeK7DYFr477AhcTvF/pwUhD6V5lhaRpTkU94gDzKYh0Kf99E=
 =kzN2
 -----END PGP SIGNATURE-----

Merge tag 'v1.10.5' of https://github.com/cytopia/devilbox

Release v1.10.5
2022-03-17 04:25:24 +01:00
153 changed files with 5186 additions and 2876 deletions

View File

@ -13,8 +13,8 @@ error_reporting(-1);
putenv('RES_OPTIONS=retrans:1 retry:1 timeout:1 attempts:1'); putenv('RES_OPTIONS=retrans:1 retry:1 timeout:1 attempts:1');
$DEVILBOX_VERSION = 'v1.11.0'; $DEVILBOX_VERSION = 'v3.0.0-beta-0.3';
$DEVILBOX_DATE = '2022-03-22'; $DEVILBOX_DATE = '2023-01-02';
$DEVILBOX_API_PAGE = 'devilbox-api/status.json'; $DEVILBOX_API_PAGE = 'devilbox-api/status.json';
// //

View File

@ -36,31 +36,32 @@ if (loadClass('Helper')->isLoggedIn()) {
// //
else if (isset($_GET['software'])) { else if (isset($_GET['software'])) {
$no = '<span class="text-danger">not installed</span>'; $no = '<span class="text-danger">not installed</span>';
$no_mod = '<span class="text-warning">PHP module not loaded</span>';
$software = array(); $software = array();
if ($_GET['software'] == 'composer') { if ($_GET['software'] == 'angular_cli') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getAngularCliVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'asgardcms_installer') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getAsgardCmsInstallerVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'codeception') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getCodeceptionVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'composer') {
echo json_encode(array( echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getComposerVersion()) !== false) ? $version : $no $_GET['software'] => (($version = loadClass('Php')->getComposerVersion()) !== false) ? $version : $no
)); ));
} }
else if ($_GET['software'] == 'drupalc') { else if ($_GET['software'] == 'deployer') {
echo json_encode(array( echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getDrupalConsoleVersion()) !== false) ? $version : $no $_GET['software'] => (($version = loadClass('Php')->getDeployerVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'drush7') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getDrushVersion(7)) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'drush8') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getDrushVersion(8)) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'drush9') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getDrushVersion(9)) !== false) ? $version : $no
)); ));
} }
else if ($_GET['software'] == 'git') { else if ($_GET['software'] == 'git') {
@ -68,9 +69,24 @@ if (loadClass('Helper')->isLoggedIn()) {
$_GET['software'] => (($version = loadClass('Php')->getGitVersion()) !== false) ? $version : $no $_GET['software'] => (($version = loadClass('Php')->getGitVersion()) !== false) ? $version : $no
)); ));
} }
else if ($_GET['software'] == 'laravel') { else if ($_GET['software'] == 'grunt_cli') {
echo json_encode(array( echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getLaravelVersion()) !== false) ? $version : $no $_GET['software'] => (($version = loadClass('Php')->getGruntCliVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'gulp') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getGulpVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'laravel_installer') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getLaravelInstallerVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'laravel_lumen') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getLaravelLumenVersion()) !== false) ? $version : $no
)); ));
} }
else if ($_GET['software'] == 'mds') { else if ($_GET['software'] == 'mds') {
@ -78,6 +94,11 @@ if (loadClass('Helper')->isLoggedIn()) {
$_GET['software'] => (($version = loadClass('Php')->getMdsVersion()) !== false) ? $version : $no $_GET['software'] => (($version = loadClass('Php')->getMdsVersion()) !== false) ? $version : $no
)); ));
} }
else if ($_GET['software'] == 'mupdf_tools') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getMupdfToolsVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'node') { else if ($_GET['software'] == 'node') {
echo json_encode(array( echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getNodeVersion()) !== false) ? $version : $no $_GET['software'] => (($version = loadClass('Php')->getNodeVersion()) !== false) ? $version : $no
@ -88,20 +109,56 @@ if (loadClass('Helper')->isLoggedIn()) {
$_GET['software'] => (($version = loadClass('Php')->getNpmVersion()) !== false) ? $version : $no $_GET['software'] => (($version = loadClass('Php')->getNpmVersion()) !== false) ? $version : $no
)); ));
} }
else if ($_GET['software'] == 'phalcon') { else if ($_GET['software'] == 'phalcon_devtools') {
if (!extension_loaded('phalcon')) {
echo json_encode(array( echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getPhalconVersion()) !== false) ? $version : $no $_GET['software'] => $no_mod
));
} else {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getPhalconDevtoolsVersion()) !== false) ? $version : $no
)); ));
} }
else if ($_GET['software'] == 'symfony') { }
else if ($_GET['software'] == 'phpunit') {
echo json_encode(array( echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getSymfonyVersion()) !== false) ? $version : $no $_GET['software'] => (($version = loadClass('Php')->getPhpunitVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'stylelint') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getStylelintVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'symfony_cli') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getSymfonyCliVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'vue_cli') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getVueCliVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'webpack_cli') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getWebpackCliVersion()) !== false) ? $version : $no
)); ));
} }
else if ($_GET['software'] == 'wpcli') { else if ($_GET['software'] == 'wpcli') {
echo json_encode(array( echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getWpcliVersion()) !== false) ? $version : $no $_GET['software'] => (($version = loadClass('Php')->getWpcliVersion()) !== false) ? $version : $no
)); ));
}
else if ($_GET['software'] == 'wscat') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getWscatVersion()) !== false) ? $version : $no
));
}
else if ($_GET['software'] == 'yarn') {
echo json_encode(array(
$_GET['software'] => (($version = loadClass('Php')->getYarnVersion()) !== false) ? $version : $no
));
} else { } else {
echo json_encode(array($_GET['software'] => 'unknown software')); echo json_encode(array($_GET['software'] => 'unknown software'));
} }

View File

@ -1,22 +0,0 @@
class HtmlEmail extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
let emailContent;
const templateId = this.dataset.templateId;
try {
emailContent = document.getElementById(templateId).innerHTML;
} catch (error) {
console.log(error);
return;
}
const container = document.createElement('div');
container.innerHTML = emailContent;
this.shadowRoot.appendChild(container);
}
}
customElements.define('html-email', HtmlEmail);

View File

@ -0,0 +1,179 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<?php
// TODO: This is currently a temporary hack to talk to supervisor on the HTTPD server
function run_supervisor_command($command) {
$supervisor_config_file = '/tmp/supervisorctl.conf';
$port = getenv('SVCTL_LISTEN_PORT');
$user = getenv('SVCTL_USER');
$pass = getenv('SVCTL_PASS');
$content = "[supervisorctl]\n";
$content .= "serverurl=http://httpd:" . $port . "\n";
$content .= "username=" . $user . "\n";
$content .= "password=" . $pass . "\n";
$fp = fopen($supervisor_config_file, 'w');
fwrite($fp, $content);
fclose($fp);
return loadClass('Helper')->exec('supervisorctl -c ' . $supervisor_config_file . ' ' . $command);
}
?>
<?php if ( isset($_POST['watcherd']) && $_POST['watcherd'] == 'reload' ) {
run_supervisor_command('restart watcherd');
sleep(1);
loadClass('Helper')->redirect('/cnc.php');
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<?php echo loadClass('Html')->getHead(true); ?>
</head>
<body>
<?php echo loadClass('Html')->getNavbar(); ?>
<div class="container">
<h1>Command & Control</h1>
<br/>
<br/>
<div class="row">
<div class="col-md-12">
<?php
$status_w = run_supervisor_command('status watcherd');
$status_h = run_supervisor_command('status httpd');
$words = preg_split("/\s+/", $status_w);
$data_w = array(
'name' => isset($words[0]) ? $words[0] : '',
'state' => isset($words[1]) ? $words[1] : '',
'pid' => isset($words[3]) ? preg_replace('/,$/', '', $words[3]) : '',
'uptime' => isset($words[5]) ? $words[5] : '',
);
$words = preg_split("/\s+/", $status_h);
$data_h = array(
'name' => isset($words[0]) ? $words[0] : '',
'state' => isset($words[1]) ? $words[1] : '',
'pid' => isset($words[3]) ? preg_replace('/,$/', '', $words[3]) : '',
'uptime' => isset($words[5]) ? $words[5] : '',
);
?>
<h3>Daemon overview</h3><br/>
<p>If you made any changes to vhost settings (vhost-gen templates or backend configuration) or to the webserver configuration itself, you can trigger a manual reload of <code>watcherd</code> here to apply them. No need to restart the Docker Compose stack.</p>
<table class="table table-striped">
<thead class="thead-inverse">
<tr>
<th>Daemon</th>
<th>Status</th>
<th>Pid</th>
<th>Uptime</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td><?php echo $data_w['name']; ?></td>
<td><?php echo $data_w['state']; ?></td>
<td><?php echo $data_w['pid']; ?></td>
<td><?php echo $data_w['uptime']; ?></td>
<td><form method="post"><button type="submit" name="watcherd" value="reload" class="btn btn-primary">Reload</button></form></td>
</tr>
<tr>
<td><?php echo $data_h['name']; ?></td>
<td><?php echo $data_h['state']; ?></td>
<td><?php echo $data_h['pid']; ?></td>
<td><?php echo $data_h['uptime']; ?></td>
<td></td>
</tr>
</tbody>
</table>
<br/>
<br/>
<h3>watcherd stderr</h3>
<br/>
<?php
$output = run_supervisor_command('tail -1000000 watcherd stderr');
echo '<pre>';
foreach(preg_split("/((\r?\n)|(\r\n?))/", $output) as $line) {
if ( strpos($line, "[ERR]") !== false ) {
echo '<span style="color: #ff0000">' . $line . '</span>';
} else if ( strpos($line, "[emerg]") !== false ) {
echo '<span style="color: #ff0000">' . $line . '</span>';
} else if ( strpos($line, "Syntax error") !== false ) {
echo '<span style="color: #ff0000">' . $line . '</span>';
} else if ( strpos($line, "[WARN]") !== false ) {
echo '<span style="color: #ccaa00">' . $line . '</span>';
} else {
echo $line;
}
echo "\n";
}
echo '</pre>';
?>
<h3>watcherd stdout</h3>
<br/>
<?php
$output = run_supervisor_command('tail -1000000 watcherd');
echo '<pre>';
foreach(preg_split("/((\r?\n)|(\r\n?))/", $output) as $line) {
$pos_info = strpos($line, "[INFO]");
$pos_ok = strpos($line, "[OK]");
if ( $pos_ok !== false ) {
echo '<span style="color: #669a00"><strong>' . $line . '</strong></span>';
} else if ( $pos_info !== false && $pos_info == 0 ) {
echo '<span style="color: #0088cd">' . $line . '</span>';
} else {
echo $line;
}
echo "\n";
}
echo '</pre>';
?>
</div>
</div>
</div><!-- /.container -->
<?php echo loadClass('Html')->getFooter(); ?>
<script>
$(function() {
$('.subject').click(function() {
const id = ($(this).attr('id'));
const row = $('#mail-'+id);
row.toggle();
const bodyElement = row.find('.email-body')[0];
if(bodyElement.shadowRoot !== null){
// We've already fetched the message content.
return;
}
bodyElement.attachShadow({ mode: 'open' });
bodyElement.shadowRoot.innerHTML = 'Loading...';
$.get('?get-body=' + id, function(response){
response = JSON.parse(response);
row.find('.raw-email-body').html(response.raw);
const body = response.body;
if(body === null){
row.find('.alert').show();
}
else{
bodyElement.shadowRoot.innerHTML = body;
}
})
})
// Handler for .ready() called.
});
</script>
</body>
</html>

View File

@ -334,10 +334,121 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
<div class="row"> <div class="row">
<div class="col-lg-4 col-md-6 col-sm-12 col-xs-12 col-margin"> <div class="col-lg-4 col-md-6 col-sm-12 col-xs-12 col-margin">
<div class="dash-box"> <div class="dash-box">
<div class="dash-box-head"><i class="fa fa-info-circle" aria-hidden="true"></i> PHP Container Setup</div> <div class="dash-box-head"><i class="fa fa-info-circle" aria-hidden="true"></i> Available CLI Tools</div>
<div class="dash-box-body"> <div class="dash-box-body">
<p><small>You can also enter the php container via <code style="background-color:#3d3d3d;">./shell.sh</code> and use the following cli tools:</small></p>
<table class="table table-striped table-hover table-bordered table-sm font-small">
<thead class="thead-inverse">
<tr>
<th colspan="2">Tools</th>
</tr>
</thead>
<tbody>
<tr>
<th style="width: 50%;">Angular Cli</th>
<td id="app_angular_cli"></td>
</tr>
<tr>
<th>AsgardCMS Installer</th>
<td id="app_asgardcms_installer"></td>
</tr>
<tr>
<th>Codeception</th>
<td id="app_codeception"></td>
</tr>
<tr>
<th>Composer</th>
<td id="app_composer"></td>
</tr>
<tr>
<th>Deployer</th>
<td id="app_deployer"></td>
</tr>
<tr>
<th>Git</th>
<td id="app_git"></td>
</tr>
<tr>
<th>Grunt Cli</th>
<td id="app_grunt_cli"></td>
</tr>
<tr>
<th>Gulp</th>
<td id="app_gulp"></td>
</tr>
<tr>
<th>Laravel Installer</th>
<td id="app_laravel_installer"></td>
</tr>
<tr>
<th>Laravel Lumen</th>
<td id="app_laravel_lumen"></td>
</tr>
<tr>
<th>Mupdf Tools</th>
<td id="app_mupdf_tools"></td>
</tr>
<tr>
<th>mysqldump-secure</th>
<td id="app_mds"></td>
</tr>
<tr>
<th>Node</th>
<td id="app_node"></td>
</tr>
<tr>
<th>Npm</th>
<td id="app_npm"></td>
</tr>
<tr>
<th>Phalcon Devtools</th>
<td id="app_phalcon_devtools"></td>
</tr>
<tr>
<th>Phpunit</th>
<td id="app_phpunit"></td>
</tr>
<tr>
<th>Stylelint</th>
<td id="app_stylelint"></td>
</tr>
<tr>
<th>Symfony Cli</th>
<td id="app_symfony_cli"></td>
</tr>
<tr>
<th>Vue Cli</th>
<td id="app_vue_cli"></td>
</tr>
<tr>
<th>Webpack Cli</th>
<td id="app_webpack_cli"></td>
</tr>
<tr>
<th>Wordpress Cli</th>
<td id="app_wpcli"></td>
</tr>
<tr>
<th>Wscat</th>
<td id="app_wscat"></td>
</tr>
<tr>
<th>Yarn</th>
<td id="app_yarn"></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-lg-4 col-md-6 col-sm-12 col-xs-12 offset-lg-4 offset-md-0 offset-sm-0 col-margin">
<div class="dash-box">
<div class="dash-box-head"><i class="fa fa-info-circle" aria-hidden="true"></i> PHP Container Status</div>
<div class="dash-box-body">
<p><small>You have made the following base configuration to the Devilbox:</small></p>
<table class="table table-striped table-hover table-bordered table-sm font-small"> <table class="table table-striped table-hover table-bordered table-sm font-small">
<p><small>You can also enter the php container and work from inside. The following is available inside the container:</small></p>
<thead class="thead-inverse"> <thead class="thead-inverse">
<tr> <tr>
<th colspan="2">Settings</th> <th colspan="2">Settings</th>
@ -374,78 +485,7 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p><small>The PHP container can connect to the following services via the specified hostnames and IP addresses.</small></p>
<table class="table table-striped table-hover table-bordered table-sm font-small">
<thead class="thead-inverse">
<tr>
<th colspan="2">Tools</th>
</tr>
</thead>
<tbody>
<tr>
<th>composer</th>
<td id="app_composer"></td>
</tr>
<tr>
<th>drupal-console</th>
<td id="app_drupalc"></td>
</tr>
<tr>
<th>drush7</th>
<td id="app_drush7"></td>
</tr>
<tr>
<th>drush8</th>
<td id="app_drush8"></td>
</tr>
<tr>
<th>drush9</th>
<td id="app_drush9"></td>
</tr>
<tr>
<th>git</th>
<td id="app_git"></td>
</tr>
<tr>
<th>Laravel installer</th>
<td id="app_laravel"></td>
</tr>
<tr>
<th>mysqldump-secure</th>
<td id="app_mds"></td>
</tr>
<tr>
<th>node</th>
<td id="app_node"></td>
</tr>
<tr>
<th>npm</th>
<td id="app_npm"></td>
</tr>
<tr>
<th>Phalcon devtools</th>
<td id="app_phalcon"></td>
</tr>
<tr>
<th>Symfony installer</th>
<td id="app_symfony"></td>
</tr>
<tr>
<th>Wordpress cli</th>
<td id="app_wpcli"></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-lg-4 col-md-6 col-sm-12 col-xs-12 offset-lg-4 offset-md-0 offset-sm-0 col-margin">
<div class="dash-box">
<div class="dash-box-head"><i class="fa fa-info-circle" aria-hidden="true"></i> PHP Container Status</div>
<div class="dash-box-body">
<p><small>The PHP Docker can connect to the following services via the specified hostnames and IP addresses.</small></p>
<table class="table table-striped table-hover table-bordered table-sm font-small"> <table class="table table-striped table-hover table-bordered table-sm font-small">
<thead class="thead-inverse"> <thead class="thead-inverse">
<tr> <tr>
@ -913,19 +953,29 @@ $HEALTH_PERCENT = 100 - ceil(100 * $HEALTH_FAILS / $HEALTH_TOTAL);
xhttp.open('GET', '_ajax_callback.php?software='+app, true); xhttp.open('GET', '_ajax_callback.php?software='+app, true);
xhttp.send(); xhttp.send();
} }
updateVersions('angular_cli');
updateVersions('asgardcms_installer');
updateVersions('codeception');
updateVersions('composer'); updateVersions('composer');
updateVersions('drupalc'); updateVersions('deployer');
updateVersions('drush7');
updateVersions('drush8');
updateVersions('drush9');
updateVersions('git'); updateVersions('git');
updateVersions('laravel'); updateVersions('grunt_cli');
updateVersions('gulp');
updateVersions('laravel_installer');
updateVersions('laravel_lumen');
updateVersions('mds'); updateVersions('mds');
updateVersions('mupdf_tools');
updateVersions('node'); updateVersions('node');
updateVersions('npm'); updateVersions('npm');
updateVersions('phalcon'); updateVersions('phalcon_devtools');
updateVersions('symfony'); updateVersions('phpunit');
updateVersions('stylelint');
updateVersions('symfony_cli');
updateVersions('vue_cli');
updateVersions('webpack_cli');
updateVersions('wpcli'); updateVersions('wpcli');
updateVersions('wscat');
updateVersions('yarn');
})(); })();
</script> </script>
</body> </body>

View File

@ -1,66 +0,0 @@
<?php require '../config.php'; ?>
<?php loadClass('Helper')->authPage(); ?>
<?php
if (!isset($_GET['name'])) {
loadClass('Helper')->redirect('/vhosts.php');
}
if (!strlen($_GET['name'])) {
loadClass('Helper')->redirect('/vhosts.php');
}
$vhost = $_GET['name'];
$found = false;
$vhosts = loadClass('Httpd')->getVirtualHosts();
foreach ($vhosts as $v) {
if ($vhost == $v['name']) {
$found = true;
break;
}
}
// Be safe before using outputs
$vhost = htmlentities($vhost);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<?php echo loadClass('Html')->getHead(true); ?>
</head>
<body>
<?php echo loadClass('Html')->getNavbar(); ?>
<div class="container">
<h1>vhost-gen: <?php echo $vhost;?></h1>
<br/>
<br/>
<div class="row">
<div class="col-md-12">
<?php if (!$found): ?>
<p>The Virtual Host "<?php echo $vhost; ?>" does not exist.</p>
<?php else: ?>
<?php $tpl = loadClass('Httpd')->getVhostgenTemplatePath($vhost); ?>
<?php if (!$tpl): ?>
<p>No custom vhost-gen configuration found for "<?php echo $vhost; ?>".</p>
<?php else: ?>
<p>Note: If the resulting virtual host config does not reflect the vhost-gen template changes, you will need to restart the Devilbox.</p>
<a href="/vhosts.php"><i class="fa fa-chevron-left" aria-hidden="true"></i> Overview</a><br/>
<br/><h3>virtual host config</h3><br/>
<a title="Virtual host: <?php echo $vhost;?>.conf" target="_blank" href="/vhost.d/<?php echo $vhost;?>.conf">
<i class="fa fa-external-link" aria-hidden="true"></i> <?php echo $vhost;?>.conf
</a>
<br/><br/><h3>vhost-gen config</h3><br/>
<code><?php echo $tpl; ?></code><br/><br/>
<?php $lines = file($tpl); ?>
<pre style="border: 1px solid black; padding:5px;"><code><?php foreach ($lines as $line): ?><?php echo $line; ?><?php endforeach; ?></code></pre>
<?php endif; ?>
<?php endif; ?>
</div>
</div>
</div><!-- /.container -->
<?php echo loadClass('Html')->getFooter(); ?>
</body>
</html>

View File

@ -24,6 +24,28 @@ require $VEN_DIR . DIRECTORY_SEPARATOR . 'Mail' . DIRECTORY_SEPARATOR .'mimeDeco
require $LIB_DIR . DIRECTORY_SEPARATOR . 'Mail.php'; require $LIB_DIR . DIRECTORY_SEPARATOR . 'Mail.php';
require $LIB_DIR . DIRECTORY_SEPARATOR . 'Sort.php'; require $LIB_DIR . DIRECTORY_SEPARATOR . 'Sort.php';
if (isset($_GET['get-body']) && is_numeric($_GET['get-body'])) {
$messageNumber = $_GET['get-body'];
$MyMbox = new \devilbox\Mail('/var/mail/devilbox');
$message = $MyMbox->getMessage($messageNumber-1);
$structure = $message['decoded'];
$body = null;
if (isset($structure->body)) {
$body = $structure->body;
}
elseif(isset($structure->parts[1]->body)) {
$body = $structure->parts[1]->body;
}
elseif(isset($structure->parts[0]->body)) {
$body = $structure->parts[0]->body;
}
exit(json_encode(array(
'raw' => htmlentities($message['raw']),
'body' => $body,
)));
}
if (isset($_GET['delete']) && is_numeric($_GET['delete'])) { if (isset($_GET['delete']) && is_numeric($_GET['delete'])) {
$message = $_GET['delete']; $message = $_GET['delete'];
@ -171,17 +193,6 @@ $messages = $MyMbox->get($sortOrderArr);
<?php <?php
$message = htmlentities($data['raw']); $message = htmlentities($data['raw']);
$structure = $data['decoded']; $structure = $data['decoded'];
$body = null;
if (isset($structure->body)) {
$body = $structure->body;
}
elseif(isset($structure->parts[1]->body)) {
$body = $structure->parts[1]->body;
}
elseif(isset($structure->parts[0]->body)) {
$body = $structure->parts[0]->body;
}
?> ?>
<tr id="<?php echo $data['num'];?>" class="subject"> <tr id="<?php echo $data['num'];?>" class="subject">
<td><?php echo $data['num'];?></td> <td><?php echo $data['num'];?></td>
@ -198,17 +209,13 @@ $messages = $MyMbox->get($sortOrderArr);
<tr id="mail-<?php echo $data['num'];?>" style="display:none"> <tr id="mail-<?php echo $data['num'];?>" style="display:none">
<td></td> <td></td>
<td colspan="5"> <td colspan="5">
<?php if ($body !== null): ?> <div class="email-body"></div>
<template id="mail-body-<?=$data['num']?>"><?=$body?></template> <div class="alert alert-warning" role="alert" style="display:none">
<html-email data-template-id="mail-body-<?=$data['num']?>"></html-email>
<?php else: ?>
<div class="alert alert-warning" role="alert">
No valid body found No valid body found
</div> </div>
<?php endif; ?>
<hr> <hr>
<p><a class="btn btn-primary" data-toggle="collapse" href="#email-<?php echo $data['num'];?>" aria-expanded="false" aria-controls="email-<?php echo $data['num'];?>">Raw source</a></p> <p><a class="btn btn-primary" data-toggle="collapse" href="#email-<?php echo $data['num'];?>" aria-expanded="false" aria-controls="email-<?php echo $data['num'];?>">Raw source</a></p>
<div class="collapse" id="email-<?php echo $data['num'];?>"><pre><?php echo $message;?></pre></div> <div class="collapse" id="email-<?php echo $data['num'];?>"><pre class="raw-email-body"></pre></div>
</td> </td>
</tr> </tr>
<?php endforeach; ?> <?php endforeach; ?>
@ -227,12 +234,34 @@ $messages = $MyMbox->get($sortOrderArr);
<script> <script>
$(function() { $(function() {
$('.subject').click(function() { $('.subject').click(function() {
var id = ($(this).attr('id')); const id = ($(this).attr('id'));
$('#mail-'+id).toggle(); const row = $('#mail-'+id);
row.toggle();
const bodyElement = row.find('.email-body')[0];
if(bodyElement.shadowRoot !== null){
// We've already fetched the message content.
return;
}
bodyElement.attachShadow({ mode: 'open' });
bodyElement.shadowRoot.innerHTML = 'Loading...';
$.get('?get-body=' + id, function(response){
response = JSON.parse(response);
row.find('.raw-email-body').html(response.raw);
const body = response.body;
if(body === null){
row.find('.alert').show();
}
else{
bodyElement.shadowRoot.innerHTML = body;
}
})
}) })
// Handler for .ready() called. // Handler for .ready() called.
}); });
</script> </script>
<script src="/assets/js/html-email.js"></script>
</body> </body>
</html> </html>

View File

@ -16,6 +16,7 @@
<p>I am currently the sole creator and maintainer of the Devilbox and all of its required projects.<br/>If you find this useful or if it makes your daily programming life easier, consider donating to keep this project alive.</p> <p>I am currently the sole creator and maintainer of the Devilbox and all of its required projects.<br/>If you find this useful or if it makes your daily programming life easier, consider donating to keep this project alive.</p>
<ul> <ul>
<li><a target="_blank" href="https://github.com/sponsors/cytopia"><strong>GitHub sponsorship</strong></a></li> <li><a target="_blank" href="https://github.com/sponsors/cytopia"><strong>GitHub sponsorship</strong></a></li>
<li><a target="_blank" href="https://opencollective.com/devilbox"><strong>Open Collective</strong></a></li>
<li><a target="_blank" href="https://www.patreon.com/devilbox"><strong>Patreon</strong></a></li> <li><a target="_blank" href="https://www.patreon.com/devilbox"><strong>Patreon</strong></a></li>
</ul> </ul>
<br/> <br/>
@ -39,55 +40,63 @@
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-5.2">docker-php-fpm-5.2</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-5.2">docker-php-fpm-5.2</a></td>
<td>Legacy PHP 5.2 base images (amd64 and i386)</td> <td>Legacy PHP 5.2 base images (<code>amd64</code> and <code>i386</code>)</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-5.3">docker-php-fpm-5.3</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-5.3">docker-php-fpm-5.3</a></td>
<td>Legacy PHP 5.3 base images (amd64 and arm64)</td> <td>Legacy PHP 5.3 base images (<code>amd64</code> and <code>arm64</code>)</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-5.4">docker-php-fpm-5.4</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-5.4">docker-php-fpm-5.4</a></td>
<td>Legacy PHP 5.4 base images (amd64 and arm64)</td> <td>Legacy PHP 5.4 base images (<code>amd64</code> and <code>arm64</code>)</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-5.5">docker-php-fpm-5.5</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-5.5">docker-php-fpm-5.5</a></td>
<td>Legacy PHP 5.5 base images (amd64 and arm64)</td> <td>Legacy PHP 5.5 base images (<code>amd64</code> and <code>arm64</code>)</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-8.0">docker-php-fpm-8.0</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-8.0">docker-php-fpm-8.0</a></td>
<td>PHP 8.0 base images (amd64 and arm64)</td> <td>PHP 8.0 base images (<code>amd64</code> and <code>arm64</code>)</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-8.1">docker-php-fpm-8.1</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-8.1">docker-php-fpm-8.1</a></td>
<td>PHP 8.1 base images (amd64 and arm64)</td> <td>PHP 8.1 base images (<code>amd64</code> and <code>arm64</code>)</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-8.2">docker-php-fpm-8.2</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-8.2">docker-php-fpm-8.2</a></td>
<td>Upcoming PHP 8.2 base images (amd64 and arm64)</td> <td>PHP 8.2 base images (<code>amd64</code> and <code>arm64</code>)</td>
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-8.3">docker-php-fpm-8.3</a></td>
<td>PHP 8.3 base images (<code>amd64</code> and <code>arm64</code>)</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm">docker-php-fpm</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm">docker-php-fpm</a></td>
<td>PHP-FPM Devilbox images</td> <td>PHP-FPM Devilbox images (<code>amd64</code> and <code>arm64</code>)</td>
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-php-fpm-community">docker-php-fpm-community</a></td>
<td>PHP-FPM Community images (<code>amd64</code> and <code>arm64</code>)</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-mysql">docker-mysql</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-mysql">docker-mysql</a></td>
<td>MySQL, MariaDB and PerconaDB images (amd64 and arm64)</td> <td>MySQL, MariaDB and PerconaDB images (<code>amd64</code> and <code>arm64</code>)</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-apache-2.2">docker-apache-2.2</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-apache-2.2">docker-apache-2.2</a></td>
<td>Apache 2.2 images (amd64 and arm64)</td> <td>Apache 2.2 images (<code>amd64</code> and <code>arm64</code>)</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-apache-2.4">docker-apache-2.4</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-apache-2.4">docker-apache-2.4</a></td>
<td>Apache 2.4 images (amd64 and arm64)</td> <td>Apache 2.4 images (<code>amd64</code> and <code>arm64</code>)</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-nginx-stable">docker-nginx-stable</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-nginx-stable">docker-nginx-stable</a></td>
<td>Nginx stable images (amd64 and arm64)</td> <td>Nginx stable images (<code>amd64</code> and <code>arm64</code>)</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-nginx-mainline">docker-nginx-mainline</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-nginx-mainline">docker-nginx-mainline</a></td>
<td>Nginx mainline images (amd64 and arm64)</td> <td>Nginx mainline images (<code>amd64</code> and <code>arm64</code>)</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-haproxy">docker-haproxy</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-haproxy">docker-haproxy</a></td>
@ -95,7 +104,7 @@
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-ngrok">docker-ngrok</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-ngrok">docker-ngrok</a></td>
<td>Ngrok image</td> <td>Ngrok image (<code>amd64</code> and <code>arm64</code>)</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-varnish">docker-varnish</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/devilbox/docker-varnish">docker-varnish</a></td>
@ -142,15 +151,19 @@
<td>Re-usable GitHub Action Workflows</td> <td>Re-usable GitHub Action Workflows</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/shell-command-retry-action">shell-command-retry-action</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/shell-command-retry-action">shell-command-retry</a></td>
<td>GitHub Action</td> <td>GitHub Action</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/docker-tag-action">docker-tag-action</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/docker-tag-action">docker-tag</a></td>
<td>GitHub Action</td> <td>GitHub Action</td>
</tr> </tr>
<tr> <tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/git-ref-matrix-action">git-ref-matrix-action</a></td> <td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/git-ref-matrix-action">git-ref-matrix</a></td>
<td>GitHub Action</td>
</tr>
<tr>
<td><i class="fa fa-github-alt" aria-hidden="true"></i> <a target="_blank" href="https://github.com/cytopia/upload-artifact-verify-action">upload-artifact-verify</a></td>
<td>GitHub Action</td> <td>GitHub Action</td>
</tr> </tr>
<tr> <tr>

View File

@ -76,6 +76,7 @@ class Connection {
// Detect version and choose appropriate database driver // Detect version and choose appropriate database driver
switch (substr($version,0,2)) { switch (substr($version,0,2)) {
case '15': return 'Postgres';break;
case '14': return 'Postgres';break; case '14': return 'Postgres';break;
case '13': return 'Postgres13';break; case '13': return 'Postgres13';break;
case '12': return 'Postgres12';break; case '12': return 'Postgres12';break;

View File

@ -24,31 +24,95 @@
<tr> <tr>
<th>Project</th> <th>Project</th>
<th>DocumentRoot</th> <th>DocumentRoot</th>
<th>Backend</th>
<th>Config</th> <th>Config</th>
<th>Valid</th> <th style="width:60px;">Valid</th>
<th>URL</th> <th style="width:260px;">URL</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<?php
$totals = 70;
$filler = '&nbsp;';
for ($i=0; $i<$totals; $i++) {
$filler = $filler. '&nbsp;';
}
?>
<?php foreach ($vHosts as $vHost): ?> <?php foreach ($vHosts as $vHost): ?>
<tr> <tr>
<td><?php echo $vHost['name'];?></td> <td><?php echo $vHost['name'];?></td>
<td><?php echo loadClass('Helper')->getEnv('HOST_PATH_HTTPD_DATADIR');?>/<?php echo $vHost['name'];?>/<?php echo loadClass('Helper')->getEnv('HTTPD_DOCROOT_DIR');?></td> <td><?php echo loadClass('Helper')->getEnv('HOST_PATH_HTTPD_DATADIR');?>/<?php echo $vHost['name'];?>/<?php echo loadClass('Helper')->getEnv('HTTPD_DOCROOT_DIR');?></td>
<td><?php echo loadClass('Httpd')->getVhostBackend($vHost['name']); ?></td>
<td> <td>
<a title="Virtual host: <?php echo $vHost['name'];?>.conf" target="_blank" href="/vhost.d/<?php echo $vHost['name'];?>.conf"><i class="fa fa-cog" aria-hidden="true"></i></a> <?php $id_vhost_httpd = str_replace('=', '', base64_encode('vhost_httpd_conf_' . $vHost['name'])); ?>
<?php if (($vhostGen = loadClass('Httpd')->getVhostgenTemplatePath($vHost['name'])) !== false): ?> <?php $id_vhost_vhostgen = str_replace('=', '', base64_encode('vhost_vhost_gen_' . $vHost['name'])); ?>
<a title="vhost-gen: <?php echo basename($vhostGen);?> for <?php echo $vHost['name'];?>" href="/info_vhostgen.php?name=<?php echo $vHost['name'];?>"><i class="fa fa-filter" aria-hidden="true"></i></a>
<!-- [httpd.conf] Button trigger modal -->
<a href="#"><i class="fa fa-cog" aria-hidden="true" data-toggle="modal" data-target="#<?php echo $id_vhost_httpd;?>"></i></a>
<!-- [httpd.conf] Modal -->
<div class="modal" id="<?php echo $id_vhost_httpd;?>" tabindex="-1" role="dialog" aria-labelledby="<?php echo $id_vhost_httpd;?>Label" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="<?php echo $id_vhost_httpd;?>Label"><?php echo '<strong>httpd.conf: </strong><code>'.$vHost['name'].'.'.loadClass('Httpd')->getTldSuffix(). '</code>'; ?></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<?php $url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]"; ?>
<?php $src = file_get_contents($url.'/vhost.d/' . $vHost['name'] . '.conf'); ?>
<?php //$src = htmlentities($src); ?>
<?php $src = str_replace('<', '&lt;', $src); ?>
<?php $src = str_replace('>', '&gt;', $src); ?>
<?php $src = preg_replace('/&lt;(\/?.*)&gt;/m', '<strong>&lt;\1&gt;</strong>', $src); // Apache directives ?>
<?php $src = preg_replace('/(.*{\s*)$/m', '<strong>\1</strong>', $src); // Nginx directives ?>
<?php $src = preg_replace('/^(\s*}\s*)$/m', '<strong>\1</strong>', $src); // Nginx directives ?>
<?php //$src = preg_replace('/"(.+)"/m', '<span style="color: blue;">"\1"</span>', $src); ?>
<?php $src = preg_replace('/^(\s*(?!<#)[^#"]*)"(.*)"/m', '\1<span style="color: blue;">"\2"</span>', $src); // double quotes?>
<?php $src = preg_replace("/^(\s*(?!<#)[^#']*)'(.*)'/m", '\1<span style="color: blue;">"\2"</span>', $src); // single quotes ?>
<?php $src = preg_replace('/^(\s*#)(.*)$/m', '<span style="color: gray;">\1\2</span>', $src); // comments ?>
<?php echo '<pre><code>' . $src . '</code></pre>';?>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<?php if (($vhostGenPath = loadClass('Httpd')->getVhostgenTemplatePath($vHost['name'])) !== false): ?>
<!-- [vhost-gen] Button trigger modal -->
<a href="#"><i class="fa fa-filter" aria-hidden="true" data-toggle="modal" data-target="#<?php echo $id_vhost_vhostgen;?>"></i></a>
<!-- [vhost-gen] Modal -->
<div class="modal" id="<?php echo $id_vhost_vhostgen;?>" tabindex="-1" role="dialog" aria-labelledby="<?php echo $id_vhost_vhostgen;?>Label" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="<?php echo $id_vhost_vhostgen;?>Label"><?php echo '<code>'.$vhostGenPath.'</code>'; ?></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<?php $src = file_get_contents($vhostGenPath); ?>
<?php //$src = htmlentities($src); ?>
<?php $src = str_replace('<', '&lt;', $src); ?>
<?php $src = str_replace('>', '&gt;', $src); ?>
<?php $src = preg_replace('/&lt;(\/?.*)&gt;/m', '<strong>&lt;\1&gt;</strong>', $src); // Apache directives ?>
<?php $src = preg_replace('/(.*{\s*)$/m', '<strong>\1</strong>', $src); // Nginx directives ?>
<?php $src = preg_replace('/^(\s*}\s*)$/m', '<strong>\1</strong>', $src); // Nginx directives ?>
<?php //$src = preg_replace('/"(.+)"/m', '<span style="color: blue;">"\1"</span>', $src); ?>
<?php //$src = preg_replace("/'(.+)'/m", '<span style="color: blue;">'."'".'\1'."'".'</span>', $src); ?>
<?php $src = preg_replace('/^(\s*(?!<#)[^#"]*)"(.*)"/m', '\1<span style="color: blue;">"\2"</span>', $src); // double quotes ?>
<?php $src = preg_replace("/^(\s*(?!<#)[^#']*)'(.*)'/m", '\1<span style="color: blue;">"\2"</span>', $src); // single quotes ?>
<?php $src = preg_replace('/^(\s*#)(.*)$/m', '<span style="color: gray;">\1\2</span>', $src); // comments ?>
<?php $src = preg_replace('/^(\s*[_a-z]+):/m', '<span style="color: green;"><strong>\1</strong></span>:', $src); // yaml keys ?>
<?php $src = preg_replace('/(__[_A-Z]+__)/m', '<span style="color: red;">\1</span>', $src); // variables ?>
<?php echo '<pre><code>' . $src . '</code></pre>';?>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<?php endif; ?> <?php endif; ?>
</td> </td>
<td class="text-xs-center text-xs-small" id="valid-<?php echo $vHost['name'];?>">&nbsp;&nbsp;&nbsp;</td> <td class="text-xs-center text-xs-small" id="valid-<?php echo $vHost['name'];?>"></td>
<td id="href-<?php echo $vHost['name'];?>"><?php echo $filler;?></td> <td id="href-<?php echo $vHost['name'];?>"></td>
</tr> </tr>
<input type="hidden" name="vhost[]" class="vhost" value="<?php echo $vHost['name'];?>" /> <input type="hidden" name="vhost[]" class="vhost" value="<?php echo $vHost['name'];?>" />
<?php endforeach; ?> <?php endforeach; ?>
@ -63,6 +127,60 @@
</div> </div>
</div> </div>
<?php
$cmd="netstat -wneeplt 2>/dev/null | sort | grep '\s1000\s' | awk '{print \"app=\"\$9\"|addr=\"\$4}' | sed 's/\(app=\)\([0-9]*\/\)/\\1/g' | sed 's/\(.*\)\(:[0-9][0-9]*\)/\\1|port=\\2/g' | sed 's/port=:/port=/g'";
$output=loadClass('Helper')->exec($cmd);
$daemons = array();
foreach (preg_split("/((\r?\n)|(\r\n?))/", $output) as $line) {
$section = preg_split("/\|/", $line);
if (count($section) == 3) {
$tool = preg_split("/=/", $section[0]);
$addr = preg_split("/=/", $section[1]);
$port = preg_split("/=/", $section[2]);
$tool = $tool[1];
$addr = $addr[1];
$port = $port[1];
$daemons[] = array(
'tool' => $tool,
'addr' => $addr,
'port' => $port
);
}
}
?>
<?php if (count($daemons)): ?>
<br/>
<br/>
<div class="row">
<div class="col-md-12">
<h2>Local listening daemons</h2>
<table class="table table-striped">
<thead class="thead-inverse">
<tr>
<th>Application</th>
<th>Listen Address</th>
<th>Listen Port</th>
<th>Host</th>
</tr>
</thead>
<tbody>
<?php foreach ($daemons as $daemon): ?>
<tr>
<td><?php echo $daemon['tool']; ?></td>
<td><?php echo $daemon['addr']; ?></td>
<td><?php echo $daemon['port']; ?></td>
<td>php (172.16.238.10)</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
<?php endif; ?>
</div><!-- /.container --> </div><!-- /.container -->
<?php echo loadClass('Html')->getFooter(); ?> <?php echo loadClass('Html')->getFooter(); ?>
@ -81,7 +199,7 @@
var el_valid; var el_valid;
var el_href; var el_href;
if (this.readyState == 4 && this.status == 200) { if (this.readyState == 4 && this.status == 200 || this.status == 426) {
el_valid = document.getElementById('valid-' + vhost); el_valid = document.getElementById('valid-' + vhost);
el_href = document.getElementById('href-' + vhost); el_href = document.getElementById('href-' + vhost);
error = this.responseText; error = this.responseText;
@ -127,13 +245,14 @@
var el_href = document.getElementById('href-' + vhost); var el_href = document.getElementById('href-' + vhost);
var error = this.responseText; var error = this.responseText;
if (this.readyState == 4 && this.status == 200) { if (this.readyState == 4 && (this.status == 200 || this.status == 426)) {
clearTimeout(xmlHttpTimeout); clearTimeout(xmlHttpTimeout);
el_valid.className += ' bg-success'; el_valid.className += ' bg-success';
if (el_valid.innerHTML != 'WARN') { if (el_valid.innerHTML != 'WARN') {
el_valid.innerHTML = 'OK'; el_valid.innerHTML = 'OK';
} }
el_href.innerHTML = '<a target="_blank" href="'+proto+'//'+name+port+'">'+name+port+'</a>' + el_href.innerHTML; //el_href.innerHTML = '(<a target="_blank" href="'+proto+'//localhost/devilbox-project/'+name+'">ext</a>) <a target="_blank" href="'+proto+'//'+name+port+'">'+name+port+'</a>' + el_href.innerHTML;
el_href.innerHTML = '<a target="_blank" href="'+proto+'//'+name+port+'">'+name+port+'</a>';
} else { } else {
//console.log(vhost); //console.log(vhost);
} }

View File

@ -18,6 +18,10 @@ class Html
'name' => 'Virtual Hosts', 'name' => 'Virtual Hosts',
'path' => '/vhosts.php' 'path' => '/vhosts.php'
), ),
array(
'name' => 'C&C',
'path' => '/cnc.php'
),
array( array(
'name' => 'Emails', 'name' => 'Emails',
'path' => '/mail.php' 'path' => '/mail.php'
@ -263,7 +267,7 @@ HTML;
<nav class="navbar navbar-toggleable-md navbar-inverse bg-inverse footer"> <nav class="navbar navbar-toggleable-md navbar-inverse bg-inverse footer">
<div class="container justify-content-end"> <div class="container justify-content-end">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<li class="nav-item nav-link">Render time: ${render_time} sec</li> <li class="nav-item nav-link">Render time: {$render_time} sec</li>
<li class="nav-item"><a class="nav-link" target="_blank" href="https://github.com/cytopia/devilbox"><code>Github</code></a></li> <li class="nav-item"><a class="nav-link" target="_blank" href="https://github.com/cytopia/devilbox"><code>Github</code></a></li>
<li class="nav-item"><a class="nav-link" href="/credits.php"><code>Credits</code></a></li> <li class="nav-item"><a class="nav-link" href="/credits.php"><code>Credits</code></a></li>
<li class="nav-item"><a class="nav-link" href="/support.php"><code>Support</code></a></li> <li class="nav-item"><a class="nav-link" href="/support.php"><code>Support</code></a></li>

View File

@ -70,6 +70,22 @@ class Mail
} }
/**
* Returns a single message
*
* @param int $messageIndex The zero-based index of the message to return.
*/
public function getMessage($messageIndex){
$message = $this->_Mbox->get($messageIndex);
$Decoder = new \Mail_mimeDecode($message, "\r\n");
return array(
'num' => $messageIndex + 1,
'raw' => $message,
'decoded' => $Decoder->decode($this->_defaultMimeParams)
);
}
/** /**
* Retrieve emails. * Retrieve emails.
* *
@ -87,13 +103,7 @@ class Mail
// Get messages in reverse order (last entry first) // Get messages in reverse order (last entry first)
for ($n = $total; $n >= 0; --$n) { for ($n = $total; $n >= 0; --$n) {
$message = $this->_Mbox->get($n); $messages[] = $this->getMessage($n);
$Decoder = new \Mail_mimeDecode($message, "\r\n");
$messages[] = array(
'num' => $n + 1,
'raw' => $message,
'decoded' => $Decoder->decode($this->_defaultMimeParams)
);
} }
// Optionally sort messages // Optionally sort messages

View File

@ -29,11 +29,19 @@ class Httpd extends BaseClass implements BaseInterface
$url = 'http://'.$domain; $url = 'http://'.$domain;
$error = array(); $error = array();
$backend = $this->getVhostBackend($vhost);
$pos_def = strpos($backend, 'default');
$pos_phpfpm = strpos($backend, 'tcp://');
// Only if backend 'default' or 'phpfpm', we need a htdocs/ directory
if ( ($pos_def !== false && $pos_def == 0) || ($pos_phpfpm !== false && $pos_phpfpm == 0) ) {
// 1. Check htdocs folder // 1. Check htdocs folder
if (!$this->_is_valid_dir($docroot)) { if (!$this->_is_valid_dir($docroot)) {
$error[] = 'error'; $error[] = 'error';
$error[] = 'Missing <strong>'.$htdocs.'</strong> directory in: <strong>'.loadClass('Helper')->getEnv('HOST_PATH_HTTPD_DATADIR').'/'.$vhost.'/</strong>'; $error[] = 'Missing <strong>'.$htdocs.'</strong> directory in: <strong>'.loadClass('Helper')->getEnv('HOST_PATH_HTTPD_DATADIR').'/'.$vhost.'/</strong>';
} }
}
// 2. Check internal DNS server // 2. Check internal DNS server
$err = false; $err = false;
@ -196,6 +204,33 @@ class Httpd extends BaseClass implements BaseInterface
return false; return false;
} }
public function getVhostBackend($vhost)
{
$dir = loadClass('Helper')->getEnv('HTTPD_TEMPLATE_DIR');
$name = 'backend.cfg';
$file = '/shared/httpd/'.$vhost.'/'.$dir.'/'.$name;
if (!file_exists($file)) {
return 'default';
}
$fp = fopen($file, 'r');
$cont = stream_get_contents($fp);
fclose($fp);
// conf:<type>:<proto>:<server>:<port>
$arr = explode(':', $cont);
$type = $arr[1];
$prot = $arr[2];
$addr = ''; // this may contain ':' itself due to IPv6 addresses
for ($i=3; $i<(count($arr)-1); $i++) {
$addr .= $arr[$i];
}
$port = $arr[count($arr) - 1];
return $prot.'://'.$addr.':'.$port;
}
/********************************************************************************* /*********************************************************************************
* *

View File

@ -71,7 +71,8 @@ class Pgsql extends BaseClass implements BaseInterface
public function __destruct() public function __destruct()
{ {
if ($this->_link) { if ($this->_link) {
pg_close($this->_link); // DO NOT CLOSE. It is kind of shared.
//pg_close($this->_link);
} }
} }
@ -148,7 +149,7 @@ class Pgsql extends BaseClass implements BaseInterface
// Get schemas for each database // Get schemas for each database
foreach ($databases as $name => &$database) { foreach ($databases as $name => &$database) {
$PSQL = new Pgsql( $PSQL = new Pgsql(
$this->getIpAddress(), $GLOBALS['PGSQL_HOST_NAME'],
array( array(
'user' => loadClass('Helper')->getEnv('PGSQL_ROOT_USER'), 'user' => loadClass('Helper')->getEnv('PGSQL_ROOT_USER'),
'pass' => loadClass('Helper')->getEnv('PGSQL_ROOT_PASSWORD'), 'pass' => loadClass('Helper')->getEnv('PGSQL_ROOT_PASSWORD'),
@ -179,7 +180,7 @@ class Pgsql extends BaseClass implements BaseInterface
public function getSchemaSize($database, $schema) public function getSchemaSize($database, $schema)
{ {
$PSQL = new Pgsql( $PSQL = new Pgsql(
$this->getIpAddress(), $GLOBALS['PGSQL_HOST_NAME'],
array( array(
'user' => loadClass('Helper')->getEnv('PGSQL_ROOT_USER'), 'user' => loadClass('Helper')->getEnv('PGSQL_ROOT_USER'),
'pass' => loadClass('Helper')->getEnv('PGSQL_ROOT_PASSWORD'), 'pass' => loadClass('Helper')->getEnv('PGSQL_ROOT_PASSWORD'),
@ -217,7 +218,7 @@ class Pgsql extends BaseClass implements BaseInterface
public function getTableCount($database, $schema) public function getTableCount($database, $schema)
{ {
$PSQL = new Pgsql( $PSQL = new Pgsql(
$this->getIpAddress(), $GLOBALS['PGSQL_HOST_NAME'],
array( array(
'user' => loadClass('Helper')->getEnv('PGSQL_ROOT_USER'), 'user' => loadClass('Helper')->getEnv('PGSQL_ROOT_USER'),
'pass' => loadClass('Helper')->getEnv('PGSQL_ROOT_PASSWORD'), 'pass' => loadClass('Helper')->getEnv('PGSQL_ROOT_PASSWORD'),

View File

@ -35,9 +35,19 @@ class Php extends BaseClass implements BaseInterface
$uid = loadClass('Helper')->egrep('/[0-9]+/', $uid); $uid = loadClass('Helper')->egrep('/[0-9]+/', $uid);
return $uid; return $uid;
} }
public function getGitVersion() public function getAngularCliVersion()
{ {
$output = loadClass('Helper')->exec('git --version 2>/dev/null', $output); $output = loadClass('Helper')->exec('ng version 2>/dev/null | grep -i "^Angular CLI" | head -1', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getAsgardCmsInstallerVersion()
{
$output = loadClass('Helper')->exec('asgardcms --version --no-ansi 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getCodeceptionVersion()
{
$output = loadClass('Helper')->exec('codecept --version --no-ansi 2>/dev/null | grep -i ^Codecept', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output); return loadClass('Helper')->egrep('/[0-9.]+/', $output);
} }
public function getComposerVersion() public function getComposerVersion()
@ -45,15 +55,45 @@ class Php extends BaseClass implements BaseInterface
$output = loadClass('Helper')->exec('composer --version 2>/dev/null', $output); $output = loadClass('Helper')->exec('composer --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output); return loadClass('Helper')->egrep('/[0-9.]+/', $output);
} }
public function getDrushVersion($version) public function getDeployerVersion()
{ {
$output = loadClass('Helper')->exec('drush'.$version.' --version 2>/dev/null', $output); $output = loadClass('Helper')->exec('dep --version --no-ansi 2>/dev/null | grep -i ^Deploy', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output); return loadClass('Helper')->egrep('/[0-9.]+/', $output);
} }
public function getDrupalConsoleVersion() public function getGitVersion()
{ {
$output = loadClass('Helper')->exec('drupal --version 2>/dev/null | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g"', $output); $output = loadClass('Helper')->exec('git --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+[-rc0-9.]*/', $output); return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getGruntCliVersion()
{
$output = loadClass('Helper')->exec('grunt --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getGulpVersion()
{
$output = loadClass('Helper')->exec('gulp --version --no-color 2>/dev/null | head -1', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getLaravelInstallerVersion()
{
$output = loadClass('Helper')->exec('laravel --version --no-ansi 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getLaravelLumenVersion()
{
$output = loadClass('Helper')->exec('lumen --version --no-ansi 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getMdsVersion()
{
$output = loadClass('Helper')->exec('mysqldump-secure --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getMupdfToolsVersion()
{
$output = loadClass('Helper')->exec('mutool -v 2>&1', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
} }
public function getNodeVersion() public function getNodeVersion()
{ {
@ -65,31 +105,61 @@ class Php extends BaseClass implements BaseInterface
$output = loadClass('Helper')->exec('npm --version 2>/dev/null', $output); $output = loadClass('Helper')->exec('npm --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output); return loadClass('Helper')->egrep('/[0-9.]+/', $output);
} }
public function getLaravelVersion() public function getPhalconDevtoolsVersion()
{
$output = loadClass('Helper')->exec('laravel --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getMdsVersion()
{
$output = loadClass('Helper')->exec('mysqldump-secure --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getPhalconVersion()
{ {
$output = loadClass('Helper')->exec('phalcon --version 2>/dev/null', $output); $output = loadClass('Helper')->exec('phalcon --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output); return loadClass('Helper')->egrep('/[0-9.]+/', $output);
} }
public function getSymfonyVersion() public function getPhpunitVersion()
{
$output = loadClass('Helper')->exec('phpunit --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getStylelintVersion()
{
$output = loadClass('Helper')->exec('stylelint --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getSymfonyCliVersion()
{ {
$output = loadClass('Helper')->exec('symfony -V 2>/dev/null | tr -d "[:cntrl:]" | sed "s/\[[0-9]*m//g"', $output); $output = loadClass('Helper')->exec('symfony -V 2>/dev/null | tr -d "[:cntrl:]" | sed "s/\[[0-9]*m//g"', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output); return loadClass('Helper')->egrep('/[0-9.]+/', $output);
} }
public function getWpcliVersion() public function getVueCliVersion()
{ {
$output = loadClass('Helper')->exec('wp --version 2>/dev/null', $output); $output = loadClass('Helper')->exec('vue --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output); return loadClass('Helper')->egrep('/[0-9.]+/', $output);
} }
public function getWebpackCliVersion()
{
$output = loadClass('Helper')->exec('webpack-cli --version --no-stats --no-target --no-watch --no-color 2>/dev/null | grep webpack-cli', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getWpcliVersion()
{
$output = loadClass('Helper')->exec('wp --version 2>/dev/null | grep -i ^WP', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getWscatVersion()
{
$output = loadClass('Helper')->exec('wscat --version 2>/dev/null | head -1', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
public function getYarnVersion()
{
$output = loadClass('Helper')->exec('yarn --version 2>/dev/null', $output);
return loadClass('Helper')->egrep('/[0-9.]+/', $output);
}
//public function getDrushVersion($version)
//{
// $output = loadClass('Helper')->exec('drush'.$version.' --version 2>/dev/null', $output);
// return loadClass('Helper')->egrep('/[0-9.]+/', $output);
//}
//public function getDrupalConsoleVersion()
//{
// $output = loadClass('Helper')->exec('drupal --version 2>/dev/null | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g"', $output);
// return loadClass('Helper')->egrep('/[0-9.]+[-rc0-9.]*/', $output);
//}

View File

@ -832,10 +832,12 @@ class Mail_mimeDecode extends PEAR
// Remove soft line breaks // Remove soft line breaks
$input = preg_replace("/=\r?\n/", '', $input); $input = preg_replace("/=\r?\n/", '', $input);
// cytopia edit
if (version_compare(PHP_VERSION, '7.2.0', '>=')) { if (version_compare(PHP_VERSION, '7.2.0', '>=')) {
$cb = function($matches) { $cb = function($matches) {
// cytopia edit (added ctype_xdigit() check around)
if (ctype_xdigit($matches[0])) {
return chr(hexdec($matches[0])); return chr(hexdec($matches[0]));
}
}; };
} else { } else {
// Replace encoded characters // Replace encoded characters

View File

@ -1,85 +0,0 @@
---
name: "\U0001F41B Bug report"
about: Something is not working? Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
<!---
1. Verify first that your issue/request is not already reported on GitHub.
2. Verify that your question is not covered in the docs: https://devilbox.readthedocs.io
3. PLEASE FILL OUT ALL REQUIRED INFORMATION BELOW! Otherwise it might take more time to properly handle this bug report.
-->
### ISSUE TYPE
<!-- DO NOT CHANGE THIS -->
- Bug Report
<!-- DO NOT CHANGE THIS -->
### Checklist
<!-- ENSURE YOU HAVE DONE THE FOLLOWING -->
* [ ] `.env` file is attached
* [ ] `./check-config.sh` output is added below
* [ ] `docker-compose logs` output is added below
* [ ] `docker-compose.override.yml` is attached (if exists)
* [ ] Custom configs from `cfg/` dir are attached (if exist)
* [ ] I've looked through the docs: https://devilbox.readthedocs.io/en/latest/
* [ ] I've looked through existing issues: https://github.com/cytopia/devilbox/issues
* [ ] I've read troubleshooting: https://devilbox.readthedocs.io/en/latest/support/troubleshooting.html
### OS / ENVIRONMENT
<!-- COMPLETE ALL 6 BULLET POINTS BELOW: -->
1. Host operating system and version:
2. (Windows only) Native Docker or Docker Toolbox:
3. Docker version:
4. Docker Compose version:
5. (Linux) Is SELinux enabled?:
6. What git commit hash are you on?:
### SUMMARY
<!-- Explain the problem briefly -->
### STEPS TO REPRODUCE
<!-- Show exactly how to reproduce the problem -->
<!-- Make this as detailed as possible and be sure that others can fully reproduce this issue -->
### EXPECTED BEHAVIOUR
<!-- What is the expected behaviour? -->
### ACTUAL BEHAVIOUR
<!-- What is the actual behaviour? -->
### OTHER INFORMATION
#### Start command
<!-- Add the command you have used to start the devilbox -->
```
$ docker-compose up...
```
#### Outputs
<!-- 1/2 Add the output from ./check-config.sh -->
```bash
$ ./check-config.sh
<<< REPLACE THIS LINE WITH OUTPUT FROM ABOVE COMMAND >>>
```
<!-- 2/2 Add the output from docker-compose logs -->
```bash
$ docker-compose logs
<<< REPLACE THIS LINE WITH OUTPUT FROM ABOVE COMMAND >>>
```

190
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View File

@ -0,0 +1,190 @@
---
name: "\U0001F41B Bug report"
description: File a bug report
title: "[Bug]: "
labels: ["bug", "triage"]
assignees:
- cytopia
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: checkboxes
attributes:
label: Have you already looked into this bug?
description: Please invest some time and check if this bug is already mentioned or documented elsewhere (You may select more than one).
options:
- label: I have checked the [Troubleshooting Guide](https://devilbox.readthedocs.io/en/latest/support/troubleshooting.html)
- label: I have checked [Release notes](https://github.com/cytopia/devilbox/releases) for potential migration steps
- label: I have checked [existing issues](https://github.com/cytopia/devilbox/issues) for similar bugs
- label: I have googled this bug already with no luck
- label: I have not done any of the above
validations:
required: true
- type: input
attributes:
label: (Optional) Error message
description: If you encountered any error message, copy and paste it here. This will be used for googling the issue.
validations:
required: false
- type: textarea
id: what-happened
attributes:
label: What went wrong?
description: What exactly went wrong of what bug did you encounter?
validations:
required: true
- type: textarea
id: expected-behaviour
attributes:
label: Expected behaviour
description: What did you expect to happen instead?
validations:
required: true
- type: textarea
id: steps-to-reproduce
attributes:
label: How can we reproduce the bug?
description: How do you trigger this bug? Please walk us through it step by step in detail. This is crucial in order to triage the bug and support you in resolving it.
validations:
required: true
- type: dropdown
id: host-os
attributes:
label: Host Operating System
description: What operating system are you using?
multiple: false
options:
- Linux
- macOS
- Windows
validations:
required: true
- type: dropdown
id: host-platform
attributes:
label: Host Platform (amd64, arm64, other)
description: What host platform are you running on?
options:
- amd64
- arm64
- other
validations:
required: true
- type: dropdown
attributes:
label: (Linux only) Is SELinux enabled?
description: When using Linux as your host operating system, check if SELinux is enabled or not. [More info here](https://devilbox.readthedocs.io/en/latest/getting-started/install-the-devilbox.html?highlight=selinux#linux-selinux)
options:
- Yes, SELinux is enabled
- No, SELinux is disabled
- I don't know
- I am not on Linux
validations:
required: true
- type: input
id: docker-version
attributes:
label: Docker version
description: "What Docker version are you using? Please copy and paste the output of `docker --version` into this text area."
validations:
required: true
- type: input
id: docker-compose-version
attributes:
label: Docker Compose version
description: "What Docker Compose version are you using? Please copy and paste the output of `docker-compose --version` into this text area."
validations:
required: true
- type: input
id: devilbox-version
attributes:
label: Devilbox version
description: "What version of Devilbox are you running (latest master, specific tag, git hash, etc)?"
validations:
required: true
- type: dropdown
attributes:
label: Have you removed stopped containers before starting?
description: "Have you done a `docker-compose rm` before starting up the Devilbox? [More info here](https://docs.docker.com/compose/reference/rm/)"
multiple: false
options:
- "Yes"
- "No"
validations:
required: true
- type: dropdown
attributes:
label: Have you pulled latest Docker images before starting?
description: "Have you done a `docker-compose pull` before starting up the Devilbox?"
multiple: false
options:
- "Yes"
- "No"
validations:
required: true
- type: input
attributes:
label: Devilbox start command
description: "What is the [start command](https://devilbox.readthedocs.io/en/latest/getting-started/start-the-devilbox.html) you have used to start the Devilbox?"
validations:
required: true
- type: textarea
id: log-env-file
attributes:
label: "Config: .env file"
description: "Please copy and paste your `.env` file into this text area"
render: shell
validations:
required: true
- type: textarea
attributes:
label: "Config: docker-compose.override.yml"
description: "If you are using `docker-compose.override.yml`, please copy and paste its contents into this text area."
render: shell
validations:
required: false
- type: textarea
id: log-check-config
attributes:
label: "Config: ./check-config.sh"
description: "Please copy and paste the output of `./check-config.sh` into this text area"
render: shell
validations:
required: true
- type: textarea
id: log-docker-compose
attributes:
label: "Log: docker-compose logs"
description: "Please copy and paste the output of `docker-compose logs` into this text area"
render: shell
validations:
required: true
- type: textarea
attributes:
label: (Optional) Additional information
description: Add any additional information that might help with this bug report. (E.g. customizations from the `autostart/`, `bash/`, `cfg/` or `supervisor/` directory or relevant logfiles from the `log/` directory)
validations:
required: false

18
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@ -0,0 +1,18 @@
---
blank_issues_enabled: false
contact_links:
- name: Devilbox Discord Chat
url: https://discord.gg/2wP3V6kBj4
about: Please notify or discuss about any other requests here.
- name: Devilbox Discourse Forum
url: https://devilbox.discourse.group/
about: Please ask and answer general questions here.
- name: Devilbox Community Support
url: https://devilbox.discourse.group/
about: Please ask and answer questions here.
- name: Devilbox documentation
url: https://devilbox.readthedocs.io/
about: Find the Devilbox documentation here.

View File

@ -1,30 +0,0 @@
---
name: "\U0001F4DD Documentation"
about: Anything related to the Devilbox documentation
title: ''
labels: documentation
assignees: ''
---
<!---
1. Verify first that your question is not already reported on GitHub.
2. Verify that your question is not covered in the docs: https://devilbox.readthedocs.io
3. PLEASE FILL OUT ALL REQUIRED INFORMATION BELOW! Otherwise it might take more time to properly handle this question.
-->
#### ISSUE TYPE
<!-- DO NOT CHANGE THIS -->
- Documentation
<!-- DO NOT CHANGE THIS -->
#### SUMMARY
<!-- Add your information here -->
#### Goal
<!-- Explain what you actually want to accomplish -->

View File

@ -0,0 +1,30 @@
---
name: "\U0001F4DD Documentation"
description: Something is missing or wrong in the documentation.
title: "[Docs]: "
labels: ["documentation"]
assignees:
- cytopia
body:
- type: textarea
attributes:
label: What is wrong in the documentation?
description: Tell us, what is wrong in the documentation?
validations:
required: false
- type: textarea
attributes:
label: What is missing in the documentation?
description: Tell us, what is missing in the documentation?
validations:
required: false
- type: dropdown
attributes:
label: Are you willing to provide a PR to address this?
options:
- "Yes"
- "No"

View File

@ -1,30 +0,0 @@
---
name: "✨ Feature request"
about: Suggest an idea for this project
title: ''
labels: feature
assignees: ''
---
<!---
1. Verify first that your feature request is not already reported on GitHub.
2. Verify that your feature is not already implemented: https://devilbox.readthedocs.io
3. PLEASE FILL OUT ALL REQUIRED INFORMATION BELOW! Otherwise it might take more time to properly handle this feature request
-->
#### ISSUE TYPE
<!-- DO NOT CHANGE THIS -->
- Feature request
<!-- DO NOT CHANGE THIS -->
#### SUMMARY
<!-- Explain your feature idea briefly -->
#### Goal
<!-- Explain what you actually want to accomplish with that feature -->

View File

@ -0,0 +1,36 @@
---
name: "✨ Feature request"
description: Suggest an idea or feature for this project
title: "[Feature]: "
labels: ["feature"]
assignees: []
body:
- type: textarea
attributes:
label: What is your idea or feature suggestion?
description: Tell us, what idea or feature you suggest to be added to the Devilbox.
validations:
required: true
- type: textarea
attributes:
label: Benefits
description: Tell us, how this this will be beneficial to the Devilbox.
validations:
required: false
- type: textarea
attributes:
label: Where can we find information about this?
description: If you are proposing a software or tool, please add relevant links and documentation.
validations:
required: false
- type: dropdown
attributes:
label: Are you willing to provide a PR to address this?
options:
- "Yes"
- "No"

50
.github/ISSUE_TEMPLATE/howto.yml vendored Normal file
View File

@ -0,0 +1,50 @@
---
name: "❔ How to do ...?"
description: How do I do X or Y with the Devilbox?
title: "[Howto]: "
labels: ["question", "Community help wanted"]
assignees: []
body:
- type: markdown
attributes:
value: |
If this is a generic question, please consider using the [Devilbox forum](https://devilbox.discourse.group/) instead.
- type: checkboxes
attributes:
label: Have you already checked elsewhere?
description: You may select more than one.
options:
- label: I have read the [Devilbox documentation](https://devilbox.readthedocs.io/en/latest/)
- label: I have checked the [Devilbox Troubleshooting Guide](https://devilbox.readthedocs.io/en/latest/)
- label: I have checked the [Devilbox FAQ](https://devilbox.readthedocs.io/en/latest/support/faq.html)
- label: I have checked the [Devilbox Howto](https://devilbox.readthedocs.io/en/latest/support/howto.html)
- label: I have checked the [Devilbox Forum](https://devilbox.discourse.group/)
- label: I have checked [existing issues](https://github.com/cytopia/devilbox/issues)
- label: I have googled already with no luck
- label: I have not done any of the above
validations:
required: true
- type: textarea
attributes:
label: What are you struggling with?
description: Tell the community, what you are struggling with. Be as specific as possible to make it easier for other people to answer your question.
validations:
required: true
- type: textarea
attributes:
label: What have you tried already?
description: Add some details on what you have tried already, so this can be ruled out.
validations:
required: true
- type: textarea
attributes:
label: What is your goal?
description: Tell the community, what you want to accomplish? This might be helpful to know in order to prevent [XY problems](https://en.wikipedia.org/wiki/XY_problem).
validations:
required: true

View File

@ -1,40 +0,0 @@
---
name: "❔ Question"
about: 'Consider using the Devilbox Forum instead: https://devilbox.discourse.group/'
title: ''
labels: ''
assignees: ''
---
<!-- ---------- GITHUB QUESTIONS ARE DEPRECATED ---------- -->
<!-- ---------- USE THE FORUM ---------- ->
<!-- ---------- https://devilbox.discourse.group/ ---------- ->
<!---
1. A better place for questions is: https://devilbox.discourse.group/
2. VERIFY first that your question is not already reported on GitHub.
3. VERIFY that your question is not covered in the docs: https://devilbox.readthedocs.io
4. VERIFY that your question is not covered in the forum: https://devilbox.discourse.group/
5. PLEASE FILL OUT ALL REQUIRED INFORMATION BELOW! Otherwise it might take more time to properly handle this question.
-->
#### ISSUE TYPE
<!-- DO NOT CHANGE THIS -->
- Question
<!-- DO NOT CHANGE THIS -->
#### SUMMARY
<!-- Ask your question here -->
#### Goal
<!-- Explain what you actually want to accomplish -->

View File

@ -1,228 +0,0 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: Linux
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
# Runs on Pull Requests
pull_request:
# Runs on master Branch and Tags
push:
branches:
- master
tags:
- '[0-9]+.[0-9]+*'
# -------------------------------------------------------------------------------------------------
# What to run
# -------------------------------------------------------------------------------------------------
jobs:
smoke_linux:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php:
- "5.3"
- "5.4"
- "5.5"
- "5.6"
- "7.0"
- "7.1"
- "7.2"
- "7.3"
- "7.4"
- "8.0"
- "8.1"
- "8.2"
httpd:
- "apache-2.2"
- "apache-2.4"
- "nginx-stable"
- "nginx-mainline"
name: "[PHP ${{ matrix.php }}] vs [${{ matrix.httpd }}]"
steps:
# ------------------------------------------------------------
# Checkout repository
# ------------------------------------------------------------
- name: Checkout repository
uses: actions/checkout@v1
- name: Show environment
shell: bash
run: |
env
- name: Show network
shell: bash
run: |
netstat -an || true
ss -tlun || true
- name: Show Docker version
shell: bash
run: |
docker version
# ------------------------------------------------------------
# Setup
# ------------------------------------------------------------
- name: Configure
shell: bash
run: |
cd .tests/
# Set the two candidates to test against
make configure KEY=PHP_SERVER VAL=${PHP}
make configure KEY=HTTPD_SERVER VAL=${HTTPD}
# 3306 is taken, so chose another one
make configure KEY=HOST_PORT_MYSQL VAL=3307
env:
PHP: ${{ matrix.php }}
HTTPD: ${{ matrix.httpd }}
- name: Pull images
shell: bash
run: |
cd .tests/
make pull
- name: Startup
shell: bash
run: |
cd .tests/
make start
- name: Docker logs
shell: bash
run: |
cd .tests/
make logs
# ------------------------------------------------------------
# Run tests
# ------------------------------------------------------------
- name: Test Modules
shell: bash
run: |
cd .tests/
make test-smoke-modules
if: success() || failure()
- name: Test Config
shell: bash
run: |
cd .tests/
make test-smoke-config
if: success() || failure()
- name: Test Intranet
shell: bash
run: |
cd .tests/
make test-smoke-intranet
if: success() || failure()
- name: Test Vendors
shell: bash
run: |
cd .tests/
make test-smoke-vendors
if: success() || failure()
- name: Test Vhosts
shell: bash
run: |
cd .tests/
make test-smoke-vhosts
if: success() || failure()
- name: Test Reverse Proxy
shell: bash
run: |
cd .tests/
make test-smoke-rproxies
if: success() || failure()
- name: Test SSL
shell: bash
run: |
cd .tests/
make test-smoke-ssl
if: success() || failure()
- name: Test Bind
shell: bash
run: |
cd .tests/
make test-smoke-bind
if: success() || failure()
- name: Test Autostart
shell: bash
run: |
cd .tests/
make test-smoke-autostart
if: success() || failure()
- name: "Test Framework: CakePHP"
shell: bash
run: |
cd .tests/
make test-smoke-framework-cakephp
if: success() || failure()
- name: "Test Framework: Drupal"
shell: bash
run: |
cd .tests/
make test-smoke-framework-drupal
if: success() || failure()
- name: "Test Framework: Wordpress"
shell: bash
run: |
cd .tests/
make test-smoke-framework-wordpress
if: success() || failure()
- name: "Test Container"
shell: bash
run: |
retry() {
for n in $(seq 5); do
echo "[${n}/5] ${*}";
if eval "${*}"; then
echo "[SUCC] ${n}/5";
return 0;
fi;
sleep 5;
echo "[FAIL] ${n}/5";
done;
return 1;
}
cd .tests/
retry make test-smoke-container
if: success() || failure()
# ------------------------------------------------------------
# Finish
# ------------------------------------------------------------
- name: "Finish: Docker logs"
shell: bash
run: |
cd .tests/
make logs
if: success() || failure()

View File

@ -1,262 +0,0 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: MacOS
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
# Runs on Pull Requests
pull_request:
# Runs on master Branch and Tags
push:
branches:
- master
tags:
- '[0-9]+.[0-9]+*'
# -------------------------------------------------------------------------------------------------
# What to run
# -------------------------------------------------------------------------------------------------
jobs:
smoke_macos:
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
php:
- "7.2"
httpd:
- "nginx-stable"
name: "[PHP ${{ matrix.php }}] vs [${{ matrix.httpd }}]"
steps:
# ------------------------------------------------------------
# Checkout repository
# ------------------------------------------------------------
- name: Checkout repository
uses: actions/checkout@v1
- name: "[Pre] Install Requirements"
shell: bash
run: |
brew install coreutils
brew install bash
brew install socat
- name: "[Pre] Install Docker"
shell: bash
run: |
brew install docker docker-machine-driver-xhyve
sudo chown root:wheel $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
sudo chmod u+s $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
while ! docker-machine create --driver xhyve default; do
docker-machine rm -f default
sleep 1;
done
# Export variable (this target)
eval "$(docker-machine env default)"
DOCKER_TLS_VERIFY="$( docker-machine env default | grep DOCKER_TLS_VERIFY | sed -e 's/.*="//g' -e 's/"$//g' )"
DOCKER_HOST="$( docker-machine env default | grep DOCKER_HOST | sed -e 's/.*="//g' -e 's/"$//g' )"
DOCKER_CERT_PATH="$( docker-machine env default | grep DOCKER_CERT_PATH | sed -e 's/.*="//g' -e 's/"$//g' )"
DOCKER_MACHINE_NAME="$( docker-machine env default | grep DOCKER_MACHINE_NAME | sed -e 's/.*="//g' -e 's/"$//g' )"
# Export variable (this other targets)
# https://help.github.com/en/actions/automating-your-workflow-with-github-actions/development-tools-for-github-actions#set-an-environment-variable-set-env
echo ::set-env name=DOCKER_TLS_VERIFY::${DOCKER_TLS_VERIFY}
echo ::set-env name=DOCKER_HOST::${DOCKER_HOST}
echo ::set-env name=DOCKER_CERT_PATH::${DOCKER_CERT_PATH}
echo ::set-env name=DOCKER_MACHINE_NAME::${DOCKER_MACHINE_NAME}
# Show info
docker-machine ls
docker-machine env default
docker version
- name: "[Pre] Install Docker Compose"
shell: bash
run: |
sudo curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose version
- name: "[Pre] Setup Docker machine"
shell: bash
run: |
# Setup DNS records
echo "127.0.0.1 localhost" | sudo tee -a /etc/hosts
# Portforwarding from DOCKER_HOST to local
HOST="$( echo "${DOCKER_HOST}" | sed -e 's|^tcp://||g' -e 's|:.*||g' )"
echo "${HOST}"
sudo socat -s -d -d tcp-listen:80,reuseaddr,fork tcp:${HOST}:80 &
sleep 2
sudo socat -s -d -d tcp-listen:443,reuseaddr,fork tcp:${HOST}:443 &
sleep 2
if ! netstat -an | grep -i LISTEN | grep -E '(:80)|(\.80)\s'; then
netstat -an | grep -i LISTEN;
false;
fi
if ! netstat -an | grep -i LISTEN | grep -E '(:443)|(\.443)\s'; then
netstat -an | grep -i LISTEN;
false;
fi
host localhost
curl -sS -I 'http://localhost:80' || true
curl -sS -I 'https://localhost:443' || true
- name: "[Info] Show environment"
shell: bash
run: |
env
if: success() || failure()
- name: "[Info] Show network"
shell: bash
run: |
netstat -an || true
ss -tlun || true
if: success() || failure()
# ------------------------------------------------------------
# Setup
# ------------------------------------------------------------
- name: Configure
shell: bash
run: |
cd .tests/
# Set the two candidates to test against
make configure KEY=PHP_SERVER VAL=${PHP}
make configure KEY=HTTPD_SERVER VAL=${HTTPD}
# 3306 is taken, so chose another one
make configure KEY=HOST_PORT_MYSQL VAL=3307
env:
PHP: ${{ matrix.php }}
HTTPD: ${{ matrix.httpd }}
if: success() || failure()
- name: Pull images
shell: bash
run: |
cd .tests/
make pull
if: success() || failure()
- name: Startup
shell: bash
run: |
cd .tests/
make start
if: success() || failure()
- name: Docker logs
shell: bash
run: |
cd .tests/
make logs
if: success() || failure()
# ------------------------------------------------------------
# Run tests
# ------------------------------------------------------------
- name: Test Modules
shell: bash
run: |
cd .tests/
make test-smoke-modules
if: success() || failure()
- name: Test Config
shell: bash
run: |
cd .tests/
make test-smoke-config
if: success() || failure()
- name: Test Intranet
shell: bash
run: |
cd .tests/
make test-smoke-intranet
if: success() || failure()
- name: Test Vendors
shell: bash
run: |
cd .tests/
make test-smoke-vendors
if: success() || failure()
- name: Test Vhosts
shell: bash
run: |
cd .tests/
make test-smoke-vhosts
if: success() || failure()
- name: Test Reverse Proxy
shell: bash
run: |
cd .tests/
make test-smoke-rproxies
if: success() || failure()
- name: Test SSL
shell: bash
run: |
cd .tests/
make test-smoke-ssl
if: success() || failure()
- name: Test Bind
shell: bash
run: |
cd .tests/
make test-smoke-bind
if: success() || failure()
- name: Test Autostart
shell: bash
run: |
cd .tests/
make test-smoke-autostart
if: success() || failure()
- name: "Test Framework: CakePHP"
shell: bash
run: |
cd .tests/
make test-smoke-framework-cakephp
if: success() || failure()
- name: "Test Framework: Drupal"
shell: bash
run: |
cd .tests/
make test-smoke-framework-drupal
if: success() || failure()
- name: "Test Framework: Wordpress"
shell: bash
run: |
cd .tests/
make test-smoke-framework-wordpress
if: success() || failure()
# ------------------------------------------------------------
# Finish
# ------------------------------------------------------------
- name: "[Post] Docker logs"
shell: bash
run: |
cd .tests/
make logs
if: success() || failure()

View File

@ -12,12 +12,16 @@ name: Docs
on: on:
# Runs on Pull Requests # Runs on Pull Requests
pull_request: pull_request:
paths:
- 'docs/**'
- '!**.md'
# Runs on master Branch and Tags # Runs on master Branch and Tags
push: push:
paths:
- 'docs/**'
- '!**.md'
branches: branches:
- master - master
tags:
# ------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------
@ -25,16 +29,14 @@ on:
# ------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------
jobs: jobs:
docs: docs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
target: target:
- build - build
- linkcheck - linkcheck
- linkcheck2 # - linkcheck2
name: "[Docs ${{ matrix.target }}]" name: "[Docs ${{ matrix.target }}]"
steps: steps:
@ -46,24 +48,9 @@ jobs:
uses: actions/checkout@v1 uses: actions/checkout@v1
- name: Check documentation - name: Check documentation
shell: bash uses: cytopia/shell-command-retry-action@v0.1.3
run: | with:
retry() { retries: 5
for n in $(seq ${RETRIES}); do workdir: "${{ github.workspace }}/docs/"
echo "[${n}/${RETRIES}] ${*}"; command: |
if eval "${*}"; then make ${{ matrix.target }}
echo "[SUCC] ${n}/${RETRIES}";
return 0;
fi;
sleep ${PAUSE};
echo "[FAIL] ${n}/${RETRIES}";
done;
return 1;
}
cd docs
retry make ${TARGET}
env:
TARGET: ${{ matrix.target }}
RETRIES: 20
PAUSE: 10

View File

@ -17,7 +17,6 @@ on:
push: push:
branches: branches:
- master - master
tags:
# ------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------

59
.github/workflows/params-httpd.yml vendored Normal file
View File

@ -0,0 +1,59 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: params
# -------------------------------------------------------------------------------------------------
# Custom Variables
# -------------------------------------------------------------------------------------------------
env:
# Note: Older PHP versions use an older version of phpPgMyAdmin, which does not work with later
# PgSQL server versions. That's why we need to tell those combinations to use an old PgSQL server
MATRIX: >-
[
{"HTTPD_SERVER": "apache-2.2", "HTTPD_FLAVOUR": "alpine"},
{"HTTPD_SERVER": "apache-2.2", "HTTPD_FLAVOUR": "debian"},
{"HTTPD_SERVER": "apache-2.4", "HTTPD_FLAVOUR": "alpine"},
{"HTTPD_SERVER": "apache-2.4", "HTTPD_FLAVOUR": "debian"},
{"HTTPD_SERVER": "nginx-stable", "HTTPD_FLAVOUR": "alpine"},
{"HTTPD_SERVER": "nginx-stable", "HTTPD_FLAVOUR": "debian"},
{"HTTPD_SERVER": "nginx-mainline", "HTTPD_FLAVOUR": "alpine"},
{"HTTPD_SERVER": "nginx-mainline", "HTTPD_FLAVOUR": "debian"}
]
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
workflow_call:
outputs:
matrix:
description: "The determined version matrix"
value: ${{ jobs.params.outputs.matrix }}
jobs:
params:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: "[Set-Output] Matrix"
id: set-matrix
run: |
echo "::set-output name=matrix::$( echo '${{ env.MATRIX }}' | jq -M -c )"
- name: "[DEBUG] Show settings'"
run: |
echo 'Matrix'
echo '--------------------'
echo '${{ steps.set-matrix.outputs.matrix }}'
echo

54
.github/workflows/params-memcd.yml vendored Normal file
View File

@ -0,0 +1,54 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: params
# -------------------------------------------------------------------------------------------------
# Custom Variables
# -------------------------------------------------------------------------------------------------
env:
MATRIX: >-
[
{"MEMCD_SERVER": "Memcd 1.4"},
{"MEMCD_SERVER": "Memcd 1.4-alpine"},
{"MEMCD_SERVER": "Memcd 1.5"},
{"MEMCD_SERVER": "Memcd 1.5-alpine"},
{"MEMCD_SERVER": "Memcd 1.6"},
{"MEMCD_SERVER": "Memcd 1.6-alpine"},
{"MEMCD_SERVER": "Memcd latest"},
{"MEMCD_SERVER": "Memcd alpine"}
]
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
workflow_call:
outputs:
matrix:
description: "The determined version matrix"
value: ${{ jobs.params.outputs.matrix }}
jobs:
params:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: "[Set-Output] Matrix"
id: set-matrix
run: |
echo "::set-output name=matrix::$( echo '${{ env.MATRIX }}' | jq -M -c )"
- name: "[DEBUG] Show settings'"
run: |
echo 'Matrix'
echo '--------------------'
echo '${{ steps.set-matrix.outputs.matrix }}'
echo

56
.github/workflows/params-mongo.yml vendored Normal file
View File

@ -0,0 +1,56 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: params
# -------------------------------------------------------------------------------------------------
# Custom Variables
# -------------------------------------------------------------------------------------------------
env:
# CI for Mongo 2.8 and Mongo 3.0 removed due to local segfault and non-segfault, but error in CI
# https://github.com/docker-library/mongo/issues/251
#
# CI for Mongo 3.2 and 3.4 removed due to non-reproducible error in CI
MATRIX: >-
[
{"MONGO_SERVER": "Mongo 3.6"},
{"MONGO_SERVER": "Mongo 4.0"},
{"MONGO_SERVER": "Mongo 4.2"},
{"MONGO_SERVER": "Mongo 4.4"},
{"MONGO_SERVER": "Mongo 5.0"},
{"MONGO_SERVER": "Mongo latest"}
]
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
workflow_call:
outputs:
matrix:
description: "The determined version matrix"
value: ${{ jobs.params.outputs.matrix }}
jobs:
params:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: "[Set-Output] Matrix"
id: set-matrix
run: |
echo "::set-output name=matrix::$( echo '${{ env.MATRIX }}' | jq -M -c )"
- name: "[DEBUG] Show settings'"
run: |
echo 'Matrix'
echo '--------------------'
echo '${{ steps.set-matrix.outputs.matrix }}'
echo

66
.github/workflows/params-mysql.yml vendored Normal file
View File

@ -0,0 +1,66 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: params
# -------------------------------------------------------------------------------------------------
# Custom Variables
# -------------------------------------------------------------------------------------------------
env:
MATRIX: >-
[
{"MYSQL_SERVER": "mysql-5.5"},
{"MYSQL_SERVER": "mysql-5.6"},
{"MYSQL_SERVER": "mysql-5.7"},
{"MYSQL_SERVER": "mysql-8.0"},
{"MYSQL_SERVER": "percona-5.5"},
{"MYSQL_SERVER": "percona-5.6"},
{"MYSQL_SERVER": "percona-5.7"},
{"MYSQL_SERVER": "percona-8.0"},
{"MYSQL_SERVER": "mariadb-5.5"},
{"MYSQL_SERVER": "mariadb-10.0"},
{"MYSQL_SERVER": "mariadb-10.1"},
{"MYSQL_SERVER": "mariadb-10.2"},
{"MYSQL_SERVER": "mariadb-10.3"},
{"MYSQL_SERVER": "mariadb-10.4"},
{"MYSQL_SERVER": "mariadb-10.5"},
{"MYSQL_SERVER": "mariadb-10.6"},
{"MYSQL_SERVER": "mariadb-10.7"},
{"MYSQL_SERVER": "mariadb-10.8"},
{"MYSQL_SERVER": "mariadb-10.9"},
{"MYSQL_SERVER": "mariadb-10.10"}
]
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
workflow_call:
outputs:
matrix:
description: "The determined version matrix"
value: ${{ jobs.params.outputs.matrix }}
jobs:
params:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: "[Set-Output] Matrix"
id: set-matrix
run: |
echo "::set-output name=matrix::$( echo '${{ env.MATRIX }}' | jq -M -c )"
- name: "[DEBUG] Show settings'"
run: |
echo 'Matrix'
echo '--------------------'
echo '${{ steps.set-matrix.outputs.matrix }}'
echo

72
.github/workflows/params-pgsql.yml vendored Normal file
View File

@ -0,0 +1,72 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: params
# -------------------------------------------------------------------------------------------------
# Custom Variables
# -------------------------------------------------------------------------------------------------
env:
MATRIX: >-
[
{"PGSQL_SERVER": "PgSQL 9.0"},
{"PGSQL_SERVER": "PgSQL 9.1"},
{"PGSQL_SERVER": "PgSQL 9.2"},
{"PGSQL_SERVER": "PgSQL 9.2-alpine"},
{"PGSQL_SERVER": "PgSQL 9.3"},
{"PGSQL_SERVER": "PgSQL 9.3-alpine"},
{"PGSQL_SERVER": "PgSQL 9.4"},
{"PGSQL_SERVER": "PgSQL 9.4-alpine"},
{"PGSQL_SERVER": "PgSQL 9.5"},
{"PGSQL_SERVER": "PgSQL 9.5-alpine"},
{"PGSQL_SERVER": "PgSQL 9.6"},
{"PGSQL_SERVER": "PgSQL 9.6-alpine"},
{"PGSQL_SERVER": "PgSQL 10"},
{"PGSQL_SERVER": "PgSQL 10-alpine"},
{"PGSQL_SERVER": "PgSQL 11"},
{"PGSQL_SERVER": "PgSQL 11-alpine"},
{"PGSQL_SERVER": "PgSQL 12"},
{"PGSQL_SERVER": "PgSQL 12-alpine"},
{"PGSQL_SERVER": "PgSQL 13"},
{"PGSQL_SERVER": "PgSQL 13-alpine"},
{"PGSQL_SERVER": "PgSQL 14"},
{"PGSQL_SERVER": "PgSQL 14-alpine"},
{"PGSQL_SERVER": "PgSQL 15"},
{"PGSQL_SERVER": "PgSQL 15-alpine"},
{"PGSQL_SERVER": "PgSQL latest"},
{"PGSQL_SERVER": "PgSQL alpine"}
]
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
workflow_call:
outputs:
matrix:
description: "The determined version matrix"
value: ${{ jobs.params.outputs.matrix }}
jobs:
params:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: "[Set-Output] Matrix"
id: set-matrix
run: |
echo "::set-output name=matrix::$( echo '${{ env.MATRIX }}' | jq -M -c )"
- name: "[DEBUG] Show settings'"
run: |
echo 'Matrix'
echo '--------------------'
echo '${{ steps.set-matrix.outputs.matrix }}'
echo

99
.github/workflows/params-php.yml vendored Normal file
View File

@ -0,0 +1,99 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: params
# -------------------------------------------------------------------------------------------------
# Custom Variables
# -------------------------------------------------------------------------------------------------
env:
# Note: Older PHP versions use an older version of phpPgMyAdmin, which does not work with later
# PgSQL server versions. That's why we need to tell those combinations to use an old PgSQL server
MATRIX: >-
[
{"PHP_SERVER": "PHP 5.3", "HTTPD_SERVER": "apache-2.2", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 5.4", "HTTPD_SERVER": "apache-2.2", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 5.5", "HTTPD_SERVER": "apache-2.2", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 5.6", "HTTPD_SERVER": "apache-2.2", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 7.0", "HTTPD_SERVER": "apache-2.2", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 7.1", "HTTPD_SERVER": "apache-2.2", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 7.2", "HTTPD_SERVER": "apache-2.2"},
{"PHP_SERVER": "PHP 7.3", "HTTPD_SERVER": "apache-2.2"},
{"PHP_SERVER": "PHP 7.4", "HTTPD_SERVER": "apache-2.2"},
{"PHP_SERVER": "PHP 8.0", "HTTPD_SERVER": "apache-2.2"},
{"PHP_SERVER": "PHP 8.1", "HTTPD_SERVER": "apache-2.2"},
{"PHP_SERVER": "PHP 8.2", "HTTPD_SERVER": "apache-2.2"},
{"PHP_SERVER": "PHP 5.3", "HTTPD_SERVER": "apache-2.4", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 5.4", "HTTPD_SERVER": "apache-2.4", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 5.5", "HTTPD_SERVER": "apache-2.4", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 5.6", "HTTPD_SERVER": "apache-2.4", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 7.0", "HTTPD_SERVER": "apache-2.4", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 7.1", "HTTPD_SERVER": "apache-2.4", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 7.2", "HTTPD_SERVER": "apache-2.4"},
{"PHP_SERVER": "PHP 7.3", "HTTPD_SERVER": "apache-2.4"},
{"PHP_SERVER": "PHP 7.4", "HTTPD_SERVER": "apache-2.4"},
{"PHP_SERVER": "PHP 8.0", "HTTPD_SERVER": "apache-2.4"},
{"PHP_SERVER": "PHP 8.1", "HTTPD_SERVER": "apache-2.4"},
{"PHP_SERVER": "PHP 8.2", "HTTPD_SERVER": "apache-2.4"},
{"PHP_SERVER": "PHP 5.3", "HTTPD_SERVER": "nginx-stable", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 5.4", "HTTPD_SERVER": "nginx-stable", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 5.5", "HTTPD_SERVER": "nginx-stable", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 5.6", "HTTPD_SERVER": "nginx-stable", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 7.0", "HTTPD_SERVER": "nginx-stable", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 7.1", "HTTPD_SERVER": "nginx-stable", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 7.2", "HTTPD_SERVER": "nginx-stable"},
{"PHP_SERVER": "PHP 7.3", "HTTPD_SERVER": "nginx-stable"},
{"PHP_SERVER": "PHP 7.4", "HTTPD_SERVER": "nginx-stable"},
{"PHP_SERVER": "PHP 8.0", "HTTPD_SERVER": "nginx-stable"},
{"PHP_SERVER": "PHP 8.1", "HTTPD_SERVER": "nginx-stable"},
{"PHP_SERVER": "PHP 8.2", "HTTPD_SERVER": "nginx-stable"},
{"PHP_SERVER": "PHP 5.3", "HTTPD_SERVER": "nginx-mainline", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 5.4", "HTTPD_SERVER": "nginx-mainline", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 5.5", "HTTPD_SERVER": "nginx-mainline", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 5.6", "HTTPD_SERVER": "nginx-mainline", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 7.0", "HTTPD_SERVER": "nginx-mainline", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 7.1", "HTTPD_SERVER": "nginx-mainline", "PGSQL_SERVER": "PgSQL 12"},
{"PHP_SERVER": "PHP 7.2", "HTTPD_SERVER": "nginx-mainline"},
{"PHP_SERVER": "PHP 7.3", "HTTPD_SERVER": "nginx-mainline"},
{"PHP_SERVER": "PHP 7.4", "HTTPD_SERVER": "nginx-mainline"},
{"PHP_SERVER": "PHP 8.0", "HTTPD_SERVER": "nginx-mainline"},
{"PHP_SERVER": "PHP 8.1", "HTTPD_SERVER": "nginx-mainline"},
{"PHP_SERVER": "PHP 8.2", "HTTPD_SERVER": "nginx-mainline"}
]
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
workflow_call:
outputs:
matrix:
description: "The determined version matrix"
value: ${{ jobs.params.outputs.matrix }}
jobs:
params:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: "[Set-Output] Matrix"
id: set-matrix
run: |
echo "::set-output name=matrix::$( echo '${{ env.MATRIX }}' | jq -M -c )"
- name: "[DEBUG] Show settings'"
run: |
echo 'Matrix'
echo '--------------------'
echo '${{ steps.set-matrix.outputs.matrix }}'
echo

63
.github/workflows/params-redis.yml vendored Normal file
View File

@ -0,0 +1,63 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: params
# -------------------------------------------------------------------------------------------------
# Custom Variables
# -------------------------------------------------------------------------------------------------
env:
MATRIX: >-
[
{"REDIS_SERVER": "Redis 2.8"},
{"REDIS_SERVER": "Redis 3.0"},
{"REDIS_SERVER": "Redis 3.0-alpine"},
{"REDIS_SERVER": "Redis 3.2"},
{"REDIS_SERVER": "Redis 3.2-alpine"},
{"REDIS_SERVER": "Redis 4.0"},
{"REDIS_SERVER": "Redis 4.0-alpine"},
{"REDIS_SERVER": "Redis 5.0"},
{"REDIS_SERVER": "Redis 5.0-alpine"},
{"REDIS_SERVER": "Redis 6.0"},
{"REDIS_SERVER": "Redis 6.0-alpine"},
{"REDIS_SERVER": "Redis 6.2"},
{"REDIS_SERVER": "Redis 6.2-alpine"},
{"REDIS_SERVER": "Redis 7.0"},
{"REDIS_SERVER": "Redis 7.0-alpine"},
{"REDIS_SERVER": "Redis latest"},
{"REDIS_SERVER": "Redis alpine"}
]
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
workflow_call:
outputs:
matrix:
description: "The determined version matrix"
value: ${{ jobs.params.outputs.matrix }}
jobs:
params:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: "[Set-Output] Matrix"
id: set-matrix
run: |
echo "::set-output name=matrix::$( echo '${{ env.MATRIX }}' | jq -M -c )"
- name: "[DEBUG] Show settings'"
run: |
echo 'Matrix'
echo '--------------------'
echo '${{ steps.set-matrix.outputs.matrix }}'
echo

View File

@ -1,242 +0,0 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: Config
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
# Runs on Pull Requests
pull_request:
# Runs on master Branch and Tags
push:
branches:
- master
tags:
- '[0-9]+.[0-9]+*'
# -------------------------------------------------------------------------------------------------
# What to run
# -------------------------------------------------------------------------------------------------
jobs:
test_config:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php:
- "5.3"
- "5.4"
- "5.5"
- "5.6"
- "7.0"
- "7.1"
- "7.2"
- "7.3"
- "7.4"
- "8.0"
- "8.1"
- "8.2"
httpd:
- "apache-2.2"
- "apache-2.4"
- "nginx-stable"
- "nginx-mainline"
name: "[PHP ${{ matrix.php }}] vs [${{ matrix.httpd }}]"
steps:
# ------------------------------------------------------------
# Checkout repository
# ------------------------------------------------------------
- name: Checkout repository
uses: actions/checkout@v1
- name: Show environment
shell: bash
run: |
env
- name: Show network
shell: bash
run: |
netstat -an || true
ss -tlun || true
- name: Show Docker version
shell: bash
run: |
docker version
# ------------------------------------------------------------
# Setup
# ------------------------------------------------------------
- name: Configure
shell: bash
run: |
cd .tests/
# Set the two candidates to test against
make configure KEY=PHP_SERVER VAL=${PHP}
make configure KEY=HTTPD_SERVER VAL=${HTTPD}
# 3306 is taken, so chose another one
make configure KEY=HOST_PORT_MYSQL VAL=3307
# Test full customization
make configure KEY=DEBUG_COMPOSE_ENTRYPOINT VAL="$(( RANDOM % 3 ))"
make configure KEY=DOCKER_LOGS VAL="$(( RANDOM % 1 ))"
make configure KEY=TLD_SUFFIX VAL=loc2
make configure KEY=TIMEZONE VAL='Europe/Berlin'
make configure KEY=PHP_MODULES_DISABLE VAL=
make configure KEY=HTTPD_TEMPLATE_DIR VAL=.config
make configure KEY=HOST_PORT_HTTPD VAL=8080
make configure KEY=HOST_PORT_HTTPD_SSL VAL=8443
make configure KEY=MYSQL_ROOT_PASSWORD VAL=mysqlpass
make configure KEY=PGSQL_ROOT_USER VAL=pgroot
make configure KEY=PGSQL_ROOT_PASSWORD VAL=pgsqlpass
make configure KEY=DEVILBOX_VENDOR_PHPMYADMIN_AUTOLOGIN VAL=0
env:
PHP: ${{ matrix.php }}
HTTPD: ${{ matrix.httpd }}
- name: Pull images
shell: bash
run: |
cd .tests/
make pull
- name: Startup
shell: bash
run: |
cd .tests/
make start
- name: Docker logs
shell: bash
run: |
cd .tests/
make logs
# ------------------------------------------------------------
# Run tests
# ------------------------------------------------------------
- name: Test Modules
shell: bash
run: |
cd .tests/
make test-smoke-modules
if: success() || failure()
- name: Test Config
shell: bash
run: |
cd .tests/
make test-smoke-config
if: success() || failure()
- name: Test Intranet
shell: bash
run: |
cd .tests/
make test-smoke-intranet
if: success() || failure()
- name: Test Vendors
shell: bash
run: |
cd .tests/
make test-smoke-vendors
if: success() || failure()
- name: Test Vhosts
shell: bash
run: |
cd .tests/
make test-smoke-vhosts
if: success() || failure()
- name: Test Reverse Proxy
shell: bash
run: |
cd .tests/
make test-smoke-rproxies
if: success() || failure()
- name: Test SSL
shell: bash
run: |
cd .tests/
make test-smoke-ssl
if: success() || failure()
- name: Test Bind
shell: bash
run: |
cd .tests/
make test-smoke-bind
if: success() || failure()
- name: Test Autostart
shell: bash
run: |
cd .tests/
make test-smoke-autostart
if: success() || failure()
- name: "Test Framework: CakePHP"
shell: bash
run: |
cd .tests/
make test-smoke-framework-cakephp
if: success() || failure()
- name: "Test Framework: Drupal"
shell: bash
run: |
cd .tests/
make test-smoke-framework-drupal
if: success() || failure()
- name: "Test Framework: Wordpress"
shell: bash
run: |
cd .tests/
make test-smoke-framework-wordpress
if: success() || failure()
- name: "Test Container"
shell: bash
run: |
retry() {
for n in $(seq 5); do
echo "[${n}/5] ${*}";
if eval "${*}"; then
echo "[SUCC] ${n}/t";
return 0;
fi;
sleep 5;
echo "[FAIL] ${n}/5";
done;
return 1;
}
cd .tests/
retry make test-smoke-container
if: success() || failure()
# ------------------------------------------------------------
# Finish
# ------------------------------------------------------------
- name: "Finish: Docker logs"
shell: bash
run: |
cd .tests/
make logs
if: success() || failure()

76
.github/workflows/test-httpd.yml vendored Normal file
View File

@ -0,0 +1,76 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: Httpd
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
# Runs on Pull Requests
pull_request:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
# Runs on master Branch and Tags
push:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
branches:
- master
tags:
- '[0-9]+.[0-9]+*'
jobs:
# -----------------------------------------------------------------------------------------------
# (1/3) Determine parameter settings
# -----------------------------------------------------------------------------------------------
params:
uses: ./.github/workflows/params-httpd.yml
# -----------------------------------------------------------------------------------------------
# (2/3) Test with default settings
# -----------------------------------------------------------------------------------------------
default:
needs: [params]
uses: ./.github/workflows/zzz-reuse-tests.yml
with:
matrix: ${{ needs.params.outputs.matrix }}
custom_config: false
operating_system: ubuntu-latest
# -----------------------------------------------------------------------------------------------
# (3/3) Test with customizedt settings
# -----------------------------------------------------------------------------------------------
custom:
needs: [params]
uses: ./.github/workflows/zzz-reuse-tests.yml
with:
matrix: ${{ needs.params.outputs.matrix }}
custom_config: true
operating_system: ubuntu-latest

76
.github/workflows/test-memcd.yml vendored Normal file
View File

@ -0,0 +1,76 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: Memcd
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
# Runs on Pull Requests
pull_request:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
# Runs on master Branch and Tags
push:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
branches:
- master
tags:
- '[0-9]+.[0-9]+*'
jobs:
# -----------------------------------------------------------------------------------------------
# (1/3) Determine parameter settings
# -----------------------------------------------------------------------------------------------
params:
uses: ./.github/workflows/params-memcd.yml
# -----------------------------------------------------------------------------------------------
# (2/3) Test with default settings
# -----------------------------------------------------------------------------------------------
default:
needs: [params]
uses: ./.github/workflows/zzz-reuse-tests.yml
with:
matrix: ${{ needs.params.outputs.matrix }}
custom_config: false
operating_system: ubuntu-latest
# -----------------------------------------------------------------------------------------------
# (3/3) Test with customizedt settings
# -----------------------------------------------------------------------------------------------
custom:
needs: [params]
uses: ./.github/workflows/zzz-reuse-tests.yml
with:
matrix: ${{ needs.params.outputs.matrix }}
custom_config: true
operating_system: ubuntu-latest

76
.github/workflows/test-mongo.yml vendored Normal file
View File

@ -0,0 +1,76 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: Mongo
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
# Runs on Pull Requests
pull_request:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
# Runs on master Branch and Tags
push:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
branches:
- master
tags:
- '[0-9]+.[0-9]+*'
jobs:
# -----------------------------------------------------------------------------------------------
# (1/3) Determine parameter settings
# -----------------------------------------------------------------------------------------------
params:
uses: ./.github/workflows/params-mongo.yml
# -----------------------------------------------------------------------------------------------
# (2/3) Test with default settings
# -----------------------------------------------------------------------------------------------
default:
needs: [params]
uses: ./.github/workflows/zzz-reuse-tests.yml
with:
matrix: ${{ needs.params.outputs.matrix }}
custom_config: false
operating_system: ubuntu-latest
# -----------------------------------------------------------------------------------------------
# (3/3) Test with customizedt settings
# -----------------------------------------------------------------------------------------------
custom:
needs: [params]
uses: ./.github/workflows/zzz-reuse-tests.yml
with:
matrix: ${{ needs.params.outputs.matrix }}
custom_config: true
operating_system: ubuntu-latest

76
.github/workflows/test-mysql.yml vendored Normal file
View File

@ -0,0 +1,76 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: MySQL
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
# Runs on Pull Requests
pull_request:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
# Runs on master Branch and Tags
push:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
branches:
- master
tags:
- '[0-9]+.[0-9]+*'
jobs:
# -----------------------------------------------------------------------------------------------
# (1/3) Determine parameter settings
# -----------------------------------------------------------------------------------------------
params:
uses: ./.github/workflows/params-mysql.yml
# -----------------------------------------------------------------------------------------------
# (2/3) Test with default settings
# -----------------------------------------------------------------------------------------------
default:
needs: [params]
uses: ./.github/workflows/zzz-reuse-tests.yml
with:
matrix: ${{ needs.params.outputs.matrix }}
custom_config: false
operating_system: ubuntu-latest
# -----------------------------------------------------------------------------------------------
# (3/3) Test with customizedt settings
# -----------------------------------------------------------------------------------------------
custom:
needs: [params]
uses: ./.github/workflows/zzz-reuse-tests.yml
with:
matrix: ${{ needs.params.outputs.matrix }}
custom_config: true
operating_system: ubuntu-latest

76
.github/workflows/test-pgsql.yml vendored Normal file
View File

@ -0,0 +1,76 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: PgSQL
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
# Runs on Pull Requests
pull_request:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
# Runs on master Branch and Tags
push:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
branches:
- master
tags:
- '[0-9]+.[0-9]+*'
jobs:
# -----------------------------------------------------------------------------------------------
# (1/3) Determine parameter settings
# -----------------------------------------------------------------------------------------------
params:
uses: ./.github/workflows/params-pgsql.yml
# -----------------------------------------------------------------------------------------------
# (2/3) Test with default settings
# -----------------------------------------------------------------------------------------------
default:
needs: [params]
uses: ./.github/workflows/zzz-reuse-tests.yml
with:
matrix: ${{ needs.params.outputs.matrix }}
custom_config: false
operating_system: ubuntu-latest
# -----------------------------------------------------------------------------------------------
# (3/3) Test with customizedt settings
# -----------------------------------------------------------------------------------------------
custom:
needs: [params]
uses: ./.github/workflows/zzz-reuse-tests.yml
with:
matrix: ${{ needs.params.outputs.matrix }}
custom_config: true
operating_system: ubuntu-latest

76
.github/workflows/test-php.yml vendored Normal file
View File

@ -0,0 +1,76 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: PHP
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
# Runs on Pull Requests
pull_request:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
# Runs on master Branch and Tags
push:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
branches:
- master
tags:
- '[0-9]+.[0-9]+*'
jobs:
# -----------------------------------------------------------------------------------------------
# (1/3) Determine parameter settings
# -----------------------------------------------------------------------------------------------
params:
uses: ./.github/workflows/params-php.yml
# -----------------------------------------------------------------------------------------------
# (2/3) Test with default settings
# -----------------------------------------------------------------------------------------------
default:
needs: [params]
uses: ./.github/workflows/zzz-reuse-tests.yml
with:
matrix: ${{ needs.params.outputs.matrix }}
custom_config: false
operating_system: ubuntu-latest
# -----------------------------------------------------------------------------------------------
# (3/3) Test with customizedt settings
# -----------------------------------------------------------------------------------------------
custom:
needs: [params]
uses: ./.github/workflows/zzz-reuse-tests.yml
with:
matrix: ${{ needs.params.outputs.matrix }}
custom_config: true
operating_system: ubuntu-latest

76
.github/workflows/test-redis.yml vendored Normal file
View File

@ -0,0 +1,76 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: Redis
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
# Runs on Pull Requests
pull_request:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
# Runs on master Branch and Tags
push:
paths:
- '.devilbox/**'
- '.github/workflows/params*.yml'
- '.github/workflows/test*.yml'
- '.github/workflows/zzz*.yml'
- '.tests/**'
- 'cfg/vhost-gen/**'
- 'compose/**'
- 'docker-compose.override.yml-example'
- 'docker-compose.yml'
- 'env-example'
- '!**.md'
branches:
- master
tags:
- '[0-9]+.[0-9]+*'
jobs:
# -----------------------------------------------------------------------------------------------
# (1/3) Determine parameter settings
# -----------------------------------------------------------------------------------------------
params:
uses: ./.github/workflows/params-redis.yml
# -----------------------------------------------------------------------------------------------
# (2/3) Test with default settings
# -----------------------------------------------------------------------------------------------
default:
needs: [params]
uses: ./.github/workflows/zzz-reuse-tests.yml
with:
matrix: ${{ needs.params.outputs.matrix }}
custom_config: false
operating_system: ubuntu-latest
# -----------------------------------------------------------------------------------------------
# (3/3) Test with customizedt settings
# -----------------------------------------------------------------------------------------------
custom:
needs: [params]
uses: ./.github/workflows/zzz-reuse-tests.yml
with:
matrix: ${{ needs.params.outputs.matrix }}
custom_config: true
operating_system: ubuntu-latest

View File

@ -1,318 +0,0 @@
---
# -------------------------------------------------------------------------------------------------
# Job Name
# -------------------------------------------------------------------------------------------------
name: Versions
# -------------------------------------------------------------------------------------------------
# When to run
# -------------------------------------------------------------------------------------------------
on:
# Runs on Pull Requests
pull_request:
# Runs on master Branch and Tags
push:
branches:
- master
tags:
- '[0-9]+.[0-9]+*'
# -------------------------------------------------------------------------------------------------
# What to run
# -------------------------------------------------------------------------------------------------
jobs:
smoke_version:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
version:
- "MYSQL_SERVER=mysql-5.5"
- "MYSQL_SERVER=mysql-5.6"
- "MYSQL_SERVER=mysql-5.7"
- "MYSQL_SERVER=mysql-8.0"
- "MYSQL_SERVER=mariadb-5.5"
- "MYSQL_SERVER=mariadb-10.0"
- "MYSQL_SERVER=mariadb-10.1"
- "MYSQL_SERVER=mariadb-10.2"
- "MYSQL_SERVER=mariadb-10.3"
- "MYSQL_SERVER=mariadb-10.4"
- "MYSQL_SERVER=mariadb-10.5"
- "MYSQL_SERVER=mariadb-10.6"
- "MYSQL_SERVER=mariadb-10.7"
- "MYSQL_SERVER=mariadb-10.8"
- "MYSQL_SERVER=percona-5.5"
- "MYSQL_SERVER=percona-5.6"
- "MYSQL_SERVER=percona-5.7"
- "MYSQL_SERVER=percona-8.0"
- "PGSQL_SERVER=9.0"
- "PGSQL_SERVER=9.1"
- "PGSQL_SERVER=9.2"
- "PGSQL_SERVER=9.2-alpine"
- "PGSQL_SERVER=9.3"
- "PGSQL_SERVER=9.3-alpine"
- "PGSQL_SERVER=9.4"
- "PGSQL_SERVER=9.4-alpine"
- "PGSQL_SERVER=9.5"
- "PGSQL_SERVER=9.5-alpine"
- "PGSQL_SERVER=9.6"
- "PGSQL_SERVER=9.6-alpine"
- "PGSQL_SERVER=10.0"
- "PGSQL_SERVER=10.0-alpine"
- "PGSQL_SERVER=10.1"
- "PGSQL_SERVER=10.1-alpine"
- "PGSQL_SERVER=10.2"
- "PGSQL_SERVER=10.2-alpine"
- "PGSQL_SERVER=10.3"
- "PGSQL_SERVER=10.3-alpine"
- "PGSQL_SERVER=10.4"
- "PGSQL_SERVER=10.4-alpine"
- "PGSQL_SERVER=10.5"
- "PGSQL_SERVER=10.5-alpine"
- "PGSQL_SERVER=10.6"
- "PGSQL_SERVER=10.6-alpine"
- "PGSQL_SERVER=11.0"
- "PGSQL_SERVER=11.0-alpine"
- "PGSQL_SERVER=11.1"
- "PGSQL_SERVER=11.1-alpine"
- "PGSQL_SERVER=11.2"
- "PGSQL_SERVER=11.2-alpine"
- "PGSQL_SERVER=11.3"
- "PGSQL_SERVER=11.3-alpine"
- "PGSQL_SERVER=11.4"
- "PGSQL_SERVER=11.4-alpine"
- "PGSQL_SERVER=11.5"
- "PGSQL_SERVER=11.5-alpine"
- "PGSQL_SERVER=11.6"
- "PGSQL_SERVER=11.6-alpine"
- "PGSQL_SERVER=11.7"
- "PGSQL_SERVER=11.7-alpine"
- "PGSQL_SERVER=11.8"
- "PGSQL_SERVER=11.8-alpine"
- "PGSQL_SERVER=11.9"
- "PGSQL_SERVER=11.9-alpine"
- "PGSQL_SERVER=12.0"
- "PGSQL_SERVER=12.0-alpine"
- "PGSQL_SERVER=12.1"
- "PGSQL_SERVER=12.1-alpine"
- "PGSQL_SERVER=12.2"
- "PGSQL_SERVER=12.2-alpine"
- "PGSQL_SERVER=12.3"
- "PGSQL_SERVER=12.3-alpine"
- "PGSQL_SERVER=13.0"
- "PGSQL_SERVER=13.0-alpine"
- "PGSQL_SERVER=latest"
- "PGSQL_SERVER=alpine"
- "REDIS_SERVER=2.8"
- "REDIS_SERVER=3.0"
- "REDIS_SERVER=3.0-alpine"
- "REDIS_SERVER=3.2"
- "REDIS_SERVER=3.2-alpine"
- "REDIS_SERVER=4.0"
- "REDIS_SERVER=4.0-alpine"
- "REDIS_SERVER=5.0"
- "REDIS_SERVER=5.0-alpine"
- "REDIS_SERVER=6.0"
- "REDIS_SERVER=6.0-alpine"
- "REDIS_SERVER=latest"
- "REDIS_SERVER=alpine"
- "MEMCD_SERVER=1.4"
- "MEMCD_SERVER=1.4-alpine"
- "MEMCD_SERVER=1.5"
- "MEMCD_SERVER=1.5-alpine"
- "MEMCD_SERVER=1.6"
- "MEMCD_SERVER=1.6-alpine"
- "MEMCD_SERVER=latest"
- "MEMCD_SERVER=alpine"
- "MONGO_SERVER=2.8"
- "MONGO_SERVER=3.0"
- "MONGO_SERVER=3.2"
- "MONGO_SERVER=3.4"
- "MONGO_SERVER=3.6"
- "MONGO_SERVER=4.0"
- "MONGO_SERVER=4.2"
- "MONGO_SERVER=4.4"
- "MONGO_SERVER=latest"
name: "[${{ matrix.version }}]"
steps:
# ------------------------------------------------------------
# Checkout repository
# ------------------------------------------------------------
- name: Checkout repository
uses: actions/checkout@v1
- name: Show environment
shell: bash
run: |
env
- name: Show network
shell: bash
run: |
netstat -an || true
ss -tlun || true
- name: Show Docker version
shell: bash
run: |
docker version
# ------------------------------------------------------------
# Setup
# ------------------------------------------------------------
- name: Configure
shell: bash
run: |
cd .tests/
# Set the matrix version
make configure KEY="${VERSION//=*/}" VAL="${VERSION//*=}"
# 3306 is taken, so chose another one
make configure KEY=HOST_PORT_MYSQL VAL=3307
env:
VERSION: ${{ matrix.version }}
- name: Pull images
shell: bash
run: |
cd .tests/
make pull
- name: Startup
shell: bash
run: |
cd .tests/
make start
- name: Docker logs
shell: bash
run: |
cd .tests/
make logs
# ------------------------------------------------------------
# Run tests
# ------------------------------------------------------------
- name: Test Modules
shell: bash
run: |
cd .tests/
make test-smoke-modules
if: success() || failure()
- name: Test Config
shell: bash
run: |
cd .tests/
make test-smoke-config
if: success() || failure()
- name: Test Intranet
shell: bash
run: |
cd .tests/
make test-smoke-intranet
if: success() || failure()
- name: Test Vendors
shell: bash
run: |
cd .tests/
make test-smoke-vendors
if: success() || failure()
- name: Test Vhosts
shell: bash
run: |
cd .tests/
make test-smoke-vhosts
if: success() || failure()
- name: Test Reverse Proxy
shell: bash
run: |
cd .tests/
make test-smoke-rproxies
if: success() || failure()
- name: Test SSL
shell: bash
run: |
cd .tests/
make test-smoke-ssl
if: success() || failure()
- name: Test Bind
shell: bash
run: |
cd .tests/
make test-smoke-bind
if: success() || failure()
- name: Test Autostart
shell: bash
run: |
cd .tests/
make test-smoke-autostart
if: success() || failure()
- name: "Test Framework: CakePHP"
shell: bash
run: |
cd .tests/
make test-smoke-framework-cakephp
if: success() || failure()
- name: "Test Framework: Drupal"
shell: bash
run: |
cd .tests/
make test-smoke-framework-drupal
if: success() || failure()
- name: "Test Framework: Wordpress"
shell: bash
run: |
cd .tests/
make test-smoke-framework-wordpress
if: success() || failure()
- name: "Test Container"
shell: bash
run: |
retry() {
for n in $(seq 5); do
echo "[${n}/5] ${*}";
if eval "${*}"; then
echo "[SUCC] ${n}/t";
return 0;
fi;
sleep 5;
echo "[FAIL] ${n}/5";
done;
return 1;
}
cd .tests/
retry make test-smoke-container
if: success() || failure()
# ------------------------------------------------------------
# Finish
# ------------------------------------------------------------
- name: "Finish: Docker logs"
shell: bash
run: |
cd .tests/
make logs
if: success() || failure()

284
.github/workflows/zzz-reuse-tests.yml vendored Normal file
View File

@ -0,0 +1,284 @@
---
name: Reusable worfklow for tests
on:
workflow_call:
###
### Variables
###
inputs:
matrix:
description: 'The test matrix'
required: true
type: string
custom_config:
description: 'Apply customized .env configuration?'
required: true
type: boolean
operating_system:
description: 'The operating system to run on'
required: true
type: string
jobs:
# -----------------------------------------------------------------------------------------------
# JOB: BUILD
# -----------------------------------------------------------------------------------------------
test:
runs-on: ${{ inputs.operating_system }}
strategy:
fail-fast: false
matrix:
include: ${{ fromJson(inputs.matrix) }}
steps:
# ------------------------------------------------------------
# Setup repository
# ------------------------------------------------------------
- name: "[SETUP] Checkout repository (current)"
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: "[DEBUG] Show Matrix configuration"
shell: bash
run: |
echo '${{ toJson(matrix) }}' | jq -r
- name: "[DEBUG] Show env variables"
shell: bash
run: |
env
- name: "[DEBUG] Show open network ports"
shell: bash
run: |
netstat -an || true
ss -tlun || true
- name: "[DEBUG] Show Docker version"
shell: bash
run: |
docker version
- name: "[DEBUG] Show Docker Compose version"
shell: bash
run: |
docker-compose version
# ------------------------------------------------------------
# Configure
# ------------------------------------------------------------
- name: "[Configure] Configure customized configuration"
shell: bash
run: |
cd "${GITHUB_WORKSPACE}/.tests/"
# Test full customization
make configure KEY=DEBUG_ENTRYPOINT VAL="$(( RANDOM % 3 ))"
make configure KEY=DOCKER_LOGS VAL="$(( RANDOM % 1 ))"
make configure KEY=TLD_SUFFIX VAL=loc2
make configure KEY=TIMEZONE VAL='Europe/Berlin'
make configure KEY=PHP_MODULES_DISABLE VAL=
make configure KEY=HTTPD_TEMPLATE_DIR VAL=.config
make configure KEY=HOST_PORT_HTTPD VAL=8080
make configure KEY=HOST_PORT_HTTPD_SSL VAL=8443
make configure KEY=MYSQL_ROOT_PASSWORD VAL=mysqlpass
make configure KEY=PGSQL_ROOT_USER VAL=pgroot
make configure KEY=PGSQL_ROOT_PASSWORD VAL=pgsqlpass
make configure KEY=DEVILBOX_VENDOR_PHPMYADMIN_AUTOLOGIN VAL=0
if: inputs.custom_config
- name: "[Configure] Configure versions"
shell: bash
run: |
# (1/3) Change to .tests/ directory
cd "${GITHUB_WORKSPACE}/.tests/"
# (2/3) Change MySQL port 3306 to 3307 (3306 is already taken)
make configure KEY=HOST_PORT_MYSQL VAL=3307
# (3/3) Loop over configured values
while IFS= read -r line; do
KEY="${line}"
VAL="$( echo '${{ toJson(matrix) }}' | jq -r ".${KEY}" | awk '{print $NF}' )"
echo "KEY: ${KEY}"
echo "VAL: ${VAL}"
# Set the matrix version
make configure KEY="${KEY}" VAL="${VAL}"
done <<< "$( echo '${{ toJson(matrix) }}' | jq -r 'keys[]' )"
- name: "[Configure] Show .env file"
shell: bash
run: |
cat .env
# ------------------------------------------------------------
# Startup
# ------------------------------------------------------------
- name: "[Startup] Pull images"
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make pull
- name: "[Startup] Start Devilbox"
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make start
- name: "[Startup] Show Docker logs"
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make logs
# ------------------------------------------------------------
# Run tests
# ------------------------------------------------------------
- name: Test Modules
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make test-smoke-modules
- name: Test Config
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make test-smoke-config
if: success() || failure()
- name: Test Intranet
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make test-smoke-intranet
if: success() || failure()
- name: Test Vendors
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make test-smoke-vendors
if: success() || failure()
- name: Test Vhosts
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make test-smoke-vhosts
if: success() || failure()
- name: Test Reverse Proxy
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make test-smoke-rproxies
if: success() || failure()
- name: Test SSL
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make test-smoke-ssl
if: success() || failure()
- name: Test Bind
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make test-smoke-bind
if: success() || failure()
- name: Test Autostart
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make test-smoke-autostart
if: success() || failure()
- name: "Test Framework: CakePHP"
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make test-smoke-framework-cakephp
if: success() || failure()
- name: "Test Framework: Drupal"
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make test-smoke-framework-drupal
if: success() || failure()
- name: "Test Framework: Wordpress"
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make test-smoke-framework-wordpress
if: success() || failure()
- name: "Test Container"
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make test-smoke-container
if: success() || failure()
# ------------------------------------------------------------
# Finish
# ------------------------------------------------------------
- name: "Finish: Docker logs"
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make logs
if: success() || failure()
- name: "Finish: Shutdown"
uses: cytopia/shell-command-retry-action@v0.1.3
with:
retries: 3
workdir: "${{ github.workspace }}/.tests/"
command: |
make stop
if: success() || failure()

6
.gitignore vendored
View File

@ -50,9 +50,9 @@
# Ignore custom global vhost gen templates # Ignore custom global vhost gen templates
/cfg/vhost-gen/apache22.conf /cfg/vhost-gen/apache22.yml
/cfg/vhost-gen/apache24.conf /cfg/vhost-gen/apache24.yml
/cfg/vhost-gen/nginx.conf /cfg/vhost-gen/nginx.yml
# Ignore custom HTTPD configs # Ignore custom HTTPD configs
/cfg/apache-2.2/*.conf /cfg/apache-2.2/*.conf

View File

@ -6,12 +6,24 @@ endif
# ------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------
# Misc Targets # Misc Targets
# ------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------
update-readme: .PHONY: update-readme
update-readme: _update-readme-modules
update-readme: _update-readme-tools
.PHONY: _update-readme-modules
_update-readme-modules:
cat "../README.md" \ cat "../README.md" \
| perl -0 -pe "s#<!-- modules -->.*<!-- /modules -->#<!-- modules -->\n$$(./scripts/get-modules.sh)\n<!-- /modules -->#s" \ | perl -0 -pe "s#<!-- modules -->.*<!-- /modules -->#<!-- modules -->\n$$(./scripts/get-modules.sh)\n<!-- /modules -->#s" \
> "../README.md.tmp" > "../README.md.tmp"
yes | mv -f "../README.md.tmp" "../README.md" yes | mv -f "../README.md.tmp" "../README.md"
.PHONY: _update-readme-tools
_update-readme-tools:
cat "../README.md" \
| perl -0 -pe "s#<!-- tools -->.*<!-- /tools -->#<!-- tools -->\n$$(./scripts/get-tools.sh)\n<!-- /tools -->#s" \
> "../README.md.tmp"
yes | mv -f "../README.md.tmp" "../README.md"
# ------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------
# Linting Targets # Linting Targets
@ -51,7 +63,7 @@ pull: ../.env
### ###
start: ../.env start: ../.env
@$(MAKE) --no-print-directory configure KEY=HOST_PATH_HTTPD_DATADIR VAL=.tests/www @$(MAKE) --no-print-directory configure KEY=HOST_PATH_HTTPD_DATADIR VAL=.tests/www
@$(MAKE) --no-print-directory configure KEY=DEBUG_COMPOSE_ENTRYPOINT VAL=2 @$(MAKE) --no-print-directory configure KEY=DEBUG_ENTRYPOINT VAL=3
@$(MAKE) --no-print-directory configure KEY=NEW_UID VAL=$$(id -u) @$(MAKE) --no-print-directory configure KEY=NEW_UID VAL=$$(id -u)
@$(MAKE) --no-print-directory configure KEY=NEW_GID VAL=$$(id -g) @$(MAKE) --no-print-directory configure KEY=NEW_GID VAL=$$(id -g)
@$(PWD)/scripts/compose-start.sh @$(PWD)/scripts/compose-start.sh
@ -160,6 +172,7 @@ test-smoke-autostart:
### ###
test-smoke-framework-cakephp: test-smoke-framework-cakephp:
$(PWD)/tests/framework-cakephp.sh $(PWD)/tests/framework-cakephp.sh
$(PWD)/tests/framework-cakephp-php8.sh
test-smoke-framework-drupal: test-smoke-framework-drupal:
$(PWD)/tests/framework-drupal.sh $(PWD)/tests/framework-drupal.sh

View File

@ -47,8 +47,7 @@ get_php_version() {
# Check php -v # Check php -v
>&2 printf "Fetching PHP version from php -v: " >&2 printf "Fetching PHP version from php -v: "
if ! cli_version="$( run "docker-compose exec -T php php -v \ if ! cli_version="$( run "docker-compose exec -T php php -v \
| head -1 \ | grep -Eo '^PHP[[:space:]]+[0-9]+\\.[0-9]+' \
| grep -Eo 'PHP[[:space:]]+[0-9]+\\.[0-9]+' \
| grep -Eo '[0-9]+\\.[0-9]+'" \ | grep -Eo '[0-9]+\\.[0-9]+'" \
"${retries}" "${root_path}" "0" )"; then "${retries}" "${root_path}" "0" )"; then
>&2 printf "FAILED\\n" >&2 printf "FAILED\\n"
@ -118,6 +117,52 @@ replace() {
} }
###
### Print colorized OK message
###
print_succ() {
local leading_nl="${1}"
local trailing_nl="${2}"
local message="${3}"
local green="\\033[0;32m"
local reset="\\033[0m"
if [ "${leading_nl}" = "1" ] && [ "${trailing_nl}" = "1" ]; then
printf "\\r${green}[OK]${reset} %s\\n" "${message}"
elif [ "${leading_nl}" = "1" ]; then
printf "\\r${green}[OK]${reset} %s" "${message}"
elif [ "${trailing_nl}" = "1" ]; then
printf "${green}[OK]${reset} %s\\n" "${message}"
else
printf "${green}[OK]${reset} %s" "${message}"
fi
}
###
### Print colorized FAIL message
###
print_fail() {
local leading_nl="${1}"
local trailing_nl="${2}"
local message="${3}"
local red="\\033[0;31m"
local reset="\\033[0m"
if [ "${leading_nl}" = "1" ] && [ "${trailing_nl}" = "1" ]; then
printf "\\r${red}[FAIL]${reset} %s\\n" "${message}"
elif [ "${leading_nl}" = "1" ]; then
printf "\\r${red}[FAIL]${reset} %s" "${message}"
elif [ "${trailing_nl}" = "1" ]; then
printf "${red}[FAIL]${reset} %s\\n" "${message}"
else
printf "${red}[FAIL]${reset} %s" "${message}"
fi
}
### ###
### Run command ### Run command
### ###

View File

@ -53,7 +53,7 @@ until curl -sS -I --fail -o /dev/null -w "%{http_code}" "http://localhost:${HOST
printf "." printf "."
i=$(( i + 1 )) i=$(( i + 1 ))
if [ "${i}" -eq "60" ]; then if [ "${i}" -eq "120" ]; then
printf "[FAIL]\\n\\n" printf "[FAIL]\\n\\n"
echo "---- curl From host ----" echo "---- curl From host ----"
curl -sS -v "http://localhost:${HOST_PORT_HTTPD}" || true curl -sS -v "http://localhost:${HOST_PORT_HTTPD}" || true
@ -84,7 +84,7 @@ until curl -sS --fail "http://localhost:${HOST_PORT_HTTPD}" 2>/dev/null | grep '
printf "." printf "."
i=$(( i + 1 )) i=$(( i + 1 ))
if [ "${i}" -eq "60" ]; then if [ "${i}" -eq "120" ]; then
printf "[FAIL]\\n" printf "[FAIL]\\n"
curl -sS -v "http://localhost:${HOST_PORT_HTTPD}" curl -sS -v "http://localhost:${HOST_PORT_HTTPD}"
curl -sS -I "http://localhost:${HOST_PORT_HTTPD}" curl -sS -I "http://localhost:${HOST_PORT_HTTPD}"
@ -120,7 +120,7 @@ until cd "${DVLBOX_PATH}" && docker-compose exec -T php mongofiles --host=mongo
printf "." printf "."
i=$(( i + 1 )) i=$(( i + 1 ))
if [ "${i}" -eq "60" ]; then if [ "${i}" -eq "120" ]; then
printf "[FAIL]\\n" printf "[FAIL]\\n"
run "cd ${DVLBOX_PATH} && docker-compose exec -T php mongofiles --host=mongo list" || true run "cd ${DVLBOX_PATH} && docker-compose exec -T php mongofiles --host=mongo list" || true
run "cd ${DVLBOX_PATH} && docker-compose logs" || true run "cd ${DVLBOX_PATH} && docker-compose logs" || true
@ -143,7 +143,7 @@ until cd "${DVLBOX_PATH}" && docker-compose exec -T php mysql --user=root --pass
printf "." printf "."
i=$(( i + 1 )) i=$(( i + 1 ))
if [ "${i}" -eq "60" ]; then if [ "${i}" -eq "120" ]; then
printf "[FAIL]\\n" printf "[FAIL]\\n"
run "cd ${DVLBOX_PATH} && docker-compose exec -T php mysql --user=root --password=\"${MYSQL_ROOT_PASSWORD}\" --host=mysql -e 'show databases;'" || true run "cd ${DVLBOX_PATH} && docker-compose exec -T php mysql --user=root --password=\"${MYSQL_ROOT_PASSWORD}\" --host=mysql -e 'show databases;'" || true
run "cd ${DVLBOX_PATH} && docker-compose logs" || true run "cd ${DVLBOX_PATH} && docker-compose logs" || true
@ -166,7 +166,7 @@ until cd "${DVLBOX_PATH}" && docker-compose exec -T php pg_isready --host=pgsql
printf "." printf "."
i=$(( i + 1 )) i=$(( i + 1 ))
if [ "${i}" -eq "60" ]; then if [ "${i}" -eq "120" ]; then
printf "[FAIL]\\n" printf "[FAIL]\\n"
run "cd ${DVLBOX_PATH} && docker-compose exec -T php pg_isready --host=pgsql" || true run "cd ${DVLBOX_PATH} && docker-compose exec -T php pg_isready --host=pgsql" || true
run "cd ${DVLBOX_PATH} && docker-compose logs" || true run "cd ${DVLBOX_PATH} && docker-compose logs" || true

View File

@ -20,326 +20,70 @@ RETRIES=10
# ------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------
PHP_TAG="$( grep 'devilbox/php' "${DVLBOX_PATH}/docker-compose.yml" | sed 's/^.*-work-//g' )" PHP_TAG="$( grep 'devilbox/php' "${DVLBOX_PATH}/docker-compose.yml" | sed 's/^.*-work-//g' )"
PHP_MOD="$( run "curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/doc/php-modules.md'" "${RETRIES}" )";
### get_modules() {
### Get PHP core modules (5 rounds) local php_version="${1}"
### local stage="${2}"
if ! PHP52_BASE="$( run "\ local modules=
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \ local names=
| tac \
| tac \ modules="$( \
| grep -E '52-base' \ echo "${PHP_MOD}" \
| grep -E "ext_${stage}_.+_${php_version}" \
| grep -v '><' \
| sed \ | sed \
-e 's/.*\">//g' \ -e "s|.*ext_${stage}_||g" \
-e 's/<.*//g'" "${RETRIES}" )"; then -e "s|_${php_version}.*||g" \
>&2 echo "Failed to retrieve modules for PHP 5.2" )"
exit 1 # Ensure to fetch name with correct upper-/lower-case
fi while read -r module; do
name="$( \
echo "${PHP_MOD}" \
| grep -Eio ">${module}<" \
| sed -e 's|>||g' -e 's|<||g' \
| sort -u \
)"
names="$( printf "%s\n%s" "${names}" "${name}" )"
done < <(echo "${modules}")
if ! PHP53_BASE="$( run "\ # Remove leading and trailing newline
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \ names="$( echo "${names}" | grep -v '^$' )"
| tac \
| tac \
| grep -E '53-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.3"
exit 1
fi
if ! PHP54_BASE="$( run "\ # Output comma separated
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \ echo "${names}" | paste -d, -s
| tac \ }
| tac \
| grep -E '54-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.4"
exit 1
fi
if ! PHP55_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '55-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.5"
exit 1
fi
if ! PHP56_BASE="$( run "\ PHP52_BASE="$( get_modules "5.2" "base" )"
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \ PHP53_BASE="$( get_modules "5.3" "base" )"
| tac \ PHP54_BASE="$( get_modules "5.4" "base" )"
| tac \ PHP55_BASE="$( get_modules "5.5" "base" )"
| grep -E '56-base' \ PHP56_BASE="$( get_modules "5.6" "base" )"
| sed \ PHP70_BASE="$( get_modules "7.0" "base" )"
-e 's/.*\">//g' \ PHP71_BASE="$( get_modules "7.1" "base" )"
-e 's/<.*//g'" "${RETRIES}" )"; then PHP72_BASE="$( get_modules "7.2" "base" )"
>&2 echo "Failed to retrieve modules for PHP 5.6" PHP73_BASE="$( get_modules "7.3" "base" )"
exit 1 PHP74_BASE="$( get_modules "7.4" "base" )"
fi PHP80_BASE="$( get_modules "8.0" "base" )"
PHP81_BASE="$( get_modules "8.1" "base" )"
PHP82_BASE="$( get_modules "8.2" "base" )"
if ! PHP70_BASE="$( run "\ PHP52_MODS="$( get_modules "5.2" "mods" )"
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \ PHP53_MODS="$( get_modules "5.3" "mods" )"
| tac \ PHP54_MODS="$( get_modules "5.4" "mods" )"
| tac \ PHP55_MODS="$( get_modules "5.5" "mods" )"
| grep -E '70-base' \ PHP56_MODS="$( get_modules "5.6" "mods" )"
| sed \ PHP70_MODS="$( get_modules "7.0" "mods" )"
-e 's/.*\">//g' \ PHP71_MODS="$( get_modules "7.1" "mods" )"
-e 's/<.*//g'" "${RETRIES}" )"; then PHP72_MODS="$( get_modules "7.2" "mods" )"
>&2 echo "Failed to retrieve modules for PHP 7.0" PHP73_MODS="$( get_modules "7.3" "mods" )"
exit 1 PHP74_MODS="$( get_modules "7.4" "mods" )"
fi PHP80_MODS="$( get_modules "8.0" "mods" )"
PHP81_MODS="$( get_modules "8.1" "mods" )"
PHP82_MODS="$( get_modules "8.2" "mods" )"
if ! PHP71_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '71-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.1"
exit 1
fi
if ! PHP72_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '72-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.2"
exit 1
fi
if ! PHP73_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '73-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.3"
exit 1
fi
if ! PHP74_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '74-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.4"
exit 1
fi
if ! PHP80_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '80-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 8.0"
exit 1
fi
if ! PHP81_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '81-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 8.1"
exit 1
fi
if ! PHP82_BASE="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '82-base' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 8.2"
exit 1
fi
###
### Get PHP mods modules (5 rounds)
###
if ! PHP52_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '52-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.2"
exit 1
fi
if ! PHP53_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '53-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.3"
exit 1
fi
if ! PHP54_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '54-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.4"
exit 1
fi
if ! PHP55_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '55-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.5"
exit 1
fi
if ! PHP56_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '56-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 5.6"
exit 1
fi
if ! PHP70_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '70-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.0"
exit 1
fi
if ! PHP71_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '71-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.1"
exit 1
fi
if ! PHP72_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '72-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.2"
exit 1
fi
if ! PHP73_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '73-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.3"
exit 1
fi
if ! PHP74_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '74-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 7.4"
exit 1
fi
if ! PHP80_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '80-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 8.0"
exit 1
fi
if ! PHP81_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '81-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 8.1"
exit 1
fi
if ! PHP82_MODS="$( run "\
curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/README.md' \
| tac \
| tac \
| grep -E '82-mods' \
| sed \
-e 's/.*\">//g' \
-e 's/<.*//g'" "${RETRIES}" )"; then
>&2 echo "Failed to retrieve modules for PHP 8.2"
exit 1
fi
### ###
### Todo: add ioncube ### Todo: add ioncube
@ -350,7 +94,7 @@ MODS="$( echo "${PHP52_MODS}, ${PHP53_MODS}, ${PHP54_MODS}, ${PHP55_MODS}, ${PHP
### ###
### Get disabled modules ### Get disabled modules
### ###
DISABLED=",blackfire,ioncube,phalcon,psr,$( grep -E '^PHP_MODULES_DISABLE=' "${DVLBOX_PATH}/env-example" | sed 's/.*=//g' )," DISABLED=",blackfire,ioncube,phalcon,psr,xhprof,$( grep -E '^PHP_MODULES_DISABLE=' "${DVLBOX_PATH}/env-example" | sed 's/.*=//g' ),"
#echo $DISABLED #echo $DISABLED
B="✔" # Enabled base modules (cannot be disabled) B="✔" # Enabled base modules (cannot be disabled)
E="🗸" # Enabled mods modules (can be disabled) E="🗸" # Enabled mods modules (can be disabled)

25
.tests/scripts/get-tools.sh Executable file
View File

@ -0,0 +1,25 @@
#!/usr/bin/env bash
# NOTE: Parsing curl to tac to circumnvent "failed writing body"
# https://stackoverflow.com/questions/16703647/why-curl-return-and-error-23-failed-writing-body
set -e
set -u
set -o pipefail
SCRIPT_PATH="$( cd "$(dirname "$0")" && pwd -P )"
DVLBOX_PATH="$( cd "${SCRIPT_PATH}/../.." && pwd -P )"
# shellcheck disable=SC1090
. "${SCRIPT_PATH}/.lib.sh"
RETRIES=10
# -------------------------------------------------------------------------------------------------
# FUNCTIONS
# -------------------------------------------------------------------------------------------------
PHP_TAG="$( grep 'devilbox/php' "${DVLBOX_PATH}/docker-compose.yml" | sed 's/^.*-work-//g' )"
PHP_TOOLS="$( run "curl -sS 'https://raw.githubusercontent.com/devilbox/docker-php-fpm/${PHP_TAG}/doc/available-tools.md'" "${RETRIES}" )";
echo "${PHP_TOOLS}" | grep -A 1000000 'TOOLS_WORK_START'

View File

@ -0,0 +1,95 @@
#!/usr/bin/env bash
# NOTE: Parsing curl to tac to circumnvent "failed writing body"
# https://stackoverflow.com/questions/16703647/why-curl-return-and-error-23-failed-writing-body
set -e
set -u
set -o pipefail
SCRIPT_PATH="$( cd "$(dirname "$0")" && pwd -P )"
DVLBOX_PATH="$( cd "${SCRIPT_PATH}/../.." && pwd -P )"
# shellcheck disable=SC1090
. "${SCRIPT_PATH}/../scripts/.lib.sh"
RETRIES=10
# see framework-cakephp.sh for PHP <8 tests
DISABLED_VERSIONS=("5.2" "5.3" "5.4" "5.5" "5.6" "7.0" "7.1" "7.2" "7.3" "7.4" "8.2")
PHP_VERSION="$( get_php_version "${DVLBOX_PATH}" )"
###
### What CakePHP Version?
###
CAKE_PHP_VERSION=4.3
echo
echo "# --------------------------------------------------------------------------------------------------"
echo "# [Framework] CakePHP ${CAKE_PHP_VERSION}"
echo "# --------------------------------------------------------------------------------------------------"
echo
# -------------------------------------------------------------------------------------------------
# Pre-check
# -------------------------------------------------------------------------------------------------
if [[ ${DISABLED_VERSIONS[*]} =~ ${PHP_VERSION} ]]; then
printf "[SKIP] Skipping all checks for PHP %s\\n" "${PHP_VERSION}"
exit 0
fi
# -------------------------------------------------------------------------------------------------
# ENTRYPOINT
# -------------------------------------------------------------------------------------------------
###
### Get required env values
###
MYSQL_ROOT_PASSWORD="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "MYSQL_ROOT_PASSWORD" )"
TLD_SUFFIX="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "TLD_SUFFIX" )"
VHOST="my-cakephp"
# Create vhost dir
create_vhost_dir "${VHOST}"
# Setup CakePHP project
run "docker-compose exec --user devilbox -T php bash -c 'cd /shared/httpd/${VHOST}; composer create-project --no-interaction --prefer-dist cakephp/app:~${CAKE_PHP_VERSION} cakephp'" "${RETRIES}" "${DVLBOX_PATH}"
run "docker-compose exec --user devilbox -T php bash -c 'cd /shared/httpd/${VHOST}; ln -sf cakephp/webroot htdocs'" "${RETRIES}" "${DVLBOX_PATH}"
run "docker-compose exec --user devilbox -T php mysql -u root -h mysql --password=\"${MYSQL_ROOT_PASSWORD}\" -e \"DROP DATABASE IF EXISTS my_cake; CREATE DATABASE my_cake;\"" "${RETRIES}" "${DVLBOX_PATH}"
# Configure CakePHP database settings
run "docker-compose exec --user devilbox -T php sed -i\"\" \"s/'host' =>.*/'host' => 'mysql',/g\" /shared/httpd/${VHOST}/cakephp/config/app_local.php" "${RETRIES}" "${DVLBOX_PATH}"
run "docker-compose exec --user devilbox -T php sed -i\"\" \"s/'username' =>.*/'username' => 'root',/g\" /shared/httpd/${VHOST}/cakephp/config/app_local.php" "${RETRIES}" "${DVLBOX_PATH}"
run "docker-compose exec --user devilbox -T php sed -i\"\" \"s/'password' =>.*/'password' => '${MYSQL_ROOT_PASSWORD}',/g\" /shared/httpd/${VHOST}/cakephp/config/app_local.php" "${RETRIES}" "${DVLBOX_PATH}"
run "docker-compose exec --user devilbox -T php sed -i\"\" \"s/'database' =>.*/'database' => 'my_cake',/g\" /shared/httpd/${VHOST}/cakephp/config/app_local.php" "${RETRIES}" "${DVLBOX_PATH}"
# Test CakePHP
ERROR=0
if ! run "docker-compose exec --user devilbox -T php curl -sS --fail 'http://${VHOST}.${TLD_SUFFIX}' | tac | tac | grep '\"bullet success\"' | grep 'mbstring'" "${RETRIES}" "${DVLBOX_PATH}"; then
ERROR=1
fi
if ! run "docker-compose exec --user devilbox -T php curl -sS --fail 'http://${VHOST}.${TLD_SUFFIX}' | tac | tac | grep '\"bullet success\"' | grep 'openssl'" "${RETRIES}" "${DVLBOX_PATH}"; then
ERROR=1
fi
if ! run "docker-compose exec --user devilbox -T php curl -sS --fail 'http://${VHOST}.${TLD_SUFFIX}' | tac | tac | grep '\"bullet success\"' | grep 'intl'" "${RETRIES}" "${DVLBOX_PATH}"; then
ERROR=1
fi
if ! run "docker-compose exec --user devilbox -T php curl -sS --fail 'http://${VHOST}.${TLD_SUFFIX}' | tac | tac | grep '\"bullet success\"' | grep 'tmp directory'" "${RETRIES}" "${DVLBOX_PATH}"; then
ERROR=1
fi
if ! run "docker-compose exec --user devilbox -T php curl -sS --fail 'http://${VHOST}.${TLD_SUFFIX}' | tac | tac | grep '\"bullet success\"' | grep 'logs directory'" "${RETRIES}" "${DVLBOX_PATH}"; then
ERROR=1
fi
if ! run "docker-compose exec --user devilbox -T php curl -sS --fail 'http://${VHOST}.${TLD_SUFFIX}' | tac | tac | grep '\"bullet success\"' | grep 'connect to the database'" "${RETRIES}" "${DVLBOX_PATH}"; then
ERROR=1
fi
if [ "${ERROR}" = "1" ]; then
run "docker-compose exec --user devilbox -T php curl 'http://${VHOST}.${TLD_SUFFIX}' || true" "1" "${DVLBOX_PATH}"
exit 1
fi

View File

@ -13,7 +13,8 @@ DVLBOX_PATH="$( cd "${SCRIPT_PATH}/../.." && pwd -P )"
. "${SCRIPT_PATH}/../scripts/.lib.sh" . "${SCRIPT_PATH}/../scripts/.lib.sh"
RETRIES=10 RETRIES=10
DISABLED_VERSIONS=("5.2" "5.3" "5.4" "5.5" "8.0" "8.1" "8.2") # see framework-cakephp-php8.sh for PHP 8+ tests
DISABLED_VERSIONS=("5.2" "5.3" "5.4" "5.5" "5.6" "7.0" "7.1" "7.2" "7.3" "7.4" "8.0" "8.1" "8.2")
PHP_VERSION="$( get_php_version "${DVLBOX_PATH}" )" PHP_VERSION="$( get_php_version "${DVLBOX_PATH}" )"

View File

@ -13,7 +13,7 @@ DVLBOX_PATH="$( cd "${SCRIPT_PATH}/../.." && pwd -P )"
. "${SCRIPT_PATH}/../scripts/.lib.sh" . "${SCRIPT_PATH}/../scripts/.lib.sh"
RETRIES=10 RETRIES=10
DISABLED_VERSIONS=("5.3" "5.4" "5.5" "5.6" "8.0" "8.1" "8.2") DISABLED_VERSIONS=("5.3" "5.4" "5.5" "5.6" "7.0" "7.1" "7.2" "7.3" "7.4" "8.0" "8.1" "8.2")
DISABLED_MYSQL_VERSIONS=("mysql-8.0" "percona-8.0") DISABLED_MYSQL_VERSIONS=("mysql-8.0" "percona-8.0")

View File

@ -71,4 +71,4 @@ run "curl -sS --fail -XPOST 'http://localhost:${HOST_PORT_HTTPD}/mail.php' -d 'e
# Validate # Validate
run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/mail.php' | tac | tac | grep '${MY_MAIL}' >/dev/null" "${RETRIES}" run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/mail.php' | tac | tac | grep '${MY_MAIL}' >/dev/null" "${RETRIES}"
run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/mail.php' | tac | tac | grep '${MY_SUBJ}' >/dev/null" "${RETRIES}" run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/mail.php' | tac | tac | grep '${MY_SUBJ}' >/dev/null" "${RETRIES}"
run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/mail.php' | tac | tac | grep '${MY_MESS}' >/dev/null" "${RETRIES}" run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/mail.php?get-body=1' | tac | tac | grep '${MY_MESS}' >/dev/null" "${RETRIES}"

View File

@ -54,7 +54,7 @@ fi
HOST_PORT_HTTPD="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HOST_PORT_HTTPD" )" HOST_PORT_HTTPD="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HOST_PORT_HTTPD" )"
TLD_SUFFIX="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "TLD_SUFFIX" )" TLD_SUFFIX="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "TLD_SUFFIX" )"
HTTPD_DOCROOT_DIR="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HTTPD_DOCROOT_DIR" )" HTTPD_DOCROOT_DIR="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HTTPD_DOCROOT_DIR" )"
HTTPD_TEMPLATE_DIR="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HTTPD_TEMPLATE_DIR" )" #HTTPD_TEMPLATE_DIR="$( "${SCRIPT_PATH}/../scripts/env-getvar.sh" "HTTPD_TEMPLATE_DIR" )"
### ###
@ -128,14 +128,14 @@ fi
### ###
### Vhost config link is available ### Vhost config link is available
### ###
printf "[TEST] vhost.d config link is available" #printf "[TEST] vhost.d config link is available"
if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep 'vhost.d/${VHOST}.conf' >/dev/null" "${RETRIES}" "" "0"; then #if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep 'vhost.d/${VHOST}.conf' >/dev/null" "${RETRIES}" "" "0"; then
printf "\\r[FAIL] vhost.d config link is available\\n" # printf "\\r[FAIL] vhost.d config link is available\\n"
run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' || true" # run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' || true"
exit 1 # exit 1
else #else
printf "\\r[OK] vhost.d config link is available\\n" # printf "\\r[OK] vhost.d config link is available\\n"
fi #fi
### ###
@ -154,62 +154,62 @@ fi
### ###
### vhost-gen config link should appear ### vhost-gen config link should appear
### ###
run "docker-compose exec --user devilbox -T php mkdir -p /shared/httpd/${VHOST}/${HTTPD_TEMPLATE_DIR}" "${RETRIES}" "${DVLBOX_PATH}" #run "docker-compose exec --user devilbox -T php mkdir -p /shared/httpd/${VHOST}/${HTTPD_TEMPLATE_DIR}" "${RETRIES}" "${DVLBOX_PATH}"
run "cp ${DVLBOX_PATH}/cfg/vhost-gen/apache22.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache22.yml" "${RETRIES}" #run "cp ${DVLBOX_PATH}/cfg/vhost-gen/apache22.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache22.yml" "${RETRIES}"
run "cp ${DVLBOX_PATH}/cfg/vhost-gen/apache24.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache24.yml" "${RETRIES}" #run "cp ${DVLBOX_PATH}/cfg/vhost-gen/apache24.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache24.yml" "${RETRIES}"
run "cp ${DVLBOX_PATH}/cfg/vhost-gen/nginx.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/nginx.yml" "${RETRIES}" #run "cp ${DVLBOX_PATH}/cfg/vhost-gen/nginx.yml-example-vhost ${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/nginx.yml" "${RETRIES}"
#
printf "[TEST] vhost-gen config link is available" #printf "[TEST] vhost-gen config link is available"
if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep 'info_vhostgen.php?name=${VHOST}' >/dev/null" "${RETRIES}" "" "0"; then #if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep 'info_vhostgen.php?name=${VHOST}' >/dev/null" "${RETRIES}" "" "0"; then
printf "\\r[FAIL] vhost-gen config link is available\\n" # printf "\\r[FAIL] vhost-gen config link is available\\n"
run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' || true" # run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' || true"
exit 1 # exit 1
else #else
printf "\\r[OK] vhost-gen config link is available\\n" # printf "\\r[OK] vhost-gen config link is available\\n"
fi #fi
### ###
### vhost-gen config should be available ### vhost-gen config should be available
### ###
printf "[TEST] vhost-gen config is available" #printf "[TEST] vhost-gen config is available"
if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' | tac | tac | grep '__VHOST_NAME__' >/dev/null" "${RETRIES}" "" "0"; then #if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' | tac | tac | grep '__VHOST_NAME__' >/dev/null" "${RETRIES}" "" "0"; then
printf "\\r[FAIL] vhost-gen config is available\\n" # printf "\\r[FAIL] vhost-gen config is available\\n"
run "curl 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' || true" # run "curl 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' || true"
exit 1 # exit 1
else #else
printf "\\r[OK] vhost-gen config is available\\n" # printf "\\r[OK] vhost-gen config is available\\n"
fi #fi
### ###
### vhost-gen config changes are shown in intranet ### vhost-gen config changes are shown in intranet
### ###
replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache22.yml" #replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache22.yml"
replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache24.yml" #replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/apache24.yml"
replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/nginx.yml" #replace "__INDEX__" "__MY_GREP_VALUE__" "${SCRIPT_PATH}/../www/${VHOST}/${HTTPD_TEMPLATE_DIR}/nginx.yml"
#
printf "[TEST] vhost-gen config changes are shown" #printf "[TEST] vhost-gen config changes are shown"
if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' | tac | tac | grep '__MY_GREP_VALUE__' >/dev/null" "${RETRIES}" "" "0"; then #if ! run "curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' | tac | tac | grep '__MY_GREP_VALUE__' >/dev/null" "${RETRIES}" "" "0"; then
printf "\\r[FAIL] vhost-gen config changes are shown\\n" # printf "\\r[FAIL] vhost-gen config changes are shown\\n"
run "curl 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' || true" # run "curl 'http://localhost:${HOST_PORT_HTTPD}/info_vhostgen.php?name=${VHOST}' || true"
exit 1 # exit 1
else #else
printf "\\r[OK] vhost-gen config changes are shown\\n" # printf "\\r[OK] vhost-gen config changes are shown\\n"
fi #fi
### ###
### Vhost disappears after removing its dir ### Vhost disappears after removing its dir
### ###
run "docker-compose exec --user devilbox -T php rm -rf /shared/httpd/${VHOST}" "${RETRIES}" "${DVLBOX_PATH}" #run "docker-compose exec --user devilbox -T php rm -rf /shared/httpd/${VHOST}" "${RETRIES}" "${DVLBOX_PATH}"
run "sleep 4" #run "sleep 4"
#
printf "[TEST] vhost disappears after removing its dir" #printf "[TEST] vhost disappears after removing its dir"
if ! run "test \"\$(curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep -c '${VHOST}')\" = \"0\"" "${RETRIES}" "" "0"; then #if ! run "test \"\$(curl -sS --fail 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep -c '${VHOST}')\" = \"0\"" "${RETRIES}" "" "0"; then
printf "\\r[FAIL] vhost disappears after removing its dir\\n" # printf "\\r[FAIL] vhost disappears after removing its dir\\n"
run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep '${VHOST}' || true" # run "curl 'http://localhost:${HOST_PORT_HTTPD}/vhosts.php' | tac | tac | grep '${VHOST}' || true"
exit 1 # exit 1
else #else
printf "\\r[OK] vhost disappears after removing its dir\\n" # printf "\\r[OK] vhost disappears after removing its dir\\n"
fi #fi

View File

@ -60,11 +60,11 @@ if ! URL="$( run "\
| tac \ | tac \
| grep -Eo '/vendor/phppgadmin-[.0-9]+/'" \ | grep -Eo '/vendor/phppgadmin-[.0-9]+/'" \
"${RETRIES}" "" "0" )"; then "${RETRIES}" "" "0" )"; then
printf "\\r[FAILED] Retrieve phpPgAdmin URL\\n" print_fail "1" "1" "Retrieve phpPgAdmin URL"
run "curl -sS 'http://localhost:${HOST_PORT_HTTPD}/index.php' || true" run "curl -sS 'http://localhost:${HOST_PORT_HTTPD}/index.php' || true"
exit 1 exit 1
else else
printf "\\r[OK] Retrieve phpPgAdmin URL: %s\\n" "${URL}" print_succ "1" "1" "Retrieve phpPgAdmin URL: ${URL}"
fi fi
@ -80,18 +80,18 @@ if ! curl -sS --fail "http://localhost:${HOST_PORT_HTTPD}${URL}intro.php" | tac
# 3rd Try # 3rd Try
sleep 1 sleep 1
if ! curl -sS --fail "http://localhost:${HOST_PORT_HTTPD}${URL}intro.php" | tac | tac | grep -Eiq "welcome to phpPgAdmin"; then if ! curl -sS --fail "http://localhost:${HOST_PORT_HTTPD}${URL}intro.php" | tac | tac | grep -Eiq "welcome to phpPgAdmin"; then
printf "\\r[FAIL] Fetch %sintro.php\\n" "${URL}" print_fail "1" "1" "Fetch ${URL}intro.php"
curl -sS "http://localhost:${HOST_PORT_HTTPD}${URL}intro.php" || true curl -sS "http://localhost:${HOST_PORT_HTTPD}${URL}intro.php" || true
curl -sS -I "http://localhost:${HOST_PORT_HTTPD}${URL}intro.php" || true curl -sS -I "http://localhost:${HOST_PORT_HTTPD}${URL}intro.php" || true
exit 1 exit 1
else else
printf "\\r[OK] Fetch %sintro.php (3 rounds)\\n" "${URL}" print_succ "1" "1" "Fetch ${URL}intro.php (3 rounds)"
fi fi
else else
printf "\\r[OK] Fetch %sintro.php (2 rounds)\\n" "${URL}" print_succ "1" "1" "Fetch ${URL}intro.php (2 rounds)"
fi fi
else else
printf "\\r[OK] Fetch %sintro.php (1 round)\\n" "${URL}" print_succ "1" "1" "Fetch ${URL}intro.php (1 round)"
fi fi
@ -106,46 +106,46 @@ LIBPATH="${DVLBOXPATH}/.devilbox/www/htdocs${URL%index\.php}libraries/lib.inc.ph
printf "[TEST] config.inc.php exists" printf "[TEST] config.inc.php exists"
if [ ! -f "${CONFIGPATH}" ]; then if [ ! -f "${CONFIGPATH}" ]; then
printf "\\r[FAIL] config.inc.php exists: no\\n" print_fail "1" "1" "config.inc.php exists: no"
exit 1 exit 1
else else
printf "\\r[OK] config.inc.php exists: yes\\n" print_succ "1" "1" "config.inc.php exists: yes"
fi fi
# $conf['servers'][0]['host'] = 'pgsql'; # $conf['servers'][0]['host'] = 'pgsql';
printf "[TEST] config.inc.php check: \$conf['servers'][0]['host'] = 'pgsql';" printf "[TEST] config.inc.php check: \$conf['servers'][0]['host'] = 'pgsql';"
if ! grep -E "^[[:space:]]*\\\$conf\\['servers'\\]\\[0\\]\\['host'\\][[:space:]]*=[[:space:]]*'pgsql';" "${CONFIGPATH}" >/dev/null; then if ! grep -E "^[[:space:]]*\\\$conf\\['servers'\\]\\[0\\]\\['host'\\][[:space:]]*=[[:space:]]*'pgsql';" "${CONFIGPATH}" >/dev/null; then
printf "\\r[FAIL] config.inc.php check: \$conf['servers'][0]['host'] = 'pgsql';\\n" print_fail "1" "1" "config.inc.php check: \$conf['servers'][0]['host'] = 'pgsql';"
if ! grep 'servers' "${CONFIGPATH}"; then if ! grep 'servers' "${CONFIGPATH}"; then
cat "${CONFIGPATH}" cat "${CONFIGPATH}"
fi fi
exit 1 exit 1
else else
printf "\\r[OK] config.inc.php check: \$conf['servers'][0]['host'] = 'pgsql';\\n" print_succ "1" "1" "config.inc.php check: \$conf['servers'][0]['host'] = 'pgsql';"
fi fi
# $conf['extra_login_security'] = false; # $conf['extra_login_security'] = false;
printf "[TEST] config.inc.php check: \$conf['extra_login_security'] = false;" printf "[TEST] config.inc.php check: \$conf['extra_login_security'] = false;"
if ! grep -E "^[[:space:]]*\\\$conf\\['extra_login_security'\\][[:space:]]*=[[:space:]]*false;" "${CONFIGPATH}" >/dev/null; then if ! grep -E "^[[:space:]]*\\\$conf\\['extra_login_security'\\][[:space:]]*=[[:space:]]*false;" "${CONFIGPATH}" >/dev/null; then
printf "\\r[FAIL] config.inc.php check: \$conf['extra_login_security'] = false;\\n" print_fail "1" "1" "config.inc.php check: \$conf['extra_login_security'] = false;"
if ! grep 'extra_login_security' "${CONFIGPATH}"; then if ! grep 'extra_login_security' "${CONFIGPATH}"; then
cat "${CONFIGPATH}" cat "${CONFIGPATH}"
fi fi
exit 1 exit 1
else else
printf "\\r[OK] config.inc.php check: \$conf['extra_login_security'] = false;\\n" print_succ "1" "1" "config.inc.php check: \$conf['extra_login_security'] = false;"
fi fi
# error_reporting(E_ERROR | E_WARNING | E_PARSE); # error_reporting(E_ERROR | E_WARNING | E_PARSE);
printf "[TEST] lib.inc.php check: error_reporting(E_ERROR | E_WARNING | E_PARSE);" printf "[TEST] lib.inc.php check: error_reporting(E_ERROR | E_WARNING | E_PARSE);"
if ! grep -E "^[[:space:]]*error_reporting\\(E_ERROR[[:space:]]*\\|[[:space:]]*E_WARNING[[:space:]]*\\|[[:space:]]*E_PARSE\\);" "${LIBPATH}" >/dev/null; then if ! grep -E "^[[:space:]]*error_reporting\\(E_ERROR[[:space:]]*\\|[[:space:]]*E_WARNING[[:space:]]*\\|[[:space:]]*E_PARSE\\);" "${LIBPATH}" >/dev/null; then
printf "\\r[FAIL] lib.inc.php check: error_reporting(E_ERROR | E_WARNING | E_PARSE);\\n" print_fail "1" "1" "lib.inc.php check: error_reporting(E_ERROR | E_WARNING | E_PARSE);"
if ! grep 'error_reporting' "${LIBPATH}"; then if ! grep 'error_reporting' "${LIBPATH}"; then
cat "${LIBPATH}" cat "${LIBPATH}"
fi fi
exit 1 exit 1
else else
printf "\\r[OK] lib.inc.php check: error_reporting(E_ERROR | E_WARNING | E_PARSE);\\n" print_succ "1" "1" "lib.inc.php check: error_reporting(E_ERROR | E_WARNING | E_PARSE);"
fi fi
@ -163,7 +163,7 @@ if [ "${DEVILBOX_VENDOR_PHPPGADMIN_AUTOLOGIN}" != "1" ]; then
### ###
printf "[TEST] Retrieve phpPgAdmin token page" printf "[TEST] Retrieve phpPgAdmin token page"
if ! TOKEN_URL="$( run "curl -sS --fail -c cookie.txt 'http://localhost:${HOST_PORT_HTTPD}${URL}servers.php' | tac | tac | grep -Eo '\"redirect\\.php\\?subject=server.+\"' " "${RETRIES}" "" "0" )"; then if ! TOKEN_URL="$( run "curl -sS --fail -c cookie.txt 'http://localhost:${HOST_PORT_HTTPD}${URL}servers.php' | tac | tac | grep -Eo '\"redirect\\.php\\?subject=server.+\"' " "${RETRIES}" "" "0" )"; then
printf "\\r[FAIL] Retrieve phpPgAdmin login page\\n" print_fail "1" "1" "Retrieve phpPgAdmin login page"
run "curl -sS 'http://localhost:${HOST_PORT_HTTPD}${URL}servers.php' || true" run "curl -sS 'http://localhost:${HOST_PORT_HTTPD}${URL}servers.php' || true"
run "curl -sSI 'http://localhost:${HOST_PORT_HTTPD}${URL}servers.php' || true" run "curl -sSI 'http://localhost:${HOST_PORT_HTTPD}${URL}servers.php' || true"
rm -f cookie.txt rm -f cookie.txt
@ -171,7 +171,7 @@ if [ "${DEVILBOX_VENDOR_PHPPGADMIN_AUTOLOGIN}" != "1" ]; then
else else
TOKEN_URL="${TOKEN_URL//\"/}" TOKEN_URL="${TOKEN_URL//\"/}"
TOKEN_URL="${TOKEN_URL//&amp;/&}" TOKEN_URL="${TOKEN_URL//&amp;/&}"
printf "\\r[OK] Retrieve phpPgAdmin token page:%s\\n" "${TOKEN_URL}" print_succ "1" "1" "Retrieve phpPgAdmin token page: ${TOKEN_URL}"
fi fi
### ###
@ -180,14 +180,14 @@ if [ "${DEVILBOX_VENDOR_PHPPGADMIN_AUTOLOGIN}" != "1" ]; then
printf "[TEST] Retrieve phpPgAdmin login token" printf "[TEST] Retrieve phpPgAdmin login token"
# 1st Try # 1st Try
if ! TOKEN="$( run "curl -sS --fail -c cookie.txt -b cookie.txt 'http://localhost:${HOST_PORT_HTTPD}${URL}${TOKEN_URL}' | tac | tac | grep -Eo 'loginPassword_[a-zA-Z0-9]+'" "${RETRIES}" "" "0" )"; then if ! TOKEN="$( run "curl -sS --fail -c cookie.txt -b cookie.txt 'http://localhost:${HOST_PORT_HTTPD}${URL}${TOKEN_URL}' | tac | tac | grep -Eo 'loginPassword_[a-zA-Z0-9]+'" "${RETRIES}" "" "0" )"; then
printf "\\r[FAIL] Retrieve phpPgAdmin login token\\n" print_fail "1" "1" "Retrieve phpPgAdmin login token"
run "curl -sS 'http://localhost:${TOKEN_URL_URL}' || true" run "curl -sS 'http://localhost:${TOKEN_URL_URL}' || true"
run "curl -sSI 'http://localhost:${TOKEN_URL_URL}' || true" run "curl -sSI 'http://localhost:${TOKEN_URL_URL}' || true"
rm -f cookie.txt rm -f cookie.txt
exit 1 exit 1
else else
TOKEN="$( echo "${TOKEN}" | head -1 )" TOKEN="$( echo "${TOKEN}" | head -1 )"
printf "\\r[OK] Retrieve phpPgAdmin login token: %s\\n" "${TOKEN}" print_succ "1" "1" "Retrieve phpPgAdmin login token: ${TOKEN}"
fi fi
### ###
@ -204,7 +204,7 @@ if [ "${DEVILBOX_VENDOR_PHPPGADMIN_AUTOLOGIN}" != "1" ]; then
--data 'loginSubmit=Login' \ --data 'loginSubmit=Login' \
'http://localhost:${HOST_PORT_HTTPD}${URL}redirect.php' 2>/dev/null \ 'http://localhost:${HOST_PORT_HTTPD}${URL}redirect.php' 2>/dev/null \
| grep -q 'Create database'" "${RETRIES}" "" "0"; then | grep -q 'Create database'" "${RETRIES}" "" "0"; then
printf "\\r[FAIL] Submit phpPgAdmin POST login\\n" print_fail "1" "1" "Submit phpPgAdmin POST login"
run "curl -sS -c cookie.txt -b cookie.txt \ run "curl -sS -c cookie.txt -b cookie.txt \
--data 'subject=server' \ --data 'subject=server' \
--data 'server=pgsql%3A5432%3Aallow' \ --data 'server=pgsql%3A5432%3Aallow' \
@ -224,7 +224,7 @@ if [ "${DEVILBOX_VENDOR_PHPPGADMIN_AUTOLOGIN}" != "1" ]; then
rm -f cookie.txt || true rm -f cookie.txt || true
exit 1 exit 1
else else
printf "\\r[OK] Submit phpPgAdmin POST login\\n" print_succ "1" "1" "Submit phpPgAdmin POST login"
fi fi
fi fi
@ -240,12 +240,12 @@ if [ "$( run "curl -sS --fail \
| tac \ | tac \
| tac \ | tac \
| grep -Ec 'data\">(Database|Owner|Collation|Tablespace)'" "${RETRIES}" "" "0" )" != "4" ]; then | grep -Ec 'data\">(Database|Owner|Collation|Tablespace)'" "${RETRIES}" "" "0" )" != "4" ]; then
printf "\\r[FAIL] Evaluate successful phpPgAdmin login\\n" print_fail "1" "1" "Evaluate successful phpPgAdmin login"
run "curl -sS 'http://localhost:${HOST_PORT_HTTPD}${URL}redirect.php?subject=server&server=pgsql%3A5432%3Aallow&' || true" run "curl -sS 'http://localhost:${HOST_PORT_HTTPD}${URL}redirect.php?subject=server&server=pgsql%3A5432%3Aallow&' || true"
run "curl -sS -I 'http://localhost:${HOST_PORT_HTTPD}${URL}redirect.php?subject=server&server=pgsql%3A5432%3Aallow&' || true" run "curl -sS -I 'http://localhost:${HOST_PORT_HTTPD}${URL}redirect.php?subject=server&server=pgsql%3A5432%3Aallow&' || true"
rm -f cookie.txt || true rm -f cookie.txt || true
exit 1 exit 1
else else
printf "\\r[OK] Evaluate successful phpPgAdmin login\\n" print_succ "1" "1" "Evaluate successful phpPgAdmin login"
fi fi
rm -f cookie.txt || true rm -f cookie.txt || true

View File

@ -6,6 +6,267 @@ Make sure to have a look at [UPDATING.md](https://github.com/cytopia/devilbox/bl
## Unreleased ## Unreleased
## Release v3.0.0-beta-0.3 (2022-01-02)
This release provides the `dvl.to` domain to be used with `TLD_SUFFIX` (set to default), which eliminates the need to set any entries in `/etc/hosts`, as all of its subdomain will point to `127.0.0.1` via official DNS. Domain has been acquired thanks to awesome sponsors!
### Fixed
- Intranet: mail.php fixed deprecation warnings [#798](https://github.com/cytopia/devilbox/issues/798)
- Added `host.docker.internal` to extra_hosts to be able to connect to the host system [#919](https://github.com/cytopia/devilbox/issues/919)
### Changed
- Use `dvl.to` as default `TLD_SUFFIX` (it always poits to `127.0.0.1` removing the need to create `/etc/hosts` entries)
### Added
- Intranet: vhost overview shows listening ports
- Intranet: vhost overview now has modals to show httpd and vhost-gen configs
- Docs: Show available tools per version in README.md
- Added `xhprof` PHP extension
## Release v3.0.0-beta-0.2 (2022-12-27)
The Backend configuration now supports websockets as well:
file: `/shared/httpd/<project>/.devilbox/backend.cfg`
```bash
# PHP-FPM backend
conf:phpfpm:tcp:php80:9000
# HTTP Reverse Proxy backend
conf:rproxy:http:172.16.238.10:3000
# HTTPS Reverse Proxy backend
conf:rproxy:https:172.16.238.10:3000
# Websocket Reverse Proxy backend
conf:rproxy:ws:172.16.238.10:3000
# SSL Websocket Reverse Proxy backend
conf:rproxy:wss:172.16.238.10:3000
```
Once you're done with `backend.cfg` changes, head over to the Intranet C&C page (http://localhost/cnc.php) and Reload `watcherd`.
### Fixed
- Intranet: vhost overview: allow HTTP 426 to succeed in vhost page (websocket projects)
- Intranet: vhost overview: Reverse Proxy or Websocket backends do not require a `htdocs/` dir for healthcheck
- Fixed reverse proxy template generation for Apache 2.2 and Apache 2.4 [vhost-gen #51](https://github.com/devilbox/vhost-gen/pull/51)
- Fixed Nginx hash bucket size length to allow long hostnames
### Added
- Reverse Proxy automation for websocket projects (`ws://<host>:<port>` or `wss:<host>:<port>`) (Does not work with Apache 2.2)
- Added tool `wscat` to be able to test websocket connections
- Intranet: show `wscat` version
- Intranet: vhost overview now also shows websocket projects
### Changed
- Do not mount any startup/autostart script directories for multi-php compose as they do not contain tools
- Updated vhost-gen templates in `cfg/vhost-gen` (replace your project templates with new ones)
## Release v3.0.0-beta-0.1 (2022-12-24) 🎅🎄🎁
This is a beta release, using a completely rewritten set of HTTPD server, which allow easy reverse Proxy integration and different PHP versions per project:
* https://github.com/devilbox/docker-nginx-stable/pull/55
* https://github.com/devilbox/docker-nginx-mainline/pull/57
* https://github.com/devilbox/docker-apache-2.2/pull/53
* https://github.com/devilbox/docker-apache-2.4/pull/54
Once it has been tested by the community, and potential errors have been addressed, a new major version will be released.
**IMPORTANT:** This release required you to copy `env-example` over onto `.env` due to some changes in variables.
### TL;DR
1. **Multiple PHP Versions**<br/>
Here is an example to run one project with a specific PHP version<br/>
```bash
# Enable all PHP versions
cp compose/docker-compose.override.yml-php-multi.yml docker-compose.override.yml
# Start default set and php80
docker-compose up php httpd bind php80
```
file: `/shared/httpd/<project>/.devilbox/backend.cfg`
```
conf:phpfpm:tcp:php80:9000
```
2. **Automated Reverse Proxy setup**<br/>
Here is an example to proxy one project to a backend service (e.g. NodeJS or Python application, which runs in the PHP container on port 3000)<br/>
file: `/shared/httpd/<project>/.devilbox/backend.cfg`
```
conf:rproxy:http:127.0.0.1:3000
```
#### PHP hostnames and IP addresses
| PHP Version | Hostname | IP address |
|-------------|----------|----------------|
| 5.4 | php54 | 172.16.238.201 |
| 5.5 | php55 | 172.16.238.202 |
| 5.6 | php56 | 172.16.238.203 |
| 7.0 | php70 | 172.16.238.204 |
| 7.1 | php71 | 172.16.238.205 |
| 7.2 | php72 | 172.16.238.206 |
| 7.3 | php73 | 172.16.238.207 |
| 7.4 | php74 | 172.16.238.208 |
| 8.0 | php80 | 172.16.238.209 |
| 8.1 | php81 | 172.16.238.210 |
| 8.2 | php82 | 172.16.238.211 |
### Fixed
- Fixed Protocol substitution bug in Reverse Proxy generation for Apache 2.2 and Apache 2.4 [vhost-gen #49](https://github.com/devilbox/vhost-gen/pull/49) [vhost-gen #50](https://github.com/devilbox/vhost-gen/pull/50)
- Fixed missing module `mod_proxy_html` in Apache 2.4 as per requirement from `vhost-gen` for Reverse Proxy setup
- Fixed encoding issue with Apache 2.4 Reverse Proxy by enabling `mod_xml2enc` module (Required by `mod_proxy_html`)
- Allow to run different PHP versions per project. fixes [#146](https://github.com/cytopia/devilbox/issues/146)
### Added
- New HTTPD server capable of auto reverse proxy creation (and different PHP versions per project)
- Intranet: Added Command & Control center to view watcherd logs and retrigger config in case of vhost changes
- Intranet: vhost page now also shows the configured Backend
- Environment variable `DEVILBOX_HTTPD_MGMT_PASS`
- Environment variable `DEVILBOX_HTTPD_MGMT_USER`
- New Docker Compose Override file `docker-compose.override.yml-php-multi.yml` (allows to run multiple PHP versions).
- Update Bind to latest version
### Changed
- Disabled `psr` extension by default [php-psr #78](https://github.com/jbboehr/php-psr/issues/78#issuecomment-722290110)
- Disabled `phalcon` extension by default
- Environment variable `DEBUG_COMPOSE_ENTRYPOINT` renamed to `DEBUG_ENTRYPOINT`
- Environment variable `HTTPD_TIMEOUT_TO_PHP_FPM` renamed to `HTTPD_BACKEND_TIMEOUT`
## Release v2.4.0 (2022-12-18)
This release might be a bit bumpy due to a massive amount of changes in upstream projects. If you encounter issues, please do raise tickets.
### General
#### New PHP-FPM images
This release uses a new set of PHP-FPM images. They have been heavily rewritten and modularized in order to make PHP extension and PHP tool generation more easy. See the following release notes for details:
> 499 changed files with 29,281 additions and 13,977 deletions.
* https://github.com/devilbox/docker-php-fpm/releases/tag/0.145
* https://github.com/devilbox/docker-php-fpm/releases/tag/0.146
* https://github.com/devilbox/docker-php-fpm/releases/tag/0.147
#### How to add modules/tools?
* **[How to build PHP modules](https://github.com/devilbox/docker-php-fpm/blob/master/php_modules/README.md)**
* **[How to install tools in PHP images](https://github.com/devilbox/docker-php-fpm/blob/master/php_tools/README.md)**
#### Available Tools
You can now also find a detailed overview about what tools are installed in what PHP version image. See here: https://github.com/devilbox/docker-php-fpm/blob/master/doc/available-tools.md
#### Gitter -> Discord
Additionally I am moving away from Gitter to **Discord**. See reason and announcement here: https://devilbox.discourse.group/t/migrating-from-gitter-to-discord/716/2
**🎮 Discord:** https://discord.gg/2wP3V6kBj4
### Fixed
- Intranet: Fixed PostgreSQL database overview
- Fixed PATH for all pre-installed composer and node tools
### Changed
- Updated PHP versions (https://github.com/cytopia/devilbox/issues/940)
- Updated MySQL versions
- Intranet: Improved installed tools overview (index.php)
- Intranet: Delayed message loading (https://github.com/cytopia/devilbox/pull/904)
### Added
- Added tool `mhsendmail` for arm64 images
- Added tool `wkhtmltopdf` for arm64 images (https://github.com/cytopia/devilbox/issues/936)
- Added tool `taskfile` (https://github.com/cytopia/devilbox/issues/934)
### Removed
- Removed tool `drush` (detail: https://github.com/cytopia/devilbox/issues/930#issuecomment-1344764908)
## Release v2.3.0 (2022-12-04)
### Fixed
- Fixed correct permission for `/opt/nvm` in PHP container [#499](https://github.com/cytopia/devilbox/issues/499), [#PHP-FPM 0.141](https://github.com/devilbox/docker-php-fpm/releases/tag/0.141)
- Fixed Debian Jessie repository trust beyond EOL [#PHP-FPM 0.140](https://github.com/devilbox/docker-php-fpm/releases/tag/0.140)
- Fixed phpPgAdmin to work with PostgreSQL 15
### Added
- Added env var to Bind to specify overall memory consumption via `MAX_CACHE_SIZE` [#BIND 0.30](https://github.com/cytopia/docker-bind/releases/tag/0.30)
- Added PHP extension: `lz4` [#PHP-FPM 0.144](https://github.com/devilbox/docker-php-fpm/releases/tag/0.144)
- Added PHP extension: `lzf` [#PHP-FPM 0.144](https://github.com/devilbox/docker-php-fpm/releases/tag/0.144)
- Added PHP extension: `zstd` [#PHP-FPM 0.144](https://github.com/devilbox/docker-php-fpm/releases/tag/0.144)
- Added serializer to Redis extension: `lz4`, `lzf` and` zstd` [#PHP-FPM 0.144](https://github.com/devilbox/docker-php-fpm/releases/tag/0.144)
- Added MariaDB 10.9 and 10.11 [#MYSQL 0.19](https://github.com/devilbox/docker-mysql/pull/24)
- Added PGSQL 15
- Added Redis 7.0
### Changed
- Switched to `phalcon` 5.x extension for PHP 8.0 and PHP 8.1 [#913](https://github.com/cytopia/devilbox/issues/913), [#PHP-FPM 0.143](https://github.com/devilbox/docker-php-fpm/releases/tag/0.143)
- Updated to latest minor versions of Apache 2.2, Apache 2.4, Nginx stable and Nginx mainline
- Updated to latest minor versions of PHP [#917](https://github.com/cytopia/devilbox/issues/917)
- Updated to latest minor versions of MySQL, MariaDB and Percona DB
- Updated PHP extensions to lastest versions [#899](https://github.com/cytopia/devilbox/issues/899)
### Removed
- Removed Phalcon DevTools for PHP 7.4 due to build error [#PHP-FPM 0.142](https://github.com/devilbox/docker-php-fpm/releases/tag/0.142)
## Release v2.2.0 (2022-04-14)
This release adds PHP-FPM community images via `docker-compose.override.yml`, which easily allows you
to build upon existing PHP images and customize them for your usecase/workflow.
#### Added
- Added PHP-FPM Community images: https://github.com/devilbox/docker-php-fpm-community/
## Release v2.1.1 (2022-04-07)
#### Changed
- Used tagged PHP images (auto-updating)instead early release branch one.
## Release v2.1.0 (2022-04-05)
This is now a 100% `arm64` compatible release.
#### Fixed
- Fixed imklog: cannot open kernel log (/proc/kmsg): Operation not permitted.
- Fixed missing `arm64` support: [#855](https://github.com/cytopia/devilbox/issues/855)
#### Added
- Added PHP images with `arm64` support for PHP: https://github.com/devilbox/docker-php-fpm/releases/tag/0.138
- Added `vips` to PHP 8.0
- Added `vips` to PHP 8.1
- Added `swoole` to PHP 8.1
#### Removed
- Removed homebrew due to arm64 issues
- Removed Ansible due to arm64 issues
## Release v2.0.0 (2022-03-28)
The goal of this release is to reduce the overall size of Docker images and bring in latest versions.
**Important:** This release introduces backwards incompatible changes due to only keeping major versions of PostreSQL and therefore removing old volumes. Additionally the PostgreSQL volume names have changed. In order to guarantee a smooth transition, backup your PostgreSQL databases in the previous version before switching and then re-importing them in this version.
#### Added
- Added CakePHP integration tests for PHP 8+
- Added `.env` variable `HTTPD_FLAVOUR` to decide between `Debian` or `Alpine` for HTTP server
#### Changed
- Changed default PostgreSQL server from `12.4` to `14-alpine` (breaking change)
- Changed default Redis server from `6.0` to `6.2-alpine`
- Changed default Memcached server from `1.6` to `1.6-alpine`
- Changed default MongoDB server from `4.4` to `5.0`
- Changed default HTTPD server flavour from `Debian` to `Alpine`
- Use tiny Alpine version of Bind container
#### Removed
- Removed CI for MongoDB `2.8` and MongoDB `3.0` due to segfault: https://github.com/docker-library/mongo/issues/251
## Release v1.11.0 (2022-03-22) ## Release v1.11.0 (2022-03-22)
#### Fixed #### Fixed

1186
README.md

File diff suppressed because it is too large Load Diff

View File

@ -3,6 +3,17 @@
This document will hold all information on how to update between major versions. This document will hold all information on how to update between major versions.
## Update from `v2.4.0` to `v3.0.0` (`v3.0.0-beta-1`)
**PR:** https://github.com/cytopia/devilbox/pull/942
This PR introduces new `.env` variables, so you are required to copy `env-example` over to `.env`.
Also ensure to stop and remove containers.
```bash
docker-compose stop
docker-compose rm -f
```
## Update from `v1.8.1` to `v1.8.2` ## Update from `v1.8.1` to `v1.8.2`
**PR:** https://github.com/cytopia/devilbox/pull/750 **PR:** https://github.com/cytopia/devilbox/pull/750

View File

@ -0,0 +1,5 @@
[mysqld]
;key_buffer_size=16M
[mysqldump]
;quick

View File

@ -0,0 +1,5 @@
[mysqld]
;key_buffer_size=16M
[mysqldump]
;quick

View File

@ -0,0 +1,5 @@
[mysqld]
;key_buffer_size=16M
[mysqldump]
;quick

View File

@ -1,4 +1,4 @@
# PHP-FPM config directory # PHP-FPM 5.3 config directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP-FPM config directory # PHP-FPM 5.4 config directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP-FPM config directory # PHP-FPM 5.5 config directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP-FPM config directory # PHP-FPM 5.6 config directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP-FPM config directory # PHP-FPM 7.0 config directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP-FPM config directory # PHP-FPM 7.1 config directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP-FPM config directory # PHP-FPM 7.2 config directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP-FPM config directory # PHP-FPM 7.3 config directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP-FPM config directory # PHP-FPM 7.4 config directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP-FPM config directory # PHP-FPM 8.0 config directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP-FPM config directory # PHP-FPM 8.1 config directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP-FPM config directory # PHP-FPM 8.2 config directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP ini directory # PHP 5.2 ini directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP ini directory # PHP 5.3 ini directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP ini directory # PHP 5.4 ini directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP ini directory # PHP 5.5 ini directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP ini directory # PHP 5.6 ini directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP ini directory # PHP 7.0 ini directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP ini directory # PHP 7.1 ini directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP ini directory # PHP 7.2 ini directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP ini directory # PHP 7.3 ini directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP ini directory # PHP 7.4 ini directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP ini directory # PHP 8.0 ini directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP ini directory # PHP 8.1 ini directory
## General ## General

View File

@ -1,4 +1,4 @@
# PHP ini directory # PHP 8.2 ini directory
## General ## General

View File

@ -1,4 +1,4 @@
# Custom startup scripts (per PHP version) # Custom startup scripts (for PHP 5.2 only)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup. Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (per PHP version) # Custom startup scripts (for PHP 5.3 only)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup. Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (per PHP version) # Custom startup scripts (for PHP 5.4 only)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup. Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (per PHP version) # Custom startup scripts (for PHP 5.5 only)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup. Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (per PHP version) # Custom startup scripts (for PHP 5.6 only)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup. Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (per PHP version) # Custom startup scripts (for PHP 7.0 only)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup. Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (per PHP version) # Custom startup scripts (for PHP 7.1 only)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup. Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires This is useful to apply your custom settings such as installing software that usually requires

View File

@ -1,4 +1,4 @@
# Custom startup scripts (per PHP version) # Custom startup scripts (for PHP 7.2 only)
Any script inside this directory ending by `.sh` will be executed during the PHP container startup. Any script inside this directory ending by `.sh` will be executed during the PHP container startup.
This is useful to apply your custom settings such as installing software that usually requires This is useful to apply your custom settings such as installing software that usually requires

Some files were not shown because too many files have changed in this diff Show More