aboutsummaryrefslogtreecommitdiff
path: root/docker
diff options
context:
space:
mode:
authorbingoohuang <bingoo.huang@gmail.com>2021-04-26 17:19:35 +0800
committerbingoohuang <bingoo.huang@gmail.com>2021-04-26 17:19:35 +0800
commitd861cbd81b75b6684c971ac00e33685e6575b833 (patch)
tree301805fef4aa5d0096bfb1510536f7a009b661e7 /docker
parent70da715d8d917527291b35fb069fac077d17b868 (diff)
parent4ee58922eff61a5a4ca29c0b4829b097a498549e (diff)
downloadseaweedfs-d861cbd81b75b6684c971ac00e33685e6575b833.tar.xz
seaweedfs-d861cbd81b75b6684c971ac00e33685e6575b833.zip
Merge branch 'master' of https://github.com/bingoohuang/seaweedfs
Diffstat (limited to 'docker')
-rw-r--r--docker/Dockerfile30
-rw-r--r--docker/Dockerfile.go_build25
-rw-r--r--docker/Dockerfile.go_build_large42
-rw-r--r--docker/Dockerfile.local32
-rw-r--r--docker/Dockerfile.s3tests31
-rw-r--r--docker/Makefile63
-rw-r--r--docker/README.md22
-rw-r--r--docker/compose/dev.env0
-rw-r--r--docker/compose/local-cluster-compose.yml75
-rw-r--r--docker/compose/local-clusters-compose.yml28
-rw-r--r--docker/compose/local-dev-compose.yml67
-rw-r--r--docker/compose/local-k8s-compose.yml94
-rw-r--r--docker/compose/local-minio-gateway-compose.yml50
-rw-r--r--docker/compose/local-mount-compose.yml46
-rw-r--r--docker/compose/local-mount-profile-compose.yml47
-rw-r--r--docker/compose/local-registry-compose.yml85
-rw-r--r--docker/compose/local-replicate-compose.yml61
-rw-r--r--docker/compose/local-s3tests-compose.yml45
-rw-r--r--docker/compose/master-cloud.toml30
-rw-r--r--docker/compose/notification.toml17
-rw-r--r--docker/compose/replication.toml11
-rw-r--r--docker/compose/s3.json105
-rw-r--r--docker/compose/s3tests.conf70
-rw-r--r--docker/compose/swarm-etcd.yml84
-rw-r--r--docker/compose/tls.env14
-rw-r--r--docker/dev-compose.yml43
-rwxr-xr-xdocker/entrypoint.sh67
-rw-r--r--docker/nginx/proxy.conf30
-rw-r--r--docker/prometheus/prometheus.yml13
-rw-r--r--docker/seaweedfs-compose.yml57
-rw-r--r--docker/seaweedfs-dev-compose.yml44
-rw-r--r--docker/seaweedfs.sql12
32 files changed, 1334 insertions, 106 deletions
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 38117a3dc..2165466ca 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -1,15 +1,23 @@
-FROM frolvlad/alpine-glibc
+FROM alpine
-# Supercronic install settings
-ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.1.8/supercronic-linux-amd64 \
- SUPERCRONIC=supercronic-linux-amd64 \
- SUPERCRONIC_SHA1SUM=be43e64c45acd6ec4fce5831e03759c89676a0ea
+# 'latest' or 'dev'
+ARG RELEASE=latest
-# Install SeaweedFS and Supercronic ( for cron job mode )
-# Tried to use curl only (curl -o /tmp/linux_amd64.tar.gz ...), however it turned out that the following tar command failed with "gzip: stdin: not in gzip format"
-RUN apk add --no-cache --virtual build-dependencies --update wget curl ca-certificates && \
- wget -P /tmp https://github.com/$(curl -s -L https://github.com/chrislusf/seaweedfs/releases/latest | egrep -o 'chrislusf/seaweedfs/releases/download/.*/linux_amd64.tar.gz') && \
- tar -C /usr/bin/ -xzvf /tmp/linux_amd64.tar.gz && \
+RUN \
+ ARCH=$(if [ $(uname -m) == "x86_64" ] && [ $(getconf LONG_BIT) == "64" ]; then echo "amd64"; \
+ elif [ $(uname -m) == "x86_64" ] && [ $(getconf LONG_BIT) == "32" ]; then echo "386"; \
+ elif [ $(uname -m) == "aarch64" ]; then echo "arm64"; \
+ elif [ $(uname -m) == "armv7l" ]; then echo "arm"; \
+ elif [ $(uname -m) == "armv6l" ]; then echo "arm"; fi;) && \
+ echo "Building for $ARCH" 1>&2 && \
+ SUPERCRONIC_SHA1SUM=$(echo $ARCH | sed 's/386/e0126b0102b9f388ecd55714358e3ad60d0cebdb/g' | sed 's/amd64/5ddf8ea26b56d4a7ff6faecdd8966610d5cb9d85/g' | sed 's/arm64/e2714c43e7781bf1579c85aa61259245f56dbba1/g' | sed 's/arm/47481c3341bc3a1ae91a728e0cc63c8e6d3791ad/g') && \
+ SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.1.9/supercronic-linux-$ARCH && \
+ SUPERCRONIC=supercronic-linux-$ARCH && \
+ # Install SeaweedFS and Supercronic ( for cron job mode )
+ apk add --no-cache --virtual build-dependencies --update wget curl ca-certificates && \
+ apk add fuse && \
+ wget -P /tmp https://github.com/$(curl -s -L https://github.com/chrislusf/seaweedfs/releases/${RELEASE} | egrep -o "chrislusf/seaweedfs/releases/download/.*/linux_$ARCH.tar.gz") && \
+ tar -C /usr/bin/ -xzvf /tmp/linux_$ARCH.tar.gz && \
curl -fsSLO "$SUPERCRONIC_URL" && \
echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - && \
chmod +x "$SUPERCRONIC" && \
@@ -32,6 +40,8 @@ EXPOSE 19333
EXPOSE 9333
# s3 server http port
EXPOSE 8333
+# webdav server http port
+EXPOSE 7333
RUN mkdir -p /data/filerldb2
diff --git a/docker/Dockerfile.go_build b/docker/Dockerfile.go_build
index 85cbb6143..1adf0f5ef 100644
--- a/docker/Dockerfile.go_build
+++ b/docker/Dockerfile.go_build
@@ -1,5 +1,20 @@
-FROM golang:latest
-RUN go get github.com/chrislusf/seaweedfs/weed
+FROM frolvlad/alpine-glibc as builder
+RUN apk add git go g++ fuse
+RUN mkdir -p /go/src/github.com/chrislusf/
+RUN git clone https://github.com/chrislusf/seaweedfs /go/src/github.com/chrislusf/seaweedfs
+ARG BRANCH=${BRANCH:-master}
+RUN cd /go/src/github.com/chrislusf/seaweedfs && git checkout $BRANCH
+RUN cd /go/src/github.com/chrislusf/seaweedfs/weed \
+ && export LDFLAGS="-X github.com/chrislusf/seaweedfs/weed/util.COMMIT=$(git rev-parse --short HEAD)" \
+ && CGO_ENABLED=0 go install -ldflags "-extldflags -static ${LDFLAGS}"
+
+FROM alpine AS final
+LABEL author="Chris Lu"
+COPY --from=builder /root/go/bin/weed /usr/bin/
+RUN mkdir -p /etc/seaweedfs
+COPY --from=builder /go/src/github.com/chrislusf/seaweedfs/docker/filer.toml /etc/seaweedfs/filer.toml
+COPY --from=builder /go/src/github.com/chrislusf/seaweedfs/docker/entrypoint.sh /entrypoint.sh
+RUN apk add fuse # for weed mount
# volume server gprc port
EXPOSE 18080
@@ -15,15 +30,13 @@ EXPOSE 19333
EXPOSE 9333
# s3 server http port
EXPOSE 8333
+# webdav server http port
+EXPOSE 7333
RUN mkdir -p /data/filerldb2
VOLUME /data
-RUN mkdir -p /etc/seaweedfs
-RUN cp /go/src/github.com/chrislusf/seaweedfs/docker/filer.toml /etc/seaweedfs/filer.toml
-RUN cp /go/src/github.com/chrislusf/seaweedfs/docker/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
-RUN cp /go/bin/weed /usr/bin/
ENTRYPOINT ["/entrypoint.sh"]
diff --git a/docker/Dockerfile.go_build_large b/docker/Dockerfile.go_build_large
new file mode 100644
index 000000000..48af3381d
--- /dev/null
+++ b/docker/Dockerfile.go_build_large
@@ -0,0 +1,42 @@
+FROM frolvlad/alpine-glibc as builder
+RUN apk add git go g++ fuse
+RUN mkdir -p /go/src/github.com/chrislusf/
+RUN git clone https://github.com/chrislusf/seaweedfs /go/src/github.com/chrislusf/seaweedfs
+ARG BRANCH=${BRANCH:-master}
+RUN cd /go/src/github.com/chrislusf/seaweedfs && git checkout $BRANCH
+RUN cd /go/src/github.com/chrislusf/seaweedfs/weed \
+ && export LDFLAGS="-X github.com/chrislusf/seaweedfs/weed/util.COMMIT=$(git rev-parse --short HEAD)" \
+ && CGO_ENABLED=0 go install -tags 5BytesOffset -ldflags "-extldflags -static ${LDFLAGS}"
+
+FROM alpine AS final
+LABEL author="Chris Lu"
+COPY --from=builder /root/go/bin/weed /usr/bin/
+RUN mkdir -p /etc/seaweedfs
+COPY --from=builder /go/src/github.com/chrislusf/seaweedfs/docker/filer.toml /etc/seaweedfs/filer.toml
+COPY --from=builder /go/src/github.com/chrislusf/seaweedfs/docker/entrypoint.sh /entrypoint.sh
+RUN apk add fuse # for weed mount
+
+# volume server gprc port
+EXPOSE 18080
+# volume server http port
+EXPOSE 8080
+# filer server gprc port
+EXPOSE 18888
+# filer server http port
+EXPOSE 8888
+# master server shared gprc port
+EXPOSE 19333
+# master server shared http port
+EXPOSE 9333
+# s3 server http port
+EXPOSE 8333
+# webdav server http port
+EXPOSE 7333
+
+RUN mkdir -p /data/filerldb2
+
+VOLUME /data
+
+RUN chmod +x /entrypoint.sh
+
+ENTRYPOINT ["/entrypoint.sh"]
diff --git a/docker/Dockerfile.local b/docker/Dockerfile.local
new file mode 100644
index 000000000..0a85c56f0
--- /dev/null
+++ b/docker/Dockerfile.local
@@ -0,0 +1,32 @@
+FROM alpine AS final
+LABEL author="Chris Lu"
+COPY ./weed /usr/bin/
+RUN mkdir -p /etc/seaweedfs
+COPY ./filer.toml /etc/seaweedfs/filer.toml
+COPY ./entrypoint.sh /entrypoint.sh
+RUN apk add fuse # for weed mount
+
+# volume server grpc port
+EXPOSE 18080
+# volume server http port
+EXPOSE 8080
+# filer server grpc port
+EXPOSE 18888
+# filer server http port
+EXPOSE 8888
+# master server shared grpc port
+EXPOSE 19333
+# master server shared http port
+EXPOSE 9333
+# s3 server http port
+EXPOSE 8333
+# webdav server http port
+EXPOSE 7333
+
+RUN mkdir -p /data/filerldb2
+
+VOLUME /data
+
+RUN chmod +x /entrypoint.sh
+
+ENTRYPOINT ["/entrypoint.sh"]
diff --git a/docker/Dockerfile.s3tests b/docker/Dockerfile.s3tests
new file mode 100644
index 000000000..5b6d762de
--- /dev/null
+++ b/docker/Dockerfile.s3tests
@@ -0,0 +1,31 @@
+FROM ubuntu:20.04
+
+RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
+ DEBIAN_FRONTEND=noninteractive apt-get upgrade -y && \
+ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
+ git \
+ sudo \
+ debianutils \
+ python3-pip \
+ python3-virtualenv \
+ python3-dev \
+ libevent-dev \
+ libffi-dev \
+ libxml2-dev \
+ libxslt-dev \
+ zlib1g-dev && \
+ DEBIAN_FRONTEND=noninteractive apt-get clean && \
+ rm -rf /var/lib/apt/lists/* && \
+ git clone https://github.com/ceph/s3-tests.git /opt/s3-tests
+
+WORKDIR /opt/s3-tests
+RUN ./bootstrap
+
+ENV \
+ NOSETESTS_EXCLUDE="" \
+ NOSETESTS_ATTR="" \
+ NOSETESTS_OPTIONS="" \
+ S3TEST_CONF="/s3test.conf"
+
+ENTRYPOINT ["/bin/bash", "-c"]
+CMD ["sleep 10 && exec ./virtualenv/bin/nosetests ${NOSETESTS_OPTIONS-} ${NOSETESTS_ATTR:+-a $NOSETESTS_ATTR} ${NOSETESTS_EXCLUDE:+-e $NOSETESTS_EXCLUDE}"] \ No newline at end of file
diff --git a/docker/Makefile b/docker/Makefile
new file mode 100644
index 000000000..a933956b7
--- /dev/null
+++ b/docker/Makefile
@@ -0,0 +1,63 @@
+all: gen
+
+.PHONY : gen
+
+gen: dev
+
+binary:
+ cd ../weed; CGO_ENABLED=0 GOOS=linux go build -ldflags "-extldflags -static"; mv weed ../docker/
+
+build: binary
+ docker build --no-cache -t chrislusf/seaweedfs:local -f Dockerfile.local .
+ rm ./weed
+
+s3tests_build:
+ docker build --no-cache -t chrislusf/ceph-s3-tests:local -f Dockerfile.s3tests .
+
+dev: build
+ docker-compose -f compose/local-dev-compose.yml -p seaweedfs up
+
+dev_tls: build certstrap
+ ENV_FILE="tls.env" docker-compose -f compose/local-dev-compose.yml -p seaweedfs up
+
+dev_mount: build
+ docker-compose -f compose/local-mount-compose.yml -p seaweedfs up
+
+profile_mount: build
+ docker-compose -f compose/local-mount-profile-compose.yml -p seaweedfs up
+
+k8s: build
+ docker-compose -f compose/local-k8s-compose.yml -p seaweedfs up
+
+dev_registry: build
+ docker-compose -f compose/local-registry-compose.yml -p seaweedfs up
+
+dev_replicate: build
+ docker-compose -f compose/local-replicate-compose.yml -p seaweedfs up
+
+cluster: build
+ docker-compose -f compose/local-cluster-compose.yml -p seaweedfs up
+
+2clusters: build
+ docker-compose -f compose/local-clusters-compose.yml -p seaweedfs up
+
+s3tests: build s3tests_build
+ docker-compose -f compose/local-s3tests-compose.yml -p seaweedfs up
+
+filer_etcd: build
+ docker stack deploy -c compose/swarm-etcd.yml fs
+
+clean:
+ rm ./weed
+
+certstrap:
+ go get github.com/square/certstrap
+ certstrap --depot-path compose/tls init --passphrase "" --common-name "SeaweedFS CA" || true
+ certstrap --depot-path compose/tls request-cert --passphrase "" --common-name volume01.dev || true
+ certstrap --depot-path compose/tls request-cert --passphrase "" --common-name master01.dev || true
+ certstrap --depot-path compose/tls request-cert --passphrase "" --common-name filer01.dev || true
+ certstrap --depot-path compose/tls request-cert --passphrase "" --common-name client01.dev || true
+ certstrap --depot-path compose/tls sign --CA "SeaweedFS CA" volume01.dev || true
+ certstrap --depot-path compose/tls sign --CA "SeaweedFS CA" master01.dev || true
+ certstrap --depot-path compose/tls sign --CA "SeaweedFS CA" filer01.dev || true
+ certstrap --depot-path compose/tls sign --CA "SeaweedFS CA" client01.dev || true \ No newline at end of file
diff --git a/docker/README.md b/docker/README.md
index cfe281e71..d6e1f4928 100644
--- a/docker/README.md
+++ b/docker/README.md
@@ -11,11 +11,29 @@ docker-compose -f seaweedfs-compose.yml -p seaweedfs up
```
-## Development
+## Try latest tip
+
+```bash
+
+wget https://raw.githubusercontent.com/chrislusf/seaweedfs/master/docker/seaweedfs-dev-compose.yml
+
+docker-compose -f seaweedfs-dev-compose.yml -p seaweedfs up
+
+```
+
+## Local Development
```bash
cd $GOPATH/src/github.com/chrislusf/seaweedfs/docker
+make
+```
-docker-compose -f dev-compose.yml -p seaweedfs up
+## Build and push a multiarch build
+Make sure that `docker buildx` is supported (might be an experimental docker feature)
+```bash
+BUILDER=$(docker buildx create --driver docker-container --use)
+docker buildx build --pull --push --platform linux/386,linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6 . -t chrislusf/seaweedfs
+docker buildx stop $BUILDER
```
+
diff --git a/docker/compose/dev.env b/docker/compose/dev.env
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/docker/compose/dev.env
diff --git a/docker/compose/local-cluster-compose.yml b/docker/compose/local-cluster-compose.yml
new file mode 100644
index 000000000..82095ae18
--- /dev/null
+++ b/docker/compose/local-cluster-compose.yml
@@ -0,0 +1,75 @@
+version: '2'
+
+services:
+ master0:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 9333:9333
+ - 19333:19333
+ command: "master -ip=master0 -port=9333 -peers=master0:9333,master1:9334,master2:9335 -mdir=/data/m1"
+ master1:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 9334:9334
+ - 19334:19334
+ command: "master -ip=master1 -port=9334 -peers=master0:9333,master1:9334,master2:9335 -mdir=/data/m2"
+ master2:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 9335:9335
+ - 19335:19335
+ command: "master -ip=master2 -port=9335 -peers=master0:9333,master1:9334,master2:9335 -mdir=/data/m3"
+ volume1:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8080:8080
+ - 18080:18080
+ command: 'volume -mserver="master0:9333,master1:9334,master2:9335" -port=8080 -ip=volume1 -publicUrl=localhost:8080 -preStopSeconds=1 -disk=ssd1'
+ depends_on:
+ - master0
+ - master1
+ - master2
+ volume2:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8082:8082
+ - 18082:18082
+ command: 'volume -mserver="master0:9333,master1:9334,master2:9335" -port=8082 -ip=volume2 -publicUrl=localhost:8082 -preStopSeconds=1 -disk=ssd1'
+ depends_on:
+ - master0
+ - master1
+ - master2
+ volume3:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8083:8083
+ - 18083:18083
+ command: 'volume -mserver="master0:9333,master1:9334,master2:9335" -port=8083 -ip=volume3 -publicUrl=localhost:8083 -preStopSeconds=1'
+ depends_on:
+ - master0
+ - master1
+ - master2
+ filer:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8888:8888
+ - 18888:18888
+ command: 'filer -master="master0:9333,master1:9334,master2:9335"'
+ depends_on:
+ - master0
+ - master1
+ - master2
+ - volume1
+ - volume2
+ s3:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8333:8333
+ command: 's3 -filer="filer:8888"'
+ depends_on:
+ - master0
+ - master1
+ - master2
+ - volume1
+ - volume2
+ - filer
diff --git a/docker/compose/local-clusters-compose.yml b/docker/compose/local-clusters-compose.yml
new file mode 100644
index 000000000..f9e9a1589
--- /dev/null
+++ b/docker/compose/local-clusters-compose.yml
@@ -0,0 +1,28 @@
+version: '2'
+
+services:
+ server1:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 9333:9333
+ - 19333:19333
+ - 8084:8080
+ - 18084:18080
+ - 8888:8888
+ - 18888:18888
+ command: "server -ip=server1 -filer -volume.max=0 -master.volumeSizeLimitMB=1024 -volume.preStopSeconds=1"
+ volumes:
+ - ./master-cloud.toml:/etc/seaweedfs/master.toml
+ depends_on:
+ - server2
+ server2:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 9334:9333
+ - 19334:19333
+ - 8085:8080
+ - 18085:18080
+ - 8889:8888
+ - 18889:18888
+ - 8334:8333
+ command: "server -ip=server2 -filer -s3 -volume.max=0 -master.volumeSizeLimitMB=1024 -volume.preStopSeconds=1"
diff --git a/docker/compose/local-dev-compose.yml b/docker/compose/local-dev-compose.yml
new file mode 100644
index 000000000..01d0594a6
--- /dev/null
+++ b/docker/compose/local-dev-compose.yml
@@ -0,0 +1,67 @@
+version: '2'
+
+services:
+ master:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 9333:9333
+ - 19333:19333
+ command: "-v=1 master -ip=master"
+ volumes:
+ - ./tls:/etc/seaweedfs/tls
+ env_file:
+ - ${ENV_FILE:-dev.env}
+ volume:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8080:8080
+ - 18080:18080
+ command: "-v=1 volume -mserver=master:9333 -port=8080 -ip=volume -preStopSeconds=1"
+ depends_on:
+ - master
+ volumes:
+ - ./tls:/etc/seaweedfs/tls
+ env_file:
+ - ${ENV_FILE:-dev.env}
+ filer:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8111:8111
+ - 8888:8888
+ - 18888:18888
+ command: '-v=1 filer -master="master:9333" -iam'
+ depends_on:
+ - master
+ - volume
+ volumes:
+ - ./tls:/etc/seaweedfs/tls
+ env_file:
+ - ${ENV_FILE:-dev.env}
+ s3:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8333:8333
+ command: '-v=1 s3 -filer="filer:8888"'
+ depends_on:
+ - master
+ - volume
+ - filer
+ volumes:
+ - ./tls:/etc/seaweedfs/tls
+ env_file:
+ - ${ENV_FILE:-dev.env}
+ mount:
+ image: chrislusf/seaweedfs:local
+ privileged: true
+ cap_add:
+ - SYS_ADMIN
+ mem_limit: 4096m
+ command: '-v=4 mount -filer="filer:8888" -dirAutoCreate -dir=/mnt/seaweedfs -cacheCapacityMB=100 -concurrentWriters=128'
+ volumes:
+ - ./tls:/etc/seaweedfs/tls
+ env_file:
+ - ${ENV_FILE:-dev.env}
+ depends_on:
+ - master
+ - volume
+ - filer
diff --git a/docker/compose/local-k8s-compose.yml b/docker/compose/local-k8s-compose.yml
new file mode 100644
index 000000000..9a25465c4
--- /dev/null
+++ b/docker/compose/local-k8s-compose.yml
@@ -0,0 +1,94 @@
+version: '2'
+
+services:
+ master:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 9333:9333
+ - 19333:19333
+ command: "master -ip=master"
+ volume:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8080:8080
+ - 18080:18080
+ command: "volume -mserver=master:9333 -port=8080 -ip=volume"
+ depends_on:
+ - master
+ mysql:
+ image: percona/percona-server:5.7
+ ports:
+ - 3306:3306
+ volumes:
+ - ./seaweedfs.sql:/docker-entrypoint-initdb.d/seaweedfs.sql
+ environment:
+ - MYSQL_ROOT_PASSWORD=secret
+ - MYSQL_DATABASE=seaweedfs
+ - MYSQL_PASSWORD=secret
+ - MYSQL_USER=seaweedfs
+ filer:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8888:8888
+ - 18888:18888
+ environment:
+ - WEED_MYSQL_HOSTNAME=mysql
+ - WEED_MYSQL_PORT=3306
+ - WEED_MYSQL_DATABASE=seaweedfs
+ - WEED_MYSQL_USERNAME=seaweedfs
+ - WEED_MYSQL_PASSWORD=secret
+ - WEED_MYSQL_ENABLED=true
+ - WEED_MYSQL_CONNECTION_MAX_IDLE=5
+ - WEED_MYSQL_CONNECTION_MAX_OPEN=75
+ # "refresh" connection every 10 minutes, eliminating mysql closing "old" connections
+ - WEED_MYSQL_CONNECTION_MAX_LIFETIME_SECONDS=600
+ # enable usage of memsql as filer backend
+ - WEED_MYSQL_INTERPOLATEPARAMS=true
+ - WEED_LEVELDB2_ENABLED=false
+ command: '-v 9 filer -master="master:9333"'
+ depends_on:
+ - master
+ - volume
+ - mysql
+ ingress:
+ image: jwilder/nginx-proxy:alpine
+ ports:
+ - "80:80"
+ volumes:
+ - /var/run/docker.sock:/tmp/docker.sock:ro
+ - ./nginx/proxy.conf:/etc/nginx/proxy.conf
+ s3:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8333:8333
+ command: '-v 9 s3 -filer="filer:8888"'
+ depends_on:
+ - master
+ - volume
+ - filer
+ environment:
+ - VIRTUAL_HOST=ingress
+ - VIRTUAL_PORT=8333
+ registry:
+ image: registry:2
+ environment:
+ REGISTRY_HTTP_ADDR: "0.0.0.0:5001" # seaweedfs s3
+ REGISTRY_LOG_LEVEL: "debug"
+ REGISTRY_STORAGE: "s3"
+ REGISTRY_STORAGE_S3_REGION: "us-east-1"
+ REGISTRY_STORAGE_S3_REGIONENDPOINT: "http://ingress"
+ REGISTRY_STORAGE_S3_BUCKET: "registry"
+ REGISTRY_STORAGE_S3_ACCESSKEY: "some_access_key1"
+ REGISTRY_STORAGE_S3_SECRETKEY: "some_secret_key1"
+ REGISTRY_STORAGE_S3_V4AUTH: "true"
+ REGISTRY_STORAGE_S3_SECURE: "false"
+ REGISTRY_STORAGE_S3_SKIPVERIFY: "true"
+ REGISTRY_STORAGE_S3_ROOTDIRECTORY: "/"
+ REGISTRY_STORAGE_DELETE_ENABLED: "true"
+ REGISTRY_STORAGE_REDIRECT_DISABLE: "true"
+ REGISTRY_VALIDATION_DISABLED: "true"
+ ports:
+ - 5001:5001
+ depends_on:
+ - s3
+ - ingress \ No newline at end of file
diff --git a/docker/compose/local-minio-gateway-compose.yml b/docker/compose/local-minio-gateway-compose.yml
new file mode 100644
index 000000000..fafee59c8
--- /dev/null
+++ b/docker/compose/local-minio-gateway-compose.yml
@@ -0,0 +1,50 @@
+version: '2'
+
+services:
+ master:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 9333:9333
+ - 19333:19333
+ command: "master -ip=master -volumeSizeLimitMB=1024"
+ volume:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8080:8080
+ - 18080:18080
+ command: "volume -mserver=master:9333 -port=8080 -ip=volume -max=0 -preStopSeconds=1"
+ depends_on:
+ - master
+ s3:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8888:8888
+ - 18888:18888
+ - 8333:8333
+ command: '-v 1 filer -master="master:9333" -s3 -s3.config=/etc/seaweedfs/s3.json -s3.port=8333'
+ volumes:
+ - ./s3.json:/etc/seaweedfs/s3.json
+ depends_on:
+ - master
+ - volume
+ minio-gateway-s3:
+ image: minio/minio
+ ports:
+ - 9000:9000
+ command: 'minio gateway s3 http://s3:8333'
+ restart: on-failure
+ environment:
+ MINIO_ACCESS_KEY: "some_access_key1"
+ MINIO_SECRET_KEY: "some_secret_key1"
+ depends_on:
+ - s3
+ minio-warp:
+ image: minio/warp
+ command: 'mixed --duration=5m --obj.size=3mb --autoterm'
+ restart: on-failure
+ environment:
+ WARP_HOST: "minio-gateway-s3:9000"
+ WARP_ACCESS_KEY: "some_access_key1"
+ WARP_SECRET_KEY: "some_secret_key1"
+ depends_on:
+ - minio-gateway-s3 \ No newline at end of file
diff --git a/docker/compose/local-mount-compose.yml b/docker/compose/local-mount-compose.yml
new file mode 100644
index 000000000..b1c579cdf
--- /dev/null
+++ b/docker/compose/local-mount-compose.yml
@@ -0,0 +1,46 @@
+version: '2'
+
+services:
+ master:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 9333:9333
+ - 19333:19333
+ command: "master -ip=master"
+ volume:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 7455:8080
+ - 9325:9325
+ command: 'volume -mserver="master:9333" -port=8080 -metricsPort=9325 -preStopSeconds=1 -publicUrl=localhost:7455'
+ depends_on:
+ - master
+ filer:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8888:8888
+ - 18888:18888
+ - 9326:9326
+ command: 'filer -master="master:9333" -metricsPort=9326'
+ tty: true
+ stdin_open: true
+ depends_on:
+ - master
+ - volume
+ mount_1:
+ image: chrislusf/seaweedfs:local
+ privileged: true
+ entrypoint: '/bin/sh -c "mkdir -p t1 && mkdir -p cache/t1 && weed -v=4 mount -filer=filer:8888 -cacheDir=./cache/t1 -dir=./t1 -filer.path=/c1 -volumeServerAccess=filerProxy"'
+ depends_on:
+ - master
+ - volume
+ - filer
+ mount_2:
+ image: chrislusf/seaweedfs:local
+ privileged: true
+ entrypoint: '/bin/sh -c "mkdir -p t2 && mkdir -p cache/t2 && weed -v=4 mount -filer=filer:8888 -cacheDir=./cache/t2 -dir=./t2 -filer.path=/c1 -volumeServerAcess=publicUrl"'
+ depends_on:
+ - master
+ - volume
+ - filer
+ - mount_1
diff --git a/docker/compose/local-mount-profile-compose.yml b/docker/compose/local-mount-profile-compose.yml
new file mode 100644
index 000000000..4682591c4
--- /dev/null
+++ b/docker/compose/local-mount-profile-compose.yml
@@ -0,0 +1,47 @@
+version: '2'
+
+services:
+ master:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 9333:9333
+ - 19333:19333
+ command: "master -ip=master"
+ volume:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 7455:8080
+ - 9325:9325
+ volumes:
+ - /Volumes/mobile_disk/99:/data
+ command: 'volume -mserver="master:9333" -port=8080 -metricsPort=9325 -preStopSeconds=1 -publicUrl=localhost:7455'
+ depends_on:
+ - master
+ filer:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8888:8888
+ - 18888:18888
+ - 9326:9326
+ volumes:
+ - /Volumes/mobile_disk/99:/data
+ command: 'filer -master="master:9333" -metricsPort=9326'
+ tty: true
+ stdin_open: true
+ depends_on:
+ - master
+ - volume
+ mount:
+ image: chrislusf/seaweedfs:local
+ privileged: true
+ cap_add:
+ - SYS_ADMIN
+ devices:
+ - fuse
+ volumes:
+ - /Volumes/mobile_disk/99:/data
+ entrypoint: '/bin/sh -c "mkdir -p t1 && weed mount -filer=filer:8888 -dir=./t1 -cacheCapacityMB=0 -memprofile=/data/mount.mem.pprof"'
+ depends_on:
+ - master
+ - volume
+ - filer
diff --git a/docker/compose/local-registry-compose.yml b/docker/compose/local-registry-compose.yml
new file mode 100644
index 000000000..b61278d66
--- /dev/null
+++ b/docker/compose/local-registry-compose.yml
@@ -0,0 +1,85 @@
+version: '2'
+
+services:
+ master:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 9333:9333
+ - 19333:19333
+ command: "master -ip=master -volumeSizeLimitMB=1024"
+ volume:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8080:8080
+ - 18080:18080
+ command: "volume -mserver=master:9333 -port=8080 -ip=volume -max=0 -preStopSeconds=1"
+ depends_on:
+ - master
+ s3:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8888:8888
+ - 18888:18888
+ - 8333:8333
+ command: '-v 9 filer -master="master:9333" -s3 -s3.config=/etc/seaweedfs/s3.json -s3.port=8333'
+ volumes:
+ - ./s3.json:/etc/seaweedfs/s3.json
+ depends_on:
+ - master
+ - volume
+ minio:
+ image: minio/minio
+ ports:
+ - 9000:9000
+ command: 'minio server /data'
+ environment:
+ MINIO_ACCESS_KEY: "some_access_key1"
+ MINIO_SECRET_KEY: "some_secret_key1"
+ depends_on:
+ - master
+ registry1:
+ image: registry:2
+ environment:
+ REGISTRY_HTTP_ADDR: "0.0.0.0:5001" # seaweedfs s3
+ REGISTRY_LOG_LEVEL: "debug"
+ REGISTRY_STORAGE: "s3"
+ REGISTRY_STORAGE_S3_REGION: "us-east-1"
+ REGISTRY_STORAGE_S3_REGIONENDPOINT: "http://s3:8333"
+ REGISTRY_STORAGE_S3_BUCKET: "registry"
+ REGISTRY_STORAGE_S3_ACCESSKEY: "some_access_key1"
+ REGISTRY_STORAGE_S3_SECRETKEY: "some_secret_key1"
+ REGISTRY_STORAGE_S3_V4AUTH: "true"
+ REGISTRY_STORAGE_S3_SECURE: "false"
+ REGISTRY_STORAGE_S3_SKIPVERIFY: "true"
+ REGISTRY_STORAGE_S3_ROOTDIRECTORY: "/"
+ REGISTRY_STORAGE_DELETE_ENABLED: "true"
+ REGISTRY_STORAGE_REDIRECT_DISABLE: "true"
+ REGISTRY_VALIDATION_DISABLED: "true"
+ ports:
+ - 5001:5001
+ depends_on:
+ - s3
+ - minio
+ registry2:
+ image: registry:2
+ environment:
+ REGISTRY_HTTP_ADDR: "0.0.0.0:5002" # minio
+ REGISTRY_LOG_LEVEL: "debug"
+ REGISTRY_STORAGE: "s3"
+ REGISTRY_STORAGE_S3_REGION: "us-east-1"
+ REGISTRY_STORAGE_S3_REGIONENDPOINT: "http://minio:9000"
+ REGISTRY_STORAGE_S3_BUCKET: "registry"
+ REGISTRY_STORAGE_S3_ACCESSKEY: "some_access_key1"
+ REGISTRY_STORAGE_S3_SECRETKEY: "some_secret_key1"
+ REGISTRY_STORAGE_S3_V4AUTH: "true"
+ REGISTRY_STORAGE_S3_SECURE: "false"
+ REGISTRY_STORAGE_S3_SKIPVERIFY: "true"
+ REGISTRY_STORAGE_S3_ROOTDIRECTORY: "/"
+ REGISTRY_STORAGE_DELETE_ENABLED: "true"
+ REGISTRY_STORAGE_REDIRECT_DISABLE: "true"
+ REGISTRY_VALIDATION_DISABLED: "true"
+ ports:
+ - 5002:5002
+ depends_on:
+ - s3
+ - minio \ No newline at end of file
diff --git a/docker/compose/local-replicate-compose.yml b/docker/compose/local-replicate-compose.yml
new file mode 100644
index 000000000..8240d45a7
--- /dev/null
+++ b/docker/compose/local-replicate-compose.yml
@@ -0,0 +1,61 @@
+version: '2'
+
+services:
+ master:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 9333:9333
+ - 19333:19333
+ command: "master -ip=master"
+ volume:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8080:8080
+ - 18080:18080
+ command: "volume -mserver=master:9333 -port=8080 -ip=volume -preStopSeconds=1"
+ depends_on:
+ - master
+ filer:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8888:8888
+ - 18888:18888
+ command: '-v=9 filer -master="master:9333"'
+ restart: on-failure
+ volumes:
+ - ./notification.toml:/etc/seaweedfs/notification.toml
+ depends_on:
+ - master
+ - volume
+ - rabbitmq
+ - replicate
+ environment:
+ RABBIT_SERVER_URL: "amqp://guest:guest@rabbitmq:5672/"
+ replicate:
+ image: chrislusf/seaweedfs:local
+ command: '-v=9 filer.replicate'
+ restart: on-failure
+ volumes:
+ - ./notification.toml:/etc/seaweedfs/notification.toml
+ - ./replication.toml:/etc/seaweedfs/replication.toml
+ depends_on:
+ - rabbitmq
+ environment:
+ RABBIT_SERVER_URL: "amqp://guest:guest@rabbitmq:5672/"
+ s3:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8333:8333
+ command: 's3 -filer="filer:8888"'
+ depends_on:
+ - master
+ - volume
+ - filer
+ rabbitmq:
+ image: rabbitmq:3.8.10-management-alpine
+ ports:
+ - 5672:5672
+ - 15671:15671
+ - 15672:15672
+ environment:
+ RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS: "-rabbit log_levels [{connection,error},{queue,debug}]" \ No newline at end of file
diff --git a/docker/compose/local-s3tests-compose.yml b/docker/compose/local-s3tests-compose.yml
new file mode 100644
index 000000000..381e3eb97
--- /dev/null
+++ b/docker/compose/local-s3tests-compose.yml
@@ -0,0 +1,45 @@
+version: '2'
+
+services:
+ master:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 9333:9333
+ - 19333:19333
+ command: "master -ip=master -volumeSizeLimitMB=16"
+ environment:
+ WEED_MASTER_VOLUME_GROWTH_COPY_1: 1
+ WEED_MASTER_VOLUME_GROWTH_COPY_OTHER: 1
+ volume:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8080:8080
+ - 18080:18080
+ command: "volume -mserver=master:9333 -port=8080 -ip=volume -preStopSeconds=1"
+ depends_on:
+ - master
+ s3:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - 8888:8888
+ - 18888:18888
+ - 8000:8000
+ command: 'filer -master="master:9333" -s3 -s3.config=/etc/seaweedfs/s3.json -s3.port=8000'
+ volumes:
+ - ./s3.json:/etc/seaweedfs/s3.json
+ depends_on:
+ - master
+ - volume
+ s3tests:
+ image: chrislusf/ceph-s3-tests:local
+ volumes:
+ - ./s3tests.conf:/opt/s3-tests/s3tests.conf
+ environment:
+ S3TEST_CONF: "s3tests.conf"
+ NOSETESTS_OPTIONS: "--verbose --logging-level=ERROR --with-xunit --failure-detail s3tests_boto3.functional.test_s3"
+ NOSETESTS_ATTR: "!tagging,!fails_on_aws,!encryption,!bucket-policy,!versioning,!fails_on_rgw,!bucket-policy,!fails_with_subdomain,!policy_status,!object-lock,!lifecycle,!cors,!user-policy"
+ NOSETESTS_EXCLUDE: "(bucket_list_delimiter_basic|bucket_listv2_delimiter_basic|bucket_listv2_encoding_basic|bucket_list_encoding_basic|bucket_list_delimiter_prefix|bucket_listv2_delimiter_prefix_ends_with_delimiter|bucket_list_delimiter_prefix_ends_with_delimiter|bucket_list_delimiter_alt|bucket_listv2_delimiter_alt|bucket_list_delimiter_prefix_underscore|bucket_list_delimiter_percentage|bucket_listv2_delimiter_percentage|bucket_list_delimiter_whitespace|bucket_listv2_delimiter_whitespace|bucket_list_delimiter_dot|bucket_listv2_delimiter_dot|bucket_list_delimiter_unreadable|bucket_listv2_delimiter_unreadable|bucket_listv2_fetchowner_defaultempty|bucket_listv2_fetchowner_empty|bucket_list_prefix_delimiter_alt|bucket_listv2_prefix_delimiter_alt|bucket_list_prefix_delimiter_prefix_not_exist|bucket_listv2_prefix_delimiter_prefix_not_exist|bucket_list_prefix_delimiter_delimiter_not_exist|bucket_listv2_prefix_delimiter_delimiter_not_exist|bucket_list_prefix_delimiter_prefix_delimiter_not_exist|bucket_listv2_prefix_delimiter_prefix_delimiter_not_exist|bucket_list_maxkeys_none|bucket_listv2_maxkeys_none|bucket_list_maxkeys_invalid|bucket_listv2_continuationtoken_empty|bucket_list_return_data|bucket_list_objects_anonymous|bucket_listv2_objects_anonymous|bucket_notexist|bucketv2_notexist|bucket_delete_nonempty|bucket_concurrent_set_canned_acl|object_write_to_nonexist_bucket|object_requestid_matches_header_on_error|object_write_cache_control|object_write_expires|object_set_get_metadata_none_to_good|object_set_get_metadata_none_to_empty|object_set_get_metadata_overwrite_to_empty|post_object_anonymous_request|post_object_authenticated_request|post_object_authenticated_no_content_type|post_object_authenticated_request_bad_access_key|post_object_set_success_code|post_object_set_invalid_success_code|post_object_upload_larger_than_chunk|post_object_set_key_from_filename|post_object_ignored_header|post_object_case_insensitive_condition_fields|post_object_escaped_field_values|post_object_success_redirect_action|post_object_invalid_signature|post_object_invalid_access_key|post_object_missing_policy_condition|post_object_user_specified_header|post_object_request_missing_policy_specified_field|post_object_expired_policy|post_object_invalid_request_field_value|get_object_ifmatch_failed|get_object_ifunmodifiedsince_good|put_object_ifmatch_failed|object_raw_get_bucket_gone|object_delete_key_bucket_gone|object_raw_get_bucket_acl|object_raw_get_object_acl|object_raw_response_headers|object_raw_authenticated_bucket_gone|object_raw_get_x_amz_expires_out_max_range|object_raw_get_x_amz_expires_out_positive_range|object_anon_put_write_access|object_raw_put_authenticated_expired|bucket_create_exists|bucket_create_naming_bad_short_one|bucket_create_naming_bad_short_two|bucket_get_location|bucket_acl_default|bucket_acl_canned|bucket_acl_canned_publicreadwrite|bucket_acl_canned_authenticatedread|object_acl_default|object_acl_canned_during_create|object_acl_canned|object_acl_canned_publicreadwrite|object_acl_canned_authenticatedread|object_acl_canned_bucketownerread|object_acl_canned_bucketownerfullcontrol|object_acl_full_control_verify_attributes|bucket_acl_canned_private_to_private|bucket_acl_grant_nonexist_user|bucket_acl_no_grants|bucket_acl_grant_email_not_exist|bucket_acl_revoke_all|bucket_recreate_not_overriding|object_copy_verify_contenttype|object_copy_to_itself_with_metadata|object_copy_not_owned_bucket|object_copy_not_owned_object_bucket|object_copy_retaining_metadata|object_copy_replacing_metadata|multipart_upload_empty|multipart_copy_invalid_range|multipart_copy_special_names|multipart_upload_resend_part|multipart_upload_size_too_small|abort_multipart_upload_not_found|multipart_upload_missing_part|multipart_upload_incorrect_etag|100_continue|ranged_request_invalid_range|ranged_request_empty_object|access_bucket)"
+ depends_on:
+ - master
+ - volume
+ - s3 \ No newline at end of file
diff --git a/docker/compose/master-cloud.toml b/docker/compose/master-cloud.toml
new file mode 100644
index 000000000..17289c114
--- /dev/null
+++ b/docker/compose/master-cloud.toml
@@ -0,0 +1,30 @@
+
+# Put this file to one of the location, with descending priority
+# ./master.toml
+# $HOME/.seaweedfs/master.toml
+# /etc/seaweedfs/master.toml
+# this file is read by master
+
+[master.maintenance]
+# periodically run these scripts are the same as running them from 'weed shell'
+scripts = """
+ lock
+ ec.encode -fullPercent=95 -quietFor=1h
+ ec.rebuild -force
+ ec.balance -force
+ volume.balance -force
+ volume.fix.replication
+ unlock
+"""
+sleep_minutes = 17 # sleep minutes between each script execution
+
+# configurations for tiered cloud storage
+# old volumes are transparently moved to cloud for cost efficiency
+[storage.backend]
+ [storage.backend.s3.default]
+ enabled = true
+ aws_access_key_id = "any" # if empty, loads from the shared credentials file (~/.aws/credentials).
+ aws_secret_access_key = "any" # if empty, loads from the shared credentials file (~/.aws/credentials).
+ region = "us-east-2"
+ bucket = "volume_bucket" # an existing bucket
+ endpoint = "http://server2:8333"
diff --git a/docker/compose/notification.toml b/docker/compose/notification.toml
new file mode 100644
index 000000000..dcd5f2c6f
--- /dev/null
+++ b/docker/compose/notification.toml
@@ -0,0 +1,17 @@
+[notification.log]
+# this is only for debugging perpose and does not work with "weed filer.replicate"
+enabled = false
+
+
+[notification.gocdk_pub_sub]
+# The Go Cloud Development Kit (https://gocloud.dev).
+# PubSub API (https://godoc.org/gocloud.dev/pubsub).
+# Supports AWS SNS/SQS, Azure Service Bus, Google PubSub, NATS and RabbitMQ.
+enabled = true
+# This URL will Dial the RabbitMQ server at the URL in the environment
+# variable RABBIT_SERVER_URL and open the exchange "myexchange".
+# The exchange must have already been created by some other means, like
+# the RabbitMQ management plugin. Сreate myexchange of type fanout and myqueue then
+# create binding myexchange => myqueue
+topic_url = "rabbit://swexchange"
+sub_url = "rabbit://swqueue" \ No newline at end of file
diff --git a/docker/compose/replication.toml b/docker/compose/replication.toml
new file mode 100644
index 000000000..833bb1692
--- /dev/null
+++ b/docker/compose/replication.toml
@@ -0,0 +1,11 @@
+[source.filer]
+enabled = true
+grpcAddress = "filer:18888"
+# all files under this directory tree are replicated.
+# this is not a directory on your hard drive, but on your filer.
+# i.e., all files with this "prefix" are sent to notification message queue.
+directory = "/buckets"
+
+[sink.local_incremental]
+enabled = true
+directory = "/data" \ No newline at end of file
diff --git a/docker/compose/s3.json b/docker/compose/s3.json
new file mode 100644
index 000000000..64dedb681
--- /dev/null
+++ b/docker/compose/s3.json
@@ -0,0 +1,105 @@
+{
+ "identities": [
+ {
+ "name": "anonymous",
+ "actions": [
+ "Read"
+ ]
+ },
+ {
+ "name": "some_admin_user",
+ "credentials": [
+ {
+ "accessKey": "some_access_key1",
+ "secretKey": "some_secret_key1"
+ }
+ ],
+ "actions": [
+ "Admin",
+ "Read",
+ "List",
+ "Tagging",
+ "Write"
+ ]
+ },
+ {
+ "name": "s3_tests",
+ "credentials": [
+ {
+ "accessKey": "ABCDEFGHIJKLMNOPQRST",
+ "secretKey": "abcdefghijklmnopqrstuvwxyzabcdefghijklmn"
+ },
+ {
+ "accessKey": "0555b35654ad1656d804",
+ "secretKey": "h7GhxuBLTrlhVUyxSPUKUV8r/2EI4ngqJxD7iBdBYLhwluN30JaT3Q=="
+ }
+ ],
+ "actions": [
+ "Admin",
+ "Read",
+ "List",
+ "Tagging",
+ "Write"
+ ]
+ },
+ {
+ "name": "s3_tests_alt",
+ "credentials": [
+ {
+ "accessKey": "NOPQRSTUVWXYZABCDEFG",
+ "secretKey": "nopqrstuvwxyzabcdefghijklmnabcdefghijklm"
+ }
+ ],
+ "actions": [
+ "Admin",
+ "Read",
+ "List",
+ "Tagging",
+ "Write"
+ ]
+ },
+ {
+ "name": "s3_tests_tenant",
+ "credentials": [
+ {
+ "accessKey": "HIJKLMNOPQRSTUVWXYZA",
+ "secretKey": "opqrstuvwxyzabcdefghijklmnopqrstuvwxyzab"
+ }
+ ],
+ "actions": [
+ "Admin",
+ "Read",
+ "List",
+ "Tagging",
+ "Write"
+ ]
+ },
+ {
+ "name": "some_read_only_user",
+ "credentials": [
+ {
+ "accessKey": "some_access_key2",
+ "secretKey": "some_secret_key2"
+ }
+ ],
+ "actions": [
+ "Read"
+ ]
+ },
+ {
+ "name": "some_normal_user",
+ "credentials": [
+ {
+ "accessKey": "some_access_key3",
+ "secretKey": "some_secret_key3"
+ }
+ ],
+ "actions": [
+ "Read",
+ "List",
+ "Tagging",
+ "Write"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/docker/compose/s3tests.conf b/docker/compose/s3tests.conf
new file mode 100644
index 000000000..68d9ddeb7
--- /dev/null
+++ b/docker/compose/s3tests.conf
@@ -0,0 +1,70 @@
+[DEFAULT]
+## this section is just used for host, port and bucket_prefix
+
+# host set for rgw in vstart.sh
+host = s3
+
+# port set for rgw in vstart.sh
+port = 8000
+
+## say "False" to disable TLS
+is_secure = False
+
+[fixtures]
+## all the buckets created will start with this prefix;
+## {random} will be filled with random characters to pad
+## the prefix to 30 characters long, and avoid collisions
+bucket prefix = yournamehere-{random}-
+
+[s3 main]
+# main display_name set in vstart.sh
+display_name = M. Tester
+
+# main user_idname set in vstart.sh
+user_id = testid
+
+# main email set in vstart.sh
+email = tester@ceph.com
+
+# zonegroup api_name for bucket location
+api_name = default
+
+## main AWS access key
+access_key = 0555b35654ad1656d804
+
+## main AWS secret key
+secret_key = h7GhxuBLTrlhVUyxSPUKUV8r/2EI4ngqJxD7iBdBYLhwluN30JaT3Q==
+
+## replace with key id obtained when secret is created, or delete if KMS not tested
+#kms_keyid = 01234567-89ab-cdef-0123-456789abcdef
+
+[s3 alt]
+# alt display_name set in vstart.sh
+display_name = john.doe
+## alt email set in vstart.sh
+email = john.doe@example.com
+
+# alt user_id set in vstart.sh
+user_id = 56789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234
+
+# alt AWS access key set in vstart.sh
+access_key = NOPQRSTUVWXYZABCDEFG
+
+# alt AWS secret key set in vstart.sh
+secret_key = nopqrstuvwxyzabcdefghijklmnabcdefghijklm
+
+[s3 tenant]
+# tenant display_name set in vstart.sh
+display_name = testx$tenanteduser
+
+# tenant user_id set in vstart.sh
+user_id = 9876543210abcdef0123456789abcdef0123456789abcdef0123456789abcdef
+
+# tenant AWS secret key set in vstart.sh
+access_key = HIJKLMNOPQRSTUVWXYZA
+
+# tenant AWS secret key set in vstart.sh
+secret_key = opqrstuvwxyzabcdefghijklmnopqrstuvwxyzab
+
+# tenant email set in vstart.sh
+email = tenanteduser@example.com \ No newline at end of file
diff --git a/docker/compose/swarm-etcd.yml b/docker/compose/swarm-etcd.yml
new file mode 100644
index 000000000..186b24790
--- /dev/null
+++ b/docker/compose/swarm-etcd.yml
@@ -0,0 +1,84 @@
+# 2021-01-30 16:25:30
+version: '3.8'
+
+services:
+
+ etcd:
+ image: gasparekatapy/etcd
+ networks:
+ - net
+ deploy:
+ mode: replicated
+ replicas: 3
+
+ master:
+ image: chrislusf/seaweedfs:local
+ environment:
+ WEED_MASTER_FILER_DEFAULT: "filer:8888"
+ WEED_MASTER_SEQUENCER_TYPE: "raft"
+ ports:
+ - "9333:9333"
+ - "19333:19333"
+ networks:
+ - net
+ command:
+ - 'master'
+ - '-resumeState=true'
+ - '-ip=master'
+ - '-port=9333'
+ deploy:
+ mode: replicated
+ replicas: 1
+
+ filer:
+ image: chrislusf/seaweedfs:local
+ environment:
+ WEED_LEVELDB2_ENABLED: "false"
+ WEED_ETCD_ENABLED: "true"
+ WEED_ETCD_SERVERS: "etcd:2379"
+ ports:
+ - target: 8888
+ published: 8888
+ protocol: tcp
+ mode: host
+ - target: 18888
+ published: 18888
+ protocol: tcp
+ mode: host
+ networks:
+ - net
+ command:
+ - 'filer'
+ - '-ip=filer'
+ - '-port=8888'
+ - '-port.readonly=28888'
+ - '-master=master:9333'
+ - '-disableDirListing=true'
+ deploy:
+ mode: replicated
+ replicas: 1
+
+ volume:
+ image: chrislusf/seaweedfs:local
+ ports:
+ - target: 8080
+ published: 8080
+ protocol: tcp
+ mode: host
+ - target: 18080
+ published: 18080
+ protocol: tcp
+ mode: host
+ networks:
+ - net
+ command:
+ - 'volume'
+ - '-mserver=master:9333'
+ - '-port=8080'
+ deploy:
+ mode: global
+
+ ###########################################################################
+
+networks:
+ net:
diff --git a/docker/compose/tls.env b/docker/compose/tls.env
new file mode 100644
index 000000000..a82954c4f
--- /dev/null
+++ b/docker/compose/tls.env
@@ -0,0 +1,14 @@
+WEED_GRPC_CA=/etc/seaweedfs/tls/SeaweedFS_CA.crt
+WEED_GRPC_ALLOWED_WILDCARD_DOMAIN=".dev"
+WEED_GRPC_MASTER_CERT=/etc/seaweedfs/tls/master01.dev.crt
+WEED_GRPC_MASTER_KEY=/etc/seaweedfs/tls/master01.dev.key
+WEED_GRPC_VOLUME_CERT=/etc/seaweedfs/tls/volume01.dev.crt
+WEED_GRPC_VOLUME_KEY=/etc/seaweedfs/tls/volume01.dev.key
+WEED_GRPC_FILER_CERT=/etc/seaweedfs/tls/filer01.dev.crt
+WEED_GRPC_FILER_KEY=/etc/seaweedfs/tls/filer01.dev.key
+WEED_GRPC_CLIENT_CERT=/etc/seaweedfs/tls/client01.dev.crt
+WEED_GRPC_CLIENT_KEY=/etc/seaweedfs/tls/client01.dev.key
+WEED_GRPC_MASTER_ALLOWED_COMMONNAMES="volume01.dev,master01.dev,filer01.dev,client01.dev"
+WEED_GRPC_VOLUME_ALLOWED_COMMONNAMES="volume01.dev,master01.dev,filer01.dev,client01.dev"
+WEED_GRPC_FILER_ALLOWED_COMMONNAMES="volume01.dev,master01.dev,filer01.dev,client01.dev"
+WEED_GRPC_CLIENT_ALLOWED_COMMONNAMES="volume01.dev,master01.dev,filer01.dev,client01.dev" \ No newline at end of file
diff --git a/docker/dev-compose.yml b/docker/dev-compose.yml
deleted file mode 100644
index 1f44ff483..000000000
--- a/docker/dev-compose.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-version: '2'
-
-services:
- master:
- build:
- context: .
- dockerfile: Dockerfile.go_build
- ports:
- - 9333:9333
- - 19333:19333
- command: "master -ip=master"
- volume:
- build:
- context: .
- dockerfile: Dockerfile.go_build
- ports:
- - 8080:8080
- - 18080:18080
- command: 'volume -max=5 -mserver="master:9333" -port=8080'
- depends_on:
- - master
- filer:
- build:
- context: .
- dockerfile: Dockerfile.go_build
- ports:
- - 8888:8888
- - 18888:18888
- command: 'filer -master="master:9333"'
- depends_on:
- - master
- - volume
- s3:
- build:
- context: .
- dockerfile: Dockerfile.go_build
- ports:
- - 8333:8333
- command: 's3 -filer="filer:8888"'
- depends_on:
- - master
- - volume
- - filer
diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh
index 791527d3a..a5a240575 100755
--- a/docker/entrypoint.sh
+++ b/docker/entrypoint.sh
@@ -1,55 +1,68 @@
#!/bin/sh
+isArgPassed() {
+ arg="$1"
+ argWithEqualSign="$1="
+ shift
+ while [ $# -gt 0 ]; do
+ passedArg="$1"
+ shift
+ case $passedArg in
+ $arg)
+ return 0
+ ;;
+ $argWithEqualSign*)
+ return 0
+ ;;
+ esac
+ done
+ return 1
+}
+
case "$1" in
'master')
- ARGS="-mdir /data"
- # Is this instance linked with an other master? (Docker commandline "--link master1:master")
- if [ -n "$MASTER_PORT_9333_TCP_ADDR" ] ; then
- ARGS="$ARGS -peers=$MASTER_PORT_9333_TCP_ADDR:$MASTER_PORT_9333_TCP_PORT"
- fi
- exec /usr/bin/weed $@ $ARGS
+ ARGS="-mdir=/data -volumePreallocate -volumeSizeLimitMB=1024"
+ shift
+ exec /usr/bin/weed master $ARGS $@
;;
'volume')
- ARGS="-ip `hostname -i` -dir /data"
- # Is this instance linked with a master? (Docker commandline "--link master1:master")
- if [ -n "$MASTER_PORT_9333_TCP_ADDR" ] ; then
- ARGS="$ARGS -mserver=$MASTER_PORT_9333_TCP_ADDR:$MASTER_PORT_9333_TCP_PORT"
- fi
- exec /usr/bin/weed $@ $ARGS
+ ARGS="-dir=/data -max=0"
+ if isArgPassed "-max" "$@"; then
+ ARGS="-dir=/data"
+ fi
+ shift
+ exec /usr/bin/weed volume $ARGS $@
;;
'server')
- ARGS="-ip `hostname -i` -dir /data"
- if [ -n "$MASTER_PORT_9333_TCP_ADDR" ] ; then
- ARGS="$ARGS -master.peers=$MASTER_PORT_9333_TCP_ADDR:$MASTER_PORT_9333_TCP_PORT"
- fi
- exec /usr/bin/weed $@ $ARGS
+ ARGS="-dir=/data -volume.max=0 -master.volumePreallocate -master.volumeSizeLimitMB=1024"
+ if isArgPassed "-volume.max" "$@"; then
+ ARGS="-dir=/data -master.volumePreallocate -master.volumeSizeLimitMB=1024"
+ fi
+ shift
+ exec /usr/bin/weed server $ARGS $@
;;
'filer')
ARGS=""
- if [ -n "$MASTER_PORT_9333_TCP_ADDR" ] ; then
- ARGS="$ARGS -master=$MASTER_PORT_9333_TCP_ADDR:$MASTER_PORT_9333_TCP_PORT"
- fi
- exec /usr/bin/weed $@ $ARGS
+ shift
+ exec /usr/bin/weed filer $ARGS $@
;;
's3')
ARGS="-domainName=$S3_DOMAIN_NAME -key.file=$S3_KEY_FILE -cert.file=$S3_CERT_FILE"
- if [ -n "$FILER_PORT_8888_TCP_ADDR" ] ; then
- ARGS="$ARGS -filer=$FILER_PORT_8888_TCP_ADDR:$FILER_PORT_8888_TCP_PORT"
- fi
- exec /usr/bin/weed $@ $ARGS
+ shift
+ exec /usr/bin/weed s3 $ARGS $@
;;
'cronjob')
MASTER=${WEED_MASTER-localhost:9333}
FIX_REPLICATION_CRON_SCHEDULE=${CRON_SCHEDULE-*/7 * * * * *}
- echo "$FIX_REPLICATION_CRON_SCHEDULE" 'echo "volume.fix.replication" | weed shell -master='$MASTER > /crontab
+ echo "$FIX_REPLICATION_CRON_SCHEDULE" 'echo "lock; volume.fix.replication; unlock" | weed shell -master='$MASTER > /crontab
BALANCING_CRON_SCHEDULE=${CRON_SCHEDULE-25 * * * * *}
- echo "$BALANCING_CRON_SCHEDULE" 'echo "volume.balance -c ALL -force" | weed shell -master='$MASTER >> /crontab
+ echo "$BALANCING_CRON_SCHEDULE" 'echo "lock; volume.balance -collection ALL_COLLECTIONS -force; unlock" | weed shell -master='$MASTER >> /crontab
echo "Running Crontab:"
cat /crontab
exec supercronic /crontab
diff --git a/docker/nginx/proxy.conf b/docker/nginx/proxy.conf
new file mode 100644
index 000000000..59ff30ce2
--- /dev/null
+++ b/docker/nginx/proxy.conf
@@ -0,0 +1,30 @@
+# HTTP 1.1 support
+proxy_http_version 1.1;
+#proxy_buffering off;
+proxy_set_header Host $http_host;
+proxy_set_header Upgrade $http_upgrade;
+proxy_set_header Connection $proxy_connection;
+proxy_set_header X-Real-IP $remote_addr;
+proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;
+proxy_set_header X-Forwarded-Ssl $proxy_x_forwarded_ssl;
+proxy_set_header X-Forwarded-Port $proxy_x_forwarded_port;
+
+# Mitigate httpoxy attack (see README for details)
+proxy_set_header Proxy "";
+
+# aws default max_concurrent_requests 10
+# aws default multipart_threshold 8MB
+proxy_buffering on; # GET buffering or “X-Accel-Buffering” enables or disables buffering of a response;
+proxy_buffers 64 1m; # buffers used for reading a response from the proxied server, for a single connection
+proxy_buffer_size 8k; # maximum size of the data that nginx can receive from the server at a time is set
+proxy_busy_buffers_size 2m;
+
+proxy_request_buffering on; # PUT buffering
+client_body_buffer_size 64m; # buffer size for reading client request body
+client_max_body_size 64m;
+
+proxy_next_upstream error timeout non_idempotent http_500; # PUT request should be passed to the next server:
+proxy_connect_timeout 200ms;
+proxy_read_timeout 3s; #timeout is set only between two successive read operations
+proxy_send_timeout 3s; #timeout is set only between two successive write operations
diff --git a/docker/prometheus/prometheus.yml b/docker/prometheus/prometheus.yml
new file mode 100644
index 000000000..34f669d56
--- /dev/null
+++ b/docker/prometheus/prometheus.yml
@@ -0,0 +1,13 @@
+global:
+ scrape_interval: 30s
+ scrape_timeout: 10s
+
+scrape_configs:
+ - job_name: services
+ metrics_path: /metrics
+ static_configs:
+ - targets:
+ - 'prometheus:9090'
+ - 'volume:9325'
+ - 'filer:9326'
+ - 's3:9327' \ No newline at end of file
diff --git a/docker/seaweedfs-compose.yml b/docker/seaweedfs-compose.yml
index 7f0cbc6f9..f7d02a105 100644
--- a/docker/seaweedfs-compose.yml
+++ b/docker/seaweedfs-compose.yml
@@ -4,28 +4,30 @@ services:
master:
image: chrislusf/seaweedfs # use a remote image
ports:
- - 9333:9333
- - 19333:19333
+ - 9333:9333
+ - 19333:19333
command: "master -ip=master"
volume:
image: chrislusf/seaweedfs # use a remote image
ports:
- - 8080:8080
- - 18080:18080
- command: 'volume -max=15 -mserver="master:9333" -port=8080'
+ - 8080:8080
+ - 18080:18080
+ - 9325:9325
+ command: 'volume -mserver="master:9333" -port=8080 -metricsPort=9325'
depends_on:
- - master
+ - master
filer:
image: chrislusf/seaweedfs # use a remote image
ports:
- - 8888:8888
- - 18888:18888
- command: 'filer -master="master:9333"'
+ - 8888:8888
+ - 18888:18888
+ - 9326:9326
+ command: 'filer -master="master:9333" -metricsPort=9326'
tty: true
stdin_open: true
depends_on:
- - master
- - volume
+ - master
+ - volume
cronjob:
image: chrislusf/seaweedfs # use a remote image
command: 'cronjob'
@@ -34,14 +36,33 @@ services:
CRON_SCHEDULE: '*/2 * * * * *' # Default: '*/5 * * * * *'
WEED_MASTER: master:9333 # Default: localhost:9333
depends_on:
- - master
- - volume
+ - master
+ - volume
s3:
image: chrislusf/seaweedfs # use a remote image
ports:
- - 8333:8333
- command: 's3 -filer="filer:8888"'
+ - 8333:8333
+ - 9327:9327
+ command: 's3 -filer="filer:8888" -metricsPort=9327'
depends_on:
- - master
- - volume
- - filer
+ - master
+ - volume
+ - filer
+ webdav:
+ image: chrislusf/seaweedfs # use a remote image
+ ports:
+ - 7333:7333
+ command: 'webdav -filer="filer:8888"'
+ depends_on:
+ - master
+ - volume
+ - filer
+ prometheus:
+ image: prom/prometheus:v2.21.0
+ ports:
+ - 9000:9090
+ volumes:
+ - ./prometheus:/etc/prometheus
+ command: --web.enable-lifecycle --config.file=/etc/prometheus/prometheus.yml
+ depends_on:
+ - s3
diff --git a/docker/seaweedfs-dev-compose.yml b/docker/seaweedfs-dev-compose.yml
new file mode 100644
index 000000000..2382fb17d
--- /dev/null
+++ b/docker/seaweedfs-dev-compose.yml
@@ -0,0 +1,44 @@
+version: '2'
+
+services:
+ master:
+ image: chrislusf/seaweedfs:dev # use a remote dev image
+ ports:
+ - 9333:9333
+ - 19333:19333
+ command: "master -ip=master"
+ volume:
+ image: chrislusf/seaweedfs:dev # use a remote dev image
+ ports:
+ - 8080:8080
+ - 18080:18080
+ command: 'volume -mserver="master:9333" -port=8080 -ip=volume'
+ depends_on:
+ - master
+ filer:
+ image: chrislusf/seaweedfs:dev # use a remote dev image
+ ports:
+ - 8888:8888
+ - 18888:18888
+ command: 'filer -master="master:9333"'
+ depends_on:
+ - master
+ - volume
+ s3:
+ image: chrislusf/seaweedfs:dev # use a remote dev image
+ ports:
+ - 8333:8333
+ command: 's3 -filer="filer:8888"'
+ depends_on:
+ - master
+ - volume
+ - filer
+ webdav:
+ image: chrislusf/seaweedfs:dev # use a remote dev image
+ ports:
+ - 7333:7333
+ command: 'webdav -filer="filer:8888"'
+ depends_on:
+ - master
+ - volume
+ - filer
diff --git a/docker/seaweedfs.sql b/docker/seaweedfs.sql
new file mode 100644
index 000000000..38ebc575c
--- /dev/null
+++ b/docker/seaweedfs.sql
@@ -0,0 +1,12 @@
+CREATE DATABASE IF NOT EXISTS seaweedfs;
+CREATE USER IF NOT EXISTS 'seaweedfs'@'%' IDENTIFIED BY 'secret';
+GRANT ALL PRIVILEGES ON seaweedfs_fast.* TO 'seaweedfs'@'%';
+FLUSH PRIVILEGES;
+USE seaweedfs;
+CREATE TABLE IF NOT EXISTS filemeta (
+ dirhash BIGINT COMMENT 'first 64 bits of MD5 hash value of directory field',
+ name VARCHAR(1000) COMMENT 'directory or file name',
+ directory TEXT COMMENT 'full path to parent directory',
+ meta LONGBLOB,
+ PRIMARY KEY (dirhash, name)
+) DEFAULT CHARSET=utf8; \ No newline at end of file