Skip to content

Deploying Fossil

Introduction

Fossil is a simple, high-reliability, distributed software configuration management system with built-in bug tracking, wiki, forum, and project management features. Created by D. Richard Hipp (the architect of SQLite), Fossil is designed to be a complete project management solution in a single self-contained executable. Unlike Git which focuses solely on version control, Fossil integrates version control, bug tracking, wiki documentation, and technotes into a unified system, all stored in a single SQLite database file.

Fossil is known for:

  • All-in-One Solution: Version control, bug tracking, wiki, forum, and documentation in a single tool
  • Self-Contained: Single executable with no external dependencies - everything runs from one binary
  • SQLite Backend: All project data stored in a single, portable SQLite database file
  • Autosync: Built-in automatic synchronization between repositories
  • Integrated Web UI: Rich web interface with timeline view, branching visualization, and activity feeds
  • Built-in Bug Tracker: Ticket system with custom fields, labels, and workflow management
  • Wiki System: Full-featured wiki with markdown support for project documentation
  • Forum & Technotes: Discussion forums and technical notes for project communication
  • Embedded Documentation: Project documentation travels with the repository
  • Strong Authentication: Comprehensive user management with capability-based permissions
  • Robust Design: Emphasis on data integrity, corruption detection, and reliability
  • Cross-Platform: Runs on Linux, macOS, Windows, BSD, and more
  • Easy Deployment: No database server required - just copy the repository file
  • Offline Capable: Full functionality available offline with sync when connected

Common use cases include personal project hosting, small team collaboration, documentation management, embedded systems development, academic research projects, and any scenario requiring an integrated project management and version control system.

This comprehensive guide walks you through deploying Fossil on Klutch.sh using Docker, including repository initialization, persistent storage, user management, environment configuration, and production-ready best practices.

Why Deploy Fossil on Klutch.sh?

  • Simplified Deployment: Deploy Fossil without managing servers or infrastructure
  • Persistent Storage: Reliable volume storage for Fossil repositories and data
  • Custom Domains: Use your own domain for your Fossil instance
  • Environment Variables: Secure configuration management through Klutch.sh
  • Automatic HTTPS: Built-in SSL certificates for secure access
  • Easy Scaling: Adjust resources as your project grows
  • Zero Downtime Updates: Deploy changes without service interruption
  • Container Benefits: Isolated, reproducible environment with version control
  • Backup Support: Easy repository backup and disaster recovery

Prerequisites

Before you begin, ensure you have:

  • A Klutch.sh account
  • A GitHub account with a repository for your Fossil project
  • Basic understanding of version control and Docker
  • (Optional) Custom domain for your Fossil instance

Preparing Your Repository

Step 1: Create Project Directory

Create a new directory for your Fossil deployment:

Terminal window
mkdir fossil-klutch
cd fossil-klutch

Step 2: Create the Dockerfile

Create a Dockerfile in your project root:

FROM alpine:3.19
# Install Fossil from Alpine repositories
RUN apk add --no-cache \
fossil \
tini \
&& mkdir -p /fossil/repos /fossil/config
# Create fossil user
RUN addgroup -S fossil && \
adduser -S -G fossil -h /fossil -s /bin/sh fossil
# Set working directory
WORKDIR /fossil
# Copy initialization script
COPY --chown=fossil:fossil init-fossil.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/init-fossil.sh
# Set permissions
RUN chown -R fossil:fossil /fossil
# Switch to fossil user
USER fossil
# Expose HTTP port
EXPOSE 8080
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/ || exit 1
# Use tini as entrypoint for proper signal handling
ENTRYPOINT ["/sbin/tini", "--"]
# Run initialization script
CMD ["/usr/local/bin/init-fossil.sh"]

Step 3: Create Initialization Script

Create init-fossil.sh to handle repository initialization and server startup:

