Skip to content

v0.19.0 — Runtime Modernization, fmx In-Container Utility, SSL Overhaul & Zero-Downtime Migrations#360

Merged
Xieyt merged 488 commits into
mainfrom
develop
Jul 2, 2026
Merged

v0.19.0 — Runtime Modernization, fmx In-Container Utility, SSL Overhaul & Zero-Downtime Migrations#360
Xieyt merged 488 commits into
mainfrom
develop

Conversation

@Xieyt

@Xieyt Xieyt commented Feb 12, 2026

Copy link
Copy Markdown
Collaborator

This major release spans the full stack: updates to the in-container fmx utility, replacement of certbot with acme.sh for SSL, replacement of pyenv/nvm with uv/fnm for Python/Node runtime management, Docker performance improvements, a completely reworked FM migration system, and an overhauled documentation site.


⚠️ Breaking Changes

  1. Migration window: v0.18.0 minimum - v0.19.0 only migrates from v0.18.0+. Users on older versions must upgrade to v0.18.0 first.

  2. Runtime: pyenv/nvmuv/fnm - Old runtime directories are cleaned up during migration. Python versions are now managed by uv and stored per-bench at .uv/python/. Node versions are managed by fnm and stored per-bench at .fnm/.

  3. SSL: certbotacme.sh - All certificate operations now use acme.sh. No email required for Let's Encrypt. The certbot CLI dependency is removed entirely.

  4. [ssl] config → [[ssl_certificates]] array - The old single [ssl] table is migrated to an array of [[ssl_certificates]] entries, supporting multiple certs per bench. preferred_challenge is renamed to challenge_type; credentials move to [dns_providers.cloudflare].

  5. fm ssl deletefm ssl remove - The delete subcommand is renamed.

  6. --frappe-branch removed - Use --apps frappe:version-16 instead.

  7. --ssl, --letsencrypt-email, --letsencrypt-preferred-challenge removed from create/update - SSL is now managed post-creation via fm ssl add.

  8. --sync-config flag removed - Configuration sync is handled automatically.

  9. Docker images updated to v0.19.0 - Global nginx-proxy updated from jwilder/nginx-proxy:1.6 to 1.11.

  10. nginx SITENAME env var → SITE_MAPPINGS - Now a JSON mapping ({"sitename": "sitename"}) instead of a plain string.

  11. Removed: Redis Queue Dashboard from admin tools; DisplayManager module from the host CLI (inlined into RichOutputHandler).


What's New

fmx - In-Container Utility (Updated)

fmx (originally fm-helper) is the existing in-container CLI that manages bench processes from within the Frappe Docker image. v0.19.0 upgrades it to Python 3.10, migrates its build system to Hatchling, locks dependencies, and ships several RQ fixes.

v0.19.0 changes to fmx:

  • Upgraded runtime to Python 3.10 with locked dependencies (uv.lock)
  • Migrated build system to Hatchling (pyproject.toml)
  • Simplified unresolvable RQ job name extraction
  • Fixed RQ job deserialization edge cases
  • Improved restart behavior and process state handling

Commands (for reference):

Command Description
fmx status [services...] Supervisor process tree + RQ worker status (queue depths, worker states, suspend flag)
fmx start [services...] Start services/processes via supervisor
fmx stop [services...] Stop services with optional worker draining (--drain-workers, --worker-kill-timeout, --skip-stale-workers)
fmx restart [services...] Restart services with optional zero-downtime Frappe app migration (see below)
fmx rq suspend Set Redis rq:suspended flag - workers stop dequeuing new jobs
fmx rq resume Clear the Redis suspend flag
fmx rq status [-v] Show RQ suspend state, queue depths, per-worker details

