From 8ab0c320fe2ff210a0e3cf98f84fd4abe8eab214 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 5 Mar 2026 13:29:14 +0200 Subject: [PATCH 1/7] add storage block --- .github/workflows/docker.yml | 121 +++++++++++++++++++ additional-modules/storage/Dockerfile | 69 +++++++++++ additional-modules/storage/bootstrap-ceph.sh | 82 +++++++++++++ additional-modules/storage/supervisord.conf | 22 ++++ cleanup.sh | 5 + compose-files/storage.yml | 24 ++++ start_ocean.sh | 5 + 7 files changed, 328 insertions(+) create mode 100644 .github/workflows/docker.yml create mode 100644 additional-modules/storage/Dockerfile create mode 100644 additional-modules/storage/bootstrap-ceph.sh create mode 100644 additional-modules/storage/supervisord.conf create mode 100644 compose-files/storage.yml diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..77d13fe --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,121 @@ +name: Build additional barge modules + +on: + workflow_dispatch: + push: + branches: + - 'main' + tags: + - 'v*.*.*' + pull_request: + branches: + - 'main' + +env: + DOCKERHUB_IMAGE: ${{ 'oceanprotocol/barge' }} + GHCR_IMAGE: ${{ 'ghcr.io/oceanprotocol/barge' }} + +jobs: + build: + runs-on: ubuntu-latest + # Only run when not from dependabot and when the Dockerfile for this matrix component exists + if: ${{ github.actor != 'dependabot[bot]'}} + strategy: + fail-fast: false + matrix: + # we keep this just in case we need to change + platform: ${{ github.event_name == 'pull_request' && fromJSON('["linux/amd64"]') || fromJSON('["linux/amd64"]') }} + component: + - folder: "./additional-modules/storage/" + tag: "-storage" + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Prepare + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + platforms: ${{ matrix.platform }} + #image: tonistiigi/binfmt:qemu-v8.0.4 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v3 + with: + platforms: ${{ matrix.platform }} + - name: Login to Docker Hub + id: dockerhub_login + env: + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_PUSH_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKER_PUSH_TOKEN }} + if: env.DOCKERHUB_USERNAME != '' && env.DOCKERHUB_TOKEN != '' + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_PUSH_USERNAME }} + password: ${{ secrets.DOCKER_PUSH_TOKEN }} + - name: Login to GitHub Container Registry + id: ghcr_login + env: + GHCR_PUSH_TOKEN: ${{ secrets.GHCR_PUSH_TOKEN }} + if: env.GHCR_PUSH_TOKEN != '' + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GHCR_PUSH_TOKEN }} + - name: Process tag + id: process_tag + run: | + TAG="${{ matrix.component.tag }}" + PROCESSED_TAG="${TAG:1}" + echo "processed_tag=${PROCESSED_TAG}" >> $GITHUB_OUTPUT + - name: Set Docker metadata + id: ocean_node_meta + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.DOCKERHUB_IMAGE }} + ${{ env.GHCR_IMAGE }} + # generate Docker tags based on the following events/attributes + # we only build main branch and PRs + tags: | + type=ref,event=pr,suffix=${{ matrix.component.tag }}, + type=raw,value=${{ steps.process_tag.outputs.processed_tag }} + + # type=semver,pattern={{major}}.{{minor}} + # type=semver,pattern={{major}} + # type=sha + - name: Prepare image tags + id: image_tags + run: | + TAGS="${{ steps.ocean_node_meta.outputs.tags }}" + echo "dockerhub<> $GITHUB_OUTPUT + echo "$TAGS" | grep "^${{ env.DOCKERHUB_IMAGE }}:" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + echo "ghcr<> $GITHUB_OUTPUT + echo "$TAGS" | grep "^${{ env.GHCR_IMAGE }}:" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + - name: Build and push to Docker Hub + if: steps.dockerhub_login.outcome == 'success' + id: build_dockerhub + uses: docker/build-push-action@v5 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ${{ matrix.component.folder }} + platforms: ${{ matrix.platform }} + push: true + tags: ${{ steps.image_tags.outputs.dockerhub }} + labels: ${{ steps.ocean_node_meta.outputs.labels }} + - name: Build and push to GHCR + if: steps.ghcr_login.outcome == 'success' + id: build_ghcr + uses: docker/build-push-action@v5 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ${{ matrix.component.folder }} + platforms: ${{ matrix.platform }} + push: true + tags: ${{ steps.image_tags.outputs.ghcr }} + labels: ${{ steps.ocean_node_meta.outputs.labels }} \ No newline at end of file diff --git a/additional-modules/storage/Dockerfile b/additional-modules/storage/Dockerfile new file mode 100644 index 0000000..6c7116d --- /dev/null +++ b/additional-modules/storage/Dockerfile @@ -0,0 +1,69 @@ +FROM ubuntu:22.04 + +ENV DEBIAN_FRONTEND=noninteractive + +# ---------------------------------------------------- +# Install packages +# ---------------------------------------------------- +RUN apt-get update && \ + apt-get install -y \ + apache2 \ + vsftpd \ + ceph \ + ceph-mds \ + ceph-mgr \ + ceph-mon \ + ceph-osd \ + radosgw \ + supervisor \ + uuid-runtime \ + dnsutils \ + curl \ + jq && \ + apt-get clean + +# ---------------------------------------------------- +# Apache config +# ---------------------------------------------------- +RUN a2enmod rewrite + +# ---------------------------------------------------- +# FTP config +# ---------------------------------------------------- +RUN sed -i 's/anonymous_enable=NO/anonymous_enable=YES/' /etc/vsftpd.conf && \ + sed -i 's/#write_enable=YES/write_enable=YES/' /etc/vsftpd.conf + +# ---------------------------------------------------- +# Ceph directories +# ---------------------------------------------------- +RUN mkdir -p /etc/ceph /var/lib/ceph/mon/ceph-a /var/lib/ceph/osd/ceph-0 /var/lib/ceph/mgr/ceph-a + +# ---------------------------------------------------- +# Copy bootstrap script +# ---------------------------------------------------- +COPY bootstrap-ceph.sh /usr/local/bin/bootstrap-ceph.sh +RUN chmod +x /usr/local/bin/bootstrap-ceph.sh + +# ---------------------------------------------------- +# Supervisor config +# ---------------------------------------------------- +RUN mkdir -p /var/log/supervisor +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +# ---------------------------------------------------- +# Expose ports +# ---------------------------------------------------- +# Apache +EXPOSE 80 +# FTP data +EXPOSE 20 +# FTP control +EXPOSE 21 +# Ceph MON +EXPOSE 6789 +# Ceph OSD/MGR +EXPOSE 6800-6900 +# RGW S3 + Swift +EXPOSE 7480 + +CMD ["/usr/local/bin/bootstrap-ceph.sh"] \ No newline at end of file diff --git a/additional-modules/storage/bootstrap-ceph.sh b/additional-modules/storage/bootstrap-ceph.sh new file mode 100644 index 0000000..f6c53dd --- /dev/null +++ b/additional-modules/storage/bootstrap-ceph.sh @@ -0,0 +1,82 @@ +#!/bin/bash +set -e + +BOOTSTRAP_MARKER=/var/lib/ceph/.bootstrapped + +if [ -f "$BOOTSTRAP_MARKER" ]; then + echo "Ceph already bootstrapped, starting supervisor..." + exec /usr/bin/supervisord -n +fi + +echo "Bootstrapping Ceph..." + +FSID=$(uuidgen) +HOST_IP=127.0.0.1 + +mkdir -p /etc/ceph /var/lib/ceph/mon/ceph-a /var/lib/ceph/osd/ceph-0 /var/lib/ceph/mgr/ceph-a + +# ---------------------------------------------------- +# Create ceph.conf +# ---------------------------------------------------- +cat </etc/ceph/ceph.conf +[global] +fsid = $FSID +mon initial members = a +mon host = $HOST_IP +public network = 0.0.0.0/0 +cluster network = 0.0.0.0/0 +EOF + +# ---------------------------------------------------- +# Create monmap +# ---------------------------------------------------- +echo "Creating monmap..." +monmaptool --create --add a $HOST_IP --fsid $FSID --clobber /etc/ceph/monmap + +# ---------------------------------------------------- +# Create keyrings +# ---------------------------------------------------- +echo "Creating keyrings..." +ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin +ceph-authtool --create-keyring /etc/ceph/ceph.mon.keyring --gen-key -n mon. +ceph-authtool /etc/ceph/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring + +# ---------------------------------------------------- +# Initialize MON +# ---------------------------------------------------- +echo "Initializing mon..." +ceph-mon --mkfs -i a --monmap /etc/ceph/monmap --keyring /etc/ceph/ceph.mon.keyring + +# ---------------------------------------------------- +# Initialize OSD +# ---------------------------------------------------- +echo "Initializing OSD..." +OSD_UUID=$(uuidgen) +ceph-authtool --create-keyring /var/lib/ceph/osd/ceph-0/keyring --gen-key -n osd.0 +ceph-authtool /etc/ceph/ceph.mon.keyring --import-keyring /var/lib/ceph/osd/ceph-0/keyring + +cp /etc/ceph/ceph.conf /var/lib/ceph/osd/ceph-0/ +cp /etc/ceph/monmap /var/lib/ceph/osd/ceph-0/ + +echo "Setting permissions..." +mkdir -p /var/lib/ceph/osd/ceph-0 +chown -R ceph:ceph /var/lib/ceph/osd/ceph-0 /var/lib/ceph/mon/ceph-a /var/lib/ceph/mgr/ceph-a + +mkdir -p /var/run/ceph /var/lib/ceph/tmp +chown -R ceph:ceph /var/run/ceph /var/lib/ceph/tmp + +echo "Mkfs OSD..." +sudo -u ceph ceph-osd -i 0 --mkfs --osd-uuid $OSD_UUID --no-mon-config + + +# ---------------------------------------------------- +# Initialize MGR +# ---------------------------------------------------- +echo "Initialize MGR..." +ceph-authtool --create-keyring /var/lib/ceph/mgr/ceph-a/keyring --gen-key -n mgr.a +ceph-authtool /etc/ceph/ceph.mon.keyring --import-keyring /var/lib/ceph/mgr/ceph-a/keyring + +touch "$BOOTSTRAP_MARKER" + +echo "Starting supervisor..." +exec /usr/bin/supervisord -n \ No newline at end of file diff --git a/additional-modules/storage/supervisord.conf b/additional-modules/storage/supervisord.conf new file mode 100644 index 0000000..98ae71a --- /dev/null +++ b/additional-modules/storage/supervisord.conf @@ -0,0 +1,22 @@ +[supervisord] +nodaemon=true + +[program:apache2] +command=/usr/sbin/apachectl -D FOREGROUND +autorestart=true + +[program:vsftpd] +command=/usr/sbin/vsftpd /etc/vsftpd.conf +autorestart=true + +[program:ceph-mon] +command=/usr/bin/ceph-mon -i a --foreground +autorestart=true + +[program:ceph-mgr] +command=/usr/bin/ceph-mgr -i a +autorestart=true + +[program:ceph-osd] +command=/usr/bin/ceph-osd -i 0 +autorestart=true \ No newline at end of file diff --git a/cleanup.sh b/cleanup.sh index bc68647..6951b36 100755 --- a/cleanup.sh +++ b/cleanup.sh @@ -8,6 +8,7 @@ docker container stop ocean-ganache-1 docker container stop ocean-faucet-1 docker container stop ocean-dashboard-1 docker container stop docker-registry +docker container stop ocean-storage-1 docker container rm ocean-node-1 docker container rm ocean-ipfs-1 @@ -18,11 +19,15 @@ docker container rm ocean-ganache-1 docker container rm ocean-faucet-1 docker container rm ocean-dashboard-1 docker container rm docker-registry +docker container rm ocean-storage-1 docker volume rm ocean-graphipfs docker volume rm ocean-graphpgsql docker volume rm ocean-provider1db docker volume rm ocean-provider2db +docker volume rm ocean_ceph_data +docker volume rm ocean_ftp +docker volume rm ocean_www docker network rm ocean_backend docker volume rm $(docker volume ls -q) diff --git a/compose-files/storage.yml b/compose-files/storage.yml new file mode 100644 index 0000000..39dd17e --- /dev/null +++ b/compose-files/storage.yml @@ -0,0 +1,24 @@ +version: '3' +services: + storage: + image: oceanprotocol/barge:main-storage + ports: + - "80:80" + - "443:443" + - "20-21:20-21" + - "6789:6789" # Ceph MON + - "6800-6900:6800-6900" # Ceph OSD/MGR + - "7480:7480" # Ceph RGW (S3 + Swift) + networks: + ocean_backend: + ipv4_address: 172.15.0.7 + volumes: + - www:/var/www/html + - ftp:/srv/ftp + - ceph_data:/data + +volumes: + www: + ftp: + ceph_data: + diff --git a/start_ocean.sh b/start_ocean.sh index 01b96a0..752b6fc 100755 --- a/start_ocean.sh +++ b/start_ocean.sh @@ -161,6 +161,7 @@ COMPOSE_FILES+=" -f ${COMPOSE_DIR}/ipfs.yml" COMPOSE_FILES+=" -f ${COMPOSE_DIR}/ganache.yml" COMPOSE_FILES+=" -f ${COMPOSE_DIR}/ocean_contracts.yml" COMPOSE_FILES+=" -f ${COMPOSE_DIR}/node.yml" +COMPOSE_FILES+=" -f ${COMPOSE_DIR}/storage.yml" DOCKER_COMPOSE_EXTRA_OPTS="${DOCKER_COMPOSE_EXTRA_OPTS:-}" @@ -202,6 +203,10 @@ while :; do COMPOSE_FILES="${COMPOSE_FILES/ -f ${COMPOSE_DIR}\/ipfs.yml/}" printf $COLOR_Y'Starting without IPFS...\n\n'$COLOR_RESET ;; + --no-storage) + COMPOSE_FILES="${COMPOSE_FILES/ -f ${COMPOSE_DIR}\/storage.yml/}" + printf $COLOR_Y'Starting without Storage...\n\n'$COLOR_RESET + ;; --no-elasticsearch) COMPOSE_FILES="${COMPOSE_FILES/ -f ${COMPOSE_DIR}\/elasticsearch.yml/}" printf $COLOR_Y'Starting without Elastic search...\n\n'$COLOR_RESET From 665a83358da83b3b912b8ae9f5c9c86e34f102ee Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 5 Mar 2026 13:32:40 +0200 Subject: [PATCH 2/7] sue ghcr latest storage image --- compose-files/storage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compose-files/storage.yml b/compose-files/storage.yml index 39dd17e..7e87826 100644 --- a/compose-files/storage.yml +++ b/compose-files/storage.yml @@ -1,7 +1,7 @@ version: '3' services: storage: - image: oceanprotocol/barge:main-storage + image: ghcr.io/oceanprotocol/barge:storage ports: - "80:80" - "443:443" From c84058846ecdd70a50a35d3a07385008814a020a Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 5 Mar 2026 13:50:28 +0200 Subject: [PATCH 3/7] create default user --- additional-modules/storage/bootstrap-ceph.sh | 85 +++++++++++++++++--- 1 file changed, 76 insertions(+), 9 deletions(-) diff --git a/additional-modules/storage/bootstrap-ceph.sh b/additional-modules/storage/bootstrap-ceph.sh index f6c53dd..e1fcbc7 100644 --- a/additional-modules/storage/bootstrap-ceph.sh +++ b/additional-modules/storage/bootstrap-ceph.sh @@ -13,7 +13,12 @@ echo "Bootstrapping Ceph..." FSID=$(uuidgen) HOST_IP=127.0.0.1 -mkdir -p /etc/ceph /var/lib/ceph/mon/ceph-a /var/lib/ceph/osd/ceph-0 /var/lib/ceph/mgr/ceph-a +# ---------------------------------------------------- +# Required runtime directories +# ---------------------------------------------------- +mkdir -p /var/run/ceph +mkdir -p /var/lib/ceph/tmp +chown -R ceph:ceph /var/run/ceph /var/lib/ceph/tmp # ---------------------------------------------------- # Create ceph.conf @@ -25,6 +30,7 @@ mon initial members = a mon host = $HOST_IP public network = 0.0.0.0/0 cluster network = 0.0.0.0/0 +osd objectstore = bluestore EOF # ---------------------------------------------------- @@ -46,37 +52,98 @@ ceph-authtool /etc/ceph/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client. # ---------------------------------------------------- echo "Initializing mon..." ceph-mon --mkfs -i a --monmap /etc/ceph/monmap --keyring /etc/ceph/ceph.mon.keyring +chown -R ceph:ceph /var/lib/ceph/mon/ceph-a # ---------------------------------------------------- # Initialize OSD # ---------------------------------------------------- echo "Initializing OSD..." OSD_UUID=$(uuidgen) + ceph-authtool --create-keyring /var/lib/ceph/osd/ceph-0/keyring --gen-key -n osd.0 ceph-authtool /etc/ceph/ceph.mon.keyring --import-keyring /var/lib/ceph/osd/ceph-0/keyring cp /etc/ceph/ceph.conf /var/lib/ceph/osd/ceph-0/ cp /etc/ceph/monmap /var/lib/ceph/osd/ceph-0/ -echo "Setting permissions..." -mkdir -p /var/lib/ceph/osd/ceph-0 -chown -R ceph:ceph /var/lib/ceph/osd/ceph-0 /var/lib/ceph/mon/ceph-a /var/lib/ceph/mgr/ceph-a - -mkdir -p /var/run/ceph /var/lib/ceph/tmp -chown -R ceph:ceph /var/run/ceph /var/lib/ceph/tmp +chown -R ceph:ceph /var/lib/ceph/osd/ceph-0 echo "Mkfs OSD..." sudo -u ceph ceph-osd -i 0 --mkfs --osd-uuid $OSD_UUID --no-mon-config - # ---------------------------------------------------- # Initialize MGR # ---------------------------------------------------- echo "Initialize MGR..." ceph-authtool --create-keyring /var/lib/ceph/mgr/ceph-a/keyring --gen-key -n mgr.a ceph-authtool /etc/ceph/ceph.mon.keyring --import-keyring /var/lib/ceph/mgr/ceph-a/keyring +chown -R ceph:ceph /var/lib/ceph/mgr/ceph-a -touch "$BOOTSTRAP_MARKER" +# ---------------------------------------------------- +# Start MON + MGR + OSD temporarily to create pools +# ---------------------------------------------------- +echo "Starting MON/MGR/OSD temporarily for pool creation..." +ceph-mon -i a --foreground & +sleep 3 +ceph-mgr -i a & +sleep 3 +ceph-osd -i 0 & +sleep 5 + +# ---------------------------------------------------- +# Create RGW pools +# ---------------------------------------------------- +echo "Creating RGW pools..." +ceph osd pool create default.rgw.meta 1 +ceph osd pool create default.rgw.log 1 +ceph osd pool create default.rgw.control 1 +ceph osd pool create default.rgw.buckets.data 1 +ceph osd pool create default.rgw.buckets.index 1 + +# ---------------------------------------------------- +# Create default S3 user +# ---------------------------------------------------- +echo "Creating default S3 user..." + +ACCESS_KEY="ocean123" +SECRET_KEY="ocean123secret" + +radosgw-admin user create \ + --uid="ocean" \ + --display-name="Ocean Test User" \ + --access-key="$ACCESS_KEY" \ + --secret-key="$SECRET_KEY" \ + >/tmp/s3-user.json + +# ---------------------------------------------------- +# Create test bucket +# ---------------------------------------------------- +echo "Creating test bucket..." +radosgw-admin bucket create --bucket="test-bucket" --uid="ocean" +# ---------------------------------------------------- +# Print credentials +# ---------------------------------------------------- +echo "===============================================" +echo " Default S3 Credentials" +echo "-----------------------------------------------" +echo " Access Key: $ACCESS_KEY" +echo " Secret Key: $SECRET_KEY" +echo " Endpoint: http://localhost:7480" +echo " Bucket: test-bucket" +echo "===============================================" + +# ---------------------------------------------------- +# Stop temporary daemons +# ---------------------------------------------------- +killall ceph-mon || true +killall ceph-mgr || true +killall ceph-osd || true +sleep 2 + +# ---------------------------------------------------- +# Mark bootstrap complete and start supervisor +# ---------------------------------------------------- +touch "$BOOTSTRAP_MARKER" echo "Starting supervisor..." exec /usr/bin/supervisord -n \ No newline at end of file From 93254d2a9fe205c232d09b12f0f415479d8fddf1 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 5 Mar 2026 17:22:28 +0200 Subject: [PATCH 4/7] rewrite ceph install --- additional-modules/storage/Dockerfile | 97 +++--- additional-modules/storage/bootstrap-ceph.sh | 149 --------- additional-modules/storage/entrypoint.sh | 310 +++++++++++++++++++ additional-modules/storage/supervisord.conf | 22 -- compose-files/storage.yml | 12 +- 5 files changed, 357 insertions(+), 233 deletions(-) delete mode 100644 additional-modules/storage/bootstrap-ceph.sh create mode 100755 additional-modules/storage/entrypoint.sh delete mode 100644 additional-modules/storage/supervisord.conf diff --git a/additional-modules/storage/Dockerfile b/additional-modules/storage/Dockerfile index 6c7116d..9870c23 100644 --- a/additional-modules/storage/Dockerfile +++ b/additional-modules/storage/Dockerfile @@ -1,69 +1,48 @@ -FROM ubuntu:22.04 - +FROM ubuntu:22.04 AS ceph ENV DEBIAN_FRONTEND=noninteractive - -# ---------------------------------------------------- -# Install packages -# ---------------------------------------------------- -RUN apt-get update && \ - apt-get install -y \ - apache2 \ - vsftpd \ - ceph \ - ceph-mds \ - ceph-mgr \ - ceph-mon \ - ceph-osd \ - radosgw \ - supervisor \ - uuid-runtime \ - dnsutils \ - curl \ - jq && \ - apt-get clean - +ENV TZ=Etc/UTC + +RUN apt -y update && apt -y install \ + apache2 \ + vsftpd \ + lsb-release \ + wget \ + curl \ + pgp \ + tzdata \ + vim \ + dnsutils \ + iputils-ping \ + iproute2 \ + jq # ---------------------------------------------------- # Apache config # ---------------------------------------------------- RUN a2enmod rewrite - # ---------------------------------------------------- # FTP config # ---------------------------------------------------- RUN sed -i 's/anonymous_enable=NO/anonymous_enable=YES/' /etc/vsftpd.conf && \ sed -i 's/#write_enable=YES/write_enable=YES/' /etc/vsftpd.conf - -# ---------------------------------------------------- -# Ceph directories -# ---------------------------------------------------- -RUN mkdir -p /etc/ceph /var/lib/ceph/mon/ceph-a /var/lib/ceph/osd/ceph-0 /var/lib/ceph/mgr/ceph-a - -# ---------------------------------------------------- -# Copy bootstrap script -# ---------------------------------------------------- -COPY bootstrap-ceph.sh /usr/local/bin/bootstrap-ceph.sh -RUN chmod +x /usr/local/bin/bootstrap-ceph.sh - -# ---------------------------------------------------- -# Supervisor config -# ---------------------------------------------------- -RUN mkdir -p /var/log/supervisor -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf - -# ---------------------------------------------------- -# Expose ports -# ---------------------------------------------------- -# Apache -EXPOSE 80 -# FTP data -EXPOSE 20 -# FTP control -EXPOSE 21 -# Ceph MON -EXPOSE 6789 -# Ceph OSD/MGR -EXPOSE 6800-6900 -# RGW S3 + Swift -EXPOSE 7480 - -CMD ["/usr/local/bin/bootstrap-ceph.sh"] \ No newline at end of file +RUN wget \ + -q \ + -O- https://download.ceph.com/keys/release.asc | \ + gpg --dearmor > /etc/apt/trusted.gpg.d/ceph.gpg && \ + echo "deb https://download.ceph.com/debian-reef/ $(lsb_release -sc) main" \ + > /etc/apt/sources.list.d/ceph.list && \ + apt -y update && \ + apt install -y ceph radosgw +RUN apt clean && \ + apt autoremove -y && \ + rm -rf /var/lib/{apt,dpkg,cache,log}/ + +FROM ceph AS radosgw +ENV TZ=Etc/UTC +ENV MGR_USERNAME="admin" +ENV MAIN="none" +# ACCESS_KEY, SECRET_KEY, MGR_PASSWORD: pass at runtime (e.g. compose environment) to avoid embedding in image + +EXPOSE 7480 + +COPY ./entrypoint.sh /entrypoint +ENTRYPOINT ["/entrypoint"] \ No newline at end of file diff --git a/additional-modules/storage/bootstrap-ceph.sh b/additional-modules/storage/bootstrap-ceph.sh deleted file mode 100644 index e1fcbc7..0000000 --- a/additional-modules/storage/bootstrap-ceph.sh +++ /dev/null @@ -1,149 +0,0 @@ -#!/bin/bash -set -e - -BOOTSTRAP_MARKER=/var/lib/ceph/.bootstrapped - -if [ -f "$BOOTSTRAP_MARKER" ]; then - echo "Ceph already bootstrapped, starting supervisor..." - exec /usr/bin/supervisord -n -fi - -echo "Bootstrapping Ceph..." - -FSID=$(uuidgen) -HOST_IP=127.0.0.1 - -# ---------------------------------------------------- -# Required runtime directories -# ---------------------------------------------------- -mkdir -p /var/run/ceph -mkdir -p /var/lib/ceph/tmp -chown -R ceph:ceph /var/run/ceph /var/lib/ceph/tmp - -# ---------------------------------------------------- -# Create ceph.conf -# ---------------------------------------------------- -cat </etc/ceph/ceph.conf -[global] -fsid = $FSID -mon initial members = a -mon host = $HOST_IP -public network = 0.0.0.0/0 -cluster network = 0.0.0.0/0 -osd objectstore = bluestore -EOF - -# ---------------------------------------------------- -# Create monmap -# ---------------------------------------------------- -echo "Creating monmap..." -monmaptool --create --add a $HOST_IP --fsid $FSID --clobber /etc/ceph/monmap - -# ---------------------------------------------------- -# Create keyrings -# ---------------------------------------------------- -echo "Creating keyrings..." -ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin -ceph-authtool --create-keyring /etc/ceph/ceph.mon.keyring --gen-key -n mon. -ceph-authtool /etc/ceph/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring - -# ---------------------------------------------------- -# Initialize MON -# ---------------------------------------------------- -echo "Initializing mon..." -ceph-mon --mkfs -i a --monmap /etc/ceph/monmap --keyring /etc/ceph/ceph.mon.keyring -chown -R ceph:ceph /var/lib/ceph/mon/ceph-a - -# ---------------------------------------------------- -# Initialize OSD -# ---------------------------------------------------- -echo "Initializing OSD..." -OSD_UUID=$(uuidgen) - -ceph-authtool --create-keyring /var/lib/ceph/osd/ceph-0/keyring --gen-key -n osd.0 -ceph-authtool /etc/ceph/ceph.mon.keyring --import-keyring /var/lib/ceph/osd/ceph-0/keyring - -cp /etc/ceph/ceph.conf /var/lib/ceph/osd/ceph-0/ -cp /etc/ceph/monmap /var/lib/ceph/osd/ceph-0/ - -chown -R ceph:ceph /var/lib/ceph/osd/ceph-0 - -echo "Mkfs OSD..." -sudo -u ceph ceph-osd -i 0 --mkfs --osd-uuid $OSD_UUID --no-mon-config - -# ---------------------------------------------------- -# Initialize MGR -# ---------------------------------------------------- -echo "Initialize MGR..." -ceph-authtool --create-keyring /var/lib/ceph/mgr/ceph-a/keyring --gen-key -n mgr.a -ceph-authtool /etc/ceph/ceph.mon.keyring --import-keyring /var/lib/ceph/mgr/ceph-a/keyring -chown -R ceph:ceph /var/lib/ceph/mgr/ceph-a - -# ---------------------------------------------------- -# Start MON + MGR + OSD temporarily to create pools -# ---------------------------------------------------- -echo "Starting MON/MGR/OSD temporarily for pool creation..." -ceph-mon -i a --foreground & -sleep 3 -ceph-mgr -i a & -sleep 3 -ceph-osd -i 0 & -sleep 5 - -# ---------------------------------------------------- -# Create RGW pools -# ---------------------------------------------------- -echo "Creating RGW pools..." -ceph osd pool create default.rgw.meta 1 -ceph osd pool create default.rgw.log 1 -ceph osd pool create default.rgw.control 1 -ceph osd pool create default.rgw.buckets.data 1 -ceph osd pool create default.rgw.buckets.index 1 - -# ---------------------------------------------------- -# Create default S3 user -# ---------------------------------------------------- -echo "Creating default S3 user..." - -ACCESS_KEY="ocean123" -SECRET_KEY="ocean123secret" - -radosgw-admin user create \ - --uid="ocean" \ - --display-name="Ocean Test User" \ - --access-key="$ACCESS_KEY" \ - --secret-key="$SECRET_KEY" \ - >/tmp/s3-user.json - -# ---------------------------------------------------- -# Create test bucket -# ---------------------------------------------------- -echo "Creating test bucket..." -radosgw-admin bucket create --bucket="test-bucket" --uid="ocean" - -# ---------------------------------------------------- -# Print credentials -# ---------------------------------------------------- -echo "===============================================" -echo " Default S3 Credentials" -echo "-----------------------------------------------" -echo " Access Key: $ACCESS_KEY" -echo " Secret Key: $SECRET_KEY" -echo " Endpoint: http://localhost:7480" -echo " Bucket: test-bucket" -echo "===============================================" - -# ---------------------------------------------------- -# Stop temporary daemons -# ---------------------------------------------------- -killall ceph-mon || true -killall ceph-mgr || true -killall ceph-osd || true -sleep 2 - -# ---------------------------------------------------- -# Mark bootstrap complete and start supervisor -# ---------------------------------------------------- -touch "$BOOTSTRAP_MARKER" -echo "Starting supervisor..." -exec /usr/bin/supervisord -n \ No newline at end of file diff --git a/additional-modules/storage/entrypoint.sh b/additional-modules/storage/entrypoint.sh new file mode 100755 index 0000000..a7258ae --- /dev/null +++ b/additional-modules/storage/entrypoint.sh @@ -0,0 +1,310 @@ +#!/usr/bin/env bash + +set -eux +set -o pipefail + +# Defaults when not set at runtime (avoid ENV in Dockerfile for secrets) +ACCESS_KEY="${ACCESS_KEY:-ocean123}" +SECRET_KEY="${SECRET_KEY:-ocean123secret}" +MGR_PASSWORD="${MGR_PASSWORD:-admin}" + +# In Docker, hostname -d is often empty; use defaults so MAIN=none single-node works +ZONE="$(hostname -s | grep -oP '^[a-z]+[0-9]+' || echo 'a')" +ZONE_GROUP="$(hostname -d | grep -oP '^[a-z0-9]+' || echo 'default')" +REALM="$(hostname -d | grep -oP '^[a-z0-9]+' || echo 'default')" +DOMAIN="$(hostname -d || echo "$(hostname -s).local")" + +## +# create ceph.conf +## +echo "create ceph.conf" + +cat <<- EOF > /etc/ceph/ceph.conf +[global] +fsid = $(uuidgen) +mon_host = $(hostname -i) +auth_allow_insecure_global_id_reclaim = false +mon_warn_on_pool_no_redundancy = false +mon_osd_down_out_interval = 60 +mon_osd_report_timeout = 300 +mon_osd_down_out_subtree_limit = host +mon_osd_reporter_subtree_level = rack +osd_scrub_auto_repair = true +osd_pool_default_size = 1 +osd_pool_default_min_size = 1 +osd_pool_default_pg_num = 1 +osd_crush_chooseleaf_type = 0 +osd_objectstore = memstore +EOF + +## +# create mon +## +echo "create ceph mon" + +ceph-authtool \ + --create-keyring /tmp/ceph.mon.keyring \ + --gen-key -n mon. \ + --cap mon 'allow *' +ceph-authtool \ + --create-keyring /etc/ceph/ceph.client.admin.keyring \ + --gen-key -n client.admin \ + --cap mon 'allow *' \ + --cap osd 'allow *' \ + --cap mds 'allow *' \ + --cap mgr 'allow *' +ceph-authtool /tmp/ceph.mon.keyring \ + --import-keyring /etc/ceph/ceph.client.admin.keyring + +monmaptool \ + --create \ + --add "$(hostname -s)" "$(hostname -i)" \ + --fsid "$(grep -oP '(?<=^fsid = )[0-9a-z-]*' /etc/ceph/ceph.conf)" \ + --set-min-mon-release pacific \ + --enable-all-features \ + --clobber \ + /tmp/monmap + +mkdir -p "/var/lib/ceph/mon/ceph-$(hostname -s)" +rm -rf "/var/lib/ceph/mon/ceph-$(hostname -s)/*" +ceph-mon --mkfs -i "$(hostname -s)" --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring +chown -R ceph:ceph /var/lib/ceph/mon/ +ceph-mon --cluster ceph --id "$(hostname -s)" --setuser ceph --setgroup ceph +ceph config set global auth_allow_insecure_global_id_reclaim false + +## +# create mgr +## +echo "create ceph mgr" + +mkdir -p "/var/lib/ceph/mgr/ceph-$(hostname -s)" +ceph auth get-or-create "mgr.$(hostname -s)" mon 'allow profile mgr' osd 'allow *' mds 'allow *' \ + > "/var/lib/ceph/mgr/ceph-$(hostname -s)/keyring" +chown -R ceph:ceph /var/lib/ceph/mgr/ +ceph-mgr --cluster ceph --id "$(hostname -s)" --setuser ceph --setgroup ceph + +## +# crate osd +## +OSD=$(ceph osd create) +echo "create ceph osd.${OSD}" + +mkdir -p "/osd/osd.${OSD}/data" +ceph auth get-or-create "osd.${OSD}" mon 'allow profile osd' mgr 'allow profile osd' osd 'allow *' \ + > "/osd/osd.${OSD}/data/keyring" +ceph-osd -i "${OSD}" --mkfs --osd-data "/osd/osd.${OSD}/data" +chown -R ceph:ceph "/osd/osd.${OSD}/data" +ceph-osd -i "${OSD}" --osd-data "/osd/osd.${OSD}/data" --keyring "/osd/osd.${OSD}/data/keyring" + +## +# create rgw +## +echo "create ceph rgw" + +mkdir -p "/var/lib/ceph/radosgw/ceph-rgw.$(hostname -s)" +ceph auth get-or-create "client.rgw.$(hostname -s)" osd 'allow rwx' mon 'allow rw' \ + -o "/var/lib/ceph/radosgw/ceph-rgw.$(hostname -s)/keyring" +touch "/var/lib/ceph/radosgw/ceph-rgw.$(hostname -s)/done" +chown -R ceph:ceph /var/lib/ceph/radosgw + +if [ "${MAIN}" == "none" ]; then + echo "create admin-user" + radosgw-admin user create \ + --uid=".admin" \ + --display-name="admin" \ + --system \ + --key-type="s3" \ + --access-key="${ACCESS_KEY}" \ + --secret-key="${SECRET_KEY}" + + ceph config set global rgw_enable_usage_log true + ceph config set global rgw_dns_name "$(hostname -s)" + + radosgw --cluster ceph --rgw-zone "default" --name "client.rgw.$(hostname -s)" --setuser ceph --setgroup ceph +fi + +if [ "${MAIN}" == "yes" ]; then + echo "create realm ${REALM}" + radosgw-admin realm create \ + --rgw-realm="${REALM}" \ + --default + + echo "create zonegroup ${ZONE_GROUP}" + radosgw-admin zonegroup create \ + --rgw-realm="${REALM}" \ + --rgw-zonegroup="${ZONE_GROUP}" \ + --endpoints="http://${DOMAIN}:7480" \ + --master \ + --default + + radosgw-admin zonegroup get --rgw-zonegroup="${ZONE_GROUP}" | \ + jq \ + --arg domain "${DOMAIN}" \ + --arg zone1 "dev1-${DOMAIN}" \ + --arg zone2 "dev2-${DOMAIN}" \ + '.hostnames |= [$domain, $zone1, $zone2]' | \ + radosgw-admin zonegroup set --rgw-zonegroup="${ZONE_GROUP}" -i - + + echo "create zone ${ZONE}" + radosgw-admin zone create \ + --rgw-zonegroup="${ZONE_GROUP}" \ + --rgw-zone="${ZONE}" \ + --endpoints="http://${ZONE}-${DOMAIN}:7480" \ + --master \ + --default + + echo "create placement PREMIUM" + radosgw-admin zonegroup placement add \ + --rgw-zonegroup="${ZONE_GROUP}" \ + --placement-id="default-placement" \ + --storage-class="PREMIUM" + + echo "create placement ARCHIVE" + radosgw-admin zonegroup placement add \ + --rgw-zonegroup="${ZONE_GROUP}" \ + --placement-id="default-placement" \ + --storage-class="ARCHIVE" + + echo "create synchronization-user" + radosgw-admin user create \ + --uid=".synchronization" \ + --display-name="synchronization-user" \ + --system \ + --key-type="s3" \ + --access-key="${ACCESS_KEY}" \ + --secret-key="${SECRET_KEY}" + + echo "add synchronization-user to zone ${ZONE}" + radosgw-admin zone modify \ + --rgw-zone="${ZONE}" \ + --access-key="${ACCESS_KEY}" \ + --secret-key="${SECRET_KEY}" + + ## + # disable the defaut sync of buckets between zones, + # but allow specific ones to replicate + ## + radosgw-admin sync group create \ + --group-id=group-main \ + --status=allowed + radosgw-admin sync group flow create \ + --group-id=group-main \ + --flow-id=flow-main \ + --flow-type=symmetrical \ + --zones=dev1,dev2 + radosgw-admin sync group pipe create \ + --group-id=group-main \ + --pipe-id=pipe-main \ + --source-zones='*' \ + --source-bucket='*' \ + --dest-zones='*' \ + --dest-bucket='*' + + ## + # enable mirroring for a specific bucket between zones + ## + # radosgw-admin sync group create \ + # --bucket=test1 \ + # --group-id=group-test1 \ + # --status=enabled + # radosgw-admin sync group pipe create \ + # --bucket=test1 \ + # --group-id=group-test1 \ + # --pipe-id=pipe-test1 \ + # --source-zones='*' \ + # --source-bucket='*' \ + # --dest-zones='*' \ + # --dest-bucket='*' + + echo "create objstorage-admin user" + radosgw-admin user create \ + --uid=".objstorage-admin" \ + --display-name=".objstorage-admin" \ + --system \ + --admin + + radosgw-admin period update \ + --commit +fi + +if [ "${MAIN}" == "no" ]; then + echo "get realm http://${DOMAIN}:7480" + while ! radosgw-admin realm pull \ + --url="http://${DOMAIN}:7480" \ + --access-key="${ACCESS_KEY}" \ + --secret="${SECRET_KEY}"; do sleep 0.5; done + + echo "set default realm to ${ZONE_GROUP}" + radosgw-admin realm default \ + --rgw-realm="${ZONE_GROUP}" + + echo "create zone ${ZONE}" + radosgw-admin zone create \ + --rgw-zonegroup="${ZONE_GROUP}" \ + --rgw-zone="${ZONE}" \ + --access-key="${ACCESS_KEY}" \ + --secret-key="${SECRET_KEY}" \ + --endpoints="http://${ZONE}-${DOMAIN}:7480" \ + --default +fi + +if [ "${MAIN}" == "yes" ] || [ "${MAIN}" == "no" ]; then + echo "create placement PREMIUM for ${ZONE}" + radosgw-admin zone placement add \ + --rgw-zone="${ZONE}" \ + --placement-id="default-placement" \ + --storage-class="PREMIUM" \ + --data-pool "${ZONE}.rgw.buckets.premium.data" + + echo "create placement STANDARD for ${ZONE}" + radosgw-admin zone placement add \ + --rgw-zone="${ZONE}" \ + --placement-id="default-placement" \ + --storage-class="STANDARD" \ + --data-pool "${ZONE}.rgw.buckets.standard.data" + + echo "create placement ARCIVE for ${ZONE}" + radosgw-admin zone placement add \ + --rgw-zone="${ZONE}" \ + --placement-id="default-placement" \ + --storage-class="ARCHIVE" \ + --data-pool "${ZONE}.rgw.buckets.archive.data" \ + --compression lz4 + + radosgw-admin period update --commit + + ceph config set global rgw_enable_usage_log true + radosgw --cluster ceph --rgw-zone "${ZONE}" --name "client.rgw.$(hostname -s)" --setuser ceph --setgroup ceph +fi + +# Configure Cluster +ceph mgr module enable dashboard --force +ceph mgr module enable prometheus --force +ceph mgr module enable diskprediction_local --force +ceph mgr module enable stats --force +ceph mgr module disable nfs +ceph config set mgr mgr/dashboard/ssl false --force +ceph dashboard feature disable rbd cephfs nfs iscsi mirroring +echo "${MGR_PASSWORD}" | ceph dashboard ac-user-create "${MGR_USERNAME}" -i - administrator --force-password +echo "${ACCESS_KEY}" | ceph dashboard set-rgw-api-access-key -i - +echo "${SECRET_KEY}" | ceph dashboard set-rgw-api-secret-key -i - +ceph dashboard set-rgw-api-ssl-verify False + +# Test API +curl -X 'POST' \ + 'http://127.0.0.1:8080/api/auth' \ + -H 'accept: application/vnd.ceph.api.v1.0+json' \ + -H 'Content-Type: application/json' \ + -d "{ + \"username\": \"${MGR_USERNAME}\", + \"password\": \"${MGR_PASSWORD}\" +}" + +## +# log output in forground +## +while ! tail -F /var/log/ceph/ceph* ; do + sleep 0.1 +done + +echo "Container terminated ..." \ No newline at end of file diff --git a/additional-modules/storage/supervisord.conf b/additional-modules/storage/supervisord.conf deleted file mode 100644 index 98ae71a..0000000 --- a/additional-modules/storage/supervisord.conf +++ /dev/null @@ -1,22 +0,0 @@ -[supervisord] -nodaemon=true - -[program:apache2] -command=/usr/sbin/apachectl -D FOREGROUND -autorestart=true - -[program:vsftpd] -command=/usr/sbin/vsftpd /etc/vsftpd.conf -autorestart=true - -[program:ceph-mon] -command=/usr/bin/ceph-mon -i a --foreground -autorestart=true - -[program:ceph-mgr] -command=/usr/bin/ceph-mgr -i a -autorestart=true - -[program:ceph-osd] -command=/usr/bin/ceph-osd -i 0 -autorestart=true \ No newline at end of file diff --git a/compose-files/storage.yml b/compose-files/storage.yml index 7e87826..4b48e94 100644 --- a/compose-files/storage.yml +++ b/compose-files/storage.yml @@ -1,14 +1,19 @@ version: '3' services: storage: - image: ghcr.io/oceanprotocol/barge:storage + image: hcr.io/oceanprotocol/barge:storage ports: - "80:80" - "443:443" - "20-21:20-21" - - "6789:6789" # Ceph MON - - "6800-6900:6800-6900" # Ceph OSD/MGR - "7480:7480" # Ceph RGW (S3 + Swift) + - "8080:8080" # Ceph RGW (S3 + Swift) + environment: + MAIN: "none" + ACCESS_KEY: "ocean123" + SECRET_KEY: "ocean123secret" + MGR_USERNAME: "admin" + MGR_PASSWORD: "admin" networks: ocean_backend: ipv4_address: 172.15.0.7 @@ -16,6 +21,7 @@ services: - www:/var/www/html - ftp:/srv/ftp - ceph_data:/data + - ./ceph_logs:/var/log/ceph/ volumes: www: From 987e8b9b879d5d82449ebd933b8d92b783d8d760 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 5 Mar 2026 17:25:15 +0200 Subject: [PATCH 5/7] fix typo --- compose-files/storage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compose-files/storage.yml b/compose-files/storage.yml index 4b48e94..1cc2f57 100644 --- a/compose-files/storage.yml +++ b/compose-files/storage.yml @@ -1,7 +1,7 @@ version: '3' services: storage: - image: hcr.io/oceanprotocol/barge:storage + image: ghcr.io/oceanprotocol/barge:storage ports: - "80:80" - "443:443" From 1b46dea06ff4a607983304dcf3327aece8b7953a Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 5 Mar 2026 17:33:23 +0200 Subject: [PATCH 6/7] make www and ftp binds --- compose-files/storage.yml | 8 ++++---- start_ocean.sh | 7 +++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/compose-files/storage.yml b/compose-files/storage.yml index 1cc2f57..3d9ac43 100644 --- a/compose-files/storage.yml +++ b/compose-files/storage.yml @@ -18,10 +18,10 @@ services: ocean_backend: ipv4_address: 172.15.0.7 volumes: - - www:/var/www/html - - ftp:/srv/ftp - - ceph_data:/data - - ./ceph_logs:/var/log/ceph/ + - ${OCEAN_WWW_FOLDER}:/var/www/html + - ${OCEAN_FTP_FOLDER}:/srv/ftp + + volumes: www: diff --git a/start_ocean.sh b/start_ocean.sh index 752b6fc..5973f1d 100755 --- a/start_ocean.sh +++ b/start_ocean.sh @@ -73,6 +73,13 @@ export OCEAN_CERTS_FOLDER="${OCEAN_HOME}/ocean-certs/" mkdir -p ${OCEAN_CERTS_FOLDER} # copy certs cp -r ./certs/* ${OCEAN_CERTS_FOLDER} + +#www folder +export OCEAN_WWW_FOLDER="${OCEAN_HOME}/storage-www/" +mkdir -p ${OCEAN_WWW_FOLDER} +#ftp folder +export OCEAN_FTP_FOLDER="${OCEAN_HOME}/storage-ftp/" +mkdir -p ${OCEAN_FTP_FOLDER} # Specify which ethereum client to run or connect to: development export CONTRACTS_NETWORK_NAME="development" From 053380b81bdb57a6128bed25bae91d9fa1538131 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 5 Mar 2026 17:34:25 +0200 Subject: [PATCH 7/7] remove uneeded volumes & fix cleanup --- cleanup.sh | 4 ---- compose-files/storage.yml | 8 -------- 2 files changed, 12 deletions(-) diff --git a/cleanup.sh b/cleanup.sh index 6951b36..4719ec2 100755 --- a/cleanup.sh +++ b/cleanup.sh @@ -25,9 +25,5 @@ docker volume rm ocean-graphipfs docker volume rm ocean-graphpgsql docker volume rm ocean-provider1db docker volume rm ocean-provider2db -docker volume rm ocean_ceph_data -docker volume rm ocean_ftp -docker volume rm ocean_www docker network rm ocean_backend -docker volume rm $(docker volume ls -q) diff --git a/compose-files/storage.yml b/compose-files/storage.yml index 3d9ac43..597578f 100644 --- a/compose-files/storage.yml +++ b/compose-files/storage.yml @@ -20,11 +20,3 @@ services: volumes: - ${OCEAN_WWW_FOLDER}:/var/www/html - ${OCEAN_FTP_FOLDER}:/srv/ftp - - - -volumes: - www: - ftp: - ceph_data: -