#!/bin/sh
set -e
FOSSIL_REPO_DIR="${FOSSIL_REPO_DIR:-/fossil/repos}"
FOSSIL_REPO_FILE="${FOSSIL_REPO_FILE:-project.fossil}"
FOSSIL_PORT="${FOSSIL_PORT:-8080}"
FOSSIL_ADMIN_USER="${FOSSIL_ADMIN_USER:-admin}"
FOSSIL_ADMIN_PASSWORD="${FOSSIL_ADMIN_PASSWORD:-changeme}"
FOSSIL_PROJECT_NAME="${FOSSIL_PROJECT_NAME:-My Project}"
FOSSIL_PROJECT_DESC="${FOSSIL_PROJECT_DESC:-Fossil repository hosted on Klutch.sh}"
REPO_PATH="${FOSSIL_REPO_DIR}/${FOSSIL_REPO_FILE}"
echo "Starting Fossil initialization..."
# Create repository directory
mkdir -p "$FOSSIL_REPO_DIR"
# Initialize repository if it doesn't exist
if [ ! -f "$REPO_PATH" ]; then
echo "Creating new Fossil repository: $REPO_PATH"
fossil init "$REPO_PATH" \
--project-name "$FOSSIL_PROJECT_NAME" \
--project-desc "$FOSSIL_PROJECT_DESC" \
--admin-user "$FOSSIL_ADMIN_USER"
# Set admin password
echo "Setting admin password..."
fossil user password "$FOSSIL_ADMIN_USER" "$FOSSIL_ADMIN_PASSWORD" -R "$REPO_PATH"
# Configure repository settings
echo "Configuring repository settings..."
fossil settings autosync on -R "$REPO_PATH"
fossil settings auto-captcha off -R "$REPO_PATH"
fossil settings auto-hyperlink on -R "$REPO_PATH"
fossil settings ticket-table on -R "$REPO_PATH"
echo "Repository created successfully!"
else
echo "Using existing repository: $REPO_PATH"
fi
echo "Starting Fossil server on port $FOSSIL_PORT..."
# Start Fossil server
exec fossil server "$REPO_PATH" \
--port "$FOSSIL_PORT" \
--localhost 0 \
--baseurl "${FOSSIL_BASEURL:-http://example-app.klutch.sh}" \
--repolist

Step 4: Create Configuration Files

Create a .env.example file for environment variable reference:

Terminal window
# Fossil Repository Configuration
FOSSIL_REPO_DIR=/fossil/repos
FOSSIL_REPO_FILE=project.fossil
FOSSIL_PORT=8080
# Admin User Configuration
FOSSIL_ADMIN_USER=admin
FOSSIL_ADMIN_PASSWORD=changeme_production_password
# Project Metadata
FOSSIL_PROJECT_NAME=My Project
FOSSIL_PROJECT_DESC=Fossil repository hosted on Klutch.sh
# Server Configuration
FOSSIL_BASEURL=https://example-app.klutch.sh

Step 5: Create .gitignore

Create a .gitignore file to exclude sensitive files:

# Environment files
.env
.env.local
# Fossil repositories (local testing)
*.fossil
*.fossil-journal
*.fossil-wal
*.fossil-shm
# Logs
*.log
# OS files
.DS_Store
Thumbs.db

Step 6: Create README

Create a README.md file with deployment instructions:

# Fossil on Klutch.sh
This repository contains the Docker configuration for deploying Fossil SCM on Klutch.sh.
## Features
- Self-contained version control system
- Built-in bug tracking and wiki
- Single SQLite database repository
- Web-based interface
- Persistent storage for repositories
## Deployment
1. Push this repository to GitHub
2. Create a new app on Klutch.sh
3. Connect your GitHub repository
4. Configure environment variables
5. Add persistent volume at `/fossil/repos`
6. Deploy!
## Environment Variables
See `.env.example` for all available configuration options.
## Access
After deployment, access Fossil at: https://your-app.klutch.sh
Default credentials:
- Username: admin (change via FOSSIL_ADMIN_USER)
- Password: changeme (change via FOSSIL_ADMIN_PASSWORD)
**Important**: Change the default password immediately after first login!

Step 7: Initialize Git Repository

