From 583ec495b1d2a2eb6488ce6f9a85717be2e1a38c Mon Sep 17 00:00:00 2001 From: Yax <1949284+kianby@users.noreply.github.com> Date: Sun, 8 Dec 2024 19:09:45 +0100 Subject: [PATCH] Customize to setup a VM --- .env.default | 46 +-- 01-blog/docker-compose.blog.yml | 17 ++ {selfoss => 02-selfoss}/cacert-2021-10-26.pem | 0 02-selfoss/docker-compose.selfoss.yml | 14 + {selfoss => 02-selfoss}/php7.ini | 0 03-shaarli/docker-compose.shaarli.yml | 13 + 04-gitea/docker-compose.gitea.yml | 17 ++ 05-wallabag/docker-compose.wallabag.yml | 17 ++ 06-heimdall/docker-compose.heimdall.yml | 13 + __doc__/nwdiag.diag | 114 -------- __doc__/nwdiag.png | Bin 80178 -> 0 bytes __doc__/poetry.lock | 272 ------------------ __doc__/pyproject.toml | 16 -- baikal/docker-compose.baikal.yml | 28 -- blog/docker-compose.blog.yml | 36 --- deluge/docker-compose.deluge.yml | 55 ---- dokuwiki/docker-compose.dokuwiki.yml | 26 -- glances/docker-compose.glances.yml | 29 -- netdata/docker-compose.netdata.yml | 57 ---- photo/docker-compose.lychee.yml | 35 --- photo/docker-compose.photonix.yml | 71 ----- photo/docker-compose.photoview.yml | 77 ----- photo/docker-compose.pigallery.yml | 45 --- portainer/docker-compose.portainer.yml | 33 --- posteio/docker-compose.posteio.yml | 32 --- run-docker-compose.sh | 27 ++ seafile/docker-compose.seafile.yml | 68 ----- seafile/start.py | 88 ------ selfoss/docker-compose.selfoss.yml | 31 -- shaarli/docker-compose.shaarli.yml | 27 -- source/docker-compose.gitea.yml | 32 --- traefik/acme.json | 0 traefik/docker-compose.traefik-infomaniak.yml | 67 ----- traefik/docker-compose.traefik-local.yml | 55 ---- traefik/tls.yml | 9 - traefik/traefik.yml | 37 --- wallabag/docker-compose.wallabag.yml | 30 -- www/docker-compose.dashy.yml | 40 --- www/docker-compose.heimdall.yml | 27 -- www/docker-compose.www.yml | 21 -- 40 files changed, 122 insertions(+), 1500 deletions(-) create mode 100755 01-blog/docker-compose.blog.yml rename {selfoss => 02-selfoss}/cacert-2021-10-26.pem (100%) create mode 100755 02-selfoss/docker-compose.selfoss.yml rename {selfoss => 02-selfoss}/php7.ini (100%) create mode 100755 03-shaarli/docker-compose.shaarli.yml create mode 100644 04-gitea/docker-compose.gitea.yml create mode 100755 05-wallabag/docker-compose.wallabag.yml create mode 100755 06-heimdall/docker-compose.heimdall.yml delete mode 100644 __doc__/nwdiag.diag delete mode 100644 __doc__/nwdiag.png delete mode 100644 __doc__/poetry.lock delete mode 100644 __doc__/pyproject.toml delete mode 100755 baikal/docker-compose.baikal.yml delete mode 100755 blog/docker-compose.blog.yml delete mode 100755 deluge/docker-compose.deluge.yml delete mode 100755 dokuwiki/docker-compose.dokuwiki.yml delete mode 100755 glances/docker-compose.glances.yml delete mode 100755 netdata/docker-compose.netdata.yml delete mode 100755 photo/docker-compose.lychee.yml delete mode 100755 photo/docker-compose.photonix.yml delete mode 100755 photo/docker-compose.photoview.yml delete mode 100755 photo/docker-compose.pigallery.yml delete mode 100755 portainer/docker-compose.portainer.yml delete mode 100755 posteio/docker-compose.posteio.yml create mode 100755 run-docker-compose.sh delete mode 100755 seafile/docker-compose.seafile.yml delete mode 100755 seafile/start.py delete mode 100755 selfoss/docker-compose.selfoss.yml delete mode 100755 shaarli/docker-compose.shaarli.yml delete mode 100644 source/docker-compose.gitea.yml delete mode 100644 traefik/acme.json delete mode 100755 traefik/docker-compose.traefik-infomaniak.yml delete mode 100755 traefik/docker-compose.traefik-local.yml delete mode 100644 traefik/tls.yml delete mode 100644 traefik/traefik.yml delete mode 100755 wallabag/docker-compose.wallabag.yml delete mode 100755 www/docker-compose.dashy.yml delete mode 100755 www/docker-compose.heimdall.yml delete mode 100755 www/docker-compose.www.yml diff --git a/.env.default b/.env.default index 92870a5..36a0958 100644 --- a/.env.default +++ b/.env.default @@ -1,46 +1,8 @@ -# ssl -LETSENCRYPT_EMAIL=root@localhost.localdomain -LETSENCRYPT_DNSPROVIDER_TOKEN= - -# off sites -HOST_BAIKAL= -HOST_MAIL= -HOST_NETDATA= - -# sites -DOMAIN=traefik.me -HOST_BLOG=blog -HOST_DOKUWIKI=dokuwiki -HOST_PIGALLERY=pigallery -HOST_PHOTOVIEW=photoview -HOST_PHOTONIX=photonix -HOST_LYCHEE=lychee -HOST_SEAFILE=seafile -HOST_SELFOSS=selfoss -HOST_SHAARLI=shaarli -HOST_GITEA=gitea -HOST_WALLABAG=wallabag -HOST_WWW=www -FQDN_DASHBOARD=dashboard.traefik.me -PATH_PORTAINER=/portainer -PATH_GLANCES=/glances -PATH_DELUGE=/deluge - -# other -TZ=Europe/Paris -BASIC_AUTH=test:$$apr1$$H6uskkkW$$IgXLP6ewTrSuBkTrqE8wj/ +# general ROOT_INSTALL=/srv +TZ=Europe/Paris PUID=1000 PGID=1000 -# torrent -DELUGE_TORRENT_PORT=6881 -DOWNLOAD_HTTP_PORT=8000 - -# seafile -SEAFILE_ADMIN_EMAIL=root@localdomain -SEAFILE_ADMIN_PASSWORD=abc123456 -SEAFILE_DB_ROOT_PASSWORD=rootpassword - -# mapbox.com -MAPBOX_TOKEN= +# apps +WALLABAG_URL=http://localhost \ No newline at end of file diff --git a/01-blog/docker-compose.blog.yml b/01-blog/docker-compose.blog.yml new file mode 100755 index 0000000..6496902 --- /dev/null +++ b/01-blog/docker-compose.blog.yml @@ -0,0 +1,17 @@ +services: + stacosys: + container_name: stacosys + image: kianby/stacosys + volumes: + - ${ROOT_INSTALL}/data/stacosys:/config + restart: unless-stopped + ports: + - "8010:8100" + blog: + container_name: blog + image: kianby/blogduyax + depends_on: + - stacosys + restart: unless-stopped + ports: + - "8011:80" diff --git a/selfoss/cacert-2021-10-26.pem b/02-selfoss/cacert-2021-10-26.pem similarity index 100% rename from selfoss/cacert-2021-10-26.pem rename to 02-selfoss/cacert-2021-10-26.pem diff --git a/02-selfoss/docker-compose.selfoss.yml b/02-selfoss/docker-compose.selfoss.yml new file mode 100755 index 0000000..3fc6b98 --- /dev/null +++ b/02-selfoss/docker-compose.selfoss.yml @@ -0,0 +1,14 @@ +services: + selfoss: + container_name: selfoss + image: hardware/selfoss + volumes: + - selfoss_data:/selfoss/data + - ${ROOT_INSTALL}/selfhosting/02-selfoss/cacert-2021-10-26.pem:/etc/ssl/cacerts + - ${ROOT_INSTALL}/selfhosting/02-selfoss/php7.ini:/etc/php7/php.ini + restart: unless-stopped + ports: + - "8012:80" + +volumes: + selfoss_data: diff --git a/selfoss/php7.ini b/02-selfoss/php7.ini similarity index 100% rename from selfoss/php7.ini rename to 02-selfoss/php7.ini diff --git a/03-shaarli/docker-compose.shaarli.yml b/03-shaarli/docker-compose.shaarli.yml new file mode 100755 index 0000000..8f7d75b --- /dev/null +++ b/03-shaarli/docker-compose.shaarli.yml @@ -0,0 +1,13 @@ +services: + shaarli: + container_name: shaarli + image: shaarli/shaarli + volumes: + - shaarli-cache:/var/www/shaarli/cache + - ${ROOT_INSTALL}/data/shaarli:/var/www/shaarli/data + restart: unless-stopped + ports: + - "8013:80" + +volumes: + shaarli-cache: diff --git a/04-gitea/docker-compose.gitea.yml b/04-gitea/docker-compose.gitea.yml new file mode 100644 index 0000000..06601db --- /dev/null +++ b/04-gitea/docker-compose.gitea.yml @@ -0,0 +1,17 @@ +services: + gitea: + container_name: gitea + image: gitea/gitea:1.17.2-rootless + restart: unless-stopped + volumes: + - gitea_data:/var/lib/gitea + - gitea_config:/etc/gitea + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + ports: + - "8014:3000" + +volumes: + gitea_data: + gitea_config: + diff --git a/05-wallabag/docker-compose.wallabag.yml b/05-wallabag/docker-compose.wallabag.yml new file mode 100755 index 0000000..f496311 --- /dev/null +++ b/05-wallabag/docker-compose.wallabag.yml @@ -0,0 +1,17 @@ +services: + wallabag: + container_name: wallabag + image: wallabag/wallabag + ports: + - "8015:80" + volumes: + - wallabag_data:/var/www/wallabag/data:rw + - wallabag_images:/var/www/wallabag/web/assets/images:rw + environment: + - SYMFONY__ENV__DOMAIN_NAME="${WALLABAG_URL}" + - SYMFONY__ENV__FOSUSER_REGISTRATION=false + + +volumes: + wallabag_data: + wallabag_images: diff --git a/06-heimdall/docker-compose.heimdall.yml b/06-heimdall/docker-compose.heimdall.yml new file mode 100755 index 0000000..dd12b52 --- /dev/null +++ b/06-heimdall/docker-compose.heimdall.yml @@ -0,0 +1,13 @@ +services: + heimdall: + image: lscr.io/linuxserver/heimdall + container_name: heimdall + environment: + - PUID=${PUID} + - PGID=${PGID} + - TZ=${TZ} + volumes: + - ${ROOT_INSTALL}/data/heimdall:/config + ports: + - "8016:80" + restart: unless-stopped diff --git a/__doc__/nwdiag.diag b/__doc__/nwdiag.diag deleted file mode 100644 index 5354d3a..0000000 --- a/__doc__/nwdiag.diag +++ /dev/null @@ -1,114 +0,0 @@ -nwdiag { - inet [shape = cloud]; - inet -- router; - - network dmz { - address = "10.254.x.x/24" - router; - traefik [address = "10.254.x.254"]; - nginx-streaming [address = "10.254.x.1"]; - } - - network baikal-frontend { - address = "10.10.10.0/24" - traefik [address = "10.10.10.254"]; - baikal [address = "10.10.10.1"]; - } - - network blog-frontend { - address = "10.10.11.0/24" - traefik [address = "10.10.11.254"]; - blog [address = "10.10.11.1"]; - } - - network blog-backend { - address = "10.20.11.0/24" - blog [address = "10.20.11.1"]; - stacosys [address = "10.20.11.2"]; - } - - network deluge-frontend { - address = "10.10.12.0/24" - traefik [address = "10.10.12.254"]; - deluge [address = "10.10.12.1"]; - } - - network dokuwiki-frontend { - address = "10.10.13.0/24" - traefik [address = "10.10.13.254"]; - dokuwiki [address = "10.10.13.1"]; - } - - network glances-frontend { - address = "10.10.14.0/24" - traefik [address = "10.10.14.254"]; - glances [address = "10.10.14.1"]; - } - - network netdata-frontend { - address = "10.10.15.0/24" - traefik [address = "10.10.15.254"]; - netdata [address = "10.10.15.1"]; - } - - network netdata-backend { - address = "10.20.15.0/24" - netdata [address = "10.20.15.1"]; - docker-proxy [address = "10.20.15.2"]; - } - - network photo-frontend { - address = "10.10.16.0/24" - traefik [address = "10.10.16.254"]; - pigallery2 [address = "10.10.16.1"]; - } - - network portainer-frontend { - address = "10.10.17.0/24" - traefik [address = "10.10.17.254"]; - portainer [address = "10.10.17.1"]; - } - - network posteio-frontend { - address = "10.10.18.0/24" - traefik [address = "10.10.18.254"]; - posteio [address = "10.10.18.1"]; - } - - network seafile-frontend { - address = "10.10.19.0/24" - traefik [address = "10.10.19.254"]; - seafile [address = "10.10.19.1"]; - } - - network seafile-backend { - address = "10.20.19.0/24" - seafile [address = "10.20.19.1"]; - seafile-db [address = "10.20.19.2"]; - seafile-memcached [address = "10.20.19.3"]; - } - - network selfoss-frontend { - address = "10.10.20.0/24" - traefik [address = "10.10.20.254"]; - selfoss [address = "10.10.20.1"]; - } - - network shaarli-frontend { - address = "10.10.21.0/24" - traefik [address = "10.10.21.254"]; - shaarli [address = "10.10.21.1"]; - } - - network wallabag-frontend { - address = "10.10.22.0/24" - traefik [address = "10.10.22.254"]; - wallabag [address = "10.10.22.1"]; - } - - network www-frontend { - address = "10.10.23.0/24" - traefik [address = "10.10.23.254"]; - www [address = "10.10.23.1"]; - } -} diff --git a/__doc__/nwdiag.png b/__doc__/nwdiag.png deleted file mode 100644 index 0dad237bb00d60e6fa82d7b33e947f4270ca5c8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80178 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

