add seafile
All checks were successful
Test and Publish Templates / test-and-publish (push) Successful in 7s
All checks were successful
Test and Publish Templates / test-and-publish (push) Successful in 7s
This commit is contained in:
61
seafile/README.txt
Normal file
61
seafile/README.txt
Normal file
@@ -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 <server> 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 <server> 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/
|
||||||
7
seafile/_volumes.sh
Executable file
7
seafile/_volumes.sh
Executable file
@@ -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}"
|
||||||
|
}
|
||||||
32
seafile/backup.sh
Executable file
32
seafile/backup.sh
Executable file
@@ -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"
|
||||||
13
seafile/config/.template_info.env
Normal file
13
seafile/config/.template_info.env
Normal file
@@ -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"
|
||||||
25
seafile/config/service.env
Normal file
25
seafile/config/service.env
Normal file
@@ -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"
|
||||||
22
seafile/destroy.sh
Executable file
22
seafile/destroy.sh
Executable file
@@ -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."
|
||||||
43
seafile/docker-compose.yml
Normal file
43
seafile/docker-compose.yml
Normal file
@@ -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}
|
||||||
29
seafile/install.sh
Executable file
29
seafile/install.sh
Executable file
@@ -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."
|
||||||
16
seafile/logs.sh
Executable file
16
seafile/logs.sh
Executable file
@@ -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
|
||||||
41
seafile/restore.sh
Executable file
41
seafile/restore.sh
Executable file
@@ -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."
|
||||||
15
seafile/start.sh
Executable file
15
seafile/start.sh
Executable file
@@ -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}"
|
||||||
14
seafile/status.sh
Executable file
14
seafile/status.sh
Executable file
@@ -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
|
||||||
14
seafile/stop.sh
Executable file
14
seafile/stop.sh
Executable file
@@ -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"
|
||||||
20
seafile/uninstall.sh
Executable file
20
seafile/uninstall.sh
Executable file
@@ -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"
|
||||||
Reference in New Issue
Block a user