Terminal window
git init
git add .
git commit -m "Initial Fossil deployment configuration"

Push to GitHub:

Terminal window
git remote add origin https://github.com/yourusername/fossil-klutch.git
git branch -M main
git push -u origin main

Deploying on Klutch.sh

  1. Log in to Klutch.sh
    Navigate to klutch.sh/app and sign in to your account.
  2. Create a New Project
    Click New Project, give it a name (e.g., "Fossil SCM"), and create the project.
  3. Create a New App
    Inside your project, click New App and select your GitHub repository containing the Fossil Dockerfile.
  4. Configure Traffic Type
    In the app settings, select HTTP traffic since Fossil runs a web server on port 8080.
  5. Set Environment Variables
    Add the following environment variables in the Klutch.sh dashboard:
    Terminal window
    # Admin Configuration (REQUIRED - Change these!)
    FOSSIL_ADMIN_USER=admin
    FOSSIL_ADMIN_PASSWORD=your_secure_password_here
    # Project Configuration
    FOSSIL_PROJECT_NAME=My Project
    FOSSIL_PROJECT_DESC=Fossil repository hosted on Klutch.sh
    # Server Configuration
    FOSSIL_BASEURL=https://your-app-name.klutch.sh
    # Repository Configuration (Optional)
    FOSSIL_REPO_DIR=/fossil/repos
    FOSSIL_REPO_FILE=project.fossil
    FOSSIL_PORT=8080

    Security Note: Use a strong, unique password for FOSSIL_ADMIN_PASSWORD. Never commit this to your repository.

  6. Configure Persistent Volume
    Add a persistent volume to store Fossil repositories:
    • Mount Path: /fossil/repos
    • Size: 5-50 GB (depending on expected repository size)
    This ensures your repositories persist across deployments and restarts.
  7. Deploy the App
    Click Deploy. Klutch.sh will automatically detect the Dockerfile and build your Fossil container.
  8. Access Your Fossil Instance
    Once deployed, access Fossil at https://your-app-name.klutch.sh. Log in with your configured admin credentials.

Configuration

Admin User Management

After initial deployment, you should:

  1. Change Admin Password: Log in and navigate to Admin → Users to change the password
  2. Create User Accounts: Add users with appropriate capabilities
  3. Configure Permissions: Set up capability-based access control

Repository Settings

Configure repository settings through the Admin panel:

Terminal window
# Enable autosync for automatic push/pull
fossil settings autosync on
# Enable wiki functionality
fossil settings wiki-about on
# Enable ticket system
fossil settings ticket-table on
# Configure email notifications (if needed)
fossil settings email-send-method smtp
fossil settings email-send-db "smtp://smtp.example.com:587"

Project Configuration

Customize your Fossil instance by modifying these environment variables:

Repository Settings:

  • FOSSIL_REPO_DIR: Directory for repository storage (default: /fossil/repos)
  • FOSSIL_REPO_FILE: Repository filename (default: project.fossil)

Server Settings:

  • FOSSIL_PORT: Internal server port (default: 8080)
  • FOSSIL_BASEURL: Public URL for your Fossil instance

Project Metadata:

  • FOSSIL_PROJECT_NAME: Display name for your project
  • FOSSIL_PROJECT_DESC: Project description

Admin Configuration:

  • FOSSIL_ADMIN_USER: Admin username
  • FOSSIL_ADMIN_PASSWORD: Admin password (required for initial setup)

User Management

Create and manage users through the Fossil web interface:

  1. Navigate to Admin → Users
  2. Click Create a new user
  3. Assign capabilities:
    • s (Setup): Full administrative access
    • a (Admin): User administration
    • d (Delete): Delete wiki and tickets
    • i (Check-In): Commit changes
    • o (Check-Out): Read repository
    • h (Hyperlink): View most pages
    • g (Clone): Clone repository

Wiki and Documentation

Enable and configure the built-in wiki:

  1. Go to Admin → Settings → Wiki
  2. Enable wiki functionality
  3. Set default page name
  4. Configure markdown rendering options

