Files
seafile/swarm-compose.yml

252 lines
6.5 KiB
YAML

version: "3.8"
x-deploy-default: &deploy_default
replicas: 1
restart_policy:
condition: any
delay: 5s
max_attempts: 3
window: 30s
placement:
constraints:
# IMPORTANT: because these are bind-backed volumes, keep services on the node that has the data paths.
- node.hostname == little
services:
elasticsearch:
image: elasticsearch:8.15.0
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms2g -Xmx2g"
- "xpack.security.enabled=false"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- seafile_elasticsearch_data:/usr/share/elasticsearch/data
networks:
- net
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:9200/_cluster/health || exit 1"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
deploy:
<<: *deploy_default
resources:
limits:
memory: 4G
db:
image: mariadb:10.11
command:
- --wait_timeout=28800
- --interactive_timeout=28800
- --max_connections=500
- --net_read_timeout=60
- --net_write_timeout=60
- --max_allowed_packet=64M
environment:
- MARIADB_ROOT_PASSWORD=squirtle123456
- MYSQL_LOG_CONSOLE=true
- MARIADB_AUTO_UPGRADE=1
volumes:
- seafile_mysql_data:/var/lib/mysql
networks:
- net
healthcheck:
test:
[
"CMD",
"/usr/local/bin/healthcheck.sh",
"--connect",
"--mariadbupgrade",
"--innodb_initialized",
]
interval: 20s
start_period: 30s
timeout: 5s
retries: 10
deploy:
<<: *deploy_default
redis:
image: redis
command:
- /bin/sh
- -c
- |
if [ -n "$$REDIS_PASSWORD" ]; then
redis-server --requirepass "$$REDIS_PASSWORD"
else
redis-server
fi
environment:
- REDIS_PASSWORD=
networks:
- net
healthcheck:
test: ["CMD-SHELL", "redis-cli ping || exit 1"]
interval: 10s
timeout: 3s
retries: 3
start_period: 10s
deploy:
<<: *deploy_default
seafile:
image: seafileltd/seafile-pro-mc:13.0-latest
volumes:
- seafile_shared:/shared
environment:
- INIT_SEAFILE_MYSQL_ROOT_PASSWORD=squirtle123456
- SEAFILE_MYSQL_DB_HOST=db
- SEAFILE_MYSQL_DB_PORT=3306
- SEAFILE_MYSQL_DB_USER=seafile
- SEAFILE_MYSQL_DB_PASSWORD=squirtle123456
- SEAFILE_MYSQL_DB_CCNET_DB_NAME=ccnet_db
- SEAFILE_MYSQL_DB_SEAFILE_DB_NAME=seafile_db
- SEAFILE_MYSQL_DB_SEAHUB_DB_NAME=seahub_db
- TIME_ZONE=Etc/UTC
- INIT_SEAFILE_ADMIN_EMAIL=travis.vas@gmail.com
- INIT_SEAFILE_ADMIN_PASSWORD=squirtle123
- SEAFILE_SERVER_HOSTNAME=sf.lab
- SEAFILE_SERVER_PROTOCOL=http
- SITE_ROOT=/
- NON_ROOT=false
- JWT_PRIVATE_KEY=51a482da346fa9a7ea050600c30348b367f7a7144b814273e152c2c8f95965cc
- SEAFILE_LOG_TO_STDOUT=false
- ENABLE_SEADOC=true
- SEADOC_SERVER_URL=http://sf.lab/sdoc-server
- CACHE_PROVIDER=redis
- REDIS_HOST=redis
- REDIS_PORT=6379
- REDIS_PASSWORD=
- MEMCACHED_HOST=memcached
- MEMCACHED_PORT=11211
- SEAF_SERVER_STORAGE_TYPE=disk
- S3_COMMIT_BUCKET=
- S3_FS_BUCKET=
- S3_BLOCK_BUCKET=
- S3_KEY_ID=
- S3_SECRET_KEY=
- S3_USE_V4_SIGNATURE=true
- S3_AWS_REGION=us-east-1
- S3_HOST=
- S3_USE_HTTPS=true
- S3_PATH_STYLE_REQUEST=false
- S3_SSE_C_KEY=
- ENABLE_NOTIFICATION_SERVER=false
- INNER_NOTIFICATION_SERVER_URL=http://notification-server:8083
- NOTIFICATION_SERVER_URL=http://sf.lab/notification
- ENABLE_SEAFILE_AI=true
- SEAFILE_AI_SERVER_URL=http://seafile-ai:8888
- SEAFILE_AI_SECRET_KEY=51a482da346fa9a7ea050600c30348b367f7a7144b814273e152c2c8f95965cc
- SEAFILE_AI_LLM_TYPE=openai
- SEAFILE_AI_LLM_URL=http://llm.lab
- SEAFILE_AI_LLM_KEY=sk-1234
- SEAFILE_AI_LLM_MODEL=deepseek-v3p2
- MD_FILE_COUNT_LIMIT=100000
networks:
- net
- public
- badge-net
expose:
- "80"
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:80 || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
deploy:
<<: *deploy_default
labels:
- "traefik.enable=true"
- "traefik.docker.network=public"
- "traefik.http.routers.seafile.rule=Host(`sf.lab`)"
- "traefik.http.routers.seafile.entrypoints=web"
- "traefik.http.services.seafile.loadbalancer.server.port=80"
# Ensure Seadoc path routers win
- "traefik.http.routers.seafile.priority=10"
seadoc:
image: seafileltd/sdoc-server:2.0-latest
volumes:
- seadoc_shared:/shared
environment:
- DB_HOST=db
- DB_PORT=3306
- DB_USER=seafile
- DB_PASSWORD=squirtle123456
- DB_NAME=seahub_db
- TIME_ZONE=Etc/UTC
- JWT_PRIVATE_KEY=51a482da346fa9a7ea050600c30348b367f7a7144b814273e152c2c8f95965cc
- NON_ROOT=false
- SEAHUB_SERVICE_URL=http://seafile
networks:
- net
- public
- badge-net
expose:
- "80"
deploy:
<<: *deploy_default
labels:
- "traefik.enable=true"
- "traefik.docker.network=public"
# Route Seadoc endpoints on the same host:
- "traefik.http.routers.seadoc.rule=Host(`sf.lab`) && (PathPrefix(`/socket.io`) || PathPrefix(`/sdoc-server`))"
- "traefik.http.routers.seadoc.entrypoints=web"
- "traefik.http.routers.seadoc.priority=100"
- "traefik.http.services.seadoc.loadbalancer.server.port=80"
volumes:
seafile_elasticsearch_data:
name: seafile_elasticsearch_data
driver: local
driver_opts:
type: none
o: bind
device: /home/trav/seafile/seafile-elasticsearch/data
seafile_mysql_data:
name: seafile_mysql_data
driver: local
driver_opts:
type: none
o: bind
device: /home/trav/seafile/seafile-mysql/db
seafile_shared:
name: seafile_shared
driver: local
driver_opts:
type: none
o: bind
device: /home/trav/seafile/seafile-data
seadoc_shared:
name: seadoc_shared
driver: local
driver_opts:
type: none
o: bind
device: /home/trav/seafile/seadoc-data
networks:
net:
driver: overlay
attachable: true
public:
external: true
name: public
badge-net:
external: true
name: badge-net