CB71i_8UMHoSbW8sV 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 D$5FNC diff --git a/__doc__/poetry.lock b/__doc__/poetry.lock deleted file mode 100644 index ea4a2f6..0000000 --- a/__doc__/poetry.lock +++ /dev/null @@ -1,272 +0,0 @@ -[[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "attrs" -version = "21.2.0" -description = "Classes Without Boilerplate" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] - -[[package]] -name = "blockdiag" -version = "3.0.0" -description = "blockdiag generates block-diagram image from text" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -funcparserlib = ">=1.0.0a0" -Pillow = ">3.0" -webcolors = "*" - -[package.extras] -pdf = ["reportlab"] -rst = ["docutils"] -testing = ["nose", "flake8", "flake8-coding", "flake8-copyright", "flake8-isort", "reportlab", "docutils"] - -[[package]] -name = "colorama" -version = "0.4.4" -description = "Cross-platform colored terminal text." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "funcparserlib" -version = "1.0.0a0" -description = "Recursive descent parsing library based on functional combinators" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[[package]] -name = "more-itertools" -version = "8.12.0" -description = "More routines for operating on iterables, beyond itertools" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "nwdiag" -version = "3.0.0" -description = "nwdiag generates network-diagram image from text" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -blockdiag = ">=3.0.0" - -[package.extras] -pdf = ["reportlab"] -rst = ["docutils"] -testing = ["nose", "pep8 (>=1.3)", "flake8", "flake8-coding", "flake8-copyright", "flake8-isort", "reportlab", "docutils"] - -[[package]] -name = "packaging" -version = "21.3" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" - -[[package]] -name = "pillow" -version = "8.4.0" -description = "Python Imaging Library (Fork)" -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "pluggy" -version = "0.13.1" -description = "plugin and hook calling mechanisms for python" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -dev = ["pre-commit", "tox"] - -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pyparsing" -version = "3.0.6" -description = "Python parsing module" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "pytest" -version = "5.4.3" -description = "pytest: simple powerful testing with Python" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=17.4.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -more-itertools = ">=4.0.0" -packaging = "*" -pluggy = ">=0.12,<1.0" -py = ">=1.5.0" -wcwidth = "*" - -[package.extras] -checkqa-mypy = ["mypy (==v0.761)"] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - -[[package]] -name = "wcwidth" -version = "0.2.5" -description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "webcolors" -version = "1.11.1" -description = "A library for working with color names and color values formats defined by HTML and CSS." -category = "main" -optional = false -python-versions = ">=3.5," - -[metadata] -lock-version = "1.1" -python-versions = "^3.9" -content-hash = "fe015acce0fbf3644be4807b9c0484d95c2bbb57fc1b09e08e3634ee78491990" - -[metadata.files] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, - {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, -] -blockdiag = [ - {file = "blockdiag-3.0.0-py3-none-any.whl", hash = "sha256:4031bfae6a7f36071d733dec639987346e10f7871356ee2c7a221961c64961d8"}, - {file = "blockdiag-3.0.0.tar.gz", hash = "sha256:dee4195bb87d23654546ba2bf5091480dbf253b409891fce2cd527c91d00a3e2"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -funcparserlib = [ - {file = "funcparserlib-1.0.0a0-py2.py3-none-any.whl", hash = "sha256:a5ca025aaec28ae19956556260f5e0f28b0d851863e7982a0daf238161e33752"}, - {file = "funcparserlib-1.0.0a0.tar.gz", hash = "sha256:e6fb432a9276078eee71813a59089fd8c4f3e81f183b4ce8b8b4734d0b2faa2a"}, -] -more-itertools = [ - {file = "more-itertools-8.12.0.tar.gz", hash = "sha256:7dc6ad46f05f545f900dd59e8dfb4e84a4827b97b3cfecb175ea0c7d247f6064"}, - {file = "more_itertools-8.12.0-py3-none-any.whl", hash = "sha256:43e6dd9942dffd72661a2c4ef383ad7da1e6a3e968a927ad7a6083ab410a688b"}, -] -nwdiag = [ - {file = "nwdiag-3.0.0-py3-none-any.whl", hash = "sha256:549cab5400ca33b8c05ea119414fa41e6bd85be222ba524418c2c176eea87e80"}, - {file = "nwdiag-3.0.0.tar.gz", hash = "sha256:e267530fcaac8a1d9e7403048597ed30e031e17f0191569dc6f704087bacb2eb"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pillow = [ - {file = "Pillow-8.4.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:81f8d5c81e483a9442d72d182e1fb6dcb9723f289a57e8030811bac9ea3fef8d"}, - {file = "Pillow-8.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f97cfb1e5a392d75dd8b9fd274d205404729923840ca94ca45a0af57e13dbe6"}, - {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb9fc393f3c61f9054e1ed26e6fe912c7321af2f41ff49d3f83d05bacf22cc78"}, - {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d82cdb63100ef5eedb8391732375e6d05993b765f72cb34311fab92103314649"}, - {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62cc1afda735a8d109007164714e73771b499768b9bb5afcbbee9d0ff374b43f"}, - {file = "Pillow-8.4.0-cp310-cp310-win32.whl", hash = "sha256:e3dacecfbeec9a33e932f00c6cd7996e62f53ad46fbe677577394aaa90ee419a"}, - {file = "Pillow-8.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:620582db2a85b2df5f8a82ddeb52116560d7e5e6b055095f04ad828d1b0baa39"}, - {file = "Pillow-8.4.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:1bc723b434fbc4ab50bb68e11e93ce5fb69866ad621e3c2c9bdb0cd70e345f55"}, - {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72cbcfd54df6caf85cc35264c77ede902452d6df41166010262374155947460c"}, - {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70ad9e5c6cb9b8487280a02c0ad8a51581dcbbe8484ce058477692a27c151c0a"}, - {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25a49dc2e2f74e65efaa32b153527fc5ac98508d502fa46e74fa4fd678ed6645"}, - {file = "Pillow-8.4.0-cp36-cp36m-win32.whl", hash = "sha256:93ce9e955cc95959df98505e4608ad98281fff037350d8c2671c9aa86bcf10a9"}, - {file = "Pillow-8.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2e4440b8f00f504ee4b53fe30f4e381aae30b0568193be305256b1462216feff"}, - {file = "Pillow-8.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8c803ac3c28bbc53763e6825746f05cc407b20e4a69d0122e526a582e3b5e153"}, - {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8a17b5d948f4ceeceb66384727dde11b240736fddeda54ca740b9b8b1556b29"}, - {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1394a6ad5abc838c5cd8a92c5a07535648cdf6d09e8e2d6df916dfa9ea86ead8"}, - {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:792e5c12376594bfcb986ebf3855aa4b7c225754e9a9521298e460e92fb4a488"}, - {file = "Pillow-8.4.0-cp37-cp37m-win32.whl", hash = "sha256:d99ec152570e4196772e7a8e4ba5320d2d27bf22fdf11743dd882936ed64305b"}, - {file = "Pillow-8.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7b7017b61bbcdd7f6363aeceb881e23c46583739cb69a3ab39cb384f6ec82e5b"}, - {file = "Pillow-8.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:d89363f02658e253dbd171f7c3716a5d340a24ee82d38aab9183f7fdf0cdca49"}, - {file = "Pillow-8.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a0956fdc5defc34462bb1c765ee88d933239f9a94bc37d132004775241a7585"}, - {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b7bb9de00197fb4261825c15551adf7605cf14a80badf1761d61e59da347779"}, - {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72b9e656e340447f827885b8d7a15fc8c4e68d410dc2297ef6787eec0f0ea409"}, - {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5a4532a12314149d8b4e4ad8ff09dde7427731fcfa5917ff16d0291f13609df"}, - {file = "Pillow-8.4.0-cp38-cp38-win32.whl", hash = "sha256:82aafa8d5eb68c8463b6e9baeb4f19043bb31fefc03eb7b216b51e6a9981ae09"}, - {file = "Pillow-8.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:066f3999cb3b070a95c3652712cffa1a748cd02d60ad7b4e485c3748a04d9d76"}, - {file = "Pillow-8.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:5503c86916d27c2e101b7f71c2ae2cddba01a2cf55b8395b0255fd33fa4d1f1a"}, - {file = "Pillow-8.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4acc0985ddf39d1bc969a9220b51d94ed51695d455c228d8ac29fcdb25810e6e"}, - {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b052a619a8bfcf26bd8b3f48f45283f9e977890263e4571f2393ed8898d331b"}, - {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:493cb4e415f44cd601fcec11c99836f707bb714ab03f5ed46ac25713baf0ff20"}, - {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8831cb7332eda5dc89b21a7bce7ef6ad305548820595033a4b03cf3091235ed"}, - {file = "Pillow-8.4.0-cp39-cp39-win32.whl", hash = "sha256:5e9ac5f66616b87d4da618a20ab0a38324dbe88d8a39b55be8964eb520021e02"}, - {file = "Pillow-8.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:3eb1ce5f65908556c2d8685a8f0a6e989d887ec4057326f6c22b24e8a172c66b"}, - {file = "Pillow-8.4.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ddc4d832a0f0b4c52fff973a0d44b6c99839a9d016fe4e6a1cb8f3eea96479c2"}, - {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3e5ddc44c14042f0844b8cf7d2cd455f6cc80fd7f5eefbe657292cf601d9ad"}, - {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70e94281588ef053ae8998039610dbd71bc509e4acbc77ab59d7d2937b10698"}, - {file = "Pillow-8.4.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:3862b7256046fcd950618ed22d1d60b842e3a40a48236a5498746f21189afbbc"}, - {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4901622493f88b1a29bd30ec1a2f683782e57c3c16a2dbc7f2595ba01f639df"}, - {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c471a734240653a0ec91dec0996696eea227eafe72a33bd06c92697728046b"}, - {file = "Pillow-8.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:244cf3b97802c34c41905d22810846802a3329ddcb93ccc432870243211c79fc"}, - {file = "Pillow-8.4.0.tar.gz", hash = "sha256:b8e2f83c56e141920c39464b852de3719dfbfb6e3c99a2d8da0edf4fb33176ed"}, -] -pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pyparsing = [ - {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, - {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, -] -pytest = [ - {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"}, - {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, -] -wcwidth = [ - {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, - {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, -] -webcolors = [ - {file = "webcolors-1.11.1-py3-none-any.whl", hash = "sha256:b8cd5d865a25c51ff1218f0c90d0c0781fc64312a49b746b320cf50de1648f6e"}, - {file = "webcolors-1.11.1.tar.gz", hash = "sha256:76f360636957d1c976db7466bc71dcb713bb95ac8911944dffc55c01cb516de6"}, -] diff --git a/__doc__/pyproject.toml b/__doc__/pyproject.toml deleted file mode 100644 index 8ee1988..0000000 --- a/__doc__/pyproject.toml +++ /dev/null @@ -1,16 +0,0 @@ -[tool.poetry] -name = "doc" -version = "0.1.0" -description = "" -authors = ["Yax"] - -[tool.poetry.dependencies] -python = "^3.9" -nwdiag = "^3.0.0" - -[tool.poetry.dev-dependencies] -pytest = "^5.2" - -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" diff --git a/baikal/docker-compose.baikal.yml b/baikal/docker-compose.baikal.yml deleted file mode 100755 index d80e228..0000000 --- a/baikal/docker-compose.baikal.yml +++ /dev/null @@ -1,28 +0,0 @@ -version: '3.8' - -services: - baikal: - container_name: baikal - image: ckulka/baikal:nginx - networks: - - baikal-frontend - expose: - - 80 - restart: unless-stopped - volumes: - - baikal_data:/var/www/baikal/Specific:rw - - baikal_config:/var/www/baikal/config:rw - labels: - - traefik.enable=true - - traefik.http.routers.baikal.rule=Host(`${HOST_BAIKAL}.${DOMAIN}`) - - traefik.http.routers.baikal.entrypoints=https - - traefik.http.routers.baikal.tls=true - - traefik.docker.network=baikal-frontend - -networks: - baikal-frontend: - name: baikal-frontend - -volumes: - baikal_config: - baikal_data: diff --git a/blog/docker-compose.blog.yml b/blog/docker-compose.blog.yml deleted file mode 100755 index c3b6704..0000000 --- a/blog/docker-compose.blog.yml +++ /dev/null @@ -1,36 +0,0 @@ -version: '3.8' - -services: - stacosys: - container_name: stacosys - image: kianby/stacosys - volumes: - - ${ROOT_INSTALL}/data/stacosys:/config - networks: - - blog-backend - restart: unless-stopped - expose: - - 8100 - blog: - container_name: blog - image: kianby/blogduyax - depends_on: - - stacosys - networks: - - blog-backend - - blog-frontend - restart: unless-stopped - expose: - - 80 - labels: - - traefik.enable=true - - traefik.http.routers.blog.rule=Host(`${HOST_BLOG}.${DOMAIN}`) - - traefik.http.routers.blog.entrypoints=https - - traefik.http.routers.blog.tls=true - - traefik.docker.network=blog-frontend - -networks: - blog-frontend: - name: blog-frontend - blog-backend: - name: blog-backend \ No newline at end of file diff --git a/deluge/docker-compose.deluge.yml b/deluge/docker-compose.deluge.yml deleted file mode 100755 index 686350e..0000000 --- a/deluge/docker-compose.deluge.yml +++ /dev/null @@ -1,55 +0,0 @@ -version: '3.8' - -services: - deluge: - container_name: deluge - image: linuxserver/deluge - restart: unless-stopped - networks: - - deluge-frontend - environment: - DELUGE_LOGLEVEL: info - TZ: ${TZ} - expose: - - 8112 - ports: - - ${DELUGE_TORRENT_PORT}:${DELUGE_TORRENT_PORT}/tcp - - ${DELUGE_TORRENT_PORT}:${DELUGE_TORRENT_PORT}/udp - volumes: - - deluge_config:/config:rw - - deluge_downloads:/downloads:rw - labels: - - traefik.enable=true - - traefik.http.routers.deluge.rule=Host(`${HOST_WWW}.${DOMAIN}`) && PathPrefix(`${PATH_DELUGE}`) - - traefik.http.routers.deluge.entrypoints=https - - traefik.http.routers.deluge.tls=true - - traefik.http.services.deluge.loadbalancer.server.port=8112 - - traefik.http.routers.deluge.middlewares=delugeHeader,sameOriginHeader,delugeRedir,delugePStrip - - traefik.http.middlewares.delugeHeader.headers.customrequestheaders.X-Deluge-Base=${PATH_DELUGE}/ - - traefik.http.middlewares.sameOriginHeader.headers.customrequestheaders.X-Frame-Options=SAMEORIGIN - - traefik.http.middlewares.delugePStrip.stripprefix.prefixes=${PATH_DELUGE} - - traefik.http.middlewares.delugeRedir.redirectregex.regex=^(.*)${PATH_DELUGE}$$ - - traefik.http.middlewares.delugeRedir.redirectregex.replacement=$${1}${PATH_DELUGE}/ - - traefik.docker.network=deluge-frontend - - torrent: - container_name: torrent - image: kianby/nginx-streaming - restart: unless-stopped - networks: - - dmz - volumes: - - deluge_downloads:/downloads:ro - expose: - - 80 - # shortcut to bypass traefik limitation - ports: - - ${DOWNLOAD_HTTP_PORT}:80 - -networks: - deluge-frontend: - name: deluge-frontend - -volumes: - deluge_config: - deluge_downloads: diff --git a/dokuwiki/docker-compose.dokuwiki.yml b/dokuwiki/docker-compose.dokuwiki.yml deleted file mode 100755 index 20a4deb..0000000 --- a/dokuwiki/docker-compose.dokuwiki.yml +++ /dev/null @@ -1,26 +0,0 @@ -version: '3.8' - -services: - dokuwiki: - image: linuxserver/dokuwiki - container_name: dokuwiki - restart: unless-stopped - expose: - - 80 - environment: - - TZ=${TZ} - - APP_URL=/ #optional - volumes: - - ${ROOT_INSTALL}/data/dokuwiki:/config - networks: - - dokuwiki-frontend - labels: - - traefik.enable=true - - traefik.http.routers.dokuwiki.rule=Host(`${HOST_DOKUWIKI}.${DOMAIN}`) - - traefik.http.routers.dokuwiki.entrypoints=https - - traefik.http.routers.dokuwiki.tls=true - - traefik.docker.network=dokuwiki-frontend - -networks: - dokuwiki-frontend: - name: dokuwiki-frontend \ No newline at end of file diff --git a/glances/docker-compose.glances.yml b/glances/docker-compose.glances.yml deleted file mode 100755 index 1ba699e..0000000 --- a/glances/docker-compose.glances.yml +++ /dev/null @@ -1,29 +0,0 @@ -version: '3.8' - -services: - glances: - container_name: glances - image: nicolargo/glances:3.2.3.1 - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - environment: - - GLANCES_OPT=-w - pid: host - networks: - - glances-frontend - expose: - - 61208 - labels: - - traefik.enable=true - - traefik.http.routers.glances.rule=Host(`${HOST_WWW}.${DOMAIN}`) && PathPrefix(`${PATH_GLANCES}`) - - traefik.http.routers.glances.entrypoints=https - - traefik.http.routers.glances.tls=true - - traefik.http.routers.glances.middlewares=glancesRedir,glancesPStrip - - traefik.http.middlewares.glancesPStrip.stripprefix.prefixes=${PATH_GLANCES} - - traefik.http.middlewares.glancesRedir.redirectregex.regex=^(.*)${PATH_GLANCES}$$ - - traefik.http.middlewares.glancesRedir.redirectregex.replacement=$${1}${PATH_GLANCES}/ - - traefik.docker.network=glances-frontend - -networks: - glances-frontend: - name: glances-frontend \ No newline at end of file diff --git a/netdata/docker-compose.netdata.yml b/netdata/docker-compose.netdata.yml deleted file mode 100755 index 8e7efc6..0000000 --- a/netdata/docker-compose.netdata.yml +++ /dev/null @@ -1,57 +0,0 @@ -version: '3.8' -services: - netdata: - image: netdata/netdata - container_name: netdata - hostname: ${HOST_NETDATA}.${DOMAIN} - expose: - - 19999 - restart: unless-stopped - cap_add: - - SYS_PTRACE - security_opt: - - apparmor:unconfined - environment: - - DOCKER_HOST=docker-proxy:2375 - volumes: - - netdataconfig:/etc/netdata - - netdatalib:/var/lib/netdata - - netdatacache:/var/cache/netdata - - /etc/passwd:/host/etc/passwd:ro - - /etc/group:/host/etc/group:ro - - /proc:/host/proc:ro - - /sys:/host/sys:ro - - /etc/os-release:/host/etc/os-release:ro - networks: - - netdata-frontend - - netdata-backend - labels: - - traefik.enable=true - - traefik.http.routers.netdata.rule=Host(`${HOST_NETDATA}.${DOMAIN}`) - - traefik.http.routers.netdata.entrypoints=https - - traefik.http.routers.netdata.tls=true - - traefik.http.routers.netdata.middlewares=auth - - traefik.http.middlewares.auth.basicauth.users=${BASIC_AUTH} - - traefik.docker.network=netdata-frontend - healthcheck: - disable: true - docker-proxy: - image: tecnativa/docker-socket-proxy - container_name: docker-proxy - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - environment: - - CONTAINERS=1 - networks: - - netdata-backend - -networks: - netdata-frontend: - name: netdata-frontend - netdata-backend: - name: netdata-backend - -volumes: - netdataconfig: - netdatalib: - netdatacache: \ No newline at end of file diff --git a/photo/docker-compose.lychee.yml b/photo/docker-compose.lychee.yml deleted file mode 100755 index b7939d2..0000000 --- a/photo/docker-compose.lychee.yml +++ /dev/null @@ -1,35 +0,0 @@ -version: '3.8' - -services: - lychee: - container_name: lychee - environment: - - PHP_TZ=${TZ} - - TIMEZONE=${TZ} - image: lycheeorg/lychee - networks: - - photo-frontend - expose: - - 80 - restart: unless-stopped - volumes: - - lychee_conf:/conf - - lychee_uploads:/uploads - - lychee_sym:/sym - labels: - - traefik.enable=true - - traefik.http.routers.photo.rule=Host(`${HOST_LYCHEE}.${DOMAIN}`) - - traefik.http.routers.photo.entrypoints=https - - traefik.http.routers.photo.tls=true - - traefik.docker.network=photo-frontend - -networks: - photo-frontend: - name: photo-frontend - photo-backend: - name: photo-backend - -volumes: - lychee_conf: - lychee_uploads: - lychee_sym: diff --git a/photo/docker-compose.photonix.yml b/photo/docker-compose.photonix.yml deleted file mode 100755 index 31e01ea..0000000 --- a/photo/docker-compose.photonix.yml +++ /dev/null @@ -1,71 +0,0 @@ -version: '3.8' - -services: - postgres: - container_name: photonix-postgres - image: postgres:11.1-alpine - environment: - POSTGRES_DB: photonix - POSTGRES_PASSWORD: password - volumes: - - photonix_db:/var/lib/postgresql/data - networks: - - photo-backend - - redis: - container_name: photonix-redis - image: redis:6.2.2 - networks: - - photo-backend - - photonix: - container_name: photonix - image: photonixapp/photonix:latest - expose: - - 80 - environment: - ENV: prd - POSTGRES_HOST: postgres - POSTGRES_DB: photonix - POSTGRES_USER: postgres - POSTGRES_PASSWORD: password - REDIS_HOST: redis - ALLOWED_HOSTS: '*' - # More configuration options here: https://photonix.org/docs/configuration/ - volumes: -# - ./data/photos:/data/photos - - photonix_raw_photos:/data/raw-photos-processed - - photonix_cache:/data/cache - - photonix_models:/data/models - - type: bind - source: ${ROOT_INSTALL}/data/seafile-fuse - target: /seahub - bind: - propagation: rslave - privileged: true - cap_add: - - SYS_ADMIN - depends_on: - - postgres - - redis - networks: - - photo-backend - - photo-frontend - labels: - - traefik.enable=true - - traefik.http.routers.photo.rule=Host(`${HOST_PHOTONIX}.${DOMAIN}`) - - traefik.http.routers.photo.entrypoints=https - - traefik.http.routers.photo.tls=true - - traefik.docker.network=photo-frontend - -networks: - photo-frontend: - name: photo-frontend - photo-backend: - name: photo-backend - -volumes: - photonix_raw_photos: - photonix_cache: - photonix_models: - photonix_db: \ No newline at end of file diff --git a/photo/docker-compose.photoview.yml b/photo/docker-compose.photoview.yml deleted file mode 100755 index 23011d6..0000000 --- a/photo/docker-compose.photoview.yml +++ /dev/null @@ -1,77 +0,0 @@ -version: '3.8' - -services: - photoview-db: - container_name: photoview-db - image: mariadb:10.5 - restart: unless-stopped - environment: - - MYSQL_DATABASE=photoview - - MYSQL_USER=photoview - - MYSQL_PASSWORD=photosecret - - MYSQL_RANDOM_ROOT_PASSWORD=1 - volumes: - - photoview_db_data:/var/lib/mysql - networks: - - photo-backend - - photoview: - container_name: photoview - image: viktorstrate/photoview:2 - restart: unless-stopped - expose: - - 80 - depends_on: - - photoview-db - networks: - - photo-backend - - photo-frontend - environment: - - PHOTOVIEW_DATABASE_DRIVER=mysql - - PHOTOVIEW_MYSQL_URL=photoview:photosecret@tcp(photoview-db)/photoview - - PHOTOVIEW_LISTEN_IP=photoview - - PHOTOVIEW_LISTEN_PORT=80 - - PHOTOVIEW_MEDIA_CACHE=/app/cache - - # Optional: If you are using Samba/CIFS-Share and experience problems with "directory not found" - # Enable the following Godebug - # - GODEBUG=asyncpreemptoff=1 - - - # Optional: To enable map related features, you need to create a mapbox token. - # A token can be generated for free here https://account.mapbox.com/access-tokens/ - # It's a good idea to limit the scope of the token to your own domain, to prevent others from using it. - - MAPBOX_TOKEN=${MAPBOX_TOKEN} - - volumes: - - photoview_api_cache:/app/cache - - # Change This: to the directory where your photos are located on your server. - # If the photos are located at `/home/user/photos`, then change this value - # to the following: `/home/user/photos:/photos:ro`. - # You can mount multiple paths, if your photos are spread across multiple directories. - #- ./photos_path:/photos:ro - - type: bind - source: ${ROOT_INSTALL}/data/seafile-fuse - target: /photos - bind: - propagation: rslave - privileged: true - cap_add: - - SYS_ADMIN - labels: - - traefik.enable=true - - traefik.http.routers.photo.rule=Host(`${HOST_PHOTOVIEW}.${DOMAIN}`) - - traefik.http.routers.photo.entrypoints=https - - traefik.http.routers.photo.tls=true - - traefik.docker.network=photo-frontend - -networks: - photo-frontend: - name: photo-frontend - photo-backend: - name: photo-backend - -volumes: - photoview_db_data: - photoview_api_cache: \ No newline at end of file diff --git a/photo/docker-compose.pigallery.yml b/photo/docker-compose.pigallery.yml deleted file mode 100755 index d459d66..0000000 --- a/photo/docker-compose.pigallery.yml +++ /dev/null @@ -1,45 +0,0 @@ -version: '3.8' - -services: - pigallery2: - container_name: pigallery2 - environment: - NODE_ENV: production - image: bpatrik/pigallery2:1.9.0-alpine - networks: - - photo-frontend - expose: - - 80 - restart: unless-stopped - volumes: - #/app/data/images - - pigallery_config:/app/data/config:rw - - pigallerydb_data:/app/data/db:rw - - pigallery_tmp:/app/data/tmp:rw - - type: bind - source: ${ROOT_INSTALL}/data/seafile-fuse - target: /seahub - bind: - propagation: rslave - privileged: true - cap_add: - - SYS_ADMIN - healthcheck: - disable: true - labels: - - traefik.enable=true - - traefik.http.routers.photo.rule=Host(`${HOST_PIGALLERY}.${DOMAIN}`) - - traefik.http.routers.photo.entrypoints=https - - traefik.http.routers.photo.tls=true - - traefik.docker.network=photo-frontend - -networks: - photo-frontend: - name: photo-frontend - photo-backend: - name: photo-backend - -volumes: - pigallerydb_data: - pigallery_tmp: - pigallery_config: diff --git a/portainer/docker-compose.portainer.yml b/portainer/docker-compose.portainer.yml deleted file mode 100755 index a8f34b1..0000000 --- a/portainer/docker-compose.portainer.yml +++ /dev/null @@ -1,33 +0,0 @@ -version: '3.8' - -services: - portainer: - container_name: portainer - image: portainer/portainer-ce - command: -H unix:///var/run/docker.sock - volumes: - - /var/run/docker.sock:/var/run/docker.sock - - portainer_data:/data - networks: - - portainer-frontend - restart: unless-stopped - expose: - - 9000 - labels: - - traefik.enable=true - - traefik.http.routers.portainer.rule=Host(`${HOST_WWW}.${DOMAIN}`) && PathPrefix(`${PATH_PORTAINER}`) - - traefik.http.routers.portainer.entrypoints=https - - traefik.http.routers.portainer.tls=true - - traefik.http.services.portainer.loadbalancer.server.port=9000 - - traefik.http.routers.portainer.middlewares=portainerRedir,portainerPStrip - - traefik.http.middlewares.portainerPStrip.stripprefix.prefixes=${PATH_PORTAINER} - - traefik.http.middlewares.portainerRedir.redirectregex.regex=^(.*)${PATH_PORTAINER}$$ - - traefik.http.middlewares.portainerRedir.redirectregex.replacement=$${1}${PATH_PORTAINER}/ - - traefik.docker.network=portainer-frontend - -networks: - portainer-frontend: - name: portainer-frontend - -volumes: - portainer_data: diff --git a/posteio/docker-compose.posteio.yml b/posteio/docker-compose.posteio.yml deleted file mode 100755 index e95aca6..0000000 --- a/posteio/docker-compose.posteio.yml +++ /dev/null @@ -1,32 +0,0 @@ -version: '3.8' - -services: - poste-io: - container_name: poste-io - image: analogic/poste.io - volumes: - - ${ROOT_INSTALL}/data/poste.io:/data - environment: - - TZ=${TZ} - - HTTPS=OFF - restart: unless-stopped - ports: - - "465:465" - - "993:993" - - "25:25" - expose: - - 80 - labels: - - traefik.enable=true - - traefik.http.routers.posteio.rule=Host(`${HOST_MAIL}.${DOMAIN}`) - - traefik.http.routers.posteio.entrypoints=https - - traefik.http.routers.posteio.tls=true - - traefik.docker.network=posteio-frontend - networks: - - posteio-frontend - healthcheck: - disable: true - -networks: - posteio-frontend: - name: portainer-frontend \ No newline at end of file diff --git a/run-docker-compose.sh b/run-docker-compose.sh new file mode 100755 index 0000000..0b9ffcf --- /dev/null +++ b/run-docker-compose.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# examples: +# ./run-docker-compose.sh --env-file ./.env up -d +# ./run-docker-compose.sh --env-file ./.env down + +# Exit on errors +set -e + +# Ensure arguments are provided +if [ $# -eq 0 ]; then + echo "Usage: $0 " + exit 1 +fi + +# Store the user-provided arguments +ARGS="$@" + +# Find all directories containing a file named docker-compose*.yml +find . -type f -name 'docker-compose*.yml' | while IFS= read -r compose_file; do + + # Run the docker compose command with user arguments + echo "Running: docker compose $compose_file" + docker compose -f "$compose_file" $ARGS + +done + diff --git a/seafile/docker-compose.seafile.yml b/seafile/docker-compose.seafile.yml deleted file mode 100755 index 96c7b60..0000000 --- a/seafile/docker-compose.seafile.yml +++ /dev/null @@ -1,68 +0,0 @@ -version: '3.8' - -services: - seafile-db: - container_name: seafile-db - environment: - MYSQL_LOG_CONSOLE: "true" - MYSQL_ROOT_PASSWORD: ${SEAFILE_DB_ROOT_PASSWORD} - image: mariadb:10.1 - networks: - - seafile-backend - volumes: - - seafile_db:/var/lib/mysql:rw - restart: unless-stopped - seafile-memcached: - container_name: seafile-memcached - entrypoint: memcached -m 256 - image: memcached:1.5.6 - networks: - - seafile-backend - restart: unless-stopped - seafile: - container_name: seafile - depends_on: - - seafile-db - - seafile-memcached - environment: - DB_HOST: seafile-db - DB_ROOT_PASSWD: ${SEAFILE_DB_ROOT_PASSWORD} - SEAFILE_ADMIN_EMAIL: ${SEAFILE_ADMIN_EMAIL} - SEAFILE_ADMIN_PASSWORD: ${SEAFILE_ADMIN_PASSWORD} - SEAFILE_SERVER_HOSTNAME: ${HOST_SEAFILE}.${DOMAIN} - SEAFILE_SERVER_LETSENCRYPT: "false" - TIME_ZONE: ${TZ} - image: seafileltd/seafile-mc:latest - networks: - - seafile-backend - - seafile-frontend - restart: unless-stopped - expose: - - 80 - volumes: - - ${ROOT_INSTALL}/selfhosting/seafile/start.py:/scripts/start.py - - seafile_data:/shared:rw - - type: bind - source: ${ROOT_INSTALL}/data/seafile-fuse - target: /seafile-fuse - bind: - propagation: rshared - privileged: true - cap_add: - - SYS_ADMIN - labels: - - traefik.enable=true - - traefik.http.routers.seafile.rule=Host(`${HOST_SEAFILE}.${DOMAIN}`) - - traefik.http.routers.seafile.entrypoints=https - - traefik.http.routers.seafile.tls=true - - traefik.docker.network=seafile-frontend - -networks: - seafile-frontend: - name: seafile-frontend - seafile-backend: - name: seafile-backend - -volumes: - seafile_db: - seafile_data: diff --git a/seafile/start.py b/seafile/start.py deleted file mode 100755 index d3ce47c..0000000 --- a/seafile/start.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python3 -#coding: UTF-8 - -""" -Starts the seafile/seahub server and watches the controller process. It is -the entrypoint command of the docker container. -""" - -import json -import os -from os.path import abspath, basename, exists, dirname, join, isdir -import shutil -import sys -import time - -from utils import ( - call, get_conf, get_install_dir, get_script, get_command_output, - render_template, wait_for_mysql, setup_logging -) -from upgrade import check_upgrade -from bootstrap import init_seafile_server, is_https, init_letsencrypt, generate_local_nginx_conf - - -shared_seafiledir = '/shared/seafile' -ssl_dir = '/shared/ssl' -generated_dir = '/bootstrap/generated' -installdir = get_install_dir() -topdir = dirname(installdir) - -def watch_controller(): - maxretry = 4 - retry = 0 - while retry < maxretry: - controller_pid = get_command_output('ps aux | grep seafile-controller | grep -v grep || true').strip() - garbage_collector_pid = get_command_output('ps aux | grep /scripts/gc.sh | grep -v grep || true').strip() - if not controller_pid and not garbage_collector_pid: - retry += 1 - else: - retry = 0 - time.sleep(5) - print('seafile controller exited unexpectedly.') - sys.exit(1) - -def main(): - if not exists(shared_seafiledir): - os.mkdir(shared_seafiledir) - if not exists(generated_dir): - os.makedirs(generated_dir) - - if is_https(): - init_letsencrypt() - generate_local_nginx_conf() - call('nginx -s reload') - - wait_for_mysql() - init_seafile_server() - - check_upgrade() - os.chdir(installdir) - - admin_pw = { - 'email': get_conf('SEAFILE_ADMIN_EMAIL', 'me@example.com'), - 'password': get_conf('SEAFILE_ADMIN_PASSWORD', 'asecret'), - } - password_file = join(topdir, 'conf', 'admin.txt') - with open(password_file, 'w') as fp: - json.dump(admin_pw, fp) - - - try: - call('{} start'.format(get_script('seafile.sh'))) - call('{} start'.format(get_script('seahub.sh'))) - call('{} start /seafile-fuse'.format(get_script('seaf-fuse.sh'))) - finally: - if exists(password_file): - os.unlink(password_file) - - print('seafile server is running now.') - try: - watch_controller() - except KeyboardInterrupt: - print('Stopping seafile server.') - sys.exit(0) - -if __name__ == '__main__': - setup_logging() - main() - diff --git a/selfoss/docker-compose.selfoss.yml b/selfoss/docker-compose.selfoss.yml deleted file mode 100755 index 2d6210e..0000000 --- a/selfoss/docker-compose.selfoss.yml +++ /dev/null @@ -1,31 +0,0 @@ -version: '3.8' - -services: - selfoss: - container_name: selfoss - image: hardware/selfoss - volumes: - - selfoss_data:/selfoss/data - - ${ROOT_INSTALL}/selfhosting/selfoss/cacert-2021-10-26.pem:/etc/ssl/cacerts - - ${ROOT_INSTALL}/selfhosting/selfoss/php7.ini:/etc/php7/php.ini - networks: - - selfoss-frontend - restart: unless-stopped - expose: - - 8888 - labels: - - traefik.enable=true - - traefik.http.routers.selfoss.rule=Host(`${HOST_SELFOSS}.${DOMAIN}`) - - traefik.http.routers.selfoss.entrypoints=https - - traefik.http.routers.selfoss.tls=true - - traefik.http.middlewares.limit.buffering.maxRequestBodyBytes=134217728 - - traefik.http.middlewares.limit.buffering.memRequestBodyBytes=2000000 - - traefik.http.middlewares.limit.buffering.maxResponseBodyBytes=134217728 - - traefik.http.middlewares.limit.buffering.memResponseBodyBytes=2000000 - - traefik.docker.network=selfoss-frontend -volumes: - selfoss_data: - -networks: - selfoss-frontend: - name: selfoss-frontend \ No newline at end of file diff --git a/shaarli/docker-compose.shaarli.yml b/shaarli/docker-compose.shaarli.yml deleted file mode 100755 index a272acd..0000000 --- a/shaarli/docker-compose.shaarli.yml +++ /dev/null @@ -1,27 +0,0 @@ -version: '3.8' - -services: - shaarli: - container_name: shaarli - image: shaarli/shaarli - volumes: - - shaarli-cache:/var/www/shaarli/cache - - ${ROOT_INSTALL}/data/shaarli:/var/www/shaarli/data - networks: - - shaarli-frontend - restart: unless-stopped - expose: - - 80 - labels: - - traefik.enable=true - - traefik.http.routers.shaarli.rule=Host(`${HOST_SHAARLI}.${DOMAIN}`) - - traefik.http.routers.shaarli.entrypoints=https - - traefik.http.routers.shaarli.tls=true - - traefik.docker.network=shaarli-frontend - -networks: - shaarli-frontend: - name: shaarli-frontend - -volumes: - shaarli-cache: diff --git a/source/docker-compose.gitea.yml b/source/docker-compose.gitea.yml deleted file mode 100644 index 40d86b4..0000000 --- a/source/docker-compose.gitea.yml +++ /dev/null @@ -1,32 +0,0 @@ -version: "3.8" - -services: - gitea: - container_name: gitea - image: gitea/gitea:1.17.2-rootless - restart: unless-stopped - volumes: - - gitea_data:/var/lib/gitea - - gitea_config:/etc/gitea - - /etc/timezone:/etc/timezone:ro - - /etc/localtime:/etc/localtime:ro - ports: - - "3000:3000" - networks: - - source-frontend - labels: - - traefik.enable=true - - traefik.http.routers.gitea.rule=Host(`${HOST_GITEA}.${DOMAIN}`) - - traefik.http.services.gitea.loadbalancer.server.port=3000 - - traefik.http.routers.gitea.entrypoints=https - - traefik.http.routers.gitea.tls=true - - traefik.docker.network=source-frontend - -networks: - source-frontend: - name: source-frontend - -volumes: - gitea_data: - gitea_config: - diff --git a/traefik/acme.json b/traefik/acme.json deleted file mode 100644 index e69de29..0000000 diff --git a/traefik/docker-compose.traefik-infomaniak.yml b/traefik/docker-compose.traefik-infomaniak.yml deleted file mode 100755 index 896f4d5..0000000 --- a/traefik/docker-compose.traefik-infomaniak.yml +++ /dev/null @@ -1,67 +0,0 @@ -version: '3.8' - -services: - traefik-infomaniak: - container_name: traefik-infomaniak - image: traefik:v2.5.3 - profiles: ["production"] - command: - - --providers.docker=true - - --providers.docker.exposedbydefault=false - - --api.dashboard=false - - --entrypoints.http.address=:80 - - --entrypoints.https.address=:443 - - --certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL} - - --certificatesresolvers.letsencrypt.acme.storage=/acme.json - - --certificatesResolvers.letsencrypt.acme.dnsChallenge=true - # example : infomaniak - - --certificatesresolvers.letsencrypt.acme.dnschallenge.provider=infomaniak - environment: - - INFOMANIAK_ACCESS_TOKEN=${LETSENCRYPT_DNSPROVIDER_TOKEN} - labels: - - traefik.enable=true - - traefik.http.routers.api.entrypoints=http - - traefik.http.routers.api.entrypoints=https - - traefik.http.routers.api.service=api@internal - # middleware auth - - traefik.http.routers.api.middlewares=auth - - traefik.http.middlewares.auth.basicauth.users=${BASIC_AUTH} - # request widlcard certificate - - traefik.http.routers.api.tls.certresolver=letsencrypt - - traefik.http.routers.api.tls.domains[0].main=${DOMAIN} - - traefik.http.routers.api.tls.domains[0].sans=*.${DOMAIN} - # global redirect to https - - traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`) - - traefik.http.routers.http-catchall.entrypoints=http - - traefik.http.routers.http-catchall.middlewares=redirect-to-https - # middleware redirect - - traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https - - traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true - ports: - - 80:80 - - 443:443 - networks: - - dmz - - baikal-frontend - - blog-frontend - - deluge-frontend - - dokuwiki-frontend - - glances-frontend - - netdata-frontend - - photo-frontend - - portainer-frontend - - posteio-frontend - - seafile-frontend - - selfoss-frontend - - shaarli-frontend - - source-frontend - - wallabag-frontend - - wwww-frontend - restart: unless-stopped - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - - ${ROOT_INSTALL}/selfhosting/traefik/acme.json:/acme.json - -networks: - dmz: - name: dmz \ No newline at end of file diff --git a/traefik/docker-compose.traefik-local.yml b/traefik/docker-compose.traefik-local.yml deleted file mode 100755 index 1b38801..0000000 --- a/traefik/docker-compose.traefik-local.yml +++ /dev/null @@ -1,55 +0,0 @@ -version: '3.8' - -services: - traefik-local: - container_name: traefik-local - image: traefik:v2.5.3 - profiles: ["testing"] - ports: - - 80:80 - - 443:443 - - 8080:8080 - expose: - - 8080 - labels: - - traefik.enable=true - networks: - - dmz - - baikal-frontend - - blog-frontend - - deluge-frontend - - dokuwiki-frontend - - glances-frontend - - netdata-frontend - - photo-frontend - - portainer-frontend - - posteio-frontend - - seafile-frontend - - selfoss-frontend - - shaarli-frontend - - source-frontend - - wallabag-frontend - - wwww-frontend - restart: unless-stopped - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - - ${ROOT_INSTALL}/selfhosting/traefik/traefik.yml:/etc/traefik/traefik.yml - - ${ROOT_INSTALL}/selfhosting/traefik/tls.yml:/etc/traefik/tls.yml - - certs:/etc/ssl/traefik - - traefik-reverse-proxy-https-helper: - container_name: traefik-reverse-proxy-https-helper - image: alpine - profiles: ["testing"] - command: sh -c "cd /etc/ssl/traefik - && wget traefik.me/cert.pem -O cert.pem - && wget traefik.me/privkey.pem -O privkey.pem" - volumes: - - certs:/etc/ssl/traefik - -networks: - dmz: - name: dmz - -volumes: - certs: \ No newline at end of file diff --git a/traefik/tls.yml b/traefik/tls.yml deleted file mode 100644 index 6afb264..0000000 --- a/traefik/tls.yml +++ /dev/null @@ -1,9 +0,0 @@ -tls: - stores: - default: - defaultCertificate: - certFile: /etc/ssl/traefik/cert.pem - keyFile: /etc/ssl/traefik/privkey.pem - certificates: - - certFile: /etc/ssl/traefik/cert.pem - keyFile: /etc/ssl/traefik/privkey.pem \ No newline at end of file diff --git a/traefik/traefik.yml b/traefik/traefik.yml deleted file mode 100644 index f53aec9..0000000 --- a/traefik/traefik.yml +++ /dev/null @@ -1,37 +0,0 @@ -logLevel: INFO - -api: - insecure: true - dashboard: true - -entryPoints: - http: - address: ":80" - https: - address: ":443" - -providers: - file: - filename: /etc/traefik/tls.yml - docker: - endpoint: unix:///var/run/docker.sock - watch: true - exposedByDefault: false - defaultRule: "HostRegexp(`{{ index .Labels \"com.docker.compose.service\"}}.traefik.me`,`{{ index .Labels \"com.docker.compose.service\"}}-{dashed-ip:.*}.traefik.me`)" - -http: - # global redirect to https - routers: - http-catchall: - rule: "hostregexp(`{host:.+}`)" - entrypoints: - - http - middlewares: - - redirect-to-https - - # middleware redirect - middlewares: - redirect-to-https: - redirectscheme: - scheme: https - permanent: true \ No newline at end of file diff --git a/wallabag/docker-compose.wallabag.yml b/wallabag/docker-compose.wallabag.yml deleted file mode 100755 index 6eabf90..0000000 --- a/wallabag/docker-compose.wallabag.yml +++ /dev/null @@ -1,30 +0,0 @@ -version: '3.8' - -services: - wallabag: - container_name: wallabag - image: wallabag/wallabag - networks: - - wallabag-frontend - expose: - - 80 - volumes: - - wallabag_data:/var/www/wallabag/data:rw - - wallabag_images:/var/www/wallabag/web/assets/images:rw - environment: - - SYMFONY__ENV__DOMAIN_NAME="https://${HOST_WALLABAG}.${DOMAIN}" - - SYMFONY__ENV__FOSUSER_REGISTRATION=false - labels: - - traefik.enable=true - - traefik.http.routers.wallabag.rule=Host(`${HOST_WALLABAG}.${DOMAIN}`) - - traefik.http.routers.wallabag.entrypoints=https - - traefik.http.routers.wallabag.tls=true - - traefik.docker.network=wallabag-frontend - -networks: - wallabag-frontend: - name: wallabag-frontend - -volumes: - wallabag_data: - wallabag_images: diff --git a/www/docker-compose.dashy.yml b/www/docker-compose.dashy.yml deleted file mode 100755 index 2bcefc7..0000000 --- a/www/docker-compose.dashy.yml +++ /dev/null @@ -1,40 +0,0 @@ -version: '3.8' - -services: - dashy: - # To build from source, replace 'image: lissy93/dashy' with 'build: .' - # build: . - image: lissy93/dashy - container_name: dashy - # Pass in your config file below, by specifying the path on your host machine - volumes: - - ${ROOT_INSTALL}/data/dashy/config.yml:/app/public/conf.yml - # Set any environmental variables - environment: - - NODE_ENV=production - # Specify your user ID and group ID. You can find this by running `id -u` and `id -g` - # - UID=1000 - # - GID=1000 - # Specify restart policy - restart: unless-stopped - # Configure healthchecks - #healthcheck: - # test: ['CMD', 'node', '/app/services/healthcheck'] - # interval: 1m30s - # timeout: 10s - # retries: 3 - # start_period: 40s - networks: - - wwww-frontend - expose: - - 80 - labels: - - traefik.enable=true - - traefik.http.routers.dashy.rule=Host(`${FQDN_DASHBOARD}`) - - traefik.http.routers.dashy.entrypoints=https - - traefik.http.routers.dashy.tls=true - - traefik.docker.network=wwww-frontend - -networks: - wwww-frontend: - name: wwww-frontend diff --git a/www/docker-compose.heimdall.yml b/www/docker-compose.heimdall.yml deleted file mode 100755 index f888cba..0000000 --- a/www/docker-compose.heimdall.yml +++ /dev/null @@ -1,27 +0,0 @@ -version: '3.8' - -services: - heimdall: - image: lscr.io/linuxserver/heimdall - container_name: heimdall - environment: - - PUID=${PUID} - - PGID=${PGID} - - TZ=${TZ} - volumes: - - ${ROOT_INSTALL}/data/heimdall:/config - expose: - - 80 - networks: - - wwww-frontend - restart: unless-stopped - labels: - - traefik.enable=true - - traefik.http.routers.dashy.rule=Host(`${FQDN_DASHBOARD}`) - - traefik.http.routers.dashy.entrypoints=https - - traefik.http.routers.dashy.tls=true - - traefik.docker.network=wwww-frontend - -networks: - wwww-frontend: - name: wwww-frontend \ No newline at end of file diff --git a/www/docker-compose.www.yml b/www/docker-compose.www.yml deleted file mode 100755 index 9d0a565..0000000 --- a/www/docker-compose.www.yml +++ /dev/null @@ -1,21 +0,0 @@ -version: '3.8' - -services: - www: - container_name: www - image: kianby/www-madyanne - restart: unless-stopped - networks: - - wwww-frontend - expose: - - 80 - labels: - - traefik.enable=true - - traefik.http.routers.www.rule=Host(`${HOST_WWW}.${DOMAIN}`) - - traefik.http.routers.www.entrypoints=https - - traefik.http.routers.www.tls=true - - traefik.docker.network=wwww-frontend - -networks: - wwww-frontend: - name: wwww-frontend \ No newline at end of file