Ticket System Configuration

Set up the integrated bug tracker:

  1. Navigate to Admin → Tickets
  2. Configure ticket fields and types
  3. Set up workflows and status values
  4. Define custom reports

Skin and Appearance

Customize the look and feel:

  1. Go to Admin → Skins
  2. Choose from built-in skins or create custom CSS
  3. Upload logo and configure header
  4. Set custom footer text

Sample Usage

Cloning a Repository

Clone your Fossil repository to a local machine:

Terminal window
# Clone the repository
fossil clone https://example-app.klutch.sh/project.fossil myproject.fossil
# Open the repository
mkdir myproject
cd myproject
fossil open ../myproject.fossil
# Configure user identity
fossil user default yourusername

Making Changes

Basic workflow for committing changes:

Terminal window
# Make changes to files
echo "Hello Fossil" > hello.txt
# Add files (Fossil tracks all files by default)
fossil add hello.txt
# Commit changes
fossil commit -m "Add hello file"
# Push to server (if autosync is off)
fossil push

Using Python Client

Work with Fossil repositories programmatically:

import subprocess
import os
class FossilRepo:
def __init__(self, repo_path):
self.repo_path = repo_path
def run_command(self, command):
"""Execute fossil command"""
result = subprocess.run(
f"fossil {command}",
shell=True,
cwd=os.path.dirname(self.repo_path),
capture_output=True,
text=True
)
return result.stdout, result.stderr
def clone(self, url):
"""Clone repository from server"""
stdout, stderr = self.run_command(f"clone {url} {self.repo_path}")
return stdout
def commit(self, message):
"""Commit changes"""
stdout, stderr = self.run_command(f"commit -m '{message}'")
return stdout
def timeline(self, limit=10):
"""Get timeline entries"""
stdout, stderr = self.run_command(f"timeline -n {limit}")
return stdout
def sync(self):
"""Sync with server"""
stdout, stderr = self.run_command("sync")
return stdout
# Usage
repo = FossilRepo("myproject.fossil")
# Clone repository
print(repo.clone("https://example-app.klutch.sh/project.fossil"))
# View timeline
print(repo.timeline(5))
# Make changes and commit
# ... modify files ...
print(repo.commit("Update project files"))
# Sync with server
print(repo.sync())

Using Node.js Client

Interact with Fossil through Node.js:

const { exec } = require('child_process');
const util = require('util');
const execPromise = util.promisify(exec);
class FossilClient {
constructor(repoPath) {
this.repoPath = repoPath;
}
async runCommand(command) {
try {
const { stdout, stderr } = await execPromise(
`fossil ${command}`,
{ cwd: this.repoPath }
);
return { success: true, output: stdout, error: stderr };
} catch (error) {
return { success: false, error: error.message };
}
}
async clone(url, filename) {
return this.runCommand(`clone ${url} ${filename}`);
}
async open(fossilFile) {
return this.runCommand(`open ${fossilFile}`);
}
async commit(message) {
return this.runCommand(`commit -m "${message}"`);
}
async push() {
return this.runCommand('push');
}
async pull() {
return this.runCommand('pull');
}
async timeline(limit = 10) {
return this.runCommand(`timeline -n ${limit}`);
}
async status() {
return this.runCommand('status');
}
}
// Usage
(async () => {
const fossil = new FossilClient('./myproject');
// Clone repository
const cloneResult = await fossil.clone(
'https://example-app.klutch.sh/project.fossil',
'project.fossil'
);
console.log('Clone:', cloneResult.output);
// Open repository
await fossil.open('project.fossil');
// Check status
const status = await fossil.status();
console.log('Status:', status.output);
// View timeline
const timeline = await fossil.timeline(5);
console.log('Timeline:', timeline.output);
// Commit and push changes
await fossil.commit('Update from Node.js');
await fossil.push();
})();

Using Go Client

Build Go applications that work with Fossil:

