Garage Logbook
Garage Logbook
v0.1.13
A self-hosted car maintenance tracker that runs on Docker

Garage Logbook tracks your vehicle's service history from an elegantly simple, self-hosted web interface. It has image and document upload support (think pictures of repairs or receipt PDFs), role-based authentication, CSV import and export for existing maintenance records, and a performant dark-mode interface running in a Docker container for easy deployment.

Python 3.10+ Flask SQLite Jinja2 Bootstrap 5 Docker
Multi-vehicle support
Service history timeline with detail modal view
Role-based authentication for viewers, editors and admins
CSV import & export
Support for per-record photo and document uploads
Install Garage Logbook
1
Create a Project Directory

Create a folder for the Docker files.

mkdir -p ~/garage-logbook && cd ~/garage-logbook
2
Generate a Secret Key

Flask needs a secret key for session security. Run this command and copy the output.

python3 -c "import secrets; print(secrets.token_hex(32))"
3
Create the Environment File

Paste your generated key into a .env file along with admin credentials.

# Create ~/garage-logbook/.env

SECRET_KEY=paste_your_generated_key_here
ADMIN_USER=admin
ADMIN_PASS=choose_a_strong_password
FLASK_ENV=production
4
Create the Docker Compose File

Save this as docker-compose.yml in the project directory.

# ~/garage-logbook/docker-compose.yml

services:
  garage-logbook:
    image: viibeware/garage-logbook:latest
    container_name: garage-logbook
    ports:
      - "5000:5000"
    volumes:
      - garage-data:/app/data
      - garage-uploads:/app/static/uploads
    env_file:
      - .env
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:5000"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s

volumes:
  garage-data:
    driver: local
  garage-uploads:
    driver: local
5
Deploy the Stack

Docker will pull the latest image from the registry and start the container.

cd ~/garage-logbook
docker compose up -d
6
Verify the Deployment

Confirm the container is running. When the status reports 'healthy,' continue to the next step.

# Check container status
docker compose ps

# View live logs
docker compose logs -f garage-logbook
7
Access Garage Logbook

Navigate to port 5000 in your browser to launch the app.

# Open in your browser:
# http://your-server-ip:5000
#
# Log in with the credentials
# from your .env file
1
One-Line Deploy

A single docker run command that skips the compose file and starts the container with default credentials and an auto-generated secret key. Good for quick evaluation; use the Docker Compose path for any real deployment.

docker run -d \
  --name garage-logbook \
  -p 5000:5000 \
  -v garage-data:/app/data \
  -v garage-uploads:/app/static/uploads \
  -e SECRET_KEY=$(python3 -c "import secrets; print(secrets.token_hex(32))") \
  -e ADMIN_USER=admin \
  -e ADMIN_PASS=changeme \
  --restart unless-stopped \
  viibeware/garage-logbook:latest
2
Verify Access

Open the site in your browser and log in with the default credentials. Change the admin password on first login.

# http://localhost:5000
# Username: admin
# Password: changeme
#
# (change this on first login)
Trusted Servants Pro
Trusted Servants Pro
v2.5.0
A self-hosted portal for recovery-fellowship trusted servants and members.

Trusted Servants Pro gives a recovery fellowship everything its trusted servants and members need in one place: a meetings directory with per-meeting schedules and Zoom info, curated reading libraries, a central file browser with previews and shareable public links, encrypted Zoom-account credential storage with a weekly assignment calendar, and a public access-request form with admin triage. Ships as a single Docker container with a persistent volume — no command line required after install.

Python 3 Flask SQLAlchemy SQLite Caddy Docker
Meetings directory with per-meeting schedules, Zoom info, libraries, and file attachments
Curated reading libraries with drag-and-drop ordering, thumbnails, and inline body text
Central file browser with PDF and image lightbox previews and human-readable public share URLs
Encrypted Zoom-account credentials with weekly assignment calendar and conflict detection
Public access-request form with admin triage and SMTP email notifications
Role-based auth (admin, editor, viewer) with 6-month remember-me sessions
Six built-in themes and an animated login screen with nine selectable particle effects
One-click data export and import for backups and host-to-host migration
Install Trusted Servants Pro
1
Create a Project Directory

Create a folder to hold the compose file and persistent data volume.

mkdir -p ~/tspro && cd ~/tspro
2
Generate a Secret Key

TSP_SECRET_KEY signs Flask session cookies. Generate a long random value and copy the output.

openssl rand -base64 48 | tr -d '\n/+=' | cut -c1-64
3
Create the Environment File

