Skip to content

Odoo Filestore Backup and Restore in Docker

Overview

This document covers backing up and restoring Odoo filestore directories from Docker containers using tar archives and volume mounting.

Backup Process

Creating a Filestore Backup

# Create tar archive
echo -e "${BLUE}[7/9]${NC} Creating an archive of the filestore..."
if docker run --rm --volumes-from "$ContainerName" -v "$TempDir:/backup" ubuntu tar -czf "/backup/filestore.tar" -C /var/lib/odoo/filestore/$Database . 2>/dev/null; then
  echo -e "${GREEN}${NC} Filestore backed up successfully"
else
  echo -e "${RED}${NC} Database backup failed!"
  echo -e "${RED}Cleaning up and exiting...${NC}"
  rm -rf "$TempDir"
  exit 1
fi

Key Points: - Uses --volumes-from to access the container's volumes - Mounts a temporary directory to store the backup - Creates a gzipped tar archive (tar -czf) - Archives from /var/lib/odoo/filestore/$Database directory - Redirects errors to /dev/null for cleaner output

Restore Process

Method 1: With Directory Existence Checks

# Restore tar archive to container
echo -e "${BLUE}[X/Y]${NC} Restoring filestore from archive..."

# Check if directories exist, create if they don't
echo -e "Ensuring filestore directories exist..."
if docker exec "$ContainerName" sh -c "[ ! -d /var/lib/odoo/filestore ]"; then
  echo -e "Creating /var/lib/odoo/filestore directory..."
  docker exec "$ContainerName" mkdir -p /var/lib/odoo/filestore
fi

if docker exec "$ContainerName" sh -c "[ ! -d /var/lib/odoo/filestore/$Database ]"; then
  echo -e "Creating /var/lib/odoo/filestore/$Database directory..."
  docker exec "$ContainerName" mkdir -p /var/lib/odoo/filestore/$Database
fi

# Extract the archive into the container
if docker run --rm --volumes-from "$ContainerName" -v "$TempDir:/backup" ubuntu tar -xzf "/backup/filestore.tar" -C /var/lib/odoo/filestore/$Database 2>/dev/null; then
  echo -e "${GREEN}${NC} Filestore restored successfully"
else
  echo -e "${RED}${NC} Filestore restore failed!"
  echo -e "${RED}Cleaning up and exiting...${NC}"
  rm -rf "$TempDir"
  exit 1
fi

# Fix permissions
docker exec "$ContainerName" chown -R odoo:odoo /var/lib/odoo/filestore
# Restore tar archive to container
echo -e "${BLUE}[X/Y]${NC} Restoring filestore from archive..."

# Create directories (no error if they already exist)
echo -e "Ensuring filestore directories exist..."
docker exec "$ContainerName" mkdir -p /var/lib/odoo/filestore/$Database

# Extract the archive into the container
if docker run --rm --volumes-from "$ContainerName" -v "$TempDir:/backup" ubuntu tar -xzf "/backup/filestore.tar" -C /var/lib/odoo/filestore/$Database 2>/dev/null; then
  echo -e "${GREEN}${NC} Filestore restored successfully"
else
  echo -e "${RED}${NC} Filestore restore failed!"
  echo -e "${RED}Cleaning up and exiting...${NC}"
  rm -rf "$TempDir"
  exit 1
fi

# Fix permissions
docker exec "$ContainerName" chown -R odoo:odoo /var/lib/odoo/filestore

Why Method 2 is Recommended: - mkdir -p creates parent directories automatically - Doesn't fail if directories already exist - Simpler and more concise code - Single command instead of multiple checks

Key Differences: Backup vs Restore

Aspect Backup Restore
Tar operation tar -czf (create) tar -xzf (extract)
Directory preparation Not needed Must ensure directories exist
Permission handling Not needed Must fix ownership after restore
Direction Container → Host Host → Container

Important Considerations

Directory Structure

  • /var/lib/odoo/filestore - Base filestore directory
  • /var/lib/odoo/filestore/$Database - Database-specific filestore
  • These directories typically don't exist on first run of a new container

Permissions

After restoring, always fix permissions since extracted files may not have correct ownership:

docker exec "$ContainerName" chown -R odoo:odoo /var/lib/odoo/filestore

Optional: Clear Existing Filestore

To restore to a completely empty filestore (removing existing files first):

# Clear existing filestore before restore
docker exec "$ContainerName" rm -rf /var/lib/odoo/filestore/$Database

Variables Used

  • $ContainerName - Name of the Odoo Docker container
  • $TempDir - Temporary directory on host for backup/restore files
  • $Database - Name of the Odoo database
  • Color codes: $BLUE, $NC, $GREEN, $RED - For colored terminal output