FossilRepo
Sync: sidebar split, wiki ordering, non-destructive sync script
Commit
8f52aba83e8e2e433d610a9e78ae76b2668f493dbb30b030a49a065e03be56f7
Parent
6d55e0e56631c00…
16 files changed
+2
+53
+73
+738
+1
+1099
+1077
+1288
+1074
+1089
+1108
+1008
+4
+1
+31
~
.gitignore
+
deploy.sh
+
scripts/sync_to_fossil.sh
+
site/404.html
+
site/CNAME
+
site/architecture/overview/index.html
+
site/architecture/sync-bridge/index.html
+
site/getting-started/configuration/index.html
+
site/getting-started/first-repo/index.html
+
site/getting-started/installation/index.html
+
site/getting-started/prerequisites/index.html
+
site/index.html
+
site/overrides/partials/logo.html
+
site/search/search_index.json
+
site/sitemap.xml
+
site/sitemap.xml.gz
+2
| --- .gitignore | ||
| +++ .gitignore | ||
| @@ -28,5 +28,7 @@ | ||
| 28 | 28 | /assets/ |
| 29 | 29 | fossilrepo.fossil |
| 30 | 30 | .fslckout |
| 31 | 31 | site/ |
| 32 | 32 | repos/ |
| 33 | +.env.deploy | |
| 34 | +deploy.sh | |
| 33 | 35 | |
| 34 | 36 | ADDED deploy.sh |
| 35 | 37 | ADDED scripts/sync_to_fossil.sh |
| 36 | 38 | ADDED site/404.html |
| 37 | 39 | ADDED site/CNAME |
| 38 | 40 | ADDED site/architecture/overview/index.html |
| 39 | 41 | ADDED site/architecture/sync-bridge/index.html |
| 40 | 42 | ADDED site/getting-started/configuration/index.html |
| 41 | 43 | ADDED site/getting-started/first-repo/index.html |
| 42 | 44 | ADDED site/getting-started/installation/index.html |
| 43 | 45 | ADDED site/getting-started/prerequisites/index.html |
| 44 | 46 | ADDED site/index.html |
| 45 | 47 | ADDED site/overrides/partials/logo.html |
| 46 | 48 | ADDED site/search/search_index.json |
| 47 | 49 | ADDED site/sitemap.xml |
| 48 | 50 | ADDED site/sitemap.xml.gz |
| --- .gitignore | |
| +++ .gitignore | |
| @@ -28,5 +28,7 @@ | |
| 28 | /assets/ |
| 29 | fossilrepo.fossil |
| 30 | .fslckout |
| 31 | site/ |
| 32 | repos/ |
| 33 | |
| 34 | DDED deploy.sh |
| 35 | DDED scripts/sync_to_fossil.sh |
| 36 | DDED site/404.html |
| 37 | DDED site/CNAME |
| 38 | DDED site/architecture/overview/index.html |
| 39 | DDED site/architecture/sync-bridge/index.html |
| 40 | DDED site/getting-started/configuration/index.html |
| 41 | DDED site/getting-started/first-repo/index.html |
| 42 | DDED site/getting-started/installation/index.html |
| 43 | DDED site/getting-started/prerequisites/index.html |
| 44 | DDED site/index.html |
| 45 | DDED site/overrides/partials/logo.html |
| 46 | DDED site/search/search_index.json |
| 47 | DDED site/sitemap.xml |
| 48 | DDED site/sitemap.xml.gz |
| --- .gitignore | |
| +++ .gitignore | |
| @@ -28,5 +28,7 @@ | |
| 28 | /assets/ |
| 29 | fossilrepo.fossil |
| 30 | .fslckout |
| 31 | site/ |
| 32 | repos/ |
| 33 | .env.deploy |
| 34 | deploy.sh |
| 35 | |
| 36 | DDED deploy.sh |
| 37 | DDED scripts/sync_to_fossil.sh |
| 38 | DDED site/404.html |
| 39 | DDED site/CNAME |
| 40 | DDED site/architecture/overview/index.html |
| 41 | DDED site/architecture/sync-bridge/index.html |
| 42 | DDED site/getting-started/configuration/index.html |
| 43 | DDED site/getting-started/first-repo/index.html |
| 44 | DDED site/getting-started/installation/index.html |
| 45 | DDED site/getting-started/prerequisites/index.html |
| 46 | DDED site/index.html |
| 47 | DDED site/overrides/partials/logo.html |
| 48 | DDED site/search/search_index.json |
| 49 | DDED site/sitemap.xml |
| 50 | DDED site/sitemap.xml.gz |
+53
| --- a/deploy.sh | ||
| +++ b/deploy.sh | ||
| @@ -0,0 +1,53 @@ | ||
| 1 | +#!/bin/bash | |
| 2 | +statey.sh — push local chUsage: ./deploy.sh [message] + collectstatic + restart) | |
| 3 | +# | |
| 4 | +: | |
| 5 | +# FOSSIL_REMOTE_URL=https://admin:[email protected]/projects/fossilrepo/fossil/xfer | |
| 6 | +# EC2_INSTANCE_ID=i-xxxx | |
| 7 | +# S3_BUCKET=dev-fossilrepo-storaOTE_URL and EC2_INSTANCE_ID | |
| 8 | + | |
| 9 | +set -euo pipefail | |
| 10 | + | |
| 11 | +if [[ ! -f .env.deploy ]]; then | |
| 12 | + echo "Missing .env.deploy -- copy .env.deploy.example and fill in your values" | |
| 13 | + exit 1 | |
| 14 | +fi | |
| 15 | + | |
| 16 | +source .env.deploy | |
| 17 | + | |
| 18 | +MSG="${1:-Deploy $(date +%Y-%m-%d-%H%M)}" | |
| 19 | + | |
| 20 | +echo "=== Fossil commit ===" | |
| 21 | +fossil addremove 2>/dev/null || true | |
| 22 | +fossil commit --no-warnings -m "$MSG" 2>&1 || echo "Nothing to commit" | |
| 23 | + | |
| 24 | +echo "=== Fossil push ===" | |
| 25 | +fossil push "$FOSSIL_REMOTE_URL" | |
| 26 | + | |
| 27 | +echo "=== Deploy to server ===" | |
| 28 | +AWS_PROFILE=fossiladmin aws ssm send-command \ | |
| 29 | + --instance-ids "$EC2_INSTANCE_ID" \ | |
| 30 | + --document-name "AWS-RunShellScript" \ | |
| 31 | + --timeout-seconds 120 \ | |
| 32 | + --parameters '{"commands":["export HOME=/root && fossilrepo-deploy 2>&1"]}' \ | |
| 33 | + --region "${AWS_REGION:-us-west-2}" \ | |
| 34 | + --query "Command.CommandId" \ | |
| 35 | + --output text | |
| 36 | + | |
| 37 | +echo "=== Deployed ===" | |
| 38 | +ssil commit --no-warnings -m "$MSG" 2>&1 || echo "Nothing to commit" | |
| 39 | + | |
| 40 | +echo "=== Fossil Sync repos to S3 | |
| 41 | +echo "=== Deploy to server ===" | |
| 42 | +AW3 sync repos/ "s3://${S3_BUCKET}/sync/repos/" --region "$AWS_REGION" --exclude "*.fossil-shm" --exclude "*.fossil-wal" 2>&1 | tail -3 | |
| 43 | + | |
| 44 | +echo "=== Sync DB to S3 ===" | |
| 45 | +docker compose exec -T postgres pg_dump -U dbadmin --data-only --inserts --no-owner --no-privileges fossilrepo > /tmp/fossilrepo-data.sql | |
| 46 | +AWS_PROFILE=fossiladmin aws s3 cp /tmp/fossilrepo-data.sql "s3://${S3_BUCKET}/sync/data.sql" --region "$AWS_REGION" 2>&1 | tail -1 | |
| 47 | + | |
| 48 | +echo "=== Push code to git ===" | |
| 49 | +git add -A && git commit -m "$MSG" 2>/dev/null || true | |
| 50 | +git push origin main 2>&1 || echo "Git push failed (non-critical)" | |
| 51 | + | |
| 52 | +echo "=== Deploy to EC2 | |
| 53 | +echo "=== |
| --- a/deploy.sh | |
| +++ b/deploy.sh | |
| @@ -0,0 +1,53 @@ | |
| --- a/deploy.sh | |
| +++ b/deploy.sh | |
| @@ -0,0 +1,53 @@ | |
| 1 | #!/bin/bash |
| 2 | statey.sh — push local chUsage: ./deploy.sh [message] + collectstatic + restart) |
| 3 | # |
| 4 | : |
| 5 | # FOSSIL_REMOTE_URL=https://admin:[email protected]/projects/fossilrepo/fossil/xfer |
| 6 | # EC2_INSTANCE_ID=i-xxxx |
| 7 | # S3_BUCKET=dev-fossilrepo-storaOTE_URL and EC2_INSTANCE_ID |
| 8 | |
| 9 | set -euo pipefail |
| 10 | |
| 11 | if [[ ! -f .env.deploy ]]; then |
| 12 | echo "Missing .env.deploy -- copy .env.deploy.example and fill in your values" |
| 13 | exit 1 |
| 14 | fi |
| 15 | |
| 16 | source .env.deploy |
| 17 | |
| 18 | MSG="${1:-Deploy $(date +%Y-%m-%d-%H%M)}" |
| 19 | |
| 20 | echo "=== Fossil commit ===" |
| 21 | fossil addremove 2>/dev/null || true |
| 22 | fossil commit --no-warnings -m "$MSG" 2>&1 || echo "Nothing to commit" |
| 23 | |
| 24 | echo "=== Fossil push ===" |
| 25 | fossil push "$FOSSIL_REMOTE_URL" |
| 26 | |
| 27 | echo "=== Deploy to server ===" |
| 28 | AWS_PROFILE=fossiladmin aws ssm send-command \ |
| 29 | --instance-ids "$EC2_INSTANCE_ID" \ |
| 30 | --document-name "AWS-RunShellScript" \ |
| 31 | --timeout-seconds 120 \ |
| 32 | --parameters '{"commands":["export HOME=/root && fossilrepo-deploy 2>&1"]}' \ |
| 33 | --region "${AWS_REGION:-us-west-2}" \ |
| 34 | --query "Command.CommandId" \ |
| 35 | --output text |
| 36 | |
| 37 | echo "=== Deployed ===" |
| 38 | ssil commit --no-warnings -m "$MSG" 2>&1 || echo "Nothing to commit" |
| 39 | |
| 40 | echo "=== Fossil Sync repos to S3 |
| 41 | echo "=== Deploy to server ===" |
| 42 | AW3 sync repos/ "s3://${S3_BUCKET}/sync/repos/" --region "$AWS_REGION" --exclude "*.fossil-shm" --exclude "*.fossil-wal" 2>&1 | tail -3 |
| 43 | |
| 44 | echo "=== Sync DB to S3 ===" |
| 45 | docker compose exec -T postgres pg_dump -U dbadmin --data-only --inserts --no-owner --no-privileges fossilrepo > /tmp/fossilrepo-data.sql |
| 46 | AWS_PROFILE=fossiladmin aws s3 cp /tmp/fossilrepo-data.sql "s3://${S3_BUCKET}/sync/data.sql" --region "$AWS_REGION" 2>&1 | tail -1 |
| 47 | |
| 48 | echo "=== Push code to git ===" |
| 49 | git add -A && git commit -m "$MSG" 2>/dev/null || true |
| 50 | git push origin main 2>&1 || echo "Git push failed (non-critical)" |
| 51 | |
| 52 | echo "=== Deploy to EC2 |
| 53 | echo "=== |
| --- a/scripts/sync_to_fossil.sh | ||
| +++ b/scripts/sync_to_fossil.sh | ||
| @@ -0,0 +1,73 @@ | ||
| 1 | +#!/bin/bash | |
| 2 | +# sync_to_fossil.sh — Commit current code into the existing .fossil repo. | |
| 3 | +# | |
| 4 | +# Opens a temporary checkout, rsyncs the working tree in, commits changes. | |
| 5 | +# NEVER replaces or reimports the .fossil file — preserves all tickets, | |
| 6 | +# wiki, forum, and other Fossil-native artifacts. | |
| 7 | +# | |
| 8 | +# Usage: ./scripts/sync_to_fossil.sh ["commit message"] | |
| 9 | +# Run from inside the container or via: | |
| 10 | +# docker compose exec backend bash scripts/sync_to_fossil.sh "message" | |
| 11 | + | |
| 12 | +set -euo pipefail | |
| 13 | + | |
| 14 | +REPO="/data/repos/fossilrepo.fossil" | |
| 15 | +WORKDIR="/tmp/fossil-checkout-$$" | |
| 16 | +MESSAGE="${1:-Sync from working tree}" | |
| 17 | + | |
| 18 | +export USER="${USER:-ragelink}" | |
| 19 | + | |
| 20 | +if [ ! -f "$REPO" ]; then | |
| 21 | + echo "Error: $REPO not found" >&2 | |
| 22 | + exit 1 | |
| 23 | +fi | |
| 24 | + | |
| 25 | +echo "=== Committing to Fossil ===" | |
| 26 | + | |
| 27 | +# Create temp checkout | |
| 28 | +rm -rf "$WORKDIR" | |
| 29 | +mkdir -p "$WORKDIR" | |
| 30 | +cd "$WORKDIR" | |
| 31 | + | |
| 32 | +fossil open "$REPO" --workdir "$WORKDIR" 2>/dev/null | |
| 33 | +fossil update trunk 2>/dev/null || true | |
| 34 | + | |
| 35 | +# Sync code from /app — use tar to copy with exclusions (rsync not available) | |
| 36 | +cd /app | |
| 37 | +tar cf - \ | |
| 38 | + --exclude='.git' \ | |
| 39 | + --exclude='__pycache__' \ | |
| 40 | + --exclude='*.pyc' \ | |
| 41 | + --exclude='.ruff_cache' \ | |
| 42 | + --exclude='node_modules' \ | |
| 43 | + --exclude='assets' \ | |
| 44 | + --exclude='.env' \ | |
| 45 | + --exclude='repos' \ | |
| 46 | + --exclude='.fslckout' \ | |
| 47 | + --exclude='_FOSSIL_' \ | |
| 48 | + --exclude='*.fossil' \ | |
| 49 | + --exclude='.claude' \ | |
| 50 | + . | (cd "$WORKDIR" && tar xf -) | |
| 51 | +cd "$WORKDIR" | |
| 52 | + | |
| 53 | +# Register new/deleted files | |
| 54 | +fossil addremove 2>/dev/null || true | |
| 55 | + | |
| 56 | +# Commit if there are changes | |
| 57 | +CHANGES=$(fossil changes 2>/dev/null | wc -l | tr -d ' ') | |
| 58 | +if [ "$CHANGES" -gt 0 ]; then | |
| 59 | + fossil commit -m "$MESSAGE" --no-warnings 2>&1 | tail -3 | |
| 60 | + echo "Committed $CHANGES changed files." | |
| 61 | +else | |
| 62 | + echo "No changes to commit." | |
| 63 | +fi | |
| 64 | + | |
| 65 | +# Cleanup | |
| 66 | +fossil close --force 2>/dev/null || true | |
| 67 | +cd / | |
| 68 | +rm -rf "$WORKDIR" | |
| 69 | + | |
| 70 | +echo "=== Status ===" | |
| 71 | +echo "Checkins: $(fossil sql -R "$REPO" "SELECT count(*) FROM event WHERE type='ci';" | tr -d "' ")" | |
| 72 | +echo "Wiki: $(fossil wiki list -R "$REPO" | wc -l) pages" | |
| 73 | +echo "Tickets: $(fossil sql -R "$REPO" "SELECT count(*) FROM ticket;" | tr -d "' ")" |
| --- a/scripts/sync_to_fossil.sh | |
| +++ b/scripts/sync_to_fossil.sh | |
| @@ -0,0 +1,73 @@ | |
| --- a/scripts/sync_to_fossil.sh | |
| +++ b/scripts/sync_to_fossil.sh | |
| @@ -0,0 +1,73 @@ | |
| 1 | #!/bin/bash |
| 2 | # sync_to_fossil.sh — Commit current code into the existing .fossil repo. |
| 3 | # |
| 4 | # Opens a temporary checkout, rsyncs the working tree in, commits changes. |
| 5 | # NEVER replaces or reimports the .fossil file — preserves all tickets, |
| 6 | # wiki, forum, and other Fossil-native artifacts. |
| 7 | # |
| 8 | # Usage: ./scripts/sync_to_fossil.sh ["commit message"] |
| 9 | # Run from inside the container or via: |
| 10 | # docker compose exec backend bash scripts/sync_to_fossil.sh "message" |
| 11 | |
| 12 | set -euo pipefail |
| 13 | |
| 14 | REPO="/data/repos/fossilrepo.fossil" |
| 15 | WORKDIR="/tmp/fossil-checkout-$$" |
| 16 | MESSAGE="${1:-Sync from working tree}" |
| 17 | |
| 18 | export USER="${USER:-ragelink}" |
| 19 | |
| 20 | if [ ! -f "$REPO" ]; then |
| 21 | echo "Error: $REPO not found" >&2 |
| 22 | exit 1 |
| 23 | fi |
| 24 | |
| 25 | echo "=== Committing to Fossil ===" |
| 26 | |
| 27 | # Create temp checkout |
| 28 | rm -rf "$WORKDIR" |
| 29 | mkdir -p "$WORKDIR" |
| 30 | cd "$WORKDIR" |
| 31 | |
| 32 | fossil open "$REPO" --workdir "$WORKDIR" 2>/dev/null |
| 33 | fossil update trunk 2>/dev/null || true |
| 34 | |
| 35 | # Sync code from /app — use tar to copy with exclusions (rsync not available) |
| 36 | cd /app |
| 37 | tar cf - \ |
| 38 | --exclude='.git' \ |
| 39 | --exclude='__pycache__' \ |
| 40 | --exclude='*.pyc' \ |
| 41 | --exclude='.ruff_cache' \ |
| 42 | --exclude='node_modules' \ |
| 43 | --exclude='assets' \ |
| 44 | --exclude='.env' \ |
| 45 | --exclude='repos' \ |
| 46 | --exclude='.fslckout' \ |
| 47 | --exclude='_FOSSIL_' \ |
| 48 | --exclude='*.fossil' \ |
| 49 | --exclude='.claude' \ |
| 50 | . | (cd "$WORKDIR" && tar xf -) |
| 51 | cd "$WORKDIR" |
| 52 | |
| 53 | # Register new/deleted files |
| 54 | fossil addremove 2>/dev/null || true |
| 55 | |
| 56 | # Commit if there are changes |
| 57 | CHANGES=$(fossil changes 2>/dev/null | wc -l | tr -d ' ') |
| 58 | if [ "$CHANGES" -gt 0 ]; then |
| 59 | fossil commit -m "$MESSAGE" --no-warnings 2>&1 | tail -3 |
| 60 | echo "Committed $CHANGES changed files." |
| 61 | else |
| 62 | echo "No changes to commit." |
| 63 | fi |
| 64 | |
| 65 | # Cleanup |
| 66 | fossil close --force 2>/dev/null || true |
| 67 | cd / |
| 68 | rm -rf "$WORKDIR" |
| 69 | |
| 70 | echo "=== Status ===" |
| 71 | echo "Checkins: $(fossil sql -R "$REPO" "SELECT count(*) FROM event WHERE type='ci';" | tr -d "' ")" |
| 72 | echo "Wiki: $(fossil wiki list -R "$REPO" | wc -l) pages" |
| 73 | echo "Tickets: $(fossil sql -R "$REPO" "SELECT count(*) FROM ticket;" | tr -d "' ")" |
+738
| --- a/site/404.html | ||
| +++ b/site/404.html | ||
| @@ -0,0 +1,738 @@ | ||
| 1 | + | |
| 2 | +<!doctype html> | |
| 3 | +<html lang="en" class="no-js"> | |
| 4 | + <head> | |
| 5 | + | |
| 6 | + <meta charset="utf-8"> | |
| 7 | + <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| 8 | + | |
| 9 | + <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting"> | |
| 10 | + | |
| 11 | + | |
| 12 | + <meta name="author" content="CONFLICT LLC"> | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + <link rel="icon" href="/assets/images/favicon.png"> | |
| 22 | + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6"> | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + <title>Fossilrepo</title> | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + <link rel="stylesheet" href="/assets/stylesheets/main.484c7ddc.min.css"> | |
| 31 | + | |
| 32 | + | |
| 33 | + <link rel="stylesheet" href="/assets/stylesheets/palette.ab4e12ef.min.css"> | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | |
| 47 | + <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> | |
| 48 | + <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + <link rel="stylesheet" href="/assets/css/custom.css"> | |
| 53 | + | |
| 54 | + <script>__md_scope=new URL("/",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + </head> | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"> | |
| 71 | + | |
| 72 | + | |
| 73 | + <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> | |
| 74 | + <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> | |
| 75 | + <label class="md-overlay" for="__drawer"></label> | |
| 76 | + <div data-md-component="skip"> | |
| 77 | + | |
| 78 | + </div> | |
| 79 | + <div data-md-component="announce"> | |
| 80 | + | |
| 81 | + </div> | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | +<header class="md-header" data-md-component="header"> | |
| 87 | + <nav class="md-header__inner md-grid" aria-label="Header"> | |
| 88 | + <a href="/." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> | |
| 89 | + <div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 90 | + <img src="/assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 91 | + <img src="/assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 92 | +</div> | |
| 93 | + </a> | |
| 94 | + <label class="md-header__button md-icon" for="__drawer"> | |
| 95 | + | |
| 96 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> | |
| 97 | + </label> | |
| 98 | + <div class="md-header__title" data-md-component="header-title"> | |
| 99 | + <div class="md-header__ellipsis"> | |
| 100 | + <div class="md-header__topic"> | |
| 101 | + <span class="md-ellipsis"> | |
| 102 | + Fossilrepo | |
| 103 | + </span> | |
| 104 | + </div> | |
| 105 | + <div class="md-header__topic" data-md-component="header-topic"> | |
| 106 | + <span class="md-ellipsis"> | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + </span> | |
| 111 | + </div> | |
| 112 | + </div> | |
| 113 | + </div> | |
| 114 | + | |
| 115 | + | |
| 116 | + <form class="md-header__option" data-md-component="palette"> | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> | |
| 122 | + | |
| 123 | + <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> | |
| 124 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> | |
| 125 | + </label> | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> | |
| 132 | + | |
| 133 | + <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> | |
| 134 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> | |
| 135 | + </label> | |
| 136 | + | |
| 137 | + | |
| 138 | +</form> | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + <label class="md-header__button md-icon" for="__search"> | |
| 149 | + | |
| 150 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> | |
| 151 | + </label> | |
| 152 | + <div class="md-search" data-md-component="search" role="dialog"> | |
| 153 | + <label class="md-search__overlay" for="__search"></label> | |
| 154 | + <div class="md-search__inner" role="search"> | |
| 155 | + <form class="md-search__form" name="search"> | |
| 156 | + <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> | |
| 157 | + <label class="md-search__icon md-icon" for="__search"> | |
| 158 | + | |
| 159 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> | |
| 160 | + | |
| 161 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> | |
| 162 | + </label> | |
| 163 | + <nav class="md-search__options" aria-label="Search"> | |
| 164 | + | |
| 165 | + <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> | |
| 166 | + | |
| 167 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> | |
| 168 | + </button> | |
| 169 | + </nav> | |
| 170 | + | |
| 171 | + <div class="md-search__suggest" data-md-component="search-suggest"></div> | |
| 172 | + | |
| 173 | + </form> | |
| 174 | + <div class="md-search__output"> | |
| 175 | + <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> | |
| 176 | + <div class="md-search-result" data-md-component="search-result"> | |
| 177 | + <div class="md-search-result__meta"> | |
| 178 | + Initializing search | |
| 179 | + </div> | |
| 180 | + <ol class="md-search-result__list" role="presentation"></ol> | |
| 181 | + </div> | |
| 182 | + </div> | |
| 183 | + </div> | |
| 184 | + </div> | |
| 185 | +</div> | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + <div class="md-header__source"> | |
| 190 | + <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> | |
| 191 | + <div class="md-source__icon md-icon"> | |
| 192 | + | |
| 193 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 194 | + </div> | |
| 195 | + <div class="md-source__repository"> | |
| 196 | + ConflictHQ/fossilrepo | |
| 197 | + </div> | |
| 198 | +</a> | |
| 199 | + </div> | |
| 200 | + | |
| 201 | + </nav> | |
| 202 | + | |
| 203 | +</header> | |
| 204 | + | |
| 205 | + <div class="md-container" data-md-component="container"> | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | +<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> | |
| 212 | + <div class="md-grid"> | |
| 213 | + <ul class="md-tabs__list"> | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + <li class="md-tabs__item"> | |
| 221 | + <a href="/." class="md-tabs__link"> | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + Home | |
| 228 | + | |
| 229 | + </a> | |
| 230 | + </li> | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + <li class="md-tabs__item"> | |
| 242 | + <a href="/getting-started/prerequisites/" class="md-tabs__link"> | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + Getting Started | |
| 247 | + | |
| 248 | + </a> | |
| 249 | + </li> | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + <li class="md-tabs__item"> | |
| 262 | + <a href="/architecture/overview/" class="md-tabs__link"> | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + Architecture | |
| 267 | + | |
| 268 | + </a> | |
| 269 | + </li> | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + </ul> | |
| 275 | + </div> | |
| 276 | +</nav> | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + <main class="md-main" data-md-component="main"> | |
| 281 | + <div class="md-main__inner md-grid"> | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > | |
| 286 | + <div class="md-sidebar__scrollwrap"> | |
| 287 | + <div class="md-sidebar__inner"> | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | +<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> | |
| 295 | + <label class="md-nav__title" for="__drawer"> | |
| 296 | + <a href="/." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> | |
| 297 | + <div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 298 | + <img src="/assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 299 | + <img src="/assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 300 | +</div> | |
| 301 | + </a> | |
| 302 | + Fossilrepo | |
| 303 | + </label> | |
| 304 | + | |
| 305 | + <div class="md-nav__source"> | |
| 306 | + <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> | |
| 307 | + <div class="md-source__icon md-icon"> | |
| 308 | + | |
| 309 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 310 | + </div> | |
| 311 | + <div class="md-source__repository"> | |
| 312 | + ConflictHQ/fossilrepo | |
| 313 | + </div> | |
| 314 | +</a> | |
| 315 | + </div> | |
| 316 | + | |
| 317 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + <li class="md-nav__item"> | |
| 326 | + <a href="/." class="md-nav__link"> | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + <span class="md-ellipsis"> | |
| 331 | + | |
| 332 | + | |
| 333 | + Home | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + </span> | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + </a> | |
| 342 | + </li> | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + <li class="md-nav__item md-nav__item--nested"> | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" > | |
| 369 | + | |
| 370 | + | |
| 371 | + <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0"> | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + <span class="md-ellipsis"> | |
| 376 | + | |
| 377 | + | |
| 378 | + Getting Started | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + </span> | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + <span class="md-nav__icon md-icon"></span> | |
| 387 | + </label> | |
| 388 | + | |
| 389 | + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false"> | |
| 390 | + <label class="md-nav__title" for="__nav_2"> | |
| 391 | + <span class="md-nav__icon md-icon"></span> | |
| 392 | + | |
| 393 | + | |
| 394 | + Getting Started | |
| 395 | + | |
| 396 | + | |
| 397 | + </label> | |
| 398 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + <li class="md-nav__item"> | |
| 407 | + <a href="/getting-started/prerequisites/" class="md-nav__link"> | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + <span class="md-ellipsis"> | |
| 412 | + | |
| 413 | + | |
| 414 | + Prerequisites | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + </span> | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + </a> | |
| 423 | + </li> | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + <li class="md-nav__item"> | |
| 435 | + <a href="/getting-started/installation/" class="md-nav__link"> | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + <span class="md-ellipsis"> | |
| 440 | + | |
| 441 | + | |
| 442 | + Installation | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + </span> | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + </a> | |
| 451 | + </li> | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + <li class="md-nav__item"> | |
| 463 | + <a href="/getting-started/configuration/" class="md-nav__link"> | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + <span class="md-ellipsis"> | |
| 468 | + | |
| 469 | + | |
| 470 | + Configuration | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + </span> | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + </a> | |
| 479 | + </li> | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + <li class="md-nav__item"> | |
| 491 | + <a href="/getting-started/first-repo/" class="md-nav__link"> | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + <span class="md-ellipsis"> | |
| 496 | + | |
| 497 | + | |
| 498 | + First Repository | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + </span> | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + </a> | |
| 507 | + </li> | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + </ul> | |
| 513 | + </nav> | |
| 514 | + | |
| 515 | + </li> | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + <li class="md-nav__item md-nav__item--nested"> | |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" > | |
| 542 | + | |
| 543 | + | |
| 544 | + <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + <span class="md-ellipsis"> | |
| 549 | + | |
| 550 | + | |
| 551 | + Architecture | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + </span> | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + <span class="md-nav__icon md-icon"></span> | |
| 560 | + </label> | |
| 561 | + | |
| 562 | + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> | |
| 563 | + <label class="md-nav__title" for="__nav_3"> | |
| 564 | + <span class="md-nav__icon md-icon"></span> | |
| 565 | + | |
| 566 | + | |
| 567 | + Architecture | |
| 568 | + | |
| 569 | + | |
| 570 | + </label> | |
| 571 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
| 578 | + | |
| 579 | + <li class="md-nav__item"> | |
| 580 | + <a href="/architecture/overview/" class="md-nav__link"> | |
| 581 | + | |
| 582 | + | |
| 583 | + | |
| 584 | + <span class="md-ellipsis"> | |
| 585 | + | |
| 586 | + | |
| 587 | + Overview | |
| 588 | + | |
| 589 | + | |
| 590 | + | |
| 591 | + </span> | |
| 592 | + | |
| 593 | + | |
| 594 | + | |
| 595 | + </a> | |
| 596 | + </li> | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + <li class="md-nav__item"> | |
| 608 | + <a href="/architecture/sync-bridge/" class="md-nav__link"> | |
| 609 | + | |
| 610 | + | |
| 611 | + | |
| 612 | + <span class="md-ellipsis"> | |
| 613 | + | |
| 614 | + | |
| 615 | + Sync Bridge | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + </span> | |
| 620 | + | |
| 621 | + | |
| 622 | + | |
| 623 | + </a> | |
| 624 | + </li> | |
| 625 | + | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + </ul> | |
| 630 | + </nav> | |
| 631 | + | |
| 632 | + </li> | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + </ul> | |
| 637 | +</nav> | |
| 638 | + </div> | |
| 639 | + </div> | |
| 640 | + </div> | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
| 644 | + <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > | |
| 645 | + <div class="md-sidebar__scrollwrap"> | |
| 646 | + <div class="md-sidebar__inner"> | |
| 647 | + | |
| 648 | + | |
| 649 | +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | +</nav> | |
| 655 | + </div> | |
| 656 | + </div> | |
| 657 | + </div> | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + <div class="md-content" data-md-component="content"> | |
| 662 | + | |
| 663 | + <article class="md-content__inner md-typeset"> | |
| 664 | + | |
| 665 | + <h1>404 - Not found</h1> | |
| 666 | + | |
| 667 | + </article> | |
| 668 | + </div> | |
| 669 | + | |
| 670 | + | |
| 671 | + <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> | |
| 672 | + | |
| 673 | +<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> | |
| 674 | + </div> | |
| 675 | + | |
| 676 | + <button type="button" class="md-top md-icon" data-md-component="top" hidden> | |
| 677 | + | |
| 678 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> | |
| 679 | + Back to top | |
| 680 | +</button> | |
| 681 | + | |
| 682 | + </main> | |
| 683 | + | |
| 684 | + <footer class="md-footer"> | |
| 685 | + | |
| 686 | + <div class="md-footer-meta md-typeset"> | |
| 687 | + <div class="md-footer-meta__inner md-grid"> | |
| 688 | + <div class="md-copyright"> | |
| 689 | + | |
| 690 | + <div class="md-copyright__highlight"> | |
| 691 | + Copyright © 2026 CONFLICT LLC | |
| 692 | + </div> | |
| 693 | + | |
| 694 | + | |
| 695 | + Made with | |
| 696 | + <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> | |
| 697 | + Material for MkDocs | |
| 698 | + </a> | |
| 699 | + | |
| 700 | +</div> | |
| 701 | + | |
| 702 | + | |
| 703 | +<div class="md-social"> | |
| 704 | + | |
| 705 | + | |
| 706 | + | |
| 707 | + | |
| 708 | + | |
| 709 | + | |
| 710 | + | |
| 711 | + | |
| 712 | + <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link"> | |
| 713 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 714 | + </a> | |
| 715 | + | |
| 716 | +</div> | |
| 717 | + | |
| 718 | + </div> | |
| 719 | + </div> | |
| 720 | +</footer> | |
| 721 | + | |
| 722 | + </div> | |
| 723 | + <div class="md-dialog" data-md-component="dialog"> | |
| 724 | + <div class="md-dialog__inner md-typeset"></div> | |
| 725 | + </div> | |
| 726 | + | |
| 727 | + | |
| 728 | + | |
| 729 | + | |
| 730 | + | |
| 731 | + <script id="__config" type="application/json">{"annotate": null, "base": "/", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "/assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> | |
| 732 | + | |
| 733 | + | |
| 734 | + <script src="/assets/javascripts/bundle.79ae519e.min.js"></script> | |
| 735 | + | |
| 736 | + | |
| 737 | + </body> | |
| 738 | +</html> |
| --- a/site/404.html | |
| +++ b/site/404.html | |
| @@ -0,0 +1,738 @@ | |
| --- a/site/404.html | |
| +++ b/site/404.html | |
| @@ -0,0 +1,738 @@ | |
| 1 | |
| 2 | <!doctype html> |
| 3 | <html lang="en" class="no-js"> |
| 4 | <head> |
| 5 | |
| 6 | <meta charset="utf-8"> |
| 7 | <meta name="viewport" content="width=device-width,initial-scale=1"> |
| 8 | |
| 9 | <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting"> |
| 10 | |
| 11 | |
| 12 | <meta name="author" content="CONFLICT LLC"> |
| 13 | |
| 14 | |
| 15 | |
| 16 | |
| 17 | |
| 18 | |
| 19 | |
| 20 | |
| 21 | <link rel="icon" href="/assets/images/favicon.png"> |
| 22 | <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6"> |
| 23 | |
| 24 | |
| 25 | |
| 26 | <title>Fossilrepo</title> |
| 27 | |
| 28 | |
| 29 | |
| 30 | <link rel="stylesheet" href="/assets/stylesheets/main.484c7ddc.min.css"> |
| 31 | |
| 32 | |
| 33 | <link rel="stylesheet" href="/assets/stylesheets/palette.ab4e12ef.min.css"> |
| 34 | |
| 35 | |
| 36 | |
| 37 | |
| 38 | |
| 39 | |
| 40 | |
| 41 | |
| 42 | |
| 43 | |
| 44 | |
| 45 | |
| 46 | <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
| 47 | <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> |
| 48 | <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> |
| 49 | |
| 50 | |
| 51 | |
| 52 | <link rel="stylesheet" href="/assets/css/custom.css"> |
| 53 | |
| 54 | <script>__md_scope=new URL("/",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> |
| 55 | |
| 56 | |
| 57 | |
| 58 | |
| 59 | |
| 60 | </head> |
| 61 | |
| 62 | |
| 63 | |
| 64 | |
| 65 | |
| 66 | |
| 67 | |
| 68 | |
| 69 | |
| 70 | <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"> |
| 71 | |
| 72 | |
| 73 | <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> |
| 74 | <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> |
| 75 | <label class="md-overlay" for="__drawer"></label> |
| 76 | <div data-md-component="skip"> |
| 77 | |
| 78 | </div> |
| 79 | <div data-md-component="announce"> |
| 80 | |
| 81 | </div> |
| 82 | |
| 83 | |
| 84 | |
| 85 | |
| 86 | <header class="md-header" data-md-component="header"> |
| 87 | <nav class="md-header__inner md-grid" aria-label="Header"> |
| 88 | <a href="/." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> |
| 89 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 90 | <img src="/assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 91 | <img src="/assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 92 | </div> |
| 93 | </a> |
| 94 | <label class="md-header__button md-icon" for="__drawer"> |
| 95 | |
| 96 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> |
| 97 | </label> |
| 98 | <div class="md-header__title" data-md-component="header-title"> |
| 99 | <div class="md-header__ellipsis"> |
| 100 | <div class="md-header__topic"> |
| 101 | <span class="md-ellipsis"> |
| 102 | Fossilrepo |
| 103 | </span> |
| 104 | </div> |
| 105 | <div class="md-header__topic" data-md-component="header-topic"> |
| 106 | <span class="md-ellipsis"> |
| 107 | |
| 108 | |
| 109 | |
| 110 | </span> |
| 111 | </div> |
| 112 | </div> |
| 113 | </div> |
| 114 | |
| 115 | |
| 116 | <form class="md-header__option" data-md-component="palette"> |
| 117 | |
| 118 | |
| 119 | |
| 120 | |
| 121 | <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> |
| 122 | |
| 123 | <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> |
| 124 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> |
| 125 | </label> |
| 126 | |
| 127 | |
| 128 | |
| 129 | |
| 130 | |
| 131 | <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> |
| 132 | |
| 133 | <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> |
| 134 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> |
| 135 | </label> |
| 136 | |
| 137 | |
| 138 | </form> |
| 139 | |
| 140 | |
| 141 | |
| 142 | <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> |
| 143 | |
| 144 | |
| 145 | |
| 146 | |
| 147 | |
| 148 | <label class="md-header__button md-icon" for="__search"> |
| 149 | |
| 150 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> |
| 151 | </label> |
| 152 | <div class="md-search" data-md-component="search" role="dialog"> |
| 153 | <label class="md-search__overlay" for="__search"></label> |
| 154 | <div class="md-search__inner" role="search"> |
| 155 | <form class="md-search__form" name="search"> |
| 156 | <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> |
| 157 | <label class="md-search__icon md-icon" for="__search"> |
| 158 | |
| 159 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> |
| 160 | |
| 161 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> |
| 162 | </label> |
| 163 | <nav class="md-search__options" aria-label="Search"> |
| 164 | |
| 165 | <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> |
| 166 | |
| 167 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> |
| 168 | </button> |
| 169 | </nav> |
| 170 | |
| 171 | <div class="md-search__suggest" data-md-component="search-suggest"></div> |
| 172 | |
| 173 | </form> |
| 174 | <div class="md-search__output"> |
| 175 | <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> |
| 176 | <div class="md-search-result" data-md-component="search-result"> |
| 177 | <div class="md-search-result__meta"> |
| 178 | Initializing search |
| 179 | </div> |
| 180 | <ol class="md-search-result__list" role="presentation"></ol> |
| 181 | </div> |
| 182 | </div> |
| 183 | </div> |
| 184 | </div> |
| 185 | </div> |
| 186 | |
| 187 | |
| 188 | |
| 189 | <div class="md-header__source"> |
| 190 | <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> |
| 191 | <div class="md-source__icon md-icon"> |
| 192 | |
| 193 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 194 | </div> |
| 195 | <div class="md-source__repository"> |
| 196 | ConflictHQ/fossilrepo |
| 197 | </div> |
| 198 | </a> |
| 199 | </div> |
| 200 | |
| 201 | </nav> |
| 202 | |
| 203 | </header> |
| 204 | |
| 205 | <div class="md-container" data-md-component="container"> |
| 206 | |
| 207 | |
| 208 | |
| 209 | |
| 210 | |
| 211 | <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> |
| 212 | <div class="md-grid"> |
| 213 | <ul class="md-tabs__list"> |
| 214 | |
| 215 | |
| 216 | |
| 217 | |
| 218 | |
| 219 | |
| 220 | <li class="md-tabs__item"> |
| 221 | <a href="/." class="md-tabs__link"> |
| 222 | |
| 223 | |
| 224 | |
| 225 | |
| 226 | |
| 227 | Home |
| 228 | |
| 229 | </a> |
| 230 | </li> |
| 231 | |
| 232 | |
| 233 | |
| 234 | |
| 235 | |
| 236 | |
| 237 | |
| 238 | |
| 239 | |
| 240 | |
| 241 | <li class="md-tabs__item"> |
| 242 | <a href="/getting-started/prerequisites/" class="md-tabs__link"> |
| 243 | |
| 244 | |
| 245 | |
| 246 | Getting Started |
| 247 | |
| 248 | </a> |
| 249 | </li> |
| 250 | |
| 251 | |
| 252 | |
| 253 | |
| 254 | |
| 255 | |
| 256 | |
| 257 | |
| 258 | |
| 259 | |
| 260 | |
| 261 | <li class="md-tabs__item"> |
| 262 | <a href="/architecture/overview/" class="md-tabs__link"> |
| 263 | |
| 264 | |
| 265 | |
| 266 | Architecture |
| 267 | |
| 268 | </a> |
| 269 | </li> |
| 270 | |
| 271 | |
| 272 | |
| 273 | |
| 274 | </ul> |
| 275 | </div> |
| 276 | </nav> |
| 277 | |
| 278 | |
| 279 | |
| 280 | <main class="md-main" data-md-component="main"> |
| 281 | <div class="md-main__inner md-grid"> |
| 282 | |
| 283 | |
| 284 | |
| 285 | <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > |
| 286 | <div class="md-sidebar__scrollwrap"> |
| 287 | <div class="md-sidebar__inner"> |
| 288 | |
| 289 | |
| 290 | |
| 291 | |
| 292 | |
| 293 | |
| 294 | <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> |
| 295 | <label class="md-nav__title" for="__drawer"> |
| 296 | <a href="/." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> |
| 297 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 298 | <img src="/assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 299 | <img src="/assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 300 | </div> |
| 301 | </a> |
| 302 | Fossilrepo |
| 303 | </label> |
| 304 | |
| 305 | <div class="md-nav__source"> |
| 306 | <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> |
| 307 | <div class="md-source__icon md-icon"> |
| 308 | |
| 309 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 310 | </div> |
| 311 | <div class="md-source__repository"> |
| 312 | ConflictHQ/fossilrepo |
| 313 | </div> |
| 314 | </a> |
| 315 | </div> |
| 316 | |
| 317 | <ul class="md-nav__list" data-md-scrollfix> |
| 318 | |
| 319 | |
| 320 | |
| 321 | |
| 322 | |
| 323 | |
| 324 | |
| 325 | <li class="md-nav__item"> |
| 326 | <a href="/." class="md-nav__link"> |
| 327 | |
| 328 | |
| 329 | |
| 330 | <span class="md-ellipsis"> |
| 331 | |
| 332 | |
| 333 | Home |
| 334 | |
| 335 | |
| 336 | |
| 337 | </span> |
| 338 | |
| 339 | |
| 340 | |
| 341 | </a> |
| 342 | </li> |
| 343 | |
| 344 | |
| 345 | |
| 346 | |
| 347 | |
| 348 | |
| 349 | |
| 350 | |
| 351 | |
| 352 | |
| 353 | |
| 354 | |
| 355 | |
| 356 | |
| 357 | |
| 358 | |
| 359 | |
| 360 | |
| 361 | |
| 362 | <li class="md-nav__item md-nav__item--nested"> |
| 363 | |
| 364 | |
| 365 | |
| 366 | |
| 367 | |
| 368 | <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" > |
| 369 | |
| 370 | |
| 371 | <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0"> |
| 372 | |
| 373 | |
| 374 | |
| 375 | <span class="md-ellipsis"> |
| 376 | |
| 377 | |
| 378 | Getting Started |
| 379 | |
| 380 | |
| 381 | |
| 382 | </span> |
| 383 | |
| 384 | |
| 385 | |
| 386 | <span class="md-nav__icon md-icon"></span> |
| 387 | </label> |
| 388 | |
| 389 | <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false"> |
| 390 | <label class="md-nav__title" for="__nav_2"> |
| 391 | <span class="md-nav__icon md-icon"></span> |
| 392 | |
| 393 | |
| 394 | Getting Started |
| 395 | |
| 396 | |
| 397 | </label> |
| 398 | <ul class="md-nav__list" data-md-scrollfix> |
| 399 | |
| 400 | |
| 401 | |
| 402 | |
| 403 | |
| 404 | |
| 405 | |
| 406 | <li class="md-nav__item"> |
| 407 | <a href="/getting-started/prerequisites/" class="md-nav__link"> |
| 408 | |
| 409 | |
| 410 | |
| 411 | <span class="md-ellipsis"> |
| 412 | |
| 413 | |
| 414 | Prerequisites |
| 415 | |
| 416 | |
| 417 | |
| 418 | </span> |
| 419 | |
| 420 | |
| 421 | |
| 422 | </a> |
| 423 | </li> |
| 424 | |
| 425 | |
| 426 | |
| 427 | |
| 428 | |
| 429 | |
| 430 | |
| 431 | |
| 432 | |
| 433 | |
| 434 | <li class="md-nav__item"> |
| 435 | <a href="/getting-started/installation/" class="md-nav__link"> |
| 436 | |
| 437 | |
| 438 | |
| 439 | <span class="md-ellipsis"> |
| 440 | |
| 441 | |
| 442 | Installation |
| 443 | |
| 444 | |
| 445 | |
| 446 | </span> |
| 447 | |
| 448 | |
| 449 | |
| 450 | </a> |
| 451 | </li> |
| 452 | |
| 453 | |
| 454 | |
| 455 | |
| 456 | |
| 457 | |
| 458 | |
| 459 | |
| 460 | |
| 461 | |
| 462 | <li class="md-nav__item"> |
| 463 | <a href="/getting-started/configuration/" class="md-nav__link"> |
| 464 | |
| 465 | |
| 466 | |
| 467 | <span class="md-ellipsis"> |
| 468 | |
| 469 | |
| 470 | Configuration |
| 471 | |
| 472 | |
| 473 | |
| 474 | </span> |
| 475 | |
| 476 | |
| 477 | |
| 478 | </a> |
| 479 | </li> |
| 480 | |
| 481 | |
| 482 | |
| 483 | |
| 484 | |
| 485 | |
| 486 | |
| 487 | |
| 488 | |
| 489 | |
| 490 | <li class="md-nav__item"> |
| 491 | <a href="/getting-started/first-repo/" class="md-nav__link"> |
| 492 | |
| 493 | |
| 494 | |
| 495 | <span class="md-ellipsis"> |
| 496 | |
| 497 | |
| 498 | First Repository |
| 499 | |
| 500 | |
| 501 | |
| 502 | </span> |
| 503 | |
| 504 | |
| 505 | |
| 506 | </a> |
| 507 | </li> |
| 508 | |
| 509 | |
| 510 | |
| 511 | |
| 512 | </ul> |
| 513 | </nav> |
| 514 | |
| 515 | </li> |
| 516 | |
| 517 | |
| 518 | |
| 519 | |
| 520 | |
| 521 | |
| 522 | |
| 523 | |
| 524 | |
| 525 | |
| 526 | |
| 527 | |
| 528 | |
| 529 | |
| 530 | |
| 531 | |
| 532 | |
| 533 | |
| 534 | |
| 535 | <li class="md-nav__item md-nav__item--nested"> |
| 536 | |
| 537 | |
| 538 | |
| 539 | |
| 540 | |
| 541 | <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" > |
| 542 | |
| 543 | |
| 544 | <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> |
| 545 | |
| 546 | |
| 547 | |
| 548 | <span class="md-ellipsis"> |
| 549 | |
| 550 | |
| 551 | Architecture |
| 552 | |
| 553 | |
| 554 | |
| 555 | </span> |
| 556 | |
| 557 | |
| 558 | |
| 559 | <span class="md-nav__icon md-icon"></span> |
| 560 | </label> |
| 561 | |
| 562 | <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> |
| 563 | <label class="md-nav__title" for="__nav_3"> |
| 564 | <span class="md-nav__icon md-icon"></span> |
| 565 | |
| 566 | |
| 567 | Architecture |
| 568 | |
| 569 | |
| 570 | </label> |
| 571 | <ul class="md-nav__list" data-md-scrollfix> |
| 572 | |
| 573 | |
| 574 | |
| 575 | |
| 576 | |
| 577 | |
| 578 | |
| 579 | <li class="md-nav__item"> |
| 580 | <a href="/architecture/overview/" class="md-nav__link"> |
| 581 | |
| 582 | |
| 583 | |
| 584 | <span class="md-ellipsis"> |
| 585 | |
| 586 | |
| 587 | Overview |
| 588 | |
| 589 | |
| 590 | |
| 591 | </span> |
| 592 | |
| 593 | |
| 594 | |
| 595 | </a> |
| 596 | </li> |
| 597 | |
| 598 | |
| 599 | |
| 600 | |
| 601 | |
| 602 | |
| 603 | |
| 604 | |
| 605 | |
| 606 | |
| 607 | <li class="md-nav__item"> |
| 608 | <a href="/architecture/sync-bridge/" class="md-nav__link"> |
| 609 | |
| 610 | |
| 611 | |
| 612 | <span class="md-ellipsis"> |
| 613 | |
| 614 | |
| 615 | Sync Bridge |
| 616 | |
| 617 | |
| 618 | |
| 619 | </span> |
| 620 | |
| 621 | |
| 622 | |
| 623 | </a> |
| 624 | </li> |
| 625 | |
| 626 | |
| 627 | |
| 628 | |
| 629 | </ul> |
| 630 | </nav> |
| 631 | |
| 632 | </li> |
| 633 | |
| 634 | |
| 635 | |
| 636 | </ul> |
| 637 | </nav> |
| 638 | </div> |
| 639 | </div> |
| 640 | </div> |
| 641 | |
| 642 | |
| 643 | |
| 644 | <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > |
| 645 | <div class="md-sidebar__scrollwrap"> |
| 646 | <div class="md-sidebar__inner"> |
| 647 | |
| 648 | |
| 649 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> |
| 650 | |
| 651 | |
| 652 | |
| 653 | |
| 654 | </nav> |
| 655 | </div> |
| 656 | </div> |
| 657 | </div> |
| 658 | |
| 659 | |
| 660 | |
| 661 | <div class="md-content" data-md-component="content"> |
| 662 | |
| 663 | <article class="md-content__inner md-typeset"> |
| 664 | |
| 665 | <h1>404 - Not found</h1> |
| 666 | |
| 667 | </article> |
| 668 | </div> |
| 669 | |
| 670 | |
| 671 | <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> |
| 672 | |
| 673 | <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> |
| 674 | </div> |
| 675 | |
| 676 | <button type="button" class="md-top md-icon" data-md-component="top" hidden> |
| 677 | |
| 678 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> |
| 679 | Back to top |
| 680 | </button> |
| 681 | |
| 682 | </main> |
| 683 | |
| 684 | <footer class="md-footer"> |
| 685 | |
| 686 | <div class="md-footer-meta md-typeset"> |
| 687 | <div class="md-footer-meta__inner md-grid"> |
| 688 | <div class="md-copyright"> |
| 689 | |
| 690 | <div class="md-copyright__highlight"> |
| 691 | Copyright © 2026 CONFLICT LLC |
| 692 | </div> |
| 693 | |
| 694 | |
| 695 | Made with |
| 696 | <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> |
| 697 | Material for MkDocs |
| 698 | </a> |
| 699 | |
| 700 | </div> |
| 701 | |
| 702 | |
| 703 | <div class="md-social"> |
| 704 | |
| 705 | |
| 706 | |
| 707 | |
| 708 | |
| 709 | |
| 710 | |
| 711 | |
| 712 | <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link"> |
| 713 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 714 | </a> |
| 715 | |
| 716 | </div> |
| 717 | |
| 718 | </div> |
| 719 | </div> |
| 720 | </footer> |
| 721 | |
| 722 | </div> |
| 723 | <div class="md-dialog" data-md-component="dialog"> |
| 724 | <div class="md-dialog__inner md-typeset"></div> |
| 725 | </div> |
| 726 | |
| 727 | |
| 728 | |
| 729 | |
| 730 | |
| 731 | <script id="__config" type="application/json">{"annotate": null, "base": "/", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "/assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> |
| 732 | |
| 733 | |
| 734 | <script src="/assets/javascripts/bundle.79ae519e.min.js"></script> |
| 735 | |
| 736 | |
| 737 | </body> |
| 738 | </html> |
+1
| --- a/site/CNAME | ||
| +++ b/site/CNAME | ||
| @@ -0,0 +1 @@ | ||
| 1 | +fossilrepo.dev |
| --- a/site/CNAME | |
| +++ b/site/CNAME | |
| @@ -0,0 +1 @@ | |
| --- a/site/CNAME | |
| +++ b/site/CNAME | |
| @@ -0,0 +1 @@ | |
| 1 | fossilrepo.dev |
| --- a/site/architecture/overview/index.html | ||
| +++ b/site/architecture/overview/index.html | ||
| @@ -0,0 +1,1099 @@ | ||
| 1 | + | |
| 2 | +<!doctype html> | |
| 3 | +<html lang="en" class="no-js"> | |
| 4 | + <head> | |
| 5 | + | |
| 6 | + <meta charset="utf-8"> | |
| 7 | + <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| 8 | + | |
| 9 | + <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting"> | |
| 10 | + | |
| 11 | + | |
| 12 | + <meta name="author" content="CONFLICT LLC"> | |
| 13 | + | |
| 14 | + | |
| 15 | + <link rel="canonical" href="https://fossilrepo.dev/architecture/overview/"> | |
| 16 | + | |
| 17 | + | |
| 18 | + <link rel="prev" href="../../getting-started/first-repo/"> | |
| 19 | + | |
| 20 | + | |
| 21 | + <link rel="next" href="../sync-bridge/"> | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + <link rel="icon" href="../../assets/images/favicon.png"> | |
| 28 | + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6"> | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + <title>Overview - Fossilrepo</title> | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css"> | |
| 37 | + | |
| 38 | + | |
| 39 | + <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css"> | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | |
| 53 | + <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> | |
| 54 | + <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + <link rel="stylesheet" href="../../assets/css/custom.css"> | |
| 59 | + | |
| 60 | + <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + </head> | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"> | |
| 77 | + | |
| 78 | + | |
| 79 | + <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> | |
| 80 | + <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> | |
| 81 | + <label class="md-overlay" for="__drawer"></label> | |
| 82 | + <div data-md-component="skip"> | |
| 83 | + | |
| 84 | + | |
| 85 | + <a href="#architecture-overview" class="md-skip"> | |
| 86 | + Skip to content | |
| 87 | + </a> | |
| 88 | + | |
| 89 | + </div> | |
| 90 | + <div data-md-component="announce"> | |
| 91 | + | |
| 92 | + </div> | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | +<header class="md-header" data-md-component="header"> | |
| 98 | + <nav class="md-header__inner md-grid" aria-label="Header"> | |
| 99 | + <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> | |
| 100 | + <div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 101 | + <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 102 | + <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 103 | +</div> | |
| 104 | + </a> | |
| 105 | + <label class="md-header__button md-icon" for="__drawer"> | |
| 106 | + | |
| 107 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> | |
| 108 | + </label> | |
| 109 | + <div class="md-header__title" data-md-component="header-title"> | |
| 110 | + <div class="md-header__ellipsis"> | |
| 111 | + <div class="md-header__topic"> | |
| 112 | + <span class="md-ellipsis"> | |
| 113 | + Fossilrepo | |
| 114 | + </span> | |
| 115 | + </div> | |
| 116 | + <div class="md-header__topic" data-md-component="header-topic"> | |
| 117 | + <span class="md-ellipsis"> | |
| 118 | + | |
| 119 | + Overview | |
| 120 | + | |
| 121 | + </span> | |
| 122 | + </div> | |
| 123 | + </div> | |
| 124 | + </div> | |
| 125 | + | |
| 126 | + | |
| 127 | + <form class="md-header__option" data-md-component="palette"> | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> | |
| 133 | + | |
| 134 | + <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> | |
| 135 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> | |
| 136 | + </label> | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> | |
| 143 | + | |
| 144 | + <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> | |
| 145 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> | |
| 146 | + </label> | |
| 147 | + | |
| 148 | + | |
| 149 | +</form> | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + <label class="md-header__button md-icon" for="__search"> | |
| 160 | + | |
| 161 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> | |
| 162 | + </label> | |
| 163 | + <div class="md-search" data-md-component="search" role="dialog"> | |
| 164 | + <label class="md-search__overlay" for="__search"></label> | |
| 165 | + <div class="md-search__inner" role="search"> | |
| 166 | + <form class="md-search__form" name="search"> | |
| 167 | + <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> | |
| 168 | + <label class="md-search__icon md-icon" for="__search"> | |
| 169 | + | |
| 170 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> | |
| 171 | + | |
| 172 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> | |
| 173 | + </label> | |
| 174 | + <nav class="md-search__options" aria-label="Search"> | |
| 175 | + | |
| 176 | + <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> | |
| 177 | + | |
| 178 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> | |
| 179 | + </button> | |
| 180 | + </nav> | |
| 181 | + | |
| 182 | + <div class="md-search__suggest" data-md-component="search-suggest"></div> | |
| 183 | + | |
| 184 | + </form> | |
| 185 | + <div class="md-search__output"> | |
| 186 | + <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> | |
| 187 | + <div class="md-search-result" data-md-component="search-result"> | |
| 188 | + <div class="md-search-result__meta"> | |
| 189 | + Initializing search | |
| 190 | + </div> | |
| 191 | + <ol class="md-search-result__list" role="presentation"></ol> | |
| 192 | + </div> | |
| 193 | + </div> | |
| 194 | + </div> | |
| 195 | + </div> | |
| 196 | +</div> | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + <div class="md-header__source"> | |
| 201 | + <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> | |
| 202 | + <div class="md-source__icon md-icon"> | |
| 203 | + | |
| 204 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 205 | + </div> | |
| 206 | + <div class="md-source__repository"> | |
| 207 | + ConflictHQ/fossilrepo | |
| 208 | + </div> | |
| 209 | +</a> | |
| 210 | + </div> | |
| 211 | + | |
| 212 | + </nav> | |
| 213 | + | |
| 214 | +</header> | |
| 215 | + | |
| 216 | + <div class="md-container" data-md-component="container"> | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | +<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> | |
| 223 | + <div class="md-grid"> | |
| 224 | + <ul class="md-tabs__list"> | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + <li class="md-tabs__item"> | |
| 232 | + <a href="../.." class="md-tabs__link"> | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + Home | |
| 239 | + | |
| 240 | + </a> | |
| 241 | + </li> | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + <li class="md-tabs__item"> | |
| 253 | + <a href="../../getting-started/prerequisites/" class="md-tabs__link"> | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + Getting Started | |
| 258 | + | |
| 259 | + </a> | |
| 260 | + </li> | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + <li class="md-tabs__item md-tabs__item--active"> | |
| 275 | + <a href="./" class="md-tabs__link"> | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + Architecture | |
| 280 | + | |
| 281 | + </a> | |
| 282 | + </li> | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + </ul> | |
| 288 | + </div> | |
| 289 | +</nav> | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + <main class="md-main" data-md-component="main"> | |
| 294 | + <div class="md-main__inner md-grid"> | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > | |
| 299 | + <div class="md-sidebar__scrollwrap"> | |
| 300 | + <div class="md-sidebar__inner"> | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | +<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> | |
| 308 | + <label class="md-nav__title" for="__drawer"> | |
| 309 | + <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> | |
| 310 | + <div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 311 | + <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 312 | + <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 313 | +</div> | |
| 314 | + </a> | |
| 315 | + Fossilrepo | |
| 316 | + </label> | |
| 317 | + | |
| 318 | + <div class="md-nav__source"> | |
| 319 | + <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> | |
| 320 | + <div class="md-source__icon md-icon"> | |
| 321 | + | |
| 322 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 323 | + </div> | |
| 324 | + <div class="md-source__repository"> | |
| 325 | + ConflictHQ/fossilrepo | |
| 326 | + </div> | |
| 327 | +</a> | |
| 328 | + </div> | |
| 329 | + | |
| 330 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + <li class="md-nav__item"> | |
| 339 | + <a href="../.." class="md-nav__link"> | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + <span class="md-ellipsis"> | |
| 344 | + | |
| 345 | + | |
| 346 | + Home | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + </span> | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + </a> | |
| 355 | + </li> | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + <li class="md-nav__item md-nav__item--nested"> | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" > | |
| 382 | + | |
| 383 | + | |
| 384 | + <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0"> | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + <span class="md-ellipsis"> | |
| 389 | + | |
| 390 | + | |
| 391 | + Getting Started | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + </span> | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + <span class="md-nav__icon md-icon"></span> | |
| 400 | + </label> | |
| 401 | + | |
| 402 | + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false"> | |
| 403 | + <label class="md-nav__title" for="__nav_2"> | |
| 404 | + <span class="md-nav__icon md-icon"></span> | |
| 405 | + | |
| 406 | + | |
| 407 | + Getting Started | |
| 408 | + | |
| 409 | + | |
| 410 | + </label> | |
| 411 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + <li class="md-nav__item"> | |
| 420 | + <a href="../../getting-started/prerequisites/" class="md-nav__link"> | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + <span class="md-ellipsis"> | |
| 425 | + | |
| 426 | + | |
| 427 | + Prerequisites | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + </span> | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + </a> | |
| 436 | + </li> | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + <li class="md-nav__item"> | |
| 448 | + <a href="../../getting-started/installation/" class="md-nav__link"> | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + <span class="md-ellipsis"> | |
| 453 | + | |
| 454 | + | |
| 455 | + Installation | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + </span> | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + </a> | |
| 464 | + </li> | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + <li class="md-nav__item"> | |
| 476 | + <a href="../../getting-started/configuration/" class="md-nav__link"> | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + <span class="md-ellipsis"> | |
| 481 | + | |
| 482 | + | |
| 483 | + Configuration | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + </span> | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + </a> | |
| 492 | + </li> | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + <li class="md-nav__item"> | |
| 504 | + <a href="../../getting-started/first-repo/" class="md-nav__link"> | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + <span class="md-ellipsis"> | |
| 509 | + | |
| 510 | + | |
| 511 | + First Repository | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + </span> | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + </a> | |
| 520 | + </li> | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | + </ul> | |
| 526 | + </nav> | |
| 527 | + | |
| 528 | + </li> | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + | |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | + <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked> | |
| 558 | + | |
| 559 | + | |
| 560 | + <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex=""> | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + <span class="md-ellipsis"> | |
| 565 | + | |
| 566 | + | |
| 567 | + Architecture | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + </span> | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + <span class="md-nav__icon md-icon"></span> | |
| 576 | + </label> | |
| 577 | + | |
| 578 | + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true"> | |
| 579 | + <label class="md-nav__title" for="__nav_3"> | |
| 580 | + <span class="md-nav__icon md-icon"></span> | |
| 581 | + | |
| 582 | + | |
| 583 | + Architecture | |
| 584 | + | |
| 585 | + | |
| 586 | + </label> | |
| 587 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 588 | + | |
| 589 | + | |
| 590 | + | |
| 591 | + | |
| 592 | + | |
| 593 | + | |
| 594 | + | |
| 595 | + | |
| 596 | + | |
| 597 | + <li class="md-nav__item md-nav__item--active"> | |
| 598 | + | |
| 599 | + <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + <label class="md-nav__link md-nav__link--active" for="__toc"> | |
| 606 | + | |
| 607 | + | |
| 608 | + | |
| 609 | + <span class="md-ellipsis"> | |
| 610 | + | |
| 611 | + | |
| 612 | + Overview | |
| 613 | + | |
| 614 | + | |
| 615 | + | |
| 616 | + </span> | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
| 620 | + <span class="md-nav__icon md-icon"></span> | |
| 621 | + </label> | |
| 622 | + | |
| 623 | + <a href="./" class="md-nav__link md-nav__link--active"> | |
| 624 | + | |
| 625 | + | |
| 626 | + | |
| 627 | + <span class="md-ellipsis"> | |
| 628 | + | |
| 629 | + | |
| 630 | + Overview | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + </span> | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + </a> | |
| 639 | + | |
| 640 | + | |
| 641 | + | |
| 642 | +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
| 643 | + | |
| 644 | + | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
| 649 | + <label class="md-nav__title" for="__toc"> | |
| 650 | + <span class="md-nav__icon md-icon"></span> | |
| 651 | + Table of contents | |
| 652 | + </label> | |
| 653 | + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> | |
| 654 | + | |
| 655 | + <li class="md-nav__item"> | |
| 656 | + <a href="#system-diagram" class="md-nav__link"> | |
| 657 | + <span class="md-ellipsis"> | |
| 658 | + | |
| 659 | + System Diagram | |
| 660 | + | |
| 661 | + </span> | |
| 662 | + </a> | |
| 663 | + | |
| 664 | +</li> | |
| 665 | + | |
| 666 | + <li class="md-nav__item"> | |
| 667 | + <a href="#components" class="md-nav__link"> | |
| 668 | + <span class="md-ellipsis"> | |
| 669 | + | |
| 670 | + Components | |
| 671 | + | |
| 672 | + </span> | |
| 673 | + </a> | |
| 674 | + | |
| 675 | + <nav class="md-nav" aria-label="Components"> | |
| 676 | + <ul class="md-nav__list"> | |
| 677 | + | |
| 678 | + <li class="md-nav__item"> | |
| 679 | + <a href="#fossil-server" class="md-nav__link"> | |
| 680 | + <span class="md-ellipsis"> | |
| 681 | + | |
| 682 | + Fossil Server | |
| 683 | + | |
| 684 | + </span> | |
| 685 | + </a> | |
| 686 | + | |
| 687 | +</li> | |
| 688 | + | |
| 689 | + <li class="md-nav__item"> | |
| 690 | + <a href="#caddy" class="md-nav__link"> | |
| 691 | + <span class="md-ellipsis"> | |
| 692 | + | |
| 693 | + Caddy | |
| 694 | + | |
| 695 | + </span> | |
| 696 | + </a> | |
| 697 | + | |
| 698 | +</li> | |
| 699 | + | |
| 700 | + <li class="md-nav__item"> | |
| 701 | + <a href="#django-management-layer" class="md-nav__link"> | |
| 702 | + <span class="md-ellipsis"> | |
| 703 | + | |
| 704 | + Django Management Layer | |
| 705 | + | |
| 706 | + </span> | |
| 707 | + </a> | |
| 708 | + | |
| 709 | +</li> | |
| 710 | + | |
| 711 | + <li class="md-nav__item"> | |
| 712 | + <a href="#litestream" class="md-nav__link"> | |
| 713 | + <span class="md-ellipsis"> | |
| 714 | + | |
| 715 | + Litestream | |
| 716 | + | |
| 717 | + </span> | |
| 718 | + </a> | |
| 719 | + | |
| 720 | +</li> | |
| 721 | + | |
| 722 | + <li class="md-nav__item"> | |
| 723 | + <a href="#celery-workers" class="md-nav__link"> | |
| 724 | + <span class="md-ellipsis"> | |
| 725 | + | |
| 726 | + Celery Workers | |
| 727 | + | |
| 728 | + </span> | |
| 729 | + </a> | |
| 730 | + | |
| 731 | +</li> | |
| 732 | + | |
| 733 | + </ul> | |
| 734 | + </nav> | |
| 735 | + | |
| 736 | +</li> | |
| 737 | + | |
| 738 | + <li class="md-nav__item"> | |
| 739 | + <a href="#data-flow" class="md-nav__link"> | |
| 740 | + <span class="md-ellipsis"> | |
| 741 | + | |
| 742 | + Data Flow | |
| 743 | + | |
| 744 | + </span> | |
| 745 | + </a> | |
| 746 | + | |
| 747 | +</li> | |
| 748 | + | |
| 749 | + </ul> | |
| 750 | + | |
| 751 | +</nav> | |
| 752 | + | |
| 753 | + </li> | |
| 754 | + | |
| 755 | + | |
| 756 | + | |
| 757 | + | |
| 758 | + | |
| 759 | + | |
| 760 | + | |
| 761 | + | |
| 762 | + | |
| 763 | + | |
| 764 | + <li class="md-nav__item"> | |
| 765 | + <a href="../sync-bridge/" class="md-nav__link"> | |
| 766 | + | |
| 767 | + | |
| 768 | + | |
| 769 | + <span class="md-ellipsis"> | |
| 770 | + | |
| 771 | + | |
| 772 | + Sync Bridge | |
| 773 | + | |
| 774 | + | |
| 775 | + | |
| 776 | + </span> | |
| 777 | + | |
| 778 | + | |
| 779 | + | |
| 780 | + </a> | |
| 781 | + </li> | |
| 782 | + | |
| 783 | + | |
| 784 | + | |
| 785 | + | |
| 786 | + </ul> | |
| 787 | + </nav> | |
| 788 | + | |
| 789 | + </li> | |
| 790 | + | |
| 791 | + | |
| 792 | + | |
| 793 | + </ul> | |
| 794 | +</nav> | |
| 795 | + </div> | |
| 796 | + </div> | |
| 797 | + </div> | |
| 798 | + | |
| 799 | + | |
| 800 | + | |
| 801 | + <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > | |
| 802 | + <div class="md-sidebar__scrollwrap"> | |
| 803 | + <div class="md-sidebar__inner"> | |
| 804 | + | |
| 805 | + | |
| 806 | +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
| 807 | + | |
| 808 | + | |
| 809 | + | |
| 810 | + | |
| 811 | + | |
| 812 | + | |
| 813 | + <label class="md-nav__title" for="__toc"> | |
| 814 | + <span class="md-nav__icon md-icon"></span> | |
| 815 | + Table of contents | |
| 816 | + </label> | |
| 817 | + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> | |
| 818 | + | |
| 819 | + <li class="md-nav__item"> | |
| 820 | + <a href="#system-diagram" class="md-nav__link"> | |
| 821 | + <span class="md-ellipsis"> | |
| 822 | + | |
| 823 | + System Diagram | |
| 824 | + | |
| 825 | + </span> | |
| 826 | + </a> | |
| 827 | + | |
| 828 | +</li> | |
| 829 | + | |
| 830 | + <li class="md-nav__item"> | |
| 831 | + <a href="#components" class="md-nav__link"> | |
| 832 | + <span class="md-ellipsis"> | |
| 833 | + | |
| 834 | + Components | |
| 835 | + | |
| 836 | + </span> | |
| 837 | + </a> | |
| 838 | + | |
| 839 | + <nav class="md-nav" aria-label="Components"> | |
| 840 | + <ul class="md-nav__list"> | |
| 841 | + | |
| 842 | + <li class="md-nav__item"> | |
| 843 | + <a href="#fossil-server" class="md-nav__link"> | |
| 844 | + <span class="md-ellipsis"> | |
| 845 | + | |
| 846 | + Fossil Server | |
| 847 | + | |
| 848 | + </span> | |
| 849 | + </a> | |
| 850 | + | |
| 851 | +</li> | |
| 852 | + | |
| 853 | + <li class="md-nav__item"> | |
| 854 | + <a href="#caddy" class="md-nav__link"> | |
| 855 | + <span class="md-ellipsis"> | |
| 856 | + | |
| 857 | + Caddy | |
| 858 | + | |
| 859 | + </span> | |
| 860 | + </a> | |
| 861 | + | |
| 862 | +</li> | |
| 863 | + | |
| 864 | + <li class="md-nav__item"> | |
| 865 | + <a href="#django-management-layer" class="md-nav__link"> | |
| 866 | + <span class="md-ellipsis"> | |
| 867 | + | |
| 868 | + Django Management Layer | |
| 869 | + | |
| 870 | + </span> | |
| 871 | + </a> | |
| 872 | + | |
| 873 | +</li> | |
| 874 | + | |
| 875 | + <li class="md-nav__item"> | |
| 876 | + <a href="#litestream" class="md-nav__link"> | |
| 877 | + <span class="md-ellipsis"> | |
| 878 | + | |
| 879 | + Litestream | |
| 880 | + | |
| 881 | + </span> | |
| 882 | + </a> | |
| 883 | + | |
| 884 | +</li> | |
| 885 | + | |
| 886 | + <li class="md-nav__item"> | |
| 887 | + <a href="#celery-workers" class="md-nav__link"> | |
| 888 | + <span class="md-ellipsis"> | |
| 889 | + | |
| 890 | + Celery Workers | |
| 891 | + | |
| 892 | + </span> | |
| 893 | + </a> | |
| 894 | + | |
| 895 | +</li> | |
| 896 | + | |
| 897 | + </ul> | |
| 898 | + </nav> | |
| 899 | + | |
| 900 | +</li> | |
| 901 | + | |
| 902 | + <li class="md-nav__item"> | |
| 903 | + <a href="#data-flow" class="md-nav__link"> | |
| 904 | + <span class="md-ellipsis"> | |
| 905 | + | |
| 906 | + Data Flow | |
| 907 | + | |
| 908 | + </span> | |
| 909 | + </a> | |
| 910 | + | |
| 911 | +</li> | |
| 912 | + | |
| 913 | + </ul> | |
| 914 | + | |
| 915 | +</nav> | |
| 916 | + </div> | |
| 917 | + </div> | |
| 918 | + </div> | |
| 919 | + | |
| 920 | + | |
| 921 | + | |
| 922 | + <div class="md-content" data-md-component="content"> | |
| 923 | + | |
| 924 | + <article class="md-content__inner md-typeset"> | |
| 925 | + | |
| 926 | + | |
| 927 | + | |
| 928 | + | |
| 929 | + | |
| 930 | + | |
| 931 | + | |
| 932 | + | |
| 933 | +<h1 id="architecture-overview">Architecture Overview<a class="headerlink" href="#architecture-overview" title="Permanent link">¶</a></h1> | |
| 934 | +<p>Fossilrepo is a thin orchestration layer around Fossil SCM. Fossil does the heavy lifting -- fossilrepo handles provisioning, routing, backups, and the management UI.</p> | |
| 935 | +<h2 id="system-diagram">System Diagram<a class="headerlink" href="#system-diagram" title="Permanent link">¶</a></h2> | |
| 936 | +<pre class="mermaid"><code>graph TB | |
| 937 | + subgraph Internet | |
| 938 | + User[User / Browser] | |
| 939 | + end | |
| 940 | + | |
| 941 | + subgraph Fossilrepo Server | |
| 942 | + Caddy[Caddy<br/>SSL + Routing] | |
| 943 | + Django[Django<br/>Management UI] | |
| 944 | + Fossil[Fossil Server<br/>--repolist] | |
| 945 | + Celery[Celery Workers] | |
| 946 | + Redis[Redis] | |
| 947 | + Postgres[(PostgreSQL)] | |
| 948 | + Litestream[Litestream] | |
| 949 | + end | |
| 950 | + | |
| 951 | + subgraph Storage | |
| 952 | + Repos["/data/repos/<br/>*.fossil files"] | |
| 953 | + S3[(S3 / MinIO)] | |
| 954 | + end | |
| 955 | + | |
| 956 | + subgraph Mirrors | |
| 957 | + GitHub[GitHub] | |
| 958 | + GitLab[GitLab] | |
| 959 | + end | |
| 960 | + | |
| 961 | + User --> Caddy | |
| 962 | + Caddy -->|"app.domain.com"| Django | |
| 963 | + Caddy -->|"repo.domain.com"| Fossil | |
| 964 | + Django --> Postgres | |
| 965 | + Django --> Redis | |
| 966 | + Celery --> Redis | |
| 967 | + Celery -->|sync bridge| GitHub | |
| 968 | + Celery -->|sync bridge| GitLab | |
| 969 | + Fossil --> Repos | |
| 970 | + Litestream --> Repos | |
| 971 | + Litestream --> S3</code></pre> | |
| 972 | +<h2 id="components">Components<a class="headerlink" href="#components" title="Permanent link">¶</a></h2> | |
| 973 | +<h3 id="fossil-server">Fossil Server<a class="headerlink" href="#fossil-server" title="Permanent link">¶</a></h3> | |
| 974 | +<p>A single <code>fossil server --repolist /data/repos/</code> process serves all repositories. Each <code>.fossil</code> file is a self-contained SQLite database with VCS history, issues, wiki, and forum.</p> | |
| 975 | +<p>Adding a new repo is just <code>fossil init /data/repos/name.fossil</code> -- no restart needed.</p> | |
| 976 | +<h3 id="caddy">Caddy<a class="headerlink" href="#caddy" title="Permanent link">¶</a></h3> | |
| 977 | +<p>Handles SSL termination and subdomain routing:</p> | |
| 978 | +<ul> | |
| 979 | +<li><code>your-domain.com</code> routes to the Django management UI</li> | |
| 980 | +<li><code>reponame.your-domain.com</code> routes directly to Fossil's web UI</li> | |
| 981 | +</ul> | |
| 982 | +<p>Caddy automatically provisions and renews Let's Encrypt certificates.</p> | |
| 983 | +<h3 id="django-management-layer">Django Management Layer<a class="headerlink" href="#django-management-layer" title="Permanent link">¶</a></h3> | |
| 984 | +<p>Provides the administrative interface:</p> | |
| 985 | +<ul> | |
| 986 | +<li>Repository lifecycle (create, configure, archive)</li> | |
| 987 | +<li>User and organization management</li> | |
| 988 | +<li>Dashboard and analytics</li> | |
| 989 | +<li>Sync bridge configuration</li> | |
| 990 | +</ul> | |
| 991 | +<p>Django uses HTMX for interactive UI without a JavaScript framework.</p> | |
| 992 | +<h3 id="litestream">Litestream<a class="headerlink" href="#litestream" title="Permanent link">¶</a></h3> | |
| 993 | +<p>Continuously replicates every <code>.fossil</code> SQLite file to S3-compatible storage. Provides:</p> | |
| 994 | +<ul> | |
| 995 | +<li><strong>Continuous backup</strong> -- WAL frames replicated in near-real-time</li> | |
| 996 | +<li><strong>Point-in-time recovery</strong> -- restore to any moment, not just snapshots</li> | |
| 997 | +<li><strong>Zero-config per repo</strong> -- new <code>.fossil</code> files are picked up automatically</li> | |
| 998 | +</ul> | |
| 999 | +<h3 id="celery-workers">Celery Workers<a class="headerlink" href="#celery-workers" title="Permanent link">¶</a></h3> | |
| 1000 | +<p>Handle background tasks:</p> | |
| 1001 | +<ul> | |
| 1002 | +<li>Sync bridge execution (Fossil to Git mirroring)</li> | |
| 1003 | +<li>Scheduled sync jobs</li> | |
| 1004 | +<li>Upstream pull operations</li> | |
| 1005 | +</ul> | |
| 1006 | +<h2 id="data-flow">Data Flow<a class="headerlink" href="#data-flow" title="Permanent link">¶</a></h2> | |
| 1007 | +<ol> | |
| 1008 | +<li><strong>User pushes to Fossil</strong> -- standard <code>fossil push</code> or <code>fossil sync</code></li> | |
| 1009 | +<li><strong>Fossil writes to <code>.fossil</code> file</strong> -- SQLite transactions</li> | |
| 1010 | +<li><strong>Litestream replicates</strong> -- WAL frames streamed to S3</li> | |
| 1011 | +<li><strong>Sync bridge runs</strong> -- Celery task mirrors changes to Git remotes</li> | |
| 1012 | +<li><strong>Django reflects state</strong> -- reads from Fossil SQLite for dashboards</li> | |
| 1013 | +</ol> | |
| 1014 | +<p>Fossil is always the source of truth. Everything else is derived.</p> | |
| 1015 | + | |
| 1016 | + | |
| 1017 | + | |
| 1018 | + | |
| 1019 | + | |
| 1020 | + | |
| 1021 | + | |
| 1022 | + | |
| 1023 | + | |
| 1024 | + | |
| 1025 | + | |
| 1026 | + | |
| 1027 | + | |
| 1028 | + </article> | |
| 1029 | + </div> | |
| 1030 | + | |
| 1031 | + | |
| 1032 | + <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> | |
| 1033 | + | |
| 1034 | +<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> | |
| 1035 | + </div> | |
| 1036 | + | |
| 1037 | + <button type="button" class="md-top md-icon" data-md-component="top" hidden> | |
| 1038 | + | |
| 1039 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> | |
| 1040 | + Back to top | |
| 1041 | +</button> | |
| 1042 | + | |
| 1043 | + </main> | |
| 1044 | + | |
| 1045 | + <footer class="md-footer"> | |
| 1046 | + | |
| 1047 | + <div class="md-footer-meta md-typeset"> | |
| 1048 | + <div class="md-footer-meta__inner md-grid"> | |
| 1049 | + <div class="md-copyright"> | |
| 1050 | + | |
| 1051 | + <div class="md-copyright__highlight"> | |
| 1052 | + Copyright © 2026 CONFLICT LLC | |
| 1053 | + </div> | |
| 1054 | + | |
| 1055 | + | |
| 1056 | + Made with | |
| 1057 | + <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> | |
| 1058 | + Material for MkDocs | |
| 1059 | + </a> | |
| 1060 | + | |
| 1061 | +</div> | |
| 1062 | + | |
| 1063 | + | |
| 1064 | +<div class="md-social"> | |
| 1065 | + | |
| 1066 | + | |
| 1067 | + | |
| 1068 | + | |
| 1069 | + | |
| 1070 | + | |
| 1071 | + | |
| 1072 | + | |
| 1073 | + <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link"> | |
| 1074 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 1075 | + </a> | |
| 1076 | + | |
| 1077 | +</div> | |
| 1078 | + | |
| 1079 | + </div> | |
| 1080 | + </div> | |
| 1081 | +</footer> | |
| 1082 | + | |
| 1083 | + </div> | |
| 1084 | + <div class="md-dialog" data-md-component="dialog"> | |
| 1085 | + <div class="md-dialog__inner md-typeset"></div> | |
| 1086 | + </div> | |
| 1087 | + | |
| 1088 | + | |
| 1089 | + | |
| 1090 | + | |
| 1091 | + | |
| 1092 | + <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> | |
| 1093 | + | |
| 1094 | + | |
| 1095 | + <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script> | |
| 1096 | + | |
| 1097 | + | |
| 1098 | + </body> | |
| 1099 | +</html> |
| --- a/site/architecture/overview/index.html | |
| +++ b/site/architecture/overview/index.html | |
| @@ -0,0 +1,1099 @@ | |
| --- a/site/architecture/overview/index.html | |
| +++ b/site/architecture/overview/index.html | |
| @@ -0,0 +1,1099 @@ | |
| 1 | |
| 2 | <!doctype html> |
| 3 | <html lang="en" class="no-js"> |
| 4 | <head> |
| 5 | |
| 6 | <meta charset="utf-8"> |
| 7 | <meta name="viewport" content="width=device-width,initial-scale=1"> |
| 8 | |
| 9 | <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting"> |
| 10 | |
| 11 | |
| 12 | <meta name="author" content="CONFLICT LLC"> |
| 13 | |
| 14 | |
| 15 | <link rel="canonical" href="https://fossilrepo.dev/architecture/overview/"> |
| 16 | |
| 17 | |
| 18 | <link rel="prev" href="../../getting-started/first-repo/"> |
| 19 | |
| 20 | |
| 21 | <link rel="next" href="../sync-bridge/"> |
| 22 | |
| 23 | |
| 24 | |
| 25 | |
| 26 | |
| 27 | <link rel="icon" href="../../assets/images/favicon.png"> |
| 28 | <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6"> |
| 29 | |
| 30 | |
| 31 | |
| 32 | <title>Overview - Fossilrepo</title> |
| 33 | |
| 34 | |
| 35 | |
| 36 | <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css"> |
| 37 | |
| 38 | |
| 39 | <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css"> |
| 40 | |
| 41 | |
| 42 | |
| 43 | |
| 44 | |
| 45 | |
| 46 | |
| 47 | |
| 48 | |
| 49 | |
| 50 | |
| 51 | |
| 52 | <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
| 53 | <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> |
| 54 | <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> |
| 55 | |
| 56 | |
| 57 | |
| 58 | <link rel="stylesheet" href="../../assets/css/custom.css"> |
| 59 | |
| 60 | <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> |
| 61 | |
| 62 | |
| 63 | |
| 64 | |
| 65 | |
| 66 | </head> |
| 67 | |
| 68 | |
| 69 | |
| 70 | |
| 71 | |
| 72 | |
| 73 | |
| 74 | |
| 75 | |
| 76 | <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"> |
| 77 | |
| 78 | |
| 79 | <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> |
| 80 | <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> |
| 81 | <label class="md-overlay" for="__drawer"></label> |
| 82 | <div data-md-component="skip"> |
| 83 | |
| 84 | |
| 85 | <a href="#architecture-overview" class="md-skip"> |
| 86 | Skip to content |
| 87 | </a> |
| 88 | |
| 89 | </div> |
| 90 | <div data-md-component="announce"> |
| 91 | |
| 92 | </div> |
| 93 | |
| 94 | |
| 95 | |
| 96 | |
| 97 | <header class="md-header" data-md-component="header"> |
| 98 | <nav class="md-header__inner md-grid" aria-label="Header"> |
| 99 | <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> |
| 100 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 101 | <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 102 | <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 103 | </div> |
| 104 | </a> |
| 105 | <label class="md-header__button md-icon" for="__drawer"> |
| 106 | |
| 107 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> |
| 108 | </label> |
| 109 | <div class="md-header__title" data-md-component="header-title"> |
| 110 | <div class="md-header__ellipsis"> |
| 111 | <div class="md-header__topic"> |
| 112 | <span class="md-ellipsis"> |
| 113 | Fossilrepo |
| 114 | </span> |
| 115 | </div> |
| 116 | <div class="md-header__topic" data-md-component="header-topic"> |
| 117 | <span class="md-ellipsis"> |
| 118 | |
| 119 | Overview |
| 120 | |
| 121 | </span> |
| 122 | </div> |
| 123 | </div> |
| 124 | </div> |
| 125 | |
| 126 | |
| 127 | <form class="md-header__option" data-md-component="palette"> |
| 128 | |
| 129 | |
| 130 | |
| 131 | |
| 132 | <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> |
| 133 | |
| 134 | <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> |
| 135 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> |
| 136 | </label> |
| 137 | |
| 138 | |
| 139 | |
| 140 | |
| 141 | |
| 142 | <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> |
| 143 | |
| 144 | <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> |
| 145 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> |
| 146 | </label> |
| 147 | |
| 148 | |
| 149 | </form> |
| 150 | |
| 151 | |
| 152 | |
| 153 | <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> |
| 154 | |
| 155 | |
| 156 | |
| 157 | |
| 158 | |
| 159 | <label class="md-header__button md-icon" for="__search"> |
| 160 | |
| 161 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> |
| 162 | </label> |
| 163 | <div class="md-search" data-md-component="search" role="dialog"> |
| 164 | <label class="md-search__overlay" for="__search"></label> |
| 165 | <div class="md-search__inner" role="search"> |
| 166 | <form class="md-search__form" name="search"> |
| 167 | <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> |
| 168 | <label class="md-search__icon md-icon" for="__search"> |
| 169 | |
| 170 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> |
| 171 | |
| 172 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> |
| 173 | </label> |
| 174 | <nav class="md-search__options" aria-label="Search"> |
| 175 | |
| 176 | <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> |
| 177 | |
| 178 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> |
| 179 | </button> |
| 180 | </nav> |
| 181 | |
| 182 | <div class="md-search__suggest" data-md-component="search-suggest"></div> |
| 183 | |
| 184 | </form> |
| 185 | <div class="md-search__output"> |
| 186 | <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> |
| 187 | <div class="md-search-result" data-md-component="search-result"> |
| 188 | <div class="md-search-result__meta"> |
| 189 | Initializing search |
| 190 | </div> |
| 191 | <ol class="md-search-result__list" role="presentation"></ol> |
| 192 | </div> |
| 193 | </div> |
| 194 | </div> |
| 195 | </div> |
| 196 | </div> |
| 197 | |
| 198 | |
| 199 | |
| 200 | <div class="md-header__source"> |
| 201 | <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> |
| 202 | <div class="md-source__icon md-icon"> |
| 203 | |
| 204 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 205 | </div> |
| 206 | <div class="md-source__repository"> |
| 207 | ConflictHQ/fossilrepo |
| 208 | </div> |
| 209 | </a> |
| 210 | </div> |
| 211 | |
| 212 | </nav> |
| 213 | |
| 214 | </header> |
| 215 | |
| 216 | <div class="md-container" data-md-component="container"> |
| 217 | |
| 218 | |
| 219 | |
| 220 | |
| 221 | |
| 222 | <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> |
| 223 | <div class="md-grid"> |
| 224 | <ul class="md-tabs__list"> |
| 225 | |
| 226 | |
| 227 | |
| 228 | |
| 229 | |
| 230 | |
| 231 | <li class="md-tabs__item"> |
| 232 | <a href="../.." class="md-tabs__link"> |
| 233 | |
| 234 | |
| 235 | |
| 236 | |
| 237 | |
| 238 | Home |
| 239 | |
| 240 | </a> |
| 241 | </li> |
| 242 | |
| 243 | |
| 244 | |
| 245 | |
| 246 | |
| 247 | |
| 248 | |
| 249 | |
| 250 | |
| 251 | |
| 252 | <li class="md-tabs__item"> |
| 253 | <a href="../../getting-started/prerequisites/" class="md-tabs__link"> |
| 254 | |
| 255 | |
| 256 | |
| 257 | Getting Started |
| 258 | |
| 259 | </a> |
| 260 | </li> |
| 261 | |
| 262 | |
| 263 | |
| 264 | |
| 265 | |
| 266 | |
| 267 | |
| 268 | |
| 269 | |
| 270 | |
| 271 | |
| 272 | |
| 273 | |
| 274 | <li class="md-tabs__item md-tabs__item--active"> |
| 275 | <a href="./" class="md-tabs__link"> |
| 276 | |
| 277 | |
| 278 | |
| 279 | Architecture |
| 280 | |
| 281 | </a> |
| 282 | </li> |
| 283 | |
| 284 | |
| 285 | |
| 286 | |
| 287 | </ul> |
| 288 | </div> |
| 289 | </nav> |
| 290 | |
| 291 | |
| 292 | |
| 293 | <main class="md-main" data-md-component="main"> |
| 294 | <div class="md-main__inner md-grid"> |
| 295 | |
| 296 | |
| 297 | |
| 298 | <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > |
| 299 | <div class="md-sidebar__scrollwrap"> |
| 300 | <div class="md-sidebar__inner"> |
| 301 | |
| 302 | |
| 303 | |
| 304 | |
| 305 | |
| 306 | |
| 307 | <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> |
| 308 | <label class="md-nav__title" for="__drawer"> |
| 309 | <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> |
| 310 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 311 | <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 312 | <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 313 | </div> |
| 314 | </a> |
| 315 | Fossilrepo |
| 316 | </label> |
| 317 | |
| 318 | <div class="md-nav__source"> |
| 319 | <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> |
| 320 | <div class="md-source__icon md-icon"> |
| 321 | |
| 322 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 323 | </div> |
| 324 | <div class="md-source__repository"> |
| 325 | ConflictHQ/fossilrepo |
| 326 | </div> |
| 327 | </a> |
| 328 | </div> |
| 329 | |
| 330 | <ul class="md-nav__list" data-md-scrollfix> |
| 331 | |
| 332 | |
| 333 | |
| 334 | |
| 335 | |
| 336 | |
| 337 | |
| 338 | <li class="md-nav__item"> |
| 339 | <a href="../.." class="md-nav__link"> |
| 340 | |
| 341 | |
| 342 | |
| 343 | <span class="md-ellipsis"> |
| 344 | |
| 345 | |
| 346 | Home |
| 347 | |
| 348 | |
| 349 | |
| 350 | </span> |
| 351 | |
| 352 | |
| 353 | |
| 354 | </a> |
| 355 | </li> |
| 356 | |
| 357 | |
| 358 | |
| 359 | |
| 360 | |
| 361 | |
| 362 | |
| 363 | |
| 364 | |
| 365 | |
| 366 | |
| 367 | |
| 368 | |
| 369 | |
| 370 | |
| 371 | |
| 372 | |
| 373 | |
| 374 | |
| 375 | <li class="md-nav__item md-nav__item--nested"> |
| 376 | |
| 377 | |
| 378 | |
| 379 | |
| 380 | |
| 381 | <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" > |
| 382 | |
| 383 | |
| 384 | <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0"> |
| 385 | |
| 386 | |
| 387 | |
| 388 | <span class="md-ellipsis"> |
| 389 | |
| 390 | |
| 391 | Getting Started |
| 392 | |
| 393 | |
| 394 | |
| 395 | </span> |
| 396 | |
| 397 | |
| 398 | |
| 399 | <span class="md-nav__icon md-icon"></span> |
| 400 | </label> |
| 401 | |
| 402 | <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false"> |
| 403 | <label class="md-nav__title" for="__nav_2"> |
| 404 | <span class="md-nav__icon md-icon"></span> |
| 405 | |
| 406 | |
| 407 | Getting Started |
| 408 | |
| 409 | |
| 410 | </label> |
| 411 | <ul class="md-nav__list" data-md-scrollfix> |
| 412 | |
| 413 | |
| 414 | |
| 415 | |
| 416 | |
| 417 | |
| 418 | |
| 419 | <li class="md-nav__item"> |
| 420 | <a href="../../getting-started/prerequisites/" class="md-nav__link"> |
| 421 | |
| 422 | |
| 423 | |
| 424 | <span class="md-ellipsis"> |
| 425 | |
| 426 | |
| 427 | Prerequisites |
| 428 | |
| 429 | |
| 430 | |
| 431 | </span> |
| 432 | |
| 433 | |
| 434 | |
| 435 | </a> |
| 436 | </li> |
| 437 | |
| 438 | |
| 439 | |
| 440 | |
| 441 | |
| 442 | |
| 443 | |
| 444 | |
| 445 | |
| 446 | |
| 447 | <li class="md-nav__item"> |
| 448 | <a href="../../getting-started/installation/" class="md-nav__link"> |
| 449 | |
| 450 | |
| 451 | |
| 452 | <span class="md-ellipsis"> |
| 453 | |
| 454 | |
| 455 | Installation |
| 456 | |
| 457 | |
| 458 | |
| 459 | </span> |
| 460 | |
| 461 | |
| 462 | |
| 463 | </a> |
| 464 | </li> |
| 465 | |
| 466 | |
| 467 | |
| 468 | |
| 469 | |
| 470 | |
| 471 | |
| 472 | |
| 473 | |
| 474 | |
| 475 | <li class="md-nav__item"> |
| 476 | <a href="../../getting-started/configuration/" class="md-nav__link"> |
| 477 | |
| 478 | |
| 479 | |
| 480 | <span class="md-ellipsis"> |
| 481 | |
| 482 | |
| 483 | Configuration |
| 484 | |
| 485 | |
| 486 | |
| 487 | </span> |
| 488 | |
| 489 | |
| 490 | |
| 491 | </a> |
| 492 | </li> |
| 493 | |
| 494 | |
| 495 | |
| 496 | |
| 497 | |
| 498 | |
| 499 | |
| 500 | |
| 501 | |
| 502 | |
| 503 | <li class="md-nav__item"> |
| 504 | <a href="../../getting-started/first-repo/" class="md-nav__link"> |
| 505 | |
| 506 | |
| 507 | |
| 508 | <span class="md-ellipsis"> |
| 509 | |
| 510 | |
| 511 | First Repository |
| 512 | |
| 513 | |
| 514 | |
| 515 | </span> |
| 516 | |
| 517 | |
| 518 | |
| 519 | </a> |
| 520 | </li> |
| 521 | |
| 522 | |
| 523 | |
| 524 | |
| 525 | </ul> |
| 526 | </nav> |
| 527 | |
| 528 | </li> |
| 529 | |
| 530 | |
| 531 | |
| 532 | |
| 533 | |
| 534 | |
| 535 | |
| 536 | |
| 537 | |
| 538 | |
| 539 | |
| 540 | |
| 541 | |
| 542 | |
| 543 | |
| 544 | |
| 545 | |
| 546 | |
| 547 | |
| 548 | |
| 549 | |
| 550 | |
| 551 | |
| 552 | |
| 553 | <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> |
| 554 | |
| 555 | |
| 556 | |
| 557 | <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked> |
| 558 | |
| 559 | |
| 560 | <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex=""> |
| 561 | |
| 562 | |
| 563 | |
| 564 | <span class="md-ellipsis"> |
| 565 | |
| 566 | |
| 567 | Architecture |
| 568 | |
| 569 | |
| 570 | |
| 571 | </span> |
| 572 | |
| 573 | |
| 574 | |
| 575 | <span class="md-nav__icon md-icon"></span> |
| 576 | </label> |
| 577 | |
| 578 | <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true"> |
| 579 | <label class="md-nav__title" for="__nav_3"> |
| 580 | <span class="md-nav__icon md-icon"></span> |
| 581 | |
| 582 | |
| 583 | Architecture |
| 584 | |
| 585 | |
| 586 | </label> |
| 587 | <ul class="md-nav__list" data-md-scrollfix> |
| 588 | |
| 589 | |
| 590 | |
| 591 | |
| 592 | |
| 593 | |
| 594 | |
| 595 | |
| 596 | |
| 597 | <li class="md-nav__item md-nav__item--active"> |
| 598 | |
| 599 | <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> |
| 600 | |
| 601 | |
| 602 | |
| 603 | |
| 604 | |
| 605 | <label class="md-nav__link md-nav__link--active" for="__toc"> |
| 606 | |
| 607 | |
| 608 | |
| 609 | <span class="md-ellipsis"> |
| 610 | |
| 611 | |
| 612 | Overview |
| 613 | |
| 614 | |
| 615 | |
| 616 | </span> |
| 617 | |
| 618 | |
| 619 | |
| 620 | <span class="md-nav__icon md-icon"></span> |
| 621 | </label> |
| 622 | |
| 623 | <a href="./" class="md-nav__link md-nav__link--active"> |
| 624 | |
| 625 | |
| 626 | |
| 627 | <span class="md-ellipsis"> |
| 628 | |
| 629 | |
| 630 | Overview |
| 631 | |
| 632 | |
| 633 | |
| 634 | </span> |
| 635 | |
| 636 | |
| 637 | |
| 638 | </a> |
| 639 | |
| 640 | |
| 641 | |
| 642 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> |
| 643 | |
| 644 | |
| 645 | |
| 646 | |
| 647 | |
| 648 | |
| 649 | <label class="md-nav__title" for="__toc"> |
| 650 | <span class="md-nav__icon md-icon"></span> |
| 651 | Table of contents |
| 652 | </label> |
| 653 | <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> |
| 654 | |
| 655 | <li class="md-nav__item"> |
| 656 | <a href="#system-diagram" class="md-nav__link"> |
| 657 | <span class="md-ellipsis"> |
| 658 | |
| 659 | System Diagram |
| 660 | |
| 661 | </span> |
| 662 | </a> |
| 663 | |
| 664 | </li> |
| 665 | |
| 666 | <li class="md-nav__item"> |
| 667 | <a href="#components" class="md-nav__link"> |
| 668 | <span class="md-ellipsis"> |
| 669 | |
| 670 | Components |
| 671 | |
| 672 | </span> |
| 673 | </a> |
| 674 | |
| 675 | <nav class="md-nav" aria-label="Components"> |
| 676 | <ul class="md-nav__list"> |
| 677 | |
| 678 | <li class="md-nav__item"> |
| 679 | <a href="#fossil-server" class="md-nav__link"> |
| 680 | <span class="md-ellipsis"> |
| 681 | |
| 682 | Fossil Server |
| 683 | |
| 684 | </span> |
| 685 | </a> |
| 686 | |
| 687 | </li> |
| 688 | |
| 689 | <li class="md-nav__item"> |
| 690 | <a href="#caddy" class="md-nav__link"> |
| 691 | <span class="md-ellipsis"> |
| 692 | |
| 693 | Caddy |
| 694 | |
| 695 | </span> |
| 696 | </a> |
| 697 | |
| 698 | </li> |
| 699 | |
| 700 | <li class="md-nav__item"> |
| 701 | <a href="#django-management-layer" class="md-nav__link"> |
| 702 | <span class="md-ellipsis"> |
| 703 | |
| 704 | Django Management Layer |
| 705 | |
| 706 | </span> |
| 707 | </a> |
| 708 | |
| 709 | </li> |
| 710 | |
| 711 | <li class="md-nav__item"> |
| 712 | <a href="#litestream" class="md-nav__link"> |
| 713 | <span class="md-ellipsis"> |
| 714 | |
| 715 | Litestream |
| 716 | |
| 717 | </span> |
| 718 | </a> |
| 719 | |
| 720 | </li> |
| 721 | |
| 722 | <li class="md-nav__item"> |
| 723 | <a href="#celery-workers" class="md-nav__link"> |
| 724 | <span class="md-ellipsis"> |
| 725 | |
| 726 | Celery Workers |
| 727 | |
| 728 | </span> |
| 729 | </a> |
| 730 | |
| 731 | </li> |
| 732 | |
| 733 | </ul> |
| 734 | </nav> |
| 735 | |
| 736 | </li> |
| 737 | |
| 738 | <li class="md-nav__item"> |
| 739 | <a href="#data-flow" class="md-nav__link"> |
| 740 | <span class="md-ellipsis"> |
| 741 | |
| 742 | Data Flow |
| 743 | |
| 744 | </span> |
| 745 | </a> |
| 746 | |
| 747 | </li> |
| 748 | |
| 749 | </ul> |
| 750 | |
| 751 | </nav> |
| 752 | |
| 753 | </li> |
| 754 | |
| 755 | |
| 756 | |
| 757 | |
| 758 | |
| 759 | |
| 760 | |
| 761 | |
| 762 | |
| 763 | |
| 764 | <li class="md-nav__item"> |
| 765 | <a href="../sync-bridge/" class="md-nav__link"> |
| 766 | |
| 767 | |
| 768 | |
| 769 | <span class="md-ellipsis"> |
| 770 | |
| 771 | |
| 772 | Sync Bridge |
| 773 | |
| 774 | |
| 775 | |
| 776 | </span> |
| 777 | |
| 778 | |
| 779 | |
| 780 | </a> |
| 781 | </li> |
| 782 | |
| 783 | |
| 784 | |
| 785 | |
| 786 | </ul> |
| 787 | </nav> |
| 788 | |
| 789 | </li> |
| 790 | |
| 791 | |
| 792 | |
| 793 | </ul> |
| 794 | </nav> |
| 795 | </div> |
| 796 | </div> |
| 797 | </div> |
| 798 | |
| 799 | |
| 800 | |
| 801 | <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > |
| 802 | <div class="md-sidebar__scrollwrap"> |
| 803 | <div class="md-sidebar__inner"> |
| 804 | |
| 805 | |
| 806 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> |
| 807 | |
| 808 | |
| 809 | |
| 810 | |
| 811 | |
| 812 | |
| 813 | <label class="md-nav__title" for="__toc"> |
| 814 | <span class="md-nav__icon md-icon"></span> |
| 815 | Table of contents |
| 816 | </label> |
| 817 | <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> |
| 818 | |
| 819 | <li class="md-nav__item"> |
| 820 | <a href="#system-diagram" class="md-nav__link"> |
| 821 | <span class="md-ellipsis"> |
| 822 | |
| 823 | System Diagram |
| 824 | |
| 825 | </span> |
| 826 | </a> |
| 827 | |
| 828 | </li> |
| 829 | |
| 830 | <li class="md-nav__item"> |
| 831 | <a href="#components" class="md-nav__link"> |
| 832 | <span class="md-ellipsis"> |
| 833 | |
| 834 | Components |
| 835 | |
| 836 | </span> |
| 837 | </a> |
| 838 | |
| 839 | <nav class="md-nav" aria-label="Components"> |
| 840 | <ul class="md-nav__list"> |
| 841 | |
| 842 | <li class="md-nav__item"> |
| 843 | <a href="#fossil-server" class="md-nav__link"> |
| 844 | <span class="md-ellipsis"> |
| 845 | |
| 846 | Fossil Server |
| 847 | |
| 848 | </span> |
| 849 | </a> |
| 850 | |
| 851 | </li> |
| 852 | |
| 853 | <li class="md-nav__item"> |
| 854 | <a href="#caddy" class="md-nav__link"> |
| 855 | <span class="md-ellipsis"> |
| 856 | |
| 857 | Caddy |
| 858 | |
| 859 | </span> |
| 860 | </a> |
| 861 | |
| 862 | </li> |
| 863 | |
| 864 | <li class="md-nav__item"> |
| 865 | <a href="#django-management-layer" class="md-nav__link"> |
| 866 | <span class="md-ellipsis"> |
| 867 | |
| 868 | Django Management Layer |
| 869 | |
| 870 | </span> |
| 871 | </a> |
| 872 | |
| 873 | </li> |
| 874 | |
| 875 | <li class="md-nav__item"> |
| 876 | <a href="#litestream" class="md-nav__link"> |
| 877 | <span class="md-ellipsis"> |
| 878 | |
| 879 | Litestream |
| 880 | |
| 881 | </span> |
| 882 | </a> |
| 883 | |
| 884 | </li> |
| 885 | |
| 886 | <li class="md-nav__item"> |
| 887 | <a href="#celery-workers" class="md-nav__link"> |
| 888 | <span class="md-ellipsis"> |
| 889 | |
| 890 | Celery Workers |
| 891 | |
| 892 | </span> |
| 893 | </a> |
| 894 | |
| 895 | </li> |
| 896 | |
| 897 | </ul> |
| 898 | </nav> |
| 899 | |
| 900 | </li> |
| 901 | |
| 902 | <li class="md-nav__item"> |
| 903 | <a href="#data-flow" class="md-nav__link"> |
| 904 | <span class="md-ellipsis"> |
| 905 | |
| 906 | Data Flow |
| 907 | |
| 908 | </span> |
| 909 | </a> |
| 910 | |
| 911 | </li> |
| 912 | |
| 913 | </ul> |
| 914 | |
| 915 | </nav> |
| 916 | </div> |
| 917 | </div> |
| 918 | </div> |
| 919 | |
| 920 | |
| 921 | |
| 922 | <div class="md-content" data-md-component="content"> |
| 923 | |
| 924 | <article class="md-content__inner md-typeset"> |
| 925 | |
| 926 | |
| 927 | |
| 928 | |
| 929 | |
| 930 | |
| 931 | |
| 932 | |
| 933 | <h1 id="architecture-overview">Architecture Overview<a class="headerlink" href="#architecture-overview" title="Permanent link">¶</a></h1> |
| 934 | <p>Fossilrepo is a thin orchestration layer around Fossil SCM. Fossil does the heavy lifting -- fossilrepo handles provisioning, routing, backups, and the management UI.</p> |
| 935 | <h2 id="system-diagram">System Diagram<a class="headerlink" href="#system-diagram" title="Permanent link">¶</a></h2> |
| 936 | <pre class="mermaid"><code>graph TB |
| 937 | subgraph Internet |
| 938 | User[User / Browser] |
| 939 | end |
| 940 | |
| 941 | subgraph Fossilrepo Server |
| 942 | Caddy[Caddy<br/>SSL + Routing] |
| 943 | Django[Django<br/>Management UI] |
| 944 | Fossil[Fossil Server<br/>--repolist] |
| 945 | Celery[Celery Workers] |
| 946 | Redis[Redis] |
| 947 | Postgres[(PostgreSQL)] |
| 948 | Litestream[Litestream] |
| 949 | end |
| 950 | |
| 951 | subgraph Storage |
| 952 | Repos["/data/repos/<br/>*.fossil files"] |
| 953 | S3[(S3 / MinIO)] |
| 954 | end |
| 955 | |
| 956 | subgraph Mirrors |
| 957 | GitHub[GitHub] |
| 958 | GitLab[GitLab] |
| 959 | end |
| 960 | |
| 961 | User --> Caddy |
| 962 | Caddy -->|"app.domain.com"| Django |
| 963 | Caddy -->|"repo.domain.com"| Fossil |
| 964 | Django --> Postgres |
| 965 | Django --> Redis |
| 966 | Celery --> Redis |
| 967 | Celery -->|sync bridge| GitHub |
| 968 | Celery -->|sync bridge| GitLab |
| 969 | Fossil --> Repos |
| 970 | Litestream --> Repos |
| 971 | Litestream --> S3</code></pre> |
| 972 | <h2 id="components">Components<a class="headerlink" href="#components" title="Permanent link">¶</a></h2> |
| 973 | <h3 id="fossil-server">Fossil Server<a class="headerlink" href="#fossil-server" title="Permanent link">¶</a></h3> |
| 974 | <p>A single <code>fossil server --repolist /data/repos/</code> process serves all repositories. Each <code>.fossil</code> file is a self-contained SQLite database with VCS history, issues, wiki, and forum.</p> |
| 975 | <p>Adding a new repo is just <code>fossil init /data/repos/name.fossil</code> -- no restart needed.</p> |
| 976 | <h3 id="caddy">Caddy<a class="headerlink" href="#caddy" title="Permanent link">¶</a></h3> |
| 977 | <p>Handles SSL termination and subdomain routing:</p> |
| 978 | <ul> |
| 979 | <li><code>your-domain.com</code> routes to the Django management UI</li> |
| 980 | <li><code>reponame.your-domain.com</code> routes directly to Fossil's web UI</li> |
| 981 | </ul> |
| 982 | <p>Caddy automatically provisions and renews Let's Encrypt certificates.</p> |
| 983 | <h3 id="django-management-layer">Django Management Layer<a class="headerlink" href="#django-management-layer" title="Permanent link">¶</a></h3> |
| 984 | <p>Provides the administrative interface:</p> |
| 985 | <ul> |
| 986 | <li>Repository lifecycle (create, configure, archive)</li> |
| 987 | <li>User and organization management</li> |
| 988 | <li>Dashboard and analytics</li> |
| 989 | <li>Sync bridge configuration</li> |
| 990 | </ul> |
| 991 | <p>Django uses HTMX for interactive UI without a JavaScript framework.</p> |
| 992 | <h3 id="litestream">Litestream<a class="headerlink" href="#litestream" title="Permanent link">¶</a></h3> |
| 993 | <p>Continuously replicates every <code>.fossil</code> SQLite file to S3-compatible storage. Provides:</p> |
| 994 | <ul> |
| 995 | <li><strong>Continuous backup</strong> -- WAL frames replicated in near-real-time</li> |
| 996 | <li><strong>Point-in-time recovery</strong> -- restore to any moment, not just snapshots</li> |
| 997 | <li><strong>Zero-config per repo</strong> -- new <code>.fossil</code> files are picked up automatically</li> |
| 998 | </ul> |
| 999 | <h3 id="celery-workers">Celery Workers<a class="headerlink" href="#celery-workers" title="Permanent link">¶</a></h3> |
| 1000 | <p>Handle background tasks:</p> |
| 1001 | <ul> |
| 1002 | <li>Sync bridge execution (Fossil to Git mirroring)</li> |
| 1003 | <li>Scheduled sync jobs</li> |
| 1004 | <li>Upstream pull operations</li> |
| 1005 | </ul> |
| 1006 | <h2 id="data-flow">Data Flow<a class="headerlink" href="#data-flow" title="Permanent link">¶</a></h2> |
| 1007 | <ol> |
| 1008 | <li><strong>User pushes to Fossil</strong> -- standard <code>fossil push</code> or <code>fossil sync</code></li> |
| 1009 | <li><strong>Fossil writes to <code>.fossil</code> file</strong> -- SQLite transactions</li> |
| 1010 | <li><strong>Litestream replicates</strong> -- WAL frames streamed to S3</li> |
| 1011 | <li><strong>Sync bridge runs</strong> -- Celery task mirrors changes to Git remotes</li> |
| 1012 | <li><strong>Django reflects state</strong> -- reads from Fossil SQLite for dashboards</li> |
| 1013 | </ol> |
| 1014 | <p>Fossil is always the source of truth. Everything else is derived.</p> |
| 1015 | |
| 1016 | |
| 1017 | |
| 1018 | |
| 1019 | |
| 1020 | |
| 1021 | |
| 1022 | |
| 1023 | |
| 1024 | |
| 1025 | |
| 1026 | |
| 1027 | |
| 1028 | </article> |
| 1029 | </div> |
| 1030 | |
| 1031 | |
| 1032 | <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> |
| 1033 | |
| 1034 | <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> |
| 1035 | </div> |
| 1036 | |
| 1037 | <button type="button" class="md-top md-icon" data-md-component="top" hidden> |
| 1038 | |
| 1039 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> |
| 1040 | Back to top |
| 1041 | </button> |
| 1042 | |
| 1043 | </main> |
| 1044 | |
| 1045 | <footer class="md-footer"> |
| 1046 | |
| 1047 | <div class="md-footer-meta md-typeset"> |
| 1048 | <div class="md-footer-meta__inner md-grid"> |
| 1049 | <div class="md-copyright"> |
| 1050 | |
| 1051 | <div class="md-copyright__highlight"> |
| 1052 | Copyright © 2026 CONFLICT LLC |
| 1053 | </div> |
| 1054 | |
| 1055 | |
| 1056 | Made with |
| 1057 | <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> |
| 1058 | Material for MkDocs |
| 1059 | </a> |
| 1060 | |
| 1061 | </div> |
| 1062 | |
| 1063 | |
| 1064 | <div class="md-social"> |
| 1065 | |
| 1066 | |
| 1067 | |
| 1068 | |
| 1069 | |
| 1070 | |
| 1071 | |
| 1072 | |
| 1073 | <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link"> |
| 1074 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 1075 | </a> |
| 1076 | |
| 1077 | </div> |
| 1078 | |
| 1079 | </div> |
| 1080 | </div> |
| 1081 | </footer> |
| 1082 | |
| 1083 | </div> |
| 1084 | <div class="md-dialog" data-md-component="dialog"> |
| 1085 | <div class="md-dialog__inner md-typeset"></div> |
| 1086 | </div> |
| 1087 | |
| 1088 | |
| 1089 | |
| 1090 | |
| 1091 | |
| 1092 | <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> |
| 1093 | |
| 1094 | |
| 1095 | <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script> |
| 1096 | |
| 1097 | |
| 1098 | </body> |
| 1099 | </html> |
| --- a/site/architecture/sync-bridge/index.html | ||
| +++ b/site/architecture/sync-bridge/index.html | ||
| @@ -0,0 +1,1077 @@ | ||
| 1 | + | |
| 2 | +<!doctype html> | |
| 3 | +<html lang="en" class="no-js"> | |
| 4 | + <head> | |
| 5 | + | |
| 6 | + <meta charset="utf-8"> | |
| 7 | + <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| 8 | + | |
| 9 | + <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting"> | |
| 10 | + | |
| 11 | + | |
| 12 | + <meta name="author" content="CONFLICT LLC"> | |
| 13 | + | |
| 14 | + | |
| 15 | + <link rel="canonical" href="https://fossilrepo.dev/architecture/sync-bridge/"> | |
| 16 | + | |
| 17 | + | |
| 18 | + <link rel="prev" href="../overview/"> | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + <link rel="icon" href="../../assets/images/favicon.png"> | |
| 26 | + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6"> | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + <title>Sync Bridge - Fossilrepo</title> | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css"> | |
| 35 | + | |
| 36 | + | |
| 37 | + <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css"> | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | |
| 51 | + <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> | |
| 52 | + <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + <link rel="stylesheet" href="../../assets/css/custom.css"> | |
| 57 | + | |
| 58 | + <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + </head> | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"> | |
| 75 | + | |
| 76 | + | |
| 77 | + <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> | |
| 78 | + <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> | |
| 79 | + <label class="md-overlay" for="__drawer"></label> | |
| 80 | + <div data-md-component="skip"> | |
| 81 | + | |
| 82 | + | |
| 83 | + <a href="#sync-bridge" class="md-skip"> | |
| 84 | + Skip to content | |
| 85 | + </a> | |
| 86 | + | |
| 87 | + </div> | |
| 88 | + <div data-md-component="announce"> | |
| 89 | + | |
| 90 | + </div> | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | +<header class="md-header" data-md-component="header"> | |
| 96 | + <nav class="md-header__inner md-grid" aria-label="Header"> | |
| 97 | + <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> | |
| 98 | + <div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 99 | + <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 100 | + <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 101 | +</div> | |
| 102 | + </a> | |
| 103 | + <label class="md-header__button md-icon" for="__drawer"> | |
| 104 | + | |
| 105 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> | |
| 106 | + </label> | |
| 107 | + <div class="md-header__title" data-md-component="header-title"> | |
| 108 | + <div class="md-header__ellipsis"> | |
| 109 | + <div class="md-header__topic"> | |
| 110 | + <span class="md-ellipsis"> | |
| 111 | + Fossilrepo | |
| 112 | + </span> | |
| 113 | + </div> | |
| 114 | + <div class="md-header__topic" data-md-component="header-topic"> | |
| 115 | + <span class="md-ellipsis"> | |
| 116 | + | |
| 117 | + Sync Bridge | |
| 118 | + | |
| 119 | + </span> | |
| 120 | + </div> | |
| 121 | + </div> | |
| 122 | + </div> | |
| 123 | + | |
| 124 | + | |
| 125 | + <form class="md-header__option" data-md-component="palette"> | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> | |
| 131 | + | |
| 132 | + <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> | |
| 133 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> | |
| 134 | + </label> | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> | |
| 141 | + | |
| 142 | + <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> | |
| 143 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> | |
| 144 | + </label> | |
| 145 | + | |
| 146 | + | |
| 147 | +</form> | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + <label class="md-header__button md-icon" for="__search"> | |
| 158 | + | |
| 159 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> | |
| 160 | + </label> | |
| 161 | + <div class="md-search" data-md-component="search" role="dialog"> | |
| 162 | + <label class="md-search__overlay" for="__search"></label> | |
| 163 | + <div class="md-search__inner" role="search"> | |
| 164 | + <form class="md-search__form" name="search"> | |
| 165 | + <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> | |
| 166 | + <label class="md-search__icon md-icon" for="__search"> | |
| 167 | + | |
| 168 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> | |
| 169 | + | |
| 170 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> | |
| 171 | + </label> | |
| 172 | + <nav class="md-search__options" aria-label="Search"> | |
| 173 | + | |
| 174 | + <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> | |
| 175 | + | |
| 176 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> | |
| 177 | + </button> | |
| 178 | + </nav> | |
| 179 | + | |
| 180 | + <div class="md-search__suggest" data-md-component="search-suggest"></div> | |
| 181 | + | |
| 182 | + </form> | |
| 183 | + <div class="md-search__output"> | |
| 184 | + <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> | |
| 185 | + <div class="md-search-result" data-md-component="search-result"> | |
| 186 | + <div class="md-search-result__meta"> | |
| 187 | + Initializing search | |
| 188 | + </div> | |
| 189 | + <ol class="md-search-result__list" role="presentation"></ol> | |
| 190 | + </div> | |
| 191 | + </div> | |
| 192 | + </div> | |
| 193 | + </div> | |
| 194 | +</div> | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + <div class="md-header__source"> | |
| 199 | + <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> | |
| 200 | + <div class="md-source__icon md-icon"> | |
| 201 | + | |
| 202 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 203 | + </div> | |
| 204 | + <div class="md-source__repository"> | |
| 205 | + ConflictHQ/fossilrepo | |
| 206 | + </div> | |
| 207 | +</a> | |
| 208 | + </div> | |
| 209 | + | |
| 210 | + </nav> | |
| 211 | + | |
| 212 | +</header> | |
| 213 | + | |
| 214 | + <div class="md-container" data-md-component="container"> | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | +<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> | |
| 221 | + <div class="md-grid"> | |
| 222 | + <ul class="md-tabs__list"> | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + <li class="md-tabs__item"> | |
| 230 | + <a href="../.." class="md-tabs__link"> | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + Home | |
| 237 | + | |
| 238 | + </a> | |
| 239 | + </li> | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + <li class="md-tabs__item"> | |
| 251 | + <a href="../../getting-started/prerequisites/" class="md-tabs__link"> | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + Getting Started | |
| 256 | + | |
| 257 | + </a> | |
| 258 | + </li> | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + <li class="md-tabs__item md-tabs__item--active"> | |
| 273 | + <a href="../overview/" class="md-tabs__link"> | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + Architecture | |
| 278 | + | |
| 279 | + </a> | |
| 280 | + </li> | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + </ul> | |
| 286 | + </div> | |
| 287 | +</nav> | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + <main class="md-main" data-md-component="main"> | |
| 292 | + <div class="md-main__inner md-grid"> | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > | |
| 297 | + <div class="md-sidebar__scrollwrap"> | |
| 298 | + <div class="md-sidebar__inner"> | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | +<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> | |
| 306 | + <label class="md-nav__title" for="__drawer"> | |
| 307 | + <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> | |
| 308 | + <div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 309 | + <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 310 | + <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 311 | +</div> | |
| 312 | + </a> | |
| 313 | + Fossilrepo | |
| 314 | + </label> | |
| 315 | + | |
| 316 | + <div class="md-nav__source"> | |
| 317 | + <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> | |
| 318 | + <div class="md-source__icon md-icon"> | |
| 319 | + | |
| 320 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 321 | + </div> | |
| 322 | + <div class="md-source__repository"> | |
| 323 | + ConflictHQ/fossilrepo | |
| 324 | + </div> | |
| 325 | +</a> | |
| 326 | + </div> | |
| 327 | + | |
| 328 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + <li class="md-nav__item"> | |
| 337 | + <a href="../.." class="md-nav__link"> | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + <span class="md-ellipsis"> | |
| 342 | + | |
| 343 | + | |
| 344 | + Home | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + </span> | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + </a> | |
| 353 | + </li> | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + <li class="md-nav__item md-nav__item--nested"> | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" > | |
| 380 | + | |
| 381 | + | |
| 382 | + <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0"> | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + <span class="md-ellipsis"> | |
| 387 | + | |
| 388 | + | |
| 389 | + Getting Started | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + </span> | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + <span class="md-nav__icon md-icon"></span> | |
| 398 | + </label> | |
| 399 | + | |
| 400 | + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false"> | |
| 401 | + <label class="md-nav__title" for="__nav_2"> | |
| 402 | + <span class="md-nav__icon md-icon"></span> | |
| 403 | + | |
| 404 | + | |
| 405 | + Getting Started | |
| 406 | + | |
| 407 | + | |
| 408 | + </label> | |
| 409 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + <li class="md-nav__item"> | |
| 418 | + <a href="../../getting-started/prerequisites/" class="md-nav__link"> | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + <span class="md-ellipsis"> | |
| 423 | + | |
| 424 | + | |
| 425 | + Prerequisites | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + </span> | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + </a> | |
| 434 | + </li> | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + <li class="md-nav__item"> | |
| 446 | + <a href="../../getting-started/installation/" class="md-nav__link"> | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + <span class="md-ellipsis"> | |
| 451 | + | |
| 452 | + | |
| 453 | + Installation | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + </span> | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + </a> | |
| 462 | + </li> | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + <li class="md-nav__item"> | |
| 474 | + <a href="../../getting-started/configuration/" class="md-nav__link"> | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + <span class="md-ellipsis"> | |
| 479 | + | |
| 480 | + | |
| 481 | + Configuration | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + </span> | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + </a> | |
| 490 | + </li> | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + <li class="md-nav__item"> | |
| 502 | + <a href="../../getting-started/first-repo/" class="md-nav__link"> | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + <span class="md-ellipsis"> | |
| 507 | + | |
| 508 | + | |
| 509 | + First Repository | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + </span> | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + </a> | |
| 518 | + </li> | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + </ul> | |
| 524 | + </nav> | |
| 525 | + | |
| 526 | + </li> | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + | |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked> | |
| 556 | + | |
| 557 | + | |
| 558 | + <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex=""> | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + <span class="md-ellipsis"> | |
| 563 | + | |
| 564 | + | |
| 565 | + Architecture | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + </span> | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + <span class="md-nav__icon md-icon"></span> | |
| 574 | + </label> | |
| 575 | + | |
| 576 | + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true"> | |
| 577 | + <label class="md-nav__title" for="__nav_3"> | |
| 578 | + <span class="md-nav__icon md-icon"></span> | |
| 579 | + | |
| 580 | + | |
| 581 | + Architecture | |
| 582 | + | |
| 583 | + | |
| 584 | + </label> | |
| 585 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 586 | + | |
| 587 | + | |
| 588 | + | |
| 589 | + | |
| 590 | + | |
| 591 | + | |
| 592 | + | |
| 593 | + <li class="md-nav__item"> | |
| 594 | + <a href="../overview/" class="md-nav__link"> | |
| 595 | + | |
| 596 | + | |
| 597 | + | |
| 598 | + <span class="md-ellipsis"> | |
| 599 | + | |
| 600 | + | |
| 601 | + Overview | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + </span> | |
| 606 | + | |
| 607 | + | |
| 608 | + | |
| 609 | + </a> | |
| 610 | + </li> | |
| 611 | + | |
| 612 | + | |
| 613 | + | |
| 614 | + | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
| 620 | + | |
| 621 | + | |
| 622 | + | |
| 623 | + <li class="md-nav__item md-nav__item--active"> | |
| 624 | + | |
| 625 | + <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + <label class="md-nav__link md-nav__link--active" for="__toc"> | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + <span class="md-ellipsis"> | |
| 636 | + | |
| 637 | + | |
| 638 | + Sync Bridge | |
| 639 | + | |
| 640 | + | |
| 641 | + | |
| 642 | + </span> | |
| 643 | + | |
| 644 | + | |
| 645 | + | |
| 646 | + <span class="md-nav__icon md-icon"></span> | |
| 647 | + </label> | |
| 648 | + | |
| 649 | + <a href="./" class="md-nav__link md-nav__link--active"> | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + <span class="md-ellipsis"> | |
| 654 | + | |
| 655 | + | |
| 656 | + Sync Bridge | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + </span> | |
| 661 | + | |
| 662 | + | |
| 663 | + | |
| 664 | + </a> | |
| 665 | + | |
| 666 | + | |
| 667 | + | |
| 668 | +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
| 669 | + | |
| 670 | + | |
| 671 | + | |
| 672 | + | |
| 673 | + | |
| 674 | + | |
| 675 | + <label class="md-nav__title" for="__toc"> | |
| 676 | + <span class="md-nav__icon md-icon"></span> | |
| 677 | + Table of contents | |
| 678 | + </label> | |
| 679 | + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> | |
| 680 | + | |
| 681 | + <li class="md-nav__item"> | |
| 682 | + <a href="#how-it-works" class="md-nav__link"> | |
| 683 | + <span class="md-ellipsis"> | |
| 684 | + | |
| 685 | + How It Works | |
| 686 | + | |
| 687 | + </span> | |
| 688 | + </a> | |
| 689 | + | |
| 690 | +</li> | |
| 691 | + | |
| 692 | + <li class="md-nav__item"> | |
| 693 | + <a href="#what-gets-synced" class="md-nav__link"> | |
| 694 | + <span class="md-ellipsis"> | |
| 695 | + | |
| 696 | + What Gets Synced | |
| 697 | + | |
| 698 | + </span> | |
| 699 | + </a> | |
| 700 | + | |
| 701 | +</li> | |
| 702 | + | |
| 703 | + <li class="md-nav__item"> | |
| 704 | + <a href="#configuration" class="md-nav__link"> | |
| 705 | + <span class="md-ellipsis"> | |
| 706 | + | |
| 707 | + Configuration | |
| 708 | + | |
| 709 | + </span> | |
| 710 | + </a> | |
| 711 | + | |
| 712 | +</li> | |
| 713 | + | |
| 714 | + <li class="md-nav__item"> | |
| 715 | + <a href="#sync-modes" class="md-nav__link"> | |
| 716 | + <span class="md-ellipsis"> | |
| 717 | + | |
| 718 | + Sync Modes | |
| 719 | + | |
| 720 | + </span> | |
| 721 | + </a> | |
| 722 | + | |
| 723 | + <nav class="md-nav" aria-label="Sync Modes"> | |
| 724 | + <ul class="md-nav__list"> | |
| 725 | + | |
| 726 | + <li class="md-nav__item"> | |
| 727 | + <a href="#on-demand" class="md-nav__link"> | |
| 728 | + <span class="md-ellipsis"> | |
| 729 | + | |
| 730 | + On-Demand | |
| 731 | + | |
| 732 | + </span> | |
| 733 | + </a> | |
| 734 | + | |
| 735 | +</li> | |
| 736 | + | |
| 737 | + <li class="md-nav__item"> | |
| 738 | + <a href="#scheduled" class="md-nav__link"> | |
| 739 | + <span class="md-ellipsis"> | |
| 740 | + | |
| 741 | + Scheduled | |
| 742 | + | |
| 743 | + </span> | |
| 744 | + </a> | |
| 745 | + | |
| 746 | +</li> | |
| 747 | + | |
| 748 | + <li class="md-nav__item"> | |
| 749 | + <a href="#upstream-pull" class="md-nav__link"> | |
| 750 | + <span class="md-ellipsis"> | |
| 751 | + | |
| 752 | + Upstream Pull | |
| 753 | + | |
| 754 | + </span> | |
| 755 | + </a> | |
| 756 | + | |
| 757 | +</li> | |
| 758 | + | |
| 759 | + </ul> | |
| 760 | + </nav> | |
| 761 | + | |
| 762 | +</li> | |
| 763 | + | |
| 764 | + </ul> | |
| 765 | + | |
| 766 | +</nav> | |
| 767 | + | |
| 768 | + </li> | |
| 769 | + | |
| 770 | + | |
| 771 | + | |
| 772 | + | |
| 773 | + </ul> | |
| 774 | + </nav> | |
| 775 | + | |
| 776 | + </li> | |
| 777 | + | |
| 778 | + | |
| 779 | + | |
| 780 | + </ul> | |
| 781 | +</nav> | |
| 782 | + </div> | |
| 783 | + </div> | |
| 784 | + </div> | |
| 785 | + | |
| 786 | + | |
| 787 | + | |
| 788 | + <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > | |
| 789 | + <div class="md-sidebar__scrollwrap"> | |
| 790 | + <div class="md-sidebar__inner"> | |
| 791 | + | |
| 792 | + | |
| 793 | +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
| 794 | + | |
| 795 | + | |
| 796 | + | |
| 797 | + | |
| 798 | + | |
| 799 | + | |
| 800 | + <label class="md-nav__title" for="__toc"> | |
| 801 | + <span class="md-nav__icon md-icon"></span> | |
| 802 | + Table of contents | |
| 803 | + </label> | |
| 804 | + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> | |
| 805 | + | |
| 806 | + <li class="md-nav__item"> | |
| 807 | + <a href="#how-it-works" class="md-nav__link"> | |
| 808 | + <span class="md-ellipsis"> | |
| 809 | + | |
| 810 | + How It Works | |
| 811 | + | |
| 812 | + </span> | |
| 813 | + </a> | |
| 814 | + | |
| 815 | +</li> | |
| 816 | + | |
| 817 | + <li class="md-nav__item"> | |
| 818 | + <a href="#what-gets-synced" class="md-nav__link"> | |
| 819 | + <span class="md-ellipsis"> | |
| 820 | + | |
| 821 | + What Gets Synced | |
| 822 | + | |
| 823 | + </span> | |
| 824 | + </a> | |
| 825 | + | |
| 826 | +</li> | |
| 827 | + | |
| 828 | + <li class="md-nav__item"> | |
| 829 | + <a href="#configuration" class="md-nav__link"> | |
| 830 | + <span class="md-ellipsis"> | |
| 831 | + | |
| 832 | + Configuration | |
| 833 | + | |
| 834 | + </span> | |
| 835 | + </a> | |
| 836 | + | |
| 837 | +</li> | |
| 838 | + | |
| 839 | + <li class="md-nav__item"> | |
| 840 | + <a href="#sync-modes" class="md-nav__link"> | |
| 841 | + <span class="md-ellipsis"> | |
| 842 | + | |
| 843 | + Sync Modes | |
| 844 | + | |
| 845 | + </span> | |
| 846 | + </a> | |
| 847 | + | |
| 848 | + <nav class="md-nav" aria-label="Sync Modes"> | |
| 849 | + <ul class="md-nav__list"> | |
| 850 | + | |
| 851 | + <li class="md-nav__item"> | |
| 852 | + <a href="#on-demand" class="md-nav__link"> | |
| 853 | + <span class="md-ellipsis"> | |
| 854 | + | |
| 855 | + On-Demand | |
| 856 | + | |
| 857 | + </span> | |
| 858 | + </a> | |
| 859 | + | |
| 860 | +</li> | |
| 861 | + | |
| 862 | + <li class="md-nav__item"> | |
| 863 | + <a href="#scheduled" class="md-nav__link"> | |
| 864 | + <span class="md-ellipsis"> | |
| 865 | + | |
| 866 | + Scheduled | |
| 867 | + | |
| 868 | + </span> | |
| 869 | + </a> | |
| 870 | + | |
| 871 | +</li> | |
| 872 | + | |
| 873 | + <li class="md-nav__item"> | |
| 874 | + <a href="#upstream-pull" class="md-nav__link"> | |
| 875 | + <span class="md-ellipsis"> | |
| 876 | + | |
| 877 | + Upstream Pull | |
| 878 | + | |
| 879 | + </span> | |
| 880 | + </a> | |
| 881 | + | |
| 882 | +</li> | |
| 883 | + | |
| 884 | + </ul> | |
| 885 | + </nav> | |
| 886 | + | |
| 887 | +</li> | |
| 888 | + | |
| 889 | + </ul> | |
| 890 | + | |
| 891 | +</nav> | |
| 892 | + </div> | |
| 893 | + </div> | |
| 894 | + </div> | |
| 895 | + | |
| 896 | + | |
| 897 | + | |
| 898 | + <div class="md-content" data-md-component="content"> | |
| 899 | + | |
| 900 | + <article class="md-content__inner md-typeset"> | |
| 901 | + | |
| 902 | + | |
| 903 | + | |
| 904 | + | |
| 905 | + | |
| 906 | + | |
| 907 | + | |
| 908 | + | |
| 909 | +<h1 id="sync-bridge">Sync Bridge<a class="headerlink" href="#sync-bridge" title="Permanent link">¶</a></h1> | |
| 910 | +<p>The sync bridge mirrors Fossil repositories to GitHub and GitLab as downstream read-only copies.</p> | |
| 911 | +<h2 id="how-it-works">How It Works<a class="headerlink" href="#how-it-works" title="Permanent link">¶</a></h2> | |
| 912 | +<pre class="mermaid"><code>flowchart LR | |
| 913 | + Fossil["Fossil Repo<br/>(source of truth)"] --> Bridge["Sync Bridge<br/>(Celery task)"] | |
| 914 | + Bridge --> Git["Git Export"] | |
| 915 | + Git --> GitHub["GitHub Mirror"] | |
| 916 | + Git --> GitLab["GitLab Mirror"]</code></pre> | |
| 917 | +<p>The bridge:</p> | |
| 918 | +<ol> | |
| 919 | +<li>Exports Fossil commits as Git commits</li> | |
| 920 | +<li>Pushes to configured Git remotes</li> | |
| 921 | +<li>Optionally syncs tickets to GitHub/GitLab Issues</li> | |
| 922 | +<li>Optionally syncs wiki pages to repo docs</li> | |
| 923 | +</ol> | |
| 924 | +<h2 id="what-gets-synced">What Gets Synced<a class="headerlink" href="#what-gets-synced" title="Permanent link">¶</a></h2> | |
| 925 | +<table> | |
| 926 | +<thead> | |
| 927 | +<tr> | |
| 928 | +<th>Fossil Artifact</th> | |
| 929 | +<th>Git Target</th> | |
| 930 | +<th>Configurable</th> | |
| 931 | +</tr> | |
| 932 | +</thead> | |
| 933 | +<tbody> | |
| 934 | +<tr> | |
| 935 | +<td>Commits</td> | |
| 936 | +<td>Git commits</td> | |
| 937 | +<td>Always</td> | |
| 938 | +</tr> | |
| 939 | +<tr> | |
| 940 | +<td>Tags</td> | |
| 941 | +<td>Git tags</td> | |
| 942 | +<td>Always</td> | |
| 943 | +</tr> | |
| 944 | +<tr> | |
| 945 | +<td>Branches</td> | |
| 946 | +<td>Git branches</td> | |
| 947 | +<td>Always</td> | |
| 948 | +</tr> | |
| 949 | +<tr> | |
| 950 | +<td>Tickets</td> | |
| 951 | +<td>GitHub/GitLab Issues</td> | |
| 952 | +<td>Optional</td> | |
| 953 | +</tr> | |
| 954 | +<tr> | |
| 955 | +<td>Wiki</td> | |
| 956 | +<td>Repository docs</td> | |
| 957 | +<td>Optional</td> | |
| 958 | +</tr> | |
| 959 | +</tbody> | |
| 960 | +</table> | |
| 961 | +<h2 id="configuration">Configuration<a class="headerlink" href="#configuration" title="Permanent link">¶</a></h2> | |
| 962 | +<p>Set up mirroring through the Django management UI or environment variables:</p> | |
| 963 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># GitHub mirror</span> | |
| 964 | +<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="nv">GITHUB_TOKEN</span><span class="o">=</span>ghp_xxxxxxxxxxxx | |
| 965 | +<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> | |
| 966 | +<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="c1"># GitLab mirror</span> | |
| 967 | +<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="nv">GITLAB_TOKEN</span><span class="o">=</span>glpat-xxxxxxxxxxxx | |
| 968 | +</code></pre></div> | |
| 969 | +<p>Per-repository mirror configuration is managed in the dashboard under <strong>Repository Settings > Sync</strong>.</p> | |
| 970 | +<h2 id="sync-modes">Sync Modes<a class="headerlink" href="#sync-modes" title="Permanent link">¶</a></h2> | |
| 971 | +<h3 id="on-demand">On-Demand<a class="headerlink" href="#on-demand" title="Permanent link">¶</a></h3> | |
| 972 | +<p>Trigger a sync manually from the dashboard or CLI:</p> | |
| 973 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>django<span class="w"> </span>python<span class="w"> </span>manage.py<span class="w"> </span>fossil_sync<span class="w"> </span>my-project | |
| 974 | +</code></pre></div> | |
| 975 | +<h3 id="scheduled">Scheduled<a class="headerlink" href="#scheduled" title="Permanent link">¶</a></h3> | |
| 976 | +<p>Configure a Celery Beat schedule to sync at regular intervals:</p> | |
| 977 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="c1"># Runs every 15 minutes</span> | |
| 978 | +<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="n">CELERY_BEAT_SCHEDULE</span> <span class="o">=</span> <span class="p">{</span> | |
| 979 | +<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a> <span class="s1">'sync-all-repos'</span><span class="p">:</span> <span class="p">{</span> | |
| 980 | +<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a> <span class="s1">'task'</span><span class="p">:</span> <span class="s1">'fossil.tasks.sync_all'</span><span class="p">,</span> | |
| 981 | +<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a> <span class="s1">'schedule'</span><span class="p">:</span> <span class="mf">900.0</span><span class="p">,</span> | |
| 982 | +<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a> <span class="p">},</span> | |
| 983 | +<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="p">}</span> | |
| 984 | +</code></pre></div> | |
| 985 | +<h3 id="upstream-pull">Upstream Pull<a class="headerlink" href="#upstream-pull" title="Permanent link">¶</a></h3> | |
| 986 | +<p>Pull updates from a remote Fossil server into your local instance:</p> | |
| 987 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>django<span class="w"> </span>python<span class="w"> </span>manage.py<span class="w"> </span>fossil_pull<span class="w"> </span>my-project | |
| 988 | +</code></pre></div> | |
| 989 | +<div class="admonition warning"> | |
| 990 | +<p class="admonition-title">Direction matters</p> | |
| 991 | +<p>The sync bridge is <strong>one-way</strong>: Fossil to Git. Changes pushed directly to a Git mirror will be overwritten on the next sync. Always push to the Fossil repo.</p> | |
| 992 | +</div> | |
| 993 | + | |
| 994 | + | |
| 995 | + | |
| 996 | + | |
| 997 | + | |
| 998 | + | |
| 999 | + | |
| 1000 | + | |
| 1001 | + | |
| 1002 | + | |
| 1003 | + | |
| 1004 | + | |
| 1005 | + | |
| 1006 | + </article> | |
| 1007 | + </div> | |
| 1008 | + | |
| 1009 | + | |
| 1010 | + <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> | |
| 1011 | + | |
| 1012 | +<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> | |
| 1013 | + </div> | |
| 1014 | + | |
| 1015 | + <button type="button" class="md-top md-icon" data-md-component="top" hidden> | |
| 1016 | + | |
| 1017 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> | |
| 1018 | + Back to top | |
| 1019 | +</button> | |
| 1020 | + | |
| 1021 | + </main> | |
| 1022 | + | |
| 1023 | + <footer class="md-footer"> | |
| 1024 | + | |
| 1025 | + <div class="md-footer-meta md-typeset"> | |
| 1026 | + <div class="md-footer-meta__inner md-grid"> | |
| 1027 | + <div class="md-copyright"> | |
| 1028 | + | |
| 1029 | + <div class="md-copyright__highlight"> | |
| 1030 | + Copyright © 2026 CONFLICT LLC | |
| 1031 | + </div> | |
| 1032 | + | |
| 1033 | + | |
| 1034 | + Made with | |
| 1035 | + <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> | |
| 1036 | + Material for MkDocs | |
| 1037 | + </a> | |
| 1038 | + | |
| 1039 | +</div> | |
| 1040 | + | |
| 1041 | + | |
| 1042 | +<div class="md-social"> | |
| 1043 | + | |
| 1044 | + | |
| 1045 | + | |
| 1046 | + | |
| 1047 | + | |
| 1048 | + | |
| 1049 | + | |
| 1050 | + | |
| 1051 | + <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link"> | |
| 1052 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 1053 | + </a> | |
| 1054 | + | |
| 1055 | +</div> | |
| 1056 | + | |
| 1057 | + </div> | |
| 1058 | + </div> | |
| 1059 | +</footer> | |
| 1060 | + | |
| 1061 | + </div> | |
| 1062 | + <div class="md-dialog" data-md-component="dialog"> | |
| 1063 | + <div class="md-dialog__inner md-typeset"></div> | |
| 1064 | + </div> | |
| 1065 | + | |
| 1066 | + | |
| 1067 | + | |
| 1068 | + | |
| 1069 | + | |
| 1070 | + <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> | |
| 1071 | + | |
| 1072 | + | |
| 1073 | + <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script> | |
| 1074 | + | |
| 1075 | + | |
| 1076 | + </body> | |
| 1077 | +</html> |
| --- a/site/architecture/sync-bridge/index.html | |
| +++ b/site/architecture/sync-bridge/index.html | |
| @@ -0,0 +1,1077 @@ | |
| --- a/site/architecture/sync-bridge/index.html | |
| +++ b/site/architecture/sync-bridge/index.html | |
| @@ -0,0 +1,1077 @@ | |
| 1 | |
| 2 | <!doctype html> |
| 3 | <html lang="en" class="no-js"> |
| 4 | <head> |
| 5 | |
| 6 | <meta charset="utf-8"> |
| 7 | <meta name="viewport" content="width=device-width,initial-scale=1"> |
| 8 | |
| 9 | <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting"> |
| 10 | |
| 11 | |
| 12 | <meta name="author" content="CONFLICT LLC"> |
| 13 | |
| 14 | |
| 15 | <link rel="canonical" href="https://fossilrepo.dev/architecture/sync-bridge/"> |
| 16 | |
| 17 | |
| 18 | <link rel="prev" href="../overview/"> |
| 19 | |
| 20 | |
| 21 | |
| 22 | |
| 23 | |
| 24 | |
| 25 | <link rel="icon" href="../../assets/images/favicon.png"> |
| 26 | <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6"> |
| 27 | |
| 28 | |
| 29 | |
| 30 | <title>Sync Bridge - Fossilrepo</title> |
| 31 | |
| 32 | |
| 33 | |
| 34 | <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css"> |
| 35 | |
| 36 | |
| 37 | <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css"> |
| 38 | |
| 39 | |
| 40 | |
| 41 | |
| 42 | |
| 43 | |
| 44 | |
| 45 | |
| 46 | |
| 47 | |
| 48 | |
| 49 | |
| 50 | <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
| 51 | <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> |
| 52 | <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> |
| 53 | |
| 54 | |
| 55 | |
| 56 | <link rel="stylesheet" href="../../assets/css/custom.css"> |
| 57 | |
| 58 | <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> |
| 59 | |
| 60 | |
| 61 | |
| 62 | |
| 63 | |
| 64 | </head> |
| 65 | |
| 66 | |
| 67 | |
| 68 | |
| 69 | |
| 70 | |
| 71 | |
| 72 | |
| 73 | |
| 74 | <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"> |
| 75 | |
| 76 | |
| 77 | <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> |
| 78 | <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> |
| 79 | <label class="md-overlay" for="__drawer"></label> |
| 80 | <div data-md-component="skip"> |
| 81 | |
| 82 | |
| 83 | <a href="#sync-bridge" class="md-skip"> |
| 84 | Skip to content |
| 85 | </a> |
| 86 | |
| 87 | </div> |
| 88 | <div data-md-component="announce"> |
| 89 | |
| 90 | </div> |
| 91 | |
| 92 | |
| 93 | |
| 94 | |
| 95 | <header class="md-header" data-md-component="header"> |
| 96 | <nav class="md-header__inner md-grid" aria-label="Header"> |
| 97 | <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> |
| 98 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 99 | <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 100 | <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 101 | </div> |
| 102 | </a> |
| 103 | <label class="md-header__button md-icon" for="__drawer"> |
| 104 | |
| 105 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> |
| 106 | </label> |
| 107 | <div class="md-header__title" data-md-component="header-title"> |
| 108 | <div class="md-header__ellipsis"> |
| 109 | <div class="md-header__topic"> |
| 110 | <span class="md-ellipsis"> |
| 111 | Fossilrepo |
| 112 | </span> |
| 113 | </div> |
| 114 | <div class="md-header__topic" data-md-component="header-topic"> |
| 115 | <span class="md-ellipsis"> |
| 116 | |
| 117 | Sync Bridge |
| 118 | |
| 119 | </span> |
| 120 | </div> |
| 121 | </div> |
| 122 | </div> |
| 123 | |
| 124 | |
| 125 | <form class="md-header__option" data-md-component="palette"> |
| 126 | |
| 127 | |
| 128 | |
| 129 | |
| 130 | <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> |
| 131 | |
| 132 | <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> |
| 133 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> |
| 134 | </label> |
| 135 | |
| 136 | |
| 137 | |
| 138 | |
| 139 | |
| 140 | <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> |
| 141 | |
| 142 | <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> |
| 143 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> |
| 144 | </label> |
| 145 | |
| 146 | |
| 147 | </form> |
| 148 | |
| 149 | |
| 150 | |
| 151 | <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> |
| 152 | |
| 153 | |
| 154 | |
| 155 | |
| 156 | |
| 157 | <label class="md-header__button md-icon" for="__search"> |
| 158 | |
| 159 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> |
| 160 | </label> |
| 161 | <div class="md-search" data-md-component="search" role="dialog"> |
| 162 | <label class="md-search__overlay" for="__search"></label> |
| 163 | <div class="md-search__inner" role="search"> |
| 164 | <form class="md-search__form" name="search"> |
| 165 | <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> |
| 166 | <label class="md-search__icon md-icon" for="__search"> |
| 167 | |
| 168 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> |
| 169 | |
| 170 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> |
| 171 | </label> |
| 172 | <nav class="md-search__options" aria-label="Search"> |
| 173 | |
| 174 | <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> |
| 175 | |
| 176 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> |
| 177 | </button> |
| 178 | </nav> |
| 179 | |
| 180 | <div class="md-search__suggest" data-md-component="search-suggest"></div> |
| 181 | |
| 182 | </form> |
| 183 | <div class="md-search__output"> |
| 184 | <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> |
| 185 | <div class="md-search-result" data-md-component="search-result"> |
| 186 | <div class="md-search-result__meta"> |
| 187 | Initializing search |
| 188 | </div> |
| 189 | <ol class="md-search-result__list" role="presentation"></ol> |
| 190 | </div> |
| 191 | </div> |
| 192 | </div> |
| 193 | </div> |
| 194 | </div> |
| 195 | |
| 196 | |
| 197 | |
| 198 | <div class="md-header__source"> |
| 199 | <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> |
| 200 | <div class="md-source__icon md-icon"> |
| 201 | |
| 202 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 203 | </div> |
| 204 | <div class="md-source__repository"> |
| 205 | ConflictHQ/fossilrepo |
| 206 | </div> |
| 207 | </a> |
| 208 | </div> |
| 209 | |
| 210 | </nav> |
| 211 | |
| 212 | </header> |
| 213 | |
| 214 | <div class="md-container" data-md-component="container"> |
| 215 | |
| 216 | |
| 217 | |
| 218 | |
| 219 | |
| 220 | <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> |
| 221 | <div class="md-grid"> |
| 222 | <ul class="md-tabs__list"> |
| 223 | |
| 224 | |
| 225 | |
| 226 | |
| 227 | |
| 228 | |
| 229 | <li class="md-tabs__item"> |
| 230 | <a href="../.." class="md-tabs__link"> |
| 231 | |
| 232 | |
| 233 | |
| 234 | |
| 235 | |
| 236 | Home |
| 237 | |
| 238 | </a> |
| 239 | </li> |
| 240 | |
| 241 | |
| 242 | |
| 243 | |
| 244 | |
| 245 | |
| 246 | |
| 247 | |
| 248 | |
| 249 | |
| 250 | <li class="md-tabs__item"> |
| 251 | <a href="../../getting-started/prerequisites/" class="md-tabs__link"> |
| 252 | |
| 253 | |
| 254 | |
| 255 | Getting Started |
| 256 | |
| 257 | </a> |
| 258 | </li> |
| 259 | |
| 260 | |
| 261 | |
| 262 | |
| 263 | |
| 264 | |
| 265 | |
| 266 | |
| 267 | |
| 268 | |
| 269 | |
| 270 | |
| 271 | |
| 272 | <li class="md-tabs__item md-tabs__item--active"> |
| 273 | <a href="../overview/" class="md-tabs__link"> |
| 274 | |
| 275 | |
| 276 | |
| 277 | Architecture |
| 278 | |
| 279 | </a> |
| 280 | </li> |
| 281 | |
| 282 | |
| 283 | |
| 284 | |
| 285 | </ul> |
| 286 | </div> |
| 287 | </nav> |
| 288 | |
| 289 | |
| 290 | |
| 291 | <main class="md-main" data-md-component="main"> |
| 292 | <div class="md-main__inner md-grid"> |
| 293 | |
| 294 | |
| 295 | |
| 296 | <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > |
| 297 | <div class="md-sidebar__scrollwrap"> |
| 298 | <div class="md-sidebar__inner"> |
| 299 | |
| 300 | |
| 301 | |
| 302 | |
| 303 | |
| 304 | |
| 305 | <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> |
| 306 | <label class="md-nav__title" for="__drawer"> |
| 307 | <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> |
| 308 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 309 | <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 310 | <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 311 | </div> |
| 312 | </a> |
| 313 | Fossilrepo |
| 314 | </label> |
| 315 | |
| 316 | <div class="md-nav__source"> |
| 317 | <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> |
| 318 | <div class="md-source__icon md-icon"> |
| 319 | |
| 320 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 321 | </div> |
| 322 | <div class="md-source__repository"> |
| 323 | ConflictHQ/fossilrepo |
| 324 | </div> |
| 325 | </a> |
| 326 | </div> |
| 327 | |
| 328 | <ul class="md-nav__list" data-md-scrollfix> |
| 329 | |
| 330 | |
| 331 | |
| 332 | |
| 333 | |
| 334 | |
| 335 | |
| 336 | <li class="md-nav__item"> |
| 337 | <a href="../.." class="md-nav__link"> |
| 338 | |
| 339 | |
| 340 | |
| 341 | <span class="md-ellipsis"> |
| 342 | |
| 343 | |
| 344 | Home |
| 345 | |
| 346 | |
| 347 | |
| 348 | </span> |
| 349 | |
| 350 | |
| 351 | |
| 352 | </a> |
| 353 | </li> |
| 354 | |
| 355 | |
| 356 | |
| 357 | |
| 358 | |
| 359 | |
| 360 | |
| 361 | |
| 362 | |
| 363 | |
| 364 | |
| 365 | |
| 366 | |
| 367 | |
| 368 | |
| 369 | |
| 370 | |
| 371 | |
| 372 | |
| 373 | <li class="md-nav__item md-nav__item--nested"> |
| 374 | |
| 375 | |
| 376 | |
| 377 | |
| 378 | |
| 379 | <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" > |
| 380 | |
| 381 | |
| 382 | <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0"> |
| 383 | |
| 384 | |
| 385 | |
| 386 | <span class="md-ellipsis"> |
| 387 | |
| 388 | |
| 389 | Getting Started |
| 390 | |
| 391 | |
| 392 | |
| 393 | </span> |
| 394 | |
| 395 | |
| 396 | |
| 397 | <span class="md-nav__icon md-icon"></span> |
| 398 | </label> |
| 399 | |
| 400 | <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false"> |
| 401 | <label class="md-nav__title" for="__nav_2"> |
| 402 | <span class="md-nav__icon md-icon"></span> |
| 403 | |
| 404 | |
| 405 | Getting Started |
| 406 | |
| 407 | |
| 408 | </label> |
| 409 | <ul class="md-nav__list" data-md-scrollfix> |
| 410 | |
| 411 | |
| 412 | |
| 413 | |
| 414 | |
| 415 | |
| 416 | |
| 417 | <li class="md-nav__item"> |
| 418 | <a href="../../getting-started/prerequisites/" class="md-nav__link"> |
| 419 | |
| 420 | |
| 421 | |
| 422 | <span class="md-ellipsis"> |
| 423 | |
| 424 | |
| 425 | Prerequisites |
| 426 | |
| 427 | |
| 428 | |
| 429 | </span> |
| 430 | |
| 431 | |
| 432 | |
| 433 | </a> |
| 434 | </li> |
| 435 | |
| 436 | |
| 437 | |
| 438 | |
| 439 | |
| 440 | |
| 441 | |
| 442 | |
| 443 | |
| 444 | |
| 445 | <li class="md-nav__item"> |
| 446 | <a href="../../getting-started/installation/" class="md-nav__link"> |
| 447 | |
| 448 | |
| 449 | |
| 450 | <span class="md-ellipsis"> |
| 451 | |
| 452 | |
| 453 | Installation |
| 454 | |
| 455 | |
| 456 | |
| 457 | </span> |
| 458 | |
| 459 | |
| 460 | |
| 461 | </a> |
| 462 | </li> |
| 463 | |
| 464 | |
| 465 | |
| 466 | |
| 467 | |
| 468 | |
| 469 | |
| 470 | |
| 471 | |
| 472 | |
| 473 | <li class="md-nav__item"> |
| 474 | <a href="../../getting-started/configuration/" class="md-nav__link"> |
| 475 | |
| 476 | |
| 477 | |
| 478 | <span class="md-ellipsis"> |
| 479 | |
| 480 | |
| 481 | Configuration |
| 482 | |
| 483 | |
| 484 | |
| 485 | </span> |
| 486 | |
| 487 | |
| 488 | |
| 489 | </a> |
| 490 | </li> |
| 491 | |
| 492 | |
| 493 | |
| 494 | |
| 495 | |
| 496 | |
| 497 | |
| 498 | |
| 499 | |
| 500 | |
| 501 | <li class="md-nav__item"> |
| 502 | <a href="../../getting-started/first-repo/" class="md-nav__link"> |
| 503 | |
| 504 | |
| 505 | |
| 506 | <span class="md-ellipsis"> |
| 507 | |
| 508 | |
| 509 | First Repository |
| 510 | |
| 511 | |
| 512 | |
| 513 | </span> |
| 514 | |
| 515 | |
| 516 | |
| 517 | </a> |
| 518 | </li> |
| 519 | |
| 520 | |
| 521 | |
| 522 | |
| 523 | </ul> |
| 524 | </nav> |
| 525 | |
| 526 | </li> |
| 527 | |
| 528 | |
| 529 | |
| 530 | |
| 531 | |
| 532 | |
| 533 | |
| 534 | |
| 535 | |
| 536 | |
| 537 | |
| 538 | |
| 539 | |
| 540 | |
| 541 | |
| 542 | |
| 543 | |
| 544 | |
| 545 | |
| 546 | |
| 547 | |
| 548 | |
| 549 | |
| 550 | |
| 551 | <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> |
| 552 | |
| 553 | |
| 554 | |
| 555 | <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked> |
| 556 | |
| 557 | |
| 558 | <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex=""> |
| 559 | |
| 560 | |
| 561 | |
| 562 | <span class="md-ellipsis"> |
| 563 | |
| 564 | |
| 565 | Architecture |
| 566 | |
| 567 | |
| 568 | |
| 569 | </span> |
| 570 | |
| 571 | |
| 572 | |
| 573 | <span class="md-nav__icon md-icon"></span> |
| 574 | </label> |
| 575 | |
| 576 | <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true"> |
| 577 | <label class="md-nav__title" for="__nav_3"> |
| 578 | <span class="md-nav__icon md-icon"></span> |
| 579 | |
| 580 | |
| 581 | Architecture |
| 582 | |
| 583 | |
| 584 | </label> |
| 585 | <ul class="md-nav__list" data-md-scrollfix> |
| 586 | |
| 587 | |
| 588 | |
| 589 | |
| 590 | |
| 591 | |
| 592 | |
| 593 | <li class="md-nav__item"> |
| 594 | <a href="../overview/" class="md-nav__link"> |
| 595 | |
| 596 | |
| 597 | |
| 598 | <span class="md-ellipsis"> |
| 599 | |
| 600 | |
| 601 | Overview |
| 602 | |
| 603 | |
| 604 | |
| 605 | </span> |
| 606 | |
| 607 | |
| 608 | |
| 609 | </a> |
| 610 | </li> |
| 611 | |
| 612 | |
| 613 | |
| 614 | |
| 615 | |
| 616 | |
| 617 | |
| 618 | |
| 619 | |
| 620 | |
| 621 | |
| 622 | |
| 623 | <li class="md-nav__item md-nav__item--active"> |
| 624 | |
| 625 | <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> |
| 626 | |
| 627 | |
| 628 | |
| 629 | |
| 630 | |
| 631 | <label class="md-nav__link md-nav__link--active" for="__toc"> |
| 632 | |
| 633 | |
| 634 | |
| 635 | <span class="md-ellipsis"> |
| 636 | |
| 637 | |
| 638 | Sync Bridge |
| 639 | |
| 640 | |
| 641 | |
| 642 | </span> |
| 643 | |
| 644 | |
| 645 | |
| 646 | <span class="md-nav__icon md-icon"></span> |
| 647 | </label> |
| 648 | |
| 649 | <a href="./" class="md-nav__link md-nav__link--active"> |
| 650 | |
| 651 | |
| 652 | |
| 653 | <span class="md-ellipsis"> |
| 654 | |
| 655 | |
| 656 | Sync Bridge |
| 657 | |
| 658 | |
| 659 | |
| 660 | </span> |
| 661 | |
| 662 | |
| 663 | |
| 664 | </a> |
| 665 | |
| 666 | |
| 667 | |
| 668 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> |
| 669 | |
| 670 | |
| 671 | |
| 672 | |
| 673 | |
| 674 | |
| 675 | <label class="md-nav__title" for="__toc"> |
| 676 | <span class="md-nav__icon md-icon"></span> |
| 677 | Table of contents |
| 678 | </label> |
| 679 | <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> |
| 680 | |
| 681 | <li class="md-nav__item"> |
| 682 | <a href="#how-it-works" class="md-nav__link"> |
| 683 | <span class="md-ellipsis"> |
| 684 | |
| 685 | How It Works |
| 686 | |
| 687 | </span> |
| 688 | </a> |
| 689 | |
| 690 | </li> |
| 691 | |
| 692 | <li class="md-nav__item"> |
| 693 | <a href="#what-gets-synced" class="md-nav__link"> |
| 694 | <span class="md-ellipsis"> |
| 695 | |
| 696 | What Gets Synced |
| 697 | |
| 698 | </span> |
| 699 | </a> |
| 700 | |
| 701 | </li> |
| 702 | |
| 703 | <li class="md-nav__item"> |
| 704 | <a href="#configuration" class="md-nav__link"> |
| 705 | <span class="md-ellipsis"> |
| 706 | |
| 707 | Configuration |
| 708 | |
| 709 | </span> |
| 710 | </a> |
| 711 | |
| 712 | </li> |
| 713 | |
| 714 | <li class="md-nav__item"> |
| 715 | <a href="#sync-modes" class="md-nav__link"> |
| 716 | <span class="md-ellipsis"> |
| 717 | |
| 718 | Sync Modes |
| 719 | |
| 720 | </span> |
| 721 | </a> |
| 722 | |
| 723 | <nav class="md-nav" aria-label="Sync Modes"> |
| 724 | <ul class="md-nav__list"> |
| 725 | |
| 726 | <li class="md-nav__item"> |
| 727 | <a href="#on-demand" class="md-nav__link"> |
| 728 | <span class="md-ellipsis"> |
| 729 | |
| 730 | On-Demand |
| 731 | |
| 732 | </span> |
| 733 | </a> |
| 734 | |
| 735 | </li> |
| 736 | |
| 737 | <li class="md-nav__item"> |
| 738 | <a href="#scheduled" class="md-nav__link"> |
| 739 | <span class="md-ellipsis"> |
| 740 | |
| 741 | Scheduled |
| 742 | |
| 743 | </span> |
| 744 | </a> |
| 745 | |
| 746 | </li> |
| 747 | |
| 748 | <li class="md-nav__item"> |
| 749 | <a href="#upstream-pull" class="md-nav__link"> |
| 750 | <span class="md-ellipsis"> |
| 751 | |
| 752 | Upstream Pull |
| 753 | |
| 754 | </span> |
| 755 | </a> |
| 756 | |
| 757 | </li> |
| 758 | |
| 759 | </ul> |
| 760 | </nav> |
| 761 | |
| 762 | </li> |
| 763 | |
| 764 | </ul> |
| 765 | |
| 766 | </nav> |
| 767 | |
| 768 | </li> |
| 769 | |
| 770 | |
| 771 | |
| 772 | |
| 773 | </ul> |
| 774 | </nav> |
| 775 | |
| 776 | </li> |
| 777 | |
| 778 | |
| 779 | |
| 780 | </ul> |
| 781 | </nav> |
| 782 | </div> |
| 783 | </div> |
| 784 | </div> |
| 785 | |
| 786 | |
| 787 | |
| 788 | <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > |
| 789 | <div class="md-sidebar__scrollwrap"> |
| 790 | <div class="md-sidebar__inner"> |
| 791 | |
| 792 | |
| 793 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> |
| 794 | |
| 795 | |
| 796 | |
| 797 | |
| 798 | |
| 799 | |
| 800 | <label class="md-nav__title" for="__toc"> |
| 801 | <span class="md-nav__icon md-icon"></span> |
| 802 | Table of contents |
| 803 | </label> |
| 804 | <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> |
| 805 | |
| 806 | <li class="md-nav__item"> |
| 807 | <a href="#how-it-works" class="md-nav__link"> |
| 808 | <span class="md-ellipsis"> |
| 809 | |
| 810 | How It Works |
| 811 | |
| 812 | </span> |
| 813 | </a> |
| 814 | |
| 815 | </li> |
| 816 | |
| 817 | <li class="md-nav__item"> |
| 818 | <a href="#what-gets-synced" class="md-nav__link"> |
| 819 | <span class="md-ellipsis"> |
| 820 | |
| 821 | What Gets Synced |
| 822 | |
| 823 | </span> |
| 824 | </a> |
| 825 | |
| 826 | </li> |
| 827 | |
| 828 | <li class="md-nav__item"> |
| 829 | <a href="#configuration" class="md-nav__link"> |
| 830 | <span class="md-ellipsis"> |
| 831 | |
| 832 | Configuration |
| 833 | |
| 834 | </span> |
| 835 | </a> |
| 836 | |
| 837 | </li> |
| 838 | |
| 839 | <li class="md-nav__item"> |
| 840 | <a href="#sync-modes" class="md-nav__link"> |
| 841 | <span class="md-ellipsis"> |
| 842 | |
| 843 | Sync Modes |
| 844 | |
| 845 | </span> |
| 846 | </a> |
| 847 | |
| 848 | <nav class="md-nav" aria-label="Sync Modes"> |
| 849 | <ul class="md-nav__list"> |
| 850 | |
| 851 | <li class="md-nav__item"> |
| 852 | <a href="#on-demand" class="md-nav__link"> |
| 853 | <span class="md-ellipsis"> |
| 854 | |
| 855 | On-Demand |
| 856 | |
| 857 | </span> |
| 858 | </a> |
| 859 | |
| 860 | </li> |
| 861 | |
| 862 | <li class="md-nav__item"> |
| 863 | <a href="#scheduled" class="md-nav__link"> |
| 864 | <span class="md-ellipsis"> |
| 865 | |
| 866 | Scheduled |
| 867 | |
| 868 | </span> |
| 869 | </a> |
| 870 | |
| 871 | </li> |
| 872 | |
| 873 | <li class="md-nav__item"> |
| 874 | <a href="#upstream-pull" class="md-nav__link"> |
| 875 | <span class="md-ellipsis"> |
| 876 | |
| 877 | Upstream Pull |
| 878 | |
| 879 | </span> |
| 880 | </a> |
| 881 | |
| 882 | </li> |
| 883 | |
| 884 | </ul> |
| 885 | </nav> |
| 886 | |
| 887 | </li> |
| 888 | |
| 889 | </ul> |
| 890 | |
| 891 | </nav> |
| 892 | </div> |
| 893 | </div> |
| 894 | </div> |
| 895 | |
| 896 | |
| 897 | |
| 898 | <div class="md-content" data-md-component="content"> |
| 899 | |
| 900 | <article class="md-content__inner md-typeset"> |
| 901 | |
| 902 | |
| 903 | |
| 904 | |
| 905 | |
| 906 | |
| 907 | |
| 908 | |
| 909 | <h1 id="sync-bridge">Sync Bridge<a class="headerlink" href="#sync-bridge" title="Permanent link">¶</a></h1> |
| 910 | <p>The sync bridge mirrors Fossil repositories to GitHub and GitLab as downstream read-only copies.</p> |
| 911 | <h2 id="how-it-works">How It Works<a class="headerlink" href="#how-it-works" title="Permanent link">¶</a></h2> |
| 912 | <pre class="mermaid"><code>flowchart LR |
| 913 | Fossil["Fossil Repo<br/>(source of truth)"] --> Bridge["Sync Bridge<br/>(Celery task)"] |
| 914 | Bridge --> Git["Git Export"] |
| 915 | Git --> GitHub["GitHub Mirror"] |
| 916 | Git --> GitLab["GitLab Mirror"]</code></pre> |
| 917 | <p>The bridge:</p> |
| 918 | <ol> |
| 919 | <li>Exports Fossil commits as Git commits</li> |
| 920 | <li>Pushes to configured Git remotes</li> |
| 921 | <li>Optionally syncs tickets to GitHub/GitLab Issues</li> |
| 922 | <li>Optionally syncs wiki pages to repo docs</li> |
| 923 | </ol> |
| 924 | <h2 id="what-gets-synced">What Gets Synced<a class="headerlink" href="#what-gets-synced" title="Permanent link">¶</a></h2> |
| 925 | <table> |
| 926 | <thead> |
| 927 | <tr> |
| 928 | <th>Fossil Artifact</th> |
| 929 | <th>Git Target</th> |
| 930 | <th>Configurable</th> |
| 931 | </tr> |
| 932 | </thead> |
| 933 | <tbody> |
| 934 | <tr> |
| 935 | <td>Commits</td> |
| 936 | <td>Git commits</td> |
| 937 | <td>Always</td> |
| 938 | </tr> |
| 939 | <tr> |
| 940 | <td>Tags</td> |
| 941 | <td>Git tags</td> |
| 942 | <td>Always</td> |
| 943 | </tr> |
| 944 | <tr> |
| 945 | <td>Branches</td> |
| 946 | <td>Git branches</td> |
| 947 | <td>Always</td> |
| 948 | </tr> |
| 949 | <tr> |
| 950 | <td>Tickets</td> |
| 951 | <td>GitHub/GitLab Issues</td> |
| 952 | <td>Optional</td> |
| 953 | </tr> |
| 954 | <tr> |
| 955 | <td>Wiki</td> |
| 956 | <td>Repository docs</td> |
| 957 | <td>Optional</td> |
| 958 | </tr> |
| 959 | </tbody> |
| 960 | </table> |
| 961 | <h2 id="configuration">Configuration<a class="headerlink" href="#configuration" title="Permanent link">¶</a></h2> |
| 962 | <p>Set up mirroring through the Django management UI or environment variables:</p> |
| 963 | <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># GitHub mirror</span> |
| 964 | <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="nv">GITHUB_TOKEN</span><span class="o">=</span>ghp_xxxxxxxxxxxx |
| 965 | <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> |
| 966 | <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="c1"># GitLab mirror</span> |
| 967 | <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="nv">GITLAB_TOKEN</span><span class="o">=</span>glpat-xxxxxxxxxxxx |
| 968 | </code></pre></div> |
| 969 | <p>Per-repository mirror configuration is managed in the dashboard under <strong>Repository Settings > Sync</strong>.</p> |
| 970 | <h2 id="sync-modes">Sync Modes<a class="headerlink" href="#sync-modes" title="Permanent link">¶</a></h2> |
| 971 | <h3 id="on-demand">On-Demand<a class="headerlink" href="#on-demand" title="Permanent link">¶</a></h3> |
| 972 | <p>Trigger a sync manually from the dashboard or CLI:</p> |
| 973 | <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>django<span class="w"> </span>python<span class="w"> </span>manage.py<span class="w"> </span>fossil_sync<span class="w"> </span>my-project |
| 974 | </code></pre></div> |
| 975 | <h3 id="scheduled">Scheduled<a class="headerlink" href="#scheduled" title="Permanent link">¶</a></h3> |
| 976 | <p>Configure a Celery Beat schedule to sync at regular intervals:</p> |
| 977 | <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="c1"># Runs every 15 minutes</span> |
| 978 | <a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="n">CELERY_BEAT_SCHEDULE</span> <span class="o">=</span> <span class="p">{</span> |
| 979 | <a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a> <span class="s1">'sync-all-repos'</span><span class="p">:</span> <span class="p">{</span> |
| 980 | <a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a> <span class="s1">'task'</span><span class="p">:</span> <span class="s1">'fossil.tasks.sync_all'</span><span class="p">,</span> |
| 981 | <a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a> <span class="s1">'schedule'</span><span class="p">:</span> <span class="mf">900.0</span><span class="p">,</span> |
| 982 | <a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a> <span class="p">},</span> |
| 983 | <a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="p">}</span> |
| 984 | </code></pre></div> |
| 985 | <h3 id="upstream-pull">Upstream Pull<a class="headerlink" href="#upstream-pull" title="Permanent link">¶</a></h3> |
| 986 | <p>Pull updates from a remote Fossil server into your local instance:</p> |
| 987 | <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>django<span class="w"> </span>python<span class="w"> </span>manage.py<span class="w"> </span>fossil_pull<span class="w"> </span>my-project |
| 988 | </code></pre></div> |
| 989 | <div class="admonition warning"> |
| 990 | <p class="admonition-title">Direction matters</p> |
| 991 | <p>The sync bridge is <strong>one-way</strong>: Fossil to Git. Changes pushed directly to a Git mirror will be overwritten on the next sync. Always push to the Fossil repo.</p> |
| 992 | </div> |
| 993 | |
| 994 | |
| 995 | |
| 996 | |
| 997 | |
| 998 | |
| 999 | |
| 1000 | |
| 1001 | |
| 1002 | |
| 1003 | |
| 1004 | |
| 1005 | |
| 1006 | </article> |
| 1007 | </div> |
| 1008 | |
| 1009 | |
| 1010 | <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> |
| 1011 | |
| 1012 | <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> |
| 1013 | </div> |
| 1014 | |
| 1015 | <button type="button" class="md-top md-icon" data-md-component="top" hidden> |
| 1016 | |
| 1017 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> |
| 1018 | Back to top |
| 1019 | </button> |
| 1020 | |
| 1021 | </main> |
| 1022 | |
| 1023 | <footer class="md-footer"> |
| 1024 | |
| 1025 | <div class="md-footer-meta md-typeset"> |
| 1026 | <div class="md-footer-meta__inner md-grid"> |
| 1027 | <div class="md-copyright"> |
| 1028 | |
| 1029 | <div class="md-copyright__highlight"> |
| 1030 | Copyright © 2026 CONFLICT LLC |
| 1031 | </div> |
| 1032 | |
| 1033 | |
| 1034 | Made with |
| 1035 | <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> |
| 1036 | Material for MkDocs |
| 1037 | </a> |
| 1038 | |
| 1039 | </div> |
| 1040 | |
| 1041 | |
| 1042 | <div class="md-social"> |
| 1043 | |
| 1044 | |
| 1045 | |
| 1046 | |
| 1047 | |
| 1048 | |
| 1049 | |
| 1050 | |
| 1051 | <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link"> |
| 1052 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 1053 | </a> |
| 1054 | |
| 1055 | </div> |
| 1056 | |
| 1057 | </div> |
| 1058 | </div> |
| 1059 | </footer> |
| 1060 | |
| 1061 | </div> |
| 1062 | <div class="md-dialog" data-md-component="dialog"> |
| 1063 | <div class="md-dialog__inner md-typeset"></div> |
| 1064 | </div> |
| 1065 | |
| 1066 | |
| 1067 | |
| 1068 | |
| 1069 | |
| 1070 | <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> |
| 1071 | |
| 1072 | |
| 1073 | <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script> |
| 1074 | |
| 1075 | |
| 1076 | </body> |
| 1077 | </html> |
| --- a/site/getting-started/configuration/index.html | ||
| +++ b/site/getting-started/configuration/index.html | ||
| @@ -0,0 +1,1288 @@ | ||
| 1 | + | |
| 2 | +<!doctype html> | |
| 3 | +<html lang="en" class="no-js"> | |
| 4 | + <head> | |
| 5 | + | |
| 6 | + <meta charset="utf-8"> | |
| 7 | + <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| 8 | + | |
| 9 | + <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting"> | |
| 10 | + | |
| 11 | + | |
| 12 | + <meta name="author" content="CONFLICT LLC"> | |
| 13 | + | |
| 14 | + | |
| 15 | + <link rel="canonical" href="https://fossilrepo.dev/getting-started/configuration/"> | |
| 16 | + | |
| 17 | + | |
| 18 | + <link rel="prev" href="../installation/"> | |
| 19 | + | |
| 20 | + | |
| 21 | + <link rel="next" href="../first-repo/"> | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + <link rel="icon" href="../../assets/images/favicon.png"> | |
| 28 | + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6"> | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + <title>Configuration - Fossilrepo</title> | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css"> | |
| 37 | + | |
| 38 | + | |
| 39 | + <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css"> | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | |
| 53 | + <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> | |
| 54 | + <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + <link rel="stylesheet" href="../../assets/css/custom.css"> | |
| 59 | + | |
| 60 | + <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + </head> | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"> | |
| 77 | + | |
| 78 | + | |
| 79 | + <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> | |
| 80 | + <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> | |
| 81 | + <label class="md-overlay" for="__drawer"></label> | |
| 82 | + <div data-md-component="skip"> | |
| 83 | + | |
| 84 | + | |
| 85 | + <a href="#configuration" class="md-skip"> | |
| 86 | + Skip to content | |
| 87 | + </a> | |
| 88 | + | |
| 89 | + </div> | |
| 90 | + <div data-md-component="announce"> | |
| 91 | + | |
| 92 | + </div> | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | +<header class="md-header" data-md-component="header"> | |
| 98 | + <nav class="md-header__inner md-grid" aria-label="Header"> | |
| 99 | + <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> | |
| 100 | + <div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 101 | + <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 102 | + <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 103 | +</div> | |
| 104 | + </a> | |
| 105 | + <label class="md-header__button md-icon" for="__drawer"> | |
| 106 | + | |
| 107 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> | |
| 108 | + </label> | |
| 109 | + <div class="md-header__title" data-md-component="header-title"> | |
| 110 | + <div class="md-header__ellipsis"> | |
| 111 | + <div class="md-header__topic"> | |
| 112 | + <span class="md-ellipsis"> | |
| 113 | + Fossilrepo | |
| 114 | + </span> | |
| 115 | + </div> | |
| 116 | + <div class="md-header__topic" data-md-component="header-topic"> | |
| 117 | + <span class="md-ellipsis"> | |
| 118 | + | |
| 119 | + Configuration | |
| 120 | + | |
| 121 | + </span> | |
| 122 | + </div> | |
| 123 | + </div> | |
| 124 | + </div> | |
| 125 | + | |
| 126 | + | |
| 127 | + <form class="md-header__option" data-md-component="palette"> | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> | |
| 133 | + | |
| 134 | + <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> | |
| 135 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> | |
| 136 | + </label> | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> | |
| 143 | + | |
| 144 | + <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> | |
| 145 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> | |
| 146 | + </label> | |
| 147 | + | |
| 148 | + | |
| 149 | +</form> | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + <label class="md-header__button md-icon" for="__search"> | |
| 160 | + | |
| 161 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> | |
| 162 | + </label> | |
| 163 | + <div class="md-search" data-md-component="search" role="dialog"> | |
| 164 | + <label class="md-search__overlay" for="__search"></label> | |
| 165 | + <div class="md-search__inner" role="search"> | |
| 166 | + <form class="md-search__form" name="search"> | |
| 167 | + <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> | |
| 168 | + <label class="md-search__icon md-icon" for="__search"> | |
| 169 | + | |
| 170 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> | |
| 171 | + | |
| 172 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> | |
| 173 | + </label> | |
| 174 | + <nav class="md-search__options" aria-label="Search"> | |
| 175 | + | |
| 176 | + <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> | |
| 177 | + | |
| 178 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> | |
| 179 | + </button> | |
| 180 | + </nav> | |
| 181 | + | |
| 182 | + <div class="md-search__suggest" data-md-component="search-suggest"></div> | |
| 183 | + | |
| 184 | + </form> | |
| 185 | + <div class="md-search__output"> | |
| 186 | + <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> | |
| 187 | + <div class="md-search-result" data-md-component="search-result"> | |
| 188 | + <div class="md-search-result__meta"> | |
| 189 | + Initializing search | |
| 190 | + </div> | |
| 191 | + <ol class="md-search-result__list" role="presentation"></ol> | |
| 192 | + </div> | |
| 193 | + </div> | |
| 194 | + </div> | |
| 195 | + </div> | |
| 196 | +</div> | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + <div class="md-header__source"> | |
| 201 | + <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> | |
| 202 | + <div class="md-source__icon md-icon"> | |
| 203 | + | |
| 204 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 205 | + </div> | |
| 206 | + <div class="md-source__repository"> | |
| 207 | + ConflictHQ/fossilrepo | |
| 208 | + </div> | |
| 209 | +</a> | |
| 210 | + </div> | |
| 211 | + | |
| 212 | + </nav> | |
| 213 | + | |
| 214 | +</header> | |
| 215 | + | |
| 216 | + <div class="md-container" data-md-component="container"> | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | +<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> | |
| 223 | + <div class="md-grid"> | |
| 224 | + <ul class="md-tabs__list"> | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + <li class="md-tabs__item"> | |
| 232 | + <a href="../.." class="md-tabs__link"> | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + Home | |
| 239 | + | |
| 240 | + </a> | |
| 241 | + </li> | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + <li class="md-tabs__item md-tabs__item--active"> | |
| 255 | + <a href="../prerequisites/" class="md-tabs__link"> | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + Getting Started | |
| 260 | + | |
| 261 | + </a> | |
| 262 | + </li> | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + <li class="md-tabs__item"> | |
| 275 | + <a href="../../architecture/overview/" class="md-tabs__link"> | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + Architecture | |
| 280 | + | |
| 281 | + </a> | |
| 282 | + </li> | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + </ul> | |
| 288 | + </div> | |
| 289 | +</nav> | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + <main class="md-main" data-md-component="main"> | |
| 294 | + <div class="md-main__inner md-grid"> | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > | |
| 299 | + <div class="md-sidebar__scrollwrap"> | |
| 300 | + <div class="md-sidebar__inner"> | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | +<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> | |
| 308 | + <label class="md-nav__title" for="__drawer"> | |
| 309 | + <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> | |
| 310 | + <div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 311 | + <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 312 | + <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 313 | +</div> | |
| 314 | + </a> | |
| 315 | + Fossilrepo | |
| 316 | + </label> | |
| 317 | + | |
| 318 | + <div class="md-nav__source"> | |
| 319 | + <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> | |
| 320 | + <div class="md-source__icon md-icon"> | |
| 321 | + | |
| 322 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 323 | + </div> | |
| 324 | + <div class="md-source__repository"> | |
| 325 | + ConflictHQ/fossilrepo | |
| 326 | + </div> | |
| 327 | +</a> | |
| 328 | + </div> | |
| 329 | + | |
| 330 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + <li class="md-nav__item"> | |
| 339 | + <a href="../.." class="md-nav__link"> | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + <span class="md-ellipsis"> | |
| 344 | + | |
| 345 | + | |
| 346 | + Home | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + </span> | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + </a> | |
| 355 | + </li> | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked> | |
| 385 | + | |
| 386 | + | |
| 387 | + <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex=""> | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + <span class="md-ellipsis"> | |
| 392 | + | |
| 393 | + | |
| 394 | + Getting Started | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + </span> | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + <span class="md-nav__icon md-icon"></span> | |
| 403 | + </label> | |
| 404 | + | |
| 405 | + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true"> | |
| 406 | + <label class="md-nav__title" for="__nav_2"> | |
| 407 | + <span class="md-nav__icon md-icon"></span> | |
| 408 | + | |
| 409 | + | |
| 410 | + Getting Started | |
| 411 | + | |
| 412 | + | |
| 413 | + </label> | |
| 414 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + <li class="md-nav__item"> | |
| 423 | + <a href="../prerequisites/" class="md-nav__link"> | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + <span class="md-ellipsis"> | |
| 428 | + | |
| 429 | + | |
| 430 | + Prerequisites | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + </span> | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + </a> | |
| 439 | + </li> | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + <li class="md-nav__item"> | |
| 451 | + <a href="../installation/" class="md-nav__link"> | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
| 455 | + <span class="md-ellipsis"> | |
| 456 | + | |
| 457 | + | |
| 458 | + Installation | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + </span> | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + </a> | |
| 467 | + </li> | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + <li class="md-nav__item md-nav__item--active"> | |
| 481 | + | |
| 482 | + <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + <label class="md-nav__link md-nav__link--active" for="__toc"> | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + <span class="md-ellipsis"> | |
| 493 | + | |
| 494 | + | |
| 495 | + Configuration | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + </span> | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + <span class="md-nav__icon md-icon"></span> | |
| 504 | + </label> | |
| 505 | + | |
| 506 | + <a href="./" class="md-nav__link md-nav__link--active"> | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + <span class="md-ellipsis"> | |
| 511 | + | |
| 512 | + | |
| 513 | + Configuration | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + </span> | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + </a> | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + <label class="md-nav__title" for="__toc"> | |
| 533 | + <span class="md-nav__icon md-icon"></span> | |
| 534 | + Table of contents | |
| 535 | + </label> | |
| 536 | + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> | |
| 537 | + | |
| 538 | + <li class="md-nav__item"> | |
| 539 | + <a href="#environment-variables" class="md-nav__link"> | |
| 540 | + <span class="md-ellipsis"> | |
| 541 | + | |
| 542 | + Environment Variables | |
| 543 | + | |
| 544 | + </span> | |
| 545 | + </a> | |
| 546 | + | |
| 547 | + <nav class="md-nav" aria-label="Environment Variables"> | |
| 548 | + <ul class="md-nav__list"> | |
| 549 | + | |
| 550 | + <li class="md-nav__item"> | |
| 551 | + <a href="#django-settings" class="md-nav__link"> | |
| 552 | + <span class="md-ellipsis"> | |
| 553 | + | |
| 554 | + Django Settings | |
| 555 | + | |
| 556 | + </span> | |
| 557 | + </a> | |
| 558 | + | |
| 559 | +</li> | |
| 560 | + | |
| 561 | + <li class="md-nav__item"> | |
| 562 | + <a href="#database" class="md-nav__link"> | |
| 563 | + <span class="md-ellipsis"> | |
| 564 | + | |
| 565 | + Database | |
| 566 | + | |
| 567 | + </span> | |
| 568 | + </a> | |
| 569 | + | |
| 570 | +</li> | |
| 571 | + | |
| 572 | + <li class="md-nav__item"> | |
| 573 | + <a href="#redis-celery" class="md-nav__link"> | |
| 574 | + <span class="md-ellipsis"> | |
| 575 | + | |
| 576 | + Redis & Celery | |
| 577 | + | |
| 578 | + </span> | |
| 579 | + </a> | |
| 580 | + | |
| 581 | +</li> | |
| 582 | + | |
| 583 | + <li class="md-nav__item"> | |
| 584 | + <a href="#fossil" class="md-nav__link"> | |
| 585 | + <span class="md-ellipsis"> | |
| 586 | + | |
| 587 | + Fossil | |
| 588 | + | |
| 589 | + </span> | |
| 590 | + </a> | |
| 591 | + | |
| 592 | +</li> | |
| 593 | + | |
| 594 | + <li class="md-nav__item"> | |
| 595 | + <a href="#caddy-production" class="md-nav__link"> | |
| 596 | + <span class="md-ellipsis"> | |
| 597 | + | |
| 598 | + Caddy (Production) | |
| 599 | + | |
| 600 | + </span> | |
| 601 | + </a> | |
| 602 | + | |
| 603 | +</li> | |
| 604 | + | |
| 605 | + <li class="md-nav__item"> | |
| 606 | + <a href="#litestream-backups" class="md-nav__link"> | |
| 607 | + <span class="md-ellipsis"> | |
| 608 | + | |
| 609 | + Litestream (Backups) | |
| 610 | + | |
| 611 | + </span> | |
| 612 | + </a> | |
| 613 | + | |
| 614 | +</li> | |
| 615 | + | |
| 616 | + <li class="md-nav__item"> | |
| 617 | + <a href="#sync-bridge" class="md-nav__link"> | |
| 618 | + <span class="md-ellipsis"> | |
| 619 | + | |
| 620 | + Sync Bridge | |
| 621 | + | |
| 622 | + </span> | |
| 623 | + </a> | |
| 624 | + | |
| 625 | +</li> | |
| 626 | + | |
| 627 | + </ul> | |
| 628 | + </nav> | |
| 629 | + | |
| 630 | +</li> | |
| 631 | + | |
| 632 | + <li class="md-nav__item"> | |
| 633 | + <a href="#caddy-configuration" class="md-nav__link"> | |
| 634 | + <span class="md-ellipsis"> | |
| 635 | + | |
| 636 | + Caddy Configuration | |
| 637 | + | |
| 638 | + </span> | |
| 639 | + </a> | |
| 640 | + | |
| 641 | +</li> | |
| 642 | + | |
| 643 | + <li class="md-nav__item"> | |
| 644 | + <a href="#litestream-configuration" class="md-nav__link"> | |
| 645 | + <span class="md-ellipsis"> | |
| 646 | + | |
| 647 | + Litestream Configuration | |
| 648 | + | |
| 649 | + </span> | |
| 650 | + </a> | |
| 651 | + | |
| 652 | +</li> | |
| 653 | + | |
| 654 | + </ul> | |
| 655 | + | |
| 656 | +</nav> | |
| 657 | + | |
| 658 | + </li> | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
| 662 | + | |
| 663 | + | |
| 664 | + | |
| 665 | + | |
| 666 | + | |
| 667 | + | |
| 668 | + | |
| 669 | + <li class="md-nav__item"> | |
| 670 | + <a href="../first-repo/" class="md-nav__link"> | |
| 671 | + | |
| 672 | + | |
| 673 | + | |
| 674 | + <span class="md-ellipsis"> | |
| 675 | + | |
| 676 | + | |
| 677 | + First Repository | |
| 678 | + | |
| 679 | + | |
| 680 | + | |
| 681 | + </span> | |
| 682 | + | |
| 683 | + | |
| 684 | + | |
| 685 | + </a> | |
| 686 | + </li> | |
| 687 | + | |
| 688 | + | |
| 689 | + | |
| 690 | + | |
| 691 | + </ul> | |
| 692 | + </nav> | |
| 693 | + | |
| 694 | + </li> | |
| 695 | + | |
| 696 | + | |
| 697 | + | |
| 698 | + | |
| 699 | + | |
| 700 | + | |
| 701 | + | |
| 702 | + | |
| 703 | + | |
| 704 | + | |
| 705 | + | |
| 706 | + | |
| 707 | + | |
| 708 | + | |
| 709 | + | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
| 714 | + <li class="md-nav__item md-nav__item--nested"> | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
| 719 | + | |
| 720 | + <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" > | |
| 721 | + | |
| 722 | + | |
| 723 | + <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> | |
| 724 | + | |
| 725 | + | |
| 726 | + | |
| 727 | + <span class="md-ellipsis"> | |
| 728 | + | |
| 729 | + | |
| 730 | + Architecture | |
| 731 | + | |
| 732 | + | |
| 733 | + | |
| 734 | + </span> | |
| 735 | + | |
| 736 | + | |
| 737 | + | |
| 738 | + <span class="md-nav__icon md-icon"></span> | |
| 739 | + </label> | |
| 740 | + | |
| 741 | + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> | |
| 742 | + <label class="md-nav__title" for="__nav_3"> | |
| 743 | + <span class="md-nav__icon md-icon"></span> | |
| 744 | + | |
| 745 | + | |
| 746 | + Architecture | |
| 747 | + | |
| 748 | + | |
| 749 | + </label> | |
| 750 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 751 | + | |
| 752 | + | |
| 753 | + | |
| 754 | + | |
| 755 | + | |
| 756 | + | |
| 757 | + | |
| 758 | + <li class="md-nav__item"> | |
| 759 | + <a href="../../architecture/overview/" class="md-nav__link"> | |
| 760 | + | |
| 761 | + | |
| 762 | + | |
| 763 | + <span class="md-ellipsis"> | |
| 764 | + | |
| 765 | + | |
| 766 | + Overview | |
| 767 | + | |
| 768 | + | |
| 769 | + | |
| 770 | + </span> | |
| 771 | + | |
| 772 | + | |
| 773 | + | |
| 774 | + </a> | |
| 775 | + </li> | |
| 776 | + | |
| 777 | + | |
| 778 | + | |
| 779 | + | |
| 780 | + | |
| 781 | + | |
| 782 | + | |
| 783 | + | |
| 784 | + | |
| 785 | + | |
| 786 | + <li class="md-nav__item"> | |
| 787 | + <a href="../../architecture/sync-bridge/" class="md-nav__link"> | |
| 788 | + | |
| 789 | + | |
| 790 | + | |
| 791 | + <span class="md-ellipsis"> | |
| 792 | + | |
| 793 | + | |
| 794 | + Sync Bridge | |
| 795 | + | |
| 796 | + | |
| 797 | + | |
| 798 | + </span> | |
| 799 | + | |
| 800 | + | |
| 801 | + | |
| 802 | + </a> | |
| 803 | + </li> | |
| 804 | + | |
| 805 | + | |
| 806 | + | |
| 807 | + | |
| 808 | + </ul> | |
| 809 | + </nav> | |
| 810 | + | |
| 811 | + </li> | |
| 812 | + | |
| 813 | + | |
| 814 | + | |
| 815 | + </ul> | |
| 816 | +</nav> | |
| 817 | + </div> | |
| 818 | + </div> | |
| 819 | + </div> | |
| 820 | + | |
| 821 | + | |
| 822 | + | |
| 823 | + <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > | |
| 824 | + <div class="md-sidebar__scrollwrap"> | |
| 825 | + <div class="md-sidebar__inner"> | |
| 826 | + | |
| 827 | + | |
| 828 | +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
| 829 | + | |
| 830 | + | |
| 831 | + | |
| 832 | + | |
| 833 | + | |
| 834 | + | |
| 835 | + <label class="md-nav__title" for="__toc"> | |
| 836 | + <span class="md-nav__icon md-icon"></span> | |
| 837 | + Table of contents | |
| 838 | + </label> | |
| 839 | + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> | |
| 840 | + | |
| 841 | + <li class="md-nav__item"> | |
| 842 | + <a href="#environment-variables" class="md-nav__link"> | |
| 843 | + <span class="md-ellipsis"> | |
| 844 | + | |
| 845 | + Environment Variables | |
| 846 | + | |
| 847 | + </span> | |
| 848 | + </a> | |
| 849 | + | |
| 850 | + <nav class="md-nav" aria-label="Environment Variables"> | |
| 851 | + <ul class="md-nav__list"> | |
| 852 | + | |
| 853 | + <li class="md-nav__item"> | |
| 854 | + <a href="#django-settings" class="md-nav__link"> | |
| 855 | + <span class="md-ellipsis"> | |
| 856 | + | |
| 857 | + Django Settings | |
| 858 | + | |
| 859 | + </span> | |
| 860 | + </a> | |
| 861 | + | |
| 862 | +</li> | |
| 863 | + | |
| 864 | + <li class="md-nav__item"> | |
| 865 | + <a href="#database" class="md-nav__link"> | |
| 866 | + <span class="md-ellipsis"> | |
| 867 | + | |
| 868 | + Database | |
| 869 | + | |
| 870 | + </span> | |
| 871 | + </a> | |
| 872 | + | |
| 873 | +</li> | |
| 874 | + | |
| 875 | + <li class="md-nav__item"> | |
| 876 | + <a href="#redis-celery" class="md-nav__link"> | |
| 877 | + <span class="md-ellipsis"> | |
| 878 | + | |
| 879 | + Redis & Celery | |
| 880 | + | |
| 881 | + </span> | |
| 882 | + </a> | |
| 883 | + | |
| 884 | +</li> | |
| 885 | + | |
| 886 | + <li class="md-nav__item"> | |
| 887 | + <a href="#fossil" class="md-nav__link"> | |
| 888 | + <span class="md-ellipsis"> | |
| 889 | + | |
| 890 | + Fossil | |
| 891 | + | |
| 892 | + </span> | |
| 893 | + </a> | |
| 894 | + | |
| 895 | +</li> | |
| 896 | + | |
| 897 | + <li class="md-nav__item"> | |
| 898 | + <a href="#caddy-production" class="md-nav__link"> | |
| 899 | + <span class="md-ellipsis"> | |
| 900 | + | |
| 901 | + Caddy (Production) | |
| 902 | + | |
| 903 | + </span> | |
| 904 | + </a> | |
| 905 | + | |
| 906 | +</li> | |
| 907 | + | |
| 908 | + <li class="md-nav__item"> | |
| 909 | + <a href="#litestream-backups" class="md-nav__link"> | |
| 910 | + <span class="md-ellipsis"> | |
| 911 | + | |
| 912 | + Litestream (Backups) | |
| 913 | + | |
| 914 | + </span> | |
| 915 | + </a> | |
| 916 | + | |
| 917 | +</li> | |
| 918 | + | |
| 919 | + <li class="md-nav__item"> | |
| 920 | + <a href="#sync-bridge" class="md-nav__link"> | |
| 921 | + <span class="md-ellipsis"> | |
| 922 | + | |
| 923 | + Sync Bridge | |
| 924 | + | |
| 925 | + </span> | |
| 926 | + </a> | |
| 927 | + | |
| 928 | +</li> | |
| 929 | + | |
| 930 | + </ul> | |
| 931 | + </nav> | |
| 932 | + | |
| 933 | +</li> | |
| 934 | + | |
| 935 | + <li class="md-nav__item"> | |
| 936 | + <a href="#caddy-configuration" class="md-nav__link"> | |
| 937 | + <span class="md-ellipsis"> | |
| 938 | + | |
| 939 | + Caddy Configuration | |
| 940 | + | |
| 941 | + </span> | |
| 942 | + </a> | |
| 943 | + | |
| 944 | +</li> | |
| 945 | + | |
| 946 | + <li class="md-nav__item"> | |
| 947 | + <a href="#litestream-configuration" class="md-nav__link"> | |
| 948 | + <span class="md-ellipsis"> | |
| 949 | + | |
| 950 | + Litestream Configuration | |
| 951 | + | |
| 952 | + </span> | |
| 953 | + </a> | |
| 954 | + | |
| 955 | +</li> | |
| 956 | + | |
| 957 | + </ul> | |
| 958 | + | |
| 959 | +</nav> | |
| 960 | + </div> | |
| 961 | + </div> | |
| 962 | + </div> | |
| 963 | + | |
| 964 | + | |
| 965 | + | |
| 966 | + <div class="md-content" data-md-component="content"> | |
| 967 | + | |
| 968 | + <article class="md-content__inner md-typeset"> | |
| 969 | + | |
| 970 | + | |
| 971 | + | |
| 972 | + | |
| 973 | + | |
| 974 | + | |
| 975 | + | |
| 976 | + | |
| 977 | +<h1 id="configuration">Configuration<a class="headerlink" href="#configuration" title="Permanent link">¶</a></h1> | |
| 978 | +<h2 id="environment-variables">Environment Variables<a class="headerlink" href="#environment-variables" title="Permanent link">¶</a></h2> | |
| 979 | +<p>All configuration is done through environment variables, loaded from <code>.env</code> in development.</p> | |
| 980 | +<h3 id="django-settings">Django Settings<a class="headerlink" href="#django-settings" title="Permanent link">¶</a></h3> | |
| 981 | +<table> | |
| 982 | +<thead> | |
| 983 | +<tr> | |
| 984 | +<th>Variable</th> | |
| 985 | +<th>Default</th> | |
| 986 | +<th>Description</th> | |
| 987 | +</tr> | |
| 988 | +</thead> | |
| 989 | +<tbody> | |
| 990 | +<tr> | |
| 991 | +<td><code>SECRET_KEY</code></td> | |
| 992 | +<td>--</td> | |
| 993 | +<td>Django secret key (required)</td> | |
| 994 | +</tr> | |
| 995 | +<tr> | |
| 996 | +<td><code>DEBUG</code></td> | |
| 997 | +<td><code>False</code></td> | |
| 998 | +<td>Enable debug mode</td> | |
| 999 | +</tr> | |
| 1000 | +<tr> | |
| 1001 | +<td><code>ALLOWED_HOSTS</code></td> | |
| 1002 | +<td><code>localhost</code></td> | |
| 1003 | +<td>Comma-separated list of allowed hosts</td> | |
| 1004 | +</tr> | |
| 1005 | +<tr> | |
| 1006 | +<td><code>TIME_ZONE</code></td> | |
| 1007 | +<td><code>UTC</code></td> | |
| 1008 | +<td>Server timezone</td> | |
| 1009 | +</tr> | |
| 1010 | +</tbody> | |
| 1011 | +</table> | |
| 1012 | +<h3 id="database">Database<a class="headerlink" href="#database" title="Permanent link">¶</a></h3> | |
| 1013 | +<table> | |
| 1014 | +<thead> | |
| 1015 | +<tr> | |
| 1016 | +<th>Variable</th> | |
| 1017 | +<th>Default</th> | |
| 1018 | +<th>Description</th> | |
| 1019 | +</tr> | |
| 1020 | +</thead> | |
| 1021 | +<tbody> | |
| 1022 | +<tr> | |
| 1023 | +<td><code>POSTGRES_DB</code></td> | |
| 1024 | +<td><code>fossilrepo</code></td> | |
| 1025 | +<td>Database name</td> | |
| 1026 | +</tr> | |
| 1027 | +<tr> | |
| 1028 | +<td><code>POSTGRES_USER</code></td> | |
| 1029 | +<td><code>fossilrepo</code></td> | |
| 1030 | +<td>Database user</td> | |
| 1031 | +</tr> | |
| 1032 | +<tr> | |
| 1033 | +<td><code>POSTGRES_PASSWORD</code></td> | |
| 1034 | +<td>--</td> | |
| 1035 | +<td>Database password (required)</td> | |
| 1036 | +</tr> | |
| 1037 | +<tr> | |
| 1038 | +<td><code>POSTGRES_HOST</code></td> | |
| 1039 | +<td><code>postgres</code></td> | |
| 1040 | +<td>Database host</td> | |
| 1041 | +</tr> | |
| 1042 | +<tr> | |
| 1043 | +<td><code>POSTGRES_PORT</code></td> | |
| 1044 | +<td><code>5432</code></td> | |
| 1045 | +<td>Database port</td> | |
| 1046 | +</tr> | |
| 1047 | +</tbody> | |
| 1048 | +</table> | |
| 1049 | +<h3 id="redis-celery">Redis & Celery<a class="headerlink" href="#redis-celery" title="Permanent link">¶</a></h3> | |
| 1050 | +<table> | |
| 1051 | +<thead> | |
| 1052 | +<tr> | |
| 1053 | +<th>Variable</th> | |
| 1054 | +<th>Default</th> | |
| 1055 | +<th>Description</th> | |
| 1056 | +</tr> | |
| 1057 | +</thead> | |
| 1058 | +<tbody> | |
| 1059 | +<tr> | |
| 1060 | +<td><code>REDIS_URL</code></td> | |
| 1061 | +<td><code>redis://redis:6379/0</code></td> | |
| 1062 | +<td>Redis connection URL</td> | |
| 1063 | +</tr> | |
| 1064 | +<tr> | |
| 1065 | +<td><code>CELERY_BROKER_URL</code></td> | |
| 1066 | +<td><code>$REDIS_URL</code></td> | |
| 1067 | +<td>Celery broker (defaults to Redis URL)</td> | |
| 1068 | +</tr> | |
| 1069 | +</tbody> | |
| 1070 | +</table> | |
| 1071 | +<h3 id="fossil">Fossil<a class="headerlink" href="#fossil" title="Permanent link">¶</a></h3> | |
| 1072 | +<table> | |
| 1073 | +<thead> | |
| 1074 | +<tr> | |
| 1075 | +<th>Variable</th> | |
| 1076 | +<th>Default</th> | |
| 1077 | +<th>Description</th> | |
| 1078 | +</tr> | |
| 1079 | +</thead> | |
| 1080 | +<tbody> | |
| 1081 | +<tr> | |
| 1082 | +<td><code>FOSSIL_REPO_DIR</code></td> | |
| 1083 | +<td><code>/data/repos</code></td> | |
| 1084 | +<td>Directory where <code>.fossil</code> files are stored</td> | |
| 1085 | +</tr> | |
| 1086 | +<tr> | |
| 1087 | +<td><code>FOSSIL_BASE_URL</code></td> | |
| 1088 | +<td>--</td> | |
| 1089 | +<td>Base URL for Fossil web UI (e.g., <code>https://code.example.com</code>)</td> | |
| 1090 | +</tr> | |
| 1091 | +<tr> | |
| 1092 | +<td><code>FOSSIL_BINARY</code></td> | |
| 1093 | +<td><code>fossil</code></td> | |
| 1094 | +<td>Path to the Fossil binary</td> | |
| 1095 | +</tr> | |
| 1096 | +</tbody> | |
| 1097 | +</table> | |
| 1098 | +<h3 id="caddy-production">Caddy (Production)<a class="headerlink" href="#caddy-production" title="Permanent link">¶</a></h3> | |
| 1099 | +<table> | |
| 1100 | +<thead> | |
| 1101 | +<tr> | |
| 1102 | +<th>Variable</th> | |
| 1103 | +<th>Default</th> | |
| 1104 | +<th>Description</th> | |
| 1105 | +</tr> | |
| 1106 | +</thead> | |
| 1107 | +<tbody> | |
| 1108 | +<tr> | |
| 1109 | +<td><code>CADDY_DOMAIN</code></td> | |
| 1110 | +<td>--</td> | |
| 1111 | +<td>Your domain (e.g., <code>example.com</code>)</td> | |
| 1112 | +</tr> | |
| 1113 | +<tr> | |
| 1114 | +<td><code>CADDY_EMAIL</code></td> | |
| 1115 | +<td>--</td> | |
| 1116 | +<td>Email for Let's Encrypt certificates</td> | |
| 1117 | +</tr> | |
| 1118 | +</tbody> | |
| 1119 | +</table> | |
| 1120 | +<h3 id="litestream-backups">Litestream (Backups)<a class="headerlink" href="#litestream-backups" title="Permanent link">¶</a></h3> | |
| 1121 | +<table> | |
| 1122 | +<thead> | |
| 1123 | +<tr> | |
| 1124 | +<th>Variable</th> | |
| 1125 | +<th>Default</th> | |
| 1126 | +<th>Description</th> | |
| 1127 | +</tr> | |
| 1128 | +</thead> | |
| 1129 | +<tbody> | |
| 1130 | +<tr> | |
| 1131 | +<td><code>LITESTREAM_ACCESS_KEY_ID</code></td> | |
| 1132 | +<td>--</td> | |
| 1133 | +<td>S3 access key</td> | |
| 1134 | +</tr> | |
| 1135 | +<tr> | |
| 1136 | +<td><code>LITESTREAM_SECRET_ACCESS_KEY</code></td> | |
| 1137 | +<td>--</td> | |
| 1138 | +<td>S3 secret key</td> | |
| 1139 | +</tr> | |
| 1140 | +<tr> | |
| 1141 | +<td><code>LITESTREAM_BUCKET</code></td> | |
| 1142 | +<td>--</td> | |
| 1143 | +<td>S3 bucket name</td> | |
| 1144 | +</tr> | |
| 1145 | +<tr> | |
| 1146 | +<td><code>LITESTREAM_ENDPOINT</code></td> | |
| 1147 | +<td>--</td> | |
| 1148 | +<td>S3 endpoint (for MinIO/B2)</td> | |
| 1149 | +</tr> | |
| 1150 | +<tr> | |
| 1151 | +<td><code>LITESTREAM_REGION</code></td> | |
| 1152 | +<td><code>us-east-1</code></td> | |
| 1153 | +<td>S3 region</td> | |
| 1154 | +</tr> | |
| 1155 | +</tbody> | |
| 1156 | +</table> | |
| 1157 | +<h3 id="sync-bridge">Sync Bridge<a class="headerlink" href="#sync-bridge" title="Permanent link">¶</a></h3> | |
| 1158 | +<table> | |
| 1159 | +<thead> | |
| 1160 | +<tr> | |
| 1161 | +<th>Variable</th> | |
| 1162 | +<th>Default</th> | |
| 1163 | +<th>Description</th> | |
| 1164 | +</tr> | |
| 1165 | +</thead> | |
| 1166 | +<tbody> | |
| 1167 | +<tr> | |
| 1168 | +<td><code>GITHUB_TOKEN</code></td> | |
| 1169 | +<td>--</td> | |
| 1170 | +<td>GitHub personal access token (for mirroring)</td> | |
| 1171 | +</tr> | |
| 1172 | +<tr> | |
| 1173 | +<td><code>GITLAB_TOKEN</code></td> | |
| 1174 | +<td>--</td> | |
| 1175 | +<td>GitLab personal access token (for mirroring)</td> | |
| 1176 | +</tr> | |
| 1177 | +</tbody> | |
| 1178 | +</table> | |
| 1179 | +<h2 id="caddy-configuration">Caddy Configuration<a class="headerlink" href="#caddy-configuration" title="Permanent link">¶</a></h2> | |
| 1180 | +<p>The Caddyfile controls SSL termination and subdomain routing. Each Fossil repo gets its own subdomain:</p> | |
| 1181 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>{$CADDY_DOMAIN} { | |
| 1182 | +<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> reverse_proxy django:8000 | |
| 1183 | +<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>} | |
| 1184 | +<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> | |
| 1185 | +<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a>*.{$CADDY_DOMAIN} { | |
| 1186 | +<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> reverse_proxy fossil:8080 | |
| 1187 | +<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a>} | |
| 1188 | +</code></pre></div> | |
| 1189 | +<p>Caddy automatically provisions Let's Encrypt certificates for all subdomains.</p> | |
| 1190 | +<h2 id="litestream-configuration">Litestream Configuration<a class="headerlink" href="#litestream-configuration" title="Permanent link">¶</a></h2> | |
| 1191 | +<p>Litestream continuously replicates every <code>.fossil</code> SQLite file to S3:</p> | |
| 1192 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="nt">dbs</span><span class="p">:</span> | |
| 1193 | +<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/data/repos/*.fossil</span> | |
| 1194 | +<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="w"> </span><span class="nt">replicas</span><span class="p">:</span> | |
| 1195 | +<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">s3</span> | |
| 1196 | +<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="w"> </span><span class="nt">bucket</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${LITESTREAM_BUCKET}</span> | |
| 1197 | +<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="w"> </span><span class="nt">endpoint</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${LITESTREAM_ENDPOINT}</span> | |
| 1198 | +<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="w"> </span><span class="nt">region</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${LITESTREAM_REGION}</span> | |
| 1199 | +</code></pre></div> | |
| 1200 | +<div class="admonition tip"> | |
| 1201 | +<p class="admonition-title">Point-in-time recovery</p> | |
| 1202 | +<p>Litestream replicates WAL frames continuously. You can restore any <code>.fossil</code> file to any point in time, not just the latest snapshot.</p> | |
| 1203 | +</div> | |
| 1204 | + | |
| 1205 | + | |
| 1206 | + | |
| 1207 | + | |
| 1208 | + | |
| 1209 | + | |
| 1210 | + | |
| 1211 | + | |
| 1212 | + | |
| 1213 | + | |
| 1214 | + | |
| 1215 | + | |
| 1216 | + | |
| 1217 | + </article> | |
| 1218 | + </div> | |
| 1219 | + | |
| 1220 | + | |
| 1221 | + <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> | |
| 1222 | + | |
| 1223 | +<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> | |
| 1224 | + </div> | |
| 1225 | + | |
| 1226 | + <button type="button" class="md-top md-icon" data-md-component="top" hidden> | |
| 1227 | + | |
| 1228 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> | |
| 1229 | + Back to top | |
| 1230 | +</button> | |
| 1231 | + | |
| 1232 | + </main> | |
| 1233 | + | |
| 1234 | + <footer class="md-footer"> | |
| 1235 | + | |
| 1236 | + <div class="md-footer-meta md-typeset"> | |
| 1237 | + <div class="md-footer-meta__inner md-grid"> | |
| 1238 | + <div class="md-copyright"> | |
| 1239 | + | |
| 1240 | + <div class="md-copyright__highlight"> | |
| 1241 | + Copyright © 2026 CONFLICT LLC | |
| 1242 | + </div> | |
| 1243 | + | |
| 1244 | + | |
| 1245 | + Made with | |
| 1246 | + <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> | |
| 1247 | + Material for MkDocs | |
| 1248 | + </a> | |
| 1249 | + | |
| 1250 | +</div> | |
| 1251 | + | |
| 1252 | + | |
| 1253 | +<div class="md-social"> | |
| 1254 | + | |
| 1255 | + | |
| 1256 | + | |
| 1257 | + | |
| 1258 | + | |
| 1259 | + | |
| 1260 | + | |
| 1261 | + | |
| 1262 | + <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link"> | |
| 1263 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 1264 | + </a> | |
| 1265 | + | |
| 1266 | +</div> | |
| 1267 | + | |
| 1268 | + </div> | |
| 1269 | + </div> | |
| 1270 | +</footer> | |
| 1271 | + | |
| 1272 | + </div> | |
| 1273 | + <div class="md-dialog" data-md-component="dialog"> | |
| 1274 | + <div class="md-dialog__inner md-typeset"></div> | |
| 1275 | + </div> | |
| 1276 | + | |
| 1277 | + | |
| 1278 | + | |
| 1279 | + | |
| 1280 | + | |
| 1281 | + <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> | |
| 1282 | + | |
| 1283 | + | |
| 1284 | + <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script> | |
| 1285 | + | |
| 1286 | + | |
| 1287 | + </body> | |
| 1288 | +</html> |
| --- a/site/getting-started/configuration/index.html | |
| +++ b/site/getting-started/configuration/index.html | |
| @@ -0,0 +1,1288 @@ | |
| --- a/site/getting-started/configuration/index.html | |
| +++ b/site/getting-started/configuration/index.html | |
| @@ -0,0 +1,1288 @@ | |
| 1 | |
| 2 | <!doctype html> |
| 3 | <html lang="en" class="no-js"> |
| 4 | <head> |
| 5 | |
| 6 | <meta charset="utf-8"> |
| 7 | <meta name="viewport" content="width=device-width,initial-scale=1"> |
| 8 | |
| 9 | <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting"> |
| 10 | |
| 11 | |
| 12 | <meta name="author" content="CONFLICT LLC"> |
| 13 | |
| 14 | |
| 15 | <link rel="canonical" href="https://fossilrepo.dev/getting-started/configuration/"> |
| 16 | |
| 17 | |
| 18 | <link rel="prev" href="../installation/"> |
| 19 | |
| 20 | |
| 21 | <link rel="next" href="../first-repo/"> |
| 22 | |
| 23 | |
| 24 | |
| 25 | |
| 26 | |
| 27 | <link rel="icon" href="../../assets/images/favicon.png"> |
| 28 | <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6"> |
| 29 | |
| 30 | |
| 31 | |
| 32 | <title>Configuration - Fossilrepo</title> |
| 33 | |
| 34 | |
| 35 | |
| 36 | <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css"> |
| 37 | |
| 38 | |
| 39 | <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css"> |
| 40 | |
| 41 | |
| 42 | |
| 43 | |
| 44 | |
| 45 | |
| 46 | |
| 47 | |
| 48 | |
| 49 | |
| 50 | |
| 51 | |
| 52 | <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
| 53 | <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> |
| 54 | <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> |
| 55 | |
| 56 | |
| 57 | |
| 58 | <link rel="stylesheet" href="../../assets/css/custom.css"> |
| 59 | |
| 60 | <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> |
| 61 | |
| 62 | |
| 63 | |
| 64 | |
| 65 | |
| 66 | </head> |
| 67 | |
| 68 | |
| 69 | |
| 70 | |
| 71 | |
| 72 | |
| 73 | |
| 74 | |
| 75 | |
| 76 | <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"> |
| 77 | |
| 78 | |
| 79 | <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> |
| 80 | <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> |
| 81 | <label class="md-overlay" for="__drawer"></label> |
| 82 | <div data-md-component="skip"> |
| 83 | |
| 84 | |
| 85 | <a href="#configuration" class="md-skip"> |
| 86 | Skip to content |
| 87 | </a> |
| 88 | |
| 89 | </div> |
| 90 | <div data-md-component="announce"> |
| 91 | |
| 92 | </div> |
| 93 | |
| 94 | |
| 95 | |
| 96 | |
| 97 | <header class="md-header" data-md-component="header"> |
| 98 | <nav class="md-header__inner md-grid" aria-label="Header"> |
| 99 | <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> |
| 100 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 101 | <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 102 | <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 103 | </div> |
| 104 | </a> |
| 105 | <label class="md-header__button md-icon" for="__drawer"> |
| 106 | |
| 107 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> |
| 108 | </label> |
| 109 | <div class="md-header__title" data-md-component="header-title"> |
| 110 | <div class="md-header__ellipsis"> |
| 111 | <div class="md-header__topic"> |
| 112 | <span class="md-ellipsis"> |
| 113 | Fossilrepo |
| 114 | </span> |
| 115 | </div> |
| 116 | <div class="md-header__topic" data-md-component="header-topic"> |
| 117 | <span class="md-ellipsis"> |
| 118 | |
| 119 | Configuration |
| 120 | |
| 121 | </span> |
| 122 | </div> |
| 123 | </div> |
| 124 | </div> |
| 125 | |
| 126 | |
| 127 | <form class="md-header__option" data-md-component="palette"> |
| 128 | |
| 129 | |
| 130 | |
| 131 | |
| 132 | <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> |
| 133 | |
| 134 | <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> |
| 135 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> |
| 136 | </label> |
| 137 | |
| 138 | |
| 139 | |
| 140 | |
| 141 | |
| 142 | <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> |
| 143 | |
| 144 | <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> |
| 145 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> |
| 146 | </label> |
| 147 | |
| 148 | |
| 149 | </form> |
| 150 | |
| 151 | |
| 152 | |
| 153 | <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> |
| 154 | |
| 155 | |
| 156 | |
| 157 | |
| 158 | |
| 159 | <label class="md-header__button md-icon" for="__search"> |
| 160 | |
| 161 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> |
| 162 | </label> |
| 163 | <div class="md-search" data-md-component="search" role="dialog"> |
| 164 | <label class="md-search__overlay" for="__search"></label> |
| 165 | <div class="md-search__inner" role="search"> |
| 166 | <form class="md-search__form" name="search"> |
| 167 | <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> |
| 168 | <label class="md-search__icon md-icon" for="__search"> |
| 169 | |
| 170 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> |
| 171 | |
| 172 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> |
| 173 | </label> |
| 174 | <nav class="md-search__options" aria-label="Search"> |
| 175 | |
| 176 | <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> |
| 177 | |
| 178 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> |
| 179 | </button> |
| 180 | </nav> |
| 181 | |
| 182 | <div class="md-search__suggest" data-md-component="search-suggest"></div> |
| 183 | |
| 184 | </form> |
| 185 | <div class="md-search__output"> |
| 186 | <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> |
| 187 | <div class="md-search-result" data-md-component="search-result"> |
| 188 | <div class="md-search-result__meta"> |
| 189 | Initializing search |
| 190 | </div> |
| 191 | <ol class="md-search-result__list" role="presentation"></ol> |
| 192 | </div> |
| 193 | </div> |
| 194 | </div> |
| 195 | </div> |
| 196 | </div> |
| 197 | |
| 198 | |
| 199 | |
| 200 | <div class="md-header__source"> |
| 201 | <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> |
| 202 | <div class="md-source__icon md-icon"> |
| 203 | |
| 204 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 205 | </div> |
| 206 | <div class="md-source__repository"> |
| 207 | ConflictHQ/fossilrepo |
| 208 | </div> |
| 209 | </a> |
| 210 | </div> |
| 211 | |
| 212 | </nav> |
| 213 | |
| 214 | </header> |
| 215 | |
| 216 | <div class="md-container" data-md-component="container"> |
| 217 | |
| 218 | |
| 219 | |
| 220 | |
| 221 | |
| 222 | <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> |
| 223 | <div class="md-grid"> |
| 224 | <ul class="md-tabs__list"> |
| 225 | |
| 226 | |
| 227 | |
| 228 | |
| 229 | |
| 230 | |
| 231 | <li class="md-tabs__item"> |
| 232 | <a href="../.." class="md-tabs__link"> |
| 233 | |
| 234 | |
| 235 | |
| 236 | |
| 237 | |
| 238 | Home |
| 239 | |
| 240 | </a> |
| 241 | </li> |
| 242 | |
| 243 | |
| 244 | |
| 245 | |
| 246 | |
| 247 | |
| 248 | |
| 249 | |
| 250 | |
| 251 | |
| 252 | |
| 253 | |
| 254 | <li class="md-tabs__item md-tabs__item--active"> |
| 255 | <a href="../prerequisites/" class="md-tabs__link"> |
| 256 | |
| 257 | |
| 258 | |
| 259 | Getting Started |
| 260 | |
| 261 | </a> |
| 262 | </li> |
| 263 | |
| 264 | |
| 265 | |
| 266 | |
| 267 | |
| 268 | |
| 269 | |
| 270 | |
| 271 | |
| 272 | |
| 273 | |
| 274 | <li class="md-tabs__item"> |
| 275 | <a href="../../architecture/overview/" class="md-tabs__link"> |
| 276 | |
| 277 | |
| 278 | |
| 279 | Architecture |
| 280 | |
| 281 | </a> |
| 282 | </li> |
| 283 | |
| 284 | |
| 285 | |
| 286 | |
| 287 | </ul> |
| 288 | </div> |
| 289 | </nav> |
| 290 | |
| 291 | |
| 292 | |
| 293 | <main class="md-main" data-md-component="main"> |
| 294 | <div class="md-main__inner md-grid"> |
| 295 | |
| 296 | |
| 297 | |
| 298 | <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > |
| 299 | <div class="md-sidebar__scrollwrap"> |
| 300 | <div class="md-sidebar__inner"> |
| 301 | |
| 302 | |
| 303 | |
| 304 | |
| 305 | |
| 306 | |
| 307 | <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> |
| 308 | <label class="md-nav__title" for="__drawer"> |
| 309 | <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> |
| 310 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 311 | <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 312 | <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 313 | </div> |
| 314 | </a> |
| 315 | Fossilrepo |
| 316 | </label> |
| 317 | |
| 318 | <div class="md-nav__source"> |
| 319 | <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> |
| 320 | <div class="md-source__icon md-icon"> |
| 321 | |
| 322 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 323 | </div> |
| 324 | <div class="md-source__repository"> |
| 325 | ConflictHQ/fossilrepo |
| 326 | </div> |
| 327 | </a> |
| 328 | </div> |
| 329 | |
| 330 | <ul class="md-nav__list" data-md-scrollfix> |
| 331 | |
| 332 | |
| 333 | |
| 334 | |
| 335 | |
| 336 | |
| 337 | |
| 338 | <li class="md-nav__item"> |
| 339 | <a href="../.." class="md-nav__link"> |
| 340 | |
| 341 | |
| 342 | |
| 343 | <span class="md-ellipsis"> |
| 344 | |
| 345 | |
| 346 | Home |
| 347 | |
| 348 | |
| 349 | |
| 350 | </span> |
| 351 | |
| 352 | |
| 353 | |
| 354 | </a> |
| 355 | </li> |
| 356 | |
| 357 | |
| 358 | |
| 359 | |
| 360 | |
| 361 | |
| 362 | |
| 363 | |
| 364 | |
| 365 | |
| 366 | |
| 367 | |
| 368 | |
| 369 | |
| 370 | |
| 371 | |
| 372 | |
| 373 | |
| 374 | |
| 375 | |
| 376 | |
| 377 | |
| 378 | |
| 379 | |
| 380 | <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> |
| 381 | |
| 382 | |
| 383 | |
| 384 | <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked> |
| 385 | |
| 386 | |
| 387 | <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex=""> |
| 388 | |
| 389 | |
| 390 | |
| 391 | <span class="md-ellipsis"> |
| 392 | |
| 393 | |
| 394 | Getting Started |
| 395 | |
| 396 | |
| 397 | |
| 398 | </span> |
| 399 | |
| 400 | |
| 401 | |
| 402 | <span class="md-nav__icon md-icon"></span> |
| 403 | </label> |
| 404 | |
| 405 | <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true"> |
| 406 | <label class="md-nav__title" for="__nav_2"> |
| 407 | <span class="md-nav__icon md-icon"></span> |
| 408 | |
| 409 | |
| 410 | Getting Started |
| 411 | |
| 412 | |
| 413 | </label> |
| 414 | <ul class="md-nav__list" data-md-scrollfix> |
| 415 | |
| 416 | |
| 417 | |
| 418 | |
| 419 | |
| 420 | |
| 421 | |
| 422 | <li class="md-nav__item"> |
| 423 | <a href="../prerequisites/" class="md-nav__link"> |
| 424 | |
| 425 | |
| 426 | |
| 427 | <span class="md-ellipsis"> |
| 428 | |
| 429 | |
| 430 | Prerequisites |
| 431 | |
| 432 | |
| 433 | |
| 434 | </span> |
| 435 | |
| 436 | |
| 437 | |
| 438 | </a> |
| 439 | </li> |
| 440 | |
| 441 | |
| 442 | |
| 443 | |
| 444 | |
| 445 | |
| 446 | |
| 447 | |
| 448 | |
| 449 | |
| 450 | <li class="md-nav__item"> |
| 451 | <a href="../installation/" class="md-nav__link"> |
| 452 | |
| 453 | |
| 454 | |
| 455 | <span class="md-ellipsis"> |
| 456 | |
| 457 | |
| 458 | Installation |
| 459 | |
| 460 | |
| 461 | |
| 462 | </span> |
| 463 | |
| 464 | |
| 465 | |
| 466 | </a> |
| 467 | </li> |
| 468 | |
| 469 | |
| 470 | |
| 471 | |
| 472 | |
| 473 | |
| 474 | |
| 475 | |
| 476 | |
| 477 | |
| 478 | |
| 479 | |
| 480 | <li class="md-nav__item md-nav__item--active"> |
| 481 | |
| 482 | <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> |
| 483 | |
| 484 | |
| 485 | |
| 486 | |
| 487 | |
| 488 | <label class="md-nav__link md-nav__link--active" for="__toc"> |
| 489 | |
| 490 | |
| 491 | |
| 492 | <span class="md-ellipsis"> |
| 493 | |
| 494 | |
| 495 | Configuration |
| 496 | |
| 497 | |
| 498 | |
| 499 | </span> |
| 500 | |
| 501 | |
| 502 | |
| 503 | <span class="md-nav__icon md-icon"></span> |
| 504 | </label> |
| 505 | |
| 506 | <a href="./" class="md-nav__link md-nav__link--active"> |
| 507 | |
| 508 | |
| 509 | |
| 510 | <span class="md-ellipsis"> |
| 511 | |
| 512 | |
| 513 | Configuration |
| 514 | |
| 515 | |
| 516 | |
| 517 | </span> |
| 518 | |
| 519 | |
| 520 | |
| 521 | </a> |
| 522 | |
| 523 | |
| 524 | |
| 525 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> |
| 526 | |
| 527 | |
| 528 | |
| 529 | |
| 530 | |
| 531 | |
| 532 | <label class="md-nav__title" for="__toc"> |
| 533 | <span class="md-nav__icon md-icon"></span> |
| 534 | Table of contents |
| 535 | </label> |
| 536 | <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> |
| 537 | |
| 538 | <li class="md-nav__item"> |
| 539 | <a href="#environment-variables" class="md-nav__link"> |
| 540 | <span class="md-ellipsis"> |
| 541 | |
| 542 | Environment Variables |
| 543 | |
| 544 | </span> |
| 545 | </a> |
| 546 | |
| 547 | <nav class="md-nav" aria-label="Environment Variables"> |
| 548 | <ul class="md-nav__list"> |
| 549 | |
| 550 | <li class="md-nav__item"> |
| 551 | <a href="#django-settings" class="md-nav__link"> |
| 552 | <span class="md-ellipsis"> |
| 553 | |
| 554 | Django Settings |
| 555 | |
| 556 | </span> |
| 557 | </a> |
| 558 | |
| 559 | </li> |
| 560 | |
| 561 | <li class="md-nav__item"> |
| 562 | <a href="#database" class="md-nav__link"> |
| 563 | <span class="md-ellipsis"> |
| 564 | |
| 565 | Database |
| 566 | |
| 567 | </span> |
| 568 | </a> |
| 569 | |
| 570 | </li> |
| 571 | |
| 572 | <li class="md-nav__item"> |
| 573 | <a href="#redis-celery" class="md-nav__link"> |
| 574 | <span class="md-ellipsis"> |
| 575 | |
| 576 | Redis & Celery |
| 577 | |
| 578 | </span> |
| 579 | </a> |
| 580 | |
| 581 | </li> |
| 582 | |
| 583 | <li class="md-nav__item"> |
| 584 | <a href="#fossil" class="md-nav__link"> |
| 585 | <span class="md-ellipsis"> |
| 586 | |
| 587 | Fossil |
| 588 | |
| 589 | </span> |
| 590 | </a> |
| 591 | |
| 592 | </li> |
| 593 | |
| 594 | <li class="md-nav__item"> |
| 595 | <a href="#caddy-production" class="md-nav__link"> |
| 596 | <span class="md-ellipsis"> |
| 597 | |
| 598 | Caddy (Production) |
| 599 | |
| 600 | </span> |
| 601 | </a> |
| 602 | |
| 603 | </li> |
| 604 | |
| 605 | <li class="md-nav__item"> |
| 606 | <a href="#litestream-backups" class="md-nav__link"> |
| 607 | <span class="md-ellipsis"> |
| 608 | |
| 609 | Litestream (Backups) |
| 610 | |
| 611 | </span> |
| 612 | </a> |
| 613 | |
| 614 | </li> |
| 615 | |
| 616 | <li class="md-nav__item"> |
| 617 | <a href="#sync-bridge" class="md-nav__link"> |
| 618 | <span class="md-ellipsis"> |
| 619 | |
| 620 | Sync Bridge |
| 621 | |
| 622 | </span> |
| 623 | </a> |
| 624 | |
| 625 | </li> |
| 626 | |
| 627 | </ul> |
| 628 | </nav> |
| 629 | |
| 630 | </li> |
| 631 | |
| 632 | <li class="md-nav__item"> |
| 633 | <a href="#caddy-configuration" class="md-nav__link"> |
| 634 | <span class="md-ellipsis"> |
| 635 | |
| 636 | Caddy Configuration |
| 637 | |
| 638 | </span> |
| 639 | </a> |
| 640 | |
| 641 | </li> |
| 642 | |
| 643 | <li class="md-nav__item"> |
| 644 | <a href="#litestream-configuration" class="md-nav__link"> |
| 645 | <span class="md-ellipsis"> |
| 646 | |
| 647 | Litestream Configuration |
| 648 | |
| 649 | </span> |
| 650 | </a> |
| 651 | |
| 652 | </li> |
| 653 | |
| 654 | </ul> |
| 655 | |
| 656 | </nav> |
| 657 | |
| 658 | </li> |
| 659 | |
| 660 | |
| 661 | |
| 662 | |
| 663 | |
| 664 | |
| 665 | |
| 666 | |
| 667 | |
| 668 | |
| 669 | <li class="md-nav__item"> |
| 670 | <a href="../first-repo/" class="md-nav__link"> |
| 671 | |
| 672 | |
| 673 | |
| 674 | <span class="md-ellipsis"> |
| 675 | |
| 676 | |
| 677 | First Repository |
| 678 | |
| 679 | |
| 680 | |
| 681 | </span> |
| 682 | |
| 683 | |
| 684 | |
| 685 | </a> |
| 686 | </li> |
| 687 | |
| 688 | |
| 689 | |
| 690 | |
| 691 | </ul> |
| 692 | </nav> |
| 693 | |
| 694 | </li> |
| 695 | |
| 696 | |
| 697 | |
| 698 | |
| 699 | |
| 700 | |
| 701 | |
| 702 | |
| 703 | |
| 704 | |
| 705 | |
| 706 | |
| 707 | |
| 708 | |
| 709 | |
| 710 | |
| 711 | |
| 712 | |
| 713 | |
| 714 | <li class="md-nav__item md-nav__item--nested"> |
| 715 | |
| 716 | |
| 717 | |
| 718 | |
| 719 | |
| 720 | <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" > |
| 721 | |
| 722 | |
| 723 | <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> |
| 724 | |
| 725 | |
| 726 | |
| 727 | <span class="md-ellipsis"> |
| 728 | |
| 729 | |
| 730 | Architecture |
| 731 | |
| 732 | |
| 733 | |
| 734 | </span> |
| 735 | |
| 736 | |
| 737 | |
| 738 | <span class="md-nav__icon md-icon"></span> |
| 739 | </label> |
| 740 | |
| 741 | <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> |
| 742 | <label class="md-nav__title" for="__nav_3"> |
| 743 | <span class="md-nav__icon md-icon"></span> |
| 744 | |
| 745 | |
| 746 | Architecture |
| 747 | |
| 748 | |
| 749 | </label> |
| 750 | <ul class="md-nav__list" data-md-scrollfix> |
| 751 | |
| 752 | |
| 753 | |
| 754 | |
| 755 | |
| 756 | |
| 757 | |
| 758 | <li class="md-nav__item"> |
| 759 | <a href="../../architecture/overview/" class="md-nav__link"> |
| 760 | |
| 761 | |
| 762 | |
| 763 | <span class="md-ellipsis"> |
| 764 | |
| 765 | |
| 766 | Overview |
| 767 | |
| 768 | |
| 769 | |
| 770 | </span> |
| 771 | |
| 772 | |
| 773 | |
| 774 | </a> |
| 775 | </li> |
| 776 | |
| 777 | |
| 778 | |
| 779 | |
| 780 | |
| 781 | |
| 782 | |
| 783 | |
| 784 | |
| 785 | |
| 786 | <li class="md-nav__item"> |
| 787 | <a href="../../architecture/sync-bridge/" class="md-nav__link"> |
| 788 | |
| 789 | |
| 790 | |
| 791 | <span class="md-ellipsis"> |
| 792 | |
| 793 | |
| 794 | Sync Bridge |
| 795 | |
| 796 | |
| 797 | |
| 798 | </span> |
| 799 | |
| 800 | |
| 801 | |
| 802 | </a> |
| 803 | </li> |
| 804 | |
| 805 | |
| 806 | |
| 807 | |
| 808 | </ul> |
| 809 | </nav> |
| 810 | |
| 811 | </li> |
| 812 | |
| 813 | |
| 814 | |
| 815 | </ul> |
| 816 | </nav> |
| 817 | </div> |
| 818 | </div> |
| 819 | </div> |
| 820 | |
| 821 | |
| 822 | |
| 823 | <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > |
| 824 | <div class="md-sidebar__scrollwrap"> |
| 825 | <div class="md-sidebar__inner"> |
| 826 | |
| 827 | |
| 828 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> |
| 829 | |
| 830 | |
| 831 | |
| 832 | |
| 833 | |
| 834 | |
| 835 | <label class="md-nav__title" for="__toc"> |
| 836 | <span class="md-nav__icon md-icon"></span> |
| 837 | Table of contents |
| 838 | </label> |
| 839 | <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> |
| 840 | |
| 841 | <li class="md-nav__item"> |
| 842 | <a href="#environment-variables" class="md-nav__link"> |
| 843 | <span class="md-ellipsis"> |
| 844 | |
| 845 | Environment Variables |
| 846 | |
| 847 | </span> |
| 848 | </a> |
| 849 | |
| 850 | <nav class="md-nav" aria-label="Environment Variables"> |
| 851 | <ul class="md-nav__list"> |
| 852 | |
| 853 | <li class="md-nav__item"> |
| 854 | <a href="#django-settings" class="md-nav__link"> |
| 855 | <span class="md-ellipsis"> |
| 856 | |
| 857 | Django Settings |
| 858 | |
| 859 | </span> |
| 860 | </a> |
| 861 | |
| 862 | </li> |
| 863 | |
| 864 | <li class="md-nav__item"> |
| 865 | <a href="#database" class="md-nav__link"> |
| 866 | <span class="md-ellipsis"> |
| 867 | |
| 868 | Database |
| 869 | |
| 870 | </span> |
| 871 | </a> |
| 872 | |
| 873 | </li> |
| 874 | |
| 875 | <li class="md-nav__item"> |
| 876 | <a href="#redis-celery" class="md-nav__link"> |
| 877 | <span class="md-ellipsis"> |
| 878 | |
| 879 | Redis & Celery |
| 880 | |
| 881 | </span> |
| 882 | </a> |
| 883 | |
| 884 | </li> |
| 885 | |
| 886 | <li class="md-nav__item"> |
| 887 | <a href="#fossil" class="md-nav__link"> |
| 888 | <span class="md-ellipsis"> |
| 889 | |
| 890 | Fossil |
| 891 | |
| 892 | </span> |
| 893 | </a> |
| 894 | |
| 895 | </li> |
| 896 | |
| 897 | <li class="md-nav__item"> |
| 898 | <a href="#caddy-production" class="md-nav__link"> |
| 899 | <span class="md-ellipsis"> |
| 900 | |
| 901 | Caddy (Production) |
| 902 | |
| 903 | </span> |
| 904 | </a> |
| 905 | |
| 906 | </li> |
| 907 | |
| 908 | <li class="md-nav__item"> |
| 909 | <a href="#litestream-backups" class="md-nav__link"> |
| 910 | <span class="md-ellipsis"> |
| 911 | |
| 912 | Litestream (Backups) |
| 913 | |
| 914 | </span> |
| 915 | </a> |
| 916 | |
| 917 | </li> |
| 918 | |
| 919 | <li class="md-nav__item"> |
| 920 | <a href="#sync-bridge" class="md-nav__link"> |
| 921 | <span class="md-ellipsis"> |
| 922 | |
| 923 | Sync Bridge |
| 924 | |
| 925 | </span> |
| 926 | </a> |
| 927 | |
| 928 | </li> |
| 929 | |
| 930 | </ul> |
| 931 | </nav> |
| 932 | |
| 933 | </li> |
| 934 | |
| 935 | <li class="md-nav__item"> |
| 936 | <a href="#caddy-configuration" class="md-nav__link"> |
| 937 | <span class="md-ellipsis"> |
| 938 | |
| 939 | Caddy Configuration |
| 940 | |
| 941 | </span> |
| 942 | </a> |
| 943 | |
| 944 | </li> |
| 945 | |
| 946 | <li class="md-nav__item"> |
| 947 | <a href="#litestream-configuration" class="md-nav__link"> |
| 948 | <span class="md-ellipsis"> |
| 949 | |
| 950 | Litestream Configuration |
| 951 | |
| 952 | </span> |
| 953 | </a> |
| 954 | |
| 955 | </li> |
| 956 | |
| 957 | </ul> |
| 958 | |
| 959 | </nav> |
| 960 | </div> |
| 961 | </div> |
| 962 | </div> |
| 963 | |
| 964 | |
| 965 | |
| 966 | <div class="md-content" data-md-component="content"> |
| 967 | |
| 968 | <article class="md-content__inner md-typeset"> |
| 969 | |
| 970 | |
| 971 | |
| 972 | |
| 973 | |
| 974 | |
| 975 | |
| 976 | |
| 977 | <h1 id="configuration">Configuration<a class="headerlink" href="#configuration" title="Permanent link">¶</a></h1> |
| 978 | <h2 id="environment-variables">Environment Variables<a class="headerlink" href="#environment-variables" title="Permanent link">¶</a></h2> |
| 979 | <p>All configuration is done through environment variables, loaded from <code>.env</code> in development.</p> |
| 980 | <h3 id="django-settings">Django Settings<a class="headerlink" href="#django-settings" title="Permanent link">¶</a></h3> |
| 981 | <table> |
| 982 | <thead> |
| 983 | <tr> |
| 984 | <th>Variable</th> |
| 985 | <th>Default</th> |
| 986 | <th>Description</th> |
| 987 | </tr> |
| 988 | </thead> |
| 989 | <tbody> |
| 990 | <tr> |
| 991 | <td><code>SECRET_KEY</code></td> |
| 992 | <td>--</td> |
| 993 | <td>Django secret key (required)</td> |
| 994 | </tr> |
| 995 | <tr> |
| 996 | <td><code>DEBUG</code></td> |
| 997 | <td><code>False</code></td> |
| 998 | <td>Enable debug mode</td> |
| 999 | </tr> |
| 1000 | <tr> |
| 1001 | <td><code>ALLOWED_HOSTS</code></td> |
| 1002 | <td><code>localhost</code></td> |
| 1003 | <td>Comma-separated list of allowed hosts</td> |
| 1004 | </tr> |
| 1005 | <tr> |
| 1006 | <td><code>TIME_ZONE</code></td> |
| 1007 | <td><code>UTC</code></td> |
| 1008 | <td>Server timezone</td> |
| 1009 | </tr> |
| 1010 | </tbody> |
| 1011 | </table> |
| 1012 | <h3 id="database">Database<a class="headerlink" href="#database" title="Permanent link">¶</a></h3> |
| 1013 | <table> |
| 1014 | <thead> |
| 1015 | <tr> |
| 1016 | <th>Variable</th> |
| 1017 | <th>Default</th> |
| 1018 | <th>Description</th> |
| 1019 | </tr> |
| 1020 | </thead> |
| 1021 | <tbody> |
| 1022 | <tr> |
| 1023 | <td><code>POSTGRES_DB</code></td> |
| 1024 | <td><code>fossilrepo</code></td> |
| 1025 | <td>Database name</td> |
| 1026 | </tr> |
| 1027 | <tr> |
| 1028 | <td><code>POSTGRES_USER</code></td> |
| 1029 | <td><code>fossilrepo</code></td> |
| 1030 | <td>Database user</td> |
| 1031 | </tr> |
| 1032 | <tr> |
| 1033 | <td><code>POSTGRES_PASSWORD</code></td> |
| 1034 | <td>--</td> |
| 1035 | <td>Database password (required)</td> |
| 1036 | </tr> |
| 1037 | <tr> |
| 1038 | <td><code>POSTGRES_HOST</code></td> |
| 1039 | <td><code>postgres</code></td> |
| 1040 | <td>Database host</td> |
| 1041 | </tr> |
| 1042 | <tr> |
| 1043 | <td><code>POSTGRES_PORT</code></td> |
| 1044 | <td><code>5432</code></td> |
| 1045 | <td>Database port</td> |
| 1046 | </tr> |
| 1047 | </tbody> |
| 1048 | </table> |
| 1049 | <h3 id="redis-celery">Redis & Celery<a class="headerlink" href="#redis-celery" title="Permanent link">¶</a></h3> |
| 1050 | <table> |
| 1051 | <thead> |
| 1052 | <tr> |
| 1053 | <th>Variable</th> |
| 1054 | <th>Default</th> |
| 1055 | <th>Description</th> |
| 1056 | </tr> |
| 1057 | </thead> |
| 1058 | <tbody> |
| 1059 | <tr> |
| 1060 | <td><code>REDIS_URL</code></td> |
| 1061 | <td><code>redis://redis:6379/0</code></td> |
| 1062 | <td>Redis connection URL</td> |
| 1063 | </tr> |
| 1064 | <tr> |
| 1065 | <td><code>CELERY_BROKER_URL</code></td> |
| 1066 | <td><code>$REDIS_URL</code></td> |
| 1067 | <td>Celery broker (defaults to Redis URL)</td> |
| 1068 | </tr> |
| 1069 | </tbody> |
| 1070 | </table> |
| 1071 | <h3 id="fossil">Fossil<a class="headerlink" href="#fossil" title="Permanent link">¶</a></h3> |
| 1072 | <table> |
| 1073 | <thead> |
| 1074 | <tr> |
| 1075 | <th>Variable</th> |
| 1076 | <th>Default</th> |
| 1077 | <th>Description</th> |
| 1078 | </tr> |
| 1079 | </thead> |
| 1080 | <tbody> |
| 1081 | <tr> |
| 1082 | <td><code>FOSSIL_REPO_DIR</code></td> |
| 1083 | <td><code>/data/repos</code></td> |
| 1084 | <td>Directory where <code>.fossil</code> files are stored</td> |
| 1085 | </tr> |
| 1086 | <tr> |
| 1087 | <td><code>FOSSIL_BASE_URL</code></td> |
| 1088 | <td>--</td> |
| 1089 | <td>Base URL for Fossil web UI (e.g., <code>https://code.example.com</code>)</td> |
| 1090 | </tr> |
| 1091 | <tr> |
| 1092 | <td><code>FOSSIL_BINARY</code></td> |
| 1093 | <td><code>fossil</code></td> |
| 1094 | <td>Path to the Fossil binary</td> |
| 1095 | </tr> |
| 1096 | </tbody> |
| 1097 | </table> |
| 1098 | <h3 id="caddy-production">Caddy (Production)<a class="headerlink" href="#caddy-production" title="Permanent link">¶</a></h3> |
| 1099 | <table> |
| 1100 | <thead> |
| 1101 | <tr> |
| 1102 | <th>Variable</th> |
| 1103 | <th>Default</th> |
| 1104 | <th>Description</th> |
| 1105 | </tr> |
| 1106 | </thead> |
| 1107 | <tbody> |
| 1108 | <tr> |
| 1109 | <td><code>CADDY_DOMAIN</code></td> |
| 1110 | <td>--</td> |
| 1111 | <td>Your domain (e.g., <code>example.com</code>)</td> |
| 1112 | </tr> |
| 1113 | <tr> |
| 1114 | <td><code>CADDY_EMAIL</code></td> |
| 1115 | <td>--</td> |
| 1116 | <td>Email for Let's Encrypt certificates</td> |
| 1117 | </tr> |
| 1118 | </tbody> |
| 1119 | </table> |
| 1120 | <h3 id="litestream-backups">Litestream (Backups)<a class="headerlink" href="#litestream-backups" title="Permanent link">¶</a></h3> |
| 1121 | <table> |
| 1122 | <thead> |
| 1123 | <tr> |
| 1124 | <th>Variable</th> |
| 1125 | <th>Default</th> |
| 1126 | <th>Description</th> |
| 1127 | </tr> |
| 1128 | </thead> |
| 1129 | <tbody> |
| 1130 | <tr> |
| 1131 | <td><code>LITESTREAM_ACCESS_KEY_ID</code></td> |
| 1132 | <td>--</td> |
| 1133 | <td>S3 access key</td> |
| 1134 | </tr> |
| 1135 | <tr> |
| 1136 | <td><code>LITESTREAM_SECRET_ACCESS_KEY</code></td> |
| 1137 | <td>--</td> |
| 1138 | <td>S3 secret key</td> |
| 1139 | </tr> |
| 1140 | <tr> |
| 1141 | <td><code>LITESTREAM_BUCKET</code></td> |
| 1142 | <td>--</td> |
| 1143 | <td>S3 bucket name</td> |
| 1144 | </tr> |
| 1145 | <tr> |
| 1146 | <td><code>LITESTREAM_ENDPOINT</code></td> |
| 1147 | <td>--</td> |
| 1148 | <td>S3 endpoint (for MinIO/B2)</td> |
| 1149 | </tr> |
| 1150 | <tr> |
| 1151 | <td><code>LITESTREAM_REGION</code></td> |
| 1152 | <td><code>us-east-1</code></td> |
| 1153 | <td>S3 region</td> |
| 1154 | </tr> |
| 1155 | </tbody> |
| 1156 | </table> |
| 1157 | <h3 id="sync-bridge">Sync Bridge<a class="headerlink" href="#sync-bridge" title="Permanent link">¶</a></h3> |
| 1158 | <table> |
| 1159 | <thead> |
| 1160 | <tr> |
| 1161 | <th>Variable</th> |
| 1162 | <th>Default</th> |
| 1163 | <th>Description</th> |
| 1164 | </tr> |
| 1165 | </thead> |
| 1166 | <tbody> |
| 1167 | <tr> |
| 1168 | <td><code>GITHUB_TOKEN</code></td> |
| 1169 | <td>--</td> |
| 1170 | <td>GitHub personal access token (for mirroring)</td> |
| 1171 | </tr> |
| 1172 | <tr> |
| 1173 | <td><code>GITLAB_TOKEN</code></td> |
| 1174 | <td>--</td> |
| 1175 | <td>GitLab personal access token (for mirroring)</td> |
| 1176 | </tr> |
| 1177 | </tbody> |
| 1178 | </table> |
| 1179 | <h2 id="caddy-configuration">Caddy Configuration<a class="headerlink" href="#caddy-configuration" title="Permanent link">¶</a></h2> |
| 1180 | <p>The Caddyfile controls SSL termination and subdomain routing. Each Fossil repo gets its own subdomain:</p> |
| 1181 | <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>{$CADDY_DOMAIN} { |
| 1182 | <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> reverse_proxy django:8000 |
| 1183 | <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>} |
| 1184 | <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> |
| 1185 | <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a>*.{$CADDY_DOMAIN} { |
| 1186 | <a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> reverse_proxy fossil:8080 |
| 1187 | <a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a>} |
| 1188 | </code></pre></div> |
| 1189 | <p>Caddy automatically provisions Let's Encrypt certificates for all subdomains.</p> |
| 1190 | <h2 id="litestream-configuration">Litestream Configuration<a class="headerlink" href="#litestream-configuration" title="Permanent link">¶</a></h2> |
| 1191 | <p>Litestream continuously replicates every <code>.fossil</code> SQLite file to S3:</p> |
| 1192 | <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="nt">dbs</span><span class="p">:</span> |
| 1193 | <a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/data/repos/*.fossil</span> |
| 1194 | <a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="w"> </span><span class="nt">replicas</span><span class="p">:</span> |
| 1195 | <a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">s3</span> |
| 1196 | <a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="w"> </span><span class="nt">bucket</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${LITESTREAM_BUCKET}</span> |
| 1197 | <a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="w"> </span><span class="nt">endpoint</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${LITESTREAM_ENDPOINT}</span> |
| 1198 | <a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="w"> </span><span class="nt">region</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${LITESTREAM_REGION}</span> |
| 1199 | </code></pre></div> |
| 1200 | <div class="admonition tip"> |
| 1201 | <p class="admonition-title">Point-in-time recovery</p> |
| 1202 | <p>Litestream replicates WAL frames continuously. You can restore any <code>.fossil</code> file to any point in time, not just the latest snapshot.</p> |
| 1203 | </div> |
| 1204 | |
| 1205 | |
| 1206 | |
| 1207 | |
| 1208 | |
| 1209 | |
| 1210 | |
| 1211 | |
| 1212 | |
| 1213 | |
| 1214 | |
| 1215 | |
| 1216 | |
| 1217 | </article> |
| 1218 | </div> |
| 1219 | |
| 1220 | |
| 1221 | <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> |
| 1222 | |
| 1223 | <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> |
| 1224 | </div> |
| 1225 | |
| 1226 | <button type="button" class="md-top md-icon" data-md-component="top" hidden> |
| 1227 | |
| 1228 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> |
| 1229 | Back to top |
| 1230 | </button> |
| 1231 | |
| 1232 | </main> |
| 1233 | |
| 1234 | <footer class="md-footer"> |
| 1235 | |
| 1236 | <div class="md-footer-meta md-typeset"> |
| 1237 | <div class="md-footer-meta__inner md-grid"> |
| 1238 | <div class="md-copyright"> |
| 1239 | |
| 1240 | <div class="md-copyright__highlight"> |
| 1241 | Copyright © 2026 CONFLICT LLC |
| 1242 | </div> |
| 1243 | |
| 1244 | |
| 1245 | Made with |
| 1246 | <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> |
| 1247 | Material for MkDocs |
| 1248 | </a> |
| 1249 | |
| 1250 | </div> |
| 1251 | |
| 1252 | |
| 1253 | <div class="md-social"> |
| 1254 | |
| 1255 | |
| 1256 | |
| 1257 | |
| 1258 | |
| 1259 | |
| 1260 | |
| 1261 | |
| 1262 | <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link"> |
| 1263 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 1264 | </a> |
| 1265 | |
| 1266 | </div> |
| 1267 | |
| 1268 | </div> |
| 1269 | </div> |
| 1270 | </footer> |
| 1271 | |
| 1272 | </div> |
| 1273 | <div class="md-dialog" data-md-component="dialog"> |
| 1274 | <div class="md-dialog__inner md-typeset"></div> |
| 1275 | </div> |
| 1276 | |
| 1277 | |
| 1278 | |
| 1279 | |
| 1280 | |
| 1281 | <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> |
| 1282 | |
| 1283 | |
| 1284 | <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script> |
| 1285 | |
| 1286 | |
| 1287 | </body> |
| 1288 | </html> |
| --- a/site/getting-started/first-repo/index.html | ||
| +++ b/site/getting-started/first-repo/index.html | ||
| @@ -0,0 +1,1074 @@ | ||
| 1 | + | |
| 2 | +<!doctype html> | |
| 3 | +<html lang="en" class="no-js"> | |
| 4 | + <head> | |
| 5 | + | |
| 6 | + <meta charset="utf-8"> | |
| 7 | + <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| 8 | + | |
| 9 | + <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting"> | |
| 10 | + | |
| 11 | + | |
| 12 | + <meta name="author" content="CONFLICT LLC"> | |
| 13 | + | |
| 14 | + | |
| 15 | + <link rel="canonical" href="https://fossilrepo.dev/getting-started/first-repo/"> | |
| 16 | + | |
| 17 | + | |
| 18 | + <link rel="prev" href="../configuration/"> | |
| 19 | + | |
| 20 | + | |
| 21 | + <link rel="next" href="../../architecture/overview/"> | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + <link rel="icon" href="../../assets/images/favicon.png"> | |
| 28 | + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6"> | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + <title>First Repository - Fossilrepo</title> | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css"> | |
| 37 | + | |
| 38 | + | |
| 39 | + <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css"> | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | |
| 53 | + <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> | |
| 54 | + <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + <link rel="stylesheet" href="../../assets/css/custom.css"> | |
| 59 | + | |
| 60 | + <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + </head> | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"> | |
| 77 | + | |
| 78 | + | |
| 79 | + <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> | |
| 80 | + <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> | |
| 81 | + <label class="md-overlay" for="__drawer"></label> | |
| 82 | + <div data-md-component="skip"> | |
| 83 | + | |
| 84 | + | |
| 85 | + <a href="#creating-your-first-repository" class="md-skip"> | |
| 86 | + Skip to content | |
| 87 | + </a> | |
| 88 | + | |
| 89 | + </div> | |
| 90 | + <div data-md-component="announce"> | |
| 91 | + | |
| 92 | + </div> | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | +<header class="md-header" data-md-component="header"> | |
| 98 | + <nav class="md-header__inner md-grid" aria-label="Header"> | |
| 99 | + <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> | |
| 100 | + <div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 101 | + <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 102 | + <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 103 | +</div> | |
| 104 | + </a> | |
| 105 | + <label class="md-header__button md-icon" for="__drawer"> | |
| 106 | + | |
| 107 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> | |
| 108 | + </label> | |
| 109 | + <div class="md-header__title" data-md-component="header-title"> | |
| 110 | + <div class="md-header__ellipsis"> | |
| 111 | + <div class="md-header__topic"> | |
| 112 | + <span class="md-ellipsis"> | |
| 113 | + Fossilrepo | |
| 114 | + </span> | |
| 115 | + </div> | |
| 116 | + <div class="md-header__topic" data-md-component="header-topic"> | |
| 117 | + <span class="md-ellipsis"> | |
| 118 | + | |
| 119 | + First Repository | |
| 120 | + | |
| 121 | + </span> | |
| 122 | + </div> | |
| 123 | + </div> | |
| 124 | + </div> | |
| 125 | + | |
| 126 | + | |
| 127 | + <form class="md-header__option" data-md-component="palette"> | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> | |
| 133 | + | |
| 134 | + <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> | |
| 135 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> | |
| 136 | + </label> | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> | |
| 143 | + | |
| 144 | + <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> | |
| 145 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> | |
| 146 | + </label> | |
| 147 | + | |
| 148 | + | |
| 149 | +</form> | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + <label class="md-header__button md-icon" for="__search"> | |
| 160 | + | |
| 161 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> | |
| 162 | + </label> | |
| 163 | + <div class="md-search" data-md-component="search" role="dialog"> | |
| 164 | + <label class="md-search__overlay" for="__search"></label> | |
| 165 | + <div class="md-search__inner" role="search"> | |
| 166 | + <form class="md-search__form" name="search"> | |
| 167 | + <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> | |
| 168 | + <label class="md-search__icon md-icon" for="__search"> | |
| 169 | + | |
| 170 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> | |
| 171 | + | |
| 172 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> | |
| 173 | + </label> | |
| 174 | + <nav class="md-search__options" aria-label="Search"> | |
| 175 | + | |
| 176 | + <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> | |
| 177 | + | |
| 178 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> | |
| 179 | + </button> | |
| 180 | + </nav> | |
| 181 | + | |
| 182 | + <div class="md-search__suggest" data-md-component="search-suggest"></div> | |
| 183 | + | |
| 184 | + </form> | |
| 185 | + <div class="md-search__output"> | |
| 186 | + <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> | |
| 187 | + <div class="md-search-result" data-md-component="search-result"> | |
| 188 | + <div class="md-search-result__meta"> | |
| 189 | + Initializing search | |
| 190 | + </div> | |
| 191 | + <ol class="md-search-result__list" role="presentation"></ol> | |
| 192 | + </div> | |
| 193 | + </div> | |
| 194 | + </div> | |
| 195 | + </div> | |
| 196 | +</div> | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + <div class="md-header__source"> | |
| 201 | + <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> | |
| 202 | + <div class="md-source__icon md-icon"> | |
| 203 | + | |
| 204 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 205 | + </div> | |
| 206 | + <div class="md-source__repository"> | |
| 207 | + ConflictHQ/fossilrepo | |
| 208 | + </div> | |
| 209 | +</a> | |
| 210 | + </div> | |
| 211 | + | |
| 212 | + </nav> | |
| 213 | + | |
| 214 | +</header> | |
| 215 | + | |
| 216 | + <div class="md-container" data-md-component="container"> | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | +<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> | |
| 223 | + <div class="md-grid"> | |
| 224 | + <ul class="md-tabs__list"> | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + <li class="md-tabs__item"> | |
| 232 | + <a href="../.." class="md-tabs__link"> | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + Home | |
| 239 | + | |
| 240 | + </a> | |
| 241 | + </li> | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + <li class="md-tabs__item md-tabs__item--active"> | |
| 255 | + <a href="../prerequisites/" class="md-tabs__link"> | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + Getting Started | |
| 260 | + | |
| 261 | + </a> | |
| 262 | + </li> | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + <li class="md-tabs__item"> | |
| 275 | + <a href="../../architecture/overview/" class="md-tabs__link"> | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + Architecture | |
| 280 | + | |
| 281 | + </a> | |
| 282 | + </li> | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + </ul> | |
| 288 | + </div> | |
| 289 | +</nav> | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + <main class="md-main" data-md-component="main"> | |
| 294 | + <div class="md-main__inner md-grid"> | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > | |
| 299 | + <div class="md-sidebar__scrollwrap"> | |
| 300 | + <div class="md-sidebar__inner"> | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | +<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> | |
| 308 | + <label class="md-nav__title" for="__drawer"> | |
| 309 | + <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> | |
| 310 | + <div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 311 | + <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 312 | + <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 313 | +</div> | |
| 314 | + </a> | |
| 315 | + Fossilrepo | |
| 316 | + </label> | |
| 317 | + | |
| 318 | + <div class="md-nav__source"> | |
| 319 | + <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> | |
| 320 | + <div class="md-source__icon md-icon"> | |
| 321 | + | |
| 322 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 323 | + </div> | |
| 324 | + <div class="md-source__repository"> | |
| 325 | + ConflictHQ/fossilrepo | |
| 326 | + </div> | |
| 327 | +</a> | |
| 328 | + </div> | |
| 329 | + | |
| 330 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + <li class="md-nav__item"> | |
| 339 | + <a href="../.." class="md-nav__link"> | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + <span class="md-ellipsis"> | |
| 344 | + | |
| 345 | + | |
| 346 | + Home | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + </span> | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + </a> | |
| 355 | + </li> | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked> | |
| 385 | + | |
| 386 | + | |
| 387 | + <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex=""> | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + <span class="md-ellipsis"> | |
| 392 | + | |
| 393 | + | |
| 394 | + Getting Started | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + </span> | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + <span class="md-nav__icon md-icon"></span> | |
| 403 | + </label> | |
| 404 | + | |
| 405 | + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true"> | |
| 406 | + <label class="md-nav__title" for="__nav_2"> | |
| 407 | + <span class="md-nav__icon md-icon"></span> | |
| 408 | + | |
| 409 | + | |
| 410 | + Getting Started | |
| 411 | + | |
| 412 | + | |
| 413 | + </label> | |
| 414 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + <li class="md-nav__item"> | |
| 423 | + <a href="../prerequisites/" class="md-nav__link"> | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + <span class="md-ellipsis"> | |
| 428 | + | |
| 429 | + | |
| 430 | + Prerequisites | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + </span> | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + </a> | |
| 439 | + </li> | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + <li class="md-nav__item"> | |
| 451 | + <a href="../installation/" class="md-nav__link"> | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
| 455 | + <span class="md-ellipsis"> | |
| 456 | + | |
| 457 | + | |
| 458 | + Installation | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + </span> | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + </a> | |
| 467 | + </li> | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + <li class="md-nav__item"> | |
| 479 | + <a href="../configuration/" class="md-nav__link"> | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + <span class="md-ellipsis"> | |
| 484 | + | |
| 485 | + | |
| 486 | + Configuration | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + </span> | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + </a> | |
| 495 | + </li> | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + <li class="md-nav__item md-nav__item--active"> | |
| 509 | + | |
| 510 | + <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + <label class="md-nav__link md-nav__link--active" for="__toc"> | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + <span class="md-ellipsis"> | |
| 521 | + | |
| 522 | + | |
| 523 | + First Repository | |
| 524 | + | |
| 525 | + | |
| 526 | + | |
| 527 | + </span> | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + <span class="md-nav__icon md-icon"></span> | |
| 532 | + </label> | |
| 533 | + | |
| 534 | + <a href="./" class="md-nav__link md-nav__link--active"> | |
| 535 | + | |
| 536 | + | |
| 537 | + | |
| 538 | + <span class="md-ellipsis"> | |
| 539 | + | |
| 540 | + | |
| 541 | + First Repository | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + </span> | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + </a> | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + <label class="md-nav__title" for="__toc"> | |
| 561 | + <span class="md-nav__icon md-icon"></span> | |
| 562 | + Table of contents | |
| 563 | + </label> | |
| 564 | + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> | |
| 565 | + | |
| 566 | + <li class="md-nav__item"> | |
| 567 | + <a href="#via-the-dashboard" class="md-nav__link"> | |
| 568 | + <span class="md-ellipsis"> | |
| 569 | + | |
| 570 | + Via the Dashboard | |
| 571 | + | |
| 572 | + </span> | |
| 573 | + </a> | |
| 574 | + | |
| 575 | +</li> | |
| 576 | + | |
| 577 | + <li class="md-nav__item"> | |
| 578 | + <a href="#via-the-cli" class="md-nav__link"> | |
| 579 | + <span class="md-ellipsis"> | |
| 580 | + | |
| 581 | + Via the CLI | |
| 582 | + | |
| 583 | + </span> | |
| 584 | + </a> | |
| 585 | + | |
| 586 | +</li> | |
| 587 | + | |
| 588 | + <li class="md-nav__item"> | |
| 589 | + <a href="#what-happens-under-the-hood" class="md-nav__link"> | |
| 590 | + <span class="md-ellipsis"> | |
| 591 | + | |
| 592 | + What Happens Under the Hood | |
| 593 | + | |
| 594 | + </span> | |
| 595 | + </a> | |
| 596 | + | |
| 597 | +</li> | |
| 598 | + | |
| 599 | + <li class="md-nav__item"> | |
| 600 | + <a href="#accessing-your-repository" class="md-nav__link"> | |
| 601 | + <span class="md-ellipsis"> | |
| 602 | + | |
| 603 | + Accessing Your Repository | |
| 604 | + | |
| 605 | + </span> | |
| 606 | + </a> | |
| 607 | + | |
| 608 | + <nav class="md-nav" aria-label="Accessing Your Repository"> | |
| 609 | + <ul class="md-nav__list"> | |
| 610 | + | |
| 611 | + <li class="md-nav__item"> | |
| 612 | + <a href="#web-ui" class="md-nav__link"> | |
| 613 | + <span class="md-ellipsis"> | |
| 614 | + | |
| 615 | + Web UI | |
| 616 | + | |
| 617 | + </span> | |
| 618 | + </a> | |
| 619 | + | |
| 620 | +</li> | |
| 621 | + | |
| 622 | + <li class="md-nav__item"> | |
| 623 | + <a href="#clone-via-fossil" class="md-nav__link"> | |
| 624 | + <span class="md-ellipsis"> | |
| 625 | + | |
| 626 | + Clone via Fossil | |
| 627 | + | |
| 628 | + </span> | |
| 629 | + </a> | |
| 630 | + | |
| 631 | +</li> | |
| 632 | + | |
| 633 | + <li class="md-nav__item"> | |
| 634 | + <a href="#clone-via-git-mirror" class="md-nav__link"> | |
| 635 | + <span class="md-ellipsis"> | |
| 636 | + | |
| 637 | + Clone via Git (Mirror) | |
| 638 | + | |
| 639 | + </span> | |
| 640 | + </a> | |
| 641 | + | |
| 642 | +</li> | |
| 643 | + | |
| 644 | + </ul> | |
| 645 | + </nav> | |
| 646 | + | |
| 647 | +</li> | |
| 648 | + | |
| 649 | + <li class="md-nav__item"> | |
| 650 | + <a href="#next-steps" class="md-nav__link"> | |
| 651 | + <span class="md-ellipsis"> | |
| 652 | + | |
| 653 | + Next Steps | |
| 654 | + | |
| 655 | + </span> | |
| 656 | + </a> | |
| 657 | + | |
| 658 | +</li> | |
| 659 | + | |
| 660 | + </ul> | |
| 661 | + | |
| 662 | +</nav> | |
| 663 | + | |
| 664 | + </li> | |
| 665 | + | |
| 666 | + | |
| 667 | + | |
| 668 | + | |
| 669 | + </ul> | |
| 670 | + </nav> | |
| 671 | + | |
| 672 | + </li> | |
| 673 | + | |
| 674 | + | |
| 675 | + | |
| 676 | + | |
| 677 | + | |
| 678 | + | |
| 679 | + | |
| 680 | + | |
| 681 | + | |
| 682 | + | |
| 683 | + | |
| 684 | + | |
| 685 | + | |
| 686 | + | |
| 687 | + | |
| 688 | + | |
| 689 | + | |
| 690 | + | |
| 691 | + | |
| 692 | + <li class="md-nav__item md-nav__item--nested"> | |
| 693 | + | |
| 694 | + | |
| 695 | + | |
| 696 | + | |
| 697 | + | |
| 698 | + <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" > | |
| 699 | + | |
| 700 | + | |
| 701 | + <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> | |
| 702 | + | |
| 703 | + | |
| 704 | + | |
| 705 | + <span class="md-ellipsis"> | |
| 706 | + | |
| 707 | + | |
| 708 | + Architecture | |
| 709 | + | |
| 710 | + | |
| 711 | + | |
| 712 | + </span> | |
| 713 | + | |
| 714 | + | |
| 715 | + | |
| 716 | + <span class="md-nav__icon md-icon"></span> | |
| 717 | + </label> | |
| 718 | + | |
| 719 | + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> | |
| 720 | + <label class="md-nav__title" for="__nav_3"> | |
| 721 | + <span class="md-nav__icon md-icon"></span> | |
| 722 | + | |
| 723 | + | |
| 724 | + Architecture | |
| 725 | + | |
| 726 | + | |
| 727 | + </label> | |
| 728 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 729 | + | |
| 730 | + | |
| 731 | + | |
| 732 | + | |
| 733 | + | |
| 734 | + | |
| 735 | + | |
| 736 | + <li class="md-nav__item"> | |
| 737 | + <a href="../../architecture/overview/" class="md-nav__link"> | |
| 738 | + | |
| 739 | + | |
| 740 | + | |
| 741 | + <span class="md-ellipsis"> | |
| 742 | + | |
| 743 | + | |
| 744 | + Overview | |
| 745 | + | |
| 746 | + | |
| 747 | + | |
| 748 | + </span> | |
| 749 | + | |
| 750 | + | |
| 751 | + | |
| 752 | + </a> | |
| 753 | + </li> | |
| 754 | + | |
| 755 | + | |
| 756 | + | |
| 757 | + | |
| 758 | + | |
| 759 | + | |
| 760 | + | |
| 761 | + | |
| 762 | + | |
| 763 | + | |
| 764 | + <li class="md-nav__item"> | |
| 765 | + <a href="../../architecture/sync-bridge/" class="md-nav__link"> | |
| 766 | + | |
| 767 | + | |
| 768 | + | |
| 769 | + <span class="md-ellipsis"> | |
| 770 | + | |
| 771 | + | |
| 772 | + Sync Bridge | |
| 773 | + | |
| 774 | + | |
| 775 | + | |
| 776 | + </span> | |
| 777 | + | |
| 778 | + | |
| 779 | + | |
| 780 | + </a> | |
| 781 | + </li> | |
| 782 | + | |
| 783 | + | |
| 784 | + | |
| 785 | + | |
| 786 | + </ul> | |
| 787 | + </nav> | |
| 788 | + | |
| 789 | + </li> | |
| 790 | + | |
| 791 | + | |
| 792 | + | |
| 793 | + </ul> | |
| 794 | +</nav> | |
| 795 | + </div> | |
| 796 | + </div> | |
| 797 | + </div> | |
| 798 | + | |
| 799 | + | |
| 800 | + | |
| 801 | + <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > | |
| 802 | + <div class="md-sidebar__scrollwrap"> | |
| 803 | + <div class="md-sidebar__inner"> | |
| 804 | + | |
| 805 | + | |
| 806 | +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
| 807 | + | |
| 808 | + | |
| 809 | + | |
| 810 | + | |
| 811 | + | |
| 812 | + | |
| 813 | + <label class="md-nav__title" for="__toc"> | |
| 814 | + <span class="md-nav__icon md-icon"></span> | |
| 815 | + Table of contents | |
| 816 | + </label> | |
| 817 | + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> | |
| 818 | + | |
| 819 | + <li class="md-nav__item"> | |
| 820 | + <a href="#via-the-dashboard" class="md-nav__link"> | |
| 821 | + <span class="md-ellipsis"> | |
| 822 | + | |
| 823 | + Via the Dashboard | |
| 824 | + | |
| 825 | + </span> | |
| 826 | + </a> | |
| 827 | + | |
| 828 | +</li> | |
| 829 | + | |
| 830 | + <li class="md-nav__item"> | |
| 831 | + <a href="#via-the-cli" class="md-nav__link"> | |
| 832 | + <span class="md-ellipsis"> | |
| 833 | + | |
| 834 | + Via the CLI | |
| 835 | + | |
| 836 | + </span> | |
| 837 | + </a> | |
| 838 | + | |
| 839 | +</li> | |
| 840 | + | |
| 841 | + <li class="md-nav__item"> | |
| 842 | + <a href="#what-happens-under-the-hood" class="md-nav__link"> | |
| 843 | + <span class="md-ellipsis"> | |
| 844 | + | |
| 845 | + What Happens Under the Hood | |
| 846 | + | |
| 847 | + </span> | |
| 848 | + </a> | |
| 849 | + | |
| 850 | +</li> | |
| 851 | + | |
| 852 | + <li class="md-nav__item"> | |
| 853 | + <a href="#accessing-your-repository" class="md-nav__link"> | |
| 854 | + <span class="md-ellipsis"> | |
| 855 | + | |
| 856 | + Accessing Your Repository | |
| 857 | + | |
| 858 | + </span> | |
| 859 | + </a> | |
| 860 | + | |
| 861 | + <nav class="md-nav" aria-label="Accessing Your Repository"> | |
| 862 | + <ul class="md-nav__list"> | |
| 863 | + | |
| 864 | + <li class="md-nav__item"> | |
| 865 | + <a href="#web-ui" class="md-nav__link"> | |
| 866 | + <span class="md-ellipsis"> | |
| 867 | + | |
| 868 | + Web UI | |
| 869 | + | |
| 870 | + </span> | |
| 871 | + </a> | |
| 872 | + | |
| 873 | +</li> | |
| 874 | + | |
| 875 | + <li class="md-nav__item"> | |
| 876 | + <a href="#clone-via-fossil" class="md-nav__link"> | |
| 877 | + <span class="md-ellipsis"> | |
| 878 | + | |
| 879 | + Clone via Fossil | |
| 880 | + | |
| 881 | + </span> | |
| 882 | + </a> | |
| 883 | + | |
| 884 | +</li> | |
| 885 | + | |
| 886 | + <li class="md-nav__item"> | |
| 887 | + <a href="#clone-via-git-mirror" class="md-nav__link"> | |
| 888 | + <span class="md-ellipsis"> | |
| 889 | + | |
| 890 | + Clone via Git (Mirror) | |
| 891 | + | |
| 892 | + </span> | |
| 893 | + </a> | |
| 894 | + | |
| 895 | +</li> | |
| 896 | + | |
| 897 | + </ul> | |
| 898 | + </nav> | |
| 899 | + | |
| 900 | +</li> | |
| 901 | + | |
| 902 | + <li class="md-nav__item"> | |
| 903 | + <a href="#next-steps" class="md-nav__link"> | |
| 904 | + <span class="md-ellipsis"> | |
| 905 | + | |
| 906 | + Next Steps | |
| 907 | + | |
| 908 | + </span> | |
| 909 | + </a> | |
| 910 | + | |
| 911 | +</li> | |
| 912 | + | |
| 913 | + </ul> | |
| 914 | + | |
| 915 | +</nav> | |
| 916 | + </div> | |
| 917 | + </div> | |
| 918 | + </div> | |
| 919 | + | |
| 920 | + | |
| 921 | + | |
| 922 | + <div class="md-content" data-md-component="content"> | |
| 923 | + | |
| 924 | + <article class="md-content__inner md-typeset"> | |
| 925 | + | |
| 926 | + | |
| 927 | + | |
| 928 | + | |
| 929 | + | |
| 930 | + | |
| 931 | + | |
| 932 | + | |
| 933 | +<h1 id="creating-your-first-repository">Creating Your First Repository<a class="headerlink" href="#creating-your-first-repository" title="Permanent link">¶</a></h1> | |
| 934 | +<p>Once fossilrepo is running, you can create your first Fossil repository.</p> | |
| 935 | +<h2 id="via-the-dashboard">Via the Dashboard<a class="headerlink" href="#via-the-dashboard" title="Permanent link">¶</a></h2> | |
| 936 | +<ol> | |
| 937 | +<li>Log in at <code>http://localhost:8000</code></li> | |
| 938 | +<li>Navigate to <strong>Repositories</strong> in the sidebar</li> | |
| 939 | +<li>Click <strong>Create Repository</strong></li> | |
| 940 | +<li>Enter a name (e.g., <code>my-project</code>)</li> | |
| 941 | +<li>Click <strong>Create</strong></li> | |
| 942 | +</ol> | |
| 943 | +<p>The repository is immediately available at <code>my-project.your-domain.com</code> (production) or through the local Fossil server (development).</p> | |
| 944 | +<h2 id="via-the-cli">Via the CLI<a class="headerlink" href="#via-the-cli" title="Permanent link">¶</a></h2> | |
| 945 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># Inside the fossilrepo container</span> | |
| 946 | +<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>django<span class="w"> </span>python<span class="w"> </span>manage.py<span class="w"> </span>fossil_create<span class="w"> </span>my-project | |
| 947 | +</code></pre></div> | |
| 948 | +<p>This runs <code>fossil init</code>, registers the repo in the database, and (in production) Caddy automatically routes the subdomain.</p> | |
| 949 | +<h2 id="what-happens-under-the-hood">What Happens Under the Hood<a class="headerlink" href="#what-happens-under-the-hood" title="Permanent link">¶</a></h2> | |
| 950 | +<pre class="mermaid"><code>sequenceDiagram | |
| 951 | + participant User | |
| 952 | + participant Django | |
| 953 | + participant Fossil | |
| 954 | + participant Litestream | |
| 955 | + participant S3 | |
| 956 | + | |
| 957 | + User->>Django: Create repo "my-project" | |
| 958 | + Django->>Fossil: fossil init /data/repos/my-project.fossil | |
| 959 | + Fossil-->>Django: Repository created | |
| 960 | + Django->>Django: Register in database | |
| 961 | + Litestream->>S3: Begin replicating my-project.fossil | |
| 962 | + Django-->>User: Repository ready</code></pre> | |
| 963 | +<h2 id="accessing-your-repository">Accessing Your Repository<a class="headerlink" href="#accessing-your-repository" title="Permanent link">¶</a></h2> | |
| 964 | +<h3 id="web-ui">Web UI<a class="headerlink" href="#web-ui" title="Permanent link">¶</a></h3> | |
| 965 | +<p>Fossil includes a built-in web interface with:</p> | |
| 966 | +<ul> | |
| 967 | +<li><strong>Timeline</strong> -- commit history with diffs</li> | |
| 968 | +<li><strong>Tickets</strong> -- issue tracker</li> | |
| 969 | +<li><strong>Wiki</strong> -- project documentation</li> | |
| 970 | +<li><strong>Forum</strong> -- discussions</li> | |
| 971 | +</ul> | |
| 972 | +<h3 id="clone-via-fossil">Clone via Fossil<a class="headerlink" href="#clone-via-fossil" title="Permanent link">¶</a></h3> | |
| 973 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>fossil<span class="w"> </span>clone<span class="w"> </span>https://my-project.your-domain.com<span class="w"> </span>my-project.fossil | |
| 974 | +<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>fossil<span class="w"> </span>open<span class="w"> </span>my-project.fossil | |
| 975 | +</code></pre></div> | |
| 976 | +<h3 id="clone-via-git-mirror">Clone via Git (Mirror)<a class="headerlink" href="#clone-via-git-mirror" title="Permanent link">¶</a></h3> | |
| 977 | +<p>If you've configured the sync bridge:</p> | |
| 978 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/your-org/my-project.git | |
| 979 | +</code></pre></div> | |
| 980 | +<div class="admonition warning"> | |
| 981 | +<p class="admonition-title">Read-only mirror</p> | |
| 982 | +<p>Git mirrors are downstream copies. Push changes to the Fossil repo -- they'll sync to Git automatically.</p> | |
| 983 | +</div> | |
| 984 | +<h2 id="next-steps">Next Steps<a class="headerlink" href="#next-steps" title="Permanent link">¶</a></h2> | |
| 985 | +<ul> | |
| 986 | +<li><a href="../../architecture/sync-bridge/">Configure the sync bridge</a> to mirror to GitHub/GitLab</li> | |
| 987 | +<li><a href="../configuration/#litestream-backups">Set up backups</a> with Litestream</li> | |
| 988 | +<li>Explore the <a href="../../architecture/overview/">architecture overview</a></li> | |
| 989 | +</ul> | |
| 990 | + | |
| 991 | + | |
| 992 | + | |
| 993 | + | |
| 994 | + | |
| 995 | + | |
| 996 | + | |
| 997 | + | |
| 998 | + | |
| 999 | + | |
| 1000 | + | |
| 1001 | + | |
| 1002 | + | |
| 1003 | + </article> | |
| 1004 | + </div> | |
| 1005 | + | |
| 1006 | + | |
| 1007 | + <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> | |
| 1008 | + | |
| 1009 | +<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> | |
| 1010 | + </div> | |
| 1011 | + | |
| 1012 | + <button type="button" class="md-top md-icon" data-md-component="top" hidden> | |
| 1013 | + | |
| 1014 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> | |
| 1015 | + Back to top | |
| 1016 | +</button> | |
| 1017 | + | |
| 1018 | + </main> | |
| 1019 | + | |
| 1020 | + <footer class="md-footer"> | |
| 1021 | + | |
| 1022 | + <div class="md-footer-meta md-typeset"> | |
| 1023 | + <div class="md-footer-meta__inner md-grid"> | |
| 1024 | + <div class="md-copyright"> | |
| 1025 | + | |
| 1026 | + <div class="md-copyright__highlight"> | |
| 1027 | + Copyright © 2026 CONFLICT LLC | |
| 1028 | + </div> | |
| 1029 | + | |
| 1030 | + | |
| 1031 | + Made with | |
| 1032 | + <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> | |
| 1033 | + Material for MkDocs | |
| 1034 | + </a> | |
| 1035 | + | |
| 1036 | +</div> | |
| 1037 | + | |
| 1038 | + | |
| 1039 | +<div class="md-social"> | |
| 1040 | + | |
| 1041 | + | |
| 1042 | + | |
| 1043 | + | |
| 1044 | + | |
| 1045 | + | |
| 1046 | + | |
| 1047 | + | |
| 1048 | + <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link"> | |
| 1049 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 1050 | + </a> | |
| 1051 | + | |
| 1052 | +</div> | |
| 1053 | + | |
| 1054 | + </div> | |
| 1055 | + </div> | |
| 1056 | +</footer> | |
| 1057 | + | |
| 1058 | + </div> | |
| 1059 | + <div class="md-dialog" data-md-component="dialog"> | |
| 1060 | + <div class="md-dialog__inner md-typeset"></div> | |
| 1061 | + </div> | |
| 1062 | + | |
| 1063 | + | |
| 1064 | + | |
| 1065 | + | |
| 1066 | + | |
| 1067 | + <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> | |
| 1068 | + | |
| 1069 | + | |
| 1070 | + <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script> | |
| 1071 | + | |
| 1072 | + | |
| 1073 | + </body> | |
| 1074 | +</html> |
| --- a/site/getting-started/first-repo/index.html | |
| +++ b/site/getting-started/first-repo/index.html | |
| @@ -0,0 +1,1074 @@ | |
| --- a/site/getting-started/first-repo/index.html | |
| +++ b/site/getting-started/first-repo/index.html | |
| @@ -0,0 +1,1074 @@ | |
| 1 | |
| 2 | <!doctype html> |
| 3 | <html lang="en" class="no-js"> |
| 4 | <head> |
| 5 | |
| 6 | <meta charset="utf-8"> |
| 7 | <meta name="viewport" content="width=device-width,initial-scale=1"> |
| 8 | |
| 9 | <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting"> |
| 10 | |
| 11 | |
| 12 | <meta name="author" content="CONFLICT LLC"> |
| 13 | |
| 14 | |
| 15 | <link rel="canonical" href="https://fossilrepo.dev/getting-started/first-repo/"> |
| 16 | |
| 17 | |
| 18 | <link rel="prev" href="../configuration/"> |
| 19 | |
| 20 | |
| 21 | <link rel="next" href="../../architecture/overview/"> |
| 22 | |
| 23 | |
| 24 | |
| 25 | |
| 26 | |
| 27 | <link rel="icon" href="../../assets/images/favicon.png"> |
| 28 | <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6"> |
| 29 | |
| 30 | |
| 31 | |
| 32 | <title>First Repository - Fossilrepo</title> |
| 33 | |
| 34 | |
| 35 | |
| 36 | <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css"> |
| 37 | |
| 38 | |
| 39 | <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css"> |
| 40 | |
| 41 | |
| 42 | |
| 43 | |
| 44 | |
| 45 | |
| 46 | |
| 47 | |
| 48 | |
| 49 | |
| 50 | |
| 51 | |
| 52 | <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
| 53 | <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> |
| 54 | <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> |
| 55 | |
| 56 | |
| 57 | |
| 58 | <link rel="stylesheet" href="../../assets/css/custom.css"> |
| 59 | |
| 60 | <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> |
| 61 | |
| 62 | |
| 63 | |
| 64 | |
| 65 | |
| 66 | </head> |
| 67 | |
| 68 | |
| 69 | |
| 70 | |
| 71 | |
| 72 | |
| 73 | |
| 74 | |
| 75 | |
| 76 | <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"> |
| 77 | |
| 78 | |
| 79 | <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> |
| 80 | <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> |
| 81 | <label class="md-overlay" for="__drawer"></label> |
| 82 | <div data-md-component="skip"> |
| 83 | |
| 84 | |
| 85 | <a href="#creating-your-first-repository" class="md-skip"> |
| 86 | Skip to content |
| 87 | </a> |
| 88 | |
| 89 | </div> |
| 90 | <div data-md-component="announce"> |
| 91 | |
| 92 | </div> |
| 93 | |
| 94 | |
| 95 | |
| 96 | |
| 97 | <header class="md-header" data-md-component="header"> |
| 98 | <nav class="md-header__inner md-grid" aria-label="Header"> |
| 99 | <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> |
| 100 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 101 | <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 102 | <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 103 | </div> |
| 104 | </a> |
| 105 | <label class="md-header__button md-icon" for="__drawer"> |
| 106 | |
| 107 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> |
| 108 | </label> |
| 109 | <div class="md-header__title" data-md-component="header-title"> |
| 110 | <div class="md-header__ellipsis"> |
| 111 | <div class="md-header__topic"> |
| 112 | <span class="md-ellipsis"> |
| 113 | Fossilrepo |
| 114 | </span> |
| 115 | </div> |
| 116 | <div class="md-header__topic" data-md-component="header-topic"> |
| 117 | <span class="md-ellipsis"> |
| 118 | |
| 119 | First Repository |
| 120 | |
| 121 | </span> |
| 122 | </div> |
| 123 | </div> |
| 124 | </div> |
| 125 | |
| 126 | |
| 127 | <form class="md-header__option" data-md-component="palette"> |
| 128 | |
| 129 | |
| 130 | |
| 131 | |
| 132 | <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> |
| 133 | |
| 134 | <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> |
| 135 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> |
| 136 | </label> |
| 137 | |
| 138 | |
| 139 | |
| 140 | |
| 141 | |
| 142 | <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> |
| 143 | |
| 144 | <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> |
| 145 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> |
| 146 | </label> |
| 147 | |
| 148 | |
| 149 | </form> |
| 150 | |
| 151 | |
| 152 | |
| 153 | <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> |
| 154 | |
| 155 | |
| 156 | |
| 157 | |
| 158 | |
| 159 | <label class="md-header__button md-icon" for="__search"> |
| 160 | |
| 161 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> |
| 162 | </label> |
| 163 | <div class="md-search" data-md-component="search" role="dialog"> |
| 164 | <label class="md-search__overlay" for="__search"></label> |
| 165 | <div class="md-search__inner" role="search"> |
| 166 | <form class="md-search__form" name="search"> |
| 167 | <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> |
| 168 | <label class="md-search__icon md-icon" for="__search"> |
| 169 | |
| 170 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> |
| 171 | |
| 172 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> |
| 173 | </label> |
| 174 | <nav class="md-search__options" aria-label="Search"> |
| 175 | |
| 176 | <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> |
| 177 | |
| 178 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> |
| 179 | </button> |
| 180 | </nav> |
| 181 | |
| 182 | <div class="md-search__suggest" data-md-component="search-suggest"></div> |
| 183 | |
| 184 | </form> |
| 185 | <div class="md-search__output"> |
| 186 | <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> |
| 187 | <div class="md-search-result" data-md-component="search-result"> |
| 188 | <div class="md-search-result__meta"> |
| 189 | Initializing search |
| 190 | </div> |
| 191 | <ol class="md-search-result__list" role="presentation"></ol> |
| 192 | </div> |
| 193 | </div> |
| 194 | </div> |
| 195 | </div> |
| 196 | </div> |
| 197 | |
| 198 | |
| 199 | |
| 200 | <div class="md-header__source"> |
| 201 | <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> |
| 202 | <div class="md-source__icon md-icon"> |
| 203 | |
| 204 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 205 | </div> |
| 206 | <div class="md-source__repository"> |
| 207 | ConflictHQ/fossilrepo |
| 208 | </div> |
| 209 | </a> |
| 210 | </div> |
| 211 | |
| 212 | </nav> |
| 213 | |
| 214 | </header> |
| 215 | |
| 216 | <div class="md-container" data-md-component="container"> |
| 217 | |
| 218 | |
| 219 | |
| 220 | |
| 221 | |
| 222 | <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> |
| 223 | <div class="md-grid"> |
| 224 | <ul class="md-tabs__list"> |
| 225 | |
| 226 | |
| 227 | |
| 228 | |
| 229 | |
| 230 | |
| 231 | <li class="md-tabs__item"> |
| 232 | <a href="../.." class="md-tabs__link"> |
| 233 | |
| 234 | |
| 235 | |
| 236 | |
| 237 | |
| 238 | Home |
| 239 | |
| 240 | </a> |
| 241 | </li> |
| 242 | |
| 243 | |
| 244 | |
| 245 | |
| 246 | |
| 247 | |
| 248 | |
| 249 | |
| 250 | |
| 251 | |
| 252 | |
| 253 | |
| 254 | <li class="md-tabs__item md-tabs__item--active"> |
| 255 | <a href="../prerequisites/" class="md-tabs__link"> |
| 256 | |
| 257 | |
| 258 | |
| 259 | Getting Started |
| 260 | |
| 261 | </a> |
| 262 | </li> |
| 263 | |
| 264 | |
| 265 | |
| 266 | |
| 267 | |
| 268 | |
| 269 | |
| 270 | |
| 271 | |
| 272 | |
| 273 | |
| 274 | <li class="md-tabs__item"> |
| 275 | <a href="../../architecture/overview/" class="md-tabs__link"> |
| 276 | |
| 277 | |
| 278 | |
| 279 | Architecture |
| 280 | |
| 281 | </a> |
| 282 | </li> |
| 283 | |
| 284 | |
| 285 | |
| 286 | |
| 287 | </ul> |
| 288 | </div> |
| 289 | </nav> |
| 290 | |
| 291 | |
| 292 | |
| 293 | <main class="md-main" data-md-component="main"> |
| 294 | <div class="md-main__inner md-grid"> |
| 295 | |
| 296 | |
| 297 | |
| 298 | <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > |
| 299 | <div class="md-sidebar__scrollwrap"> |
| 300 | <div class="md-sidebar__inner"> |
| 301 | |
| 302 | |
| 303 | |
| 304 | |
| 305 | |
| 306 | |
| 307 | <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> |
| 308 | <label class="md-nav__title" for="__drawer"> |
| 309 | <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> |
| 310 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 311 | <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 312 | <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 313 | </div> |
| 314 | </a> |
| 315 | Fossilrepo |
| 316 | </label> |
| 317 | |
| 318 | <div class="md-nav__source"> |
| 319 | <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> |
| 320 | <div class="md-source__icon md-icon"> |
| 321 | |
| 322 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 323 | </div> |
| 324 | <div class="md-source__repository"> |
| 325 | ConflictHQ/fossilrepo |
| 326 | </div> |
| 327 | </a> |
| 328 | </div> |
| 329 | |
| 330 | <ul class="md-nav__list" data-md-scrollfix> |
| 331 | |
| 332 | |
| 333 | |
| 334 | |
| 335 | |
| 336 | |
| 337 | |
| 338 | <li class="md-nav__item"> |
| 339 | <a href="../.." class="md-nav__link"> |
| 340 | |
| 341 | |
| 342 | |
| 343 | <span class="md-ellipsis"> |
| 344 | |
| 345 | |
| 346 | Home |
| 347 | |
| 348 | |
| 349 | |
| 350 | </span> |
| 351 | |
| 352 | |
| 353 | |
| 354 | </a> |
| 355 | </li> |
| 356 | |
| 357 | |
| 358 | |
| 359 | |
| 360 | |
| 361 | |
| 362 | |
| 363 | |
| 364 | |
| 365 | |
| 366 | |
| 367 | |
| 368 | |
| 369 | |
| 370 | |
| 371 | |
| 372 | |
| 373 | |
| 374 | |
| 375 | |
| 376 | |
| 377 | |
| 378 | |
| 379 | |
| 380 | <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> |
| 381 | |
| 382 | |
| 383 | |
| 384 | <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked> |
| 385 | |
| 386 | |
| 387 | <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex=""> |
| 388 | |
| 389 | |
| 390 | |
| 391 | <span class="md-ellipsis"> |
| 392 | |
| 393 | |
| 394 | Getting Started |
| 395 | |
| 396 | |
| 397 | |
| 398 | </span> |
| 399 | |
| 400 | |
| 401 | |
| 402 | <span class="md-nav__icon md-icon"></span> |
| 403 | </label> |
| 404 | |
| 405 | <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true"> |
| 406 | <label class="md-nav__title" for="__nav_2"> |
| 407 | <span class="md-nav__icon md-icon"></span> |
| 408 | |
| 409 | |
| 410 | Getting Started |
| 411 | |
| 412 | |
| 413 | </label> |
| 414 | <ul class="md-nav__list" data-md-scrollfix> |
| 415 | |
| 416 | |
| 417 | |
| 418 | |
| 419 | |
| 420 | |
| 421 | |
| 422 | <li class="md-nav__item"> |
| 423 | <a href="../prerequisites/" class="md-nav__link"> |
| 424 | |
| 425 | |
| 426 | |
| 427 | <span class="md-ellipsis"> |
| 428 | |
| 429 | |
| 430 | Prerequisites |
| 431 | |
| 432 | |
| 433 | |
| 434 | </span> |
| 435 | |
| 436 | |
| 437 | |
| 438 | </a> |
| 439 | </li> |
| 440 | |
| 441 | |
| 442 | |
| 443 | |
| 444 | |
| 445 | |
| 446 | |
| 447 | |
| 448 | |
| 449 | |
| 450 | <li class="md-nav__item"> |
| 451 | <a href="../installation/" class="md-nav__link"> |
| 452 | |
| 453 | |
| 454 | |
| 455 | <span class="md-ellipsis"> |
| 456 | |
| 457 | |
| 458 | Installation |
| 459 | |
| 460 | |
| 461 | |
| 462 | </span> |
| 463 | |
| 464 | |
| 465 | |
| 466 | </a> |
| 467 | </li> |
| 468 | |
| 469 | |
| 470 | |
| 471 | |
| 472 | |
| 473 | |
| 474 | |
| 475 | |
| 476 | |
| 477 | |
| 478 | <li class="md-nav__item"> |
| 479 | <a href="../configuration/" class="md-nav__link"> |
| 480 | |
| 481 | |
| 482 | |
| 483 | <span class="md-ellipsis"> |
| 484 | |
| 485 | |
| 486 | Configuration |
| 487 | |
| 488 | |
| 489 | |
| 490 | </span> |
| 491 | |
| 492 | |
| 493 | |
| 494 | </a> |
| 495 | </li> |
| 496 | |
| 497 | |
| 498 | |
| 499 | |
| 500 | |
| 501 | |
| 502 | |
| 503 | |
| 504 | |
| 505 | |
| 506 | |
| 507 | |
| 508 | <li class="md-nav__item md-nav__item--active"> |
| 509 | |
| 510 | <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> |
| 511 | |
| 512 | |
| 513 | |
| 514 | |
| 515 | |
| 516 | <label class="md-nav__link md-nav__link--active" for="__toc"> |
| 517 | |
| 518 | |
| 519 | |
| 520 | <span class="md-ellipsis"> |
| 521 | |
| 522 | |
| 523 | First Repository |
| 524 | |
| 525 | |
| 526 | |
| 527 | </span> |
| 528 | |
| 529 | |
| 530 | |
| 531 | <span class="md-nav__icon md-icon"></span> |
| 532 | </label> |
| 533 | |
| 534 | <a href="./" class="md-nav__link md-nav__link--active"> |
| 535 | |
| 536 | |
| 537 | |
| 538 | <span class="md-ellipsis"> |
| 539 | |
| 540 | |
| 541 | First Repository |
| 542 | |
| 543 | |
| 544 | |
| 545 | </span> |
| 546 | |
| 547 | |
| 548 | |
| 549 | </a> |
| 550 | |
| 551 | |
| 552 | |
| 553 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> |
| 554 | |
| 555 | |
| 556 | |
| 557 | |
| 558 | |
| 559 | |
| 560 | <label class="md-nav__title" for="__toc"> |
| 561 | <span class="md-nav__icon md-icon"></span> |
| 562 | Table of contents |
| 563 | </label> |
| 564 | <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> |
| 565 | |
| 566 | <li class="md-nav__item"> |
| 567 | <a href="#via-the-dashboard" class="md-nav__link"> |
| 568 | <span class="md-ellipsis"> |
| 569 | |
| 570 | Via the Dashboard |
| 571 | |
| 572 | </span> |
| 573 | </a> |
| 574 | |
| 575 | </li> |
| 576 | |
| 577 | <li class="md-nav__item"> |
| 578 | <a href="#via-the-cli" class="md-nav__link"> |
| 579 | <span class="md-ellipsis"> |
| 580 | |
| 581 | Via the CLI |
| 582 | |
| 583 | </span> |
| 584 | </a> |
| 585 | |
| 586 | </li> |
| 587 | |
| 588 | <li class="md-nav__item"> |
| 589 | <a href="#what-happens-under-the-hood" class="md-nav__link"> |
| 590 | <span class="md-ellipsis"> |
| 591 | |
| 592 | What Happens Under the Hood |
| 593 | |
| 594 | </span> |
| 595 | </a> |
| 596 | |
| 597 | </li> |
| 598 | |
| 599 | <li class="md-nav__item"> |
| 600 | <a href="#accessing-your-repository" class="md-nav__link"> |
| 601 | <span class="md-ellipsis"> |
| 602 | |
| 603 | Accessing Your Repository |
| 604 | |
| 605 | </span> |
| 606 | </a> |
| 607 | |
| 608 | <nav class="md-nav" aria-label="Accessing Your Repository"> |
| 609 | <ul class="md-nav__list"> |
| 610 | |
| 611 | <li class="md-nav__item"> |
| 612 | <a href="#web-ui" class="md-nav__link"> |
| 613 | <span class="md-ellipsis"> |
| 614 | |
| 615 | Web UI |
| 616 | |
| 617 | </span> |
| 618 | </a> |
| 619 | |
| 620 | </li> |
| 621 | |
| 622 | <li class="md-nav__item"> |
| 623 | <a href="#clone-via-fossil" class="md-nav__link"> |
| 624 | <span class="md-ellipsis"> |
| 625 | |
| 626 | Clone via Fossil |
| 627 | |
| 628 | </span> |
| 629 | </a> |
| 630 | |
| 631 | </li> |
| 632 | |
| 633 | <li class="md-nav__item"> |
| 634 | <a href="#clone-via-git-mirror" class="md-nav__link"> |
| 635 | <span class="md-ellipsis"> |
| 636 | |
| 637 | Clone via Git (Mirror) |
| 638 | |
| 639 | </span> |
| 640 | </a> |
| 641 | |
| 642 | </li> |
| 643 | |
| 644 | </ul> |
| 645 | </nav> |
| 646 | |
| 647 | </li> |
| 648 | |
| 649 | <li class="md-nav__item"> |
| 650 | <a href="#next-steps" class="md-nav__link"> |
| 651 | <span class="md-ellipsis"> |
| 652 | |
| 653 | Next Steps |
| 654 | |
| 655 | </span> |
| 656 | </a> |
| 657 | |
| 658 | </li> |
| 659 | |
| 660 | </ul> |
| 661 | |
| 662 | </nav> |
| 663 | |
| 664 | </li> |
| 665 | |
| 666 | |
| 667 | |
| 668 | |
| 669 | </ul> |
| 670 | </nav> |
| 671 | |
| 672 | </li> |
| 673 | |
| 674 | |
| 675 | |
| 676 | |
| 677 | |
| 678 | |
| 679 | |
| 680 | |
| 681 | |
| 682 | |
| 683 | |
| 684 | |
| 685 | |
| 686 | |
| 687 | |
| 688 | |
| 689 | |
| 690 | |
| 691 | |
| 692 | <li class="md-nav__item md-nav__item--nested"> |
| 693 | |
| 694 | |
| 695 | |
| 696 | |
| 697 | |
| 698 | <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" > |
| 699 | |
| 700 | |
| 701 | <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> |
| 702 | |
| 703 | |
| 704 | |
| 705 | <span class="md-ellipsis"> |
| 706 | |
| 707 | |
| 708 | Architecture |
| 709 | |
| 710 | |
| 711 | |
| 712 | </span> |
| 713 | |
| 714 | |
| 715 | |
| 716 | <span class="md-nav__icon md-icon"></span> |
| 717 | </label> |
| 718 | |
| 719 | <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> |
| 720 | <label class="md-nav__title" for="__nav_3"> |
| 721 | <span class="md-nav__icon md-icon"></span> |
| 722 | |
| 723 | |
| 724 | Architecture |
| 725 | |
| 726 | |
| 727 | </label> |
| 728 | <ul class="md-nav__list" data-md-scrollfix> |
| 729 | |
| 730 | |
| 731 | |
| 732 | |
| 733 | |
| 734 | |
| 735 | |
| 736 | <li class="md-nav__item"> |
| 737 | <a href="../../architecture/overview/" class="md-nav__link"> |
| 738 | |
| 739 | |
| 740 | |
| 741 | <span class="md-ellipsis"> |
| 742 | |
| 743 | |
| 744 | Overview |
| 745 | |
| 746 | |
| 747 | |
| 748 | </span> |
| 749 | |
| 750 | |
| 751 | |
| 752 | </a> |
| 753 | </li> |
| 754 | |
| 755 | |
| 756 | |
| 757 | |
| 758 | |
| 759 | |
| 760 | |
| 761 | |
| 762 | |
| 763 | |
| 764 | <li class="md-nav__item"> |
| 765 | <a href="../../architecture/sync-bridge/" class="md-nav__link"> |
| 766 | |
| 767 | |
| 768 | |
| 769 | <span class="md-ellipsis"> |
| 770 | |
| 771 | |
| 772 | Sync Bridge |
| 773 | |
| 774 | |
| 775 | |
| 776 | </span> |
| 777 | |
| 778 | |
| 779 | |
| 780 | </a> |
| 781 | </li> |
| 782 | |
| 783 | |
| 784 | |
| 785 | |
| 786 | </ul> |
| 787 | </nav> |
| 788 | |
| 789 | </li> |
| 790 | |
| 791 | |
| 792 | |
| 793 | </ul> |
| 794 | </nav> |
| 795 | </div> |
| 796 | </div> |
| 797 | </div> |
| 798 | |
| 799 | |
| 800 | |
| 801 | <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > |
| 802 | <div class="md-sidebar__scrollwrap"> |
| 803 | <div class="md-sidebar__inner"> |
| 804 | |
| 805 | |
| 806 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> |
| 807 | |
| 808 | |
| 809 | |
| 810 | |
| 811 | |
| 812 | |
| 813 | <label class="md-nav__title" for="__toc"> |
| 814 | <span class="md-nav__icon md-icon"></span> |
| 815 | Table of contents |
| 816 | </label> |
| 817 | <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> |
| 818 | |
| 819 | <li class="md-nav__item"> |
| 820 | <a href="#via-the-dashboard" class="md-nav__link"> |
| 821 | <span class="md-ellipsis"> |
| 822 | |
| 823 | Via the Dashboard |
| 824 | |
| 825 | </span> |
| 826 | </a> |
| 827 | |
| 828 | </li> |
| 829 | |
| 830 | <li class="md-nav__item"> |
| 831 | <a href="#via-the-cli" class="md-nav__link"> |
| 832 | <span class="md-ellipsis"> |
| 833 | |
| 834 | Via the CLI |
| 835 | |
| 836 | </span> |
| 837 | </a> |
| 838 | |
| 839 | </li> |
| 840 | |
| 841 | <li class="md-nav__item"> |
| 842 | <a href="#what-happens-under-the-hood" class="md-nav__link"> |
| 843 | <span class="md-ellipsis"> |
| 844 | |
| 845 | What Happens Under the Hood |
| 846 | |
| 847 | </span> |
| 848 | </a> |
| 849 | |
| 850 | </li> |
| 851 | |
| 852 | <li class="md-nav__item"> |
| 853 | <a href="#accessing-your-repository" class="md-nav__link"> |
| 854 | <span class="md-ellipsis"> |
| 855 | |
| 856 | Accessing Your Repository |
| 857 | |
| 858 | </span> |
| 859 | </a> |
| 860 | |
| 861 | <nav class="md-nav" aria-label="Accessing Your Repository"> |
| 862 | <ul class="md-nav__list"> |
| 863 | |
| 864 | <li class="md-nav__item"> |
| 865 | <a href="#web-ui" class="md-nav__link"> |
| 866 | <span class="md-ellipsis"> |
| 867 | |
| 868 | Web UI |
| 869 | |
| 870 | </span> |
| 871 | </a> |
| 872 | |
| 873 | </li> |
| 874 | |
| 875 | <li class="md-nav__item"> |
| 876 | <a href="#clone-via-fossil" class="md-nav__link"> |
| 877 | <span class="md-ellipsis"> |
| 878 | |
| 879 | Clone via Fossil |
| 880 | |
| 881 | </span> |
| 882 | </a> |
| 883 | |
| 884 | </li> |
| 885 | |
| 886 | <li class="md-nav__item"> |
| 887 | <a href="#clone-via-git-mirror" class="md-nav__link"> |
| 888 | <span class="md-ellipsis"> |
| 889 | |
| 890 | Clone via Git (Mirror) |
| 891 | |
| 892 | </span> |
| 893 | </a> |
| 894 | |
| 895 | </li> |
| 896 | |
| 897 | </ul> |
| 898 | </nav> |
| 899 | |
| 900 | </li> |
| 901 | |
| 902 | <li class="md-nav__item"> |
| 903 | <a href="#next-steps" class="md-nav__link"> |
| 904 | <span class="md-ellipsis"> |
| 905 | |
| 906 | Next Steps |
| 907 | |
| 908 | </span> |
| 909 | </a> |
| 910 | |
| 911 | </li> |
| 912 | |
| 913 | </ul> |
| 914 | |
| 915 | </nav> |
| 916 | </div> |
| 917 | </div> |
| 918 | </div> |
| 919 | |
| 920 | |
| 921 | |
| 922 | <div class="md-content" data-md-component="content"> |
| 923 | |
| 924 | <article class="md-content__inner md-typeset"> |
| 925 | |
| 926 | |
| 927 | |
| 928 | |
| 929 | |
| 930 | |
| 931 | |
| 932 | |
| 933 | <h1 id="creating-your-first-repository">Creating Your First Repository<a class="headerlink" href="#creating-your-first-repository" title="Permanent link">¶</a></h1> |
| 934 | <p>Once fossilrepo is running, you can create your first Fossil repository.</p> |
| 935 | <h2 id="via-the-dashboard">Via the Dashboard<a class="headerlink" href="#via-the-dashboard" title="Permanent link">¶</a></h2> |
| 936 | <ol> |
| 937 | <li>Log in at <code>http://localhost:8000</code></li> |
| 938 | <li>Navigate to <strong>Repositories</strong> in the sidebar</li> |
| 939 | <li>Click <strong>Create Repository</strong></li> |
| 940 | <li>Enter a name (e.g., <code>my-project</code>)</li> |
| 941 | <li>Click <strong>Create</strong></li> |
| 942 | </ol> |
| 943 | <p>The repository is immediately available at <code>my-project.your-domain.com</code> (production) or through the local Fossil server (development).</p> |
| 944 | <h2 id="via-the-cli">Via the CLI<a class="headerlink" href="#via-the-cli" title="Permanent link">¶</a></h2> |
| 945 | <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># Inside the fossilrepo container</span> |
| 946 | <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>docker<span class="w"> </span>compose<span class="w"> </span><span class="nb">exec</span><span class="w"> </span>django<span class="w"> </span>python<span class="w"> </span>manage.py<span class="w"> </span>fossil_create<span class="w"> </span>my-project |
| 947 | </code></pre></div> |
| 948 | <p>This runs <code>fossil init</code>, registers the repo in the database, and (in production) Caddy automatically routes the subdomain.</p> |
| 949 | <h2 id="what-happens-under-the-hood">What Happens Under the Hood<a class="headerlink" href="#what-happens-under-the-hood" title="Permanent link">¶</a></h2> |
| 950 | <pre class="mermaid"><code>sequenceDiagram |
| 951 | participant User |
| 952 | participant Django |
| 953 | participant Fossil |
| 954 | participant Litestream |
| 955 | participant S3 |
| 956 | |
| 957 | User->>Django: Create repo "my-project" |
| 958 | Django->>Fossil: fossil init /data/repos/my-project.fossil |
| 959 | Fossil-->>Django: Repository created |
| 960 | Django->>Django: Register in database |
| 961 | Litestream->>S3: Begin replicating my-project.fossil |
| 962 | Django-->>User: Repository ready</code></pre> |
| 963 | <h2 id="accessing-your-repository">Accessing Your Repository<a class="headerlink" href="#accessing-your-repository" title="Permanent link">¶</a></h2> |
| 964 | <h3 id="web-ui">Web UI<a class="headerlink" href="#web-ui" title="Permanent link">¶</a></h3> |
| 965 | <p>Fossil includes a built-in web interface with:</p> |
| 966 | <ul> |
| 967 | <li><strong>Timeline</strong> -- commit history with diffs</li> |
| 968 | <li><strong>Tickets</strong> -- issue tracker</li> |
| 969 | <li><strong>Wiki</strong> -- project documentation</li> |
| 970 | <li><strong>Forum</strong> -- discussions</li> |
| 971 | </ul> |
| 972 | <h3 id="clone-via-fossil">Clone via Fossil<a class="headerlink" href="#clone-via-fossil" title="Permanent link">¶</a></h3> |
| 973 | <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>fossil<span class="w"> </span>clone<span class="w"> </span>https://my-project.your-domain.com<span class="w"> </span>my-project.fossil |
| 974 | <a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>fossil<span class="w"> </span>open<span class="w"> </span>my-project.fossil |
| 975 | </code></pre></div> |
| 976 | <h3 id="clone-via-git-mirror">Clone via Git (Mirror)<a class="headerlink" href="#clone-via-git-mirror" title="Permanent link">¶</a></h3> |
| 977 | <p>If you've configured the sync bridge:</p> |
| 978 | <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/your-org/my-project.git |
| 979 | </code></pre></div> |
| 980 | <div class="admonition warning"> |
| 981 | <p class="admonition-title">Read-only mirror</p> |
| 982 | <p>Git mirrors are downstream copies. Push changes to the Fossil repo -- they'll sync to Git automatically.</p> |
| 983 | </div> |
| 984 | <h2 id="next-steps">Next Steps<a class="headerlink" href="#next-steps" title="Permanent link">¶</a></h2> |
| 985 | <ul> |
| 986 | <li><a href="../../architecture/sync-bridge/">Configure the sync bridge</a> to mirror to GitHub/GitLab</li> |
| 987 | <li><a href="../configuration/#litestream-backups">Set up backups</a> with Litestream</li> |
| 988 | <li>Explore the <a href="../../architecture/overview/">architecture overview</a></li> |
| 989 | </ul> |
| 990 | |
| 991 | |
| 992 | |
| 993 | |
| 994 | |
| 995 | |
| 996 | |
| 997 | |
| 998 | |
| 999 | |
| 1000 | |
| 1001 | |
| 1002 | |
| 1003 | </article> |
| 1004 | </div> |
| 1005 | |
| 1006 | |
| 1007 | <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> |
| 1008 | |
| 1009 | <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> |
| 1010 | </div> |
| 1011 | |
| 1012 | <button type="button" class="md-top md-icon" data-md-component="top" hidden> |
| 1013 | |
| 1014 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> |
| 1015 | Back to top |
| 1016 | </button> |
| 1017 | |
| 1018 | </main> |
| 1019 | |
| 1020 | <footer class="md-footer"> |
| 1021 | |
| 1022 | <div class="md-footer-meta md-typeset"> |
| 1023 | <div class="md-footer-meta__inner md-grid"> |
| 1024 | <div class="md-copyright"> |
| 1025 | |
| 1026 | <div class="md-copyright__highlight"> |
| 1027 | Copyright © 2026 CONFLICT LLC |
| 1028 | </div> |
| 1029 | |
| 1030 | |
| 1031 | Made with |
| 1032 | <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> |
| 1033 | Material for MkDocs |
| 1034 | </a> |
| 1035 | |
| 1036 | </div> |
| 1037 | |
| 1038 | |
| 1039 | <div class="md-social"> |
| 1040 | |
| 1041 | |
| 1042 | |
| 1043 | |
| 1044 | |
| 1045 | |
| 1046 | |
| 1047 | |
| 1048 | <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link"> |
| 1049 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 1050 | </a> |
| 1051 | |
| 1052 | </div> |
| 1053 | |
| 1054 | </div> |
| 1055 | </div> |
| 1056 | </footer> |
| 1057 | |
| 1058 | </div> |
| 1059 | <div class="md-dialog" data-md-component="dialog"> |
| 1060 | <div class="md-dialog__inner md-typeset"></div> |
| 1061 | </div> |
| 1062 | |
| 1063 | |
| 1064 | |
| 1065 | |
| 1066 | |
| 1067 | <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> |
| 1068 | |
| 1069 | |
| 1070 | <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script> |
| 1071 | |
| 1072 | |
| 1073 | </body> |
| 1074 | </html> |
| --- a/site/getting-started/installation/index.html | ||
| +++ b/site/getting-started/installation/index.html | ||
| @@ -0,0 +1,1089 @@ | ||
| 1 | + | |
| 2 | +<!doctype html> | |
| 3 | +<html lang="en" class="no-js"> | |
| 4 | + <head> | |
| 5 | + | |
| 6 | + <meta charset="utf-8"> | |
| 7 | + <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| 8 | + | |
| 9 | + <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting"> | |
| 10 | + | |
| 11 | + | |
| 12 | + <meta name="author" content="CONFLICT LLC"> | |
| 13 | + | |
| 14 | + | |
| 15 | + <link rel="canonical" href="https://fossilrepo.dev/getting-started/installation/"> | |
| 16 | + | |
| 17 | + | |
| 18 | + <link rel="prev" href="../prerequisites/"> | |
| 19 | + | |
| 20 | + | |
| 21 | + <link rel="next" href="../configuration/"> | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + <link rel="icon" href="../../assets/images/favicon.png"> | |
| 28 | + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6"> | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + <title>Installation - Fossilrepo</title> | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css"> | |
| 37 | + | |
| 38 | + | |
| 39 | + <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css"> | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | |
| 53 | + <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> | |
| 54 | + <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + <link rel="stylesheet" href="../../assets/css/custom.css"> | |
| 59 | + | |
| 60 | + <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + </head> | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"> | |
| 77 | + | |
| 78 | + | |
| 79 | + <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> | |
| 80 | + <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> | |
| 81 | + <label class="md-overlay" for="__drawer"></label> | |
| 82 | + <div data-md-component="skip"> | |
| 83 | + | |
| 84 | + | |
| 85 | + <a href="#installation" class="md-skip"> | |
| 86 | + Skip to content | |
| 87 | + </a> | |
| 88 | + | |
| 89 | + </div> | |
| 90 | + <div data-md-component="announce"> | |
| 91 | + | |
| 92 | + </div> | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | +<header class="md-header" data-md-component="header"> | |
| 98 | + <nav class="md-header__inner md-grid" aria-label="Header"> | |
| 99 | + <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> | |
| 100 | + <div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 101 | + <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 102 | + <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 103 | +</div> | |
| 104 | + </a> | |
| 105 | + <label class="md-header__button md-icon" for="__drawer"> | |
| 106 | + | |
| 107 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> | |
| 108 | + </label> | |
| 109 | + <div class="md-header__title" data-md-component="header-title"> | |
| 110 | + <div class="md-header__ellipsis"> | |
| 111 | + <div class="md-header__topic"> | |
| 112 | + <span class="md-ellipsis"> | |
| 113 | + Fossilrepo | |
| 114 | + </span> | |
| 115 | + </div> | |
| 116 | + <div class="md-header__topic" data-md-component="header-topic"> | |
| 117 | + <span class="md-ellipsis"> | |
| 118 | + | |
| 119 | + Installation | |
| 120 | + | |
| 121 | + </span> | |
| 122 | + </div> | |
| 123 | + </div> | |
| 124 | + </div> | |
| 125 | + | |
| 126 | + | |
| 127 | + <form class="md-header__option" data-md-component="palette"> | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> | |
| 133 | + | |
| 134 | + <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> | |
| 135 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> | |
| 136 | + </label> | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> | |
| 143 | + | |
| 144 | + <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> | |
| 145 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> | |
| 146 | + </label> | |
| 147 | + | |
| 148 | + | |
| 149 | +</form> | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + <label class="md-header__button md-icon" for="__search"> | |
| 160 | + | |
| 161 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> | |
| 162 | + </label> | |
| 163 | + <div class="md-search" data-md-component="search" role="dialog"> | |
| 164 | + <label class="md-search__overlay" for="__search"></label> | |
| 165 | + <div class="md-search__inner" role="search"> | |
| 166 | + <form class="md-search__form" name="search"> | |
| 167 | + <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> | |
| 168 | + <label class="md-search__icon md-icon" for="__search"> | |
| 169 | + | |
| 170 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> | |
| 171 | + | |
| 172 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> | |
| 173 | + </label> | |
| 174 | + <nav class="md-search__options" aria-label="Search"> | |
| 175 | + | |
| 176 | + <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> | |
| 177 | + | |
| 178 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> | |
| 179 | + </button> | |
| 180 | + </nav> | |
| 181 | + | |
| 182 | + <div class="md-search__suggest" data-md-component="search-suggest"></div> | |
| 183 | + | |
| 184 | + </form> | |
| 185 | + <div class="md-search__output"> | |
| 186 | + <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> | |
| 187 | + <div class="md-search-result" data-md-component="search-result"> | |
| 188 | + <div class="md-search-result__meta"> | |
| 189 | + Initializing search | |
| 190 | + </div> | |
| 191 | + <ol class="md-search-result__list" role="presentation"></ol> | |
| 192 | + </div> | |
| 193 | + </div> | |
| 194 | + </div> | |
| 195 | + </div> | |
| 196 | +</div> | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + <div class="md-header__source"> | |
| 201 | + <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> | |
| 202 | + <div class="md-source__icon md-icon"> | |
| 203 | + | |
| 204 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 205 | + </div> | |
| 206 | + <div class="md-source__repository"> | |
| 207 | + ConflictHQ/fossilrepo | |
| 208 | + </div> | |
| 209 | +</a> | |
| 210 | + </div> | |
| 211 | + | |
| 212 | + </nav> | |
| 213 | + | |
| 214 | +</header> | |
| 215 | + | |
| 216 | + <div class="md-container" data-md-component="container"> | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | +<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> | |
| 223 | + <div class="md-grid"> | |
| 224 | + <ul class="md-tabs__list"> | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + <li class="md-tabs__item"> | |
| 232 | + <a href="../.." class="md-tabs__link"> | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + Home | |
| 239 | + | |
| 240 | + </a> | |
| 241 | + </li> | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + <li class="md-tabs__item md-tabs__item--active"> | |
| 255 | + <a href="../prerequisites/" class="md-tabs__link"> | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + Getting Started | |
| 260 | + | |
| 261 | + </a> | |
| 262 | + </li> | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + <li class="md-tabs__item"> | |
| 275 | + <a href="../../architecture/overview/" class="md-tabs__link"> | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + Architecture | |
| 280 | + | |
| 281 | + </a> | |
| 282 | + </li> | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + </ul> | |
| 288 | + </div> | |
| 289 | +</nav> | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + <main class="md-main" data-md-component="main"> | |
| 294 | + <div class="md-main__inner md-grid"> | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > | |
| 299 | + <div class="md-sidebar__scrollwrap"> | |
| 300 | + <div class="md-sidebar__inner"> | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | +<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> | |
| 308 | + <label class="md-nav__title" for="__drawer"> | |
| 309 | + <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> | |
| 310 | + <div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 311 | + <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 312 | + <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 313 | +</div> | |
| 314 | + </a> | |
| 315 | + Fossilrepo | |
| 316 | + </label> | |
| 317 | + | |
| 318 | + <div class="md-nav__source"> | |
| 319 | + <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> | |
| 320 | + <div class="md-source__icon md-icon"> | |
| 321 | + | |
| 322 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 323 | + </div> | |
| 324 | + <div class="md-source__repository"> | |
| 325 | + ConflictHQ/fossilrepo | |
| 326 | + </div> | |
| 327 | +</a> | |
| 328 | + </div> | |
| 329 | + | |
| 330 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + <li class="md-nav__item"> | |
| 339 | + <a href="../.." class="md-nav__link"> | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + <span class="md-ellipsis"> | |
| 344 | + | |
| 345 | + | |
| 346 | + Home | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + </span> | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + </a> | |
| 355 | + </li> | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked> | |
| 385 | + | |
| 386 | + | |
| 387 | + <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex=""> | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + <span class="md-ellipsis"> | |
| 392 | + | |
| 393 | + | |
| 394 | + Getting Started | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + </span> | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + <span class="md-nav__icon md-icon"></span> | |
| 403 | + </label> | |
| 404 | + | |
| 405 | + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true"> | |
| 406 | + <label class="md-nav__title" for="__nav_2"> | |
| 407 | + <span class="md-nav__icon md-icon"></span> | |
| 408 | + | |
| 409 | + | |
| 410 | + Getting Started | |
| 411 | + | |
| 412 | + | |
| 413 | + </label> | |
| 414 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + <li class="md-nav__item"> | |
| 423 | + <a href="../prerequisites/" class="md-nav__link"> | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + <span class="md-ellipsis"> | |
| 428 | + | |
| 429 | + | |
| 430 | + Prerequisites | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + </span> | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + </a> | |
| 439 | + </li> | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + <li class="md-nav__item md-nav__item--active"> | |
| 453 | + | |
| 454 | + <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + <label class="md-nav__link md-nav__link--active" for="__toc"> | |
| 461 | + | |
| 462 | + | |
| 463 | + | |
| 464 | + <span class="md-ellipsis"> | |
| 465 | + | |
| 466 | + | |
| 467 | + Installation | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + </span> | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + <span class="md-nav__icon md-icon"></span> | |
| 476 | + </label> | |
| 477 | + | |
| 478 | + <a href="./" class="md-nav__link md-nav__link--active"> | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
| 482 | + <span class="md-ellipsis"> | |
| 483 | + | |
| 484 | + | |
| 485 | + Installation | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + </span> | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + </a> | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + <label class="md-nav__title" for="__toc"> | |
| 505 | + <span class="md-nav__icon md-icon"></span> | |
| 506 | + Table of contents | |
| 507 | + </label> | |
| 508 | + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> | |
| 509 | + | |
| 510 | + <li class="md-nav__item"> | |
| 511 | + <a href="#clone-the-repository" class="md-nav__link"> | |
| 512 | + <span class="md-ellipsis"> | |
| 513 | + | |
| 514 | + Clone the Repository | |
| 515 | + | |
| 516 | + </span> | |
| 517 | + </a> | |
| 518 | + | |
| 519 | +</li> | |
| 520 | + | |
| 521 | + <li class="md-nav__item"> | |
| 522 | + <a href="#environment-configuration" class="md-nav__link"> | |
| 523 | + <span class="md-ellipsis"> | |
| 524 | + | |
| 525 | + Environment Configuration | |
| 526 | + | |
| 527 | + </span> | |
| 528 | + </a> | |
| 529 | + | |
| 530 | +</li> | |
| 531 | + | |
| 532 | + <li class="md-nav__item"> | |
| 533 | + <a href="#start-the-stack" class="md-nav__link"> | |
| 534 | + <span class="md-ellipsis"> | |
| 535 | + | |
| 536 | + Start the Stack | |
| 537 | + | |
| 538 | + </span> | |
| 539 | + </a> | |
| 540 | + | |
| 541 | + <nav class="md-nav" aria-label="Start the Stack"> | |
| 542 | + <ul class="md-nav__list"> | |
| 543 | + | |
| 544 | + <li class="md-nav__item"> | |
| 545 | + <a href="#development" class="md-nav__link"> | |
| 546 | + <span class="md-ellipsis"> | |
| 547 | + | |
| 548 | + Development | |
| 549 | + | |
| 550 | + </span> | |
| 551 | + </a> | |
| 552 | + | |
| 553 | +</li> | |
| 554 | + | |
| 555 | + <li class="md-nav__item"> | |
| 556 | + <a href="#production" class="md-nav__link"> | |
| 557 | + <span class="md-ellipsis"> | |
| 558 | + | |
| 559 | + Production | |
| 560 | + | |
| 561 | + </span> | |
| 562 | + </a> | |
| 563 | + | |
| 564 | +</li> | |
| 565 | + | |
| 566 | + </ul> | |
| 567 | + </nav> | |
| 568 | + | |
| 569 | +</li> | |
| 570 | + | |
| 571 | + <li class="md-nav__item"> | |
| 572 | + <a href="#verify-installation" class="md-nav__link"> | |
| 573 | + <span class="md-ellipsis"> | |
| 574 | + | |
| 575 | + Verify Installation | |
| 576 | + | |
| 577 | + </span> | |
| 578 | + </a> | |
| 579 | + | |
| 580 | +</li> | |
| 581 | + | |
| 582 | + <li class="md-nav__item"> | |
| 583 | + <a href="#common-issues" class="md-nav__link"> | |
| 584 | + <span class="md-ellipsis"> | |
| 585 | + | |
| 586 | + Common Issues | |
| 587 | + | |
| 588 | + </span> | |
| 589 | + </a> | |
| 590 | + | |
| 591 | +</li> | |
| 592 | + | |
| 593 | + </ul> | |
| 594 | + | |
| 595 | +</nav> | |
| 596 | + | |
| 597 | + </li> | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + <li class="md-nav__item"> | |
| 609 | + <a href="../configuration/" class="md-nav__link"> | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
| 613 | + <span class="md-ellipsis"> | |
| 614 | + | |
| 615 | + | |
| 616 | + Configuration | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
| 620 | + </span> | |
| 621 | + | |
| 622 | + | |
| 623 | + | |
| 624 | + </a> | |
| 625 | + </li> | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + <li class="md-nav__item"> | |
| 637 | + <a href="../first-repo/" class="md-nav__link"> | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
| 641 | + <span class="md-ellipsis"> | |
| 642 | + | |
| 643 | + | |
| 644 | + First Repository | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + </span> | |
| 649 | + | |
| 650 | + | |
| 651 | + | |
| 652 | + </a> | |
| 653 | + </li> | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + </ul> | |
| 659 | + </nav> | |
| 660 | + | |
| 661 | + </li> | |
| 662 | + | |
| 663 | + | |
| 664 | + | |
| 665 | + | |
| 666 | + | |
| 667 | + | |
| 668 | + | |
| 669 | + | |
| 670 | + | |
| 671 | + | |
| 672 | + | |
| 673 | + | |
| 674 | + | |
| 675 | + | |
| 676 | + | |
| 677 | + | |
| 678 | + | |
| 679 | + | |
| 680 | + | |
| 681 | + <li class="md-nav__item md-nav__item--nested"> | |
| 682 | + | |
| 683 | + | |
| 684 | + | |
| 685 | + | |
| 686 | + | |
| 687 | + <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" > | |
| 688 | + | |
| 689 | + | |
| 690 | + <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> | |
| 691 | + | |
| 692 | + | |
| 693 | + | |
| 694 | + <span class="md-ellipsis"> | |
| 695 | + | |
| 696 | + | |
| 697 | + Architecture | |
| 698 | + | |
| 699 | + | |
| 700 | + | |
| 701 | + </span> | |
| 702 | + | |
| 703 | + | |
| 704 | + | |
| 705 | + <span class="md-nav__icon md-icon"></span> | |
| 706 | + </label> | |
| 707 | + | |
| 708 | + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> | |
| 709 | + <label class="md-nav__title" for="__nav_3"> | |
| 710 | + <span class="md-nav__icon md-icon"></span> | |
| 711 | + | |
| 712 | + | |
| 713 | + Architecture | |
| 714 | + | |
| 715 | + | |
| 716 | + </label> | |
| 717 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 718 | + | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
| 723 | + | |
| 724 | + | |
| 725 | + <li class="md-nav__item"> | |
| 726 | + <a href="../../architecture/overview/" class="md-nav__link"> | |
| 727 | + | |
| 728 | + | |
| 729 | + | |
| 730 | + <span class="md-ellipsis"> | |
| 731 | + | |
| 732 | + | |
| 733 | + Overview | |
| 734 | + | |
| 735 | + | |
| 736 | + | |
| 737 | + </span> | |
| 738 | + | |
| 739 | + | |
| 740 | + | |
| 741 | + </a> | |
| 742 | + </li> | |
| 743 | + | |
| 744 | + | |
| 745 | + | |
| 746 | + | |
| 747 | + | |
| 748 | + | |
| 749 | + | |
| 750 | + | |
| 751 | + | |
| 752 | + | |
| 753 | + <li class="md-nav__item"> | |
| 754 | + <a href="../../architecture/sync-bridge/" class="md-nav__link"> | |
| 755 | + | |
| 756 | + | |
| 757 | + | |
| 758 | + <span class="md-ellipsis"> | |
| 759 | + | |
| 760 | + | |
| 761 | + Sync Bridge | |
| 762 | + | |
| 763 | + | |
| 764 | + | |
| 765 | + </span> | |
| 766 | + | |
| 767 | + | |
| 768 | + | |
| 769 | + </a> | |
| 770 | + </li> | |
| 771 | + | |
| 772 | + | |
| 773 | + | |
| 774 | + | |
| 775 | + </ul> | |
| 776 | + </nav> | |
| 777 | + | |
| 778 | + </li> | |
| 779 | + | |
| 780 | + | |
| 781 | + | |
| 782 | + </ul> | |
| 783 | +</nav> | |
| 784 | + </div> | |
| 785 | + </div> | |
| 786 | + </div> | |
| 787 | + | |
| 788 | + | |
| 789 | + | |
| 790 | + <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > | |
| 791 | + <div class="md-sidebar__scrollwrap"> | |
| 792 | + <div class="md-sidebar__inner"> | |
| 793 | + | |
| 794 | + | |
| 795 | +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
| 796 | + | |
| 797 | + | |
| 798 | + | |
| 799 | + | |
| 800 | + | |
| 801 | + | |
| 802 | + <label class="md-nav__title" for="__toc"> | |
| 803 | + <span class="md-nav__icon md-icon"></span> | |
| 804 | + Table of contents | |
| 805 | + </label> | |
| 806 | + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> | |
| 807 | + | |
| 808 | + <li class="md-nav__item"> | |
| 809 | + <a href="#clone-the-repository" class="md-nav__link"> | |
| 810 | + <span class="md-ellipsis"> | |
| 811 | + | |
| 812 | + Clone the Repository | |
| 813 | + | |
| 814 | + </span> | |
| 815 | + </a> | |
| 816 | + | |
| 817 | +</li> | |
| 818 | + | |
| 819 | + <li class="md-nav__item"> | |
| 820 | + <a href="#environment-configuration" class="md-nav__link"> | |
| 821 | + <span class="md-ellipsis"> | |
| 822 | + | |
| 823 | + Environment Configuration | |
| 824 | + | |
| 825 | + </span> | |
| 826 | + </a> | |
| 827 | + | |
| 828 | +</li> | |
| 829 | + | |
| 830 | + <li class="md-nav__item"> | |
| 831 | + <a href="#start-the-stack" class="md-nav__link"> | |
| 832 | + <span class="md-ellipsis"> | |
| 833 | + | |
| 834 | + Start the Stack | |
| 835 | + | |
| 836 | + </span> | |
| 837 | + </a> | |
| 838 | + | |
| 839 | + <nav class="md-nav" aria-label="Start the Stack"> | |
| 840 | + <ul class="md-nav__list"> | |
| 841 | + | |
| 842 | + <li class="md-nav__item"> | |
| 843 | + <a href="#development" class="md-nav__link"> | |
| 844 | + <span class="md-ellipsis"> | |
| 845 | + | |
| 846 | + Development | |
| 847 | + | |
| 848 | + </span> | |
| 849 | + </a> | |
| 850 | + | |
| 851 | +</li> | |
| 852 | + | |
| 853 | + <li class="md-nav__item"> | |
| 854 | + <a href="#production" class="md-nav__link"> | |
| 855 | + <span class="md-ellipsis"> | |
| 856 | + | |
| 857 | + Production | |
| 858 | + | |
| 859 | + </span> | |
| 860 | + </a> | |
| 861 | + | |
| 862 | +</li> | |
| 863 | + | |
| 864 | + </ul> | |
| 865 | + </nav> | |
| 866 | + | |
| 867 | +</li> | |
| 868 | + | |
| 869 | + <li class="md-nav__item"> | |
| 870 | + <a href="#verify-installation" class="md-nav__link"> | |
| 871 | + <span class="md-ellipsis"> | |
| 872 | + | |
| 873 | + Verify Installation | |
| 874 | + | |
| 875 | + </span> | |
| 876 | + </a> | |
| 877 | + | |
| 878 | +</li> | |
| 879 | + | |
| 880 | + <li class="md-nav__item"> | |
| 881 | + <a href="#common-issues" class="md-nav__link"> | |
| 882 | + <span class="md-ellipsis"> | |
| 883 | + | |
| 884 | + Common Issues | |
| 885 | + | |
| 886 | + </span> | |
| 887 | + </a> | |
| 888 | + | |
| 889 | +</li> | |
| 890 | + | |
| 891 | + </ul> | |
| 892 | + | |
| 893 | +</nav> | |
| 894 | + </div> | |
| 895 | + </div> | |
| 896 | + </div> | |
| 897 | + | |
| 898 | + | |
| 899 | + | |
| 900 | + <div class="md-content" data-md-component="content"> | |
| 901 | + | |
| 902 | + <article class="md-content__inner md-typeset"> | |
| 903 | + | |
| 904 | + | |
| 905 | + | |
| 906 | + | |
| 907 | + | |
| 908 | + | |
| 909 | + | |
| 910 | + | |
| 911 | +<h1 id="installation">Installation<a class="headerlink" href="#installation" title="Permanent link">¶</a></h1> | |
| 912 | +<h2 id="clone-the-repository">Clone the Repository<a class="headerlink" href="#clone-the-repository" title="Permanent link">¶</a></h2> | |
| 913 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/ConflictHQ/fossilrepo.git | |
| 914 | +<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="nb">cd</span><span class="w"> </span>fossilrepo | |
| 915 | +</code></pre></div> | |
| 916 | +<h2 id="environment-configuration">Environment Configuration<a class="headerlink" href="#environment-configuration" title="Permanent link">¶</a></h2> | |
| 917 | +<p>Copy the example environment file and configure it:</p> | |
| 918 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>cp<span class="w"> </span>.env.example<span class="w"> </span>.env | |
| 919 | +</code></pre></div> | |
| 920 | +<p>Edit <code>.env</code> with your settings:</p> | |
| 921 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="c1"># Django</span> | |
| 922 | +<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="na">SECRET_KEY</span><span class="o">=</span><span class="s">your-secret-key-here</span> | |
| 923 | +<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="na">DEBUG</span><span class="o">=</span><span class="s">True</span> | |
| 924 | +<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="na">ALLOWED_HOSTS</span><span class="o">=</span><span class="s">localhost,127.0.0.1</span> | |
| 925 | +<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a> | |
| 926 | +<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="c1"># Database</span> | |
| 927 | +<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="na">POSTGRES_DB</span><span class="o">=</span><span class="s">fossilrepo</span> | |
| 928 | +<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="na">POSTGRES_USER</span><span class="o">=</span><span class="s">fossilrepo</span> | |
| 929 | +<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="na">POSTGRES_PASSWORD</span><span class="o">=</span><span class="s">your-db-password</span> | |
| 930 | +<a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a> | |
| 931 | +<a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a><span class="c1"># Redis</span> | |
| 932 | +<a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a><span class="na">REDIS_URL</span><span class="o">=</span><span class="s">redis://redis:6379/0</span> | |
| 933 | +<a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a> | |
| 934 | +<a id="__codelineno-2-14" name="__codelineno-2-14" href="#__codelineno-2-14"></a><span class="c1"># Fossil</span> | |
| 935 | +<a id="__codelineno-2-15" name="__codelineno-2-15" href="#__codelineno-2-15"></a><span class="na">FOSSIL_REPO_DIR</span><span class="o">=</span><span class="s">/data/repos</span> | |
| 936 | +<a id="__codelineno-2-16" name="__codelineno-2-16" href="#__codelineno-2-16"></a><span class="na">FOSSIL_BASE_URL</span><span class="o">=</span><span class="s">https://your-domain.com</span> | |
| 937 | +</code></pre></div> | |
| 938 | +<h2 id="start-the-stack">Start the Stack<a class="headerlink" href="#start-the-stack" title="Permanent link">¶</a></h2> | |
| 939 | +<h3 id="development">Development<a class="headerlink" href="#development" title="Permanent link">¶</a></h3> | |
| 940 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="c1"># Build and start all services</span> | |
| 941 | +<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>make<span class="w"> </span>build | |
| 942 | +<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a> | |
| 943 | +<a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="c1"># Run database migrations</span> | |
| 944 | +<a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>make<span class="w"> </span>migrate | |
| 945 | +<a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a> | |
| 946 | +<a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="c1"># Create an admin user</span> | |
| 947 | +<a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a>make<span class="w"> </span>superuser | |
| 948 | +<a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a> | |
| 949 | +<a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a><span class="c1"># Load sample data (optional)</span> | |
| 950 | +<a id="__codelineno-3-11" name="__codelineno-3-11" href="#__codelineno-3-11"></a>make<span class="w"> </span>seed | |
| 951 | +</code></pre></div> | |
| 952 | +<p>The development stack includes:</p> | |
| 953 | +<ul> | |
| 954 | +<li>Django dev server on <code>http://localhost:8000</code></li> | |
| 955 | +<li>PostgreSQL 16</li> | |
| 956 | +<li>Redis</li> | |
| 957 | +<li>Celery worker + beat</li> | |
| 958 | +<li>Mailpit on <code>http://localhost:8025</code></li> | |
| 959 | +</ul> | |
| 960 | +<h3 id="production">Production<a class="headerlink" href="#production" title="Permanent link">¶</a></h3> | |
| 961 | +<p>For production, you'll also configure Caddy and Litestream:</p> | |
| 962 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="c1"># Copy production configs</span> | |
| 963 | +<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>cp<span class="w"> </span>docker/Caddyfile.example<span class="w"> </span>docker/Caddyfile | |
| 964 | +<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>cp<span class="w"> </span>docker/litestream.yml.example<span class="w"> </span>docker/litestream.yml | |
| 965 | +<a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a> | |
| 966 | +<a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="c1"># Edit with your domain and S3 credentials</span> | |
| 967 | +<a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a><span class="c1"># Then start with the production compose file</span> | |
| 968 | +<a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a>docker<span class="w"> </span>compose<span class="w"> </span>-f<span class="w"> </span>docker-compose.yml<span class="w"> </span>-f<span class="w"> </span>docker-compose.prod.yml<span class="w"> </span>up<span class="w"> </span>-d | |
| 969 | +</code></pre></div> | |
| 970 | +<h2 id="verify-installation">Verify Installation<a class="headerlink" href="#verify-installation" title="Permanent link">¶</a></h2> | |
| 971 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="c1"># Check all services are running</span> | |
| 972 | +<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>docker<span class="w"> </span>compose<span class="w"> </span>ps | |
| 973 | +<a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a> | |
| 974 | +<a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="c1"># Hit the health endpoint</span> | |
| 975 | +<a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a>curl<span class="w"> </span>http://localhost:8000/health/ | |
| 976 | +<a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a> | |
| 977 | +<a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a><span class="c1"># Open the dashboard</span> | |
| 978 | +<a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a>open<span class="w"> </span>http://localhost:8000 | |
| 979 | +</code></pre></div> | |
| 980 | +<div class="admonition success"> | |
| 981 | +<p class="admonition-title">You should see</p> | |
| 982 | +<p>The fossilrepo dashboard with navigation, login page, and (after seeding) sample repositories.</p> | |
| 983 | +</div> | |
| 984 | +<h2 id="common-issues">Common Issues<a class="headerlink" href="#common-issues" title="Permanent link">¶</a></h2> | |
| 985 | +<details class="question"> | |
| 986 | +<summary>Port 8000 already in use</summary> | |
| 987 | +<p>Change the Django port mapping in <code>docker-compose.yml</code>: | |
| 988 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="nt">ports</span><span class="p">:</span> | |
| 989 | +<a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"8001:8000"</span> | |
| 990 | +</code></pre></div></p> | |
| 991 | +</details> | |
| 992 | +<details class="question"> | |
| 993 | +<summary>Database connection refused</summary> | |
| 994 | +<p>Ensure PostgreSQL has started before Django: | |
| 995 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>docker<span class="w"> </span>compose<span class="w"> </span>logs<span class="w"> </span>postgres | |
| 996 | +</code></pre></div> | |
| 997 | +The Django container waits for Postgres to be ready, but network issues on some Docker Desktop versions can cause timeouts. Restart with <code>make down && make up</code>.</p> | |
| 998 | +</details> | |
| 999 | +<details class="question"> | |
| 1000 | +<summary>Permission denied on /data/repos</summary> | |
| 1001 | +<p>The Fossil repo directory needs to be writable by the container user: | |
| 1002 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a>sudo<span class="w"> </span>chown<span class="w"> </span>-R<span class="w"> </span><span class="m">1000</span>:1000<span class="w"> </span>/data/repos | |
| 1003 | +</code></pre></div></p> | |
| 1004 | +</details> | |
| 1005 | + | |
| 1006 | + | |
| 1007 | + | |
| 1008 | + | |
| 1009 | + | |
| 1010 | + | |
| 1011 | + | |
| 1012 | + | |
| 1013 | + | |
| 1014 | + | |
| 1015 | + | |
| 1016 | + | |
| 1017 | + | |
| 1018 | + </article> | |
| 1019 | + </div> | |
| 1020 | + | |
| 1021 | + | |
| 1022 | + <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> | |
| 1023 | + | |
| 1024 | +<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> | |
| 1025 | + </div> | |
| 1026 | + | |
| 1027 | + <button type="button" class="md-top md-icon" data-md-component="top" hidden> | |
| 1028 | + | |
| 1029 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> | |
| 1030 | + Back to top | |
| 1031 | +</button> | |
| 1032 | + | |
| 1033 | + </main> | |
| 1034 | + | |
| 1035 | + <footer class="md-footer"> | |
| 1036 | + | |
| 1037 | + <div class="md-footer-meta md-typeset"> | |
| 1038 | + <div class="md-footer-meta__inner md-grid"> | |
| 1039 | + <div class="md-copyright"> | |
| 1040 | + | |
| 1041 | + <div class="md-copyright__highlight"> | |
| 1042 | + Copyright © 2026 CONFLICT LLC | |
| 1043 | + </div> | |
| 1044 | + | |
| 1045 | + | |
| 1046 | + Made with | |
| 1047 | + <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> | |
| 1048 | + Material for MkDocs | |
| 1049 | + </a> | |
| 1050 | + | |
| 1051 | +</div> | |
| 1052 | + | |
| 1053 | + | |
| 1054 | +<div class="md-social"> | |
| 1055 | + | |
| 1056 | + | |
| 1057 | + | |
| 1058 | + | |
| 1059 | + | |
| 1060 | + | |
| 1061 | + | |
| 1062 | + | |
| 1063 | + <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link"> | |
| 1064 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 1065 | + </a> | |
| 1066 | + | |
| 1067 | +</div> | |
| 1068 | + | |
| 1069 | + </div> | |
| 1070 | + </div> | |
| 1071 | +</footer> | |
| 1072 | + | |
| 1073 | + </div> | |
| 1074 | + <div class="md-dialog" data-md-component="dialog"> | |
| 1075 | + <div class="md-dialog__inner md-typeset"></div> | |
| 1076 | + </div> | |
| 1077 | + | |
| 1078 | + | |
| 1079 | + | |
| 1080 | + | |
| 1081 | + | |
| 1082 | + <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> | |
| 1083 | + | |
| 1084 | + | |
| 1085 | + <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script> | |
| 1086 | + | |
| 1087 | + | |
| 1088 | + </body> | |
| 1089 | +</html> |
| --- a/site/getting-started/installation/index.html | |
| +++ b/site/getting-started/installation/index.html | |
| @@ -0,0 +1,1089 @@ | |
| --- a/site/getting-started/installation/index.html | |
| +++ b/site/getting-started/installation/index.html | |
| @@ -0,0 +1,1089 @@ | |
| 1 | |
| 2 | <!doctype html> |
| 3 | <html lang="en" class="no-js"> |
| 4 | <head> |
| 5 | |
| 6 | <meta charset="utf-8"> |
| 7 | <meta name="viewport" content="width=device-width,initial-scale=1"> |
| 8 | |
| 9 | <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting"> |
| 10 | |
| 11 | |
| 12 | <meta name="author" content="CONFLICT LLC"> |
| 13 | |
| 14 | |
| 15 | <link rel="canonical" href="https://fossilrepo.dev/getting-started/installation/"> |
| 16 | |
| 17 | |
| 18 | <link rel="prev" href="../prerequisites/"> |
| 19 | |
| 20 | |
| 21 | <link rel="next" href="../configuration/"> |
| 22 | |
| 23 | |
| 24 | |
| 25 | |
| 26 | |
| 27 | <link rel="icon" href="../../assets/images/favicon.png"> |
| 28 | <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6"> |
| 29 | |
| 30 | |
| 31 | |
| 32 | <title>Installation - Fossilrepo</title> |
| 33 | |
| 34 | |
| 35 | |
| 36 | <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css"> |
| 37 | |
| 38 | |
| 39 | <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css"> |
| 40 | |
| 41 | |
| 42 | |
| 43 | |
| 44 | |
| 45 | |
| 46 | |
| 47 | |
| 48 | |
| 49 | |
| 50 | |
| 51 | |
| 52 | <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
| 53 | <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> |
| 54 | <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> |
| 55 | |
| 56 | |
| 57 | |
| 58 | <link rel="stylesheet" href="../../assets/css/custom.css"> |
| 59 | |
| 60 | <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> |
| 61 | |
| 62 | |
| 63 | |
| 64 | |
| 65 | |
| 66 | </head> |
| 67 | |
| 68 | |
| 69 | |
| 70 | |
| 71 | |
| 72 | |
| 73 | |
| 74 | |
| 75 | |
| 76 | <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"> |
| 77 | |
| 78 | |
| 79 | <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> |
| 80 | <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> |
| 81 | <label class="md-overlay" for="__drawer"></label> |
| 82 | <div data-md-component="skip"> |
| 83 | |
| 84 | |
| 85 | <a href="#installation" class="md-skip"> |
| 86 | Skip to content |
| 87 | </a> |
| 88 | |
| 89 | </div> |
| 90 | <div data-md-component="announce"> |
| 91 | |
| 92 | </div> |
| 93 | |
| 94 | |
| 95 | |
| 96 | |
| 97 | <header class="md-header" data-md-component="header"> |
| 98 | <nav class="md-header__inner md-grid" aria-label="Header"> |
| 99 | <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> |
| 100 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 101 | <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 102 | <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 103 | </div> |
| 104 | </a> |
| 105 | <label class="md-header__button md-icon" for="__drawer"> |
| 106 | |
| 107 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> |
| 108 | </label> |
| 109 | <div class="md-header__title" data-md-component="header-title"> |
| 110 | <div class="md-header__ellipsis"> |
| 111 | <div class="md-header__topic"> |
| 112 | <span class="md-ellipsis"> |
| 113 | Fossilrepo |
| 114 | </span> |
| 115 | </div> |
| 116 | <div class="md-header__topic" data-md-component="header-topic"> |
| 117 | <span class="md-ellipsis"> |
| 118 | |
| 119 | Installation |
| 120 | |
| 121 | </span> |
| 122 | </div> |
| 123 | </div> |
| 124 | </div> |
| 125 | |
| 126 | |
| 127 | <form class="md-header__option" data-md-component="palette"> |
| 128 | |
| 129 | |
| 130 | |
| 131 | |
| 132 | <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> |
| 133 | |
| 134 | <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> |
| 135 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> |
| 136 | </label> |
| 137 | |
| 138 | |
| 139 | |
| 140 | |
| 141 | |
| 142 | <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> |
| 143 | |
| 144 | <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> |
| 145 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> |
| 146 | </label> |
| 147 | |
| 148 | |
| 149 | </form> |
| 150 | |
| 151 | |
| 152 | |
| 153 | <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> |
| 154 | |
| 155 | |
| 156 | |
| 157 | |
| 158 | |
| 159 | <label class="md-header__button md-icon" for="__search"> |
| 160 | |
| 161 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> |
| 162 | </label> |
| 163 | <div class="md-search" data-md-component="search" role="dialog"> |
| 164 | <label class="md-search__overlay" for="__search"></label> |
| 165 | <div class="md-search__inner" role="search"> |
| 166 | <form class="md-search__form" name="search"> |
| 167 | <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> |
| 168 | <label class="md-search__icon md-icon" for="__search"> |
| 169 | |
| 170 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> |
| 171 | |
| 172 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> |
| 173 | </label> |
| 174 | <nav class="md-search__options" aria-label="Search"> |
| 175 | |
| 176 | <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> |
| 177 | |
| 178 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> |
| 179 | </button> |
| 180 | </nav> |
| 181 | |
| 182 | <div class="md-search__suggest" data-md-component="search-suggest"></div> |
| 183 | |
| 184 | </form> |
| 185 | <div class="md-search__output"> |
| 186 | <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> |
| 187 | <div class="md-search-result" data-md-component="search-result"> |
| 188 | <div class="md-search-result__meta"> |
| 189 | Initializing search |
| 190 | </div> |
| 191 | <ol class="md-search-result__list" role="presentation"></ol> |
| 192 | </div> |
| 193 | </div> |
| 194 | </div> |
| 195 | </div> |
| 196 | </div> |
| 197 | |
| 198 | |
| 199 | |
| 200 | <div class="md-header__source"> |
| 201 | <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> |
| 202 | <div class="md-source__icon md-icon"> |
| 203 | |
| 204 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 205 | </div> |
| 206 | <div class="md-source__repository"> |
| 207 | ConflictHQ/fossilrepo |
| 208 | </div> |
| 209 | </a> |
| 210 | </div> |
| 211 | |
| 212 | </nav> |
| 213 | |
| 214 | </header> |
| 215 | |
| 216 | <div class="md-container" data-md-component="container"> |
| 217 | |
| 218 | |
| 219 | |
| 220 | |
| 221 | |
| 222 | <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> |
| 223 | <div class="md-grid"> |
| 224 | <ul class="md-tabs__list"> |
| 225 | |
| 226 | |
| 227 | |
| 228 | |
| 229 | |
| 230 | |
| 231 | <li class="md-tabs__item"> |
| 232 | <a href="../.." class="md-tabs__link"> |
| 233 | |
| 234 | |
| 235 | |
| 236 | |
| 237 | |
| 238 | Home |
| 239 | |
| 240 | </a> |
| 241 | </li> |
| 242 | |
| 243 | |
| 244 | |
| 245 | |
| 246 | |
| 247 | |
| 248 | |
| 249 | |
| 250 | |
| 251 | |
| 252 | |
| 253 | |
| 254 | <li class="md-tabs__item md-tabs__item--active"> |
| 255 | <a href="../prerequisites/" class="md-tabs__link"> |
| 256 | |
| 257 | |
| 258 | |
| 259 | Getting Started |
| 260 | |
| 261 | </a> |
| 262 | </li> |
| 263 | |
| 264 | |
| 265 | |
| 266 | |
| 267 | |
| 268 | |
| 269 | |
| 270 | |
| 271 | |
| 272 | |
| 273 | |
| 274 | <li class="md-tabs__item"> |
| 275 | <a href="../../architecture/overview/" class="md-tabs__link"> |
| 276 | |
| 277 | |
| 278 | |
| 279 | Architecture |
| 280 | |
| 281 | </a> |
| 282 | </li> |
| 283 | |
| 284 | |
| 285 | |
| 286 | |
| 287 | </ul> |
| 288 | </div> |
| 289 | </nav> |
| 290 | |
| 291 | |
| 292 | |
| 293 | <main class="md-main" data-md-component="main"> |
| 294 | <div class="md-main__inner md-grid"> |
| 295 | |
| 296 | |
| 297 | |
| 298 | <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > |
| 299 | <div class="md-sidebar__scrollwrap"> |
| 300 | <div class="md-sidebar__inner"> |
| 301 | |
| 302 | |
| 303 | |
| 304 | |
| 305 | |
| 306 | |
| 307 | <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> |
| 308 | <label class="md-nav__title" for="__drawer"> |
| 309 | <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> |
| 310 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 311 | <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 312 | <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 313 | </div> |
| 314 | </a> |
| 315 | Fossilrepo |
| 316 | </label> |
| 317 | |
| 318 | <div class="md-nav__source"> |
| 319 | <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> |
| 320 | <div class="md-source__icon md-icon"> |
| 321 | |
| 322 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 323 | </div> |
| 324 | <div class="md-source__repository"> |
| 325 | ConflictHQ/fossilrepo |
| 326 | </div> |
| 327 | </a> |
| 328 | </div> |
| 329 | |
| 330 | <ul class="md-nav__list" data-md-scrollfix> |
| 331 | |
| 332 | |
| 333 | |
| 334 | |
| 335 | |
| 336 | |
| 337 | |
| 338 | <li class="md-nav__item"> |
| 339 | <a href="../.." class="md-nav__link"> |
| 340 | |
| 341 | |
| 342 | |
| 343 | <span class="md-ellipsis"> |
| 344 | |
| 345 | |
| 346 | Home |
| 347 | |
| 348 | |
| 349 | |
| 350 | </span> |
| 351 | |
| 352 | |
| 353 | |
| 354 | </a> |
| 355 | </li> |
| 356 | |
| 357 | |
| 358 | |
| 359 | |
| 360 | |
| 361 | |
| 362 | |
| 363 | |
| 364 | |
| 365 | |
| 366 | |
| 367 | |
| 368 | |
| 369 | |
| 370 | |
| 371 | |
| 372 | |
| 373 | |
| 374 | |
| 375 | |
| 376 | |
| 377 | |
| 378 | |
| 379 | |
| 380 | <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> |
| 381 | |
| 382 | |
| 383 | |
| 384 | <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked> |
| 385 | |
| 386 | |
| 387 | <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex=""> |
| 388 | |
| 389 | |
| 390 | |
| 391 | <span class="md-ellipsis"> |
| 392 | |
| 393 | |
| 394 | Getting Started |
| 395 | |
| 396 | |
| 397 | |
| 398 | </span> |
| 399 | |
| 400 | |
| 401 | |
| 402 | <span class="md-nav__icon md-icon"></span> |
| 403 | </label> |
| 404 | |
| 405 | <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true"> |
| 406 | <label class="md-nav__title" for="__nav_2"> |
| 407 | <span class="md-nav__icon md-icon"></span> |
| 408 | |
| 409 | |
| 410 | Getting Started |
| 411 | |
| 412 | |
| 413 | </label> |
| 414 | <ul class="md-nav__list" data-md-scrollfix> |
| 415 | |
| 416 | |
| 417 | |
| 418 | |
| 419 | |
| 420 | |
| 421 | |
| 422 | <li class="md-nav__item"> |
| 423 | <a href="../prerequisites/" class="md-nav__link"> |
| 424 | |
| 425 | |
| 426 | |
| 427 | <span class="md-ellipsis"> |
| 428 | |
| 429 | |
| 430 | Prerequisites |
| 431 | |
| 432 | |
| 433 | |
| 434 | </span> |
| 435 | |
| 436 | |
| 437 | |
| 438 | </a> |
| 439 | </li> |
| 440 | |
| 441 | |
| 442 | |
| 443 | |
| 444 | |
| 445 | |
| 446 | |
| 447 | |
| 448 | |
| 449 | |
| 450 | |
| 451 | |
| 452 | <li class="md-nav__item md-nav__item--active"> |
| 453 | |
| 454 | <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> |
| 455 | |
| 456 | |
| 457 | |
| 458 | |
| 459 | |
| 460 | <label class="md-nav__link md-nav__link--active" for="__toc"> |
| 461 | |
| 462 | |
| 463 | |
| 464 | <span class="md-ellipsis"> |
| 465 | |
| 466 | |
| 467 | Installation |
| 468 | |
| 469 | |
| 470 | |
| 471 | </span> |
| 472 | |
| 473 | |
| 474 | |
| 475 | <span class="md-nav__icon md-icon"></span> |
| 476 | </label> |
| 477 | |
| 478 | <a href="./" class="md-nav__link md-nav__link--active"> |
| 479 | |
| 480 | |
| 481 | |
| 482 | <span class="md-ellipsis"> |
| 483 | |
| 484 | |
| 485 | Installation |
| 486 | |
| 487 | |
| 488 | |
| 489 | </span> |
| 490 | |
| 491 | |
| 492 | |
| 493 | </a> |
| 494 | |
| 495 | |
| 496 | |
| 497 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> |
| 498 | |
| 499 | |
| 500 | |
| 501 | |
| 502 | |
| 503 | |
| 504 | <label class="md-nav__title" for="__toc"> |
| 505 | <span class="md-nav__icon md-icon"></span> |
| 506 | Table of contents |
| 507 | </label> |
| 508 | <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> |
| 509 | |
| 510 | <li class="md-nav__item"> |
| 511 | <a href="#clone-the-repository" class="md-nav__link"> |
| 512 | <span class="md-ellipsis"> |
| 513 | |
| 514 | Clone the Repository |
| 515 | |
| 516 | </span> |
| 517 | </a> |
| 518 | |
| 519 | </li> |
| 520 | |
| 521 | <li class="md-nav__item"> |
| 522 | <a href="#environment-configuration" class="md-nav__link"> |
| 523 | <span class="md-ellipsis"> |
| 524 | |
| 525 | Environment Configuration |
| 526 | |
| 527 | </span> |
| 528 | </a> |
| 529 | |
| 530 | </li> |
| 531 | |
| 532 | <li class="md-nav__item"> |
| 533 | <a href="#start-the-stack" class="md-nav__link"> |
| 534 | <span class="md-ellipsis"> |
| 535 | |
| 536 | Start the Stack |
| 537 | |
| 538 | </span> |
| 539 | </a> |
| 540 | |
| 541 | <nav class="md-nav" aria-label="Start the Stack"> |
| 542 | <ul class="md-nav__list"> |
| 543 | |
| 544 | <li class="md-nav__item"> |
| 545 | <a href="#development" class="md-nav__link"> |
| 546 | <span class="md-ellipsis"> |
| 547 | |
| 548 | Development |
| 549 | |
| 550 | </span> |
| 551 | </a> |
| 552 | |
| 553 | </li> |
| 554 | |
| 555 | <li class="md-nav__item"> |
| 556 | <a href="#production" class="md-nav__link"> |
| 557 | <span class="md-ellipsis"> |
| 558 | |
| 559 | Production |
| 560 | |
| 561 | </span> |
| 562 | </a> |
| 563 | |
| 564 | </li> |
| 565 | |
| 566 | </ul> |
| 567 | </nav> |
| 568 | |
| 569 | </li> |
| 570 | |
| 571 | <li class="md-nav__item"> |
| 572 | <a href="#verify-installation" class="md-nav__link"> |
| 573 | <span class="md-ellipsis"> |
| 574 | |
| 575 | Verify Installation |
| 576 | |
| 577 | </span> |
| 578 | </a> |
| 579 | |
| 580 | </li> |
| 581 | |
| 582 | <li class="md-nav__item"> |
| 583 | <a href="#common-issues" class="md-nav__link"> |
| 584 | <span class="md-ellipsis"> |
| 585 | |
| 586 | Common Issues |
| 587 | |
| 588 | </span> |
| 589 | </a> |
| 590 | |
| 591 | </li> |
| 592 | |
| 593 | </ul> |
| 594 | |
| 595 | </nav> |
| 596 | |
| 597 | </li> |
| 598 | |
| 599 | |
| 600 | |
| 601 | |
| 602 | |
| 603 | |
| 604 | |
| 605 | |
| 606 | |
| 607 | |
| 608 | <li class="md-nav__item"> |
| 609 | <a href="../configuration/" class="md-nav__link"> |
| 610 | |
| 611 | |
| 612 | |
| 613 | <span class="md-ellipsis"> |
| 614 | |
| 615 | |
| 616 | Configuration |
| 617 | |
| 618 | |
| 619 | |
| 620 | </span> |
| 621 | |
| 622 | |
| 623 | |
| 624 | </a> |
| 625 | </li> |
| 626 | |
| 627 | |
| 628 | |
| 629 | |
| 630 | |
| 631 | |
| 632 | |
| 633 | |
| 634 | |
| 635 | |
| 636 | <li class="md-nav__item"> |
| 637 | <a href="../first-repo/" class="md-nav__link"> |
| 638 | |
| 639 | |
| 640 | |
| 641 | <span class="md-ellipsis"> |
| 642 | |
| 643 | |
| 644 | First Repository |
| 645 | |
| 646 | |
| 647 | |
| 648 | </span> |
| 649 | |
| 650 | |
| 651 | |
| 652 | </a> |
| 653 | </li> |
| 654 | |
| 655 | |
| 656 | |
| 657 | |
| 658 | </ul> |
| 659 | </nav> |
| 660 | |
| 661 | </li> |
| 662 | |
| 663 | |
| 664 | |
| 665 | |
| 666 | |
| 667 | |
| 668 | |
| 669 | |
| 670 | |
| 671 | |
| 672 | |
| 673 | |
| 674 | |
| 675 | |
| 676 | |
| 677 | |
| 678 | |
| 679 | |
| 680 | |
| 681 | <li class="md-nav__item md-nav__item--nested"> |
| 682 | |
| 683 | |
| 684 | |
| 685 | |
| 686 | |
| 687 | <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" > |
| 688 | |
| 689 | |
| 690 | <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> |
| 691 | |
| 692 | |
| 693 | |
| 694 | <span class="md-ellipsis"> |
| 695 | |
| 696 | |
| 697 | Architecture |
| 698 | |
| 699 | |
| 700 | |
| 701 | </span> |
| 702 | |
| 703 | |
| 704 | |
| 705 | <span class="md-nav__icon md-icon"></span> |
| 706 | </label> |
| 707 | |
| 708 | <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> |
| 709 | <label class="md-nav__title" for="__nav_3"> |
| 710 | <span class="md-nav__icon md-icon"></span> |
| 711 | |
| 712 | |
| 713 | Architecture |
| 714 | |
| 715 | |
| 716 | </label> |
| 717 | <ul class="md-nav__list" data-md-scrollfix> |
| 718 | |
| 719 | |
| 720 | |
| 721 | |
| 722 | |
| 723 | |
| 724 | |
| 725 | <li class="md-nav__item"> |
| 726 | <a href="../../architecture/overview/" class="md-nav__link"> |
| 727 | |
| 728 | |
| 729 | |
| 730 | <span class="md-ellipsis"> |
| 731 | |
| 732 | |
| 733 | Overview |
| 734 | |
| 735 | |
| 736 | |
| 737 | </span> |
| 738 | |
| 739 | |
| 740 | |
| 741 | </a> |
| 742 | </li> |
| 743 | |
| 744 | |
| 745 | |
| 746 | |
| 747 | |
| 748 | |
| 749 | |
| 750 | |
| 751 | |
| 752 | |
| 753 | <li class="md-nav__item"> |
| 754 | <a href="../../architecture/sync-bridge/" class="md-nav__link"> |
| 755 | |
| 756 | |
| 757 | |
| 758 | <span class="md-ellipsis"> |
| 759 | |
| 760 | |
| 761 | Sync Bridge |
| 762 | |
| 763 | |
| 764 | |
| 765 | </span> |
| 766 | |
| 767 | |
| 768 | |
| 769 | </a> |
| 770 | </li> |
| 771 | |
| 772 | |
| 773 | |
| 774 | |
| 775 | </ul> |
| 776 | </nav> |
| 777 | |
| 778 | </li> |
| 779 | |
| 780 | |
| 781 | |
| 782 | </ul> |
| 783 | </nav> |
| 784 | </div> |
| 785 | </div> |
| 786 | </div> |
| 787 | |
| 788 | |
| 789 | |
| 790 | <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > |
| 791 | <div class="md-sidebar__scrollwrap"> |
| 792 | <div class="md-sidebar__inner"> |
| 793 | |
| 794 | |
| 795 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> |
| 796 | |
| 797 | |
| 798 | |
| 799 | |
| 800 | |
| 801 | |
| 802 | <label class="md-nav__title" for="__toc"> |
| 803 | <span class="md-nav__icon md-icon"></span> |
| 804 | Table of contents |
| 805 | </label> |
| 806 | <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> |
| 807 | |
| 808 | <li class="md-nav__item"> |
| 809 | <a href="#clone-the-repository" class="md-nav__link"> |
| 810 | <span class="md-ellipsis"> |
| 811 | |
| 812 | Clone the Repository |
| 813 | |
| 814 | </span> |
| 815 | </a> |
| 816 | |
| 817 | </li> |
| 818 | |
| 819 | <li class="md-nav__item"> |
| 820 | <a href="#environment-configuration" class="md-nav__link"> |
| 821 | <span class="md-ellipsis"> |
| 822 | |
| 823 | Environment Configuration |
| 824 | |
| 825 | </span> |
| 826 | </a> |
| 827 | |
| 828 | </li> |
| 829 | |
| 830 | <li class="md-nav__item"> |
| 831 | <a href="#start-the-stack" class="md-nav__link"> |
| 832 | <span class="md-ellipsis"> |
| 833 | |
| 834 | Start the Stack |
| 835 | |
| 836 | </span> |
| 837 | </a> |
| 838 | |
| 839 | <nav class="md-nav" aria-label="Start the Stack"> |
| 840 | <ul class="md-nav__list"> |
| 841 | |
| 842 | <li class="md-nav__item"> |
| 843 | <a href="#development" class="md-nav__link"> |
| 844 | <span class="md-ellipsis"> |
| 845 | |
| 846 | Development |
| 847 | |
| 848 | </span> |
| 849 | </a> |
| 850 | |
| 851 | </li> |
| 852 | |
| 853 | <li class="md-nav__item"> |
| 854 | <a href="#production" class="md-nav__link"> |
| 855 | <span class="md-ellipsis"> |
| 856 | |
| 857 | Production |
| 858 | |
| 859 | </span> |
| 860 | </a> |
| 861 | |
| 862 | </li> |
| 863 | |
| 864 | </ul> |
| 865 | </nav> |
| 866 | |
| 867 | </li> |
| 868 | |
| 869 | <li class="md-nav__item"> |
| 870 | <a href="#verify-installation" class="md-nav__link"> |
| 871 | <span class="md-ellipsis"> |
| 872 | |
| 873 | Verify Installation |
| 874 | |
| 875 | </span> |
| 876 | </a> |
| 877 | |
| 878 | </li> |
| 879 | |
| 880 | <li class="md-nav__item"> |
| 881 | <a href="#common-issues" class="md-nav__link"> |
| 882 | <span class="md-ellipsis"> |
| 883 | |
| 884 | Common Issues |
| 885 | |
| 886 | </span> |
| 887 | </a> |
| 888 | |
| 889 | </li> |
| 890 | |
| 891 | </ul> |
| 892 | |
| 893 | </nav> |
| 894 | </div> |
| 895 | </div> |
| 896 | </div> |
| 897 | |
| 898 | |
| 899 | |
| 900 | <div class="md-content" data-md-component="content"> |
| 901 | |
| 902 | <article class="md-content__inner md-typeset"> |
| 903 | |
| 904 | |
| 905 | |
| 906 | |
| 907 | |
| 908 | |
| 909 | |
| 910 | |
| 911 | <h1 id="installation">Installation<a class="headerlink" href="#installation" title="Permanent link">¶</a></h1> |
| 912 | <h2 id="clone-the-repository">Clone the Repository<a class="headerlink" href="#clone-the-repository" title="Permanent link">¶</a></h2> |
| 913 | <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/ConflictHQ/fossilrepo.git |
| 914 | <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="nb">cd</span><span class="w"> </span>fossilrepo |
| 915 | </code></pre></div> |
| 916 | <h2 id="environment-configuration">Environment Configuration<a class="headerlink" href="#environment-configuration" title="Permanent link">¶</a></h2> |
| 917 | <p>Copy the example environment file and configure it:</p> |
| 918 | <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>cp<span class="w"> </span>.env.example<span class="w"> </span>.env |
| 919 | </code></pre></div> |
| 920 | <p>Edit <code>.env</code> with your settings:</p> |
| 921 | <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="c1"># Django</span> |
| 922 | <a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="na">SECRET_KEY</span><span class="o">=</span><span class="s">your-secret-key-here</span> |
| 923 | <a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="na">DEBUG</span><span class="o">=</span><span class="s">True</span> |
| 924 | <a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="na">ALLOWED_HOSTS</span><span class="o">=</span><span class="s">localhost,127.0.0.1</span> |
| 925 | <a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a> |
| 926 | <a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="c1"># Database</span> |
| 927 | <a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="na">POSTGRES_DB</span><span class="o">=</span><span class="s">fossilrepo</span> |
| 928 | <a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="na">POSTGRES_USER</span><span class="o">=</span><span class="s">fossilrepo</span> |
| 929 | <a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="na">POSTGRES_PASSWORD</span><span class="o">=</span><span class="s">your-db-password</span> |
| 930 | <a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a> |
| 931 | <a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a><span class="c1"># Redis</span> |
| 932 | <a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a><span class="na">REDIS_URL</span><span class="o">=</span><span class="s">redis://redis:6379/0</span> |
| 933 | <a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a> |
| 934 | <a id="__codelineno-2-14" name="__codelineno-2-14" href="#__codelineno-2-14"></a><span class="c1"># Fossil</span> |
| 935 | <a id="__codelineno-2-15" name="__codelineno-2-15" href="#__codelineno-2-15"></a><span class="na">FOSSIL_REPO_DIR</span><span class="o">=</span><span class="s">/data/repos</span> |
| 936 | <a id="__codelineno-2-16" name="__codelineno-2-16" href="#__codelineno-2-16"></a><span class="na">FOSSIL_BASE_URL</span><span class="o">=</span><span class="s">https://your-domain.com</span> |
| 937 | </code></pre></div> |
| 938 | <h2 id="start-the-stack">Start the Stack<a class="headerlink" href="#start-the-stack" title="Permanent link">¶</a></h2> |
| 939 | <h3 id="development">Development<a class="headerlink" href="#development" title="Permanent link">¶</a></h3> |
| 940 | <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="c1"># Build and start all services</span> |
| 941 | <a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>make<span class="w"> </span>build |
| 942 | <a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a> |
| 943 | <a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="c1"># Run database migrations</span> |
| 944 | <a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>make<span class="w"> </span>migrate |
| 945 | <a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a> |
| 946 | <a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="c1"># Create an admin user</span> |
| 947 | <a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a>make<span class="w"> </span>superuser |
| 948 | <a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a> |
| 949 | <a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a><span class="c1"># Load sample data (optional)</span> |
| 950 | <a id="__codelineno-3-11" name="__codelineno-3-11" href="#__codelineno-3-11"></a>make<span class="w"> </span>seed |
| 951 | </code></pre></div> |
| 952 | <p>The development stack includes:</p> |
| 953 | <ul> |
| 954 | <li>Django dev server on <code>http://localhost:8000</code></li> |
| 955 | <li>PostgreSQL 16</li> |
| 956 | <li>Redis</li> |
| 957 | <li>Celery worker + beat</li> |
| 958 | <li>Mailpit on <code>http://localhost:8025</code></li> |
| 959 | </ul> |
| 960 | <h3 id="production">Production<a class="headerlink" href="#production" title="Permanent link">¶</a></h3> |
| 961 | <p>For production, you'll also configure Caddy and Litestream:</p> |
| 962 | <div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="c1"># Copy production configs</span> |
| 963 | <a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>cp<span class="w"> </span>docker/Caddyfile.example<span class="w"> </span>docker/Caddyfile |
| 964 | <a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>cp<span class="w"> </span>docker/litestream.yml.example<span class="w"> </span>docker/litestream.yml |
| 965 | <a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a> |
| 966 | <a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="c1"># Edit with your domain and S3 credentials</span> |
| 967 | <a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a><span class="c1"># Then start with the production compose file</span> |
| 968 | <a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a>docker<span class="w"> </span>compose<span class="w"> </span>-f<span class="w"> </span>docker-compose.yml<span class="w"> </span>-f<span class="w"> </span>docker-compose.prod.yml<span class="w"> </span>up<span class="w"> </span>-d |
| 969 | </code></pre></div> |
| 970 | <h2 id="verify-installation">Verify Installation<a class="headerlink" href="#verify-installation" title="Permanent link">¶</a></h2> |
| 971 | <div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="c1"># Check all services are running</span> |
| 972 | <a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>docker<span class="w"> </span>compose<span class="w"> </span>ps |
| 973 | <a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a> |
| 974 | <a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="c1"># Hit the health endpoint</span> |
| 975 | <a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a>curl<span class="w"> </span>http://localhost:8000/health/ |
| 976 | <a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a> |
| 977 | <a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a><span class="c1"># Open the dashboard</span> |
| 978 | <a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a>open<span class="w"> </span>http://localhost:8000 |
| 979 | </code></pre></div> |
| 980 | <div class="admonition success"> |
| 981 | <p class="admonition-title">You should see</p> |
| 982 | <p>The fossilrepo dashboard with navigation, login page, and (after seeding) sample repositories.</p> |
| 983 | </div> |
| 984 | <h2 id="common-issues">Common Issues<a class="headerlink" href="#common-issues" title="Permanent link">¶</a></h2> |
| 985 | <details class="question"> |
| 986 | <summary>Port 8000 already in use</summary> |
| 987 | <p>Change the Django port mapping in <code>docker-compose.yml</code>: |
| 988 | <div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="nt">ports</span><span class="p">:</span> |
| 989 | <a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">"8001:8000"</span> |
| 990 | </code></pre></div></p> |
| 991 | </details> |
| 992 | <details class="question"> |
| 993 | <summary>Database connection refused</summary> |
| 994 | <p>Ensure PostgreSQL has started before Django: |
| 995 | <div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>docker<span class="w"> </span>compose<span class="w"> </span>logs<span class="w"> </span>postgres |
| 996 | </code></pre></div> |
| 997 | The Django container waits for Postgres to be ready, but network issues on some Docker Desktop versions can cause timeouts. Restart with <code>make down && make up</code>.</p> |
| 998 | </details> |
| 999 | <details class="question"> |
| 1000 | <summary>Permission denied on /data/repos</summary> |
| 1001 | <p>The Fossil repo directory needs to be writable by the container user: |
| 1002 | <div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a>sudo<span class="w"> </span>chown<span class="w"> </span>-R<span class="w"> </span><span class="m">1000</span>:1000<span class="w"> </span>/data/repos |
| 1003 | </code></pre></div></p> |
| 1004 | </details> |
| 1005 | |
| 1006 | |
| 1007 | |
| 1008 | |
| 1009 | |
| 1010 | |
| 1011 | |
| 1012 | |
| 1013 | |
| 1014 | |
| 1015 | |
| 1016 | |
| 1017 | |
| 1018 | </article> |
| 1019 | </div> |
| 1020 | |
| 1021 | |
| 1022 | <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> |
| 1023 | |
| 1024 | <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> |
| 1025 | </div> |
| 1026 | |
| 1027 | <button type="button" class="md-top md-icon" data-md-component="top" hidden> |
| 1028 | |
| 1029 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> |
| 1030 | Back to top |
| 1031 | </button> |
| 1032 | |
| 1033 | </main> |
| 1034 | |
| 1035 | <footer class="md-footer"> |
| 1036 | |
| 1037 | <div class="md-footer-meta md-typeset"> |
| 1038 | <div class="md-footer-meta__inner md-grid"> |
| 1039 | <div class="md-copyright"> |
| 1040 | |
| 1041 | <div class="md-copyright__highlight"> |
| 1042 | Copyright © 2026 CONFLICT LLC |
| 1043 | </div> |
| 1044 | |
| 1045 | |
| 1046 | Made with |
| 1047 | <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> |
| 1048 | Material for MkDocs |
| 1049 | </a> |
| 1050 | |
| 1051 | </div> |
| 1052 | |
| 1053 | |
| 1054 | <div class="md-social"> |
| 1055 | |
| 1056 | |
| 1057 | |
| 1058 | |
| 1059 | |
| 1060 | |
| 1061 | |
| 1062 | |
| 1063 | <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link"> |
| 1064 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 1065 | </a> |
| 1066 | |
| 1067 | </div> |
| 1068 | |
| 1069 | </div> |
| 1070 | </div> |
| 1071 | </footer> |
| 1072 | |
| 1073 | </div> |
| 1074 | <div class="md-dialog" data-md-component="dialog"> |
| 1075 | <div class="md-dialog__inner md-typeset"></div> |
| 1076 | </div> |
| 1077 | |
| 1078 | |
| 1079 | |
| 1080 | |
| 1081 | |
| 1082 | <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> |
| 1083 | |
| 1084 | |
| 1085 | <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script> |
| 1086 | |
| 1087 | |
| 1088 | </body> |
| 1089 | </html> |
| --- a/site/getting-started/prerequisites/index.html | ||
| +++ b/site/getting-started/prerequisites/index.html | ||
| @@ -0,0 +1,1108 @@ | ||
| 1 | + | |
| 2 | +<!doctype html> | |
| 3 | +<html lang="en" class="no-js"> | |
| 4 | + <head> | |
| 5 | + | |
| 6 | + <meta charset="utf-8"> | |
| 7 | + <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| 8 | + | |
| 9 | + <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting"> | |
| 10 | + | |
| 11 | + | |
| 12 | + <meta name="author" content="CONFLICT LLC"> | |
| 13 | + | |
| 14 | + | |
| 15 | + <link rel="canonical" href="https://fossilrepo.dev/getting-started/prerequisites/"> | |
| 16 | + | |
| 17 | + | |
| 18 | + <link rel="prev" href="../.."> | |
| 19 | + | |
| 20 | + | |
| 21 | + <link rel="next" href="../installation/"> | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + <link rel="icon" href="../../assets/images/favicon.png"> | |
| 28 | + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6"> | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + <title>Prerequisites - Fossilrepo</title> | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css"> | |
| 37 | + | |
| 38 | + | |
| 39 | + <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css"> | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | |
| 53 | + <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> | |
| 54 | + <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + <link rel="stylesheet" href="../../assets/css/custom.css"> | |
| 59 | + | |
| 60 | + <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + </head> | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"> | |
| 77 | + | |
| 78 | + | |
| 79 | + <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> | |
| 80 | + <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> | |
| 81 | + <label class="md-overlay" for="__drawer"></label> | |
| 82 | + <div data-md-component="skip"> | |
| 83 | + | |
| 84 | + | |
| 85 | + <a href="#prerequisites" class="md-skip"> | |
| 86 | + Skip to content | |
| 87 | + </a> | |
| 88 | + | |
| 89 | + </div> | |
| 90 | + <div data-md-component="announce"> | |
| 91 | + | |
| 92 | + </div> | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | +<header class="md-header" data-md-component="header"> | |
| 98 | + <nav class="md-header__inner md-grid" aria-label="Header"> | |
| 99 | + <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> | |
| 100 | + <div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 101 | + <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 102 | + <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 103 | +</div> | |
| 104 | + </a> | |
| 105 | + <label class="md-header__button md-icon" for="__drawer"> | |
| 106 | + | |
| 107 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> | |
| 108 | + </label> | |
| 109 | + <div class="md-header__title" data-md-component="header-title"> | |
| 110 | + <div class="md-header__ellipsis"> | |
| 111 | + <div class="md-header__topic"> | |
| 112 | + <span class="md-ellipsis"> | |
| 113 | + Fossilrepo | |
| 114 | + </span> | |
| 115 | + </div> | |
| 116 | + <div class="md-header__topic" data-md-component="header-topic"> | |
| 117 | + <span class="md-ellipsis"> | |
| 118 | + | |
| 119 | + Prerequisites | |
| 120 | + | |
| 121 | + </span> | |
| 122 | + </div> | |
| 123 | + </div> | |
| 124 | + </div> | |
| 125 | + | |
| 126 | + | |
| 127 | + <form class="md-header__option" data-md-component="palette"> | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> | |
| 133 | + | |
| 134 | + <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> | |
| 135 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> | |
| 136 | + </label> | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> | |
| 143 | + | |
| 144 | + <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> | |
| 145 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> | |
| 146 | + </label> | |
| 147 | + | |
| 148 | + | |
| 149 | +</form> | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + <label class="md-header__button md-icon" for="__search"> | |
| 160 | + | |
| 161 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> | |
| 162 | + </label> | |
| 163 | + <div class="md-search" data-md-component="search" role="dialog"> | |
| 164 | + <label class="md-search__overlay" for="__search"></label> | |
| 165 | + <div class="md-search__inner" role="search"> | |
| 166 | + <form class="md-search__form" name="search"> | |
| 167 | + <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> | |
| 168 | + <label class="md-search__icon md-icon" for="__search"> | |
| 169 | + | |
| 170 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> | |
| 171 | + | |
| 172 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> | |
| 173 | + </label> | |
| 174 | + <nav class="md-search__options" aria-label="Search"> | |
| 175 | + | |
| 176 | + <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> | |
| 177 | + | |
| 178 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> | |
| 179 | + </button> | |
| 180 | + </nav> | |
| 181 | + | |
| 182 | + <div class="md-search__suggest" data-md-component="search-suggest"></div> | |
| 183 | + | |
| 184 | + </form> | |
| 185 | + <div class="md-search__output"> | |
| 186 | + <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> | |
| 187 | + <div class="md-search-result" data-md-component="search-result"> | |
| 188 | + <div class="md-search-result__meta"> | |
| 189 | + Initializing search | |
| 190 | + </div> | |
| 191 | + <ol class="md-search-result__list" role="presentation"></ol> | |
| 192 | + </div> | |
| 193 | + </div> | |
| 194 | + </div> | |
| 195 | + </div> | |
| 196 | +</div> | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + <div class="md-header__source"> | |
| 201 | + <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> | |
| 202 | + <div class="md-source__icon md-icon"> | |
| 203 | + | |
| 204 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 205 | + </div> | |
| 206 | + <div class="md-source__repository"> | |
| 207 | + ConflictHQ/fossilrepo | |
| 208 | + </div> | |
| 209 | +</a> | |
| 210 | + </div> | |
| 211 | + | |
| 212 | + </nav> | |
| 213 | + | |
| 214 | +</header> | |
| 215 | + | |
| 216 | + <div class="md-container" data-md-component="container"> | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | +<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> | |
| 223 | + <div class="md-grid"> | |
| 224 | + <ul class="md-tabs__list"> | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + <li class="md-tabs__item"> | |
| 232 | + <a href="../.." class="md-tabs__link"> | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + Home | |
| 239 | + | |
| 240 | + </a> | |
| 241 | + </li> | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + <li class="md-tabs__item md-tabs__item--active"> | |
| 255 | + <a href="./" class="md-tabs__link"> | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + Getting Started | |
| 260 | + | |
| 261 | + </a> | |
| 262 | + </li> | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + <li class="md-tabs__item"> | |
| 275 | + <a href="../../architecture/overview/" class="md-tabs__link"> | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + Architecture | |
| 280 | + | |
| 281 | + </a> | |
| 282 | + </li> | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + </ul> | |
| 288 | + </div> | |
| 289 | +</nav> | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + <main class="md-main" data-md-component="main"> | |
| 294 | + <div class="md-main__inner md-grid"> | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > | |
| 299 | + <div class="md-sidebar__scrollwrap"> | |
| 300 | + <div class="md-sidebar__inner"> | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | +<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> | |
| 308 | + <label class="md-nav__title" for="__drawer"> | |
| 309 | + <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> | |
| 310 | + <div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 311 | + <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 312 | + <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 313 | +</div> | |
| 314 | + </a> | |
| 315 | + Fossilrepo | |
| 316 | + </label> | |
| 317 | + | |
| 318 | + <div class="md-nav__source"> | |
| 319 | + <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> | |
| 320 | + <div class="md-source__icon md-icon"> | |
| 321 | + | |
| 322 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 323 | + </div> | |
| 324 | + <div class="md-source__repository"> | |
| 325 | + ConflictHQ/fossilrepo | |
| 326 | + </div> | |
| 327 | +</a> | |
| 328 | + </div> | |
| 329 | + | |
| 330 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + <li class="md-nav__item"> | |
| 339 | + <a href="../.." class="md-nav__link"> | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + <span class="md-ellipsis"> | |
| 344 | + | |
| 345 | + | |
| 346 | + Home | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + </span> | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + </a> | |
| 355 | + </li> | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked> | |
| 385 | + | |
| 386 | + | |
| 387 | + <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex=""> | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + <span class="md-ellipsis"> | |
| 392 | + | |
| 393 | + | |
| 394 | + Getting Started | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + </span> | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + <span class="md-nav__icon md-icon"></span> | |
| 403 | + </label> | |
| 404 | + | |
| 405 | + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true"> | |
| 406 | + <label class="md-nav__title" for="__nav_2"> | |
| 407 | + <span class="md-nav__icon md-icon"></span> | |
| 408 | + | |
| 409 | + | |
| 410 | + Getting Started | |
| 411 | + | |
| 412 | + | |
| 413 | + </label> | |
| 414 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + <li class="md-nav__item md-nav__item--active"> | |
| 425 | + | |
| 426 | + <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + <label class="md-nav__link md-nav__link--active" for="__toc"> | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + <span class="md-ellipsis"> | |
| 437 | + | |
| 438 | + | |
| 439 | + Prerequisites | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + </span> | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + <span class="md-nav__icon md-icon"></span> | |
| 448 | + </label> | |
| 449 | + | |
| 450 | + <a href="./" class="md-nav__link md-nav__link--active"> | |
| 451 | + | |
| 452 | + | |
| 453 | + | |
| 454 | + <span class="md-ellipsis"> | |
| 455 | + | |
| 456 | + | |
| 457 | + Prerequisites | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + </span> | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + </a> | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + <label class="md-nav__title" for="__toc"> | |
| 477 | + <span class="md-nav__icon md-icon"></span> | |
| 478 | + Table of contents | |
| 479 | + </label> | |
| 480 | + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> | |
| 481 | + | |
| 482 | + <li class="md-nav__item"> | |
| 483 | + <a href="#system-requirements" class="md-nav__link"> | |
| 484 | + <span class="md-ellipsis"> | |
| 485 | + | |
| 486 | + System Requirements | |
| 487 | + | |
| 488 | + </span> | |
| 489 | + </a> | |
| 490 | + | |
| 491 | +</li> | |
| 492 | + | |
| 493 | + <li class="md-nav__item"> | |
| 494 | + <a href="#required-software" class="md-nav__link"> | |
| 495 | + <span class="md-ellipsis"> | |
| 496 | + | |
| 497 | + Required Software | |
| 498 | + | |
| 499 | + </span> | |
| 500 | + </a> | |
| 501 | + | |
| 502 | + <nav class="md-nav" aria-label="Required Software"> | |
| 503 | + <ul class="md-nav__list"> | |
| 504 | + | |
| 505 | + <li class="md-nav__item"> | |
| 506 | + <a href="#docker-docker-compose" class="md-nav__link"> | |
| 507 | + <span class="md-ellipsis"> | |
| 508 | + | |
| 509 | + Docker & Docker Compose | |
| 510 | + | |
| 511 | + </span> | |
| 512 | + </a> | |
| 513 | + | |
| 514 | +</li> | |
| 515 | + | |
| 516 | + <li class="md-nav__item"> | |
| 517 | + <a href="#git" class="md-nav__link"> | |
| 518 | + <span class="md-ellipsis"> | |
| 519 | + | |
| 520 | + Git | |
| 521 | + | |
| 522 | + </span> | |
| 523 | + </a> | |
| 524 | + | |
| 525 | +</li> | |
| 526 | + | |
| 527 | + <li class="md-nav__item"> | |
| 528 | + <a href="#make" class="md-nav__link"> | |
| 529 | + <span class="md-ellipsis"> | |
| 530 | + | |
| 531 | + Make | |
| 532 | + | |
| 533 | + </span> | |
| 534 | + </a> | |
| 535 | + | |
| 536 | +</li> | |
| 537 | + | |
| 538 | + </ul> | |
| 539 | + </nav> | |
| 540 | + | |
| 541 | +</li> | |
| 542 | + | |
| 543 | + <li class="md-nav__item"> | |
| 544 | + <a href="#optional-s3-compatible-storage" class="md-nav__link"> | |
| 545 | + <span class="md-ellipsis"> | |
| 546 | + | |
| 547 | + Optional: S3-Compatible Storage | |
| 548 | + | |
| 549 | + </span> | |
| 550 | + </a> | |
| 551 | + | |
| 552 | +</li> | |
| 553 | + | |
| 554 | + <li class="md-nav__item"> | |
| 555 | + <a href="#ports" class="md-nav__link"> | |
| 556 | + <span class="md-ellipsis"> | |
| 557 | + | |
| 558 | + Ports | |
| 559 | + | |
| 560 | + </span> | |
| 561 | + </a> | |
| 562 | + | |
| 563 | +</li> | |
| 564 | + | |
| 565 | + </ul> | |
| 566 | + | |
| 567 | +</nav> | |
| 568 | + | |
| 569 | + </li> | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + <li class="md-nav__item"> | |
| 581 | + <a href="../installation/" class="md-nav__link"> | |
| 582 | + | |
| 583 | + | |
| 584 | + | |
| 585 | + <span class="md-ellipsis"> | |
| 586 | + | |
| 587 | + | |
| 588 | + Installation | |
| 589 | + | |
| 590 | + | |
| 591 | + | |
| 592 | + </span> | |
| 593 | + | |
| 594 | + | |
| 595 | + | |
| 596 | + </a> | |
| 597 | + </li> | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + <li class="md-nav__item"> | |
| 609 | + <a href="../configuration/" class="md-nav__link"> | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
| 613 | + <span class="md-ellipsis"> | |
| 614 | + | |
| 615 | + | |
| 616 | + Configuration | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
| 620 | + </span> | |
| 621 | + | |
| 622 | + | |
| 623 | + | |
| 624 | + </a> | |
| 625 | + </li> | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + <li class="md-nav__item"> | |
| 637 | + <a href="../first-repo/" class="md-nav__link"> | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
| 641 | + <span class="md-ellipsis"> | |
| 642 | + | |
| 643 | + | |
| 644 | + First Repository | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + </span> | |
| 649 | + | |
| 650 | + | |
| 651 | + | |
| 652 | + </a> | |
| 653 | + </li> | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + </ul> | |
| 659 | + </nav> | |
| 660 | + | |
| 661 | + </li> | |
| 662 | + | |
| 663 | + | |
| 664 | + | |
| 665 | + | |
| 666 | + | |
| 667 | + | |
| 668 | + | |
| 669 | + | |
| 670 | + | |
| 671 | + | |
| 672 | + | |
| 673 | + | |
| 674 | + | |
| 675 | + | |
| 676 | + | |
| 677 | + | |
| 678 | + | |
| 679 | + | |
| 680 | + | |
| 681 | + <li class="md-nav__item md-nav__item--nested"> | |
| 682 | + | |
| 683 | + | |
| 684 | + | |
| 685 | + | |
| 686 | + | |
| 687 | + <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" > | |
| 688 | + | |
| 689 | + | |
| 690 | + <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> | |
| 691 | + | |
| 692 | + | |
| 693 | + | |
| 694 | + <span class="md-ellipsis"> | |
| 695 | + | |
| 696 | + | |
| 697 | + Architecture | |
| 698 | + | |
| 699 | + | |
| 700 | + | |
| 701 | + </span> | |
| 702 | + | |
| 703 | + | |
| 704 | + | |
| 705 | + <span class="md-nav__icon md-icon"></span> | |
| 706 | + </label> | |
| 707 | + | |
| 708 | + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> | |
| 709 | + <label class="md-nav__title" for="__nav_3"> | |
| 710 | + <span class="md-nav__icon md-icon"></span> | |
| 711 | + | |
| 712 | + | |
| 713 | + Architecture | |
| 714 | + | |
| 715 | + | |
| 716 | + </label> | |
| 717 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 718 | + | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
| 723 | + | |
| 724 | + | |
| 725 | + <li class="md-nav__item"> | |
| 726 | + <a href="../../architecture/overview/" class="md-nav__link"> | |
| 727 | + | |
| 728 | + | |
| 729 | + | |
| 730 | + <span class="md-ellipsis"> | |
| 731 | + | |
| 732 | + | |
| 733 | + Overview | |
| 734 | + | |
| 735 | + | |
| 736 | + | |
| 737 | + </span> | |
| 738 | + | |
| 739 | + | |
| 740 | + | |
| 741 | + </a> | |
| 742 | + </li> | |
| 743 | + | |
| 744 | + | |
| 745 | + | |
| 746 | + | |
| 747 | + | |
| 748 | + | |
| 749 | + | |
| 750 | + | |
| 751 | + | |
| 752 | + | |
| 753 | + <li class="md-nav__item"> | |
| 754 | + <a href="../../architecture/sync-bridge/" class="md-nav__link"> | |
| 755 | + | |
| 756 | + | |
| 757 | + | |
| 758 | + <span class="md-ellipsis"> | |
| 759 | + | |
| 760 | + | |
| 761 | + Sync Bridge | |
| 762 | + | |
| 763 | + | |
| 764 | + | |
| 765 | + </span> | |
| 766 | + | |
| 767 | + | |
| 768 | + | |
| 769 | + </a> | |
| 770 | + </li> | |
| 771 | + | |
| 772 | + | |
| 773 | + | |
| 774 | + | |
| 775 | + </ul> | |
| 776 | + </nav> | |
| 777 | + | |
| 778 | + </li> | |
| 779 | + | |
| 780 | + | |
| 781 | + | |
| 782 | + </ul> | |
| 783 | +</nav> | |
| 784 | + </div> | |
| 785 | + </div> | |
| 786 | + </div> | |
| 787 | + | |
| 788 | + | |
| 789 | + | |
| 790 | + <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > | |
| 791 | + <div class="md-sidebar__scrollwrap"> | |
| 792 | + <div class="md-sidebar__inner"> | |
| 793 | + | |
| 794 | + | |
| 795 | +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
| 796 | + | |
| 797 | + | |
| 798 | + | |
| 799 | + | |
| 800 | + | |
| 801 | + | |
| 802 | + <label class="md-nav__title" for="__toc"> | |
| 803 | + <span class="md-nav__icon md-icon"></span> | |
| 804 | + Table of contents | |
| 805 | + </label> | |
| 806 | + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> | |
| 807 | + | |
| 808 | + <li class="md-nav__item"> | |
| 809 | + <a href="#system-requirements" class="md-nav__link"> | |
| 810 | + <span class="md-ellipsis"> | |
| 811 | + | |
| 812 | + System Requirements | |
| 813 | + | |
| 814 | + </span> | |
| 815 | + </a> | |
| 816 | + | |
| 817 | +</li> | |
| 818 | + | |
| 819 | + <li class="md-nav__item"> | |
| 820 | + <a href="#required-software" class="md-nav__link"> | |
| 821 | + <span class="md-ellipsis"> | |
| 822 | + | |
| 823 | + Required Software | |
| 824 | + | |
| 825 | + </span> | |
| 826 | + </a> | |
| 827 | + | |
| 828 | + <nav class="md-nav" aria-label="Required Software"> | |
| 829 | + <ul class="md-nav__list"> | |
| 830 | + | |
| 831 | + <li class="md-nav__item"> | |
| 832 | + <a href="#docker-docker-compose" class="md-nav__link"> | |
| 833 | + <span class="md-ellipsis"> | |
| 834 | + | |
| 835 | + Docker & Docker Compose | |
| 836 | + | |
| 837 | + </span> | |
| 838 | + </a> | |
| 839 | + | |
| 840 | +</li> | |
| 841 | + | |
| 842 | + <li class="md-nav__item"> | |
| 843 | + <a href="#git" class="md-nav__link"> | |
| 844 | + <span class="md-ellipsis"> | |
| 845 | + | |
| 846 | + Git | |
| 847 | + | |
| 848 | + </span> | |
| 849 | + </a> | |
| 850 | + | |
| 851 | +</li> | |
| 852 | + | |
| 853 | + <li class="md-nav__item"> | |
| 854 | + <a href="#make" class="md-nav__link"> | |
| 855 | + <span class="md-ellipsis"> | |
| 856 | + | |
| 857 | + Make | |
| 858 | + | |
| 859 | + </span> | |
| 860 | + </a> | |
| 861 | + | |
| 862 | +</li> | |
| 863 | + | |
| 864 | + </ul> | |
| 865 | + </nav> | |
| 866 | + | |
| 867 | +</li> | |
| 868 | + | |
| 869 | + <li class="md-nav__item"> | |
| 870 | + <a href="#optional-s3-compatible-storage" class="md-nav__link"> | |
| 871 | + <span class="md-ellipsis"> | |
| 872 | + | |
| 873 | + Optional: S3-Compatible Storage | |
| 874 | + | |
| 875 | + </span> | |
| 876 | + </a> | |
| 877 | + | |
| 878 | +</li> | |
| 879 | + | |
| 880 | + <li class="md-nav__item"> | |
| 881 | + <a href="#ports" class="md-nav__link"> | |
| 882 | + <span class="md-ellipsis"> | |
| 883 | + | |
| 884 | + Ports | |
| 885 | + | |
| 886 | + </span> | |
| 887 | + </a> | |
| 888 | + | |
| 889 | +</li> | |
| 890 | + | |
| 891 | + </ul> | |
| 892 | + | |
| 893 | +</nav> | |
| 894 | + </div> | |
| 895 | + </div> | |
| 896 | + </div> | |
| 897 | + | |
| 898 | + | |
| 899 | + | |
| 900 | + <div class="md-content" data-md-component="content"> | |
| 901 | + | |
| 902 | + <article class="md-content__inner md-typeset"> | |
| 903 | + | |
| 904 | + | |
| 905 | + | |
| 906 | + | |
| 907 | + | |
| 908 | + | |
| 909 | + | |
| 910 | + | |
| 911 | +<h1 id="prerequisites">Prerequisites<a class="headerlink" href="#prerequisites" title="Permanent link">¶</a></h1> | |
| 912 | +<p>Before installing fossilrepo, ensure your server meets these requirements.</p> | |
| 913 | +<h2 id="system-requirements">System Requirements<a class="headerlink" href="#system-requirements" title="Permanent link">¶</a></h2> | |
| 914 | +<table> | |
| 915 | +<thead> | |
| 916 | +<tr> | |
| 917 | +<th>Requirement</th> | |
| 918 | +<th>Minimum</th> | |
| 919 | +</tr> | |
| 920 | +</thead> | |
| 921 | +<tbody> | |
| 922 | +<tr> | |
| 923 | +<td><strong>OS</strong></td> | |
| 924 | +<td>Linux (Ubuntu 22.04+, Debian 12+, RHEL 9+) or macOS 13+</td> | |
| 925 | +</tr> | |
| 926 | +<tr> | |
| 927 | +<td><strong>CPU</strong></td> | |
| 928 | +<td>1 vCPU</td> | |
| 929 | +</tr> | |
| 930 | +<tr> | |
| 931 | +<td><strong>RAM</strong></td> | |
| 932 | +<td>1 GB</td> | |
| 933 | +</tr> | |
| 934 | +<tr> | |
| 935 | +<td><strong>Disk</strong></td> | |
| 936 | +<td>10 GB (scales with repo count)</td> | |
| 937 | +</tr> | |
| 938 | +<tr> | |
| 939 | +<td><strong>Python</strong></td> | |
| 940 | +<td>3.12+</td> | |
| 941 | +</tr> | |
| 942 | +</tbody> | |
| 943 | +</table> | |
| 944 | +<h2 id="required-software">Required Software<a class="headerlink" href="#required-software" title="Permanent link">¶</a></h2> | |
| 945 | +<h3 id="docker-docker-compose">Docker & Docker Compose<a class="headerlink" href="#docker-docker-compose" title="Permanent link">¶</a></h3> | |
| 946 | +<p>Fossilrepo runs its infrastructure stack via Docker Compose.</p> | |
| 947 | +<div class="tabbed-set tabbed-alternate" data-tabs="1:2"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Ubuntu/Debian</label><label for="__tabbed_1_2">macOS</label></div> | |
| 948 | +<div class="tabbed-content"> | |
| 949 | +<div class="tabbed-block"> | |
| 950 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># Install Docker</span> | |
| 951 | +<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>curl<span class="w"> </span>-fsSL<span class="w"> </span>https://get.docker.com<span class="w"> </span><span class="p">|</span><span class="w"> </span>sh | |
| 952 | +<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>sudo<span class="w"> </span>usermod<span class="w"> </span>-aG<span class="w"> </span>docker<span class="w"> </span><span class="nv">$USER</span> | |
| 953 | +<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> | |
| 954 | +<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="c1"># Verify</span> | |
| 955 | +<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a>docker<span class="w"> </span>compose<span class="w"> </span>version | |
| 956 | +</code></pre></div> | |
| 957 | +</div> | |
| 958 | +<div class="tabbed-block"> | |
| 959 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="c1"># Install Docker Desktop</span> | |
| 960 | +<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>brew<span class="w"> </span>install<span class="w"> </span>--cask<span class="w"> </span>docker | |
| 961 | +<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a> | |
| 962 | +<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="c1"># Verify</span> | |
| 963 | +<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a>docker<span class="w"> </span>compose<span class="w"> </span>version | |
| 964 | +</code></pre></div> | |
| 965 | +</div> | |
| 966 | +</div> | |
| 967 | +</div> | |
| 968 | +<h3 id="git">Git<a class="headerlink" href="#git" title="Permanent link">¶</a></h3> | |
| 969 | +<p>Required for the sync bridge (mirroring to GitHub/GitLab).</p> | |
| 970 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>git<span class="w"> </span>--version<span class="w"> </span><span class="c1"># 2.30+</span> | |
| 971 | +</code></pre></div> | |
| 972 | +<h3 id="make">Make<a class="headerlink" href="#make" title="Permanent link">¶</a></h3> | |
| 973 | +<p>Used for running common commands.</p> | |
| 974 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>make<span class="w"> </span>--version | |
| 975 | +</code></pre></div> | |
| 976 | +<h2 id="optional-s3-compatible-storage">Optional: S3-Compatible Storage<a class="headerlink" href="#optional-s3-compatible-storage" title="Permanent link">¶</a></h2> | |
| 977 | +<p>For continuous backups via Litestream, you need an S3-compatible bucket:</p> | |
| 978 | +<ul> | |
| 979 | +<li><strong>AWS S3</strong></li> | |
| 980 | +<li><strong>MinIO</strong> (self-hosted)</li> | |
| 981 | +<li><strong>Backblaze B2</strong></li> | |
| 982 | +<li><strong>DigitalOcean Spaces</strong></li> | |
| 983 | +</ul> | |
| 984 | +<div class="admonition info"> | |
| 985 | +<p class="admonition-title">Local development</p> | |
| 986 | +<p>S3 is not required for local development. Litestream is disabled by default in the dev Docker Compose configuration.</p> | |
| 987 | +</div> | |
| 988 | +<h2 id="ports">Ports<a class="headerlink" href="#ports" title="Permanent link">¶</a></h2> | |
| 989 | +<p>The following ports are used by the stack:</p> | |
| 990 | +<table> | |
| 991 | +<thead> | |
| 992 | +<tr> | |
| 993 | +<th>Port</th> | |
| 994 | +<th>Service</th> | |
| 995 | +</tr> | |
| 996 | +</thead> | |
| 997 | +<tbody> | |
| 998 | +<tr> | |
| 999 | +<td><code>8000</code></td> | |
| 1000 | +<td>Django (management UI)</td> | |
| 1001 | +</tr> | |
| 1002 | +<tr> | |
| 1003 | +<td><code>443</code></td> | |
| 1004 | +<td>Caddy (HTTPS, production)</td> | |
| 1005 | +</tr> | |
| 1006 | +<tr> | |
| 1007 | +<td><code>80</code></td> | |
| 1008 | +<td>Caddy (HTTP redirect, production)</td> | |
| 1009 | +</tr> | |
| 1010 | +<tr> | |
| 1011 | +<td><code>5432</code></td> | |
| 1012 | +<td>PostgreSQL</td> | |
| 1013 | +</tr> | |
| 1014 | +<tr> | |
| 1015 | +<td><code>6379</code></td> | |
| 1016 | +<td>Redis</td> | |
| 1017 | +</tr> | |
| 1018 | +<tr> | |
| 1019 | +<td><code>8025</code></td> | |
| 1020 | +<td>Mailpit (dev only)</td> | |
| 1021 | +</tr> | |
| 1022 | +</tbody> | |
| 1023 | +</table> | |
| 1024 | + | |
| 1025 | + | |
| 1026 | + | |
| 1027 | + | |
| 1028 | + | |
| 1029 | + | |
| 1030 | + | |
| 1031 | + | |
| 1032 | + | |
| 1033 | + | |
| 1034 | + | |
| 1035 | + | |
| 1036 | + | |
| 1037 | + </article> | |
| 1038 | + </div> | |
| 1039 | + | |
| 1040 | + | |
| 1041 | + <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> | |
| 1042 | + | |
| 1043 | +<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> | |
| 1044 | + </div> | |
| 1045 | + | |
| 1046 | + <button type="button" class="md-top md-icon" data-md-component="top" hidden> | |
| 1047 | + | |
| 1048 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> | |
| 1049 | + Back to top | |
| 1050 | +</button> | |
| 1051 | + | |
| 1052 | + </main> | |
| 1053 | + | |
| 1054 | + <footer class="md-footer"> | |
| 1055 | + | |
| 1056 | + <div class="md-footer-meta md-typeset"> | |
| 1057 | + <div class="md-footer-meta__inner md-grid"> | |
| 1058 | + <div class="md-copyright"> | |
| 1059 | + | |
| 1060 | + <div class="md-copyright__highlight"> | |
| 1061 | + Copyright © 2026 CONFLICT LLC | |
| 1062 | + </div> | |
| 1063 | + | |
| 1064 | + | |
| 1065 | + Made with | |
| 1066 | + <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> | |
| 1067 | + Material for MkDocs | |
| 1068 | + </a> | |
| 1069 | + | |
| 1070 | +</div> | |
| 1071 | + | |
| 1072 | + | |
| 1073 | +<div class="md-social"> | |
| 1074 | + | |
| 1075 | + | |
| 1076 | + | |
| 1077 | + | |
| 1078 | + | |
| 1079 | + | |
| 1080 | + | |
| 1081 | + | |
| 1082 | + <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link"> | |
| 1083 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 1084 | + </a> | |
| 1085 | + | |
| 1086 | +</div> | |
| 1087 | + | |
| 1088 | + </div> | |
| 1089 | + </div> | |
| 1090 | +</footer> | |
| 1091 | + | |
| 1092 | + </div> | |
| 1093 | + <div class="md-dialog" data-md-component="dialog"> | |
| 1094 | + <div class="md-dialog__inner md-typeset"></div> | |
| 1095 | + </div> | |
| 1096 | + | |
| 1097 | + | |
| 1098 | + | |
| 1099 | + | |
| 1100 | + | |
| 1101 | + <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> | |
| 1102 | + | |
| 1103 | + | |
| 1104 | + <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script> | |
| 1105 | + | |
| 1106 | + | |
| 1107 | + </body> | |
| 1108 | +</html> |
| --- a/site/getting-started/prerequisites/index.html | |
| +++ b/site/getting-started/prerequisites/index.html | |
| @@ -0,0 +1,1108 @@ | |
| --- a/site/getting-started/prerequisites/index.html | |
| +++ b/site/getting-started/prerequisites/index.html | |
| @@ -0,0 +1,1108 @@ | |
| 1 | |
| 2 | <!doctype html> |
| 3 | <html lang="en" class="no-js"> |
| 4 | <head> |
| 5 | |
| 6 | <meta charset="utf-8"> |
| 7 | <meta name="viewport" content="width=device-width,initial-scale=1"> |
| 8 | |
| 9 | <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting"> |
| 10 | |
| 11 | |
| 12 | <meta name="author" content="CONFLICT LLC"> |
| 13 | |
| 14 | |
| 15 | <link rel="canonical" href="https://fossilrepo.dev/getting-started/prerequisites/"> |
| 16 | |
| 17 | |
| 18 | <link rel="prev" href="../.."> |
| 19 | |
| 20 | |
| 21 | <link rel="next" href="../installation/"> |
| 22 | |
| 23 | |
| 24 | |
| 25 | |
| 26 | |
| 27 | <link rel="icon" href="../../assets/images/favicon.png"> |
| 28 | <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6"> |
| 29 | |
| 30 | |
| 31 | |
| 32 | <title>Prerequisites - Fossilrepo</title> |
| 33 | |
| 34 | |
| 35 | |
| 36 | <link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css"> |
| 37 | |
| 38 | |
| 39 | <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css"> |
| 40 | |
| 41 | |
| 42 | |
| 43 | |
| 44 | |
| 45 | |
| 46 | |
| 47 | |
| 48 | |
| 49 | |
| 50 | |
| 51 | |
| 52 | <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
| 53 | <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> |
| 54 | <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> |
| 55 | |
| 56 | |
| 57 | |
| 58 | <link rel="stylesheet" href="../../assets/css/custom.css"> |
| 59 | |
| 60 | <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> |
| 61 | |
| 62 | |
| 63 | |
| 64 | |
| 65 | |
| 66 | </head> |
| 67 | |
| 68 | |
| 69 | |
| 70 | |
| 71 | |
| 72 | |
| 73 | |
| 74 | |
| 75 | |
| 76 | <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"> |
| 77 | |
| 78 | |
| 79 | <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> |
| 80 | <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> |
| 81 | <label class="md-overlay" for="__drawer"></label> |
| 82 | <div data-md-component="skip"> |
| 83 | |
| 84 | |
| 85 | <a href="#prerequisites" class="md-skip"> |
| 86 | Skip to content |
| 87 | </a> |
| 88 | |
| 89 | </div> |
| 90 | <div data-md-component="announce"> |
| 91 | |
| 92 | </div> |
| 93 | |
| 94 | |
| 95 | |
| 96 | |
| 97 | <header class="md-header" data-md-component="header"> |
| 98 | <nav class="md-header__inner md-grid" aria-label="Header"> |
| 99 | <a href="../.." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> |
| 100 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 101 | <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 102 | <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 103 | </div> |
| 104 | </a> |
| 105 | <label class="md-header__button md-icon" for="__drawer"> |
| 106 | |
| 107 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> |
| 108 | </label> |
| 109 | <div class="md-header__title" data-md-component="header-title"> |
| 110 | <div class="md-header__ellipsis"> |
| 111 | <div class="md-header__topic"> |
| 112 | <span class="md-ellipsis"> |
| 113 | Fossilrepo |
| 114 | </span> |
| 115 | </div> |
| 116 | <div class="md-header__topic" data-md-component="header-topic"> |
| 117 | <span class="md-ellipsis"> |
| 118 | |
| 119 | Prerequisites |
| 120 | |
| 121 | </span> |
| 122 | </div> |
| 123 | </div> |
| 124 | </div> |
| 125 | |
| 126 | |
| 127 | <form class="md-header__option" data-md-component="palette"> |
| 128 | |
| 129 | |
| 130 | |
| 131 | |
| 132 | <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> |
| 133 | |
| 134 | <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> |
| 135 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> |
| 136 | </label> |
| 137 | |
| 138 | |
| 139 | |
| 140 | |
| 141 | |
| 142 | <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> |
| 143 | |
| 144 | <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> |
| 145 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> |
| 146 | </label> |
| 147 | |
| 148 | |
| 149 | </form> |
| 150 | |
| 151 | |
| 152 | |
| 153 | <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> |
| 154 | |
| 155 | |
| 156 | |
| 157 | |
| 158 | |
| 159 | <label class="md-header__button md-icon" for="__search"> |
| 160 | |
| 161 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> |
| 162 | </label> |
| 163 | <div class="md-search" data-md-component="search" role="dialog"> |
| 164 | <label class="md-search__overlay" for="__search"></label> |
| 165 | <div class="md-search__inner" role="search"> |
| 166 | <form class="md-search__form" name="search"> |
| 167 | <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> |
| 168 | <label class="md-search__icon md-icon" for="__search"> |
| 169 | |
| 170 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> |
| 171 | |
| 172 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> |
| 173 | </label> |
| 174 | <nav class="md-search__options" aria-label="Search"> |
| 175 | |
| 176 | <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> |
| 177 | |
| 178 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> |
| 179 | </button> |
| 180 | </nav> |
| 181 | |
| 182 | <div class="md-search__suggest" data-md-component="search-suggest"></div> |
| 183 | |
| 184 | </form> |
| 185 | <div class="md-search__output"> |
| 186 | <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> |
| 187 | <div class="md-search-result" data-md-component="search-result"> |
| 188 | <div class="md-search-result__meta"> |
| 189 | Initializing search |
| 190 | </div> |
| 191 | <ol class="md-search-result__list" role="presentation"></ol> |
| 192 | </div> |
| 193 | </div> |
| 194 | </div> |
| 195 | </div> |
| 196 | </div> |
| 197 | |
| 198 | |
| 199 | |
| 200 | <div class="md-header__source"> |
| 201 | <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> |
| 202 | <div class="md-source__icon md-icon"> |
| 203 | |
| 204 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 205 | </div> |
| 206 | <div class="md-source__repository"> |
| 207 | ConflictHQ/fossilrepo |
| 208 | </div> |
| 209 | </a> |
| 210 | </div> |
| 211 | |
| 212 | </nav> |
| 213 | |
| 214 | </header> |
| 215 | |
| 216 | <div class="md-container" data-md-component="container"> |
| 217 | |
| 218 | |
| 219 | |
| 220 | |
| 221 | |
| 222 | <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> |
| 223 | <div class="md-grid"> |
| 224 | <ul class="md-tabs__list"> |
| 225 | |
| 226 | |
| 227 | |
| 228 | |
| 229 | |
| 230 | |
| 231 | <li class="md-tabs__item"> |
| 232 | <a href="../.." class="md-tabs__link"> |
| 233 | |
| 234 | |
| 235 | |
| 236 | |
| 237 | |
| 238 | Home |
| 239 | |
| 240 | </a> |
| 241 | </li> |
| 242 | |
| 243 | |
| 244 | |
| 245 | |
| 246 | |
| 247 | |
| 248 | |
| 249 | |
| 250 | |
| 251 | |
| 252 | |
| 253 | |
| 254 | <li class="md-tabs__item md-tabs__item--active"> |
| 255 | <a href="./" class="md-tabs__link"> |
| 256 | |
| 257 | |
| 258 | |
| 259 | Getting Started |
| 260 | |
| 261 | </a> |
| 262 | </li> |
| 263 | |
| 264 | |
| 265 | |
| 266 | |
| 267 | |
| 268 | |
| 269 | |
| 270 | |
| 271 | |
| 272 | |
| 273 | |
| 274 | <li class="md-tabs__item"> |
| 275 | <a href="../../architecture/overview/" class="md-tabs__link"> |
| 276 | |
| 277 | |
| 278 | |
| 279 | Architecture |
| 280 | |
| 281 | </a> |
| 282 | </li> |
| 283 | |
| 284 | |
| 285 | |
| 286 | |
| 287 | </ul> |
| 288 | </div> |
| 289 | </nav> |
| 290 | |
| 291 | |
| 292 | |
| 293 | <main class="md-main" data-md-component="main"> |
| 294 | <div class="md-main__inner md-grid"> |
| 295 | |
| 296 | |
| 297 | |
| 298 | <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > |
| 299 | <div class="md-sidebar__scrollwrap"> |
| 300 | <div class="md-sidebar__inner"> |
| 301 | |
| 302 | |
| 303 | |
| 304 | |
| 305 | |
| 306 | |
| 307 | <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> |
| 308 | <label class="md-nav__title" for="__drawer"> |
| 309 | <a href="../.." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> |
| 310 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 311 | <img src="../../assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 312 | <img src="../../assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 313 | </div> |
| 314 | </a> |
| 315 | Fossilrepo |
| 316 | </label> |
| 317 | |
| 318 | <div class="md-nav__source"> |
| 319 | <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> |
| 320 | <div class="md-source__icon md-icon"> |
| 321 | |
| 322 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 323 | </div> |
| 324 | <div class="md-source__repository"> |
| 325 | ConflictHQ/fossilrepo |
| 326 | </div> |
| 327 | </a> |
| 328 | </div> |
| 329 | |
| 330 | <ul class="md-nav__list" data-md-scrollfix> |
| 331 | |
| 332 | |
| 333 | |
| 334 | |
| 335 | |
| 336 | |
| 337 | |
| 338 | <li class="md-nav__item"> |
| 339 | <a href="../.." class="md-nav__link"> |
| 340 | |
| 341 | |
| 342 | |
| 343 | <span class="md-ellipsis"> |
| 344 | |
| 345 | |
| 346 | Home |
| 347 | |
| 348 | |
| 349 | |
| 350 | </span> |
| 351 | |
| 352 | |
| 353 | |
| 354 | </a> |
| 355 | </li> |
| 356 | |
| 357 | |
| 358 | |
| 359 | |
| 360 | |
| 361 | |
| 362 | |
| 363 | |
| 364 | |
| 365 | |
| 366 | |
| 367 | |
| 368 | |
| 369 | |
| 370 | |
| 371 | |
| 372 | |
| 373 | |
| 374 | |
| 375 | |
| 376 | |
| 377 | |
| 378 | |
| 379 | |
| 380 | <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> |
| 381 | |
| 382 | |
| 383 | |
| 384 | <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked> |
| 385 | |
| 386 | |
| 387 | <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex=""> |
| 388 | |
| 389 | |
| 390 | |
| 391 | <span class="md-ellipsis"> |
| 392 | |
| 393 | |
| 394 | Getting Started |
| 395 | |
| 396 | |
| 397 | |
| 398 | </span> |
| 399 | |
| 400 | |
| 401 | |
| 402 | <span class="md-nav__icon md-icon"></span> |
| 403 | </label> |
| 404 | |
| 405 | <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true"> |
| 406 | <label class="md-nav__title" for="__nav_2"> |
| 407 | <span class="md-nav__icon md-icon"></span> |
| 408 | |
| 409 | |
| 410 | Getting Started |
| 411 | |
| 412 | |
| 413 | </label> |
| 414 | <ul class="md-nav__list" data-md-scrollfix> |
| 415 | |
| 416 | |
| 417 | |
| 418 | |
| 419 | |
| 420 | |
| 421 | |
| 422 | |
| 423 | |
| 424 | <li class="md-nav__item md-nav__item--active"> |
| 425 | |
| 426 | <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> |
| 427 | |
| 428 | |
| 429 | |
| 430 | |
| 431 | |
| 432 | <label class="md-nav__link md-nav__link--active" for="__toc"> |
| 433 | |
| 434 | |
| 435 | |
| 436 | <span class="md-ellipsis"> |
| 437 | |
| 438 | |
| 439 | Prerequisites |
| 440 | |
| 441 | |
| 442 | |
| 443 | </span> |
| 444 | |
| 445 | |
| 446 | |
| 447 | <span class="md-nav__icon md-icon"></span> |
| 448 | </label> |
| 449 | |
| 450 | <a href="./" class="md-nav__link md-nav__link--active"> |
| 451 | |
| 452 | |
| 453 | |
| 454 | <span class="md-ellipsis"> |
| 455 | |
| 456 | |
| 457 | Prerequisites |
| 458 | |
| 459 | |
| 460 | |
| 461 | </span> |
| 462 | |
| 463 | |
| 464 | |
| 465 | </a> |
| 466 | |
| 467 | |
| 468 | |
| 469 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> |
| 470 | |
| 471 | |
| 472 | |
| 473 | |
| 474 | |
| 475 | |
| 476 | <label class="md-nav__title" for="__toc"> |
| 477 | <span class="md-nav__icon md-icon"></span> |
| 478 | Table of contents |
| 479 | </label> |
| 480 | <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> |
| 481 | |
| 482 | <li class="md-nav__item"> |
| 483 | <a href="#system-requirements" class="md-nav__link"> |
| 484 | <span class="md-ellipsis"> |
| 485 | |
| 486 | System Requirements |
| 487 | |
| 488 | </span> |
| 489 | </a> |
| 490 | |
| 491 | </li> |
| 492 | |
| 493 | <li class="md-nav__item"> |
| 494 | <a href="#required-software" class="md-nav__link"> |
| 495 | <span class="md-ellipsis"> |
| 496 | |
| 497 | Required Software |
| 498 | |
| 499 | </span> |
| 500 | </a> |
| 501 | |
| 502 | <nav class="md-nav" aria-label="Required Software"> |
| 503 | <ul class="md-nav__list"> |
| 504 | |
| 505 | <li class="md-nav__item"> |
| 506 | <a href="#docker-docker-compose" class="md-nav__link"> |
| 507 | <span class="md-ellipsis"> |
| 508 | |
| 509 | Docker & Docker Compose |
| 510 | |
| 511 | </span> |
| 512 | </a> |
| 513 | |
| 514 | </li> |
| 515 | |
| 516 | <li class="md-nav__item"> |
| 517 | <a href="#git" class="md-nav__link"> |
| 518 | <span class="md-ellipsis"> |
| 519 | |
| 520 | Git |
| 521 | |
| 522 | </span> |
| 523 | </a> |
| 524 | |
| 525 | </li> |
| 526 | |
| 527 | <li class="md-nav__item"> |
| 528 | <a href="#make" class="md-nav__link"> |
| 529 | <span class="md-ellipsis"> |
| 530 | |
| 531 | Make |
| 532 | |
| 533 | </span> |
| 534 | </a> |
| 535 | |
| 536 | </li> |
| 537 | |
| 538 | </ul> |
| 539 | </nav> |
| 540 | |
| 541 | </li> |
| 542 | |
| 543 | <li class="md-nav__item"> |
| 544 | <a href="#optional-s3-compatible-storage" class="md-nav__link"> |
| 545 | <span class="md-ellipsis"> |
| 546 | |
| 547 | Optional: S3-Compatible Storage |
| 548 | |
| 549 | </span> |
| 550 | </a> |
| 551 | |
| 552 | </li> |
| 553 | |
| 554 | <li class="md-nav__item"> |
| 555 | <a href="#ports" class="md-nav__link"> |
| 556 | <span class="md-ellipsis"> |
| 557 | |
| 558 | Ports |
| 559 | |
| 560 | </span> |
| 561 | </a> |
| 562 | |
| 563 | </li> |
| 564 | |
| 565 | </ul> |
| 566 | |
| 567 | </nav> |
| 568 | |
| 569 | </li> |
| 570 | |
| 571 | |
| 572 | |
| 573 | |
| 574 | |
| 575 | |
| 576 | |
| 577 | |
| 578 | |
| 579 | |
| 580 | <li class="md-nav__item"> |
| 581 | <a href="../installation/" class="md-nav__link"> |
| 582 | |
| 583 | |
| 584 | |
| 585 | <span class="md-ellipsis"> |
| 586 | |
| 587 | |
| 588 | Installation |
| 589 | |
| 590 | |
| 591 | |
| 592 | </span> |
| 593 | |
| 594 | |
| 595 | |
| 596 | </a> |
| 597 | </li> |
| 598 | |
| 599 | |
| 600 | |
| 601 | |
| 602 | |
| 603 | |
| 604 | |
| 605 | |
| 606 | |
| 607 | |
| 608 | <li class="md-nav__item"> |
| 609 | <a href="../configuration/" class="md-nav__link"> |
| 610 | |
| 611 | |
| 612 | |
| 613 | <span class="md-ellipsis"> |
| 614 | |
| 615 | |
| 616 | Configuration |
| 617 | |
| 618 | |
| 619 | |
| 620 | </span> |
| 621 | |
| 622 | |
| 623 | |
| 624 | </a> |
| 625 | </li> |
| 626 | |
| 627 | |
| 628 | |
| 629 | |
| 630 | |
| 631 | |
| 632 | |
| 633 | |
| 634 | |
| 635 | |
| 636 | <li class="md-nav__item"> |
| 637 | <a href="../first-repo/" class="md-nav__link"> |
| 638 | |
| 639 | |
| 640 | |
| 641 | <span class="md-ellipsis"> |
| 642 | |
| 643 | |
| 644 | First Repository |
| 645 | |
| 646 | |
| 647 | |
| 648 | </span> |
| 649 | |
| 650 | |
| 651 | |
| 652 | </a> |
| 653 | </li> |
| 654 | |
| 655 | |
| 656 | |
| 657 | |
| 658 | </ul> |
| 659 | </nav> |
| 660 | |
| 661 | </li> |
| 662 | |
| 663 | |
| 664 | |
| 665 | |
| 666 | |
| 667 | |
| 668 | |
| 669 | |
| 670 | |
| 671 | |
| 672 | |
| 673 | |
| 674 | |
| 675 | |
| 676 | |
| 677 | |
| 678 | |
| 679 | |
| 680 | |
| 681 | <li class="md-nav__item md-nav__item--nested"> |
| 682 | |
| 683 | |
| 684 | |
| 685 | |
| 686 | |
| 687 | <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" > |
| 688 | |
| 689 | |
| 690 | <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> |
| 691 | |
| 692 | |
| 693 | |
| 694 | <span class="md-ellipsis"> |
| 695 | |
| 696 | |
| 697 | Architecture |
| 698 | |
| 699 | |
| 700 | |
| 701 | </span> |
| 702 | |
| 703 | |
| 704 | |
| 705 | <span class="md-nav__icon md-icon"></span> |
| 706 | </label> |
| 707 | |
| 708 | <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> |
| 709 | <label class="md-nav__title" for="__nav_3"> |
| 710 | <span class="md-nav__icon md-icon"></span> |
| 711 | |
| 712 | |
| 713 | Architecture |
| 714 | |
| 715 | |
| 716 | </label> |
| 717 | <ul class="md-nav__list" data-md-scrollfix> |
| 718 | |
| 719 | |
| 720 | |
| 721 | |
| 722 | |
| 723 | |
| 724 | |
| 725 | <li class="md-nav__item"> |
| 726 | <a href="../../architecture/overview/" class="md-nav__link"> |
| 727 | |
| 728 | |
| 729 | |
| 730 | <span class="md-ellipsis"> |
| 731 | |
| 732 | |
| 733 | Overview |
| 734 | |
| 735 | |
| 736 | |
| 737 | </span> |
| 738 | |
| 739 | |
| 740 | |
| 741 | </a> |
| 742 | </li> |
| 743 | |
| 744 | |
| 745 | |
| 746 | |
| 747 | |
| 748 | |
| 749 | |
| 750 | |
| 751 | |
| 752 | |
| 753 | <li class="md-nav__item"> |
| 754 | <a href="../../architecture/sync-bridge/" class="md-nav__link"> |
| 755 | |
| 756 | |
| 757 | |
| 758 | <span class="md-ellipsis"> |
| 759 | |
| 760 | |
| 761 | Sync Bridge |
| 762 | |
| 763 | |
| 764 | |
| 765 | </span> |
| 766 | |
| 767 | |
| 768 | |
| 769 | </a> |
| 770 | </li> |
| 771 | |
| 772 | |
| 773 | |
| 774 | |
| 775 | </ul> |
| 776 | </nav> |
| 777 | |
| 778 | </li> |
| 779 | |
| 780 | |
| 781 | |
| 782 | </ul> |
| 783 | </nav> |
| 784 | </div> |
| 785 | </div> |
| 786 | </div> |
| 787 | |
| 788 | |
| 789 | |
| 790 | <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > |
| 791 | <div class="md-sidebar__scrollwrap"> |
| 792 | <div class="md-sidebar__inner"> |
| 793 | |
| 794 | |
| 795 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> |
| 796 | |
| 797 | |
| 798 | |
| 799 | |
| 800 | |
| 801 | |
| 802 | <label class="md-nav__title" for="__toc"> |
| 803 | <span class="md-nav__icon md-icon"></span> |
| 804 | Table of contents |
| 805 | </label> |
| 806 | <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> |
| 807 | |
| 808 | <li class="md-nav__item"> |
| 809 | <a href="#system-requirements" class="md-nav__link"> |
| 810 | <span class="md-ellipsis"> |
| 811 | |
| 812 | System Requirements |
| 813 | |
| 814 | </span> |
| 815 | </a> |
| 816 | |
| 817 | </li> |
| 818 | |
| 819 | <li class="md-nav__item"> |
| 820 | <a href="#required-software" class="md-nav__link"> |
| 821 | <span class="md-ellipsis"> |
| 822 | |
| 823 | Required Software |
| 824 | |
| 825 | </span> |
| 826 | </a> |
| 827 | |
| 828 | <nav class="md-nav" aria-label="Required Software"> |
| 829 | <ul class="md-nav__list"> |
| 830 | |
| 831 | <li class="md-nav__item"> |
| 832 | <a href="#docker-docker-compose" class="md-nav__link"> |
| 833 | <span class="md-ellipsis"> |
| 834 | |
| 835 | Docker & Docker Compose |
| 836 | |
| 837 | </span> |
| 838 | </a> |
| 839 | |
| 840 | </li> |
| 841 | |
| 842 | <li class="md-nav__item"> |
| 843 | <a href="#git" class="md-nav__link"> |
| 844 | <span class="md-ellipsis"> |
| 845 | |
| 846 | Git |
| 847 | |
| 848 | </span> |
| 849 | </a> |
| 850 | |
| 851 | </li> |
| 852 | |
| 853 | <li class="md-nav__item"> |
| 854 | <a href="#make" class="md-nav__link"> |
| 855 | <span class="md-ellipsis"> |
| 856 | |
| 857 | Make |
| 858 | |
| 859 | </span> |
| 860 | </a> |
| 861 | |
| 862 | </li> |
| 863 | |
| 864 | </ul> |
| 865 | </nav> |
| 866 | |
| 867 | </li> |
| 868 | |
| 869 | <li class="md-nav__item"> |
| 870 | <a href="#optional-s3-compatible-storage" class="md-nav__link"> |
| 871 | <span class="md-ellipsis"> |
| 872 | |
| 873 | Optional: S3-Compatible Storage |
| 874 | |
| 875 | </span> |
| 876 | </a> |
| 877 | |
| 878 | </li> |
| 879 | |
| 880 | <li class="md-nav__item"> |
| 881 | <a href="#ports" class="md-nav__link"> |
| 882 | <span class="md-ellipsis"> |
| 883 | |
| 884 | Ports |
| 885 | |
| 886 | </span> |
| 887 | </a> |
| 888 | |
| 889 | </li> |
| 890 | |
| 891 | </ul> |
| 892 | |
| 893 | </nav> |
| 894 | </div> |
| 895 | </div> |
| 896 | </div> |
| 897 | |
| 898 | |
| 899 | |
| 900 | <div class="md-content" data-md-component="content"> |
| 901 | |
| 902 | <article class="md-content__inner md-typeset"> |
| 903 | |
| 904 | |
| 905 | |
| 906 | |
| 907 | |
| 908 | |
| 909 | |
| 910 | |
| 911 | <h1 id="prerequisites">Prerequisites<a class="headerlink" href="#prerequisites" title="Permanent link">¶</a></h1> |
| 912 | <p>Before installing fossilrepo, ensure your server meets these requirements.</p> |
| 913 | <h2 id="system-requirements">System Requirements<a class="headerlink" href="#system-requirements" title="Permanent link">¶</a></h2> |
| 914 | <table> |
| 915 | <thead> |
| 916 | <tr> |
| 917 | <th>Requirement</th> |
| 918 | <th>Minimum</th> |
| 919 | </tr> |
| 920 | </thead> |
| 921 | <tbody> |
| 922 | <tr> |
| 923 | <td><strong>OS</strong></td> |
| 924 | <td>Linux (Ubuntu 22.04+, Debian 12+, RHEL 9+) or macOS 13+</td> |
| 925 | </tr> |
| 926 | <tr> |
| 927 | <td><strong>CPU</strong></td> |
| 928 | <td>1 vCPU</td> |
| 929 | </tr> |
| 930 | <tr> |
| 931 | <td><strong>RAM</strong></td> |
| 932 | <td>1 GB</td> |
| 933 | </tr> |
| 934 | <tr> |
| 935 | <td><strong>Disk</strong></td> |
| 936 | <td>10 GB (scales with repo count)</td> |
| 937 | </tr> |
| 938 | <tr> |
| 939 | <td><strong>Python</strong></td> |
| 940 | <td>3.12+</td> |
| 941 | </tr> |
| 942 | </tbody> |
| 943 | </table> |
| 944 | <h2 id="required-software">Required Software<a class="headerlink" href="#required-software" title="Permanent link">¶</a></h2> |
| 945 | <h3 id="docker-docker-compose">Docker & Docker Compose<a class="headerlink" href="#docker-docker-compose" title="Permanent link">¶</a></h3> |
| 946 | <p>Fossilrepo runs its infrastructure stack via Docker Compose.</p> |
| 947 | <div class="tabbed-set tabbed-alternate" data-tabs="1:2"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Ubuntu/Debian</label><label for="__tabbed_1_2">macOS</label></div> |
| 948 | <div class="tabbed-content"> |
| 949 | <div class="tabbed-block"> |
| 950 | <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># Install Docker</span> |
| 951 | <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>curl<span class="w"> </span>-fsSL<span class="w"> </span>https://get.docker.com<span class="w"> </span><span class="p">|</span><span class="w"> </span>sh |
| 952 | <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>sudo<span class="w"> </span>usermod<span class="w"> </span>-aG<span class="w"> </span>docker<span class="w"> </span><span class="nv">$USER</span> |
| 953 | <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> |
| 954 | <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="c1"># Verify</span> |
| 955 | <a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a>docker<span class="w"> </span>compose<span class="w"> </span>version |
| 956 | </code></pre></div> |
| 957 | </div> |
| 958 | <div class="tabbed-block"> |
| 959 | <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="c1"># Install Docker Desktop</span> |
| 960 | <a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>brew<span class="w"> </span>install<span class="w"> </span>--cask<span class="w"> </span>docker |
| 961 | <a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a> |
| 962 | <a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="c1"># Verify</span> |
| 963 | <a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a>docker<span class="w"> </span>compose<span class="w"> </span>version |
| 964 | </code></pre></div> |
| 965 | </div> |
| 966 | </div> |
| 967 | </div> |
| 968 | <h3 id="git">Git<a class="headerlink" href="#git" title="Permanent link">¶</a></h3> |
| 969 | <p>Required for the sync bridge (mirroring to GitHub/GitLab).</p> |
| 970 | <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>git<span class="w"> </span>--version<span class="w"> </span><span class="c1"># 2.30+</span> |
| 971 | </code></pre></div> |
| 972 | <h3 id="make">Make<a class="headerlink" href="#make" title="Permanent link">¶</a></h3> |
| 973 | <p>Used for running common commands.</p> |
| 974 | <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>make<span class="w"> </span>--version |
| 975 | </code></pre></div> |
| 976 | <h2 id="optional-s3-compatible-storage">Optional: S3-Compatible Storage<a class="headerlink" href="#optional-s3-compatible-storage" title="Permanent link">¶</a></h2> |
| 977 | <p>For continuous backups via Litestream, you need an S3-compatible bucket:</p> |
| 978 | <ul> |
| 979 | <li><strong>AWS S3</strong></li> |
| 980 | <li><strong>MinIO</strong> (self-hosted)</li> |
| 981 | <li><strong>Backblaze B2</strong></li> |
| 982 | <li><strong>DigitalOcean Spaces</strong></li> |
| 983 | </ul> |
| 984 | <div class="admonition info"> |
| 985 | <p class="admonition-title">Local development</p> |
| 986 | <p>S3 is not required for local development. Litestream is disabled by default in the dev Docker Compose configuration.</p> |
| 987 | </div> |
| 988 | <h2 id="ports">Ports<a class="headerlink" href="#ports" title="Permanent link">¶</a></h2> |
| 989 | <p>The following ports are used by the stack:</p> |
| 990 | <table> |
| 991 | <thead> |
| 992 | <tr> |
| 993 | <th>Port</th> |
| 994 | <th>Service</th> |
| 995 | </tr> |
| 996 | </thead> |
| 997 | <tbody> |
| 998 | <tr> |
| 999 | <td><code>8000</code></td> |
| 1000 | <td>Django (management UI)</td> |
| 1001 | </tr> |
| 1002 | <tr> |
| 1003 | <td><code>443</code></td> |
| 1004 | <td>Caddy (HTTPS, production)</td> |
| 1005 | </tr> |
| 1006 | <tr> |
| 1007 | <td><code>80</code></td> |
| 1008 | <td>Caddy (HTTP redirect, production)</td> |
| 1009 | </tr> |
| 1010 | <tr> |
| 1011 | <td><code>5432</code></td> |
| 1012 | <td>PostgreSQL</td> |
| 1013 | </tr> |
| 1014 | <tr> |
| 1015 | <td><code>6379</code></td> |
| 1016 | <td>Redis</td> |
| 1017 | </tr> |
| 1018 | <tr> |
| 1019 | <td><code>8025</code></td> |
| 1020 | <td>Mailpit (dev only)</td> |
| 1021 | </tr> |
| 1022 | </tbody> |
| 1023 | </table> |
| 1024 | |
| 1025 | |
| 1026 | |
| 1027 | |
| 1028 | |
| 1029 | |
| 1030 | |
| 1031 | |
| 1032 | |
| 1033 | |
| 1034 | |
| 1035 | |
| 1036 | |
| 1037 | </article> |
| 1038 | </div> |
| 1039 | |
| 1040 | |
| 1041 | <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> |
| 1042 | |
| 1043 | <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> |
| 1044 | </div> |
| 1045 | |
| 1046 | <button type="button" class="md-top md-icon" data-md-component="top" hidden> |
| 1047 | |
| 1048 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> |
| 1049 | Back to top |
| 1050 | </button> |
| 1051 | |
| 1052 | </main> |
| 1053 | |
| 1054 | <footer class="md-footer"> |
| 1055 | |
| 1056 | <div class="md-footer-meta md-typeset"> |
| 1057 | <div class="md-footer-meta__inner md-grid"> |
| 1058 | <div class="md-copyright"> |
| 1059 | |
| 1060 | <div class="md-copyright__highlight"> |
| 1061 | Copyright © 2026 CONFLICT LLC |
| 1062 | </div> |
| 1063 | |
| 1064 | |
| 1065 | Made with |
| 1066 | <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> |
| 1067 | Material for MkDocs |
| 1068 | </a> |
| 1069 | |
| 1070 | </div> |
| 1071 | |
| 1072 | |
| 1073 | <div class="md-social"> |
| 1074 | |
| 1075 | |
| 1076 | |
| 1077 | |
| 1078 | |
| 1079 | |
| 1080 | |
| 1081 | |
| 1082 | <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link"> |
| 1083 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 1084 | </a> |
| 1085 | |
| 1086 | </div> |
| 1087 | |
| 1088 | </div> |
| 1089 | </div> |
| 1090 | </footer> |
| 1091 | |
| 1092 | </div> |
| 1093 | <div class="md-dialog" data-md-component="dialog"> |
| 1094 | <div class="md-dialog__inner md-typeset"></div> |
| 1095 | </div> |
| 1096 | |
| 1097 | |
| 1098 | |
| 1099 | |
| 1100 | |
| 1101 | <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> |
| 1102 | |
| 1103 | |
| 1104 | <script src="../../assets/javascripts/bundle.79ae519e.min.js"></script> |
| 1105 | |
| 1106 | |
| 1107 | </body> |
| 1108 | </html> |
+1008
| --- a/site/index.html | ||
| +++ b/site/index.html | ||
| @@ -0,0 +1,1008 @@ | ||
| 1 | + | |
| 2 | +<!doctype html> | |
| 3 | +<html lang="en" class="no-js"> | |
| 4 | + <head> | |
| 5 | + | |
| 6 | + <meta charset="utf-8"> | |
| 7 | + <meta name="viewport" content="width=device-width,initial-scale=1"> | |
| 8 | + | |
| 9 | + <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting"> | |
| 10 | + | |
| 11 | + | |
| 12 | + <meta name="author" content="CONFLICT LLC"> | |
| 13 | + | |
| 14 | + | |
| 15 | + <link rel="canonical" href="https://fossilrepo.dev/"> | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + <link rel="next" href="getting-started/prerequisites/"> | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + <link rel="icon" href="assets/images/favicon.png"> | |
| 26 | + <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6"> | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + <title>Fossilrepo</title> | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + <link rel="stylesheet" href="assets/stylesheets/main.484c7ddc.min.css"> | |
| 35 | + | |
| 36 | + | |
| 37 | + <link rel="stylesheet" href="assets/stylesheets/palette.ab4e12ef.min.css"> | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | |
| 51 | + <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> | |
| 52 | + <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + <link rel="stylesheet" href="assets/css/custom.css"> | |
| 57 | + | |
| 58 | + <script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + </head> | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"> | |
| 75 | + | |
| 76 | + | |
| 77 | + <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> | |
| 78 | + <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> | |
| 79 | + <label class="md-overlay" for="__drawer"></label> | |
| 80 | + <div data-md-component="skip"> | |
| 81 | + | |
| 82 | + | |
| 83 | + <a href="#fossilrepo" class="md-skip"> | |
| 84 | + Skip to content | |
| 85 | + </a> | |
| 86 | + | |
| 87 | + </div> | |
| 88 | + <div data-md-component="announce"> | |
| 89 | + | |
| 90 | + </div> | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | +<header class="md-header" data-md-component="header"> | |
| 96 | + <nav class="md-header__inner md-grid" aria-label="Header"> | |
| 97 | + <a href="." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> | |
| 98 | + <div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 99 | + <img src="assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 100 | + <img src="assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 101 | +</div> | |
| 102 | + </a> | |
| 103 | + <label class="md-header__button md-icon" for="__drawer"> | |
| 104 | + | |
| 105 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> | |
| 106 | + </label> | |
| 107 | + <div class="md-header__title" data-md-component="header-title"> | |
| 108 | + <div class="md-header__ellipsis"> | |
| 109 | + <div class="md-header__topic"> | |
| 110 | + <span class="md-ellipsis"> | |
| 111 | + Fossilrepo | |
| 112 | + </span> | |
| 113 | + </div> | |
| 114 | + <div class="md-header__topic" data-md-component="header-topic"> | |
| 115 | + <span class="md-ellipsis"> | |
| 116 | + | |
| 117 | + Home | |
| 118 | + | |
| 119 | + </span> | |
| 120 | + </div> | |
| 121 | + </div> | |
| 122 | + </div> | |
| 123 | + | |
| 124 | + | |
| 125 | + <form class="md-header__option" data-md-component="palette"> | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> | |
| 131 | + | |
| 132 | + <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> | |
| 133 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> | |
| 134 | + </label> | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> | |
| 141 | + | |
| 142 | + <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> | |
| 143 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> | |
| 144 | + </label> | |
| 145 | + | |
| 146 | + | |
| 147 | +</form> | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + <label class="md-header__button md-icon" for="__search"> | |
| 158 | + | |
| 159 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> | |
| 160 | + </label> | |
| 161 | + <div class="md-search" data-md-component="search" role="dialog"> | |
| 162 | + <label class="md-search__overlay" for="__search"></label> | |
| 163 | + <div class="md-search__inner" role="search"> | |
| 164 | + <form class="md-search__form" name="search"> | |
| 165 | + <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> | |
| 166 | + <label class="md-search__icon md-icon" for="__search"> | |
| 167 | + | |
| 168 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> | |
| 169 | + | |
| 170 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> | |
| 171 | + </label> | |
| 172 | + <nav class="md-search__options" aria-label="Search"> | |
| 173 | + | |
| 174 | + <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> | |
| 175 | + | |
| 176 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> | |
| 177 | + </button> | |
| 178 | + </nav> | |
| 179 | + | |
| 180 | + <div class="md-search__suggest" data-md-component="search-suggest"></div> | |
| 181 | + | |
| 182 | + </form> | |
| 183 | + <div class="md-search__output"> | |
| 184 | + <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> | |
| 185 | + <div class="md-search-result" data-md-component="search-result"> | |
| 186 | + <div class="md-search-result__meta"> | |
| 187 | + Initializing search | |
| 188 | + </div> | |
| 189 | + <ol class="md-search-result__list" role="presentation"></ol> | |
| 190 | + </div> | |
| 191 | + </div> | |
| 192 | + </div> | |
| 193 | + </div> | |
| 194 | +</div> | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + <div class="md-header__source"> | |
| 199 | + <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> | |
| 200 | + <div class="md-source__icon md-icon"> | |
| 201 | + | |
| 202 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 203 | + </div> | |
| 204 | + <div class="md-source__repository"> | |
| 205 | + ConflictHQ/fossilrepo | |
| 206 | + </div> | |
| 207 | +</a> | |
| 208 | + </div> | |
| 209 | + | |
| 210 | + </nav> | |
| 211 | + | |
| 212 | +</header> | |
| 213 | + | |
| 214 | + <div class="md-container" data-md-component="container"> | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | +<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> | |
| 221 | + <div class="md-grid"> | |
| 222 | + <ul class="md-tabs__list"> | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + <li class="md-tabs__item md-tabs__item--active"> | |
| 232 | + <a href="." class="md-tabs__link"> | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + Home | |
| 239 | + | |
| 240 | + </a> | |
| 241 | + </li> | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + <li class="md-tabs__item"> | |
| 253 | + <a href="getting-started/prerequisites/" class="md-tabs__link"> | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + Getting Started | |
| 258 | + | |
| 259 | + </a> | |
| 260 | + </li> | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + <li class="md-tabs__item"> | |
| 273 | + <a href="architecture/overview/" class="md-tabs__link"> | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + Architecture | |
| 278 | + | |
| 279 | + </a> | |
| 280 | + </li> | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + </ul> | |
| 286 | + </div> | |
| 287 | +</nav> | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + <main class="md-main" data-md-component="main"> | |
| 292 | + <div class="md-main__inner md-grid"> | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > | |
| 297 | + <div class="md-sidebar__scrollwrap"> | |
| 298 | + <div class="md-sidebar__inner"> | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | +<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> | |
| 306 | + <label class="md-nav__title" for="__drawer"> | |
| 307 | + <a href="." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> | |
| 308 | + <div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 309 | + <img src="assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 310 | + <img src="assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 311 | +</div> | |
| 312 | + </a> | |
| 313 | + Fossilrepo | |
| 314 | + </label> | |
| 315 | + | |
| 316 | + <div class="md-nav__source"> | |
| 317 | + <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> | |
| 318 | + <div class="md-source__icon md-icon"> | |
| 319 | + | |
| 320 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 321 | + </div> | |
| 322 | + <div class="md-source__repository"> | |
| 323 | + ConflictHQ/fossilrepo | |
| 324 | + </div> | |
| 325 | +</a> | |
| 326 | + </div> | |
| 327 | + | |
| 328 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + <li class="md-nav__item md-nav__item--active"> | |
| 339 | + | |
| 340 | + <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + <label class="md-nav__link md-nav__link--active" for="__toc"> | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + <span class="md-ellipsis"> | |
| 351 | + | |
| 352 | + | |
| 353 | + Home | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + </span> | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + <span class="md-nav__icon md-icon"></span> | |
| 362 | + </label> | |
| 363 | + | |
| 364 | + <a href="." class="md-nav__link md-nav__link--active"> | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + <span class="md-ellipsis"> | |
| 369 | + | |
| 370 | + | |
| 371 | + Home | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + </span> | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + </a> | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + <label class="md-nav__title" for="__toc"> | |
| 391 | + <span class="md-nav__icon md-icon"></span> | |
| 392 | + Table of contents | |
| 393 | + </label> | |
| 394 | + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> | |
| 395 | + | |
| 396 | + <li class="md-nav__item"> | |
| 397 | + <a href="#why-fossil" class="md-nav__link"> | |
| 398 | + <span class="md-ellipsis"> | |
| 399 | + | |
| 400 | + Why Fossil? | |
| 401 | + | |
| 402 | + </span> | |
| 403 | + </a> | |
| 404 | + | |
| 405 | +</li> | |
| 406 | + | |
| 407 | + <li class="md-nav__item"> | |
| 408 | + <a href="#what-you-get" class="md-nav__link"> | |
| 409 | + <span class="md-ellipsis"> | |
| 410 | + | |
| 411 | + What You Get | |
| 412 | + | |
| 413 | + </span> | |
| 414 | + </a> | |
| 415 | + | |
| 416 | +</li> | |
| 417 | + | |
| 418 | + <li class="md-nav__item"> | |
| 419 | + <a href="#quick-start" class="md-nav__link"> | |
| 420 | + <span class="md-ellipsis"> | |
| 421 | + | |
| 422 | + Quick Start | |
| 423 | + | |
| 424 | + </span> | |
| 425 | + </a> | |
| 426 | + | |
| 427 | +</li> | |
| 428 | + | |
| 429 | + <li class="md-nav__item"> | |
| 430 | + <a href="#architecture" class="md-nav__link"> | |
| 431 | + <span class="md-ellipsis"> | |
| 432 | + | |
| 433 | + Architecture | |
| 434 | + | |
| 435 | + </span> | |
| 436 | + </a> | |
| 437 | + | |
| 438 | +</li> | |
| 439 | + | |
| 440 | + <li class="md-nav__item"> | |
| 441 | + <a href="#license" class="md-nav__link"> | |
| 442 | + <span class="md-ellipsis"> | |
| 443 | + | |
| 444 | + License | |
| 445 | + | |
| 446 | + </span> | |
| 447 | + </a> | |
| 448 | + | |
| 449 | +</li> | |
| 450 | + | |
| 451 | + </ul> | |
| 452 | + | |
| 453 | +</nav> | |
| 454 | + | |
| 455 | + </li> | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + <li class="md-nav__item md-nav__item--nested"> | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + | |
| 481 | + <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" > | |
| 482 | + | |
| 483 | + | |
| 484 | + <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0"> | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + <span class="md-ellipsis"> | |
| 489 | + | |
| 490 | + | |
| 491 | + Getting Started | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + </span> | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + <span class="md-nav__icon md-icon"></span> | |
| 500 | + </label> | |
| 501 | + | |
| 502 | + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false"> | |
| 503 | + <label class="md-nav__title" for="__nav_2"> | |
| 504 | + <span class="md-nav__icon md-icon"></span> | |
| 505 | + | |
| 506 | + | |
| 507 | + Getting Started | |
| 508 | + | |
| 509 | + | |
| 510 | + </label> | |
| 511 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + <li class="md-nav__item"> | |
| 520 | + <a href="getting-started/prerequisites/" class="md-nav__link"> | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
| 524 | + <span class="md-ellipsis"> | |
| 525 | + | |
| 526 | + | |
| 527 | + Prerequisites | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + </span> | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + </a> | |
| 536 | + </li> | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + <li class="md-nav__item"> | |
| 548 | + <a href="getting-started/installation/" class="md-nav__link"> | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + <span class="md-ellipsis"> | |
| 553 | + | |
| 554 | + | |
| 555 | + Installation | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + </span> | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + </a> | |
| 564 | + </li> | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + <li class="md-nav__item"> | |
| 576 | + <a href="getting-started/configuration/" class="md-nav__link"> | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + <span class="md-ellipsis"> | |
| 581 | + | |
| 582 | + | |
| 583 | + Configuration | |
| 584 | + | |
| 585 | + | |
| 586 | + | |
| 587 | + </span> | |
| 588 | + | |
| 589 | + | |
| 590 | + | |
| 591 | + </a> | |
| 592 | + </li> | |
| 593 | + | |
| 594 | + | |
| 595 | + | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + <li class="md-nav__item"> | |
| 604 | + <a href="getting-started/first-repo/" class="md-nav__link"> | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + <span class="md-ellipsis"> | |
| 609 | + | |
| 610 | + | |
| 611 | + First Repository | |
| 612 | + | |
| 613 | + | |
| 614 | + | |
| 615 | + </span> | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + </a> | |
| 620 | + </li> | |
| 621 | + | |
| 622 | + | |
| 623 | + | |
| 624 | + | |
| 625 | + </ul> | |
| 626 | + </nav> | |
| 627 | + | |
| 628 | + </li> | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
| 644 | + | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + <li class="md-nav__item md-nav__item--nested"> | |
| 649 | + | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" > | |
| 655 | + | |
| 656 | + | |
| 657 | + <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + <span class="md-ellipsis"> | |
| 662 | + | |
| 663 | + | |
| 664 | + Architecture | |
| 665 | + | |
| 666 | + | |
| 667 | + | |
| 668 | + </span> | |
| 669 | + | |
| 670 | + | |
| 671 | + | |
| 672 | + <span class="md-nav__icon md-icon"></span> | |
| 673 | + </label> | |
| 674 | + | |
| 675 | + <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> | |
| 676 | + <label class="md-nav__title" for="__nav_3"> | |
| 677 | + <span class="md-nav__icon md-icon"></span> | |
| 678 | + | |
| 679 | + | |
| 680 | + Architecture | |
| 681 | + | |
| 682 | + | |
| 683 | + </label> | |
| 684 | + <ul class="md-nav__list" data-md-scrollfix> | |
| 685 | + | |
| 686 | + | |
| 687 | + | |
| 688 | + | |
| 689 | + | |
| 690 | + | |
| 691 | + | |
| 692 | + <li class="md-nav__item"> | |
| 693 | + <a href="architecture/overview/" class="md-nav__link"> | |
| 694 | + | |
| 695 | + | |
| 696 | + | |
| 697 | + <span class="md-ellipsis"> | |
| 698 | + | |
| 699 | + | |
| 700 | + Overview | |
| 701 | + | |
| 702 | + | |
| 703 | + | |
| 704 | + </span> | |
| 705 | + | |
| 706 | + | |
| 707 | + | |
| 708 | + </a> | |
| 709 | + </li> | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
| 714 | + | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
| 719 | + | |
| 720 | + <li class="md-nav__item"> | |
| 721 | + <a href="architecture/sync-bridge/" class="md-nav__link"> | |
| 722 | + | |
| 723 | + | |
| 724 | + | |
| 725 | + <span class="md-ellipsis"> | |
| 726 | + | |
| 727 | + | |
| 728 | + Sync Bridge | |
| 729 | + | |
| 730 | + | |
| 731 | + | |
| 732 | + </span> | |
| 733 | + | |
| 734 | + | |
| 735 | + | |
| 736 | + </a> | |
| 737 | + </li> | |
| 738 | + | |
| 739 | + | |
| 740 | + | |
| 741 | + | |
| 742 | + </ul> | |
| 743 | + </nav> | |
| 744 | + | |
| 745 | + </li> | |
| 746 | + | |
| 747 | + | |
| 748 | + | |
| 749 | + </ul> | |
| 750 | +</nav> | |
| 751 | + </div> | |
| 752 | + </div> | |
| 753 | + </div> | |
| 754 | + | |
| 755 | + | |
| 756 | + | |
| 757 | + <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > | |
| 758 | + <div class="md-sidebar__scrollwrap"> | |
| 759 | + <div class="md-sidebar__inner"> | |
| 760 | + | |
| 761 | + | |
| 762 | +<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> | |
| 763 | + | |
| 764 | + | |
| 765 | + | |
| 766 | + | |
| 767 | + | |
| 768 | + | |
| 769 | + <label class="md-nav__title" for="__toc"> | |
| 770 | + <span class="md-nav__icon md-icon"></span> | |
| 771 | + Table of contents | |
| 772 | + </label> | |
| 773 | + <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> | |
| 774 | + | |
| 775 | + <li class="md-nav__item"> | |
| 776 | + <a href="#why-fossil" class="md-nav__link"> | |
| 777 | + <span class="md-ellipsis"> | |
| 778 | + | |
| 779 | + Why Fossil? | |
| 780 | + | |
| 781 | + </span> | |
| 782 | + </a> | |
| 783 | + | |
| 784 | +</li> | |
| 785 | + | |
| 786 | + <li class="md-nav__item"> | |
| 787 | + <a href="#what-you-get" class="md-nav__link"> | |
| 788 | + <span class="md-ellipsis"> | |
| 789 | + | |
| 790 | + What You Get | |
| 791 | + | |
| 792 | + </span> | |
| 793 | + </a> | |
| 794 | + | |
| 795 | +</li> | |
| 796 | + | |
| 797 | + <li class="md-nav__item"> | |
| 798 | + <a href="#quick-start" class="md-nav__link"> | |
| 799 | + <span class="md-ellipsis"> | |
| 800 | + | |
| 801 | + Quick Start | |
| 802 | + | |
| 803 | + </span> | |
| 804 | + </a> | |
| 805 | + | |
| 806 | +</li> | |
| 807 | + | |
| 808 | + <li class="md-nav__item"> | |
| 809 | + <a href="#architecture" class="md-nav__link"> | |
| 810 | + <span class="md-ellipsis"> | |
| 811 | + | |
| 812 | + Architecture | |
| 813 | + | |
| 814 | + </span> | |
| 815 | + </a> | |
| 816 | + | |
| 817 | +</li> | |
| 818 | + | |
| 819 | + <li class="md-nav__item"> | |
| 820 | + <a href="#license" class="md-nav__link"> | |
| 821 | + <span class="md-ellipsis"> | |
| 822 | + | |
| 823 | + License | |
| 824 | + | |
| 825 | + </span> | |
| 826 | + </a> | |
| 827 | + | |
| 828 | +</li> | |
| 829 | + | |
| 830 | + </ul> | |
| 831 | + | |
| 832 | +</nav> | |
| 833 | + </div> | |
| 834 | + </div> | |
| 835 | + </div> | |
| 836 | + | |
| 837 | + | |
| 838 | + | |
| 839 | + <div class="md-content" data-md-component="content"> | |
| 840 | + | |
| 841 | + <article class="md-content__inner md-typeset"> | |
| 842 | + | |
| 843 | + | |
| 844 | + | |
| 845 | + | |
| 846 | + | |
| 847 | + | |
| 848 | + | |
| 849 | + | |
| 850 | +<h1 id="fossilrepo">Fossilrepo<a class="headerlink" href="#fossilrepo" title="Permanent link">¶</a></h1> | |
| 851 | +<p><strong>Self-hosted Fossil forge. One command, full-stack code hosting.</strong></p> | |
| 852 | +<p>Fossilrepo is an omnibus-style installer for a production Fossil SCM server. It packages Fossil, Caddy (SSL/routing), Litestream (S3 backups), and a Django management layer into a single deployable unit.</p> | |
| 853 | +<p>Think GitLab Omnibus, but for Fossil.</p> | |
| 854 | +<h2 id="why-fossil">Why Fossil?<a class="headerlink" href="#why-fossil" title="Permanent link">¶</a></h2> | |
| 855 | +<p>A Fossil repository is a single SQLite file containing the full VCS history, issue tracker, wiki, forum, and timeline. No external services. No rate limits. Portable -- hand the file to someone and they have everything.</p> | |
| 856 | +<ul> | |
| 857 | +<li><strong>Single-file repos</strong> -- each <code>.fossil</code> file is the entire project</li> | |
| 858 | +<li><strong>Built-in everything</strong> -- issues, wiki, forum, timeline, web UI</li> | |
| 859 | +<li><strong>No API rate limits</strong> -- ideal for CI agents and automation</li> | |
| 860 | +<li><strong>Litestream replication</strong> -- continuous backup to S3 for free</li> | |
| 861 | +</ul> | |
| 862 | +<h2 id="what-you-get">What You Get<a class="headerlink" href="#what-you-get" title="Permanent link">¶</a></h2> | |
| 863 | +<table> | |
| 864 | +<thead> | |
| 865 | +<tr> | |
| 866 | +<th>Component</th> | |
| 867 | +<th>Role</th> | |
| 868 | +</tr> | |
| 869 | +</thead> | |
| 870 | +<tbody> | |
| 871 | +<tr> | |
| 872 | +<td><strong>Fossil server</strong></td> | |
| 873 | +<td>Serves all repos from a single process</td> | |
| 874 | +</tr> | |
| 875 | +<tr> | |
| 876 | +<td><strong>Caddy</strong></td> | |
| 877 | +<td>SSL termination, subdomain-per-repo routing</td> | |
| 878 | +</tr> | |
| 879 | +<tr> | |
| 880 | +<td><strong>Litestream</strong></td> | |
| 881 | +<td>Continuous SQLite replication to S3/MinIO</td> | |
| 882 | +</tr> | |
| 883 | +<tr> | |
| 884 | +<td><strong>Django management UI</strong></td> | |
| 885 | +<td>Repository lifecycle, user management, dashboards</td> | |
| 886 | +</tr> | |
| 887 | +<tr> | |
| 888 | +<td><strong>Sync bridge</strong></td> | |
| 889 | +<td>Mirror Fossil repos to GitHub/GitLab (read-only)</td> | |
| 890 | +</tr> | |
| 891 | +<tr> | |
| 892 | +<td><strong>Celery workers</strong></td> | |
| 893 | +<td>Background sync, scheduled tasks</td> | |
| 894 | +</tr> | |
| 895 | +</tbody> | |
| 896 | +</table> | |
| 897 | +<h2 id="quick-start">Quick Start<a class="headerlink" href="#quick-start" title="Permanent link">¶</a></h2> | |
| 898 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># Clone the repo</span> | |
| 899 | +<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/ConflictHQ/fossilrepo.git | |
| 900 | +<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="nb">cd</span><span class="w"> </span>fossilrepo | |
| 901 | +<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> | |
| 902 | +<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="c1"># Start the full stack</span> | |
| 903 | +<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a>make<span class="w"> </span>build | |
| 904 | +<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> | |
| 905 | +<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="c1"># Seed development data</span> | |
| 906 | +<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a>make<span class="w"> </span>seed | |
| 907 | +<a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a> | |
| 908 | +<a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a><span class="c1"># Open the dashboard</span> | |
| 909 | +<a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a>open<span class="w"> </span>http://localhost:8000 | |
| 910 | +</code></pre></div> | |
| 911 | +<h2 id="architecture">Architecture<a class="headerlink" href="#architecture" title="Permanent link">¶</a></h2> | |
| 912 | +<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>Caddy (SSL termination, routing, subdomain per repo) | |
| 913 | +<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a> +-- fossil server --repolist /data/repos/ | |
| 914 | +<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a> +-- /data/repos/ | |
| 915 | +<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a> |-- projecta.fossil | |
| 916 | +<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a> |-- projectb.fossil | |
| 917 | +<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a> +-- ... | |
| 918 | +<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a> | |
| 919 | +<a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a>Litestream -> S3/MinIO (continuous replication, point-in-time recovery) | |
| 920 | +</code></pre></div> | |
| 921 | +<p>New project = <code>fossil init</code>. No restart, no config change. Litestream picks it up automatically.</p> | |
| 922 | +<h2 id="license">License<a class="headerlink" href="#license" title="Permanent link">¶</a></h2> | |
| 923 | +<p>MIT License -- Copyright (c) 2026 CONFLICT LLC.</p> | |
| 924 | + | |
| 925 | + | |
| 926 | + | |
| 927 | + | |
| 928 | + | |
| 929 | + | |
| 930 | + | |
| 931 | + | |
| 932 | + | |
| 933 | + | |
| 934 | + | |
| 935 | + | |
| 936 | + | |
| 937 | + </article> | |
| 938 | + </div> | |
| 939 | + | |
| 940 | + | |
| 941 | + <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> | |
| 942 | + | |
| 943 | +<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> | |
| 944 | + </div> | |
| 945 | + | |
| 946 | + <button type="button" class="md-top md-icon" data-md-component="top" hidden> | |
| 947 | + | |
| 948 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> | |
| 949 | + Back to top | |
| 950 | +</button> | |
| 951 | + | |
| 952 | + </main> | |
| 953 | + | |
| 954 | + <footer class="md-footer"> | |
| 955 | + | |
| 956 | + <div class="md-footer-meta md-typeset"> | |
| 957 | + <div class="md-footer-meta__inner md-grid"> | |
| 958 | + <div class="md-copyright"> | |
| 959 | + | |
| 960 | + <div class="md-copyright__highlight"> | |
| 961 | + Copyright © 2026 CONFLICT LLC | |
| 962 | + </div> | |
| 963 | + | |
| 964 | + | |
| 965 | + Made with | |
| 966 | + <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> | |
| 967 | + Material for MkDocs | |
| 968 | + </a> | |
| 969 | + | |
| 970 | +</div> | |
| 971 | + | |
| 972 | + | |
| 973 | +<div class="md-social"> | |
| 974 | + | |
| 975 | + | |
| 976 | + | |
| 977 | + | |
| 978 | + | |
| 979 | + | |
| 980 | + | |
| 981 | + | |
| 982 | + <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link"> | |
| 983 | + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> | |
| 984 | + </a> | |
| 985 | + | |
| 986 | +</div> | |
| 987 | + | |
| 988 | + </div> | |
| 989 | + </div> | |
| 990 | +</footer> | |
| 991 | + | |
| 992 | + </div> | |
| 993 | + <div class="md-dialog" data-md-component="dialog"> | |
| 994 | + <div class="md-dialog__inner md-typeset"></div> | |
| 995 | + </div> | |
| 996 | + | |
| 997 | + | |
| 998 | + | |
| 999 | + | |
| 1000 | + | |
| 1001 | + <script id="__config" type="application/json">{"annotate": null, "base": ".", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> | |
| 1002 | + | |
| 1003 | + | |
| 1004 | + <script src="assets/javascripts/bundle.79ae519e.min.js"></script> | |
| 1005 | + | |
| 1006 | + | |
| 1007 | + </body> | |
| 1008 | +</html> |
| --- a/site/index.html | |
| +++ b/site/index.html | |
| @@ -0,0 +1,1008 @@ | |
| --- a/site/index.html | |
| +++ b/site/index.html | |
| @@ -0,0 +1,1008 @@ | |
| 1 | |
| 2 | <!doctype html> |
| 3 | <html lang="en" class="no-js"> |
| 4 | <head> |
| 5 | |
| 6 | <meta charset="utf-8"> |
| 7 | <meta name="viewport" content="width=device-width,initial-scale=1"> |
| 8 | |
| 9 | <meta name="description" content="Self-hosted Fossil forge -- omnibus installer for production Fossil SCM hosting"> |
| 10 | |
| 11 | |
| 12 | <meta name="author" content="CONFLICT LLC"> |
| 13 | |
| 14 | |
| 15 | <link rel="canonical" href="https://fossilrepo.dev/"> |
| 16 | |
| 17 | |
| 18 | |
| 19 | <link rel="next" href="getting-started/prerequisites/"> |
| 20 | |
| 21 | |
| 22 | |
| 23 | |
| 24 | |
| 25 | <link rel="icon" href="assets/images/favicon.png"> |
| 26 | <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6"> |
| 27 | |
| 28 | |
| 29 | |
| 30 | <title>Fossilrepo</title> |
| 31 | |
| 32 | |
| 33 | |
| 34 | <link rel="stylesheet" href="assets/stylesheets/main.484c7ddc.min.css"> |
| 35 | |
| 36 | |
| 37 | <link rel="stylesheet" href="assets/stylesheets/palette.ab4e12ef.min.css"> |
| 38 | |
| 39 | |
| 40 | |
| 41 | |
| 42 | |
| 43 | |
| 44 | |
| 45 | |
| 46 | |
| 47 | |
| 48 | |
| 49 | |
| 50 | <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
| 51 | <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> |
| 52 | <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> |
| 53 | |
| 54 | |
| 55 | |
| 56 | <link rel="stylesheet" href="assets/css/custom.css"> |
| 57 | |
| 58 | <script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> |
| 59 | |
| 60 | |
| 61 | |
| 62 | |
| 63 | |
| 64 | </head> |
| 65 | |
| 66 | |
| 67 | |
| 68 | |
| 69 | |
| 70 | |
| 71 | |
| 72 | |
| 73 | |
| 74 | <body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom"> |
| 75 | |
| 76 | |
| 77 | <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> |
| 78 | <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> |
| 79 | <label class="md-overlay" for="__drawer"></label> |
| 80 | <div data-md-component="skip"> |
| 81 | |
| 82 | |
| 83 | <a href="#fossilrepo" class="md-skip"> |
| 84 | Skip to content |
| 85 | </a> |
| 86 | |
| 87 | </div> |
| 88 | <div data-md-component="announce"> |
| 89 | |
| 90 | </div> |
| 91 | |
| 92 | |
| 93 | |
| 94 | |
| 95 | <header class="md-header" data-md-component="header"> |
| 96 | <nav class="md-header__inner md-grid" aria-label="Header"> |
| 97 | <a href="." title="Fossilrepo" class="md-header__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> |
| 98 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 99 | <img src="assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 100 | <img src="assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 101 | </div> |
| 102 | </a> |
| 103 | <label class="md-header__button md-icon" for="__drawer"> |
| 104 | |
| 105 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> |
| 106 | </label> |
| 107 | <div class="md-header__title" data-md-component="header-title"> |
| 108 | <div class="md-header__ellipsis"> |
| 109 | <div class="md-header__topic"> |
| 110 | <span class="md-ellipsis"> |
| 111 | Fossilrepo |
| 112 | </span> |
| 113 | </div> |
| 114 | <div class="md-header__topic" data-md-component="header-topic"> |
| 115 | <span class="md-ellipsis"> |
| 116 | |
| 117 | Home |
| 118 | |
| 119 | </span> |
| 120 | </div> |
| 121 | </div> |
| 122 | </div> |
| 123 | |
| 124 | |
| 125 | <form class="md-header__option" data-md-component="palette"> |
| 126 | |
| 127 | |
| 128 | |
| 129 | |
| 130 | <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0"> |
| 131 | |
| 132 | <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden> |
| 133 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> |
| 134 | </label> |
| 135 | |
| 136 | |
| 137 | |
| 138 | |
| 139 | |
| 140 | <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1"> |
| 141 | |
| 142 | <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden> |
| 143 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> |
| 144 | </label> |
| 145 | |
| 146 | |
| 147 | </form> |
| 148 | |
| 149 | |
| 150 | |
| 151 | <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> |
| 152 | |
| 153 | |
| 154 | |
| 155 | |
| 156 | |
| 157 | <label class="md-header__button md-icon" for="__search"> |
| 158 | |
| 159 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> |
| 160 | </label> |
| 161 | <div class="md-search" data-md-component="search" role="dialog"> |
| 162 | <label class="md-search__overlay" for="__search"></label> |
| 163 | <div class="md-search__inner" role="search"> |
| 164 | <form class="md-search__form" name="search"> |
| 165 | <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> |
| 166 | <label class="md-search__icon md-icon" for="__search"> |
| 167 | |
| 168 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> |
| 169 | |
| 170 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> |
| 171 | </label> |
| 172 | <nav class="md-search__options" aria-label="Search"> |
| 173 | |
| 174 | <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> |
| 175 | |
| 176 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> |
| 177 | </button> |
| 178 | </nav> |
| 179 | |
| 180 | <div class="md-search__suggest" data-md-component="search-suggest"></div> |
| 181 | |
| 182 | </form> |
| 183 | <div class="md-search__output"> |
| 184 | <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix> |
| 185 | <div class="md-search-result" data-md-component="search-result"> |
| 186 | <div class="md-search-result__meta"> |
| 187 | Initializing search |
| 188 | </div> |
| 189 | <ol class="md-search-result__list" role="presentation"></ol> |
| 190 | </div> |
| 191 | </div> |
| 192 | </div> |
| 193 | </div> |
| 194 | </div> |
| 195 | |
| 196 | |
| 197 | |
| 198 | <div class="md-header__source"> |
| 199 | <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> |
| 200 | <div class="md-source__icon md-icon"> |
| 201 | |
| 202 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 203 | </div> |
| 204 | <div class="md-source__repository"> |
| 205 | ConflictHQ/fossilrepo |
| 206 | </div> |
| 207 | </a> |
| 208 | </div> |
| 209 | |
| 210 | </nav> |
| 211 | |
| 212 | </header> |
| 213 | |
| 214 | <div class="md-container" data-md-component="container"> |
| 215 | |
| 216 | |
| 217 | |
| 218 | |
| 219 | |
| 220 | <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> |
| 221 | <div class="md-grid"> |
| 222 | <ul class="md-tabs__list"> |
| 223 | |
| 224 | |
| 225 | |
| 226 | |
| 227 | |
| 228 | |
| 229 | |
| 230 | |
| 231 | <li class="md-tabs__item md-tabs__item--active"> |
| 232 | <a href="." class="md-tabs__link"> |
| 233 | |
| 234 | |
| 235 | |
| 236 | |
| 237 | |
| 238 | Home |
| 239 | |
| 240 | </a> |
| 241 | </li> |
| 242 | |
| 243 | |
| 244 | |
| 245 | |
| 246 | |
| 247 | |
| 248 | |
| 249 | |
| 250 | |
| 251 | |
| 252 | <li class="md-tabs__item"> |
| 253 | <a href="getting-started/prerequisites/" class="md-tabs__link"> |
| 254 | |
| 255 | |
| 256 | |
| 257 | Getting Started |
| 258 | |
| 259 | </a> |
| 260 | </li> |
| 261 | |
| 262 | |
| 263 | |
| 264 | |
| 265 | |
| 266 | |
| 267 | |
| 268 | |
| 269 | |
| 270 | |
| 271 | |
| 272 | <li class="md-tabs__item"> |
| 273 | <a href="architecture/overview/" class="md-tabs__link"> |
| 274 | |
| 275 | |
| 276 | |
| 277 | Architecture |
| 278 | |
| 279 | </a> |
| 280 | </li> |
| 281 | |
| 282 | |
| 283 | |
| 284 | |
| 285 | </ul> |
| 286 | </div> |
| 287 | </nav> |
| 288 | |
| 289 | |
| 290 | |
| 291 | <main class="md-main" data-md-component="main"> |
| 292 | <div class="md-main__inner md-grid"> |
| 293 | |
| 294 | |
| 295 | |
| 296 | <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > |
| 297 | <div class="md-sidebar__scrollwrap"> |
| 298 | <div class="md-sidebar__inner"> |
| 299 | |
| 300 | |
| 301 | |
| 302 | |
| 303 | |
| 304 | |
| 305 | <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> |
| 306 | <label class="md-nav__title" for="__drawer"> |
| 307 | <a href="." title="Fossilrepo" class="md-nav__button md-logo" aria-label="Fossilrepo" data-md-component="logo"> |
| 308 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 309 | <img src="assets/images/conflict-logo.svg" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 310 | <img src="assets/images/fossilrepo-logo.svg" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 311 | </div> |
| 312 | </a> |
| 313 | Fossilrepo |
| 314 | </label> |
| 315 | |
| 316 | <div class="md-nav__source"> |
| 317 | <a href="https://github.com/ConflictHQ/fossilrepo" title="Go to repository" class="md-source" data-md-component="source"> |
| 318 | <div class="md-source__icon md-icon"> |
| 319 | |
| 320 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 321 | </div> |
| 322 | <div class="md-source__repository"> |
| 323 | ConflictHQ/fossilrepo |
| 324 | </div> |
| 325 | </a> |
| 326 | </div> |
| 327 | |
| 328 | <ul class="md-nav__list" data-md-scrollfix> |
| 329 | |
| 330 | |
| 331 | |
| 332 | |
| 333 | |
| 334 | |
| 335 | |
| 336 | |
| 337 | |
| 338 | <li class="md-nav__item md-nav__item--active"> |
| 339 | |
| 340 | <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> |
| 341 | |
| 342 | |
| 343 | |
| 344 | |
| 345 | |
| 346 | <label class="md-nav__link md-nav__link--active" for="__toc"> |
| 347 | |
| 348 | |
| 349 | |
| 350 | <span class="md-ellipsis"> |
| 351 | |
| 352 | |
| 353 | Home |
| 354 | |
| 355 | |
| 356 | |
| 357 | </span> |
| 358 | |
| 359 | |
| 360 | |
| 361 | <span class="md-nav__icon md-icon"></span> |
| 362 | </label> |
| 363 | |
| 364 | <a href="." class="md-nav__link md-nav__link--active"> |
| 365 | |
| 366 | |
| 367 | |
| 368 | <span class="md-ellipsis"> |
| 369 | |
| 370 | |
| 371 | Home |
| 372 | |
| 373 | |
| 374 | |
| 375 | </span> |
| 376 | |
| 377 | |
| 378 | |
| 379 | </a> |
| 380 | |
| 381 | |
| 382 | |
| 383 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> |
| 384 | |
| 385 | |
| 386 | |
| 387 | |
| 388 | |
| 389 | |
| 390 | <label class="md-nav__title" for="__toc"> |
| 391 | <span class="md-nav__icon md-icon"></span> |
| 392 | Table of contents |
| 393 | </label> |
| 394 | <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> |
| 395 | |
| 396 | <li class="md-nav__item"> |
| 397 | <a href="#why-fossil" class="md-nav__link"> |
| 398 | <span class="md-ellipsis"> |
| 399 | |
| 400 | Why Fossil? |
| 401 | |
| 402 | </span> |
| 403 | </a> |
| 404 | |
| 405 | </li> |
| 406 | |
| 407 | <li class="md-nav__item"> |
| 408 | <a href="#what-you-get" class="md-nav__link"> |
| 409 | <span class="md-ellipsis"> |
| 410 | |
| 411 | What You Get |
| 412 | |
| 413 | </span> |
| 414 | </a> |
| 415 | |
| 416 | </li> |
| 417 | |
| 418 | <li class="md-nav__item"> |
| 419 | <a href="#quick-start" class="md-nav__link"> |
| 420 | <span class="md-ellipsis"> |
| 421 | |
| 422 | Quick Start |
| 423 | |
| 424 | </span> |
| 425 | </a> |
| 426 | |
| 427 | </li> |
| 428 | |
| 429 | <li class="md-nav__item"> |
| 430 | <a href="#architecture" class="md-nav__link"> |
| 431 | <span class="md-ellipsis"> |
| 432 | |
| 433 | Architecture |
| 434 | |
| 435 | </span> |
| 436 | </a> |
| 437 | |
| 438 | </li> |
| 439 | |
| 440 | <li class="md-nav__item"> |
| 441 | <a href="#license" class="md-nav__link"> |
| 442 | <span class="md-ellipsis"> |
| 443 | |
| 444 | License |
| 445 | |
| 446 | </span> |
| 447 | </a> |
| 448 | |
| 449 | </li> |
| 450 | |
| 451 | </ul> |
| 452 | |
| 453 | </nav> |
| 454 | |
| 455 | </li> |
| 456 | |
| 457 | |
| 458 | |
| 459 | |
| 460 | |
| 461 | |
| 462 | |
| 463 | |
| 464 | |
| 465 | |
| 466 | |
| 467 | |
| 468 | |
| 469 | |
| 470 | |
| 471 | |
| 472 | |
| 473 | |
| 474 | |
| 475 | <li class="md-nav__item md-nav__item--nested"> |
| 476 | |
| 477 | |
| 478 | |
| 479 | |
| 480 | |
| 481 | <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" > |
| 482 | |
| 483 | |
| 484 | <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0"> |
| 485 | |
| 486 | |
| 487 | |
| 488 | <span class="md-ellipsis"> |
| 489 | |
| 490 | |
| 491 | Getting Started |
| 492 | |
| 493 | |
| 494 | |
| 495 | </span> |
| 496 | |
| 497 | |
| 498 | |
| 499 | <span class="md-nav__icon md-icon"></span> |
| 500 | </label> |
| 501 | |
| 502 | <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false"> |
| 503 | <label class="md-nav__title" for="__nav_2"> |
| 504 | <span class="md-nav__icon md-icon"></span> |
| 505 | |
| 506 | |
| 507 | Getting Started |
| 508 | |
| 509 | |
| 510 | </label> |
| 511 | <ul class="md-nav__list" data-md-scrollfix> |
| 512 | |
| 513 | |
| 514 | |
| 515 | |
| 516 | |
| 517 | |
| 518 | |
| 519 | <li class="md-nav__item"> |
| 520 | <a href="getting-started/prerequisites/" class="md-nav__link"> |
| 521 | |
| 522 | |
| 523 | |
| 524 | <span class="md-ellipsis"> |
| 525 | |
| 526 | |
| 527 | Prerequisites |
| 528 | |
| 529 | |
| 530 | |
| 531 | </span> |
| 532 | |
| 533 | |
| 534 | |
| 535 | </a> |
| 536 | </li> |
| 537 | |
| 538 | |
| 539 | |
| 540 | |
| 541 | |
| 542 | |
| 543 | |
| 544 | |
| 545 | |
| 546 | |
| 547 | <li class="md-nav__item"> |
| 548 | <a href="getting-started/installation/" class="md-nav__link"> |
| 549 | |
| 550 | |
| 551 | |
| 552 | <span class="md-ellipsis"> |
| 553 | |
| 554 | |
| 555 | Installation |
| 556 | |
| 557 | |
| 558 | |
| 559 | </span> |
| 560 | |
| 561 | |
| 562 | |
| 563 | </a> |
| 564 | </li> |
| 565 | |
| 566 | |
| 567 | |
| 568 | |
| 569 | |
| 570 | |
| 571 | |
| 572 | |
| 573 | |
| 574 | |
| 575 | <li class="md-nav__item"> |
| 576 | <a href="getting-started/configuration/" class="md-nav__link"> |
| 577 | |
| 578 | |
| 579 | |
| 580 | <span class="md-ellipsis"> |
| 581 | |
| 582 | |
| 583 | Configuration |
| 584 | |
| 585 | |
| 586 | |
| 587 | </span> |
| 588 | |
| 589 | |
| 590 | |
| 591 | </a> |
| 592 | </li> |
| 593 | |
| 594 | |
| 595 | |
| 596 | |
| 597 | |
| 598 | |
| 599 | |
| 600 | |
| 601 | |
| 602 | |
| 603 | <li class="md-nav__item"> |
| 604 | <a href="getting-started/first-repo/" class="md-nav__link"> |
| 605 | |
| 606 | |
| 607 | |
| 608 | <span class="md-ellipsis"> |
| 609 | |
| 610 | |
| 611 | First Repository |
| 612 | |
| 613 | |
| 614 | |
| 615 | </span> |
| 616 | |
| 617 | |
| 618 | |
| 619 | </a> |
| 620 | </li> |
| 621 | |
| 622 | |
| 623 | |
| 624 | |
| 625 | </ul> |
| 626 | </nav> |
| 627 | |
| 628 | </li> |
| 629 | |
| 630 | |
| 631 | |
| 632 | |
| 633 | |
| 634 | |
| 635 | |
| 636 | |
| 637 | |
| 638 | |
| 639 | |
| 640 | |
| 641 | |
| 642 | |
| 643 | |
| 644 | |
| 645 | |
| 646 | |
| 647 | |
| 648 | <li class="md-nav__item md-nav__item--nested"> |
| 649 | |
| 650 | |
| 651 | |
| 652 | |
| 653 | |
| 654 | <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" > |
| 655 | |
| 656 | |
| 657 | <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> |
| 658 | |
| 659 | |
| 660 | |
| 661 | <span class="md-ellipsis"> |
| 662 | |
| 663 | |
| 664 | Architecture |
| 665 | |
| 666 | |
| 667 | |
| 668 | </span> |
| 669 | |
| 670 | |
| 671 | |
| 672 | <span class="md-nav__icon md-icon"></span> |
| 673 | </label> |
| 674 | |
| 675 | <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false"> |
| 676 | <label class="md-nav__title" for="__nav_3"> |
| 677 | <span class="md-nav__icon md-icon"></span> |
| 678 | |
| 679 | |
| 680 | Architecture |
| 681 | |
| 682 | |
| 683 | </label> |
| 684 | <ul class="md-nav__list" data-md-scrollfix> |
| 685 | |
| 686 | |
| 687 | |
| 688 | |
| 689 | |
| 690 | |
| 691 | |
| 692 | <li class="md-nav__item"> |
| 693 | <a href="architecture/overview/" class="md-nav__link"> |
| 694 | |
| 695 | |
| 696 | |
| 697 | <span class="md-ellipsis"> |
| 698 | |
| 699 | |
| 700 | Overview |
| 701 | |
| 702 | |
| 703 | |
| 704 | </span> |
| 705 | |
| 706 | |
| 707 | |
| 708 | </a> |
| 709 | </li> |
| 710 | |
| 711 | |
| 712 | |
| 713 | |
| 714 | |
| 715 | |
| 716 | |
| 717 | |
| 718 | |
| 719 | |
| 720 | <li class="md-nav__item"> |
| 721 | <a href="architecture/sync-bridge/" class="md-nav__link"> |
| 722 | |
| 723 | |
| 724 | |
| 725 | <span class="md-ellipsis"> |
| 726 | |
| 727 | |
| 728 | Sync Bridge |
| 729 | |
| 730 | |
| 731 | |
| 732 | </span> |
| 733 | |
| 734 | |
| 735 | |
| 736 | </a> |
| 737 | </li> |
| 738 | |
| 739 | |
| 740 | |
| 741 | |
| 742 | </ul> |
| 743 | </nav> |
| 744 | |
| 745 | </li> |
| 746 | |
| 747 | |
| 748 | |
| 749 | </ul> |
| 750 | </nav> |
| 751 | </div> |
| 752 | </div> |
| 753 | </div> |
| 754 | |
| 755 | |
| 756 | |
| 757 | <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > |
| 758 | <div class="md-sidebar__scrollwrap"> |
| 759 | <div class="md-sidebar__inner"> |
| 760 | |
| 761 | |
| 762 | <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> |
| 763 | |
| 764 | |
| 765 | |
| 766 | |
| 767 | |
| 768 | |
| 769 | <label class="md-nav__title" for="__toc"> |
| 770 | <span class="md-nav__icon md-icon"></span> |
| 771 | Table of contents |
| 772 | </label> |
| 773 | <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> |
| 774 | |
| 775 | <li class="md-nav__item"> |
| 776 | <a href="#why-fossil" class="md-nav__link"> |
| 777 | <span class="md-ellipsis"> |
| 778 | |
| 779 | Why Fossil? |
| 780 | |
| 781 | </span> |
| 782 | </a> |
| 783 | |
| 784 | </li> |
| 785 | |
| 786 | <li class="md-nav__item"> |
| 787 | <a href="#what-you-get" class="md-nav__link"> |
| 788 | <span class="md-ellipsis"> |
| 789 | |
| 790 | What You Get |
| 791 | |
| 792 | </span> |
| 793 | </a> |
| 794 | |
| 795 | </li> |
| 796 | |
| 797 | <li class="md-nav__item"> |
| 798 | <a href="#quick-start" class="md-nav__link"> |
| 799 | <span class="md-ellipsis"> |
| 800 | |
| 801 | Quick Start |
| 802 | |
| 803 | </span> |
| 804 | </a> |
| 805 | |
| 806 | </li> |
| 807 | |
| 808 | <li class="md-nav__item"> |
| 809 | <a href="#architecture" class="md-nav__link"> |
| 810 | <span class="md-ellipsis"> |
| 811 | |
| 812 | Architecture |
| 813 | |
| 814 | </span> |
| 815 | </a> |
| 816 | |
| 817 | </li> |
| 818 | |
| 819 | <li class="md-nav__item"> |
| 820 | <a href="#license" class="md-nav__link"> |
| 821 | <span class="md-ellipsis"> |
| 822 | |
| 823 | License |
| 824 | |
| 825 | </span> |
| 826 | </a> |
| 827 | |
| 828 | </li> |
| 829 | |
| 830 | </ul> |
| 831 | |
| 832 | </nav> |
| 833 | </div> |
| 834 | </div> |
| 835 | </div> |
| 836 | |
| 837 | |
| 838 | |
| 839 | <div class="md-content" data-md-component="content"> |
| 840 | |
| 841 | <article class="md-content__inner md-typeset"> |
| 842 | |
| 843 | |
| 844 | |
| 845 | |
| 846 | |
| 847 | |
| 848 | |
| 849 | |
| 850 | <h1 id="fossilrepo">Fossilrepo<a class="headerlink" href="#fossilrepo" title="Permanent link">¶</a></h1> |
| 851 | <p><strong>Self-hosted Fossil forge. One command, full-stack code hosting.</strong></p> |
| 852 | <p>Fossilrepo is an omnibus-style installer for a production Fossil SCM server. It packages Fossil, Caddy (SSL/routing), Litestream (S3 backups), and a Django management layer into a single deployable unit.</p> |
| 853 | <p>Think GitLab Omnibus, but for Fossil.</p> |
| 854 | <h2 id="why-fossil">Why Fossil?<a class="headerlink" href="#why-fossil" title="Permanent link">¶</a></h2> |
| 855 | <p>A Fossil repository is a single SQLite file containing the full VCS history, issue tracker, wiki, forum, and timeline. No external services. No rate limits. Portable -- hand the file to someone and they have everything.</p> |
| 856 | <ul> |
| 857 | <li><strong>Single-file repos</strong> -- each <code>.fossil</code> file is the entire project</li> |
| 858 | <li><strong>Built-in everything</strong> -- issues, wiki, forum, timeline, web UI</li> |
| 859 | <li><strong>No API rate limits</strong> -- ideal for CI agents and automation</li> |
| 860 | <li><strong>Litestream replication</strong> -- continuous backup to S3 for free</li> |
| 861 | </ul> |
| 862 | <h2 id="what-you-get">What You Get<a class="headerlink" href="#what-you-get" title="Permanent link">¶</a></h2> |
| 863 | <table> |
| 864 | <thead> |
| 865 | <tr> |
| 866 | <th>Component</th> |
| 867 | <th>Role</th> |
| 868 | </tr> |
| 869 | </thead> |
| 870 | <tbody> |
| 871 | <tr> |
| 872 | <td><strong>Fossil server</strong></td> |
| 873 | <td>Serves all repos from a single process</td> |
| 874 | </tr> |
| 875 | <tr> |
| 876 | <td><strong>Caddy</strong></td> |
| 877 | <td>SSL termination, subdomain-per-repo routing</td> |
| 878 | </tr> |
| 879 | <tr> |
| 880 | <td><strong>Litestream</strong></td> |
| 881 | <td>Continuous SQLite replication to S3/MinIO</td> |
| 882 | </tr> |
| 883 | <tr> |
| 884 | <td><strong>Django management UI</strong></td> |
| 885 | <td>Repository lifecycle, user management, dashboards</td> |
| 886 | </tr> |
| 887 | <tr> |
| 888 | <td><strong>Sync bridge</strong></td> |
| 889 | <td>Mirror Fossil repos to GitHub/GitLab (read-only)</td> |
| 890 | </tr> |
| 891 | <tr> |
| 892 | <td><strong>Celery workers</strong></td> |
| 893 | <td>Background sync, scheduled tasks</td> |
| 894 | </tr> |
| 895 | </tbody> |
| 896 | </table> |
| 897 | <h2 id="quick-start">Quick Start<a class="headerlink" href="#quick-start" title="Permanent link">¶</a></h2> |
| 898 | <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># Clone the repo</span> |
| 899 | <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>git<span class="w"> </span>clone<span class="w"> </span>https://github.com/ConflictHQ/fossilrepo.git |
| 900 | <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="nb">cd</span><span class="w"> </span>fossilrepo |
| 901 | <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> |
| 902 | <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="c1"># Start the full stack</span> |
| 903 | <a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a>make<span class="w"> </span>build |
| 904 | <a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> |
| 905 | <a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="c1"># Seed development data</span> |
| 906 | <a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a>make<span class="w"> </span>seed |
| 907 | <a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a> |
| 908 | <a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a><span class="c1"># Open the dashboard</span> |
| 909 | <a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a>open<span class="w"> </span>http://localhost:8000 |
| 910 | </code></pre></div> |
| 911 | <h2 id="architecture">Architecture<a class="headerlink" href="#architecture" title="Permanent link">¶</a></h2> |
| 912 | <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>Caddy (SSL termination, routing, subdomain per repo) |
| 913 | <a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a> +-- fossil server --repolist /data/repos/ |
| 914 | <a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a> +-- /data/repos/ |
| 915 | <a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a> |-- projecta.fossil |
| 916 | <a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a> |-- projectb.fossil |
| 917 | <a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a> +-- ... |
| 918 | <a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a> |
| 919 | <a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a>Litestream -> S3/MinIO (continuous replication, point-in-time recovery) |
| 920 | </code></pre></div> |
| 921 | <p>New project = <code>fossil init</code>. No restart, no config change. Litestream picks it up automatically.</p> |
| 922 | <h2 id="license">License<a class="headerlink" href="#license" title="Permanent link">¶</a></h2> |
| 923 | <p>MIT License -- Copyright (c) 2026 CONFLICT LLC.</p> |
| 924 | |
| 925 | |
| 926 | |
| 927 | |
| 928 | |
| 929 | |
| 930 | |
| 931 | |
| 932 | |
| 933 | |
| 934 | |
| 935 | |
| 936 | |
| 937 | </article> |
| 938 | </div> |
| 939 | |
| 940 | |
| 941 | <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> |
| 942 | |
| 943 | <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> |
| 944 | </div> |
| 945 | |
| 946 | <button type="button" class="md-top md-icon" data-md-component="top" hidden> |
| 947 | |
| 948 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> |
| 949 | Back to top |
| 950 | </button> |
| 951 | |
| 952 | </main> |
| 953 | |
| 954 | <footer class="md-footer"> |
| 955 | |
| 956 | <div class="md-footer-meta md-typeset"> |
| 957 | <div class="md-footer-meta__inner md-grid"> |
| 958 | <div class="md-copyright"> |
| 959 | |
| 960 | <div class="md-copyright__highlight"> |
| 961 | Copyright © 2026 CONFLICT LLC |
| 962 | </div> |
| 963 | |
| 964 | |
| 965 | Made with |
| 966 | <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> |
| 967 | Material for MkDocs |
| 968 | </a> |
| 969 | |
| 970 | </div> |
| 971 | |
| 972 | |
| 973 | <div class="md-social"> |
| 974 | |
| 975 | |
| 976 | |
| 977 | |
| 978 | |
| 979 | |
| 980 | |
| 981 | |
| 982 | <a href="https://github.com/ConflictHQ/fossilrepo" target="_blank" rel="noopener" title="github.com" class="md-social__link"> |
| 983 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> |
| 984 | </a> |
| 985 | |
| 986 | </div> |
| 987 | |
| 988 | </div> |
| 989 | </div> |
| 990 | </footer> |
| 991 | |
| 992 | </div> |
| 993 | <div class="md-dialog" data-md-component="dialog"> |
| 994 | <div class="md-dialog__inner md-typeset"></div> |
| 995 | </div> |
| 996 | |
| 997 | |
| 998 | |
| 999 | |
| 1000 | |
| 1001 | <script id="__config" type="application/json">{"annotate": null, "base": ".", "features": ["navigation.instant", "navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.copy", "content.tabs.link", "header.autohide"], "search": "assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> |
| 1002 | |
| 1003 | |
| 1004 | <script src="assets/javascripts/bundle.79ae519e.min.js"></script> |
| 1005 | |
| 1006 | |
| 1007 | </body> |
| 1008 | </html> |
| --- a/site/overrides/partials/logo.html | ||
| +++ b/site/overrides/partials/logo.html | ||
| @@ -0,0 +1,4 @@ | ||
| 1 | +<div style="display: flex; align-items: center; gap: 0.6rem;"> | |
| 2 | + <img src="{{ 'assets/images/conflict-logo.svg' | url }}" alt="CONFLICT" style="height: 1.4rem; width: auto;"> | |
| 3 | + <img src="{{ 'assets/images/fossilrepo-logo.svg' | url }}" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> | |
| 4 | +</div> |
| --- a/site/overrides/partials/logo.html | |
| +++ b/site/overrides/partials/logo.html | |
| @@ -0,0 +1,4 @@ | |
| --- a/site/overrides/partials/logo.html | |
| +++ b/site/overrides/partials/logo.html | |
| @@ -0,0 +1,4 @@ | |
| 1 | <div style="display: flex; align-items: center; gap: 0.6rem;"> |
| 2 | <img src="{{ 'assets/images/conflict-logo.svg' | url }}" alt="CONFLICT" style="height: 1.4rem; width: auto;"> |
| 3 | <img src="{{ 'assets/images/fossilrepo-logo.svg' | url }}" alt="Fossilrepo" style="height: 1.2rem; width: auto;"> |
| 4 | </div> |
| --- a/site/search/search_index.json | ||
| +++ b/site/search/search_index.json | ||
| @@ -0,0 +1 @@ | ||
| 1 | +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Fossilrepo","text":"<p>Self-hosted Fossil forge. One command, full-stack code hosting.</p> <p>Fossilrepo is an omnibus-style installer for a production Fossil SCM server. It packages Fossil, Caddy (SSL/routing), Litestream (S3 backups), and a Django management layer into a single deployable unit.</p> <p>Think GitLab Omnibus, but for Fossil.</p>"},{"location":"#why-fossil","title":"Why Fossil?","text":"<p>A Fossil repository is a single SQLite file containing the full VCS history, issue tracker, wiki, forum, and timeline. No external services. No rate limits. Portable -- hand the file to someone and they have everything.</p> <ul> <li>Single-file repos -- each <code>.fossil</code> file is the entire project</li> <li>Built-in everything -- issues, wiki, forum, timeline, web UI</li> <li>No API rate limits -- ideal for CI agents and automation</li> <li>Litestream replication -- continuous backup to S3 for free</li> </ul>"},{"location":"#what-you-get","title":"What You Get","text":"Component Role Fossil server Serves all repos from a single process Caddy SSL termination, subdomain-per-repo routing Litestream Continuous SQLite replication to S3/MinIO Django management UI Repository lifecycle, user management, dashboards Sync bridge Mirror Fossil repos to GitHub/GitLab (read-only) Celery workers Background sync, scheduled tasks"},{"location":"#quick-start","title":"Quick Start","text":"<pre><code># Clone the repo\ngit clone https://github.com/ConflictHQ/fossilrepo.git\ncd fossilrepo\n\n# Start the full stack\nmake build\n\n# Seed development data\nmake seed\n\n# Open the dashboard\nopen http://localhost:8000\n</code></pre>"},{"location":"#architecture","title":"Architecture","text":"<pre><code>Caddy (SSL termination, routing, subdomain per repo)\n +-- fossil server --repolist /data/repos/\n +-- /data/repos/\n |-- projecta.fossil\n |-- projectb.fossil\n +-- ...\n\nLitestream -> S3/MinIO (continuous replication, point-in-time recovery)\n</code></pre> <p>New project = <code>fossil init</code>. No restart, no config change. Litestream picks it up automatically.</p>"},{"location":"#license","title":"License","text":"<p>MIT License -- Copyright (c) 2026 CONFLICT LLC.</p>"},{"location":"architecture/overview/","title":"Architecture Overview","text":"<p>Fossilrepo is a thin orchestration layer around Fossil SCM. Fossil does the heavy lifting -- fossilrepo handles provisioning, routing, backups, and the management UI.</p>"},{"location":"architecture/overview/#system-diagram","title":"System Diagram","text":"<pre><code>graph TB\n subgraph Internet\n User[User / Browser]\n end\n\n subgraph Fossilrepo Server\n Caddy[Caddy<br/>SSL + Routing]\n Django[Django<br/>Management UI]\n Fossil[Fossil Server<br/>--repolist]\n Celery[Celery Workers]\n Redis[Redis]\n Postgres[(PostgreSQL)]\n Litestream[Litestream]\n end\n\n subgraph Storage\n Repos[\"/data/repos/<br/>*.fossil files\"]\n S3[(S3 / MinIO)]\n end\n\n subgraph Mirrors\n GitHub[GitHub]\n GitLab[GitLab]\n end\n\n User --> Caddy\n Caddy -->|\"app.domain.com\"| Django\n Caddy -->|\"repo.domain.com\"| Fossil\n Django --> Postgres\n Django --> Redis\n Celery --> Redis\n Celery -->|sync bridge| GitHub\n Celery -->|sync bridge| GitLab\n Fossil --> Repos\n Litestream --> Repos\n Litestream --> S3</code></pre>"},{"location":"architecture/overview/#components","title":"Components","text":""},{"location":"architecture/overview/#fossil-server","title":"Fossil Server","text":"<p>A single <code>fossil server --repolist /data/repos/</code> process serves all repositories. Each <code>.fossil</code> file is a self-contained SQLite database with VCS history, issues, wiki, and forum.</p> <p>Adding a new repo is just <code>fossil init /data/repos/name.fossil</code> -- no restart needed.</p>"},{"location":"architecture/overview/#caddy","title":"Caddy","text":"<p>Handles SSL termination and subdomain routing:</p> <ul> <li><code>your-domain.com</code> routes to the Django management UI</li> <li><code>reponame.your-domain.com</code> routes directly to Fossil's web UI</li> </ul> <p>Caddy automatically provisions and renews Let's Encrypt certificates.</p>"},{"location":"architecture/overview/#django-management-layer","title":"Django Management Layer","text":"<p>Provides the administrative interface:</p> <ul> <li>Repository lifecycle (create, configure, archive)</li> <li>User and organization management</li> <li>Dashboard and analytics</li> <li>Sync bridge configuration</li> </ul> <p>Django uses HTMX for interactive UI without a JavaScript framework.</p>"},{"location":"architecture/overview/#litestream","title":"Litestream","text":"<p>Continuously replicates every <code>.fossil</code> SQLite file to S3-compatible storage. Provides:</p> <ul> <li>Continuous backup -- WAL frames replicated in near-real-time</li> <li>Point-in-time recovery -- restore to any moment, not just snapshots</li> <li>Zero-config per repo -- new <code>.fossil</code> files are picked up automatically</li> </ul>"},{"location":"architecture/overview/#celery-workers","title":"Celery Workers","text":"<p>Handle background tasks:</p> <ul> <li>Sync bridge execution (Fossil to Git mirroring)</li> <li>Scheduled sync jobs</li> <li>Upstream pull operations</li> </ul>"},{"location":"architecture/overview/#data-flow","title":"Data Flow","text":"<ol> <li>User pushes to Fossil -- standard <code>fossil push</code> or <code>fossil sync</code></li> <li>Fossil writes to <code>.fossil</code> file -- SQLite transactions</li> <li>Litestream replicates -- WAL frames streamed to S3</li> <li>Sync bridge runs -- Celery task mirrors changes to Git remotes</li> <li>Django reflects state -- reads from Fossil SQLite for dashboards</li> </ol> <p>Fossil is always the source of truth. Everything else is derived.</p>"},{"location":"architecture/sync-bridge/","title":"Sync Bridge","text":"<p>The sync bridge mirrors Fossil repositories to GitHub and GitLab as downstream read-only copies.</p>"},{"location":"architecture/sync-bridge/#how-it-works","title":"How It Works","text":"<pre><code>flowchart LR\n Fossil[\"Fossil Repo<br/>(source of truth)\"] --> Bridge[\"Sync Bridge<br/>(Celery task)\"]\n Bridge --> Git[\"Git Export\"]\n Git --> GitHub[\"GitHub Mirror\"]\n Git --> GitLab[\"GitLab Mirror\"]</code></pre> <p>The bridge:</p> <ol> <li>Exports Fossil commits as Git commits</li> <li>Pushes to configured Git remotes</li> <li>Optionally syncs tickets to GitHub/GitLab Issues</li> <li>Optionally syncs wiki pages to repo docs</li> </ol>"},{"location":"architecture/sync-bridge/#what-gets-synced","title":"What Gets Synced","text":"Fossil Artifact Git Target Configurable Commits Git commits Always Tags Git tags Always Branches Git branches Always Tickets GitHub/GitLab Issues Optional Wiki Repository docs Optional"},{"location":"architecture/sync-bridge/#configuration","title":"Configuration","text":"<p>Set up mirroring through the Django management UI or environment variables:</p> <pre><code># GitHub mirror\nGITHUB_TOKEN=ghp_xxxxxxxxxxxx\n\n# GitLab mirror\nGITLAB_TOKEN=glpat-xxxxxxxxxxxx\n</code></pre> <p>Per-repository mirror configuration is managed in the dashboard under Repository Settings > Sync.</p>"},{"location":"architecture/sync-bridge/#sync-modes","title":"Sync Modes","text":""},{"location":"architecture/sync-bridge/#on-demand","title":"On-Demand","text":"<p>Trigger a sync manually from the dashboard or CLI:</p> <pre><code>docker compose exec django python manage.py fossil_sync my-project\n</code></pre>"},{"location":"architecture/sync-bridge/#scheduled","title":"Scheduled","text":"<p>Configure a Celery Beat schedule to sync at regular intervals:</p> <pre><code># Runs every 15 minutes\nCELERY_BEAT_SCHEDULE = {\n 'sync-all-repos': {\n 'task': 'fossil.tasks.sync_all',\n 'schedule': 900.0,\n },\n}\n</code></pre>"},{"location":"architecture/sync-bridge/#upstream-pull","title":"Upstream Pull","text":"<p>Pull updates from a remote Fossil server into your local instance:</p> <pre><code>docker compose exec django python manage.py fossil_pull my-project\n</code></pre> <p>Direction matters</p> <p>The sync bridge is one-way: Fossil to Git. Changes pushed directly to a Git mirror will be overwritten on the next sync. Always push to the Fossil repo.</p>"},{"location":"getting-started/configuration/","title":"Configuration","text":""},{"location":"getting-started/configuration/#environment-variables","title":"Environment Variables","text":"<p>All configuration is done through environment variables, loaded from <code>.env</code> in development.</p>"},{"location":"getting-started/configuration/#django-settings","title":"Django Settings","text":"Variable Default Description <code>SECRET_KEY</code> -- Django secret key (required) <code>DEBUG</code> <code>False</code> Enable debug mode <code>ALLOWED_HOSTS</code> <code>localhost</code> Comma-separated list of allowed hosts <code>TIME_ZONE</code> <code>UTC</code> Server timezone"},{"location":"getting-started/configuration/#database","title":"Database","text":"Variable Default Description <code>POSTGRES_DB</code> <code>fossilrepo</code> Database name <code>POSTGRES_USER</code> <code>fossilrepo</code> Database user <code>POSTGRES_PASSWORD</code> -- Database password (required) <code>POSTGRES_HOST</code> <code>postgres</code> Database host <code>POSTGRES_PORT</code> <code>5432</code> Database port"},{"location":"getting-started/configuration/#redis-celery","title":"Redis & Celery","text":"Variable Default Description <code>REDIS_URL</code> <code>redis://redis:6379/0</code> Redis connection URL <code>CELERY_BROKER_URL</code> <code>$REDIS_URL</code> Celery broker (defaults to Redis URL)"},{"location":"getting-started/configuration/#fossil","title":"Fossil","text":"Variable Default Description <code>FOSSIL_REPO_DIR</code> <code>/data/repos</code> Directory where <code>.fossil</code> files are stored <code>FOSSIL_BASE_URL</code> -- Base URL for Fossil web UI (e.g., <code>https://code.example.com</code>) <code>FOSSIL_BINARY</code> <code>fossil</code> Path to the Fossil binary"},{"location":"getting-started/configuration/#caddy-production","title":"Caddy (Production)","text":"Variable Default Description <code>CADDY_DOMAIN</code> -- Your domain (e.g., <code>example.com</code>) <code>CADDY_EMAIL</code> -- Email for Let's Encrypt certificates"},{"location":"getting-started/configuration/#litestream-backups","title":"Litestream (Backups)","text":"Variable Default Description <code>LITESTREAM_ACCESS_KEY_ID</code> -- S3 access key <code>LITESTREAM_SECRET_ACCESS_KEY</code> -- S3 secret key <code>LITESTREAM_BUCKET</code> -- S3 bucket name <code>LITESTREAM_ENDPOINT</code> -- S3 endpoint (for MinIO/B2) <code>LITESTREAM_REGION</code> <code>us-east-1</code> S3 region"},{"location":"getting-started/configuration/#sync-bridge","title":"Sync Bridge","text":"Variable Default Description <code>GITHUB_TOKEN</code> -- GitHub personal access token (for mirroring) <code>GITLAB_TOKEN</code> -- GitLab personal access token (for mirroring)"},{"location":"getting-started/configuration/#caddy-configuration","title":"Caddy Configuration","text":"<p>The Caddyfile controls SSL termination and subdomain routing. Each Fossil repo gets its own subdomain:</p> <pre><code>{$CADDY_DOMAIN} {\n reverse_proxy django:8000\n}\n\n*.{$CADDY_DOMAIN} {\n reverse_proxy fossil:8080\n}\n</code></pre> <p>Caddy automatically provisions Let's Encrypt certificates for all subdomains.</p>"},{"location":"getting-started/configuration/#litestream-configuration","title":"Litestream Configuration","text":"<p>Litestream continuously replicates every <code>.fossil</code> SQLite file to S3:</p> <pre><code>dbs:\n - path: /data/repos/*.fossil\n replicas:\n - type: s3\n bucket: ${LITESTREAM_BUCKET}\n endpoint: ${LITESTREAM_ENDPOINT}\n region: ${LITESTREAM_REGION}\n</code></pre> <p>Point-in-time recovery</p> <p>Litestream replicates WAL frames continuously. You can restore any <code>.fossil</code> file to any point in time, not just the latest snapshot.</p>"},{"location":"getting-started/first-repo/","title":"Creating Your First Repository","text":"<p>Once fossilrepo is running, you can create your first Fossil repository.</p>"},{"location":"getting-started/first-repo/#via-the-dashboard","title":"Via the Dashboard","text":"<ol> <li>Log in at <code>http://localhost:8000</code></li> <li>Navigate to Repositories in the sidebar</li> <li>Click Create Repository</li> <li>Enter a name (e.g., <code>my-project</code>)</li> <li>Click Create</li> </ol> <p>The repository is immediately available at <code>my-project.your-domain.com</code> (production) or through the local Fossil server (development).</p>"},{"location":"getting-started/first-repo/#via-the-cli","title":"Via the CLI","text":"<pre><code># Inside the fossilrepo container\ndocker compose exec django python manage.py fossil_create my-project\n</code></pre> <p>This runs <code>fossil init</code>, registers the repo in the database, and (in production) Caddy automatically routes the subdomain.</p>"},{"location":"getting-started/first-repo/#what-happens-under-the-hood","title":"What Happens Under the Hood","text":"<pre><code>sequenceDiagram\n participant User\n participant Django\n participant Fossil\n participant Litestream\n participant S3\n\n User->>Django: Create repo \"my-project\"\n Django->>Fossil: fossil init /data/repos/my-project.fossil\n Fossil-->>Django: Repository created\n Django->>Django: Register in database\n Litestream->>S3: Begin replicating my-project.fossil\n Django-->>User: Repository ready</code></pre>"},{"location":"getting-started/first-repo/#accessing-your-repository","title":"Accessing Your Repository","text":""},{"location":"getting-started/first-repo/#web-ui","title":"Web UI","text":"<p>Fossil includes a built-in web interface with:</p> <ul> <li>Timeline -- commit history with diffs</li> <li>Tickets -- issue tracker</li> <li>Wiki -- project documentation</li> <li>Forum -- discussions</li> </ul>"},{"location":"getting-started/first-repo/#clone-via-fossil","title":"Clone via Fossil","text":"<pre><code>fossil clone https://my-project.your-domain.com my-project.fossil\nfossil open my-project.fossil\n</code></pre>"},{"location":"getting-started/first-repo/#clone-via-git-mirror","title":"Clone via Git (Mirror)","text":"<p>If you've configured the sync bridge:</p> <pre><code>git clone https://github.com/your-org/my-project.git\n</code></pre> <p>Read-only mirror</p> <p>Git mirrors are downstream copies. Push changes to the Fossil repo -- they'll sync to Git automatically.</p>"},{"location":"getting-started/first-repo/#next-steps","title":"Next Steps","text":"<ul> <li>Configure the sync bridge to mirror to GitHub/GitLab</li> <li>Set up backups with Litestream</li> <li>Explore the architecture overview</li> </ul>"},{"location":"getting-started/installation/","title":"Installation","text":""},{"location":"getting-started/installation/#clone-the-repository","title":"Clone the Repository","text":"<pre><code>git clone https://github.com/ConflictHQ/fossilrepo.git\ncd fossilrepo\n</code></pre>"},{"location":"getting-started/installation/#environment-configuration","title":"Environment Configuration","text":"<p>Copy the example environment file and configure it:</p> <pre><code>cp .env.example .env\n</code></pre> <p>Edit <code>.env</code> with your settings:</p> <pre><code># Django\nSECRET_KEY=your-secret-key-here\nDEBUG=True\nALLOWED_HOSTS=localhost,127.0.0.1\n\n# Database\nPOSTGRES_DB=fossilrepo\nPOSTGRES_USER=fossilrepo\nPOSTGRES_PASSWORD=your-db-password\n\n# Redis\nREDIS_URL=redis://redis:6379/0\n\n# Fossil\nFOSSIL_REPO_DIR=/data/repos\nFOSSIL_BASE_URL=https://your-domain.com\n</code></pre>"},{"location":"getting-started/installation/#start-the-stack","title":"Start the Stack","text":""},{"location":"getting-started/installation/#development","title":"Development","text":"<pre><code># Build and start all services\nmake build\n\n# Run database migrations\nmake migrate\n\n# Create an admin user\nmake superuser\n\n# Load sample data (optional)\nmake seed\n</code></pre> <p>The development stack includes:</p> <ul> <li>Django dev server on <code>http://localhost:8000</code></li> <li>PostgreSQL 16</li> <li>Redis</li> <li>Celery worker + beat</li> <li>Mailpit on <code>http://localhost:8025</code></li> </ul>"},{"location":"getting-started/installation/#production","title":"Production","text":"<p>For production, you'll also configure Caddy and Litestream:</p> <pre><code># Copy production configs\ncp docker/Caddyfile.example docker/Caddyfile\ncp docker/litestream.yml.example docker/litestream.yml\n\n# Edit with your domain and S3 credentials\n# Then start with the production compose file\ndocker compose -f docker-compose.yml -f docker-compose.prod.yml up -d\n</code></pre>"},{"location":"getting-started/installation/#verify-installation","title":"Verify Installation","text":"<pre><code># Check all services are running\ndocker compose ps\n\n# Hit the health endpoint\ncurl http://localhost:8000/health/\n\n# Open the dashboard\nopen http://localhost:8000\n</code></pre> <p>You should see</p> <p>The fossilrepo dashboard with navigation, login page, and (after seeding) sample repositories.</p>"},{"location":"getting-started/installation/#common-issues","title":"Common Issues","text":"Port 8000 already in use <p>Change the Django port mapping in <code>docker-compose.yml</code>: <pre><code>ports:\n - \"8001:8000\"\n</code></pre></p> Database connection refused <p>Ensure PostgreSQL has started before Django: <pre><code>docker compose logs postgres\n</code></pre> The Django container waits for Postgres to be ready, but network issues on some Docker Desktop versions can cause timeouts. Restart with <code>make down && make up</code>.</p> Permission denied on /data/repos <p>The Fossil repo directory needs to be writable by the container user: <pre><code>sudo chown -R 1000:1000 /data/repos\n</code></pre></p>"},{"location":"getting-started/prerequisites/","title":"Prerequisites","text":"<p>Before installing fossilrepo, ensure your server meets these requirements.</p>"},{"location":"getting-started/prerequisites/#system-requirements","title":"System Requirements","text":"Requirement Minimum OS Linux (Ubuntu 22.04+, Debian 12+, RHEL 9+) or macOS 13+ CPU 1 vCPU RAM 1 GB Disk 10 GB (scales with repo count) Python 3.12+"},{"location":"getting-started/prerequisites/#required-software","title":"Required Software","text":""},{"location":"getting-started/prerequisites/#docker-docker-compose","title":"Docker & Docker Compose","text":"<p>Fossilrepo runs its infrastructure stack via Docker Compose.</p> Ubuntu/DebianmacOS <pre><code># Install Docker\ncurl -fsSL https://get.docker.com | sh\nsudo usermod -aG docker $USER\n\n# Verify\ndocker compose version\n</code></pre> <pre><code># Install Docker Desktop\nbrew install --cask docker\n\n# Verify\ndocker compose version\n</code></pre>"},{"location":"getting-started/prerequisites/#git","title":"Git","text":"<p>Required for the sync bridge (mirroring to GitHub/GitLab).</p> <pre><code>git --version # 2.30+\n</code></pre>"},{"location":"getting-started/prerequisites/#make","title":"Make","text":"<p>Used for running common commands.</p> <pre><code>make --version\n</code></pre>"},{"location":"getting-started/prerequisites/#optional-s3-compatible-storage","title":"Optional: S3-Compatible Storage","text":"<p>For continuous backups via Litestream, you need an S3-compatible bucket:</p> <ul> <li>AWS S3</li> <li>MinIO (self-hosted)</li> <li>Backblaze B2</li> <li>DigitalOcean Spaces</li> </ul> <p>Local development</p> <p>S3 is not required for local development. Litestream is disabled by default in the dev Docker Compose configuration.</p>"},{"location":"getting-started/prerequisites/#ports","title":"Ports","text":"<p>The following ports are used by the stack:</p> Port Service <code>8000</code> Django (management UI) <code>443</code> Caddy (HTTPS, production) <code>80</code> Caddy (HTTP redirect, production) <code>5432</code> PostgreSQL <code>6379</code> Redis <code>8025</code> Mailpit (dev only)"}]} |
| --- a/site/search/search_index.json | |
| +++ b/site/search/search_index.json | |
| @@ -0,0 +1 @@ | |
| --- a/site/search/search_index.json | |
| +++ b/site/search/search_index.json | |
| @@ -0,0 +1 @@ | |
| 1 | {"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Fossilrepo","text":"<p>Self-hosted Fossil forge. One command, full-stack code hosting.</p> <p>Fossilrepo is an omnibus-style installer for a production Fossil SCM server. It packages Fossil, Caddy (SSL/routing), Litestream (S3 backups), and a Django management layer into a single deployable unit.</p> <p>Think GitLab Omnibus, but for Fossil.</p>"},{"location":"#why-fossil","title":"Why Fossil?","text":"<p>A Fossil repository is a single SQLite file containing the full VCS history, issue tracker, wiki, forum, and timeline. No external services. No rate limits. Portable -- hand the file to someone and they have everything.</p> <ul> <li>Single-file repos -- each <code>.fossil</code> file is the entire project</li> <li>Built-in everything -- issues, wiki, forum, timeline, web UI</li> <li>No API rate limits -- ideal for CI agents and automation</li> <li>Litestream replication -- continuous backup to S3 for free</li> </ul>"},{"location":"#what-you-get","title":"What You Get","text":"Component Role Fossil server Serves all repos from a single process Caddy SSL termination, subdomain-per-repo routing Litestream Continuous SQLite replication to S3/MinIO Django management UI Repository lifecycle, user management, dashboards Sync bridge Mirror Fossil repos to GitHub/GitLab (read-only) Celery workers Background sync, scheduled tasks"},{"location":"#quick-start","title":"Quick Start","text":"<pre><code># Clone the repo\ngit clone https://github.com/ConflictHQ/fossilrepo.git\ncd fossilrepo\n\n# Start the full stack\nmake build\n\n# Seed development data\nmake seed\n\n# Open the dashboard\nopen http://localhost:8000\n</code></pre>"},{"location":"#architecture","title":"Architecture","text":"<pre><code>Caddy (SSL termination, routing, subdomain per repo)\n +-- fossil server --repolist /data/repos/\n +-- /data/repos/\n |-- projecta.fossil\n |-- projectb.fossil\n +-- ...\n\nLitestream -> S3/MinIO (continuous replication, point-in-time recovery)\n</code></pre> <p>New project = <code>fossil init</code>. No restart, no config change. Litestream picks it up automatically.</p>"},{"location":"#license","title":"License","text":"<p>MIT License -- Copyright (c) 2026 CONFLICT LLC.</p>"},{"location":"architecture/overview/","title":"Architecture Overview","text":"<p>Fossilrepo is a thin orchestration layer around Fossil SCM. Fossil does the heavy lifting -- fossilrepo handles provisioning, routing, backups, and the management UI.</p>"},{"location":"architecture/overview/#system-diagram","title":"System Diagram","text":"<pre><code>graph TB\n subgraph Internet\n User[User / Browser]\n end\n\n subgraph Fossilrepo Server\n Caddy[Caddy<br/>SSL + Routing]\n Django[Django<br/>Management UI]\n Fossil[Fossil Server<br/>--repolist]\n Celery[Celery Workers]\n Redis[Redis]\n Postgres[(PostgreSQL)]\n Litestream[Litestream]\n end\n\n subgraph Storage\n Repos[\"/data/repos/<br/>*.fossil files\"]\n S3[(S3 / MinIO)]\n end\n\n subgraph Mirrors\n GitHub[GitHub]\n GitLab[GitLab]\n end\n\n User --> Caddy\n Caddy -->|\"app.domain.com\"| Django\n Caddy -->|\"repo.domain.com\"| Fossil\n Django --> Postgres\n Django --> Redis\n Celery --> Redis\n Celery -->|sync bridge| GitHub\n Celery -->|sync bridge| GitLab\n Fossil --> Repos\n Litestream --> Repos\n Litestream --> S3</code></pre>"},{"location":"architecture/overview/#components","title":"Components","text":""},{"location":"architecture/overview/#fossil-server","title":"Fossil Server","text":"<p>A single <code>fossil server --repolist /data/repos/</code> process serves all repositories. Each <code>.fossil</code> file is a self-contained SQLite database with VCS history, issues, wiki, and forum.</p> <p>Adding a new repo is just <code>fossil init /data/repos/name.fossil</code> -- no restart needed.</p>"},{"location":"architecture/overview/#caddy","title":"Caddy","text":"<p>Handles SSL termination and subdomain routing:</p> <ul> <li><code>your-domain.com</code> routes to the Django management UI</li> <li><code>reponame.your-domain.com</code> routes directly to Fossil's web UI</li> </ul> <p>Caddy automatically provisions and renews Let's Encrypt certificates.</p>"},{"location":"architecture/overview/#django-management-layer","title":"Django Management Layer","text":"<p>Provides the administrative interface:</p> <ul> <li>Repository lifecycle (create, configure, archive)</li> <li>User and organization management</li> <li>Dashboard and analytics</li> <li>Sync bridge configuration</li> </ul> <p>Django uses HTMX for interactive UI without a JavaScript framework.</p>"},{"location":"architecture/overview/#litestream","title":"Litestream","text":"<p>Continuously replicates every <code>.fossil</code> SQLite file to S3-compatible storage. Provides:</p> <ul> <li>Continuous backup -- WAL frames replicated in near-real-time</li> <li>Point-in-time recovery -- restore to any moment, not just snapshots</li> <li>Zero-config per repo -- new <code>.fossil</code> files are picked up automatically</li> </ul>"},{"location":"architecture/overview/#celery-workers","title":"Celery Workers","text":"<p>Handle background tasks:</p> <ul> <li>Sync bridge execution (Fossil to Git mirroring)</li> <li>Scheduled sync jobs</li> <li>Upstream pull operations</li> </ul>"},{"location":"architecture/overview/#data-flow","title":"Data Flow","text":"<ol> <li>User pushes to Fossil -- standard <code>fossil push</code> or <code>fossil sync</code></li> <li>Fossil writes to <code>.fossil</code> file -- SQLite transactions</li> <li>Litestream replicates -- WAL frames streamed to S3</li> <li>Sync bridge runs -- Celery task mirrors changes to Git remotes</li> <li>Django reflects state -- reads from Fossil SQLite for dashboards</li> </ol> <p>Fossil is always the source of truth. Everything else is derived.</p>"},{"location":"architecture/sync-bridge/","title":"Sync Bridge","text":"<p>The sync bridge mirrors Fossil repositories to GitHub and GitLab as downstream read-only copies.</p>"},{"location":"architecture/sync-bridge/#how-it-works","title":"How It Works","text":"<pre><code>flowchart LR\n Fossil[\"Fossil Repo<br/>(source of truth)\"] --> Bridge[\"Sync Bridge<br/>(Celery task)\"]\n Bridge --> Git[\"Git Export\"]\n Git --> GitHub[\"GitHub Mirror\"]\n Git --> GitLab[\"GitLab Mirror\"]</code></pre> <p>The bridge:</p> <ol> <li>Exports Fossil commits as Git commits</li> <li>Pushes to configured Git remotes</li> <li>Optionally syncs tickets to GitHub/GitLab Issues</li> <li>Optionally syncs wiki pages to repo docs</li> </ol>"},{"location":"architecture/sync-bridge/#what-gets-synced","title":"What Gets Synced","text":"Fossil Artifact Git Target Configurable Commits Git commits Always Tags Git tags Always Branches Git branches Always Tickets GitHub/GitLab Issues Optional Wiki Repository docs Optional"},{"location":"architecture/sync-bridge/#configuration","title":"Configuration","text":"<p>Set up mirroring through the Django management UI or environment variables:</p> <pre><code># GitHub mirror\nGITHUB_TOKEN=ghp_xxxxxxxxxxxx\n\n# GitLab mirror\nGITLAB_TOKEN=glpat-xxxxxxxxxxxx\n</code></pre> <p>Per-repository mirror configuration is managed in the dashboard under Repository Settings > Sync.</p>"},{"location":"architecture/sync-bridge/#sync-modes","title":"Sync Modes","text":""},{"location":"architecture/sync-bridge/#on-demand","title":"On-Demand","text":"<p>Trigger a sync manually from the dashboard or CLI:</p> <pre><code>docker compose exec django python manage.py fossil_sync my-project\n</code></pre>"},{"location":"architecture/sync-bridge/#scheduled","title":"Scheduled","text":"<p>Configure a Celery Beat schedule to sync at regular intervals:</p> <pre><code># Runs every 15 minutes\nCELERY_BEAT_SCHEDULE = {\n 'sync-all-repos': {\n 'task': 'fossil.tasks.sync_all',\n 'schedule': 900.0,\n },\n}\n</code></pre>"},{"location":"architecture/sync-bridge/#upstream-pull","title":"Upstream Pull","text":"<p>Pull updates from a remote Fossil server into your local instance:</p> <pre><code>docker compose exec django python manage.py fossil_pull my-project\n</code></pre> <p>Direction matters</p> <p>The sync bridge is one-way: Fossil to Git. Changes pushed directly to a Git mirror will be overwritten on the next sync. Always push to the Fossil repo.</p>"},{"location":"getting-started/configuration/","title":"Configuration","text":""},{"location":"getting-started/configuration/#environment-variables","title":"Environment Variables","text":"<p>All configuration is done through environment variables, loaded from <code>.env</code> in development.</p>"},{"location":"getting-started/configuration/#django-settings","title":"Django Settings","text":"Variable Default Description <code>SECRET_KEY</code> -- Django secret key (required) <code>DEBUG</code> <code>False</code> Enable debug mode <code>ALLOWED_HOSTS</code> <code>localhost</code> Comma-separated list of allowed hosts <code>TIME_ZONE</code> <code>UTC</code> Server timezone"},{"location":"getting-started/configuration/#database","title":"Database","text":"Variable Default Description <code>POSTGRES_DB</code> <code>fossilrepo</code> Database name <code>POSTGRES_USER</code> <code>fossilrepo</code> Database user <code>POSTGRES_PASSWORD</code> -- Database password (required) <code>POSTGRES_HOST</code> <code>postgres</code> Database host <code>POSTGRES_PORT</code> <code>5432</code> Database port"},{"location":"getting-started/configuration/#redis-celery","title":"Redis & Celery","text":"Variable Default Description <code>REDIS_URL</code> <code>redis://redis:6379/0</code> Redis connection URL <code>CELERY_BROKER_URL</code> <code>$REDIS_URL</code> Celery broker (defaults to Redis URL)"},{"location":"getting-started/configuration/#fossil","title":"Fossil","text":"Variable Default Description <code>FOSSIL_REPO_DIR</code> <code>/data/repos</code> Directory where <code>.fossil</code> files are stored <code>FOSSIL_BASE_URL</code> -- Base URL for Fossil web UI (e.g., <code>https://code.example.com</code>) <code>FOSSIL_BINARY</code> <code>fossil</code> Path to the Fossil binary"},{"location":"getting-started/configuration/#caddy-production","title":"Caddy (Production)","text":"Variable Default Description <code>CADDY_DOMAIN</code> -- Your domain (e.g., <code>example.com</code>) <code>CADDY_EMAIL</code> -- Email for Let's Encrypt certificates"},{"location":"getting-started/configuration/#litestream-backups","title":"Litestream (Backups)","text":"Variable Default Description <code>LITESTREAM_ACCESS_KEY_ID</code> -- S3 access key <code>LITESTREAM_SECRET_ACCESS_KEY</code> -- S3 secret key <code>LITESTREAM_BUCKET</code> -- S3 bucket name <code>LITESTREAM_ENDPOINT</code> -- S3 endpoint (for MinIO/B2) <code>LITESTREAM_REGION</code> <code>us-east-1</code> S3 region"},{"location":"getting-started/configuration/#sync-bridge","title":"Sync Bridge","text":"Variable Default Description <code>GITHUB_TOKEN</code> -- GitHub personal access token (for mirroring) <code>GITLAB_TOKEN</code> -- GitLab personal access token (for mirroring)"},{"location":"getting-started/configuration/#caddy-configuration","title":"Caddy Configuration","text":"<p>The Caddyfile controls SSL termination and subdomain routing. Each Fossil repo gets its own subdomain:</p> <pre><code>{$CADDY_DOMAIN} {\n reverse_proxy django:8000\n}\n\n*.{$CADDY_DOMAIN} {\n reverse_proxy fossil:8080\n}\n</code></pre> <p>Caddy automatically provisions Let's Encrypt certificates for all subdomains.</p>"},{"location":"getting-started/configuration/#litestream-configuration","title":"Litestream Configuration","text":"<p>Litestream continuously replicates every <code>.fossil</code> SQLite file to S3:</p> <pre><code>dbs:\n - path: /data/repos/*.fossil\n replicas:\n - type: s3\n bucket: ${LITESTREAM_BUCKET}\n endpoint: ${LITESTREAM_ENDPOINT}\n region: ${LITESTREAM_REGION}\n</code></pre> <p>Point-in-time recovery</p> <p>Litestream replicates WAL frames continuously. You can restore any <code>.fossil</code> file to any point in time, not just the latest snapshot.</p>"},{"location":"getting-started/first-repo/","title":"Creating Your First Repository","text":"<p>Once fossilrepo is running, you can create your first Fossil repository.</p>"},{"location":"getting-started/first-repo/#via-the-dashboard","title":"Via the Dashboard","text":"<ol> <li>Log in at <code>http://localhost:8000</code></li> <li>Navigate to Repositories in the sidebar</li> <li>Click Create Repository</li> <li>Enter a name (e.g., <code>my-project</code>)</li> <li>Click Create</li> </ol> <p>The repository is immediately available at <code>my-project.your-domain.com</code> (production) or through the local Fossil server (development).</p>"},{"location":"getting-started/first-repo/#via-the-cli","title":"Via the CLI","text":"<pre><code># Inside the fossilrepo container\ndocker compose exec django python manage.py fossil_create my-project\n</code></pre> <p>This runs <code>fossil init</code>, registers the repo in the database, and (in production) Caddy automatically routes the subdomain.</p>"},{"location":"getting-started/first-repo/#what-happens-under-the-hood","title":"What Happens Under the Hood","text":"<pre><code>sequenceDiagram\n participant User\n participant Django\n participant Fossil\n participant Litestream\n participant S3\n\n User->>Django: Create repo \"my-project\"\n Django->>Fossil: fossil init /data/repos/my-project.fossil\n Fossil-->>Django: Repository created\n Django->>Django: Register in database\n Litestream->>S3: Begin replicating my-project.fossil\n Django-->>User: Repository ready</code></pre>"},{"location":"getting-started/first-repo/#accessing-your-repository","title":"Accessing Your Repository","text":""},{"location":"getting-started/first-repo/#web-ui","title":"Web UI","text":"<p>Fossil includes a built-in web interface with:</p> <ul> <li>Timeline -- commit history with diffs</li> <li>Tickets -- issue tracker</li> <li>Wiki -- project documentation</li> <li>Forum -- discussions</li> </ul>"},{"location":"getting-started/first-repo/#clone-via-fossil","title":"Clone via Fossil","text":"<pre><code>fossil clone https://my-project.your-domain.com my-project.fossil\nfossil open my-project.fossil\n</code></pre>"},{"location":"getting-started/first-repo/#clone-via-git-mirror","title":"Clone via Git (Mirror)","text":"<p>If you've configured the sync bridge:</p> <pre><code>git clone https://github.com/your-org/my-project.git\n</code></pre> <p>Read-only mirror</p> <p>Git mirrors are downstream copies. Push changes to the Fossil repo -- they'll sync to Git automatically.</p>"},{"location":"getting-started/first-repo/#next-steps","title":"Next Steps","text":"<ul> <li>Configure the sync bridge to mirror to GitHub/GitLab</li> <li>Set up backups with Litestream</li> <li>Explore the architecture overview</li> </ul>"},{"location":"getting-started/installation/","title":"Installation","text":""},{"location":"getting-started/installation/#clone-the-repository","title":"Clone the Repository","text":"<pre><code>git clone https://github.com/ConflictHQ/fossilrepo.git\ncd fossilrepo\n</code></pre>"},{"location":"getting-started/installation/#environment-configuration","title":"Environment Configuration","text":"<p>Copy the example environment file and configure it:</p> <pre><code>cp .env.example .env\n</code></pre> <p>Edit <code>.env</code> with your settings:</p> <pre><code># Django\nSECRET_KEY=your-secret-key-here\nDEBUG=True\nALLOWED_HOSTS=localhost,127.0.0.1\n\n# Database\nPOSTGRES_DB=fossilrepo\nPOSTGRES_USER=fossilrepo\nPOSTGRES_PASSWORD=your-db-password\n\n# Redis\nREDIS_URL=redis://redis:6379/0\n\n# Fossil\nFOSSIL_REPO_DIR=/data/repos\nFOSSIL_BASE_URL=https://your-domain.com\n</code></pre>"},{"location":"getting-started/installation/#start-the-stack","title":"Start the Stack","text":""},{"location":"getting-started/installation/#development","title":"Development","text":"<pre><code># Build and start all services\nmake build\n\n# Run database migrations\nmake migrate\n\n# Create an admin user\nmake superuser\n\n# Load sample data (optional)\nmake seed\n</code></pre> <p>The development stack includes:</p> <ul> <li>Django dev server on <code>http://localhost:8000</code></li> <li>PostgreSQL 16</li> <li>Redis</li> <li>Celery worker + beat</li> <li>Mailpit on <code>http://localhost:8025</code></li> </ul>"},{"location":"getting-started/installation/#production","title":"Production","text":"<p>For production, you'll also configure Caddy and Litestream:</p> <pre><code># Copy production configs\ncp docker/Caddyfile.example docker/Caddyfile\ncp docker/litestream.yml.example docker/litestream.yml\n\n# Edit with your domain and S3 credentials\n# Then start with the production compose file\ndocker compose -f docker-compose.yml -f docker-compose.prod.yml up -d\n</code></pre>"},{"location":"getting-started/installation/#verify-installation","title":"Verify Installation","text":"<pre><code># Check all services are running\ndocker compose ps\n\n# Hit the health endpoint\ncurl http://localhost:8000/health/\n\n# Open the dashboard\nopen http://localhost:8000\n</code></pre> <p>You should see</p> <p>The fossilrepo dashboard with navigation, login page, and (after seeding) sample repositories.</p>"},{"location":"getting-started/installation/#common-issues","title":"Common Issues","text":"Port 8000 already in use <p>Change the Django port mapping in <code>docker-compose.yml</code>: <pre><code>ports:\n - \"8001:8000\"\n</code></pre></p> Database connection refused <p>Ensure PostgreSQL has started before Django: <pre><code>docker compose logs postgres\n</code></pre> The Django container waits for Postgres to be ready, but network issues on some Docker Desktop versions can cause timeouts. Restart with <code>make down && make up</code>.</p> Permission denied on /data/repos <p>The Fossil repo directory needs to be writable by the container user: <pre><code>sudo chown -R 1000:1000 /data/repos\n</code></pre></p>"},{"location":"getting-started/prerequisites/","title":"Prerequisites","text":"<p>Before installing fossilrepo, ensure your server meets these requirements.</p>"},{"location":"getting-started/prerequisites/#system-requirements","title":"System Requirements","text":"Requirement Minimum OS Linux (Ubuntu 22.04+, Debian 12+, RHEL 9+) or macOS 13+ CPU 1 vCPU RAM 1 GB Disk 10 GB (scales with repo count) Python 3.12+"},{"location":"getting-started/prerequisites/#required-software","title":"Required Software","text":""},{"location":"getting-started/prerequisites/#docker-docker-compose","title":"Docker & Docker Compose","text":"<p>Fossilrepo runs its infrastructure stack via Docker Compose.</p> Ubuntu/DebianmacOS <pre><code># Install Docker\ncurl -fsSL https://get.docker.com | sh\nsudo usermod -aG docker $USER\n\n# Verify\ndocker compose version\n</code></pre> <pre><code># Install Docker Desktop\nbrew install --cask docker\n\n# Verify\ndocker compose version\n</code></pre>"},{"location":"getting-started/prerequisites/#git","title":"Git","text":"<p>Required for the sync bridge (mirroring to GitHub/GitLab).</p> <pre><code>git --version # 2.30+\n</code></pre>"},{"location":"getting-started/prerequisites/#make","title":"Make","text":"<p>Used for running common commands.</p> <pre><code>make --version\n</code></pre>"},{"location":"getting-started/prerequisites/#optional-s3-compatible-storage","title":"Optional: S3-Compatible Storage","text":"<p>For continuous backups via Litestream, you need an S3-compatible bucket:</p> <ul> <li>AWS S3</li> <li>MinIO (self-hosted)</li> <li>Backblaze B2</li> <li>DigitalOcean Spaces</li> </ul> <p>Local development</p> <p>S3 is not required for local development. Litestream is disabled by default in the dev Docker Compose configuration.</p>"},{"location":"getting-started/prerequisites/#ports","title":"Ports","text":"<p>The following ports are used by the stack:</p> Port Service <code>8000</code> Django (management UI) <code>443</code> Caddy (HTTPS, production) <code>80</code> Caddy (HTTP redirect, production) <code>5432</code> PostgreSQL <code>6379</code> Redis <code>8025</code> Mailpit (dev only)"}]} |
+31
| --- a/site/sitemap.xml | ||
| +++ b/site/sitemap.xml | ||
| @@ -0,0 +1,31 @@ | ||
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> | |
| 3 | + <url> | |
| 4 | + <loc>https://fossilrepo.dev/</loc> | |
| 5 | + <lastmod>2026-04-07</lastmod> | |
| 6 | + </url> | |
| 7 | + <url> | |
| 8 | + <loc>https://fossilrepo.dev/architecture/overview/</loc> | |
| 9 | + <lastmod>2026-04-07</lastmod> | |
| 10 | + </url> | |
| 11 | + <url> | |
| 12 | + <loc>https://fossilrepo.dev/architecture/sync-bridge/</loc> | |
| 13 | + <lastmod>2026-04-07</lastmod> | |
| 14 | + </url> | |
| 15 | + <url> | |
| 16 | + <loc>https://fossilrepo.dev/getting-started/configuration/</loc> | |
| 17 | + <lastmod>2026-04-07</lastmod> | |
| 18 | + </url> | |
| 19 | + <url> | |
| 20 | + <loc>https://fossilrepo.dev/getting-started/first-repo/</loc> | |
| 21 | + <lastmod>2026-04-07</lastmod> | |
| 22 | + </url> | |
| 23 | + <url> | |
| 24 | + <loc>https://fossilrepo.dev/getting-started/installation/</loc> | |
| 25 | + <lastmod>2026-04-07</lastmod> | |
| 26 | + </url> | |
| 27 | + <url> | |
| 28 | + <loc>https://fossilrepo.dev/getting-started/prerequisites/</loc> | |
| 29 | + <lastmod>2026-04-07</lastmod> | |
| 30 | + </url> | |
| 31 | +</urlset> |
| --- a/site/sitemap.xml | |
| +++ b/site/sitemap.xml | |
| @@ -0,0 +1,31 @@ | |
| --- a/site/sitemap.xml | |
| +++ b/site/sitemap.xml | |
| @@ -0,0 +1,31 @@ | |
| 1 | <?xml version="1.0" encoding="UTF-8"?> |
| 2 | <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> |
| 3 | <url> |
| 4 | <loc>https://fossilrepo.dev/</loc> |
| 5 | <lastmod>2026-04-07</lastmod> |
| 6 | </url> |
| 7 | <url> |
| 8 | <loc>https://fossilrepo.dev/architecture/overview/</loc> |
| 9 | <lastmod>2026-04-07</lastmod> |
| 10 | </url> |
| 11 | <url> |
| 12 | <loc>https://fossilrepo.dev/architecture/sync-bridge/</loc> |
| 13 | <lastmod>2026-04-07</lastmod> |
| 14 | </url> |
| 15 | <url> |
| 16 | <loc>https://fossilrepo.dev/getting-started/configuration/</loc> |
| 17 | <lastmod>2026-04-07</lastmod> |
| 18 | </url> |
| 19 | <url> |
| 20 | <loc>https://fossilrepo.dev/getting-started/first-repo/</loc> |
| 21 | <lastmod>2026-04-07</lastmod> |
| 22 | </url> |
| 23 | <url> |
| 24 | <loc>https://fossilrepo.dev/getting-started/installation/</loc> |
| 25 | <lastmod>2026-04-07</lastmod> |
| 26 | </url> |
| 27 | <url> |
| 28 | <loc>https://fossilrepo.dev/getting-started/prerequisites/</loc> |
| 29 | <lastmod>2026-04-07</lastmod> |
| 30 | </url> |
| 31 | </urlset> |
Binary file