Create a .env alongside docker-compose.yml. At minimum TSP_SECRET_KEY must be set; the admin values seed on first boot.

# Create ~/tspro/.env

TSP_SECRET_KEY=paste_your_generated_key_here
TSP_ADMIN_USERNAME=admin
TSP_ADMIN_PASSWORD=choose_a_strong_password
[email protected]
4
Create the Docker Compose File

Save this as docker-compose.yml in the project directory. Data, uploads, and the Fernet key live in ./data on the host.

# ~/tspro/docker-compose.yml

services:
  tsp:
    image: viibeware/trusted-servants-pro:latest
    container_name: tspro
    ports:
      - "8090:8000"
    volumes:
      - ./data:/data
    environment:
      - TSP_SECRET_KEY=${TSP_SECRET_KEY:?TSP_SECRET_KEY must be set in .env}
      - TSP_ADMIN_USERNAME=${TSP_ADMIN_USERNAME:-admin}
      - TSP_ADMIN_PASSWORD=${TSP_ADMIN_PASSWORD:-admin}
      - TSP_ADMIN_EMAIL=${TSP_ADMIN_EMAIL:[email protected]}
    restart: unless-stopped
5
Deploy the Stack

Pull the image and start the container in the background.

cd ~/tspro
docker compose up -d
6
Verify the Deployment

Confirm the container is running and tail the logs if you want to watch startup migrations.

# Check container status
docker compose ps

# View live logs
docker compose logs -f tsp
7
Sign In

Open the portal in your browser and sign in with the admin credentials from your .env file. Change the password from Settings → Users on first login.

# Open in your browser:
# http://your-server-ip:8090
#
# Username: value of TSP_ADMIN_USERNAME
# Password: value of TSP_ADMIN_PASSWORD
1
Provision an Ubuntu 24.04 Server

Spin up a fresh Ubuntu 24.04 LTS instance on any provider (DigitalOcean, Hetzner, AWS Lightsail, bare metal). 1 vCPU and 1 GB RAM is sufficient for small groups. You'll need root or sudo access.

# Fresh Ubuntu 24.04 LTS — 1 vCPU / 1 GB RAM minimum
# Open ports 22, 80, 443 on the cloud firewall
2
Point DNS at the Server (Optional, for Let's Encrypt)

If you want a real TLS certificate, the domain must resolve to this server's public IP before running the installer — Let's Encrypt performs an HTTP-01 challenge on port 80. Cloudflare users: set the record to 'DNS only' (grey cloud), not proxied, during installation. Skip this step to install with a self-signed certificate instead.

# Example A-record
# portal.example.org  A  203.0.113.42
3
Run the Installer

SSH in and pipe install.sh directly from GitHub, or clone the repo first if you'd rather read the script before running it. The installer provisions Docker, writes a hardened docker-compose.yml, generates TSP_SECRET_KEY, configures Caddy for TLS, and installs Watchtower for automatic updates.

# Pipe from GitHub (recommended):
curl -fsSL https://raw.githubusercontent.com/viibeware/trusted-servants-pro/main/install.sh | sudo bash

# Or clone and run locally:
git clone https://github.com/viibeware/trusted-servants-pro.git
cd trusted-servants-pro
sudo bash install.sh
4
Answer the Prompts

The installer asks for a public hostname (leave blank for a self-signed certificate) and a contact email for Let's Encrypt renewal notices. Typical runtime is 2–5 minutes on a fresh VM.

# Prompts:
#   Domain        portal.example.org  (or blank for self-signed)
#   ACME email    [email protected]     (used only for cert renewal notices)
5
Non-Interactive Install (Optional)

Skip all prompts by passing environment variables on the same command line. Useful for provisioning scripts and CI.

sudo TSP_DOMAIN=portal.example.org \
     [email protected] \
     TSP_ADMIN_PASSWORD='a-strong-password' \
     bash install.sh
6
Sign In

The installer prints the portal URL when it finishes (either https://your-domain or https://server-ip). Sign in with the default admin credentials and change the password immediately from Settings → Users.

# Default credentials (change on first login):
# Username: admin
# Password: admin
7
Day-to-Day Commands

Watchtower polls Docker Hub every 24 hours and restarts the container when a new image is published. Back up /opt/tspro/data or use Settings → Data → Export from the UI.

cd /opt/tspro
docker compose ps                             # running containers
docker compose logs -f tsp                    # tail portal logs
docker compose pull && docker compose up -d   # upgrade now
docker compose down                           # stop everything