package main
import (
"fmt"
"os/exec"
"strings"
)
type FossilClient struct {
RepoPath string
}
func NewFossilClient(repoPath string) *FossilClient {
return &FossilClient{RepoPath: repoPath}
}
func (fc *FossilClient) RunCommand(args ...string) (string, error) {
cmd := exec.Command("fossil", args...)
cmd.Dir = fc.RepoPath
output, err := cmd.CombinedOutput()
return string(output), err
}
func (fc *FossilClient) Clone(url, filename string) (string, error) {
return fc.RunCommand("clone", url, filename)
}
func (fc *FossilClient) Open(fossilFile string) (string, error) {
return fc.RunCommand("open", fossilFile)
}
func (fc *FossilClient) Commit(message string) (string, error) {
return fc.RunCommand("commit", "-m", message)
}
func (fc *FossilClient) Push() (string, error) {
return fc.RunCommand("push")
}
func (fc *FossilClient) Pull() (string, error) {
return fc.RunCommand("pull")
}
func (fc *FossilClient) Timeline(limit int) (string, error) {
return fc.RunCommand("timeline", "-n", fmt.Sprintf("%d", limit))
}
func (fc *FossilClient) Status() (string, error) {
return fc.RunCommand("status")
}
func main() {
client := NewFossilClient("./myproject")
// Clone repository
output, err := client.Clone(
"https://example-app.klutch.sh/project.fossil",
"project.fossil",
)
if err != nil {
fmt.Printf("Error cloning: %v\n", err)
return
}
fmt.Println("Clone output:", output)
// Open repository
_, err = client.Open("project.fossil")
if err != nil {
fmt.Printf("Error opening: %v\n", err)
return
}
// Check status
status, _ := client.Status()
fmt.Println("Status:", status)
// View timeline
timeline, _ := client.Timeline(5)
fmt.Println("Timeline:", timeline)
// Commit and push
_, err = client.Commit("Update from Go application")
if err != nil {
fmt.Printf("Error committing: %v\n", err)
return
}
_, err = client.Push()
if err != nil {
fmt.Printf("Error pushing: %v\n", err)
return
}
fmt.Println("Changes committed and pushed successfully!")
}

Using HTTP API

Access Fossil’s web interface programmatically:

import requests
import json
class FossilAPI:
def __init__(self, base_url, username, password):
self.base_url = base_url.rstrip('/')
self.session = requests.Session()
self.username = username
self.password = password
self.login()
def login(self):
"""Authenticate with Fossil"""
response = self.session.post(
f"{self.base_url}/login",
data={
'u': self.username,
'p': self.password,
'in': '1'
}
)
return response.status_code == 200
def get_timeline(self, limit=20):
"""Get repository timeline"""
response = self.session.get(
f"{self.base_url}/timeline",
params={'n': limit, 'y': 'ci'}
)
return response.text
def get_file(self, filename, checkin='tip'):
"""Get file contents"""
response = self.session.get(
f"{self.base_url}/file",
params={'name': filename, 'ci': checkin}
)
return response.text
def get_tickets(self):
"""Get open tickets"""
response = self.session.get(
f"{self.base_url}/reportlist"
)
return response.text
def create_ticket(self, title, description):
"""Create a new ticket"""
response = self.session.post(
f"{self.base_url}/tktnew",
data={
'title': title,
'description': description,
'submit': 'Create'
}
)
return response.status_code == 200
# Usage
api = FossilAPI(
'https://example-app.klutch.sh',
'admin',
'your_password'
)
# Get timeline
timeline = api.get_timeline(10)
print("Recent activity:", timeline[:200])
# Get file contents
file_content = api.get_file('README.md')
print("README:", file_content)
# Create ticket
api.create_ticket(
'Feature Request',
'Add support for custom themes'
)

Using Ruby Client

Work with Fossil from Ruby applications:

