Compare commits

11 Commits

34 changed files with 540 additions and 412 deletions

3
.gitmodules vendored
View File

@@ -4,3 +4,6 @@
[submodule "apps/frontend/src"]
path = apps/frontend/src
url = https://gitea.mindboost.team/Mindboost/mindboost-webapp.git
[submodule "apps/tools/invoiceninja/dockerfiles"]
path = apps/tools/invoiceninja/dockerfiles
url = https://github.com/invoiceninja/dockerfiles.git

View File

@@ -111,7 +111,7 @@ Each service's `docker-compose.yml` file references the appropriate `.env` file
services:
backend:
env_file:
- ../../env/${ENVIRONMENT}/backend.env
- ../../env/${ENVIRONMENT:-development}/backend.env
```
## Networking

View File

@@ -0,0 +1,36 @@
### Database (./apps/database/docker-compose.yml)
# - [ ] Create a MariaDB service
# - [ ] Configure volumes for persistent storage of database data
secrets:
mariadb_root:
file: ${ROOT_DIR:-../../..}/env/secrets.env
services:
database:
secrets:
- mariadb_root
profiles: ["all", "database", "backend", "app"]
image: mariadb:latest
container_name: ${INFRASTRUCTURE_LABEL:-default}-mariadb-${ENVIRONMENT:-development}
command: --bind-address=0.0.0.0
env_file:
- ${ROOT_DIR:-../../..}/env/${ENVIRONMENT:-development}/.env.database
volumes:
- backend_mariadb_data:/var/lib/mysql
- ./healthcheck.sh:/usr/local/bin/healthcheck.sh
networks:
- backend
- database
healthcheck:
test: ["CMD", "bash", "/usr/local/bin/healthcheck.sh"]
interval: 1s
retries: 3
# TODO: ADMINER IS NOT PREPARED FOR TRAEFIK
networks:
backend:
name: ${INFRASTRUCTURE_LABEL:-default}-backend-${ENVIRONMENT:-development}
database:
name: ${INFRASTRUCTURE_LABEL:-default}-database-${ENVIRONMENT:-development}
volumes:
backend_mariadb_data:
driver: local
name: ${INFRASTRUCTURE_LABEL:-default}_mariadb_${ENVIRONMENT:-development}

View File

@@ -0,0 +1,33 @@
#!/bin/bash
# Credentials from environment variables
MYSQL_USER="${MARIADB_USER:-default}"
MYSQL_PASSWORD="${MARIADB_PASSWORD:-default}"
MYSQL_HOST="127.0.0.1"
ROOT_PASSWORD=$(cat /run/secrets/mariadb_root)
echo "🔑 READ ROOT PASSWORD FROM SECRETS"
# Check if MariaDB is running
if ! mariadb -h "$MYSQL_HOST" -u root -p"$ROOT_PASSWORD" -e "SELECT 1;" &>/dev/null; then
echo "❌ MariaDB is not responding"
exit 1
fi
# Check if a specific user exists
USER_EXISTS=$(mariadb -h "$MYSQL_HOST" -u root -p"$ROOT_PASSWORD" -e "SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = '${MYSQL_USER}');" | tail -n 1)
if [ "$USER_EXISTS" -ne 1 ]; then
echo "❌ User '${MYSQL_USER}' does not exist"
exit 1
fi
# Check if the user can log in with the provided password
if ! mariadb -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "SELECT 1;" &>/dev/null; then
echo "❌ User '${MYSQL_USER}' exists, but authentication failed with the provided password."
exit 1
fi
echo "✅ MariaDB is healthy"
exit 0

View File

@@ -0,0 +1,74 @@
#!/bin/bash
echo "🔄 Running MariaDB initialization script..."
# Wait until MariaDB is ready
until mysqladmin ping -h localhost --silent; do
sleep 2
done
echo "✅ MariaDB is ready. Checking root credentials..."
# Try logging in with the root password
if ! mysql -u root -p"$MARIADB_ROOT_PASSWORD" -e "SELECT 1;" &>/dev/null; then
echo "❌ ERROR: Root password in .env does not match the database!"
echo "🔄 Attempting to reset the root password..."
# Stop MariaDB safely
echo "⚠️ Stopping MariaDB..."
service mysql stop || pkill mysqld
sleep 5
# Start MariaDB in recovery mode
echo "🚀 Starting MariaDB in recovery mode..."
mysqld_safe --skip-grant-tables --skip-networking &
sleep 5
# Reset root password
echo "🔐 Resetting root password..."
mysql -u root <<EOSQL
ALTER USER 'root'@'localhost' IDENTIFIED BY '${MARIADB_ROOT_PASSWORD}';
ALTER USER 'root'@'%' IDENTIFIED BY '${MARIADB_ROOT_PASSWORD}';
FLUSH PRIVILEGES;
EOSQL
echo "✅ Root password reset successfully!"
# Restart MariaDB in normal mode
echo "🔄 Restarting MariaDB in production mode..."
service mysql stop || pkill mysqld
sleep 3
mysqld_safe &
sleep 5
else
echo "✅ Root password is correct."
fi
# Check if the database exists
DB_EXISTS=$(mysql -u root -p"$MARIADB_ROOT_PASSWORD" -e "SHOW DATABASES LIKE '${MARIADB_DATABASE}';" | grep "${MARIADB_DATABASE}" > /dev/null; echo "$?")
if [ "$DB_EXISTS" -ne 0 ]; then
echo "⚠️ Database '${MARIADB_DATABASE}' does not exist. Creating it now..."
mysql -u root -p"$MARIADB_ROOT_PASSWORD" -e "CREATE DATABASE ${MARIADB_DATABASE};"
echo "✅ Database '${MARIADB_DATABASE}' created!"
else
echo "✅ Database '${MARIADB_DATABASE}' already exists."
fi
# Ensure the database user exists and has the correct password
USER_EXISTS=$(mysql -u root -p"$MARIADB_ROOT_PASSWORD" -e "SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = '${MARIADB_USER}');" | tail -n 1)
if [ "$USER_EXISTS" -eq 0 ]; then
echo "⚠️ User '${MARIADB_USER}' does not exist. Creating it now..."
mysql -u root -p"$MARIADB_ROOT_PASSWORD" <<EOSQL
CREATE USER '${MARIADB_USER}'@'%' IDENTIFIED BY '${MARIADB_PASSWORD}';
GRANT ALL PRIVILEGES ON ${MARIADB_DATABASE}.* TO '${MARIADB_USER}'@'%';
FLUSH PRIVILEGES;
EOSQL
echo "✅ User '${MARIADB_USER}' created and granted access to '${MARIADB_DATABASE}'!"
else
echo "✅ User '${MARIADB_USER}' already exists. Ensuring correct password."
mysql -u root -p"$MARIADB_ROOT_PASSWORD" -e "ALTER USER '${MARIADB_USER}'@'%' IDENTIFIED BY '${MARIADB_PASSWORD}'; FLUSH PRIVILEGES;"
echo "✅ Password for '${MARIADB_USER}' updated!"
fi
echo "🎉 MariaDB initialization complete!"

View File

@@ -0,0 +1,48 @@
### Backend (./apps/backend/docker-compose.yml)
include:
- ./database/docker-compose.yml
services:
backend:
container_name: ${INFRASTRUCTURE_LABEL:-default}-backend-laravel-${ENVIRONMENT:-development}
profiles: ["laravel", "backend", "all", "app"]
ports:
- "${LARAVEL_PORT:-8000}:8000"
- "${LARAVEL_VITE_PORT:-5173}:5173"
env_file:
- ../../env/${ENVIRONMENT:-development}/.env.backend
volumes:
- ./src/entrypoint.sh:/usr/local/bin/entrypoint.sh
depends_on:
- database
build:
context: ./src
dockerfile: Dockerfile
networks:
- backend
labels:
- "traefik.enable=${TRAEFIK_ENABLE:-false}"
- "traefik.http.routers.backend.entrypoints=${TRAEFIK_ENTRYPOINT}"
- "traefik.http.routers.backend.rule=Host(`${BACKEND_DOMAIN}`)"
- "traefik.http.routers.backend.tls=true"
- "traefik.http.routers.backend.tls.certresolver=${TRAEFIK_CERT_RESOLVER}"
- "traefik.http.routers.backend.tls.domains[0].main=`${BACKEND_DOMAIN}`"
- "traefik.http.services.backend.loadbalancer.server.port=${BACKEND_PORT:-8000}"
- "traefik.docker.network=${TRAEFIK_NETWORK}"
backend-redis:
image: redis:alpine
container_name: ${INFRASTRUCTURE_LABEL:-default}-backend-redis-${ENVIRONMENT:-development}
profiles: ["redis", "backend", "all"]
env_file:
- ../../env/${ENVIRONMENT:-development}/.env.backend
restart: unless-stopped
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD:-laravel-redis-passwort} # Redis Passwort eingeben
volumes:
- backend_redis_data:/data
networks:
- backend
volumes:
backend_redis_data:
driver: local
name: "${INFRASTRUCTURE_LABEL}_backend_redis_data"

View File

@@ -1,21 +1,23 @@
### Backend (./apps/backend/docker-compose.yml)
include:
- ./database/docker-compose.yml
services:
backend:
container_name: ${INFRASTRUCTURE_LABEL}-laravel-${ENVIRONMENT}
container_name: ${INFRASTRUCTURE_LABEL:-default}-backend-laravel-${ENVIRONMENT:-development}
profiles: ["laravel", "backend", "all", "app"]
env_file:
- ../../env/.env.all
- ../../env/${ENVIRONMENT}/.env.proxy
- ../../env/${ENVIRONMENT}/.env.database
- ../../env/${ENVIRONMENT}/.env.backend
- ../../env/${ENVIRONMENT:-development}/.env.backend
volumes:
- ./src/entrypoint.sh:/usr/local/bin/entrypoint.sh
depends_on:
- database
build:
context: ./src
dockerfile: Dockerfile
networks:
- backend
labels:
- "traefik.enable=${TRAEFIK_ENABLE}"
- "traefik.enable=${TRAEFIK_ENABLE:-false}"
- "traefik.http.routers.backend.entrypoints=${TRAEFIK_ENTRYPOINT}"
- "traefik.http.routers.backend.rule=Host(`${BACKEND_DOMAIN}`)"
- "traefik.http.routers.backend.tls=true"
@@ -23,14 +25,21 @@ services:
- "traefik.http.routers.backend.tls.domains[0].main=`${BACKEND_DOMAIN}`"
- "traefik.http.services.backend.loadbalancer.server.port=${BACKEND_PORT:-8000}"
- "traefik.docker.network=${TRAEFIK_NETWORK}"
# Traefik-Crowdsec Stack
backend-redis:
image: redis:alpine
container_name: ${INFRASTRUCTURE_LABEL}-laravelredis-${ENVIRONMENT}
container_name: ${INFRASTRUCTURE_LABEL:-default}-backend-redis-${ENVIRONMENT:-development}
profiles: ["redis", "backend", "all"]
env_file:
- ../../env/${ENVIRONMENT:-development}/.env.backend
restart: unless-stopped
command: redis-server --appendonly yes --requirepass laravel-redis-passwort # Redis Passwort eingeben
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD:-laravel-redis-passwort} # Redis Passwort eingeben
volumes:
- ../../volumes/backend/redis:/data
networks:
backend:
- backend_redis_data:/data
networks:
- backend
volumes:
backend_redis_data:
driver: local
name: "${INFRASTRUCTURE_LABEL}_backend_redis_data"

View File

@@ -1,39 +0,0 @@
### Database (./apps/database/docker-compose.yml)
# - [ ] Create a MariaDB service
# - [ ] Configure volumes for persistent storage of database data
# - [ ] Set up environment variables using the new structure (../../env/${ENVIRONMENT:-development}/database.env)
# - [ ] Configure networking to allow connections from the backend service
# - [ ] Set up regular backup jobs for the database
# - [ ] Configure appropriate resource limits and restart policies
services:
database:
profiles: ["all", "mariadb", "backend", "app"]
image: mariadb:latest
container_name: ${INFRASTRUCTURE_LABEL:-default}-mariadb-${ENVIRONMENT:-development}
command: --bind-address=0.0.0.0
env_file:
- ../../env/.env.all
- ../../env/${ENVIRONMENT:-development}/.env.backend
- ../../env/${ENVIRONMENT:-development}/.env.proxy
environment:
- MARIADB_USER=${MARIADB_USER}
- MARIADB_DATABASE=${MARIADB_DATABASE}
- MARIADB_PASSWORD=${MARIADB_PASSWORD}
- MARIADB_ROOT_PASSWORD=root-mindboost
volumes:
- ../../volumes/database/mariadb:/var/lib/mysql
networks:
- backend
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
retries: 3
adminer:
profiles: ["all", "mariadb", "backend", "app"]
image: adminer
container_name: ${INFRASTRUCTURE_LABEL:-default}-adminer-${ENVIRONMENT:-development}
restart: always
ports:
- 8082:8080
networks:
- backend

View File

@@ -14,6 +14,9 @@
## Stellen Sie sicher, dass die .env.all Datei im angegebenen Verzeichnis existiert und den ENVIRONMENT Wert enthält.
##
configs:
all:
file: ../env/.env.all
include:
- path: ./proxy/docker-compose.yml
env_file:
@@ -23,7 +26,6 @@ include:
env_file:
- ../env/.env.all
- ../env/${ENVIRONMENT:-development}/.env.frontend
- ../env/${ENVIRONMENT:-development}/.env.proxy
- path: ./backend/docker-compose.yml
- path: ./database/docker-compose.yml
- path: ./website/docker-compose.yml

View File

@@ -1,65 +0,0 @@
##
## DIESES COMPOSE FILE IST FÜR DIE LOKALE ENTWICKLUNG MITTELS DOCKER
##
## Der Inhalt von frontend und von backend wird über ein volume eingebunden, dass
## bedeutet Änderungen innerhalb der Projektordner ./frontend/src und ./backend/src
## Ändern direkt die Werte innerhalb des Containers wie z.B. das Austauschen einer Grafik.
##
## Datenbank ebenfalls lokal und KEIN reverse-Proxy (traefik)
## Image der DB ist auf ARM Archtektur (Apple Silicon) ausgelegt
##
services:
mariadb:
image: mariadb:latest
container_name: local_mariadb
command: --bind-address=0.0.0.0
environment:
- ALLOW_EMPTY_PASSWORD
- MARIADB_USER=mindboost
- MARIADB_DATABASE=mindboost
- MARIADB_PASSWORD=mindboost
- MARIADB_ROOT_PASSWORD=root-mindboost
volumes:
- ../volumes/daten/mariadb:/var/lib/mysql
networks:
- backend
frontend:
build:
context: ./frontend/src
dockerfile: Dockerfile.dev
container_name: local_frontend
volumes:
- ./frontend/src:/app
- /app/node_modules
ports:
- "3000:3000"
networks:
- backend
environment:
NODE_ENV: development
backend:
build:
context: ./backend/src
dockerfile: Dockerfile.dev
container_name: local_backend
ports:
- "8000:8000"
- "5173:5173"
volumes:
- ./backend/src:/var/www
networks:
- backend
depends_on:
- mariadb
adminer:
image: adminer
container_name: local_adminer
restart: always
ports:
- 8080:8080
networks:
- backend
networks:
backend:
external: false

View File

@@ -1,107 +0,0 @@
##
## DIESES COMPOSE FILE IST FÜR DIE LOKALE ENTWICKLUNG MITTELS DOCKER
##
## Der Inhalt von frontend und von backend wird über ein volume eingebunden, dass
## bedeutet Änderungen innerhalb der Projektordner ./frontend/src und ./backend/src
## Ändern direkt die Werte innerhalb des Containers wie z.B. das Austauschen einer Grafik.
##
## Datenbank ebenfalls lokal und KEIN reverse-Proxy (traefik)
## Image der DB ist auf ARM Archtektur (Apple Silicon) ausgelegt
##
services:
prod-mariadb:
image: mariadb:latest
container_name: prod-mariadb
hostname: mariadb
command: --bind-address=0.0.0.0
env_file:
- ../config/.env.db
networks:
- ${BACKEND_NETWORK}
volumes:
- ../volumes/daten/mariadb:/var/lib/mysql
prod-redis:
image: redis:alpine
container_name: prod-redis
hostname: redis
networks:
- ${BACKEND_NETWORK}
restart: unless-stopped
command: redis-server --appendonly yes --requirepass laravel-redis-passwort # Redis Passwort eingeben
volumes:
- ../volumes/daten/redis:/data
prod-frontend:
build:
context: ./frontend/src
dockerfile: Dockerfile
container_name: prod-frontend
networks:
- ${BACKEND_NETWORK}
- ${TRAEFIK_NETWORK}
env_file:
- ../config/.env.frontend
- ../config/.env.traefik
labels:
- "traefik.enable=${TRAEFIK_ENABLE}"
- "traefik.http.routers.prod-frontend.entrypoints=${TRAEFIK_ROUTER_FRONTEND_ENTRYPOINT}"
- "traefik.http.routers.prod-frontend.rule=${TRAEFIK_ROUTER_FRONTEND_RULE}"
- "traefik.http.routers.prod-frontend.tls=${TRAEFIK_ROUTER_FRONTEND_TLS}"
- "traefik.http.routers.prod-frontend.tls.certresolver=${TRAEFIK_ROUTER_FRONTEND_CERTRESOLVER}"
- "traefik.http.routers.prod-frontend.tls.domains[0].main=${TRAEFIK_ROUTER_FRONTEND_TLS_DOMAIN_MAIN}"
- "traefik.http.routers.prod-frontend.tls.domains[0].sans=${TRAEFIK_ROUTER_FRONTEND_TLS_DOMAIN_SANS}"
- "traefik.http.services.prod-frontend.loadbalancer.server.port=${TRAEFIK_SERVICE_FRONTEND_PORT}"
- "traefik.docker.network=${TRAEFIK_NETWORK}"
prod-backend:
build:
context: ./backend/src
dockerfile: Dockerfile
env_file:
- ../config/.env.backend
- ../config/.env.traefik
labels:
- "traefik.enable=${TRAEFIK_ENABLE}"
- "traefik.http.routers.prod-backend.entrypoints=${TRAEFIK_ROUTER_BACKEND_ENTRYPOINT}"
- "traefik.http.routers.prod-backend.rule=${TRAEFIK_ROUTER_BACKEND_RULE}"
- "traefik.http.routers.prod-backend.tls=${TRAEFIK_ROUTER_BACKEND_TLS}"
- "traefik.http.routers.prod-backend.tls.certresolver=${TRAEFIK_ROUTER_BACKEND_CERTRESOLVER}"
- "traefik.http.routers.prod-backend.tls.domains[0].main=${TRAEFIK_ROUTER_BACKEND_TLS_DOMAIN_MAIN}"
- "traefik.http.services.prod-backend.loadbalancer.server.port=${TRAEFIK_SERVICE_BACKEND_PORT}"
- "traefik.docker.network=${TRAEFIK_NETWORK}"
networks:
- ${BACKEND_NETWORK}
- ${TRAEFIK_NETWORK}
depends_on:
- prod-mariadb
# Traefik-Crowdsec Stack
crowdsec:
extends:
file: ./proxy/docker-compose.yml
service: crowdsec
networks:
- ${TRAEFIK_NETWORK}
traefik:
extends:
file: ./proxy/docker-compose.yml
service: traefik
networks:
- ${TRAEFIK_NETWORK}
depends_on:
- crowdsec
traefik_crowdsec_bouncer:
extends:
file: ./proxy/docker-compose.yml
service: traefik_crowdsec_bouncer
networks:
- ${TRAEFIK_NETWORK}
depends_on:
- crowdsec
- traefik
networks:
prod-backend:
external: false
proxy:
external: true

View File

@@ -0,0 +1,19 @@
services:
webapp:
build:
context: ./src
dockerfile: Dockerfile
args:
BACKEND_URL: ${BACKEND_URL:-http://localhost:8000} # this argument is important on build to set the server url!
container_name: ${INFRASTRUCTURE_LABEL:-default}-frontend-${ENVIRONMENT:-development}
profiles: ["webapp", "frontend", "all", "app"]
ports:
- 3000:3000
labels:
- "traefik.enable=${TRAEFIK_ENABLE:-false}"
- "traefik.http.routers.webapp.service=webapp"
- "traefik.http.routers.webapp.entrypoints=${TRAEFIK_ENTRYPOINT}"
- 'traefik.http.routers.webapp.rule=Host(`${FRONTEND_DOMAIN}`) || Host(`${FRONTEND_DOMAIN_2}`)'
- "traefik.http.services.webapp.loadbalancer.server.port=3000"
- "traefik.docker.network=${TRAEFIK_NETWORK}"

View File

@@ -1,27 +1,17 @@
### Frontend (./apps/frontend/docker-compose.yml)
# - [ ] Create a Vue.js frontend service
# - [ ] Set up a Node.js environment for the frontend
# - [ ] Configure volumes for persistent storage of frontend assets
# - [ ] Set up environment variables using the new structure (../../env/${ENVIRONMENT:-development}/frontend.env)
# - [ ] Configure networking to communicate with the backend service
# - [ ] Set up healthchecks for the frontend service
services:
webapp:
build:
context: ./src
dockerfile: Dockerfile
args:
BACKEND_URL: ${BACKEND_URL:-http://localhost:8000} # this argument is important on build to set the backend server url!
container_name: ${INFRASTRUCTURE_LABEL:-default}-frontend-${ENVIRONMENT:-development}
profiles: ["webapp", "frontend", "all", "app"]
depends_on:
- database
- backend
labels:
- "traefik.enable=${TRAEFIK_ENABLE}"
- "traefik.enable=${TRAEFIK_ENABLE:-false}"
- "traefik.http.routers.webapp.service=webapp"
- "traefik.http.routers.webapp.entrypoints=${TRAEFIK_ENTRYPOINT}"
- 'traefik.http.routers.webapp.rule=Host(`${FRONTEND_DOMAIN}`) || Host(`${FRONTEND_DOMAIN_2}`)'
- "traefik.http.routers.webapp.tls=true"
- "traefik.http.routers.webapp.tls.certresolver=${TRAEFIK_CERT_RESOLVER}"
- "traefik.http.routers.webapp.tls.domains[0].main=${FRONTEND_DOMAIN}"
- "traefik.http.routers.webapp.tls.domains[0].sans=${FRONTEND_DOMAIN_2}"
- "traefik.http.services.webapp.loadbalancer.server.port=3000"
- "traefik.docker.network=${TRAEFIK_NETWORK}"
- "traefik.docker.network=${TRAEFIK_NETWORK}"

View File

@@ -5,63 +5,7 @@
# - [ ] Configure networking to expose these services to the internet via the proxy
# - [ ] Set up regular backup jobs for critical data in these services
services:
nextcloud-db:
image: mariadb:10.6
container_name: ${INFRASTRUCTURE_LABEL:-default}-nextcloud-db-${ENVIRONMENT:-development}
profiles: ["all", "tools", "nextcloud"]
command: --transaction-isolation=READ-COMMITTED --innodb_read_only_compressed=OFF
restart: unless-stopped
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ../../volumes/tools/${INFRASTRUCTURE_LABEL:-default}_cloud/database:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=headpiece-constant1-denim-mindboost #SQL root Passwort eingeben
- MYSQL_PASSWORD=idealist9-frayed-murkiness-mindboost #SQL Benutzer Passwort eingeben
- MYSQL_DATABASE=nextcloud-mindboost #Datenbank Name
- MYSQL_USER=mindboostcloud #SQL Nutzername
- MYSQL_INITDB_SKIP_TZINFO=1
- MARIADB_AUTO_UPGRADE=1
nextcloud-redis:
image: redis:alpine
container_name: ${INFRASTRUCTURE_LABEL:-default}-nextcloud-redis-${ENVIRONMENT:-development}
profiles: ["all", "tools", "nextcloud"]
hostname: nextcloud-redis
restart: unless-stopped
command: redis-server --requirepass redis-mindboost-passwort # Redis Passwort eingeben
cloud:
image: nextcloud
container_name: ${INFRASTRUCTURE_LABEL:-default}-nextcloud-app-${ENVIRONMENT:-development}
profiles: ["all", "tools", "nextcloud"]
restart: unless-stopped
depends_on:
- nextcloud-db
- nextcloud-redis
environment:
TRUSTED_PROXIES: 172.16.255.254/16
OVERWRITEPROTOCOL: https
OVERWRITECLIURL: https://${CLOUD_DOMAIN:-cloud}
OVERWRITEHOST: ${CLOUD_DOMAIN:-cloud}
REDIS_HOST: nextcloud-redis
REDIS_HOST_PASSWORD: redis-mindboost-passwort # Redis Passwort von oben wieder eingeben
volumes:
- ./app:/var/www/html
- ../../volumes/tools/${INFRASTRUCTURE_LABEL:-default}_cloudapp/:/var/www/html/data
labels:
- "traefik.enable=true"
- "traefik.http.routers.${INFRASTRUCTURE_LABEL:-default}_cloud.entrypoints=websecure"
- "traefik.http.routers.${INFRASTRUCTURE_LABEL:-default}_cloud.rule=Host(`${CLOUD_DOMAIN}`)"
- "traefik.http.routers.${INFRASTRUCTURE_LABEL:-default}_cloud.tls=true"
- "traefik.http.routers.${INFRASTRUCTURE_LABEL:-default}_cloud.tls.certresolver=http_resolver"
- 'traefik.http.routers.${INFRASTRUCTURE_LABEL:-default}_cloud.service=cloud'
- "traefik.http.services.cloud.loadbalancer.server.port=80"
- "traefik.docker.network=${TRAEFIK_NETWORK:-default}"
- "traefik.http.routers.${INFRASTRUCTURE_LABEL:-default}_cloud.middlewares=nextcloud-dav,default@file"
- "traefik.http.middlewares.nextcloud-dav.replacepathregex.regex=^/.well-known/ca(l|rd)dav"
- "traefik.http.middlewares.nextcloud-dav.replacepathregex.replacement=/remote.php/dav/"
networks:
- ${TRAEFIK_NETWORK}
networks:
nextcloud:
name: ${INFRASTRUCTURE_LABEL:-default}_nextcloud
include:
- path: ./nextcloud/docker-compose.yml
- path: ./limesurvey/docker-compose.yml
- path: ./invoiceninja/dockerfiles/debian/docker-compose.yml

View File

View File

@@ -0,0 +1,59 @@
services:
nextcloud-db:
image: mariadb:10.6
container_name: ${INFRASTRUCTURE_LABEL:-default}-nextcloud-db-${ENVIRONMENT:-development}
profiles: ["all", "tools", "nextcloud"]
command: --transaction-isolation=READ-COMMITTED --innodb_read_only_compressed=OFF
restart: unless-stopped
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ../../volumes/tools/${INFRASTRUCTURE_LABEL:-default}_cloud/database:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=headpiece-constant1-denim-mindboost #SQL root Passwort eingeben
- MYSQL_PASSWORD=idealist9-frayed-murkiness-mindboost #SQL Benutzer Passwort eingeben
- MYSQL_DATABASE=nextcloud-mindboost #Datenbank Name
- MYSQL_USER=mindboostcloud #SQL Nutzername
- MYSQL_INITDB_SKIP_TZINFO=1
- MARIADB_AUTO_UPGRADE=1
nextcloud-redis:
image: redis:alpine
container_name: ${INFRASTRUCTURE_LABEL:-default}-nextcloud-redis-${ENVIRONMENT:-development}
profiles: ["all", "tools", "nextcloud"]
hostname: nextcloud-redis
restart: unless-stopped
command: redis-server --requirepass redis-mindboost-passwort # Redis Passwort eingeben
cloud:
image: nextcloud
container_name: ${INFRASTRUCTURE_LABEL:-default}-nextcloud-app-${ENVIRONMENT:-development}
profiles: ["all", "tools", "nextcloud"]
restart: unless-stopped
depends_on:
- nextcloud-db
- nextcloud-redis
environment:
TRUSTED_PROXIES: 172.16.255.254/16
OVERWRITEPROTOCOL: https
OVERWRITECLIURL: https://${CLOUD_DOMAIN:-cloud}
OVERWRITEHOST: ${CLOUD_DOMAIN:-cloud}
REDIS_HOST: nextcloud-redis
REDIS_HOST_PASSWORD: redis-mindboost-passwort # Redis Passwort von oben wieder eingeben
volumes:
- ../../volumes/tools/${INFRASTRUCTURE_LABEL:-default}_cloudapp/:/var/www/html/data
labels:
- "traefik.enable=true"
- "traefik.http.routers.${INFRASTRUCTURE_LABEL:-default}_cloud.entrypoints=websecure"
- "traefik.http.routers.${INFRASTRUCTURE_LABEL:-default}_cloud.rule=Host(`${CLOUD_DOMAIN}`)"
- "traefik.http.routers.${INFRASTRUCTURE_LABEL:-default}_cloud.tls=true"
- "traefik.http.routers.${INFRASTRUCTURE_LABEL:-default}_cloud.tls.certresolver=http_resolver"
- 'traefik.http.routers.${INFRASTRUCTURE_LABEL:-default}_cloud.service=cloud'
- "traefik.http.services.cloud.loadbalancer.server.port=80"
- "traefik.docker.network=${TRAEFIK_NETWORK:-default}"
- "traefik.http.routers.${INFRASTRUCTURE_LABEL:-default}_cloud.middlewares=nextcloud-dav,default@file"
- "traefik.http.middlewares.nextcloud-dav.replacepathregex.regex=^/.well-known/ca(l|rd)dav"
- "traefik.http.middlewares.nextcloud-dav.replacepathregex.replacement=/remote.php/dav/"
networks:
- ${TRAEFIK_NETWORK}
networks:
nextcloud:
name: ${INFRASTRUCTURE_LABEL:-default}_nextcloud

View File

@@ -7,17 +7,26 @@ services:
container_name: ${INFRASTRUCTURE_LABEL:-default}-kirbycms-${ENVIRONMENT:-development}
profiles: ["website","kirbycms","all"]
volumes:
- ../../volumes/website/kirbycms:/var/www/html:rw # Persistente Daten
- kirbycms_data:/var/www/html:rw # Persistente Daten
restart: unless-stopped
ports:
- 0:80
networks:
- ${TRAEFIK_NETWORK}
- ${TRAEFIK_NETWORK:-default}
labels:
- "traefik.enable=${TRAEFIK_ENABLE}"
- "traefik.docker.network=${TRAEFIK_NETWORK}"
- "traefik.enable=${TRAEFIK_ENABLE:-false}"
- "traefik.docker.network=${TRAEFIK_NETWORK:-default}"
- "traefik.http.routers.kirbycms.service=kirbycms"
- "traefik.http.routers.kirbycms.tls.certresolver=${TRAEFIK_CERT_RESOLVER}"
- "traefik.http.routers.kirbycms.tls.domains[0].main=`${WEBSITE_DOMAIN}`"
- "traefik.http.routers.kirbycms.rule=Host(`${WEBSITE_DOMAIN}`)"
- "traefik.http.routers.kirbycms.entrypoints=${TRAEFIK_ENTRYPOINT}"
- "traefik.http.routers.kirbycms.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-default}"
- "traefik.http.routers.kirbycms.tls.domains[0].main=`${WEBSITE_DOMAIN:-kirby.local}`"
- "traefik.http.routers.kirbycms.rule=Host(`${WEBSITE_DOMAIN:-kirby.local}`)"
- "traefik.http.routers.kirbycms.entrypoints=${TRAEFIK_ENTRYPOINT:-default}"
- "traefik.http.routers.kirbycms.tls=true"
- "traefik.http.services.kirbycms.loadbalancer.server.port=80"
volumes:
kirbycms_data:
driver: local
driver_opts:
type: none
o: bind
device: /mnt/docker-volumes/website/kirbycms # Neuer fester Speicherort

49
env/.env.backend vendored
View File

@@ -1,49 +0,0 @@
# ----------------------------------
# Datenbank (MariaDB)
# ----------------------------------
MARIADB_USER=mindboost
MARIADB_DATABASE=mindboost
MARIADB_PASSWORD=1stronges-mindboostdb-passwort
MARIADB_ROOT_PASSWORD=1stronges-passwort-fuer-diedb
# ----------------------------------
# Redis
# ----------------------------------
REDIS_PASSWORD=laravel-redis-passwort
REDIS_PORT=6379
# ----------------------------------
# Vue Frontend (Nuxt.js)
# ----------------------------------
VUE_APP_BACKEND_HOST_ADDRESS=https://dev.b.mindboost.team
VUE_FRONTEND_PORT=3001
VUE_INTERNAL_PORT=3000
VUE_FRONTEND_DOMAIN_1=app.mindboost.team
VUE_FRONTEND_DOMAIN_2=mindboost.app
# ----------------------------------
# Laravel Backend
# ----------------------------------
BACKEND_NETWORK=backend
APP_NAME="mindboost backend - Compose Deployment"
APP_URL=https://b.mindboost.team
LARAVEL_PORT=8000
LARAVEL_VITE_PORT=5173
DB_HOST=mariadb
DB_PORT=3306
DB_PASSWORD=1stronges-mindboostdb-passwort
DB_USERNAME=mindboost
DB_DATABASE=mindboost
LARAVEL_DOMAIN=b.mindboost.team
JWT_SECRET=zMtO8sgsnc4UixWSsYWE1pK9EdpNLzxNSoIPlUpTe6dDlarM3bu4cwM80tH3jA0F
# ----------------------------------
# Traefik
# ----------------------------------
TRAEFIK_CERT_RESOLVER=http_resolver
TRAEFIK_ENTRYPOINT=websecure
TRAEFIK_NETWORK=proxy
# ----------------------------------
# Adminer
# ----------------------------------
ADMINER_PORT=8080

8
env/.env.db vendored
View File

@@ -1,8 +0,0 @@
# ----------------------------------
# Datenbank (MariaDB)
# ----------------------------------
MARIADB_USER=mindboost
MARIADB_DATABASE=mindboost
MARIADB_PASSWORD=1stronges-mindboostdb-passwort
MARIADB_ROOT_PASSWORD=1stronges-passwort-fuer-diedb
ADMINER_PORT=8000

1
env/.env.frontend vendored
View File

@@ -1 +0,0 @@
DB_HOST= BLALBLAB

1
env/.env.shared vendored
View File

@@ -1 +0,0 @@
DB_HOST= BLALBLAB

24
env/.env.traefik vendored
View File

@@ -1,24 +0,0 @@
# ----------------------------------
# Traefik
# ----------------------------------
# Allgemein
TRAEFIK_ENABLE=true
TRAEFIK_NETWORK=proxy
# Backend
TRAEFIK_ROUTER_BACKEND_ENTRYPOINT=websecure
TRAEFIK_ROUTER_BACKEND_RULE=Host(`b.mindboost.team`)
TRAEFIK_ROUTER_BACKEND_TLS=true
TRAEFIK_ROUTER_BACKEND_CERTRESOLVER=http_resolver
TRAEFIK_ROUTER_BACKEND_TLS_DOMAIN_MAIN=b.mindboost.team
TRAEFIK_SERVICE_BACKEND_PORT=8000
# Frontend
TRAEFIK_ROUTER_FRONTEND_ENTRYPOINT=websecure
TRAEFIK_ROUTER_FRONTEND_RULE=Host(`app.mindboost.team`)
TRAEFIK_ROUTER_FRONTEND_TLS=true
TRAEFIK_ROUTER_FRONTEND_CERTRESOLVER=http_resolver
TRAEFIK_ROUTER_FRONTEND_TLS_DOMAIN_MAIN=app.mindboost.team
TRAEFIK_ROUTER_FRONTEND_TLS_DOMAIN_SANS=mindboost.app
TRAEFIK_SERVICE_FRONTEND_PORT=3000

View File

@@ -11,16 +11,21 @@ SERVER_IP=${SERVER_IP:-localhost}
# Laravel Backend
# ----------------------------------
BACKEND_NETWORK=backend
APP_ENV=${ENVIRONMENT-local}
APP_NAME="mindboost backend - Compose Deployment"
APP_URL=https://backend.local
LARAVEL_PORT=8000
LARAVEL_VITE_PORT=5173
DB_HOST=${MARIADB_HOST:-database}
DB_PORT=${MARIADB_PORT:-3306}
DB_PASSWORD=${MARIADB_PASSWORD:-default}
DB_USERNAME=${MARIADB_USER:-default}
DB_DATABASE=${MARIADB_DATABASE:-default}
JWT_SECRET=zMtO8sgsnc4UixWSsYWE1pK9EdpNLzxNSoIPlUpTe6dDlarM3bu4cwM80tH3jA0F
# ----------------------------------
# Datenbank Zugriff - ! MUSS MIT .env.database übereinstimmen
# ----------------------------------
DB_HOST=database
DB_PORT=3306
DB_PASSWORD=1stronges-mindboostdb-passwort
DB_USERNAME=${INFRASTRUCTURE_LABEL:-default}_${ENVIRONMENT:-development}
DB_DATABASE=${INFRASTRUCTURE_LABEL:-default}_${ENVIRONMENT:-development}

View File

@@ -3,12 +3,7 @@
# ----------------------------------
MARIADB_USER=${INFRASTRUCTURE_LABEL:-default}_${ENVIRONMENT:-development}
MARIADB_DATABASE=${INFRASTRUCTURE_LABEL:-default}_${ENVIRONMENT:-development}
MARIADB_ROOT_PASSWORD_FILE=/run/secrets/mariadb_root
MARIADB_PASSWORD=1stronges-mindboostdb-passwort
MARIADB_RANDOM_ROOT_PASSWORD=1
MARIADB_PORT=3306
MARIADB_HOST=database
# ----------------------------------
# Adminer
# ----------------------------------
ADMINER_PORT=8082

View File

@@ -1,5 +1,4 @@
# ----------------------------------
# VUE APP
# ----------------------------------
BACKEND_URL="backend.local"
BACKEND_URL="backend.local"

View File

@@ -1,8 +1,8 @@
# ----------------------------------
# TRAEFIK
# ----------------------------------
TRAEFIK_ENABLE=false
TRAEFIK_ENABLE=true
TRAEFIK_NETWORK=proxy
TRAEFIK_BASIC_AUTH_USERS=${ADMIN_USER}:${ADMIN_PASSWORD_HASH}
TRAEFIK_CERT_RESOLVER=
@@ -14,6 +14,7 @@ FRONTEND_DOMAIN=frontend.local
FRONTEND_DOMAIN_2=app.frontend.local
BACKEND_DOMAIN=backend.local
WEBSITE_DOMAIN=web.local
ADMINER_DOMAIN=adminer.local
GITEA_DOMAIN=gitea.local
LIMESURVEY_DOMAIN=survey.local
LINKSTACK_DOMAIN=linkstack.local

View File

@@ -0,0 +1,3 @@
source ./../setup/set-global-env.sh
source ./../setup/set-frontend-env.sh
docker compose -f ./../../apps/frontend/docker-compose.overwrite.yml --env-file ./../../env/${ENVIRONMENT}/.env.frontend --profile frontend up

View File

@@ -3,7 +3,13 @@
# 🚀 Script to Generate Secure Secrets for Deployment
# Define root directory relative to the script location
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
# Stelle sicher, dass ROOT_DIR gesetzt ist
if [ -z "$ROOT_DIR" ]; then
echo "❌ WARN: ROOT_DIR ist nicht gesetzt! Setze ROOT_DIR..."
source ./set-project-root.sh
fi
SECRET_FILE="$ROOT_DIR/env/secrets.env"
GITIGNORE_FILE="$ROOT_DIR/.gitignore"

View File

@@ -0,0 +1,59 @@
#!/bin/bash
# Stelle sicher, dass ROOT_DIR gesetzt ist
if [ -z "$ROOT_DIR" ]; then
echo "❌ WARN: ROOT_DIR ist nicht gesetzt! Setze ROOT_DIR..."
# Bestimme das Root-Verzeichnis des Git-Repos
ROOT_DIR=$(git rev-parse --show-toplevel 2>/dev/null)
# Falls das Repository nicht gefunden wurde, abbrechen
if [ -z "$ROOT_DIR" ]; then
echo "❌ Fehler: Kein Git-Repository gefunden!"
exit 1
fi
# Setze die Variable für die aktuelle Shell-Sitzung
export ROOT_DIR
echo "✅ ROOT_DIR gesetzt auf: $ROOT_DIR"
fi
# Setze den Pfad zur .env.all Datei relativ zum Projekt-Root
ENV_FILE="$ROOT_DIR/env/development/.env.frontend"
# Prüfen, ob die Datei existiert
if [ ! -f "$ENV_FILE" ]; then
echo "❌ Fehler: Die Datei $ENV_FILE existiert nicht!"
exit 1
fi
echo "✅ ENV-Datei vorhanden: $ENV_FILE"
# Funktion: Alle Variablen exportieren
export_env_vars() {
while IFS='=' read -r key value; do
# Entferne führende und nachfolgende Leerzeichen
key=$(echo "$key" | xargs)
value=$(echo "$value" | xargs)
# Falls die Zeile ein Kommentar oder leer ist, überspringen
if [[ -z "$key" || "$key" =~ ^# || -z "$value" ]]; then
continue
fi
# Exportiere die Variable
export "$key=$value"
done < "$ENV_FILE"
}
# Alle Variablen exportieren
export_env_vars
echo "🔹 Geladene Variablen:"
grep -o '^[^#]*' "$ENV_FILE" | cut -d '=' -f1 | while read -r var; do
echo "$var=${!var}" # Gibt die gesetzten Variablen mit ihrem Wert aus
done

View File

@@ -0,0 +1,54 @@
#!/bin/bash
# Stelle sicher, dass ROOT_DIR gesetzt ist
if [ -z "$ROOT_DIR" ]; then
echo "❌ WARN: ROOT_DIR ist nicht gesetzt! Setze ROOT_DIR..."
source ./set-project-root.sh
fi
# Setze den Pfad zur .env.all Datei relativ zum Projekt-Root
ENV_FILE="$ROOT_DIR/env/.env.all"
# Prüfen, ob die Datei existiert
if [ ! -f "$ENV_FILE" ]; then
echo "❌ Fehler: Die Datei $ENV_FILE existiert nicht!"
exit 1
fi
echo "✅ ENV-Datei vorhanden: $ENV_FILE"
# Funktion: Alle Variablen exportieren
export_env_vars() {
while IFS='=' read -r key value; do
# Entferne führende und nachfolgende Leerzeichen
key=$(echo "$key" | xargs)
value=$(echo "$value" | xargs)
# Falls die Zeile ein Kommentar oder leer ist, überspringen
if [[ -z "$key" || "$key" =~ ^# || -z "$value" ]]; then
continue
fi
# Entferne umschließende Anführungszeichen, falls vorhanden
value=$(echo "$value" | sed -E 's/^"(.*)"$/\1/')
# Exportiere die Variable
export "$key=$value"
done < "$ENV_FILE"
}
# Alle Variablen exportieren
export_env_vars
export SERVER_IP=$(curl -s https://api.ipify.org)
echo "🔹 Geladene Variablen:"
grep -o '^[^#]*' "$ENV_FILE" | cut -d '=' -f1 | while read -r var; do
echo "$var=${!var}" # Gibt die gesetzten Variablen mit ihrem Wert aus
done

View File

@@ -0,0 +1,14 @@
#!/bin/bash
# Bestimme das Root-Verzeichnis des Git-Repos
ROOT_DIR=$(git rev-parse --show-toplevel 2>/dev/null)
# Falls das Repository nicht gefunden wurde, abbrechen
if [ -z "$ROOT_DIR" ]; then
echo "❌ Fehler: Kein Git-Repository gefunden!"
exit 1
fi
# Setze die Variable für die aktuelle Shell-Sitzung
export ROOT_DIR
echo "✅ ROOT_DIR gesetzt auf: $ROOT_DIR"

View File

@@ -0,0 +1,60 @@
#!/bin/bash
# Stelle sicher, dass ROOT_DIR gesetzt ist
if [ -z "$ROOT_DIR" ]; then
echo "❌ WARN: ROOT_DIR ist nicht gesetzt! Setze ROOT_DIR..."
source ./set-project-root.sh
fi
# Stelle sicher, dass ENVIRONMENT gesetzt ist
if [ -z "$ENVIRONMENT" ]; then
echo "❌ WARN: ENVIRONMENT ist nicht gesetzt! Setze ENVIRONMENT..."
source ./set-global-env.sh
fi
# Setze den Pfad zur .env.all Datei relativ zum Projekt-Root
ENV_FILE="$ROOT_DIR/env/${ENVIRONMENT}/.env.proxy"
# Prüfen, ob die Datei existiert
if [ ! -f "$ENV_FILE" ]; then
echo "❌ Fehler: Die Datei $ENV_FILE existiert nicht!"
exit 1
fi
echo "✅ ENV-Datei vorhanden: $ENV_FILE"
# Funktion: Alle Variablen exportieren
export_env_vars() {
while IFS='=' read -r key value; do
# Entferne führende und nachfolgende Leerzeichen
key=$(echo "$key" | xargs)
value=$(echo "$value" | xargs)
# Falls die Zeile ein Kommentar oder leer ist, überspringen
if [[ -z "$key" || "$key" =~ ^# || -z "$value" ]]; then
continue
fi
# Entferne umschließende Anführungszeichen, falls vorhanden
value=$(echo "$value" | sed -E 's/^"(.*)"$/\1/')
# Exportiere die Variable
export "$key=$value"
done < "$ENV_FILE"
}
# Alle Variablen exportieren
export_env_vars
export SERVER_IP=$(curl -s https://api.ipify.org)
echo "🔹 Geladene Variablen:"
grep -o '^[^#]*' "$ENV_FILE" | cut -d '=' -f1 | while read -r var; do
echo "$var=${!var}" # Gibt die gesetzten Variablen mit ihrem Wert aus
done