This guide provides recommendations for optimal performance, reliability, and organization when using Immich-Go.
- Format: Choose ZIP format for easier processing
- File Size: Select maximum size (50GB) to minimize parts
- Content: Include all photos, videos, and metadata
- Download: Ensure all parts are downloaded completely
- Incomplete Downloads: Verify all
takeout-001.zip,takeout-002.zip, etc. files are present - Mixed Formats: Don't mix ZIP and TGZ formats in the same import
- Partial Takeouts: Some Google takeouts may be incomplete - request a new one if many files are missing
# Conservative approach for maximum reliability
immich-go upload from-google-photos \
--server=http://localhost:2283 \
--api-key=your-api-key \
--concurrent-tasks=4 \
--client-timeout=60m \
--pause-immich-jobs=true \
--on-errors=continue \
--session-tag \
/path/to/takeout-*.zip# Balanced performance and reliability
immich-go upload from-google-photos \
--server=http://localhost:2283 \
--api-key=your-api-key \
--concurrent-tasks=8 \
--manage-raw-jpeg=StackCoverRaw \
--manage-burst=Stack \
/path/to/takeout-*.zip# Fast import with full processing
immich-go upload from-google-photos \
--server=http://localhost:2283 \
--api-key=your-api-key \
--concurrent-tasks=12 \
--manage-raw-jpeg=StackCoverRaw \
--manage-burst=Stack \
--manage-heic-jpeg=StackCoverJPG \
/path/to/takeout-*.zip-
Check Takeout Completeness: Verify all parts are included
ls -la takeout-*.zip -
Force Import Unmatched Files:
immich-go upload from-google-photos \ --include-unmatched \ --server=... --api-key=... /path/to/takeout-*.zip -
Request New Takeout: If data seems incomplete, create a new takeout for missing periods
- Safe to Restart: Immich-Go detects existing files and skips duplicates
- Use Session Tags: Enable
--session-tagto track what was imported when - Check Logs: Review log files to identify where the import stopped
# High throughput configuration
--concurrent-tasks=16
--client-timeout=30m
--pause-immich-jobs=true# Adaptive configuration
--concurrent-tasks=4-8
--client-timeout=60m
--on-errors=continue# Conservative configuration
--concurrent-tasks=1-2
--client-timeout=120m
--on-errors=continue# Maximize server utilization
--concurrent-tasks=12-20
--pause-immich-jobs=false # Let server handle both
--client-timeout=30m# Reduce server load
--concurrent-tasks=2-4
--pause-immich-jobs=true
--client-timeout=60m# Minimal resource usage
--concurrent-tasks=1-2
--pause-immich-jobs=true
--client-timeout=180m- Use higher concurrency (8-16 uploads)
- Enable all file management features
- Process larger batches
- Reduce concurrency (2-4 uploads)
- Process smaller batches
- Consider staging on faster temporary storage
- Account for network latency in timeouts
- Test with small batches first
- Monitor network utilization
# Create albums from folder structure
immich-go upload from-folder \
--folder-as-album=FOLDER \
--album-path-joiner=" - " \
--server=... --api-key=... /organized/photos/Benefits:
- Maintains existing organization
- Easy to understand structure
- Works well with hierarchical folder systems
Best For: Already organized photo collections
# Let Immich organize by date, use tags for categories
immich-go upload from-folder \
--tag="Source/Import2024" \
--tag="Camera/Canon5D" \
--session-tag \
--server=... --api-key=... /photos/Benefits:
- Chronological organization
- Flexible tagging system
- Better for mixed sources
Best For: Large collections from multiple sources
# Combine albums and tags strategically
immich-go upload from-folder \
--folder-as-album=PATH \
--folder-as-tags=true \
--tag="Import/$(date +%Y-%m)" \
--server=... --api-key=... /photos/--manage-raw-jpeg=NoStackWhen to Use: Need both formats accessible, have ample storage
--manage-raw-jpeg=StackCoverRawWhen to Use: Primarily edit RAW files, JPEG for quick preview
--manage-raw-jpeg=StackCoverJPGWhen to Use: Mainly use JPEG, keep RAW as backup
--manage-raw-jpeg=KeepRaw # Or KeepJPG based on preferenceWhen to Use: Limited storage, need to choose one format
--manage-burst=StackBenefits: Keeps all shots while reducing clutter
--manage-burst=StackKeepJPEGBenefits: Saves storage, keeps most useful format
--manage-burst=NoStackBenefits: Full access to all shots for selection
# Geographic hierarchy
--tag="Location/Europe/France/Paris"
# Event hierarchy
--tag="Events/2024/Wedding/Ceremony"
# Equipment hierarchy
--tag="Equipment/Camera/Canon/5D-Mark-IV"# Combine multiple tag dimensions
--tag="Location/Paris" \
--tag="Event/Wedding" \
--tag="People/Family" \
--tag="Year/2024"# Always tag sources for future reference
--tag="Source/GooglePhotos" \
--tag="Import/$(date +%Y-%m-%d)" \
--session-tag- 3 Copies: Original + 2 backups
- 2 Different Media: Local + cloud/external
- 1 Offsite: Cloud or remote location
# Local backup (Copy 2)
immich-go archive from-immich \
--server=http://localhost:2283 \
--api-key=your-api-key \
--write-to-folder=/local-backup/immich
# Offsite backup (Copy 3) - sync local backup to cloud
rsync -av /local-backup/immich/ user@remote-server:/backups/immich/#!/bin/bash
# Daily incremental backup script
YESTERDAY=$(date -d '1 day ago' '+%Y-%m-%d')
TODAY=$(date '+%Y-%m-%d')
immich-go archive from-immich \
--server=http://localhost:2283 \
--api-key=your-api-key \
--from-date-range="$YESTERDAY,$TODAY" \
--write-to-folder="/backup/incremental/$TODAY"# Monthly full backup
immich-go archive from-immich \
--server=http://localhost:2283 \
--api-key=your-api-key \
--write-to-folder="/backup/full/$(date +%Y-%m)"# Test with small subset first
immich-go upload from-folder \
--dry-run \
--log-level=DEBUG \
--server=... --api-key=... /small-test-folder/# Test restore capability
immich-go upload from-folder \
--server=http://test-server:2283 \
--api-key=test-api-key \
/backup/folder/2024/2024-01/- Separate Keys: Use different API keys for different purposes
- Minimal Permissions: Only grant necessary permissions
- Regular Rotation: Rotate keys periodically
- Secure Storage: Don't hardcode keys in scripts
# Different keys for different operations
UPLOAD_KEY="key-with-upload-permissions"
BACKUP_KEY="key-with-read-only-permissions"
ADMIN_KEY="key-with-admin-permissions"
# Upload operations
immich-go upload from-folder --api-key="$UPLOAD_KEY" ...
# Backup operations
immich-go archive from-immich --api-key="$BACKUP_KEY" ...#!/bin/bash
# Secure script example
# Read API key from secure file
API_KEY=$(cat ~/.config/immich-go/api-key)
chmod 600 ~/.config/immich-go/api-key # Restrict permissions
# Or use environment variable
export IMMICH_API_KEY="your-key"
immich-go upload from-folder --api-key="$IMMICH_API_KEY" ...# Always use HTTPS in production
immich-go upload from-folder \
--server=https://immich.yourdomain.com \
--api-key=your-key \
/photos/
# Only use --skip-verify-ssl for testing/development
immich-go upload from-folder \
--server=https://immich-dev.local \
--skip-verify-ssl \ # Only for self-signed certs in dev
--api-key=your-key \
/photos/- VPN Access: Access Immich server through VPN when possible
- Firewall Rules: Restrict Immich server access to specific networks
- Reverse Proxy: Use reverse proxy with proper SSL termination
--log-level=DEBUG \
--log-file=/tmp/immich-go-debug.log \
--api-trace--log-level=INFO \
--log-file=/var/log/immich-go/upload-$(date +%Y%m%d).log--log-level=WARN \
--log-file=/var/log/immich-go/automated.log \
--no-ui# Monitor upload with session tags
immich-go upload from-folder \
--session-tag \
--tag="Batch/$(date +%Y%m%d-%H%M)" \
--server=... --api-key=... /photos/# Check available space before large operations
df -h /immich-storage
df -h /temp-directory
# Monitor during operation
watch df -h /immich-storage# Monitor server resources during upload
htop
iotop
nethogs# Continue on errors, log issues
immich-go upload from-folder \
--on-errors=continue \
--log-level=INFO \
--log-file=/var/log/errors.log \
--server=... --api-key=... /photos/
# Review errors later
grep "ERROR" /var/log/errors.log# Restart with same parameters - Immich-Go handles duplicates
immich-go upload from-folder \
--server=... --api-key=... /photos/# Use session tags to identify what was processed
immich-go upload from-folder \
--session-tag \
--server=... --api-key=... /remaining-photos/- Immich server properly configured and accessible
- API key created with all necessary permissions
- Sufficient storage space (estimate 1.5x source size)
- Network capacity planned (estimate transfer time)
- Backup of source data created
- Test with small subset of photos
- Verify upload quality and metadata preservation
- Test backup/restore procedures
- Validate performance with expected load
- Clean up source data (remove unwanted files)
- Organize source structure if needed
- Plan migration schedule (off-peak hours)
- Prepare monitoring and logging
# Small test batch
immich-go upload from-folder \
--dry-run \
--server=... --api-key=... /test-photos/# Subset of real data
immich-go upload from-folder \
--session-tag \
--tag="Migration/Pilot" \
--server=... --api-key=... /pilot-batch/# Complete migration with monitoring
immich-go upload from-google-photos \
--session-tag \
--tag="Migration/Full" \
--concurrent-tasks=8 \
--log-file=/var/log/migration.log \
--server=... --api-key=... /takeout-*.zip- Count Verification: Compare source and destination counts
- Spot Checks: Verify random samples for quality
- Metadata Check: Ensure dates, locations, albums preserved
- Organization Review: Confirm albums and tags applied correctly
# Archive original source data after validation
tar -czf google-photos-backup.tar.gz takeout-*.zip
mv google-photos-backup.tar.gz /secure-archive/
# Clean up temporary files
rm -rf /temp/immich-go-*- Examples - Practical implementation examples
- Configuration - Detailed option explanations
- Commands - Complete command reference
- Technical Details - File processing information