From 2053e78ee0b6256504a9be294933f40453c798dd Mon Sep 17 00:00:00 2001 From: j Date: Mon, 29 Dec 2025 12:53:02 +1300 Subject: [PATCH] add seafile --- seafile/README.txt | 61 +++++++++++++++++++++++++++++++ seafile/_volumes.sh | 7 ++++ seafile/backup.sh | 32 ++++++++++++++++ seafile/config/.template_info.env | 13 +++++++ seafile/config/service.env | 25 +++++++++++++ seafile/destroy.sh | 22 +++++++++++ seafile/docker-compose.yml | 43 ++++++++++++++++++++++ seafile/install.sh | 29 +++++++++++++++ seafile/logs.sh | 16 ++++++++ seafile/restore.sh | 41 +++++++++++++++++++++ seafile/start.sh | 15 ++++++++ seafile/status.sh | 14 +++++++ seafile/stop.sh | 14 +++++++ seafile/uninstall.sh | 20 ++++++++++ 14 files changed, 352 insertions(+) create mode 100644 seafile/README.txt create mode 100755 seafile/_volumes.sh create mode 100755 seafile/backup.sh create mode 100644 seafile/config/.template_info.env create mode 100644 seafile/config/service.env create mode 100755 seafile/destroy.sh create mode 100644 seafile/docker-compose.yml create mode 100755 seafile/install.sh create mode 100755 seafile/logs.sh create mode 100755 seafile/restore.sh create mode 100755 seafile/start.sh create mode 100755 seafile/status.sh create mode 100755 seafile/stop.sh create mode 100755 seafile/uninstall.sh diff --git a/seafile/README.txt b/seafile/README.txt new file mode 100644 index 0000000..968ca8d --- /dev/null +++ b/seafile/README.txt @@ -0,0 +1,61 @@ +Template: seafile + +Seafile is an open source file sync and share solution designed for high reliability, +performance, and productivity. It enables you to easily host your own cloud storage +service with clients for Windows, Mac, Linux, iOS, and Android. + +QUICK START +----------- +1. Edit config/service.env to customize your deployment: + - Set SEAFILE_SERVER_HOSTNAME to your domain/IP + - Change SEAFILE_ADMIN_EMAIL and SEAFILE_ADMIN_PASSWORD + - Change MYSQL_ROOT_PASSWORD and DB_PASSWORD + - Set DATA_PATH to your desired storage location + - Adjust HTTP_PORT if needed (default: 8080) + +2. Run 'dropshell validate seafile' to check for issues +3. Deploy with 'dropshell install seafile' + +ARCHITECTURE +------------ +This template deploys three containers using docker-compose: +- seafile: Main Seafile server (seafileltd/seafile-mc) +- db: MariaDB database (mariadb:10.11) +- memcached: Caching layer (memcached:1.6-alpine) + +DATA STORAGE +------------ +All data is stored in the host directory specified by DATA_PATH: +- ${DATA_PATH}/seafile-data/ : Seafile files, configs, and logs +- ${DATA_PATH}/mariadb/ : MariaDB database files + +DEFAULT PORTS +------------- +- HTTP_PORT (default 8080): Web interface and file sync + +CONFIGURATION +------------- +Key variables in service.env: +- CONTAINER_NAME : Base name for containers +- DATA_PATH : Host directory for persistent data +- HTTP_PORT : Web interface port +- SEAFILE_SERVER_HOSTNAME : Your server's hostname/domain +- SEAFILE_SERVER_PROTOCOL : http or https +- SEAFILE_ADMIN_EMAIL : Admin account email +- SEAFILE_ADMIN_PASSWORD : Admin account password +- MYSQL_ROOT_PASSWORD : MariaDB root password +- TZ : Timezone (e.g., UTC, Europe/London) + +FIRST STARTUP +------------- +The first startup takes several minutes as Seafile initializes the database. +Check progress with: dropshell logs seafile + +ACCESS +------ +After installation, access Seafile at: + ${SEAFILE_SERVER_PROTOCOL}://${SEAFILE_SERVER_HOSTNAME}:${HTTP_PORT} + +Login with the admin credentials you configured in service.env. + +For full documentation, see: https://manual.seafile.com/ diff --git a/seafile/_volumes.sh b/seafile/_volumes.sh new file mode 100755 index 0000000..74654a5 --- /dev/null +++ b/seafile/_volumes.sh @@ -0,0 +1,7 @@ +#!/bin/bash +# Define volume items for seafile container +# These are used across backup, restore, create, and destroy operations + +get_seafile_volumes() { + echo "path:data:${DATA_PATH}" +} diff --git a/seafile/backup.sh b/seafile/backup.sh new file mode 100755 index 0000000..97993e6 --- /dev/null +++ b/seafile/backup.sh @@ -0,0 +1,32 @@ +#!/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" "DATA_PATH" + +# Export variables for docker compose +export CONTAINER_NAME DATA_PATH HTTP_PORT IMAGE_REGISTRY IMAGE_REPO IMAGE_TAG +export MYSQL_ROOT_PASSWORD DB_PASSWORD SEAFILE_ADMIN_EMAIL SEAFILE_ADMIN_PASSWORD +export SEAFILE_SERVER_HOSTNAME SEAFILE_SERVER_PROTOCOL TZ + +cd "$SCRIPT_DIR" || _die "Failed to change to script directory" + +# Dump MariaDB database before backup +echo "Dumping MariaDB database..." +docker exec "${CONTAINER_NAME}_db" mariadb-dump -u root -p"${MYSQL_ROOT_PASSWORD}" --all-databases > "${DATA_PATH}/database.sql" || _die "Failed to dump database" + +# Stop containers for consistent backup +docker compose stop + +# Backup using dropshell's backup system +# shellcheck disable=SC2046 +backup_items $(get_seafile_volumes) || _die "Failed to create backup" + +# Clean up database dump (it's now in the backup) +rm -f "${DATA_PATH}/database.sql" + +# Restart containers +docker compose start + +echo "Backup created successfully" diff --git a/seafile/config/.template_info.env b/seafile/config/.template_info.env new file mode 100644 index 0000000..1d37969 --- /dev/null +++ b/seafile/config/.template_info.env @@ -0,0 +1,13 @@ +# DO NOT EDIT THIS FILE FOR YOUR SERVICE! +# This file is replaced from the template whenever there is an update. +# Edit the service.env file to make changes. + +# Template to use - always required! +TEMPLATE=seafile +REQUIRES_HOST_ROOT=false +REQUIRES_DOCKER=true +REQUIRES_DOCKER_ROOT=false + +# Image settings (used by docker-compose.yml) +IMAGE_REGISTRY="docker.io" +IMAGE_REPO="seafileltd/seafile-mc" diff --git a/seafile/config/service.env b/seafile/config/service.env new file mode 100644 index 0000000..ebf9760 --- /dev/null +++ b/seafile/config/service.env @@ -0,0 +1,25 @@ +# Service settings specific to this server +CONTAINER_NAME=seafile +IMAGE_TAG="12.0-latest" + +# Server Settings +SSH_USER="root" + +# Data path on host for persistent storage +DATA_PATH="/home/dropshell/seafile" + +# Seafile server configuration +SEAFILE_SERVER_HOSTNAME="seafile.example.com" +SEAFILE_SERVER_PROTOCOL="http" +HTTP_PORT=8080 + +# Admin credentials (change these!) +SEAFILE_ADMIN_EMAIL="admin@example.com" +SEAFILE_ADMIN_PASSWORD="changeme" + +# Database settings (change the password!) +MYSQL_ROOT_PASSWORD="db_root_changeme" +DB_PASSWORD="db_seafile_changeme" + +# Timezone +TZ="UTC" diff --git a/seafile/destroy.sh b/seafile/destroy.sh new file mode 100755 index 0000000..ada8186 --- /dev/null +++ b/seafile/destroy.sh @@ -0,0 +1,22 @@ +#!/bin/bash +source "${AGENT_PATH}/common.sh" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +_check_required_env_vars "CONTAINER_NAME" "DATA_PATH" + +# Export variables for docker compose +export CONTAINER_NAME DATA_PATH HTTP_PORT IMAGE_REGISTRY IMAGE_REPO IMAGE_TAG +export MYSQL_ROOT_PASSWORD DB_PASSWORD SEAFILE_ADMIN_EMAIL SEAFILE_ADMIN_PASSWORD +export SEAFILE_SERVER_HOSTNAME SEAFILE_SERVER_PROTOCOL TZ + +echo "WARNING: This will PERMANENTLY DELETE all data for ${CONTAINER_NAME}" +echo "This includes all files, database, and configuration!" + +cd "$SCRIPT_DIR" || _die "Failed to change to script directory" + +# Stop and remove containers +docker compose down -v 2>/dev/null || true + +# Remove data directory +rm -rf "${DATA_PATH}" + +echo "Destroyed ${CONTAINER_NAME} and all data." diff --git a/seafile/docker-compose.yml b/seafile/docker-compose.yml new file mode 100644 index 0000000..26619ab --- /dev/null +++ b/seafile/docker-compose.yml @@ -0,0 +1,43 @@ +services: + db: + image: mariadb:10.11 + container_name: ${CONTAINER_NAME}_db + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} + MYSQL_LOG_CONSOLE: "true" + volumes: + - ${DATA_PATH}/mariadb:/var/lib/mysql + healthcheck: + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + interval: 10s + timeout: 5s + retries: 5 + + memcached: + image: memcached:1.6-alpine + container_name: ${CONTAINER_NAME}_memcached + restart: unless-stopped + entrypoint: memcached -m 256 + + seafile: + image: ${IMAGE_REGISTRY}/${IMAGE_REPO}:${IMAGE_TAG} + container_name: ${CONTAINER_NAME} + restart: unless-stopped + depends_on: + db: + condition: service_healthy + memcached: + condition: service_started + ports: + - "${HTTP_PORT}:80" + volumes: + - ${DATA_PATH}/seafile-data:/shared + environment: + DB_HOST: ${CONTAINER_NAME}_db + DB_ROOT_PASSWD: ${MYSQL_ROOT_PASSWORD} + SEAFILE_ADMIN_EMAIL: ${SEAFILE_ADMIN_EMAIL} + SEAFILE_ADMIN_PASSWORD: ${SEAFILE_ADMIN_PASSWORD} + SEAFILE_SERVER_HOSTNAME: ${SEAFILE_SERVER_HOSTNAME} + SEAFILE_SERVER_LETSENCRYPT: "false" + TIME_ZONE: ${TZ} diff --git a/seafile/install.sh b/seafile/install.sh new file mode 100755 index 0000000..dcb8ac3 --- /dev/null +++ b/seafile/install.sh @@ -0,0 +1,29 @@ +#!/bin/bash +source "${AGENT_PATH}/common.sh" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +_check_required_env_vars "CONTAINER_NAME" "DATA_PATH" "MYSQL_ROOT_PASSWORD" "SEAFILE_ADMIN_EMAIL" "SEAFILE_ADMIN_PASSWORD" "SEAFILE_SERVER_HOSTNAME" + +_check_docker_installed || _die "Docker test failed, aborting installation..." + +# Create data directories +mkdir -p "${DATA_PATH}/mariadb" "${DATA_PATH}/seafile-data" + +# Export variables for docker compose +export CONTAINER_NAME DATA_PATH HTTP_PORT IMAGE_REGISTRY IMAGE_REPO IMAGE_TAG +export MYSQL_ROOT_PASSWORD DB_PASSWORD SEAFILE_ADMIN_EMAIL SEAFILE_ADMIN_PASSWORD +export SEAFILE_SERVER_HOSTNAME SEAFILE_SERVER_PROTOCOL TZ + +cd "$SCRIPT_DIR" || _die "Failed to change to script directory" + +# Pull images +docker compose pull || _die "Failed to pull images" + +# Stop existing containers +docker compose down 2>/dev/null || true + +# Start containers +docker compose up -d || _die "Failed to start containers" + +echo "Installation of ${CONTAINER_NAME} complete" +echo "Access Seafile at ${SEAFILE_SERVER_PROTOCOL}://${SEAFILE_SERVER_HOSTNAME}:${HTTP_PORT}" +echo "Note: First startup may take a few minutes while Seafile initializes the database." diff --git a/seafile/logs.sh b/seafile/logs.sh new file mode 100755 index 0000000..341eceb --- /dev/null +++ b/seafile/logs.sh @@ -0,0 +1,16 @@ +#!/bin/bash +source "${AGENT_PATH}/common.sh" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +_check_required_env_vars "CONTAINER_NAME" + +# Export variables for docker compose +export CONTAINER_NAME DATA_PATH HTTP_PORT IMAGE_REGISTRY IMAGE_REPO IMAGE_TAG +export MYSQL_ROOT_PASSWORD DB_PASSWORD SEAFILE_ADMIN_EMAIL SEAFILE_ADMIN_PASSWORD +export SEAFILE_SERVER_HOSTNAME SEAFILE_SERVER_PROTOCOL TZ + +cd "$SCRIPT_DIR" || _die "Failed to change to script directory" + +echo "Container ${CONTAINER_NAME} logs:" +_grey_start +docker compose logs "$@" +_grey_end diff --git a/seafile/restore.sh b/seafile/restore.sh new file mode 100755 index 0000000..6513852 --- /dev/null +++ b/seafile/restore.sh @@ -0,0 +1,41 @@ +#!/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" "DATA_PATH" + +# Export variables for docker compose +export CONTAINER_NAME DATA_PATH HTTP_PORT IMAGE_REGISTRY IMAGE_REPO IMAGE_TAG +export MYSQL_ROOT_PASSWORD DB_PASSWORD SEAFILE_ADMIN_EMAIL SEAFILE_ADMIN_PASSWORD +export SEAFILE_SERVER_HOSTNAME SEAFILE_SERVER_PROTOCOL TZ + +cd "$SCRIPT_DIR" || _die "Failed to change to script directory" + +# Stop and remove containers before restore +docker compose down + +# Restore files using dropshell's restore system +# shellcheck disable=SC2046 +restore_items $(get_seafile_volumes) || _die "Failed to restore data from backup file" + +# Start database container only +docker compose up -d db +echo "Waiting for database to be ready..." +sleep 10 + +# Restore database if dump exists +if [ -f "${DATA_PATH}/database.sql" ]; then + echo "Restoring MariaDB database..." + docker exec -i "${CONTAINER_NAME}_db" mariadb -u root -p"${MYSQL_ROOT_PASSWORD}" < "${DATA_PATH}/database.sql" || _die "Failed to restore database" + # Clean up dump file + rm -f "${DATA_PATH}/database.sql" + echo "Database restored successfully" +else + echo "Warning: No database dump found in backup" +fi + +# Start all containers +docker compose up -d + +echo "Restore complete! Service is running." diff --git a/seafile/start.sh b/seafile/start.sh new file mode 100755 index 0000000..f57c7f3 --- /dev/null +++ b/seafile/start.sh @@ -0,0 +1,15 @@ +#!/bin/bash +source "${AGENT_PATH}/common.sh" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +_check_required_env_vars "CONTAINER_NAME" "DATA_PATH" + +# Export variables for docker compose +export CONTAINER_NAME DATA_PATH HTTP_PORT IMAGE_REGISTRY IMAGE_REPO IMAGE_TAG +export MYSQL_ROOT_PASSWORD DB_PASSWORD SEAFILE_ADMIN_EMAIL SEAFILE_ADMIN_PASSWORD +export SEAFILE_SERVER_HOSTNAME SEAFILE_SERVER_PROTOCOL TZ + +cd "$SCRIPT_DIR" || _die "Failed to change to script directory" +docker compose up -d || _die "Failed to start containers" + +echo "Container ${CONTAINER_NAME} started" +echo "Access Seafile at ${SEAFILE_SERVER_PROTOCOL}://${SEAFILE_SERVER_HOSTNAME}:${HTTP_PORT}" diff --git a/seafile/status.sh b/seafile/status.sh new file mode 100755 index 0000000..1dea7c0 --- /dev/null +++ b/seafile/status.sh @@ -0,0 +1,14 @@ +#!/bin/bash +source "${AGENT_PATH}/common.sh" +_check_required_env_vars "CONTAINER_NAME" + +# Check if main seafile container is running +if docker ps --format "{{.Names}}" | grep -q "^${CONTAINER_NAME}$"; then + echo "Running" +else + if docker ps -a --format "{{.Names}}" | grep -q "^${CONTAINER_NAME}$"; then + echo "Stopped" + else + echo "Unknown" + fi +fi diff --git a/seafile/stop.sh b/seafile/stop.sh new file mode 100755 index 0000000..14a92be --- /dev/null +++ b/seafile/stop.sh @@ -0,0 +1,14 @@ +#!/bin/bash +source "${AGENT_PATH}/common.sh" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +_check_required_env_vars "CONTAINER_NAME" + +# Export variables for docker compose +export CONTAINER_NAME DATA_PATH HTTP_PORT IMAGE_REGISTRY IMAGE_REPO IMAGE_TAG +export MYSQL_ROOT_PASSWORD DB_PASSWORD SEAFILE_ADMIN_EMAIL SEAFILE_ADMIN_PASSWORD +export SEAFILE_SERVER_HOSTNAME SEAFILE_SERVER_PROTOCOL TZ + +cd "$SCRIPT_DIR" || _die "Failed to change to script directory" +docker compose stop || _die "Failed to stop containers" + +echo "Container ${CONTAINER_NAME} stopped" diff --git a/seafile/uninstall.sh b/seafile/uninstall.sh new file mode 100755 index 0000000..b9f8aee --- /dev/null +++ b/seafile/uninstall.sh @@ -0,0 +1,20 @@ +#!/bin/bash +source "${AGENT_PATH}/common.sh" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +_check_required_env_vars "CONTAINER_NAME" "DATA_PATH" + +# Export variables for docker compose +export CONTAINER_NAME DATA_PATH HTTP_PORT IMAGE_REGISTRY IMAGE_REPO IMAGE_TAG +export MYSQL_ROOT_PASSWORD DB_PASSWORD SEAFILE_ADMIN_EMAIL SEAFILE_ADMIN_PASSWORD +export SEAFILE_SERVER_HOSTNAME SEAFILE_SERVER_PROTOCOL TZ + +cd "$SCRIPT_DIR" || _die "Failed to change to script directory" + +# Stop and remove containers (but preserve volumes/data) +docker compose down || _die "Failed to stop containers" + +# Remove images +docker compose config --images | xargs -r docker rmi 2>/dev/null || true + +echo "Uninstallation of ${CONTAINER_NAME} complete." +echo "Data preserved in ${DATA_PATH}. To remove all data, use destroy.sh"