Skip to content

feat(cli): configure logrotate during migration#1927

Open
mrrobot47 wants to merge 18 commits into
EasyEngine:developfrom
mrrobot47:fix/setup-logrotate
Open

feat(cli): configure logrotate during migration#1927
mrrobot47 wants to merge 18 commits into
EasyEngine:developfrom
mrrobot47:fix/setup-logrotate

Conversation

@mrrobot47

Copy link
Copy Markdown
Member

Summary

Adds EasyEngine-managed log rotation setup during CLI migration so site, nginx-proxy, and EasyEngine CLI logs do not grow unbounded on Ubuntu/Linux servers.

The migration now writes and validates logrotate configs for:

  • EE_ROOT_DIR/logs/*.log
  • EE_ROOT_DIR/sites/*/logs/nginx/*.log
  • EE_ROOT_DIR/sites/*/logs/php/*.log
  • EE_ROOT_DIR/services/nginx-proxy/logs/*.log

It also force-rotates these logs once after setup/update, then relies on the system logrotate schedule for daily rotation.

Details

  • Adds EE\Logrotate\Utils::setup_logrotate().
  • Registers ee-setup-logrotate as the final migration step in Runner::migrate().
  • Installs logrotate via apt-get if missing and available.
  • Skips setup on macOS.
  • Uses wildcard logrotate patterns so new sites are covered automatically without site-create hooks.
  • Uses copytruncate to avoid per-site container signaling.
  • Keeps 30 daily rotations.
  • Validates generated configs with logrotate -d.
  • Force-runs logrotate -f once after successful setup/update.
  • Cleans up old generated per-site logrotate configs only after validation succeeds.
  • Keeps logrotate failures non-fatal so migrations are not rolled back by optional infrastructure setup.

Testing

  • php -l php/EE/Logrotate/Utils.php
  • php -l php/EE/Runner.php
  • git diff --check origin/develop...HEAD
  • Verified PSR-0 autoload path for EE\Logrotate\Utils
  • Validated generated logrotate configs in a throwaway Ubuntu 24.04 container with logrotate -d
  • Verified forced rotation in a throwaway Ubuntu 24.04 container with logrotate -f

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds an EasyEngine-managed logrotate setup step to the CLI migration flow, aiming to ensure EasyEngine/site/nginx-proxy logs are rotated on Linux hosts so they don’t grow without bounds.

Changes:

  • Registers a new final migration step (ee-setup-logrotate) in Runner::migrate().
  • Introduces EE\Logrotate\Utils::setup_logrotate() to write logrotate configs under /etc/logrotate.d.
  • Adds validation and one-time forced rotation logic, plus cleanup of legacy per-site/per-proxy configs.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

File Description
php/EE/Runner.php Adds a migration step to run logrotate setup during CLI migration.
php/EE/Logrotate/Utils.php New utility to install (if possible), write, validate, force-run, and cleanup logrotate configs for EE-managed logs.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread php/EE/Logrotate/Utils.php
Comment thread php/EE/Logrotate/Utils.php
Comment thread php/EE/Logrotate/Utils.php Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

Comment thread php/EE/Logrotate/Utils.php Outdated
Comment thread php/EE/Logrotate/Utils.php
Comment thread php/EE/Logrotate/Utils.php

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

Comment thread php/EE/Logrotate/Utils.php Outdated
Comment thread php/EE/Logrotate/Utils.php
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@Arittra-Bag

Copy link
Copy Markdown

Tested PR PHAR on test server ee-cli-testing-aws.rt.gw.

Built PHAR locally:

php -dphar.readonly=0 utils/make-phar.php easyengine.phar --version=4.11.0-nightly-pr1927
php easyengine.phar cli version
ls -lh easyengine.phar

Output:

Generated easyengine.phar
EE 4.11.0-nightly-pr1927
-rwxr-xr-x@ 1 arittrabag  staff   7.7M Jul  7 15:22 easyengine.phar

Copied PHAR to test server:

scp -i ~/.ssh/rtcamp_key -o IdentitiesOnly=yes \
  easyengine.phar \
  root@65.1.186.151:/root/easyengine-pr1927.phar

Output:

easyengine.phar  100% 7926KB   2.9MB/s   00:02

Checked PHAR on server:

ls

Output:

easyengine-pr1927.phar  server_meta.sh  snap

Replaced ee on test server after backup:

set -euo pipefail

echo "== before =="
which ee
ee cli version
ee site list

cp -av "$(command -v ee)" "/root/ee.backup.$(date +%Y%m%d%H%M%S)"
install -m 0755 /root/easyengine-pr1927.phar "$(command -v ee)"
hash -r

echo "== after PR PHAR =="
which ee
ee cli version
ee site list

Output:

== before ==
/usr/local/bin/ee
EE 4.11.0
+-------------------+---------+
| site              | status  |
+-------------------+---------+
| ab-ee-test1.rt.gw | enabled |
| ab-ee-test2.rt.gw | enabled |
+-------------------+---------+
'/usr/local/bin/ee' -> '/root/ee.backup.20260707095756'
== after PR PHAR ==
/usr/local/bin/ee
EE 4.11.0-nightly-pr1927
Executing migrations. This might take some time.
+-------------------+---------+
| site              | status  |
+-------------------+---------+
| ab-ee-test1.rt.gw | enabled |
| ab-ee-test2.rt.gw | enabled |
+-------------------+---------+

Checked existing sites and logrotate dry-run:

echo "== existing sites =="
ee site info ab-ee-test1.rt.gw
ee site info ab-ee-test2.rt.gw

echo "== logrotate files =="
ls -l /etc/logrotate.d/ee* 2>/dev/null || true

echo "== logrotate configs + dry-run =="
for f in /etc/logrotate.d/ee*; do
  echo "===== $f ====="
  sed -n '1,160p' "$f"
  echo "----- dry-run -----"
  logrotate -d "$f" 2>&1 | tail -40
done

Output summary:

== existing sites ==
Site ab-ee-test1.rt.gw info loaded successfully.
Site ab-ee-test2.rt.gw info loaded successfully.

== logrotate files ==
-rw-r--r-- 1 root root 150 Jul  7 09:58 /etc/logrotate.d/ee_cli
-rw-r--r-- 1 root root 171 Jul  7 09:58 /etc/logrotate.d/ee_nginx_proxy
-rw-r--r-- 1 root root 203 Jul  7 09:58 /etc/logrotate.d/ee_sites

/etc/logrotate.d/ee_cli dry-run parsed successfully.
/etc/logrotate.d/ee_nginx_proxy dry-run parsed successfully.
/etc/logrotate.d/ee_sites dry-run parsed successfully.

Created a new WP site with the PR PHAR:

ee site create ab-ee-test3.rt.gw --type=wp --skip-status-check
ee site info ab-ee-test3.rt.gw
ee site list

echo "== logrotate files after new site =="
ls -l /etc/logrotate.d/ee* 2>/dev/null || true

Output:

Starting site creation.
Configuring project.
Creating WordPress site ab-ee-test3.rt.gw
Copying configuration files.
Starting site's services.
Downloading and configuring WordPress.
Moved /var/www/htdocs/wp-config.php to /var/www/wp-config.php successfully
Success: Host entry successfully added.
Installing WordPress site.
Success: http://ab-ee-test3.rt.gw has been created successfully!
Site entry created.
Creating cron entry
Success: Cron created successfully
+--------------------+-----------------------------------------+
| Site               | http://ab-ee-test3.rt.gw                |
+--------------------+-----------------------------------------+
| Site Root          | /opt/easyengine/sites/ab-ee-test3.rt.gw |
+--------------------+-----------------------------------------+
| Site Title         | ab-ee-test3.rt.gw                       |
+--------------------+-----------------------------------------+
| WordPress Username | wp-user-l15355                          |
+--------------------+-----------------------------------------+
| Alias Domains      | None                                    |
+--------------------+-----------------------------------------+
| DB Host            | global-db                               |
+--------------------+-----------------------------------------+
| DB Name            | ab_ee_test3_rt_gw                       |
+--------------------+-----------------------------------------+
| E-Mail             | admin@ab-ee-test3.rt.gw                 |
+--------------------+-----------------------------------------+
| SSL                | Not Enabled                             |
+--------------------+-----------------------------------------+
| Cache              | None                                    |
+--------------------+-----------------------------------------+
| Proxy Cache        | Off                                     |
+--------------------+-----------------------------------------+
+-------------------+---------+
| site              | status  |
+-------------------+---------+
| ab-ee-test1.rt.gw | enabled |
| ab-ee-test2.rt.gw | enabled |
| ab-ee-test3.rt.gw | enabled |
+-------------------+---------+
== logrotate files after new site ==
-rw-r--r-- 1 root root 150 Jul  7 09:58 /etc/logrotate.d/ee_cli
-rw-r--r-- 1 root root 171 Jul  7 09:58 /etc/logrotate.d/ee_nginx_proxy
-rw-r--r-- 1 root root 203 Jul  7 09:58 /etc/logrotate.d/ee_sites

Final verification:

ee cli version
ls -l /etc/logrotate.d/ee*
logrotate -d /etc/logrotate.d/ee_sites 2>&1 | tail -60

Output:

EE 4.11.0-nightly-pr1927
-rw-r--r-- 1 root root 150 Jul  7 09:58 /etc/logrotate.d/ee_cli
-rw-r--r-- 1 root root 171 Jul  7 09:58 /etc/logrotate.d/ee_nginx_proxy
-rw-r--r-- 1 root root 203 Jul  7 09:58 /etc/logrotate.d/ee_sites

Handling 1 logs

rotating pattern: /opt/easyengine/sites/*/logs/nginx/*.log
/opt/easyengine/sites/*/logs/php/*.log  after 1 days (30 rotations)
empty log files are not rotated, old logs are removed
considering log /opt/easyengine/sites/ab-ee-test1.rt.gw/logs/nginx/access.log
considering log /opt/easyengine/sites/ab-ee-test1.rt.gw/logs/nginx/error.log
considering log /opt/easyengine/sites/ab-ee-test2.rt.gw/logs/nginx/access.log
considering log /opt/easyengine/sites/ab-ee-test2.rt.gw/logs/nginx/error.log
considering log /opt/easyengine/sites/ab-ee-test3.rt.gw/logs/nginx/access.log
considering log /opt/easyengine/sites/ab-ee-test3.rt.gw/logs/nginx/error.log
considering log /opt/easyengine/sites/ab-ee-test1.rt.gw/logs/php/access.log
considering log /opt/easyengine/sites/ab-ee-test1.rt.gw/logs/php/error.log
considering log /opt/easyengine/sites/ab-ee-test2.rt.gw/logs/php/access.log
considering log /opt/easyengine/sites/ab-ee-test2.rt.gw/logs/php/error.log
considering log /opt/easyengine/sites/ab-ee-test3.rt.gw/logs/php/access.log
considering log /opt/easyengine/sites/ab-ee-test3.rt.gw/logs/php/error.log

Result: PHAR validation passed on existing setup and new site setup.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants