Add 26 files
All checks were successful
Test and Publish Templates / test-and-publish (push) Successful in 8s

This commit is contained in:
j
2026-01-15 11:28:49 +13:00
parent 757b47cf06
commit 710c28aae0
13 changed files with 319 additions and 0 deletions

9
immich/_volumes.sh Executable file
View File

@@ -0,0 +1,9 @@
#!/bin/bash
# Define volume items for immich
# These are used across backup, restore, create, and destroy operations
get_immich_volumes() {
echo "path:uploads:${UPLOAD_LOCATION}"
echo "path:database:${DB_DATA_LOCATION}"
echo "volume:model_cache:${CONTAINER_NAME}_model_cache"
}

36
immich/backup.sh Executable file
View File

@@ -0,0 +1,36 @@
#!/bin/bash
# shellcheck disable=SC1091
source "${AGENT_PATH}/common.sh"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/_volumes.sh"
_check_required_env_vars "CONTAINER_NAME" "BACKUP_FILE" "TEMP_DIR" "UPLOAD_LOCATION" "DB_DATA_LOCATION" "DB_USERNAME"
echo "Backing up ${CONTAINER_NAME}..."
cd "$SCRIPT_DIR" || _die "Failed to change to script directory"
[ -f docker-compose.yml ] || _die "docker-compose.yml not found."
# Dump the database before backup
echo "Dumping PostgreSQL database..."
docker exec "${CONTAINER_NAME}_postgres" pg_dumpall -U "${DB_USERNAME}" > "${TEMP_DIR}/database.sql" \
|| _die "Failed to dump database"
# Copy the dump to the DB data location for inclusion in backup
cp "${TEMP_DIR}/database.sql" "${DB_DATA_LOCATION}/database_backup.sql"
# Stop containers for consistent backup
docker compose stop
# Backup volumes
# shellcheck disable=SC2046
backup_items $(get_immich_volumes) || _die "Failed to create backup"
# Restart containers
docker compose start
# Clean up
rm -f "${DB_DATA_LOCATION}/database_backup.sql"
echo "Backup complete: ${BACKUP_FILE}"

32
immich/config/service.env Normal file
View File

@@ -0,0 +1,32 @@
# Immich - Self-hosted photo and video management
# https://github.com/immich-app/immich
# Server Settings
SSH_USER="dropshell"
# Container name prefix (containers will be named immich_server, immich_redis, etc.)
CONTAINER_NAME=immich
# Immich version - use "release" for latest stable
IMMICH_VERSION=release
# Web UI port
WEB_PORT=2283
# Upload location - where photos/videos are stored
UPLOAD_LOCATION=/path/to/uploads
# Database settings
DB_DATA_LOCATION=/path/to/postgres
DB_PASSWORD=change_me_to_a_secure_password
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
# Optional: Additional read-only media library paths (comma-separated)
# These will be mounted as read-only in the immich-server container
# Example: "/mnt/photos:/photos:ro,/mnt/archive:/archive:ro"
EXTERNAL_LIBRARIES=""
# Machine Learning settings
# For GPU acceleration, change to: release-cuda, release-openvino, or release-armnn
ML_IMAGE_TAG=release

25
immich/destroy.sh Executable file
View File

@@ -0,0 +1,25 @@
#!/bin/bash
# shellcheck disable=SC1091
source "${AGENT_PATH}/common.sh"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/_volumes.sh"
_check_required_env_vars "CONTAINER_NAME"
echo "WARNING: This will PERMANENTLY DELETE all data for ${CONTAINER_NAME}"
cd "$SCRIPT_DIR" || _die "Failed to change to script directory"
# Stop and remove containers and volumes
if [ -f docker-compose.yml ]; then
docker compose down -v 2>/dev/null || true
fi
# Destroy data directories
# shellcheck disable=SC2046
destroy_items $(get_immich_volumes) || _die "Failed to destroy volumes"
# Remove generated compose file
rm -f docker-compose.yml
echo "Destroyed ${CONTAINER_NAME} and all associated data."

View File

@@ -0,0 +1,73 @@
name: ${CONTAINER_NAME}
services:
immich-server:
container_name: ${CONTAINER_NAME}_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /etc/localtime:/etc/localtime:ro
environment:
- DB_PASSWORD=${DB_PASSWORD}
- DB_USERNAME=${DB_USERNAME}
- DB_DATABASE_NAME=${DB_DATABASE_NAME}
- DB_HOSTNAME=${CONTAINER_NAME}_postgres
- REDIS_HOSTNAME=${CONTAINER_NAME}_redis
ports:
- '${WEB_PORT:-2283}:2283'
depends_on:
- redis
- database
restart: unless-stopped
healthcheck:
disable: false
immich-machine-learning:
container_name: ${CONTAINER_NAME}_machine_learning
image: ghcr.io/immich-app/immich-machine-learning:${ML_IMAGE_TAG:-release}
volumes:
- ${CONTAINER_NAME}_model_cache:/cache
environment:
- DB_PASSWORD=${DB_PASSWORD}
- DB_USERNAME=${DB_USERNAME}
- DB_DATABASE_NAME=${DB_DATABASE_NAME}
- DB_HOSTNAME=${CONTAINER_NAME}_postgres
- REDIS_HOSTNAME=${CONTAINER_NAME}_redis
restart: unless-stopped
healthcheck:
disable: false
redis:
container_name: ${CONTAINER_NAME}_redis
image: docker.io/redis:6.2-alpine
healthcheck:
test: redis-cli ping || exit 1
restart: unless-stopped
database:
container_name: ${CONTAINER_NAME}_postgres
image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums'
volumes:
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
healthcheck:
test: pg_isready --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' || exit 1
interval: 5m
command:
[
'postgres',
'-c', 'shared_preload_libraries=vectors.so',
'-c', 'search_path="$$user", public, vectors',
'-c', 'logging_collector=on',
'-c', 'max_wal_size=2GB',
'-c', 'shared_buffers=512MB',
'-c', 'wal_compression=on',
]
restart: unless-stopped
volumes:
${CONTAINER_NAME}_model_cache:

42
immich/install.sh Executable file
View File

@@ -0,0 +1,42 @@
#!/bin/bash
# shellcheck disable=SC1091
source "${AGENT_PATH}/common.sh"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/_volumes.sh"
_check_required_env_vars "CONTAINER_NAME" "UPLOAD_LOCATION" "DB_DATA_LOCATION" "DB_PASSWORD"
# Set defaults
IMMICH_VERSION="${IMMICH_VERSION:-release}"
ML_IMAGE_TAG="${ML_IMAGE_TAG:-release}"
WEB_PORT="${WEB_PORT:-2283}"
DB_USERNAME="${DB_USERNAME:-postgres}"
DB_DATABASE_NAME="${DB_DATABASE_NAME:-immich}"
# Export all variables for envsubst
export CONTAINER_NAME UPLOAD_LOCATION DB_DATA_LOCATION DB_PASSWORD DB_USERNAME DB_DATABASE_NAME
export WEB_PORT IMMICH_VERSION ML_IMAGE_TAG
cd "$SCRIPT_DIR" || _die "Failed to change to script directory"
# Generate docker-compose.yml from template
echo "Generating docker-compose.yml..."
envsubst < docker-compose.yml.template > docker-compose.yml \
|| _die "Failed to generate docker-compose.yml"
# Create data directories
_create_folder "${UPLOAD_LOCATION}"
_create_folder "${DB_DATA_LOCATION}"
# Pull images
echo "Pulling Immich images..."
docker compose pull || _die "Failed to pull images"
# Stop and remove existing containers
bash ./stop.sh 2>/dev/null || true
# Start services
bash ./start.sh || _die "Failed to start containers"
echo "Installation complete for ${CONTAINER_NAME}."
echo "Web UI available at http://localhost:${WEB_PORT}"