require 'open3'
class FossilClient
attr_reader :repo_path
def initialize(repo_path)
@repo_path = repo_path
end
def run_command(*args)
command = ['fossil'] + args
stdout, stderr, status = Open3.capture3(
*command,
chdir: repo_path
)
{
success: status.success?,
output: stdout,
error: stderr
}
end
def clone(url, filename)
run_command('clone', url, filename)
end
def open_repo(fossil_file)
run_command('open', fossil_file)
end
def commit(message)
run_command('commit', '-m', message)
end
def push
run_command('push')
end
def pull
run_command('pull')
end
def timeline(limit = 10)
run_command('timeline', '-n', limit.to_s)
end
def status
run_command('status')
end
def sync
run_command('sync')
end
end
# Usage
fossil = FossilClient.new('./myproject')
# Clone repository
result = fossil.clone(
'https://example-app.klutch.sh/project.fossil',
'project.fossil'
)
puts "Clone: #{result[:output]}"
# Open repository
fossil.open_repo('project.fossil')
# Check status
status = fossil.status
puts "Status: #{status[:output]}"
# View timeline
timeline = fossil.timeline(5)
puts "Timeline: #{timeline[:output]}"
# Commit and push changes
fossil.commit('Update from Ruby application')
fossil.push
puts "Changes committed and pushed!"

Production Best Practices

Security Hardening

  1. Change Default Credentials

    Terminal window
    # Change admin password immediately
    # Do this through the web interface: Admin → Users
  2. Use Strong Passwords

    • Minimum 16 characters
    • Mix of uppercase, lowercase, numbers, symbols
    • Use a password manager
  3. Enable HTTPS

    • Use Klutch.sh’s automatic SSL certificates
    • Set FOSSIL_BASEURL to use https://
  4. Configure Capabilities

    Terminal window
    # Restrict user capabilities appropriately
    # Don't give all users 's' (Setup) capability
    # Use principle of least privilege
  5. Enable Login Security

    Terminal window
    # Configure failed login throttling
    fossil settings login-attempt-limit 5
    fossil settings login-lockout-time 900

Performance Optimization

  1. Repository Optimization

    Terminal window
    # Rebuild repository to optimize
    fossil rebuild
    # Vacuum to reclaim space
    fossil sqlite3 "VACUUM"
  2. Configure Caching

    Terminal window
    # Enable web page caching
    fossil settings cache-control max-age=300
  3. Resource Limits

    • Allocate sufficient memory (1-2 GB recommended)
    • Use SSD-backed volumes for better performance
  4. Database Tuning

    Terminal window
    # Analyze repository statistics
    fossil sqlite3 "ANALYZE"

Backup Strategy

  1. Repository Backup

    Terminal window
    # Backup is simple - just copy the .fossil file
    fossil backup /fossil/repos/project.fossil /backups/project-$(date +%Y%m%d).fossil
  2. Automated Backups Create a backup script in your Dockerfile:

    backup-fossil.sh
    #!/bin/sh
    REPO_FILE="/fossil/repos/project.fossil"
    BACKUP_DIR="/fossil/backups"
    DATE=$(date +%Y%m%d-%H%M%S)
    mkdir -p "$BACKUP_DIR"
    cp "$REPO_FILE" "$BACKUP_DIR/project-$DATE.fossil"
    # Keep only last 7 backups
    ls -t "$BACKUP_DIR"/project-*.fossil | tail -n +8 | xargs rm -f
  3. Volume Snapshots

    • Use Klutch.sh volume backup features
    • Schedule regular snapshots of /fossil/repos
  4. Off-site Backups

    Terminal window
    # Clone repository to external location
    fossil clone https://example-app.klutch.sh/project.fossil backup.fossil

Monitoring and Logging

  1. Health Checks

    • Klutch.sh uses the built-in health check endpoint
    • Monitor uptime through Klutch.sh dashboard
  2. Access Logs

    Terminal window
    # View Fossil access logs through Klutch.sh
    # Admin → Access Log in Fossil web interface
  3. Repository Statistics

    Terminal window
    # Check repository stats
    fossil sqlite3 "SELECT * FROM config WHERE name LIKE 'stat%'"
  4. Alert Configuration

    • Set up Klutch.sh alerts for downtime
    • Monitor disk usage on persistent volume