How it works:

  • Supervisor integration via XML-RPC over Unix sockets (/fm-sockets/*.sock)
  • Parallel execution across services using ThreadPoolExecutor
  • Worker draining: suspends RQ workers via Redis flag, polls until all workers are idle (configurable timeout + stale-worker detection)
  • Warm shutdown: sends SIGUSR1 to worker processes for graceful job completion
  • Fault handler: graceful recovery from supervisor SPAWN_ERROR and connection failures
  • bench-wrapper.sh: intercepts bench restart/status/stop → delegates to fmx; wraps bench worker with a SIGUSR1 trap for graceful shutdown; bare bench with no args shows fmx helper commands

Zero-Downtime Frappe App Deployment (fmx restart --migrate)

fmx restart --migrate is a standalone production deployment tool inside the container. It is completely independent of fm migrate (FM infrastructure migration). Use it whenever you update a Frappe app and need to run Frappe's own database migrations (bench migrate) without dropping in-flight jobs or taking the site down hard.

Flow (fmx restart --migrate):

  1. Optionally enable maintenance mode (--maintenance-mode)
  2. Suspend RQ workers via Redis rq:suspended flag
  3. Wait for all in-flight jobs to complete (configurable --worker-kill-timeout, --skip-stale-workers)
  4. Run bench migrate (Frappe app DB schema migrations - not FM)
  5. Restart all services
  6. Resume RQ workers
  7. Disable maintenance mode

Relevant flags:

Flag Description
--migrate Run bench migrate before restarting
--migrate-command Override the migrate command (e.g. bench --site mysite migrate)
--drain-workers Suspend + drain RQ before restart (implied by --migrate)
--worker-kill-timeout Max seconds to wait for workers to go idle
--skip-stale-workers Skip workers that appear stuck/stale
--maintenance-mode Toggle maintenance_mode=1 in common_site_config.json during the flow

Note: This runs bench migrate (Frappe framework's app schema migration) - a completely different operation from fm migrate (Frappe Manager infrastructure upgrade). The two systems have zero overlap.


SSL Management Overhaul

New fm ssl subcommand tree:

Subcommand Description
fm ssl add <bench> <domain> Issue certificate for a bench domain
fm ssl add --standalone <domain> Issue certificate for an external Docker project
fm ssl remove <bench> <domain> Remove a bench certificate
fm ssl list [bench] / --all / --standalone List certificates
fm ssl renew [bench] [domain] Renew with --dry-run, --force, --all, --standalone
fm ssl acme-sh <args> Direct passthrough to acme.sh for advanced operations
fm ssl dns-config Configure DNS provider credentials (Cloudflare)

Challenge types:

  • HTTP-01 (--challenge http01): Webroot via nginx-proxy. Requires domain to resolve to the server.
  • DNS-01 (--challenge dns01): Cloudflare API. Supports --cname for CNAME delegation.

Standalone mode (--standalone): Manages SSL for any Docker project using FM's nginx-proxy via the fm-global-frontend-network. Configurations stored in external_domains.toml.

Other:

  • Staging/dry-run support via FM_LETSENCRYPT_STAGING=1
  • Pre-flight DNS validation (--skip-dns-check, --wait-for-dns)
  • Renewal failures surfaced as errors; orphaned certs cleaned up on HTTPS config or reload failure

CLI / UX Improvements

New global flags:

Flag Description
--non-interactive / -n Disable all prompts (CI/CD mode)
--log-level debug|info|warning|error Set log level (default: warnings/errors only)

fm create - new flags:

Flag Description
--python Pin Python version (e.g. 3.11)
--node Pin Node version (e.g. 20)
--restart Docker restart policy
--alias-domains Comma-separated alias domains
--github-token / -t GitHub token for private repos
--newrelic / --no-newrelic Enable/disable NewRelic APM

fm update - new flags:

Flag Description
--python Update Python version
--node Update Node version
--add-alias Add alias domains (comma-separated)
--remove-alias Remove alias domains (comma-separated)
--upload-limit Set max upload size (e.g. 500M)
--restart Update Docker restart policy
--newrelic / --no-newrelic Toggle NewRelic APM

fm restart - new flags:

Flag Description
--nginx Restart nginx service
--container Full container restart
--supervisor In-container supervisor restart (faster, default)
--force Force immediate restart

fm migrate - new command:

Flag Description
--all-benches Migrate all benches in one run
--auto-proceed Skip confirmation prompts
--rerun Re-apply migration steps
--on-failure prompt|archive|rollback Action on failure
--skip-all-backup Skip all backups (dangerous)
--skip-backup-for <bench> Skip backup for a specific bench
--exclude-bench <bench> Exclude from --all-benches run

fm shell - new flags:

Flag Description
-c / --command Execute command and exit
--bench-console Open Frappe IPython console

Other:

  • Interactive bench selection (fuzzy prompt when no bench name is given)
  • Structured CLI examples on every --help via typer-examples
  • fm info now shows Python and Node versions
  • fm self compose - debug compose configuration
  • fm services shell - shell into global service containers

Architecture & Configuration

  • Commands reorganized into frappe_manager/commands/{ssl,self,services}/ module structure
  • Global output handler registry: get_global_output_handler / set_global_output_handler with LoggingOutputHandler wrapper
  • Bench class modularized into app_manager, certificate_manager, docker_ops, supervisor, ssl, orchestrator sub-objects
  • App cloning: monorepo support, parallel cloning, multi-auth fallback (SSH → HTTPS → token)
  • Docker client: new BenchOrchestrator, auto-streaming, os.execvp for direct docker compose execution (removes subprocess overhead)
  • Unique database names per bench (fm_{name}_{token_hex(8)})
  • Version source of truth moved to frappe_manager/__about__.py
  • pyproject.toml migrated to PEP 621 format with hatchling build system
  • Alias domains: primary domain + multiple aliases, each with automatic SSL

FM Migration System (Infrastructure Upgrade)

This is FM's own upgrade mechanism - it transforms config files, Docker images, and runtime tooling when upgrading FM from v0.18.0 → v0.19.0. It has nothing to do with bench migrate (Frappe app DB migrations) or fmx.

Two-tier architecture:

  • Infrastructure migration (global services, CLI config) - checked on every fm invocation (except whitelisted commands: list, self compose, self update-images, migrate); user is prompted to update inline
  • Per-bench migration - opt-in via fm migrate <benchname>

What fm migrate does per-bench (all performed outside the container via Docker Compose and config file edits):

Step What happens
Config transform [ssl][[ssl_certificates]], rename fields, move DNS creds, add alias_domains / upload_limit / restart_policy / use_uv
Docker Compose update Image tags v0.18.0 → v0.19.0, SITENAMESITE_MAPPINGS, add restart policies
Image pull Pull updated Docker images if tags changed
Upload limit Apply client_max_body_size across vhostd, site_config.json, nginx custom config
Runtime rebuild pyenv/nvm → uv/fnm (auto-detects Python/Node versions from the running container)
Supervisor regen Regenerate supervisor config from FM template
Container restart Force-recreate containers via docker compose up --force-recreate
Backup & rollback Per-bench backup of config, compose, DB, supervisor, nginx, env, common_site_config.json, and per-site site_config.json before any change

fm migrate flags:

Flag Description
--all-benches Migrate all benches in one run
--auto-proceed Skip confirmation prompts
--rerun Re-apply migration steps (re-runs config transforms and supervisor regen; runtime rebuild only skipped if env is already current)
--on-failure prompt|archive|rollback What to do when a bench fails
--skip-all-backup Skip all backups (dangerous)
--skip-backup-for <bench> Skip backup for a specific bench
--exclude-bench <bench> Exclude from --all-benches run

Docker & Performance

  • exec-entrypoint.sh: lightweight entrypoint for one-off commands - skips full init, uses numeric gosu UID/GID to eliminate the ~16s usermod/groupmod delay
  • Removed recursive /opt chown - was a major slow path on every startup
  • wkhtmltopdf moved to base Docker stage - available in all image variants
  • Build cache per architecture - faster multi-arch CI builds
  • .uv / .fnm relocated to frappe-bench/ (per-bench isolation, cleaner home dir)
  • Multi-stage Dockerfile: base (Ubuntu 22.04 + system deps + wkhtmltopdf) → tooling (fnm, uv, fmx) → frappe (final)
  • Pre-baked runtimes: Python 3.14.2 + Node 24.11.0 in the Docker image for faster first-site creation
  • PyPI publish workflow: automated publish on v* tag push

Documentation Overhaul

  • Migrated to GitHub Pages with versioned docs (MkDocs + mike)
  • New guides: fmx.md, ssl.md, backup-restore.md, environments.md, python-node-versions.md, upload-limits.md, admin-tools.md, app-management.md, external-database.md
  • Auto-generated CLI reference from live Typer app via scripts/update_cli_docs.py
  • SCSS-based styling with rtCamp branding
  • CLI examples standardized across all commands using typer-examples

Tests Added

  • Comprehensive SSL manager unit tests (add/renew/remove lifecycle)
  • Migration flow integration tests (--rerun, --on-failure flags)
  • fmx worker kill parameter tests
  • Global output handler autouse fixture in conftest.py
  • Docker Compose config tests
  • Contextual logging tests

Bug Fixes

  • Heavyweight ctx.obj assignments (services, fm_config_manager, Docker daemon check, migration checks, image pulling) guarded behind help_called check - fixes crashes on --help
  • export_to_toml raises on write failure instead of silently returning False
  • Empty FRAPPE_MANAGER_HOME treated as unset
  • Venv backup directories get timestamps (prevents name collisions)
  • RQ queue status filtering fixed (was reporting incorrect idle/active state)
  • All services (not just workers) restarted on migration failure
  • Mirror selection curl calls now have timeouts; validates HTTP 200 before use
  • Subprocess output decoding hardened (PYTHONUNBUFFERED=1, UTF-8 fallback)
  • Orphaned certs cleaned up on HTTPS config or nginx reload failure
  • Renewal failures surfaced as errors (not warnings)
  • Spinner suppression in non-interactive mode
  • New LiveAwareRichHandler wraps RichHandler to prevent log output colliding with Rich Live displays
  • SocketIO uses fnm-managed node path instead of system node

Upgrading from v0.18.0

# 1. Upgrade fm CLI
uv tool install frappe-manager==0.19.0

# 2. Run infrastructure migration (global services, nginx-proxy, MariaDB)
fm migrate --auto-proceed

# 3. Migrate each bench (rebuilds runtime, transforms config)
fm migrate mybench --auto-proceed

# Or migrate all benches at once with automatic rollback on failure
fm migrate --all-benches --auto-proceed --on-failure=rollback

Notes: Migration creates automatic backups (config, compose, DB, supervisor, nginx). Runtime rebuild takes ~5–10 min per bench. SSL certificates and database data are preserved.

To re-apply migration steps without a full runtime rebuild: fm migrate mybench --rerun


Full changelog

See docs/changelog.md for the complete commit history.

Compare: v0.18.0...v0.19.0

Comment thread tests/unit/site_manager/test_domain_conflict.py Dismissed
Comment thread tests/unit/ssl_manager/test_acmesh_certificate_service.py Dismissed
Comment thread tests/unit/ssl_manager/test_acmesh_certificate_service.py Dismissed
Comment thread tests/unit/ssl_manager/test_certificate.py Dismissed
Comment thread tests/unit/ssl_manager/test_certificate_exceptions.py Dismissed
Comment thread tests/unit/ssl_manager/test_ssl_certificate_manager.py Dismissed
Xieyt and others added 29 commits February 17, 2026 21:27
fix: use `frappe_site_name` for asset resolution instead of `host`
- Implement native supervisor.conf generation using a Jinja2 template
- Remove reliance on `bench setup supervisor` command execution in Docker
- Add `is_running` check for admin tools to prevent unnecessary restarts during bench startup

Signed-off-by: aloksingh <[email protected]>
- Remove explicit check for `benchname` existence at start command
- Eliminate `typer.BadParameter` error for undefined bench name
- The `benchname` is expected to be valid by this point in the execution flow

Signed-off-by: aloksingh <[email protected]>
- Remove explicit check for `benchname` existence at start command
- Eliminate `typer.BadParameter` error for undefined bench name
- The `benchname` is expected to be valid by this point in the execution flow

Signed-off-by: aloksingh <[email protected]>
Fix supervisor config generation and nginx config during alias update
…/setup-python-6

build(deps): bump actions/setup-python from 5 to 6
…/checkout-6

build(deps): bump actions/checkout from 4 to 6
build(deps): bump cryptography from 46.0.3 to 46.0.5
…in permissions

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
…n permissions

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Potential fix for code scanning alert no. 15: Workflow does not contain permissions
Potential fix for code scanning alert no. 5: Workflow does not contain permissions
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v6...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
- Add `exec-command.sh` wrapper for `docker-compose run` commands
- Remove direct `--user` and `--entrypoint` flags from `run` commands
- Centralize UID remapping and environment setup via the new wrapper
- Include `exec-command.sh` in the Frappe Docker image
- Replace direct command execution using `bash -c` with a new `exec-command.sh` wrapper script.
- Remove the explicit `user` and `entrypoint` arguments from all `compose.run` calls.
- This change centralizes the logic for running commands as the correct user within the container's entrypoint, simplifying the Python code.
- Apply this pattern consistently across the `0.19.0` migration script and the `BenchAppManager` and `BenchSiteManager` modules.

Signed-off-by: aloksingh <[email protected]>
- Remove the `images-tag.json` file to use the package version from `pyproject.toml` as the single source of truth.
- Update CI workflows and the local `build.sh` script to dynamically read the package version and construct the image tag.
- Convert `docker-compose.tmpl` files into Jinja2 templates, allowing image tags to be rendered at runtime based on the installed `frappe-manager` version.
- Add a new `get_docker_image_tag` helper function to centralize the logic for creating versioned tags (e.g., `v0.19.0`).

Signed-off-by: aloksingh <[email protected]>
- Update the project version from `0.19.0` to `0.19.0.dev0`.

Signed-off-by: aloksingh <[email protected]>
- Remove the recursive `chown` on the `/opt` directory within the `configure_workspace` shell function to significantly improve container startup times.
- Update the timing log message to reflect the duration of the entire function rather than just the removed `chown` command.
- Remove the '❌' emoji from git validation error messages for a cleaner CLI output.

Signed-off-by: aloksingh <[email protected]>
- Normalize the target version to its base version (e.g., `0.19.0.dev0` becomes `0.19.0`) before comparison.
- This ensures that migrations intended for a final release are correctly included when upgrading to a development or pre-release version.
- Fixes an issue where migrations were being skipped because pre-release versions are considered older than their final release counterparts according to PEP 440.

Signed-off-by: aloksingh <[email protected]>
- Update the migration version string from `0.19.0` to `0.19.0.dev0`.
- This change marks the beginning of the development cycle for the upcoming release.

Signed-off-by: aloksingh <[email protected]>
- Replace the hardcoded "v0.19.0" version string with a dynamic call to `self.version.version_string()`.
- Update Docker image tag replacements, user-facing output messages, and log entries to use the dynamic version.
- Adjust docstrings and comments to refer to the "current version" instead of a specific one, improving code maintainability.

Signed-off-by: aloksingh <[email protected]>
- Replace the hardcoded 'v0.18.0' string replacement with a more robust regular expression.
- The migration script can now update Frappe Manager images from any previous version tag, not just a specific one.
- Improve logging to display the transition from the old version to the new version for better clarity during migration.

Signed-off-by: aloksingh <[email protected]>
- Introduce `exec-entrypoint.sh`, a new lightweight script for executing one-off commands via `docker-compose run`.
- This script only handles UID/GID mapping, skipping the full supervisor and workspace setup to significantly speed up command execution.
- Update `shell`, migration, and other bench commands to use this new entrypoint, resulting in faster operations.
- The new script is now included in the `frappe` Docker image.

Signed-off-by: aloksingh <[email protected]>
- The `exec-command.sh` wrapper script, which was an unnecessary layer of indirection, has been removed from the project.
- The `Dockerfile` is updated to no longer copy the script into the container image.
- All command execution logic in Python files (e.g., shell, migrations, site/app management) is updated to call shells like `/bin/bash` directly instead of using the wrapper script.

Signed-off-by: aloksingh <[email protected]>
- Remove the slow `usermod` operation that previously ran on every container start to match the host user's UID/GID.
- Pass the numeric `${USERID}:${USERGROUP}` directly to `gosu`, which executes the command as the correct user instantly without needing a corresponding `/etc/passwd` entry.
- This change drastically reduces container startup time from over 15 seconds to milliseconds.
- Set the `HOME` environment variable to `/workspace` to ensure a correct home directory, as `gosu` with a numeric UID would otherwise default to `/`.

Signed-off-by: aloksingh <[email protected]>
- Use `gosu ... env` to explicitly pass all required environment variables to the final command.
- This fixes a potential issue where `gosu` might not reliably inherit the environment from the parent shell, making the setup more robust.
- Key variables for `fnm`, `uv`, `PATH`, `HOME`, and locale are now explicitly set for the non-root user process.

Signed-off-by: aloksingh <[email protected]>
- Append a timestamp to the backed-up virtual environment directory (e.g., `env.bak-YYYYMMDD_HHMMSS`).
- Prevent the previous `env.bak` directory from being overwritten each time the venv is recreated.
- Allow for multiple historical backups of the `env` directory to be retained.
- Pass `USER=frappe` and `GROUP=frappe` environment variables to the `gosu` execution environment.
- This ensures these variables are available to subsequent processes, as `gosu` can reset the environment.
- Fixes potential issues with tools or scripts that rely on the `USER` or `GROUP` environment variables being set.

Signed-off-by: aloksingh <[email protected]>
Xieyt and others added 17 commits June 30, 2026 21:18
- Enhance `depends` command to show merge status, review count, and local merge
- Provide a summary of Dependabot PRs (ready, failing, behind, merged)
- Integrate PR approval directly into the `depends-merge` recipe
- Remove redundant `depends-status` and `depends-approve` recipes

Signed-off-by: aloksingh <[email protected]>
- Switch build backend from setuptools to hatchling
- Update project version to 1.1.0 and minimum Python requirement to 3.9
- Configure `uv` to manage `typer-examples` Git dependency

Signed-off-by: aloksingh <[email protected]>
- Bump project version from `1.1.0` to `1.2.0`
- Upgrade core dependencies to newer versions, including `typer`, `rich`, and `redis`
- Remove Python 3.8 from supported classifiers
- Update `nuitka` dev dependency to `4.1.0`

Signed-off-by: aloksingh <[email protected]>
Update dependencies and enhance Dependabot management features
- Switch Dependabot Python ecosystem from `pip` to `uv`
- Add Dependabot updates for `/Docker/frappe/fmx` directory using `uv`
- Remove `tool.poetry.urls` section from `pyproject.toml`

Signed-off-by: aloksingh <[email protected]>
- Increase minimum Python version requirement to 3.10.
- Remove Python 3.9 classifier from `pyproject.toml`.
- Introduce `uv.lock` for deterministic dependency management.

Signed-off-by: aloksingh <[email protected]>
chore: Configure Dependabot and update project metadata
Bumps [packaging](https://github.com/pypa/packaging) from 26.1 to 26.2.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](pypa/packaging@26.1...26.2)

---
updated-dependencies:
- dependency-name: packaging
  dependency-version: '26.2'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Bumps [pydantic](https://github.com/pydantic/pydantic) from 2.13.3 to 2.13.4.
- [Release notes](https://github.com/pydantic/pydantic/releases)
- [Changelog](https://github.com/pydantic/pydantic/blob/main/HISTORY.md)
- [Commits](pydantic/pydantic@v2.13.3...v2.13.4)

---
updated-dependencies:
- dependency-name: pydantic
  dependency-version: 2.13.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Bumps [requests](https://github.com/psf/requests) from 2.33.1 to 2.34.2.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](psf/requests@v2.33.1...v2.34.2)

---
updated-dependencies:
- dependency-name: requests
  dependency-version: 2.34.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Bumps [pytest](https://github.com/pytest-dev/pytest) from 9.0.3 to 9.1.1.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](pytest-dev/pytest@9.0.3...9.1.1)

---
updated-dependencies:
- dependency-name: pytest
  dependency-version: 9.1.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Bumps [cryptography](https://github.com/pyca/cryptography) from 46.0.7 to 49.0.0.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](pyca/cryptography@46.0.7...49.0.0)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 49.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Update dependencies: packaging, pydantic, requests, pytest, cryptography
@Xieyt
Xieyt marked this pull request as ready for review July 1, 2026 10:55
Xieyt added 4 commits July 1, 2026 16:39
- Import `re` module to enable regular expression operations.
- Remove `client_max_body_size` directive from `default.conf` during migration.
- Prevent Nginx from encountering duplicate directive errors when `upload-limit.conf` is active.
- Backup `default.conf` before writing cleaned content.

Signed-off-by: aloksingh <[email protected]>
- Introduce `FM_STOP_CONTAINERS` environment variable for the migration test script
- Make stopping Frappe Manager containers conditional based on `FM_STOP_CONTAINERS` value
- Document the new `FM_STOP_CONTAINERS` variable in the script's comments

Signed-off-by: aloksingh <[email protected]>
- Back up `nginx/conf/conf.d/default.conf` if it exists in the bench config.
- Ensure `nginx default.conf` can be restored after it's modified during migration.
- Update the `_backup_for_rollback` docstring to reflect the new backup item.

Signed-off-by: aloksingh <[email protected]>
Fix Nginx duplicate directive error and add container stop option
@Xieyt Xieyt changed the title v0.19.0 - Major Release: Runtime Modernization & Enhanced Operations v0.19.0 — Runtime Modernization, fmx Utility & Platform Overhaul Jul 1, 2026
@Xieyt Xieyt changed the title v0.19.0 — Runtime Modernization, fmx Utility & Platform Overhaul v0.19.0 — Runtime Modernization, fmx In-Container Utility, SSL Overhaul & Zero-Downtime Migrations Jul 1, 2026
Xieyt added 5 commits July 1, 2026 18:42
- Remove `--skip-failing` flag from the default `bench migrate` command
- Update docstrings and help messages for the `--migrate` and `--migrate-command` options
- Ensure default `bench migrate` command now fails if any migration step encounters an error

Signed-off-by: aloksingh <[email protected]>
- Remove the `.dev0` development suffix from `__version__`
- Set the official application version to `0.19.0`

Signed-off-by: aloksingh <[email protected]>
- Use `frappe_manager.__about__.__version__` for `get_current_fm_version`
- Remove `importlib.metadata.version` for package version lookup
- Add `--reinstall` flag to `pip install` in `migrate-test.sh` script
- Ensure a clean installation of the package during migration tests

Signed-off-by: aloksingh <[email protected]>
- Add `--refresh` flag to the pip install command
- Ensure fresh package metadata is always considered during installation
- Improve reliability of dependency installation within the test script

Signed-off-by: aloksingh <[email protected]>
Refactor migration process and update versioning strategy
@Xieyt
Xieyt merged commit 7149ed0 into main Jul 2, 2026
8 checks passed
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.

4 participants