# Git Repository Setup This guide covers how to configure ComposeSync to work with Git repositories as sources for Docker Compose files. ## Overview ComposeSync can download Docker Compose files from Git repositories, allowing you to: - Track specific branches, tags, or commits - Access files in subdirectories - Maintain version control for your compose configurations - Use private repositories (with proper authentication) ## TOML Configuration (Recommended) The TOML format provides clear and readable Git repository configuration: ```toml # Git repository configuration [my-app] URL = "https://github.com/user/my-app.git" PATH = "/opt/composesync/stacks/my-app" TOOL = "git" GIT_SUBPATH = "docker/docker-compose.yml" GIT_REF = "main" [development-app] URL = "https://github.com/user/dev-app.git" PATH = "/opt/composesync/stacks/dev-app" TOOL = "git" GIT_SUBPATH = "deploy/docker-compose.yml" GIT_REF = "develop" INTERVAL = 1800 # Check every 30 minutes [stable-release] URL = "https://github.com/user/app.git" PATH = "/opt/composesync/stacks/stable" TOOL = "git" GIT_SUBPATH = "docker/docker-compose.yml" GIT_REF = "v2.1.0" # Specific tag INTERVAL = 86400 # Check daily ``` ## Legacy .env Configuration The .env format is supported for backward compatibility: ```env # Git repository configuration STACKS=3 STACK_1_NAME=my-app STACK_1_URL=https://github.com/user/my-app.git STACK_1_PATH=/opt/composesync/stacks/my-app STACK_1_TOOL=git STACK_1_GIT_SUBPATH=docker/docker-compose.yml STACK_1_GIT_REF=main STACK_2_NAME=development-app STACK_2_URL=https://github.com/user/dev-app.git STACK_2_PATH=/opt/composesync/stacks/dev-app STACK_2_TOOL=git STACK_2_GIT_SUBPATH=deploy/docker-compose.yml STACK_2_GIT_REF=develop STACK_2_INTERVAL=1800 STACK_3_NAME=stable-release STACK_3_URL=https://github.com/user/app.git STACK_3_PATH=/opt/composesync/stacks/stable STACK_3_TOOL=git STACK_3_GIT_SUBPATH=docker/docker-compose.yml STACK_3_GIT_REF=v2.1.0 STACK_3_INTERVAL=86400 ``` ## Git Configuration Options ### Required Options | Option | Description | Example | |--------|-------------|---------| | `URL` | Git repository URL | `https://github.com/user/repo.git` | | `PATH` | Local path for the stack | `/opt/composesync/stacks/my-app` | | `TOOL` | Must be set to `"git"` | `git` | ### Optional Options | Option | Description | Default | Example | |--------|-------------|---------|---------| | `GIT_SUBPATH` | Path to docker-compose.yml in repo | `docker-compose.yml` (root) | `docker/compose.yml` | | `GIT_REF` | Branch, tag, or commit hash | `main` | `develop`, `v1.2.3`, `abc123` | | `INTERVAL` | Update interval (seconds) | Global setting | `1800` | | `KEEP_VERSIONS` | Number of backup versions | Global setting | `5` | ## Git Reference Types ### Branches ```toml [main-branch] URL = "https://github.com/user/app.git" PATH = "/opt/composesync/stacks/main" TOOL = "git" GIT_REF = "main" [feature-branch] URL = "https://github.com/user/app.git" PATH = "/opt/composesync/stacks/feature" TOOL = "git" GIT_REF = "feature/new-ui" ``` ### Tags ```toml [stable-release] URL = "https://github.com/user/app.git" PATH = "/opt/composesync/stacks/stable" TOOL = "git" GIT_REF = "v2.1.0" [beta-release] URL = "https://github.com/user/app.git" PATH = "/opt/composesync/stacks/beta" TOOL = "git" GIT_REF = "beta-v2.2.0" ``` ### Commit Hashes ```toml [specific-commit] URL = "https://github.com/user/app.git" PATH = "/opt/composesync/stacks/commit" TOOL = "git" GIT_REF = "abc123def456789" ``` ## Subdirectory Configuration If your Docker Compose file is not in the repository root, use `GIT_SUBPATH`: ```toml [app-with-subdir] URL = "https://github.com/user/app.git" PATH = "/opt/composesync/stacks/app" TOOL = "git" GIT_SUBPATH = "docker/docker-compose.yml" GIT_REF = "main" ``` Common subdirectory patterns: - `docker/docker-compose.yml` - `deploy/docker-compose.yml` - `compose/docker-compose.yml` - `infrastructure/docker-compose.yml` ## Multiple Compose Files with Git For repositories with multiple compose files: ```toml [complex-app] URL = "https://github.com/user/complex-app.git" PATH = "/opt/composesync/stacks/complex" TOOL = "git" GIT_SUBPATH = "docker/docker-compose.yml" GIT_REF = "main" EXTRA_FILES_1 = "https://raw.githubusercontent.com/user/complex-app/main/docker/network.yml" EXTRA_FILES_2 = "https://raw.githubusercontent.com/user/complex-app/main/docker/volumes.yml" EXTRA_FILES_ORDER = "1,2" ``` ## Private Repositories ### SSH Authentication For private repositories using SSH: ```toml [private-app] URL = "git@github.com:user/private-app.git" PATH = "/opt/composesync/stacks/private" TOOL = "git" GIT_SUBPATH = "docker/docker-compose.yml" GIT_REF = "main" ``` **Setup SSH keys:** ```bash # Generate SSH key (if not exists) ssh-keygen -t ed25519 -C "composesync@your-server" # Add to SSH agent ssh-add ~/.ssh/id_ed25519 # Add public key to GitHub/GitLab cat ~/.ssh/id_ed25519.pub ``` ### HTTPS with Personal Access Token For private repositories using HTTPS: ```toml [private-app] URL = "https://github.com/user/private-app.git" PATH = "/opt/composesync/stacks/private" TOOL = "git" GIT_SUBPATH = "docker/docker-compose.yml" GIT_REF = "main" ``` **Setup credentials:** ```bash # Configure Git credentials git config --global credential.helper store git config --global user.name "Your Name" git config --global user.email "your-email@example.com" # Test access git clone https://github.com/user/private-app.git /tmp/test ``` ## Best Practices ### 1. Use Semantic Versioning ```toml [production] URL = "https://github.com/user/app.git" PATH = "/opt/composesync/stacks/production" TOOL = "git" GIT_REF = "v2.1.0" # Specific version [development] URL = "https://github.com/user/app.git" PATH = "/opt/composesync/stacks/development" TOOL = "git" GIT_REF = "develop" # Latest development ``` ### 2. Organize by Environment ```toml # Production environments [prod-app] URL = "https://github.com/user/app.git" PATH = "/opt/composesync/stacks/prod" TOOL = "git" GIT_REF = "main" INTERVAL = 7200 # Development environments [dev-app] URL = "https://github.com/user/app.git" PATH = "/opt/composesync/stacks/dev" TOOL = "git" GIT_REF = "develop" INTERVAL = 1800 ``` ### 3. Use Descriptive Branch Names ```toml [stable] URL = "https://github.com/user/app.git" PATH = "/opt/composesync/stacks/stable" TOOL = "git" GIT_REF = "stable" [experimental] URL = "https://github.com/user/app.git" PATH = "/opt/composesync/stacks/experimental" TOOL = "git" GIT_REF = "experimental" ``` ## Troubleshooting ### Repository Not Found ```bash # Test repository access git clone https://github.com/user/repo.git /tmp/test # Check SSH access ssh -T git@github.com ``` ### Branch/Tag Not Found ```bash # List available branches git ls-remote --heads https://github.com/user/repo.git # List available tags git ls-remote --tags https://github.com/user/repo.git ``` ### Subpath Not Found ```bash # Check if file exists in repository git ls-tree -r --name-only HEAD | grep docker-compose.yml ``` ### Authentication Issues ```bash # Test SSH connection ssh -T git@github.com # Test HTTPS with token curl -H "Authorization: token YOUR_TOKEN" https://api.github.com/user ``` ## Monitoring Git Operations ### View Git Operations in Logs ```bash # View ComposeSync logs sudo journalctl -u composesync -f # Filter for Git operations sudo journalctl -u composesync | grep "git" ``` ### Check Repository Status ```bash # Check if repository is cloned ls -la /opt/composesync/stacks/my-app/.git # Check current branch/commit git -C /opt/composesync/stacks/my-app/.git rev-parse --abbrev-ref HEAD git -C /opt/composesync/stacks/my-app/.git rev-parse HEAD ``` ### Manual Git Operations ```bash # Manually fetch updates cd /opt/composesync/stacks/my-app/.git git fetch origin # Check available branches git branch -r # Switch to different branch git checkout develop ```