Scaling Considerations

  1. Vertical Scaling

    • Increase memory allocation for large repositories
    • Upgrade to faster storage tiers
  2. Repository Size Management

    Terminal window
    # Check repository size
    du -h /fossil/repos/project.fossil
    # Consider splitting large projects
    # into multiple repositories
  3. Multiple Repositories

    • Fossil supports serving multiple repositories
    • Use --repolist flag for multi-project hosting
  4. Read Replicas

    Terminal window
    # Clone repository for read-only access
    fossil clone https://example-app.klutch.sh/project.fossil readonly.fossil
    fossil server readonly.fossil --port 8081

Update Strategy

  1. Test Updates Locally

    Terminal window
    # Pull updated Dockerfile
    git pull
    # Test locally with Docker
    docker build -t fossil-test .
    docker run -p 8080:8080 fossil-test
  2. Staged Rollout

    • Create a staging environment
    • Test updates before production deployment
  3. Version Pinning

    # Pin to specific Alpine version
    FROM alpine:3.19
    # Pin Fossil version if needed
    RUN apk add --no-cache fossil=2.23-r0
  4. Rollback Plan

    • Keep previous Docker image tags
    • Maintain repository backups before updates

Troubleshooting

Repository Not Created

Problem: Fossil repository file is not being created on first run.

Solution:

  1. Check environment variables are set correctly

  2. Verify persistent volume is mounted at /fossil/repos

  3. Check container logs for initialization errors:

    Terminal window
    # View logs in Klutch.sh dashboard
    # Look for "Creating new Fossil repository" message
  4. Ensure write permissions on volume mount

Cannot Access Web Interface

Problem: Fossil web interface is not accessible at the app URL.

Solution:

  1. Verify app is deployed and running
  2. Check traffic type is set to HTTP
  3. Confirm port 8080 is exposed correctly
  4. Review health check status in Klutch.sh dashboard
  5. Check if FOSSIL_BASEURL matches your app URL

Authentication Failures

Problem: Cannot log in with configured admin credentials.

Solution:

  1. Verify FOSSIL_ADMIN_PASSWORD environment variable is set

  2. Check if repository was initialized with correct admin user

  3. Reset password using fossil command:

    Terminal window
    fossil user password admin new_password -R /fossil/repos/project.fossil
  4. Clear browser cookies and try again

Repository Sync Issues

Problem: Changes are not syncing between local and server repositories.

Solution:

  1. Check autosync setting:

    Terminal window
    fossil settings autosync
  2. Manually sync:

    Terminal window
    fossil sync
  3. Verify network connectivity

  4. Check repository permissions

  5. Ensure FOSSIL_BASEURL is correct

Permission Denied Errors

Problem: Getting permission denied errors when accessing repository files.

Solution:

  1. Check file ownership:

    Terminal window
    ls -la /fossil/repos/
  2. Ensure fossil user owns repository files

  3. Verify volume mount permissions

  4. Rebuild with correct user permissions in Dockerfile

Large Repository Performance

Problem: Slow performance with large repositories.

Solution:

  1. Rebuild and optimize repository:

    Terminal window
    fossil rebuild
    fossil sqlite3 "VACUUM"
    fossil sqlite3 "ANALYZE"
  2. Increase allocated memory in Klutch.sh

  3. Upgrade to faster storage tier

  4. Consider splitting into multiple repositories

Disk Space Issues

Problem: Running out of disk space on persistent volume.

Solution:

  1. Check repository size:

    Terminal window
    du -h /fossil/repos/*.fossil
  2. Clean up old backups

  3. Increase volume size in Klutch.sh

  4. Run vacuum to reclaim space:

    Terminal window
    fossil sqlite3 "VACUUM"

Additional Resources


You now have a complete Fossil SCM deployment on Klutch.sh! Fossil provides a unified solution for version control, bug tracking, wiki documentation, and project management—all in a single, self-contained system. Use it for personal projects, team collaboration, or as a complete project management platform with built-in source control.