12
immich/logs.sh Executable file
View File

@@ -0,0 +1,12 @@
#!/bin/bash
# shellcheck disable=SC1091
source "${AGENT_PATH}/common.sh"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
_check_required_env_vars "CONTAINER_NAME"
cd "$SCRIPT_DIR" || _die "Failed to change to script directory"
[ -f docker-compose.yml ] || _die "docker-compose.yml not found."
docker compose logs -f

21
immich/restore.sh Executable file
View File

@@ -0,0 +1,21 @@
#!/bin/bash
# shellcheck disable=SC1091
source "${AGENT_PATH}/common.sh"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/_volumes.sh"
_check_required_env_vars "CONTAINER_NAME" "BACKUP_FILE" "TEMP_DIR" "UPLOAD_LOCATION" "DB_DATA_LOCATION"
echo "Restoring ${CONTAINER_NAME} from backup..."
# Uninstall before restore
bash ./uninstall.sh || _die "Failed to uninstall service before restore"
# Restore volumes from backup
# shellcheck disable=SC2046
restore_items $(get_immich_volumes) || _die "Failed to restore from backup"
# Reinstall service
bash ./install.sh || _die "Failed to reinstall service after restore"
echo "Restore complete! Service ${CONTAINER_NAME} is running."

14
immich/start.sh Executable file
View File

@@ -0,0 +1,14 @@
#!/bin/bash
# shellcheck disable=SC1091
source "${AGENT_PATH}/common.sh"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
_check_required_env_vars "CONTAINER_NAME"
cd "$SCRIPT_DIR" || _die "Failed to change to script directory"
[ -f docker-compose.yml ] || _die "docker-compose.yml not found. Run install.sh first."
docker compose up -d || _die "Failed to start containers"
echo "Immich containers started successfully."

13
immich/status.sh Executable file
View File

@@ -0,0 +1,13 @@
#!/bin/bash
# shellcheck disable=SC1091
source "${AGENT_PATH}/common.sh"
_check_required_env_vars "CONTAINER_NAME"
# Check if main server container is running
if ! _is_container_running "${CONTAINER_NAME}_server"; then
_die "Service is not running - container ${CONTAINER_NAME}_server not found or stopped."
fi
echo "Service is healthy"
exit 0

16
immich/stop.sh Executable file
View File

@@ -0,0 +1,16 @@
#!/bin/bash
# shellcheck disable=SC1091
source "${AGENT_PATH}/common.sh"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
_check_required_env_vars "CONTAINER_NAME"
echo "Stopping ${CONTAINER_NAME}..."
cd "$SCRIPT_DIR" || _die "Failed to change to script directory"
[ -f docker-compose.yml ] || _die "docker-compose.yml not found."
docker compose stop || _die "Failed to stop containers"
echo "Immich containers stopped."

8
immich/template_info.env Normal file
View File

@@ -0,0 +1,8 @@
# Template info - AUTO GENERATED, DO NOT EDIT
TEMPLATE=immich
REQUIRES_HOST_ROOT=false
REQUIRES_DOCKER=true
REQUIRES_DOCKER_ROOT=true
# Default container name prefix
CONTAINER_NAME=immich

18
immich/uninstall.sh Executable file
View File

@@ -0,0 +1,18 @@
#!/bin/bash
# shellcheck disable=SC1091
source "${AGENT_PATH}/common.sh"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
_check_required_env_vars "CONTAINER_NAME"
echo "Uninstalling ${CONTAINER_NAME}..."
cd "$SCRIPT_DIR" || _die "Failed to change to script directory"
# Stop and remove containers (preserves volumes)
if [ -f docker-compose.yml ]; then
docker compose down 2>/dev/null || true
fi
echo "Uninstallation of ${CONTAINER_NAME} complete."
echo "Data preserved in upload and database locations."