Repository navigation
Conversation
matrixise
marked this pull request as draft
February 4, 2026 11:16
Contributor
Author
|
I've converted this PR to draft status because I realize I've committed too many separate concerns together, which doesn't follow good PR practices. I will split this work into separate PRs:
This separation will make the changes easier to review and allow for incremental adoption. I'll close this PR once the split PRs are ready. |
Implement automatic environment isolation based on git branch names,
allowing developers to work on multiple branches simultaneously without
conflicts between databases, containers, or Docker volumes.
Key changes:
- Auto-detect git branch and normalize name (replace special chars)
- Tag Docker images by branch (python.ie/website:{branch})
- Isolate PostgreSQL databases per branch (pythonie_{branch})
- Create separate Docker volumes per branch
- Add configurable ports for parallel development (WEB_PORT, PG_PORT)
- Upgrade Redis from 6.2 to 7-alpine with persistence
- Add healthchecks for PostgreSQL and Redis
- Remove unused minio and mc services
New Taskfile commands:
- task branch:info - Show current branch environment
- task branch:volumes - List all Docker volumes by branch
- task branch:clean - Remove volumes for current branch
- task env:write - Generate .env file for docker-compose
Documentation:
- Add DOCKER-BRANCHES.md with usage examples and troubleshooting
- Add .env.example template for custom port overrides
- Update .gitignore to exclude generated .env file
This enables developers to switch branches or run multiple instances
in parallel without losing data or experiencing port conflicts.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Extend branch isolation to SQLite databases for local development
and add comprehensive documentation for the branch isolation feature.
Changes to SQLite isolation:
- Modify dev.py to use branch-specific SQLite files (db-{branch}.sqlite3)
- Add *.sqlite3 to .gitignore to exclude database files
- Remove debug print statement from dev.py
- Each branch now has isolated SQLite data without requiring worktrees
Documentation improvements:
- Add complete "Docker Branch Isolation" section to README.md
- Document all branch:* commands (info, verify, volumes, clean)
- Add examples for multi-branch development and branch switching
- Add troubleshooting section for database configuration issues
- Update DOCKER-BRANCHES.md to mention SQLite isolation
- Add note in local setup about GIT_BRANCH export
New Taskfile command:
- task branch:verify - Comprehensive verification of branch configuration
Shows git branch, expected database, .env file, and PostgreSQL databases
This ensures complete data isolation between branches whether using
Docker (PostgreSQL) or local development (SQLite), preventing data
loss when switching branches.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Replace the home-grown git branch detection with worktrunk lifecycle hooks declared in .config/wt.toml: - pre-start writes a .env with COMPOSE_PROJECT_NAME, a per-branch DOCKER_IMAGE tag and hash_port-derived WEB_PORT / PGPORT - post-start runs `uv sync --all-groups` for the host virtualenv - post-remove tears down the worktree's compose project (containers, network, volumes) and its image docker-compose.yml reads these variables with the previous values as defaults, so nothing changes without worktrunk. The Taskfile loads .env (for PGPORT on the host) and builds through compose so the image tag comes from a single place. Drop the branch:* tasks, env:write, GIT_BRANCH plumbing, per-branch SQLite (the file already lives inside each worktree), the Redis 7 and healthcheck changes (unrelated), and the unused minio/mc services whose fixed host ports would collide between worktrees.
Add a "Parallel Worktrees with worktrunk" section to DEVELOPMENT.md, link it from the README quick start, and drop the removed minio service from the docs.
docker compose down skips running containers started with docker compose run (such as an open task run), which kept the network and the branch image in use after wt remove.
3 tasks done
matrixise
force-pushed
the
feat/docker-branch-isolation
branch
from
October 19, 2026 05:53
ebee7af to
ef5808c
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Give every git worktree its own Docker Compose environment by relying on worktrunk (
wt) lifecycle hooks instead of home-grown branch detection. Several branches can runtask run/task testsside by side without sharing a database, an image or a port.Nothing changes for contributors who do not use worktrunk: without a
.env, every value falls back to the previous defaults (port 8000, Postgres on 5432, imagepython.ie/website-dev).How it works
.config/wt.tomldeclares the hooks (each one commented):pre-start.envin the new worktree:COMPOSE_PROJECT_NAME=pythonie-<branch>,DOCKER_IMAGE=python.ie/website-dev:<branch>,WEB_PORTandPGPORTderived withhash_portpost-startuv sync --all-groupsin the background (host.venv)post-removedocker compose runone-offs), network, volumes (Postgres and Redis data) and its branch image[list] urlwt listdocker-compose.ymlreads these variables with the old values as defaults and gainsbuild: .so the image tag comes from one place.Taskfile.yamlloads.env(sopsql/task database:pulluse the worktree'sPGPORT), builds throughdocker compose build, and no longer setsDOCKER_IMAGE(it would override.env)..envis gitignored.DEVELOPMENT.md, linked from the README.Removed compared to the first version of this PR
env:write,branch:*tasks,GIT_BRANCHplumbing,DOCKER-BRANCHES.md,.env.examplesettings/dev.py: the database file already lives inside each worktreeKept: removal of the
minio/mcservices. Nothing in the dev or test settings uses them, and their fixed host ports (9000/9001) would collide between worktrees.Verification
task testsrun concurrently in both containers: OKwt remove: volumes removed, but a runningdocker compose runcontainer survived the first version of the hook. Fixed in the last commit and validated by running the rendered script; a fullwt removecycle with the fixed hook is still to be redone.uv run ruff format --check pythonieanduv run ruff check pythonie: OKOpen questions
WAGTAILADMIN_BASE_URLis still hard-coded tolocalhost:8000insettings/dev.py; should it followWEB_PORT?toast.ymlstill usespython.ie/website-dev(thelatesttag), not the per-branch image.