From a142dcb3d19da08d812cc67548590a082bc3305d Mon Sep 17 00:00:00 2001 From: root <root@f11391a1.federatedcomputer.cloud> Date: Fri, 5 Apr 2024 14:04:21 +0000 Subject: [PATCH] New changes for threads in app files --- lib/collabora.sh | 1 + lib/collabora.sh.old | 78 +++++++++++ lib/nextcloud.sh | 7 + lib/nextcloud.sh.old | 307 +++++++++++++++++++++++++++++++++++++++++ lib/postgresql.sh | 12 -- lib/postgresql.sh.old | 114 +++++++++++++++ lib/traefik.sh | 6 +- lib/traefik.sh.old | 132 ++++++++++++++++++ lib/vaultwarden.sh | 7 + lib/vaultwarden.sh.old | 72 ++++++++++ 10 files changed, 723 insertions(+), 13 deletions(-) create mode 100644 lib/collabora.sh.old create mode 100644 lib/nextcloud.sh.old create mode 100644 lib/postgresql.sh.old create mode 100644 lib/traefik.sh.old create mode 100644 lib/vaultwarden.sh.old diff --git a/lib/collabora.sh b/lib/collabora.sh index 5cf5d81..9c0bb02 100644 --- a/lib/collabora.sh +++ b/lib/collabora.sh @@ -15,6 +15,7 @@ config_collabora() { cp /federated/certs/certs/$DOMAIN.crt /federated/certs/private/$DOMAIN.key /federated/apps/collabora/data/root/certs/ chown 104 /federated/apps/collabora/data/root/certs/* fi + get_externalip cat > /federated/apps/collabora/docker-compose.yml <<EOF version: '3.7' diff --git a/lib/collabora.sh.old b/lib/collabora.sh.old new file mode 100644 index 0000000..5cf5d81 --- /dev/null +++ b/lib/collabora.sh.old @@ -0,0 +1,78 @@ +#!/bin/bash +# +# Collabora Service + +PATH=$HOME/.docker/cli-plugins:/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + +config_collabora() { + echo -ne "\n* Configuring /federated/apps/collabora container.." + spin & + SPINPID=$! + + if [ ! -d "/federated/apps/collabora" ]; then + mkdir -p /federated/apps/collabora/data/root/certs &> /dev/null + mkdir -p /federated/apps/collabora/data/opt/collaboraoffice/share/fonts/truetype &> /dev/null + cp /federated/certs/certs/$DOMAIN.crt /federated/certs/private/$DOMAIN.key /federated/apps/collabora/data/root/certs/ + chown 104 /federated/apps/collabora/data/root/certs/* + fi + +cat > /federated/apps/collabora/docker-compose.yml <<EOF +version: '3.7' + +services: + collabora: + image: collabora/code:\${IMAGE_VERSION} + container_name: collabora + hostname: collabora.$DOMAIN + domainname: $DOMAIN + restart: always + networks: + federated: + ipv4_address: 172.99.0.17 + extra_hosts: + - "nextcloud.$DOMAIN:$EXTERNALIP" + ports: + - "9980:9980" + volumes: + - ./data/root:/root + - ./data/opt/collaboraoffice/share/fonts/truetype:/opt/collaboraoffice/share/fonts/truetype +# - ./data/root/certs/$DOMAIN.crt:/etc/coolwsd/cert.pem +# - ./data/root/certs/$DOMAIN.key:/etc/coolwsd/key.pem + env_file: + - ./.env + cap_add: + - MKNOD + labels: + - "traefik.enable=true" + - "traefik.http.routers.collabora.rule=Host(\`collabora.$DOMAIN\`)" + - "traefik.http.routers.collabora.entrypoints=websecure" + - "traefik.http.routers.collabora.tls.certresolver=letsencrypt" + - "traefik.http.services.collabora.loadbalancer.server.port=9980" + +networks: + federated: + external: true +EOF + +cat > /federated/apps/collabora/.env <<EOF +IMAGE_VERSION=23.05.10.1.1 +domain=nextcloud.$DOMAIN +server_name=collabora.$DOMAIN +extra_params=--o:ssl.enable=false --o:ssl.termination=true +EOF +chmod 600 /federated/apps/collabora/.env + +# Extract extra fonts into collabora +tar zxvf /federated/lib/files/collabora/fonts.tar.gz -C /federated/apps/collabora/data/opt/collaboraoffice/share/fonts/truetype/ +[ $? -ne 0 ] && fail "Couldn't extract files/collabora/fonts.tar.gz into collabora" + +kill -9 $SPINPID &> /dev/null +echo -ne "done." +} +start_collabora() { + # Start service with command to make sure it's up before proceeding + start_service "collabora" "nc -z 172.99.0.17 9980 &> /dev/null" "15" + + kill -9 $SPINPID &> /dev/null + echo -ne "done." +} diff --git a/lib/nextcloud.sh b/lib/nextcloud.sh index 02c4829..4914abe 100644 --- a/lib/nextcloud.sh +++ b/lib/nextcloud.sh @@ -18,6 +18,7 @@ config_nextcloud() { mkdir -p /federated/apps/nextcloud/data/var/www/data &> /dev/null mkdir -p /federated/apps/nextcloud/data/usr/local/etc/php/conf.d &> /dev/null fi + get_externalip cat > /federated/apps/nextcloud/docker-compose.yml <<EOF version: '3.7' @@ -77,10 +78,16 @@ networks: EOF LDAP_SECRET=`cat /federated/apps/ldap/.ldap.secret` +NEXTCLOUD_SECRET=$(create_password) echo "$NEXTCLOUD_SECRET" > /federated/apps/nextcloud/.postgresql.secret echo "$ADMINPASS" > /federated/apps/nextcloud/.nextcloud.secret chmod 600 /federated/apps/nextcloud/.postgresql.secret /federated/apps/nextcloud/.nextcloud.secret +# Create database and user in postgresql +docker exec postgresql psql -U postgres -c "CREATE DATABASE nextcloud" &> /dev/null +docker exec postgresql psql -U postgres -c "CREATE USER nextcloud WITH PASSWORD '$NEXTCLOUD_SECRET'" &> /dev/null +docker exec postgresql psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE nextcloud TO nextcloud" &> /dev/null + cat > /federated/apps/nextcloud/.env <<EOF IMAGE_VERSION=28.0.4 NEXTCLOUD_UPDATE=1 diff --git a/lib/nextcloud.sh.old b/lib/nextcloud.sh.old new file mode 100644 index 0000000..02c4829 --- /dev/null +++ b/lib/nextcloud.sh.old @@ -0,0 +1,307 @@ +#!/bin/bash -x +# +# NextCloud Service + +PATH=$HOME/.docker/cli-plugins:/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + +config_nextcloud() { + echo -ne "\n* Configuring /federated/apps/nextcloud container.." + spin & + SPINPID=$! + + if [ ! -d "/federated/apps/nextcloud" ]; then + mkdir -p /federated/apps/nextcloud/data/root &> /dev/null + mkdir -p /federated/apps/nextcloud/data/home &> /dev/null + mkdir -p /federated/apps/nextcloud/data/var/www/html &> /dev/null + mkdir -p /federated/apps/nextcloud/data/var/www/html/custom_apps &> /dev/null + mkdir -p /federated/apps/nextcloud/data/var/www/config &> /dev/null + mkdir -p /federated/apps/nextcloud/data/var/www/data &> /dev/null + mkdir -p /federated/apps/nextcloud/data/usr/local/etc/php/conf.d &> /dev/null + fi + +cat > /federated/apps/nextcloud/docker-compose.yml <<EOF +version: '3.7' + +services: + nextcloud: + image: nextcloud:\${IMAGE_VERSION} + container_name: nextcloud + hostname: nextcloud.$DOMAIN + domainname: $DOMAIN + restart: always +# working_dir: /var/www/html + networks: + federated: + ipv4_address: 172.99.0.18 + extra_hosts: + - "collabora.$DOMAIN:$EXTERNALIP" + volumes: + - ./data/root:/root + - ./data/home:/home + - ./data/var/www/html:/var/www/html + - ./data/var/www/html/custom_apps:/var/www/html/custom_apps + - ./data/var/www/config:/var/www/config + - ./data/var/www/data:/var/www/data + - ./data/usr/local/etc/php/conf.d/opcache-recommended.ini:/usr/local/etc/php/conf.d/opcache-recommended.ini + - ./data/usr/local/etc/php/conf.d/docker-php-ext-apcu.ini:/usr/local/etc/php/conf.d/docker-php-ext-apcu.ini + env_file: + - ./.env + secrets: + - federated_psql_password + - federated_nextcloud_password + labels: + - "traefik.enable=true" + - "traefik.http.routers.nextcloud.rule=Host(\`nextcloud.$DOMAIN\`)" + - "traefik.http.routers.nextcloud.entrypoints=websecure" + - "traefik.http.routers.nextcloud.tls.certresolver=letsencrypt" + - "traefik.http.routers.nextcloud.middlewares=nextcloud-redirectregex1,nextcloud-redirectregex2,nextcloudheader" + - "traefik.http.middlewares.nextcloud-redirectregex1.redirectregex.permanent=true" + - "traefik.http.middlewares.nextcloud-redirectregex1.redirectregex.regex=https?://([^/]*)/.well-known/(card|cal)dav" + - "traefik.http.middlewares.nextcloud-redirectregex1.redirectregex.replacement=https://\$\${1}/remote.php/dav/" + - "traefik.http.middlewares.nextcloud-redirectregex2.redirectregex.permanent=true" + - "traefik.http.middlewares.nextcloud-redirectregex2.redirectregex.regex=https?://([^/]*)(/.well-known[^#]*)" + - "traefik.http.middlewares.nextcloud-redirectregex2.redirectregex.replacement=https://\$\${1}/index.php\$\${2}" + - "traefik.http.middlewares.nextcloudheader.headers.stsSeconds=15552000" + - "traefik.http.middlewares.nextcloudheader.headers.stsIncludeSubdomains=true" + - "traefik.http.middlewares.nextcloudheader.headers.stsPreload=true" + - "traefik.http.middlewares.nextcloudheader.headers.forceSTSHeader=true" + +secrets: + federated_psql_password: + file: ./.postgresql.secret + federated_nextcloud_password: + file: ./.nextcloud.secret +networks: + federated: + external: true +EOF + +LDAP_SECRET=`cat /federated/apps/ldap/.ldap.secret` +echo "$NEXTCLOUD_SECRET" > /federated/apps/nextcloud/.postgresql.secret +echo "$ADMINPASS" > /federated/apps/nextcloud/.nextcloud.secret +chmod 600 /federated/apps/nextcloud/.postgresql.secret /federated/apps/nextcloud/.nextcloud.secret + +cat > /federated/apps/nextcloud/.env <<EOF +IMAGE_VERSION=28.0.4 +NEXTCLOUD_UPDATE=1 +PHP_MEMORY_LIMIT=2048M +PHP_UPLOAD_LIMIT=2048M +TRUSTED_PROXIES=172.99.0.0/16 +NEXTCLOUD_TRUSTED_DOMAINS=nextcloud.$DOMAIN +NEXTCLOUD_ADMIN_USER=nextcloud +NEXTCLOUD_ADMIN_PASSWORD_FILE=/run/secrets/federated_nextcloud_password +POSTGRES_HOST=postgresql.$DOMAIN +POSTGRES_DB=nextcloud +POSTGRES_USER=nextcloud +POSTGRES_PASSWORD_FILE=/run/secrets/federated_psql_password +EOF +chmod 600 /federated/apps/nextcloud/.env + +cat > /federated/apps/nextcloud/data/usr/local/etc/php/conf.d/opcache-recommended.ini <<EOF +opcache.enable=1 +opcache.interned_strings_buffer=32 +opcache.max_accelerated_files=18000 +opcache.memory_consumption=256 +opcache.save_comments=1 +opcache.revalidate_freq=60 +EOF + +cat > /federated/apps/nextcloud/data/usr/local/etc/php/conf.d/docker-php-ext-apcu.ini <<EOF +extension=apcu +apc.enable_cli=1 +apc.shm_size=256M +apc.ttl=3600 +apc.user_ttl=7200 +apc.gc_ttl=3600 +apc.max_file_size=2M +EOF + +#if [[ "$BUNDLE" = "starter" ]]; then +# sed -i "s/2048M/96M/g" /federated/apps/nextcloud/.env +# sed -i "s/256/64/g" /federated/apps/nextcloud/data/usr/local/etc/php/conf.d/opcache-recommended.ini +# sed -i "s/256M/64M/g" /federated/apps/nextcloud/data/usr/local/etc/php/conf.d/docker-php-ext-apcu.ini +#fi + +cat > /federated/apps/nextcloud/data/configs.json <<EOF +{ + "system": { + "mail_smtpmode": "smtp", + "mail_smtpsecure": "tls", + "mail_sendmailmode": "smtp", + "mail_from_address": "nextcloud", + "mail_domain": "$DOMAIN", + "mail_smtpauthtype": "LOGIN", + "mail_smtpauth": 1, + "mail_smtphost": "mail.$DOMAIN", + "mail_smtpport": "587", + "mail_smtpname": "fcore", + "mail_smtppassword": "$ADMINPASS" + }, + "apps": { + "core": { + "backgroundjobs_mode": "cron" + }, + "side_menu": { + "background-color-opacity": "100", + "current-app-background-color": "#005b8d", + "types": "", + "enabled": "yes", + "text-color": "#ffffff", + "loader-color": "#339bd4", + "types": "", + "always-displayed": "0", + "big-menu": "0", + "side-with-categories": "0", + "background-color": "#0068a1", + "background-color-to": "#0068a1", + "icon-invert-filter": "0", + "icon-opacity": "100", + "opener": "side-menu-opener", + "dark-mode-background-color": "#0068a1", + "dark-mode-background-color-to": "#0068a1", + "dark-mode-background-color-opacity": "100", + "dark-mode-current-app-background-color": "#005b8d", + "dark-mode-text-color": "#ffffff", + "dark-mode-loader-color": "#ffffff", + "dark-mode-icon-invert-filter": "0", + "dark-mode-icon-opacity": "100", + "dark-mode-opener": "side-menu-opener", + "opener-position": "before", + "opener-only": "0", + "hide-when-no-apps": "0", + "opener-hover": "0", + "display-logo": "1", + "use-avatar": "0", + "add-logo-link": "1", + "big-menu-hidden-apps": "[]", + "show-settings": "0", + "size-icon": "normal", + "size-text": "normal", + "target-blank-apps": "[]", + "loader-enabled": "1", + "top-side-menu-apps": "[]", + "top-menu-mouse-over-hidden-label": "0", + "apps-order": "[\"dashboard\",\"mail\",\"calendar\",\"contacts\",\"notes\",\"tasks\",\"files\",\"deck\",\"bookmarks\",\"forms\",\"spreed\",\"photos\",\"activity\"]", + "categories-order-type": "default", + "categories-custom": "[]", + "apps-categories-custom": "[]", + "categories-order": "[\"other\",\"customization\",\"dashboard\",\"external_links\",\"files\",\"workflow\",\"games\",\"integration\",\"monitoring\",\"multimedia\",\"office\",\"organization\",\"search\",\"security\",\"social\",\"tools\"]", + "default-enabled": "1", + "force": "0", + "top-menu-apps": "[\"photos\",\"activity\",\"dashboard\",\"forms\",\"calendar\",\"tasks\",\"bookmarks\",\"deck\",\"contacts\",\"notes\",\"spreed\",\"mail\",\"files\"]", + "cache": "2" + } + } +} +EOF + +cat > /federated/apps/nextcloud/data/config.sh <<EOF +#!/bin/sh + +PATH=/var/www/html:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/sbin:/bin + +/var/www/html/occ app:enable user_ldap +/var/www/html/occ ldap:create-empty-config +/var/www/html/occ ldap:set-config s01 ldapHost 'ldaps://ldap.$DOMAIN' +/var/www/html/occ ldap:set-config s01 ldapAgentName cn=admin,dc=federatedcomputer,dc=cloud +/var/www/html/occ ldap:set-config s01 ldapAgentPassword $LDAP_SECRET +/var/www/html/occ ldap:set-config s01 ldapBase ou=people,dc=federatedcomputer,dc=cloud +/var/www/html/occ ldap:set-config s01 ldapBaseGroups ou=groups,dc=federatedcomputer,dc=cloud +/var/www/html/occ ldap:set-config s01 ldapBaseUsers ou=people,dc=federatedcomputer,dc=cloud +/var/www/html/occ ldap:set-config s01 ldapEmailAttribute mail +/var/www/html/occ ldap:set-config s01 ldapGidNumber gidNumber +/var/www/html/occ ldap:set-config s01 ldapGroupDisplayName cn +/var/www/html/occ ldap:set-config s01 ldapGroupFilter '(&(|(objectclass=posixGroup)))' +/var/www/html/occ ldap:set-config s01 ldapGroupFilterMode 0 +/var/www/html/occ ldap:set-config s01 ldapGroupFilterObjectclass inetOrgPerson +/var/www/html/occ ldap:set-config s01 ldapGroupMemberAssocAttr uniqueMember +/var/www/html/occ ldap:set-config s01 ldapLoginFilter '(&(|(objectclass=inetOrgPerson))(mail=%uid))' +/var/www/html/occ ldap:set-config s01 ldapLoginFilterEmail 0 +/var/www/html/occ ldap:set-config s01 ldapLoginFilterMode 0 +/var/www/html/occ ldap:set-config s01 ldapLoginFilterUsername 1 +/var/www/html/occ ldap:set-config s01 ldapLoginFilterEmail 0 +/var/www/html/occ ldap:set-config s01 ldapMatchingRuleInChainState unknown +/var/www/html/occ ldap:set-config s01 ldapNestedGroups 0 +/var/www/html/occ ldap:set-config s01 ldapPagingSize 500 +/var/www/html/occ ldap:set-config s01 ldapPort 636 +/var/www/html/occ ldap:set-config s01 ldapTLS 1 +/var/www/html/occ ldap:set-config s01 ldapUserAvatarRule default +/var/www/html/occ ldap:set-config s01 ldapUserDisplayName cn +/var/www/html/occ ldap:set-config s01 ldapUserFilter '(|(objectclass=inetOrgPerson))' +/var/www/html/occ ldap:set-config s01 ldapUserFilterMode 0 +/var/www/html/occ ldap:set-config s01 ldapUserFilterObjectclass inetOrgPerson +/var/www/html/occ ldap:set-config s01 ldapUuidGroupAttribute auto +/var/www/html/occ ldap:set-config s01 ldapUuidUserAttribute auto +/var/www/html/occ ldap:set-config s01 turnOffCertCheck 0 +/var/www/html/occ ldap:set-config s01 turnOnPasswordChange 0 +/var/www/html/occ ldap:set-config s01 useMemberOfToDetectMembership 1 +/var/www/html/occ ldap:set-config s01 ldapConfigurationActive 1 +/var/www/html/occ ldap:set-config s01 ldap_expert_username_attr uid +/var/www/html/occ ldap:set-config s01 ldap_display_name givenName +/var/www/html/occ config:system:set overwriteprotocol --value=https +/var/www/html/occ config:system:set default_phone_region --value="$COUNTRY" +/var/www/html/occ config:system:delete trusted_domains +/var/www/html/occ config:system:set trusted_domains 1 --value=* +/var/www/html/occ group:adduser admin admin +/var/www/html/occ user:delete nextcloud +/var/www/html/occ app:enable mail +/var/www/html/occ app:enable calendar +/var/www/html/occ app:enable contacts +/var/www/html/occ app:enable notes +/var/www/html/occ app:enable deck +/var/www/html/occ app:enable tasks +/var/www/html/occ app:enable bookmarks +/var/www/html/occ app:enable forms +/var/www/html/occ app:enable spreed +/var/www/html/occ app:enable side_menu +/var/www/html/occ app:enable external +/var/www/html/occ app:enable richdocuments +/var/www/html/occ config:app:set --value https:\/\/collabora.$DOMAIN richdocuments public_wopi_url +/var/www/html/occ config:app:set --value https:\/\/collabora.$DOMAIN richdocuments wopi_url +/var/www/html/occ config:app:set --value ooxml richdocuments doc_format +/var/www/html/occ config:app:set --value "" richdocuments disable_certificate_verification +/var/www/html/occ config:app:set external sites "--value={\"1\":{\"icon\":\"external.svg\",\"lang\":\"\",\"type\":\"link\",\"device\":\"browser\",\"groups\":[],\"redirect\":true,\"id\":1,\"name\":\"Video Conference (Jitsi)\",\"url\":\"https:\/\/jitsi.$DOMAIN\"},\"2\":{\"icon\":\"external.svg\",\"lang\":\"\",\"type\":\"link\",\"device\":\"browser\",\"groups\":[],\"redirect\":true,\"id\":2,\"name\":\"Worldwide Chat (Element)\",\"url\":\"https:\/\/element.$DOMAIN\"},\"3\":{\"icon\":\"external.svg\",\"lang\":\"\",\"type\":\"link\",\"device\":\"browser\",\"groups\":[],\"redirect\":true,\"id\":3,\"name\":\"Mailing Lists (Listmonk)\",\"url\":\"https:\/\/listmonk.$DOMAIN\"},\"4\":{\"icon\":\"external.svg\",\"lang\":\"\",\"type\":\"link\",\"device\":\"browser\",\"groups\":[],\"redirect\":true,\"id\":4,\"name\":\"Databases (Baserow)\",\"url\":\"https:\/\/baserow.$DOMAIN\"},\"5\":{\"icon\":\"external.svg\",\"lang\":\"\",\"type\":\"link\",\"device\":\"browser\",\"groups\":[],\"redirect\":true,\"id\":5,\"name\":\"Passwords (Vaultwarden)\",\"url\":\"https:\/\/vaultwarden.$DOMAIN\"},\"7\":{\"icon\":\"external.svg\",\"lang\":\"\",\"type\":\"link\",\"device\":\"browser\",\"groups\":[],\"redirect\":true,\"id\":7,\"name\":\"Source code (Gitea)\",\"url\":\"https:\/\/gitea.$DOMAIN\"}}" +/var/www/html/occ config:import configs.json +EOF + +chmod +x /federated/apps/nextcloud/data/config.sh + + kill -9 $SPINPID &> /dev/null + echo -ne "done." +} + +start_nextcloud() { + # Start service with command to make sure it's up before proceeding + start_service "nextcloud" "nc -z 172.99.0.18 80 &> /dev/null" "35" + + # Move config.sh and sidemenu config, set config.sh executable + mv /federated/apps/nextcloud/data/config.sh /federated/apps/nextcloud/data/configs.json /federated/apps/nextcloud/data/var/www/html/ + docker exec nextcloud chown www-data:root /var/www/html/config.sh /var/www/html/configs.json + docker exec nextcloud chmod 755 /var/www/html/config.sh + [ $? -ne 0 ] && fail "Couldn't chown config.sh in /federated/apps/nextcloud container" + + # Run config.sh - Setup LDAP, configuration for nextcloud + docker exec -u 33 nextcloud /var/www/html/config.sh &> /dev/null + [ $? -ne 0 ] && fail "Couldn't run config.sh inside /federated/apps/nextcloud container" + + # Add admin user to group + # Have to do it this many times so it will query LDAP and populate admin user first + docker exec -u 33 nextcloud /var/www/html/occ ldap:search admin + docker exec -u 33 nextcloud /var/www/html/occ group:list + docker exec -u 33 nextcloud /var/www/html/occ group:adduser admin admin + docker exec -u 33 nextcloud /var/www/html/occ group:adduser admin admin + docker exec -u 33 nextcloud /var/www/html/occ group:list + + # Setup admin email account + docker exec -u 33 nextcloud bash -c "/var/www/html/occ mail:account:create admin admin admin@$DOMAIN mail.$DOMAIN 993 ssl admin@$DOMAIN $ADMINPASS mail.$DOMAIN 465 ssl admin@$DOMAIN $ADMINPASS password" &> /dev/null + + # Add missing indexes and disable activity app + docker exec -u 33 nextcloud /var/www/html/occ db:add-missing-indices + docker exec -u 33 nextcloud /var/www/html/occ app:disable activity + + # Remove configs + rm /federated/apps/nextcloud/data/var/www/html/config.sh /federated/apps/nextcloud/data/var/www/html/configs.json + + kill -9 $SPINPID &> /dev/null + echo -ne "done." +} diff --git a/lib/postgresql.sh b/lib/postgresql.sh index 8c20ebf..37ebcb7 100644 --- a/lib/postgresql.sh +++ b/lib/postgresql.sh @@ -69,19 +69,7 @@ chmod 600 /federated/apps/postgresql/.env PSQL_SECRET=$(create_password); echo "$PSQL_SECRET" > /federated/apps/postgresql/.postgresql.secret chmod 600 /federated/apps/postgresql/.postgresql.secret -NEXTCLOUD_SECRET=$(create_password); -VAULTWARDEN_SECRET=$(create_password); -# cat postgresql/data/docker-entrypoint-initdb.d/init.sql -cat > /federated/apps/postgresql/data/docker-entrypoint-initdb.d/init.sql <<EOF -CREATE USER nextcloud WITH PASSWORD '$NEXTCLOUD_SECRET'; -CREATE DATABASE nextcloud; -GRANT ALL PRIVILEGES ON DATABASE nextcloud TO nextcloud; -CREATE USER vaultwarden WITH PASSWORD '$VAULTWARDEN_SECRET'; -CREATE DATABASE vaultwarden; -GRANT ALL PRIVILEGES ON DATABASE vaultwarden TO vaultwarden; -EOF - kill -9 $SPINPID &> /dev/null echo -ne "done." } diff --git a/lib/postgresql.sh.old b/lib/postgresql.sh.old new file mode 100644 index 0000000..8c20ebf --- /dev/null +++ b/lib/postgresql.sh.old @@ -0,0 +1,114 @@ +#!/bin/bash +# +# Postgresql Service + +PATH=$HOME/.docker/cli-plugins:/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + +config_postgresql() { + echo -ne "\n* Configuring /federated/apps/postgresql container.." + spin & + SPINPID=$! + + if [ ! -d "/federated/apps/postgresql" ]; then + mkdir -p /federated/apps/postgresql/data/var/lib/postgresql /federated/apps/postgresql/data/docker-entrypoint-initdb.d + cp /federated/certs/certs/$DOMAIN.crt /federated/apps/postgresql/data/var/lib/postgresql/server.crt + cp /federated/certs/private/$DOMAIN.key /federated/apps/postgresql/data/var/lib/postgresql/server.key + chown 999 /federated/apps/postgresql/data/var/lib/postgresql/server.crt /federated/apps/postgresql/data/var/lib/postgresql/server.key + chmod 600 /federated/apps/postgresql/data/var/lib/postgresql/server.crt /federated/apps/postgresql/data/var/lib/postgresql/server.key + fi + +cat > /federated/apps/postgresql/docker-compose.yml <<EOF +version: "3.7" + +services: + postgresql: + image: postgres:\${IMAGE_VERSION} + container_name: postgresql + hostname: postgresql.$DOMAIN + domainname: $DOMAIN + restart: always + networks: + federated: + ipv4_address: 172.99.0.14 + volumes: + - ./data/var/lib/postgresql/server.crt:/var/lib/postgresql/server.crt + - ./data/var/lib/postgresql/server.key:/var/lib/postgresql/server.key + - ./data/var/lib/postgresql/data:/var/lib/postgresql/data + - ./data/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d + env_file: + - ./.env + secrets: + - federated_psql_password + command: > + -c ssl=on + -c ssl_cert_file=/var/lib/postgresql/server.crt + -c ssl_key_file=/var/lib/postgresql/server.key + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 10s + timeout: 5s + retries: 5 + +secrets: + federated_psql_password: + file: ./.postgresql.secret +networks: + federated: + external: true +EOF + +cat > /federated/apps/postgresql/.env <<EOF +IMAGE_VERSION="14" +POSTGRES_DB=postgres +POSTGRES_USER=postgres +POSTGRES_PASSWORD_FILE=/run/secrets/federated_psql_password +POSTGRES_INITDB_ARGS=--encoding='UTF8' --lc-collate='C' --lc-ctype='C' +EOF +chmod 600 /federated/apps/postgresql/.env + +PSQL_SECRET=$(create_password); +echo "$PSQL_SECRET" > /federated/apps/postgresql/.postgresql.secret +chmod 600 /federated/apps/postgresql/.postgresql.secret +NEXTCLOUD_SECRET=$(create_password); +VAULTWARDEN_SECRET=$(create_password); + +# cat postgresql/data/docker-entrypoint-initdb.d/init.sql +cat > /federated/apps/postgresql/data/docker-entrypoint-initdb.d/init.sql <<EOF +CREATE USER nextcloud WITH PASSWORD '$NEXTCLOUD_SECRET'; +CREATE DATABASE nextcloud; +GRANT ALL PRIVILEGES ON DATABASE nextcloud TO nextcloud; +CREATE USER vaultwarden WITH PASSWORD '$VAULTWARDEN_SECRET'; +CREATE DATABASE vaultwarden; +GRANT ALL PRIVILEGES ON DATABASE vaultwarden TO vaultwarden; +EOF + +kill -9 $SPINPID &> /dev/null +echo -ne "done." +} +start_postgresql() { + # Start service with command to make sure it's up before proceeding + start_service "postgresql" "nc -z 172.99.0.14 5432 &> /dev/null" "18" + + # Tune PostgreSQL +# if [[ "$BUNDLE" = "starter" ]]; then +# sed -i "s#shared_buffers =.*#shared_buffers = 50MB#g" /federated/apps/postgresql/data/var/lib/postgresql/data/postgresql.conf +# sed -i "s#max_connections =.*#max_connections = 400#g" /federated/apps/postgresql/data/var/lib/postgresql/data/postgresql.conf +# sed -i "s/#work_mem =.*/work_mem = 4MB/g" /federated/apps/postgresql/data/var/lib/postgresql/data/postgresql.conf +# sed -i "s/#maintenance_work_mem =.*/maintenance_work_mem = 50MB/g" /federated/apps/postgresql/data/var/lib/postgresql/data/postgresql.conf +# else + sed -i "s#shared_buffers =.*#shared_buffers = 800MB#g" /federated/apps/postgresql/data/var/lib/postgresql/data/postgresql.conf + sed -i "s#max_connections =.*#max_connections = 400#g" /federated/apps/postgresql/data/var/lib/postgresql/data/postgresql.conf + sed -i "s/#work_mem =.*/work_mem = 16MB/g" /federated/apps/postgresql/data/var/lib/postgresql/data/postgresql.conf + sed -i "s/#maintenance_work_mem =.*/maintenance_work_mem = 128MB/g" /federated/apps/postgresql/data/var/lib/postgresql/data/postgresql.conf +# fi + + # Restart PostgreSQL + /federated/bin/stop postgresql &> /dev/null + /federated/bin/start postgresql &> /dev/null + + # Remove init.sql +# rm /federated/apps/postgresql/data/docker-entrypoint-initdb.d/init.sql + + kill -9 $SPINPID &> /dev/null + echo -ne "done." +} diff --git a/lib/traefik.sh b/lib/traefik.sh index 0ab75e6..5a87304 100644 --- a/lib/traefik.sh +++ b/lib/traefik.sh @@ -93,8 +93,12 @@ chmod 600 /federated/apps/traefik/.env kill -9 $SPINPID &> /dev/null echo -ne "done." } - start_traefik() { + # Start service with command to make sure it's up before proceeding + start_service "traefik" "traefik-certs-dumper file --version v2 --source /federated/apps/traefik/data/letsencrypt/acme.json --dest /federated/certs &> /dev/null && ls /federated/certs/private/$DOMAIN.key /federat +ed/certs/certs/$DOMAIN.crt &> /dev/null" "4" +} +start_traefik_old() { echo -ne "\n* Starting /federated/apps/traefik service.." spin & diff --git a/lib/traefik.sh.old b/lib/traefik.sh.old new file mode 100644 index 0000000..0ab75e6 --- /dev/null +++ b/lib/traefik.sh.old @@ -0,0 +1,132 @@ +#!/bin/bash +# +# Traefik Service + +PATH=$HOME/.docker/cli-plugins:/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + +config_traefik() { + echo -ne "\n* Configuring /federated/apps/traefik container.." + spin & + SPINPID=$! + + if [ ! -d "/federated/apps/traefik" ]; then + mkdir -p /federated/apps/traefik/data/letsencrypt + fi + +TRAEFIK_HTTPAUTH_STRING=$(echo `htpasswd -nb admin $ADMINPASS` | sed -e s/\\$/\\$\\$/g) + +cat > /federated/apps/traefik/docker-compose.yml <<EOF +version: "3.7" + +services: + traefik: + image: traefik:\${IMAGE_VERSION} + container_name: traefik + hostname: traefik.$DOMAIN + domainname: $DOMAIN + restart: always + networks: + federated: + ipv4_address: 172.99.0.13 + command: + # Tell Traefik to discover containers using the Docker API + - --providers.docker=true + # Enable the Trafik dashboard + - --api.dashboard=true + # Set up LetsEncrypt + - --certificatesresolvers.letsencrypt.acme.dnschallenge=true + - --certificatesresolvers.letsencrypt.acme.dnschallenge.provider=pdns + - --certificatesresolvers.letsencrypt.acme.email=hostmaster@$DOMAIN + - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json + - --certificatesresolvers.letsencrypt.acme.dnschallenge.DisablePropagationCheck=true + # --certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory + # Added HTTP challenge + - --certificatesresolvers.httpresolver.acme.httpchallenge=true + - --certificatesresolvers.httpresolver.acme.httpchallenge.entrypoint=web + #- "--certificatesresolvers.httpresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory" + - --certificatesresolvers.httpresolver.acme.email=hostmaster@$DOMAIN + - --certificatesresolvers.httpresolver.acme.storage=/letsencrypt/httpacme.json + - --log.level=DEBUG + # Set up an insecure listener that redirects all traffic to HTTPS + - --entrypoints.web.address=:80 + - --entrypoints.websecure.address=:443 + - --entrypoints.web.http.redirections.entrypoint.to=websecure + - --entrypoints.web.http.redirections.entrypoint.scheme=https + # Set up the TLS configuration for our websecure listener + - --entrypoints.websecure.http.tls=true + - --entrypoints.websecure.http.tls.certResolver=letsencrypt + - --entrypoints.websecure.http.tls.domains[0].main=$DOMAIN + - --entrypoints.websecure.http.tls.domains[0].sans=*.$DOMAIN + env_file: + - ./.env + ports: + - 80:80 + - 443:443 + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./data/letsencrypt:/letsencrypt + labels: + - "traefik.enable=true" + - "traefik.http.routers.traefik.rule=Host(\`traefik.$DOMAIN\`)" + - "traefik.http.routers.traefik.entrypoints=websecure" + - "traefik.http.routers.traefik.tls.certresolver=letsencrypt" + - "traefik.http.routers.traefik.service=api@internal" + - "traefik.http.routers.traefik.middlewares=strip" + - "traefik.http.middlewares.strip.stripprefix.prefixes=/traefik" + - "traefik.http.routers.traefik.middlewares=traefik-auth" + - "traefik.http.middlewares.traefik-auth.basicauth.users=$TRAEFIK_HTTPAUTH_STRING" + +networks: + federated: + external: true +EOF + +PDNS_APIKEY=`grep PDNS_api_key /federated/apps/pdns/.env | awk -F= '{ print $2 }'` + +cat > /federated/apps/traefik/.env <<EOF +IMAGE_VERSION="v2.10.1" +PDNS_API_KEY=$PDNS_APIKEY +PDNS_API_URL=http://pdns.$DOMAIN:8081 +EOF +chmod 600 /federated/apps/traefik/.env + +kill -9 $SPINPID &> /dev/null +echo -ne "done." +} + +start_traefik() { + echo -ne "\n* Starting /federated/apps/traefik service.." + + spin & + SPINPID=$! + + if [ $DEBUG ]; then + # Start /federated/apps/traefik with output to console for debug + docker-compose -f /federated/apps/traefik/docker-compose.yml -p traefik up + [ $? -eq 0 ] && echo -ne "done.\n" || fail "There was a problem starting service /federated/apps/traefik" + else + # Start /federated/apps/traefik with output to /dev/null + docker-compose -f /federated/apps/traefik/docker-compose.yml -p traefik up -d &> /dev/null + + # Keep trying to see that certificates are generated + RETRY="20" + while [ $RETRY -gt 0 ]; do + traefik-certs-dumper file --version v2 --source /federated/apps/traefik/data/letsencrypt/acme.json --dest /federated/certs &> /dev/null + + # Check if certs are generated + ls /federated/certs/private/$DOMAIN.key /federated/certs/certs/$DOMAIN.crt &> /dev/null + if [ $? -eq 0 ]; then + kill -9 $SPINPID &> /dev/null + echo -ne "done." + break + else + if [ "$RETRY" == 1 ]; then + docker-compose -f /federated/apps/traefik/docker-compose.yml -p traefik down &> /dev/null + fail "There was a problem starting service /federated/apps/traefik\nCheck the output of 'docker logs traefik' or turn on\ndebug with -d" + fi + ((RETRY--)) + sleep 9 + fi + done + fi +} diff --git a/lib/vaultwarden.sh b/lib/vaultwarden.sh index 1f4a967..637cdba 100644 --- a/lib/vaultwarden.sh +++ b/lib/vaultwarden.sh @@ -3,6 +3,7 @@ # Vaultwarden Service PATH=$HOME/.docker/cli-plugins:/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +get_appvars config_vaultwarden() { echo -ne "\n* Configuring /federated/apps/vaultwarden container.." @@ -12,6 +13,7 @@ config_vaultwarden() { if [ ! -d "/federated/apps/vaultwarden" ]; then mkdir -p /federated/apps/vaultwarden/data/data fi + VAULTWARDEN_SECRET=$(create_password) cat > /federated/apps/vaultwarden/docker-compose.yml <<EOF version: '3.7' @@ -59,6 +61,11 @@ SIGNUPS_DOMAINS_WHITELIST=$DOMAIN SIGNUPS_VERIFY=true EOF chmod 600 /federated/apps/vaultwarden/.env + +# Create database and user in postgresql +docker exec postgresql psql -U postgres -c "CREATE DATABASE vaultwarden" &> /dev/null +docker exec postgresql psql -U postgres -c "CREATE USER vaultwarden WITH PASSWORD '$VAULTWARDEN_SECRET'" &> /dev/null +docker exec postgresql psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE vaultwarden TO vaultwarden" &> /dev/null kill -9 $SPINPID &> /dev/null echo -ne "done." diff --git a/lib/vaultwarden.sh.old b/lib/vaultwarden.sh.old new file mode 100644 index 0000000..1f4a967 --- /dev/null +++ b/lib/vaultwarden.sh.old @@ -0,0 +1,72 @@ +#!/bin/bash +# +# Vaultwarden Service + +PATH=$HOME/.docker/cli-plugins:/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + +config_vaultwarden() { + echo -ne "\n* Configuring /federated/apps/vaultwarden container.." + spin & + SPINPID=$! + + if [ ! -d "/federated/apps/vaultwarden" ]; then + mkdir -p /federated/apps/vaultwarden/data/data + fi + +cat > /federated/apps/vaultwarden/docker-compose.yml <<EOF +version: '3.7' + +services: + vaultwarden: + image: vaultwarden/server:\${IMAGE_VERSION} + container_name: vaultwarden + hostname: vaultwarden.$DOMAIN + domainname: $DOMAIN + restart: always + networks: + federated: + ipv4_address: 172.99.0.22 + env_file: + - ./.env + volumes: + - ./data/data:/data + labels: + - "traefik.enable=true" + - "traefik.http.routers.vaultwarden.rule=Host(\`vaultwarden.$DOMAIN\`)" + - "traefik.http.routers.vaultwarden.entrypoints=websecure" + - "traefik.http.routers.vaultwarden.tls.certresolver=letsencrypt" + +networks: + federated: + external: true +EOF + +cat > /federated/apps/vaultwarden/.env <<EOF +IMAGE_VERSION="1.28.1" +DATABASE_URL=postgresql://vaultwarden:$VAULTWARDEN_SECRET@postgresql.$DOMAIN:5432/vaultwarden +WEBSOCKET_ENABLED=true +DOMAIN=https://vaultwarden.$DOMAIN +ADMIN_TOKEN=$VAULTWARDEN_SECRET +#- SIGNUPS_ALLOWED=false +SMTP_HOST=mail.$DOMAIN +SMTP_FROM=vaultwarden@$DOMAIN +SMTP_PORT=587 +SMTP_SECURITY=starttls +SMTP_USERNAME=fcore +SMTP_PASSWORD=$ADMINPASS +SIGNUPS_ALLOWED=false +SIGNUPS_DOMAINS_WHITELIST=$DOMAIN +SIGNUPS_VERIFY=true +EOF +chmod 600 /federated/apps/vaultwarden/.env + +kill -9 $SPINPID &> /dev/null +echo -ne "done." +} +start_vaultwarden() { + # Start service with command to make sure it's up before proceeding + start_service "vaultwarden" "nc -z 172.99.0.22 80 &> /dev/null" "8" + + kill -9 $SPINPID &> /dev/null + echo -ne "done." +}