initial plugins
@@ -0,0 +1,28 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
bitwarden:
|
||||
image: vaultwarden/server:latest
|
||||
container_name: mistborn_production_bitwarden
|
||||
env_file:
|
||||
- ../.envs/.production/.bitwarden
|
||||
volumes:
|
||||
- ../../mistborn_volumes/extra/bitwarden:/data
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.bitwarden-http.rule=Host(`bitwarden.mistborn`)"
|
||||
- "traefik.http.routers.bitwarden-http.entrypoints=web"
|
||||
- "traefik.http.routers.bitwarden-http.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.bitwarden-https.rule=Host(`bitwarden.mistborn`)"
|
||||
- "traefik.http.routers.bitwarden-https.entrypoints=websecure"
|
||||
- "traefik.http.routers.bitwarden-https.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.bitwarden-https.tls.certresolver=basic"
|
||||
- "traefik.http.services.bitwarden-service.loadbalancer.server.port=80"
|
||||
ports:
|
||||
- "${MISTBORN_BIND_IP}:3012:3012/tcp"
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
default:
|
||||
external:
|
||||
name: mistborn_default
|
||||
@@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
# generate bitwarden .env files
|
||||
BITWARDEN_PROD_FILE="$1"
|
||||
echo "WEBSOCKET_ENABLED=true" > $BITWARDEN_PROD_FILE
|
||||
echo "SIGNUPS_ALLOWED=true" >> $BITWARDEN_PROD_FILE
|
||||
chmod 600 $BITWARDEN_PROD_FILE
|
||||
|
After Width: | Height: | Size: 23 KiB |
@@ -0,0 +1,9 @@
|
||||
[DEFAULT]
|
||||
name = bitwarden
|
||||
subdomain = bitwarden
|
||||
desc = Bitwarden is a free and open-source password management service that stores sensitive information such as website credentials in an encrypted vault. The Bitwarden platform offers a variety of client applications including a web interface, desktop applications, browser extensions, mobile apps, and a CLI.
|
||||
img = img/bitwarden.png
|
||||
compose = compose/docker-compose.yml
|
||||
service = service/plugin.service
|
||||
environment = environment/environment.sh
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
[Unit]
|
||||
Description=Mistborn Bitwarden Service
|
||||
Requires=Mistborn-base.service
|
||||
After=Mistborn-base.service
|
||||
PartOf=Mistborn-base.service
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
RestartSec=15
|
||||
User=root
|
||||
Group=docker
|
||||
PermissionsStartOnly=true
|
||||
# Shutdown container (if running) when unit is stopped
|
||||
ExecStartPre=/opt/mistborn/scripts/wrappers/mistborn_docker.sh bitwarden docker-compose -f /opt/mistborn/extra/bitwarden.yml down
|
||||
|
||||
ExecStartPre=/sbin/iptables -w -I DOCKER-USER -i DIFACE -p tcp --dport 3012 -j MISTBORN_LOG_DROP
|
||||
# Start container when unit is started
|
||||
ExecStart=/opt/mistborn/scripts/wrappers/mistborn_docker.sh bitwarden docker-compose -f /opt/mistborn/extra/bitwarden.yml up --build
|
||||
# Stop container when unit is stopped
|
||||
ExecStop=/opt/mistborn/scripts/wrappers/mistborn_docker.sh bitwarden docker-compose -f /opt/mistborn/extra/bitwarden.yml down
|
||||
# Post stop
|
||||
ExecStopPost=-/sbin/iptables -D DOCKER-USER -i DIFACE -p tcp --dport 3012 -j MISTBORN_LOG_DROP
|
||||
|
||||
[Install]
|
||||
WantedBy=Mistborn-base.service
|
||||
@@ -0,0 +1,30 @@
|
||||
version: '3.7'
|
||||
|
||||
services:
|
||||
|
||||
elasticsearch:
|
||||
image: amazon/opendistro-for-elasticsearch:1.13.2
|
||||
hostname: elasticsearch
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "${MISTBORN_BIND_IP}:9200:9200"
|
||||
environment:
|
||||
- discovery.type=single-node
|
||||
- cluster.name=mistborn-cluster
|
||||
- network.host=0.0.0.0
|
||||
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
|
||||
- bootstrap.memory_lock=true
|
||||
volumes:
|
||||
- ../../mistborn_volumes/extra/elasticsearch/init/internal_users.yml:/usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml
|
||||
ulimits:
|
||||
memlock:
|
||||
soft: -1
|
||||
hard: -1
|
||||
nofile:
|
||||
soft: 65536
|
||||
hard: 65536
|
||||
|
||||
networks:
|
||||
default:
|
||||
external:
|
||||
name: mistborn_default
|
||||
@@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Elasticsearch
|
||||
ELASTICSEARCH_PROD_FILE="$1"
|
||||
echo "MISTBORN_DEFAULT_PASSWORD=$MISTBORN_DEFAULT_PASSWORD" >> $ELASTICSEARCH_PROD_FILE
|
||||
chmod 600 $ELASTICSEARCH_PROD_FILE
|
||||
@@ -0,0 +1,8 @@
|
||||
[DEFAULT]
|
||||
name = elasticsearch
|
||||
subdomain = elasticsearch
|
||||
compose = compose/docker-compose.yml
|
||||
service = service/plugin.service
|
||||
environment = environment/environment.sh
|
||||
resources = resources
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
---
|
||||
# This is the internal user database
|
||||
# The hash value is a bcrypt hash and can be generated with plugin/tools/hash.sh
|
||||
|
||||
_meta:
|
||||
type: "internalusers"
|
||||
config_version: 2
|
||||
|
||||
# Define your internal users here
|
||||
|
||||
mistborn:
|
||||
hash: "__MISTBORN_HASH__"
|
||||
reserved: true
|
||||
backend_roles:
|
||||
- "admin"
|
||||
description: "Mistborn user"
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
if [[ -f "/opt/mistborn_volumes/extra/elasticsearch/init/internal_users.yml" ]]; then
|
||||
echo "internal_users.yml exists. Proceeding."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
mkdir -p /opt/mistborn_volumes/extra/elasticsearch/init/ >/dev/null 2>&1
|
||||
chmod -R +x /opt/mistborn_volumes/extra/elasticsearch/init/
|
||||
cp /opt/mistborn/scripts/services/elasticsearch/files/internal_users.yml /opt/mistborn_volumes/extra/elasticsearch/init/
|
||||
|
||||
ELASTICSEARCH_MISTBORN_HASHED="$(docker run --rm amazon/opendistro-for-elasticsearch:1.12.0 bash /usr/share/elasticsearch/plugins/opendistro_security/tools/hash.sh -p ${MISTBORN_DEFAULT_PASSWORD} | tr -d '\n')"
|
||||
|
||||
if [[ -z "${ELASTICSEARCH_MISTBORN_HASHED}" ]]; then
|
||||
echo "Elasticsearch password hash not generated properly"
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
sed -i "s|__MISTBORN_HASH__|${ELASTICSEARCH_MISTBORN_HASHED}|" /opt/mistborn_volumes/extra/elasticsearch/init/internal_users.yml
|
||||
@@ -0,0 +1,22 @@
|
||||
[Unit]
|
||||
Description=Mistborn Elasticsearch Service
|
||||
Requires=Mistborn-base.service
|
||||
After=Mistborn-base.service
|
||||
PartOf=Mistborn-base.service
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
RestartSec=15
|
||||
User=root
|
||||
Group=docker
|
||||
PermissionsStartOnly=true
|
||||
# Shutdown container (if running) when unit is stopped
|
||||
ExecStartPre=/usr/sbin/sysctl -w vm.max_map_count=262144
|
||||
ExecStartPre=/opt/mistborn/scripts/wrappers/mistborn_docker.sh elasticsearch docker-compose -f /opt/mistborn/extra/elasticsearch.yml down
|
||||
# Start container when unit is started
|
||||
ExecStart=/opt/mistborn/scripts/wrappers/mistborn_docker.sh elasticsearch docker-compose -f /opt/mistborn/extra/elasticsearch.yml up --build
|
||||
# Stop container when unit is stopped
|
||||
ExecStop=/opt/mistborn/scripts/wrappers/mistborn_docker.sh elasticsearch docker-compose -f /opt/mistborn/extra/elasticsearch.yml down
|
||||
|
||||
[Install]
|
||||
WantedBy=Mistborn-base.service
|
||||
@@ -0,0 +1,72 @@
|
||||
version: '3'
|
||||
|
||||
# services
|
||||
services:
|
||||
# guacd
|
||||
guacd:
|
||||
container_name: mistborn_production_guacd
|
||||
image: guacamole/guacd:1.3.0
|
||||
networks:
|
||||
guacnetwork:
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ../../mistborn_volumes/extra/guacamole/drive:/drive:rw
|
||||
- ../../mistborn_volumes/extra/guacamole/record:/record:rw
|
||||
|
||||
|
||||
# postgres
|
||||
guac_postgres:
|
||||
container_name: mistborn_production_guac_postgres
|
||||
env_file:
|
||||
- ../.envs/.production/.guacamole
|
||||
environment:
|
||||
PGDATA: /var/lib/postgresql/data/guacamole
|
||||
image: postgres
|
||||
networks:
|
||||
guacnetwork:
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ../../mistborn_volumes/extra/guacamole/init:/docker-entrypoint-initdb.d:ro
|
||||
- ../../mistborn_volumes/extra/guacamole/data:/var/lib/postgresql/data:rw
|
||||
|
||||
|
||||
# guacamole
|
||||
guacamole:
|
||||
container_name: mistborn_production_guacamole
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.guacamole-http.rule=Host(`guac.mistborn`)"
|
||||
- "traefik.http.routers.guacamole-http.entrypoints=web"
|
||||
- "traefik.http.routers.guacamole-http.middlewares=mistborn_auth@file,add-guacamole"
|
||||
- "traefik.http.routers.guacamole-https.rule=Host(`guac.mistborn`)"
|
||||
- "traefik.http.routers.guacamole-https.entrypoints=websecure"
|
||||
- "traefik.http.routers.guacamole-https.middlewares=mistborn_auth@file,add-guacamole"
|
||||
- "traefik.http.routers.guacamole-https.tls.certresolver=basic"
|
||||
- "traefik.http.middlewares.add-guacamole.addPrefix.prefix=/guacamole"
|
||||
- "traefik.http.services.guacamole-service.loadbalancer.server.port=8080"
|
||||
depends_on:
|
||||
- guacd
|
||||
- guac_postgres
|
||||
environment:
|
||||
GUACD_HOSTNAME: guacd
|
||||
GUACD_PORT: 4822
|
||||
#GUACAMOLE_HOME: /config
|
||||
env_file:
|
||||
- ../.envs/.production/.guacamole
|
||||
image: guacamole/guacamole:1.3.0
|
||||
links:
|
||||
- guacd
|
||||
networks:
|
||||
guacnetwork:
|
||||
#ports:
|
||||
## enable next line if not using nginx
|
||||
## - 8080:8080/tcp # Guacamole is on :8080/guacamole, not /.
|
||||
## enable next line when using nginx
|
||||
#- 8080/tcp
|
||||
restart: unless-stopped
|
||||
|
||||
# networks
|
||||
# create a network 'guacnetwork' in mode 'bridged'
|
||||
networks:
|
||||
guacnetwork:
|
||||
driver: bridge
|
||||
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Guacamole
|
||||
GUAC_PROD_FILE="$1"
|
||||
GUAC_PASSWORD=$(python3 -c "import secrets; import string; print(f''.join([secrets.choice(string.ascii_letters+string.digits) for x in range(32)]))")
|
||||
echo "POSTGRES_HOST=guac_postgres" > $GUAC_PROD_FILE
|
||||
echo "POSTGRES_HOSTNAME=guac_postgres" > $GUAC_PROD_FILE
|
||||
echo "POSTGRES_PORT=5432" >> $GUAC_PROD_FILE
|
||||
echo "POSTGRES_DB=guacamole_db" >> $GUAC_PROD_FILE
|
||||
echo "POSTGRES_DATABASE=guacamole_db" >> $GUAC_PROD_FILE
|
||||
echo "POSTGRES_USER=guac_user" >> $GUAC_PROD_FILE
|
||||
echo "POSTGRES_PASSWORD=$GUAC_PASSWORD" >> $GUAC_PROD_FILE
|
||||
echo "MISTBORN_DEFAULT_PASSWORD=$MISTBORN_DEFAULT_PASSWORD" >> $GUAC_PROD_FILE
|
||||
chmod 600 $GUAC_PROD_FILE
|
||||
|
After Width: | Height: | Size: 36 KiB |
@@ -0,0 +1,10 @@
|
||||
[DEFAULT]
|
||||
name = guacamole
|
||||
subdomain = guacamole
|
||||
desc = Apache Guacamole is a clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH.
|
||||
img = img/guacamole.png
|
||||
compose = compose/docker-compose.yml
|
||||
service = service/plugin.service
|
||||
environment = environment/environment.sh
|
||||
resources = resources
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [[ -f "/opt/mistborn_volumes/extra/guacamole/init/initdb.sql" ]]; then
|
||||
echo "initdb.sql exists. Proceeding."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
mkdir -p /opt/mistborn_volumes/extra/guacamole/init/ >/dev/null 2>&1
|
||||
chmod -R +x /opt/mistborn_volumes/extra/guacamole/init/
|
||||
docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --postgres > /opt/mistborn_volumes/extra/guacamole/init/initdb.sql
|
||||
|
||||
# grab values in initdb.sql to replace
|
||||
HEXSTRINGS=($(egrep -o [0-9a-fA-F]{64} /opt/mistborn_volumes/extra/guacamole/init/initdb.sql))
|
||||
|
||||
# reset default password in init.db
|
||||
SALT=$(python3 -c "import secrets; import string; print(f''.join([secrets.choice('0123456789ABCDEF') for x in range(64)]))")
|
||||
GUAC_PASSWORD_HASHED=$(echo -n "${MISTBORN_DEFAULT_PASSWORD}${SALT}" | sha256sum | awk '{print $1}' | tr a-z A-Z)
|
||||
|
||||
sed -i "s/${HEXSTRINGS[1]}/$SALT/" /opt/mistborn_volumes/extra/guacamole/init/initdb.sql
|
||||
sed -i "s/${HEXSTRINGS[0]}/$GUAC_PASSWORD_HASHED/" /opt/mistborn_volumes/extra/guacamole/init/initdb.sql
|
||||
sed -i "s/guacadmin/mistborn/g" /opt/mistborn_volumes/extra/guacamole/init/initdb.sql
|
||||
@@ -0,0 +1,23 @@
|
||||
[Unit]
|
||||
Description=Mistborn Guacamole
|
||||
Requires=Mistborn-base.service
|
||||
After=Mistborn-base.service
|
||||
PartOf=Mistborn-base.service
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
RestartSec=15
|
||||
User=root
|
||||
Group=docker
|
||||
PermissionsStartOnly=true
|
||||
# Shutdown container (if running) when unit is stopped
|
||||
ExecStartPre=/opt/mistborn/scripts/wrappers/mistborn_docker.sh guacamole docker-compose -f /opt/mistborn/extra/guacamole.yml down
|
||||
|
||||
# Start container when unit is started
|
||||
ExecStart=/opt/mistborn/scripts/wrappers/mistborn_docker.sh guacamole docker-compose -f /opt/mistborn/extra/guacamole.yml up --build
|
||||
# Stop container when unit is stopped
|
||||
ExecStop=/opt/mistborn/scripts/wrappers/mistborn_docker.sh guacamole docker-compose -f /opt/mistborn/extra/guacamole.yml down
|
||||
# Post stop
|
||||
|
||||
[Install]
|
||||
WantedBy=Mistborn-base.service
|
||||
@@ -0,0 +1,26 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
homeassistant:
|
||||
container_name: mistborn_production_home_assistant
|
||||
image: homeassistant/home-assistant:stable
|
||||
volumes:
|
||||
- ../../mistborn_volumes/extra/homeassistant/config:/config
|
||||
environment:
|
||||
- TZ=America/New_York
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.homeassistant-http.rule=Host(`homeassistant.mistborn`)"
|
||||
- "traefik.http.routers.homeassistant-http.entrypoints=web"
|
||||
- "traefik.http.routers.homeassistant-http.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.homeassistant-https.rule=Host(`homeassistant.mistborn`)"
|
||||
- "traefik.http.routers.homeassistant-https.entrypoints=websecure"
|
||||
- "traefik.http.routers.homeassistant-https.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.homeassistant-https.tls.certresolver=basic"
|
||||
- "traefik.http.services.homeassistant-service.loadbalancer.server.port=8123"
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
default:
|
||||
external:
|
||||
name: mistborn_default
|
||||
|
After Width: | Height: | Size: 56 KiB |
@@ -0,0 +1,9 @@
|
||||
[DEFAULT]
|
||||
name = homeassistant
|
||||
subdomain = homeassistant
|
||||
desc = Home Assistant is an Open source home automation software that puts local control and privacy first.
|
||||
img = img/homeassistant.png
|
||||
compose = compose/docker-compose.yml
|
||||
service = service/plugin.service
|
||||
resources = resources
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
|
||||
HASS_CONFIG="/opt/mistborn_volumes/extra/homeassistant/config/configuration.yaml"
|
||||
|
||||
if [[ -f "$HASS_CONFIG" ]]; then
|
||||
# configuration.yaml exists
|
||||
|
||||
if [[ ! -z $(grep "use_x_forwarded_for: true" "$HASS_CONFIG") ]]; then
|
||||
# FOUND
|
||||
exit 0;
|
||||
fi
|
||||
|
||||
# add the proxy config
|
||||
# write the trusted proxies config
|
||||
cat >> ${HASS_CONFIG}<< EOF
|
||||
|
||||
http:
|
||||
use_x_forwarded_for: true
|
||||
trusted_proxies:
|
||||
- 172.16.0.0/12
|
||||
|
||||
EOF
|
||||
|
||||
exit 0;
|
||||
|
||||
fi
|
||||
|
||||
# create parent directory if needed
|
||||
PARENTDIR="$(dirname $HASS_CONFIG)"
|
||||
if [[ ! -d "$PARENTDIR" ]]; then
|
||||
mkdir -p $PARENTDIR
|
||||
fi
|
||||
|
||||
# write the trusted proxies config
|
||||
cat >> ${HASS_CONFIG}<< EOF
|
||||
|
||||
# Configure a default setup of Home Assistant (frontend, api, etc)
|
||||
default_config:
|
||||
|
||||
# Text to speech
|
||||
#tts:
|
||||
# - platform: google_translate
|
||||
|
||||
#group: !include groups.yaml
|
||||
#automation: !include automations.yaml
|
||||
#script: !include scripts.yaml
|
||||
#scene: !include scenes.yaml
|
||||
|
||||
http:
|
||||
use_x_forwarded_for: true
|
||||
trusted_proxies:
|
||||
- 172.16.0.0/12
|
||||
|
||||
EOF
|
||||
@@ -0,0 +1,23 @@
|
||||
[Unit]
|
||||
Description=Mistborn Home Assistant
|
||||
Requires=Mistborn-base.service
|
||||
After=Mistborn-base.service
|
||||
PartOf=Mistborn-base.service
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
RestartSec=15
|
||||
User=root
|
||||
Group=docker
|
||||
PermissionsStartOnly=true
|
||||
# Shutdown container (if running) when unit is stopped
|
||||
ExecStartPre=/opt/mistborn/scripts/wrappers/mistborn_docker.sh homeassistant docker-compose -f /opt/mistborn/extra/homeassistant.yml down
|
||||
|
||||
# Start container when unit is started
|
||||
ExecStart=/opt/mistborn/scripts/wrappers/mistborn_docker.sh homeassistant docker-compose -f /opt/mistborn/extra/homeassistant.yml up --build
|
||||
# Stop container when unit is stopped
|
||||
ExecStop=/opt/mistborn/scripts/wrappers/mistborn_docker.sh homeassistant docker-compose -f /opt/mistborn/extra/homeassistant.yml down
|
||||
# Post stop
|
||||
|
||||
[Install]
|
||||
WantedBy=Mistborn-base.service
|
||||
@@ -0,0 +1,30 @@
|
||||
version: '3'
|
||||
|
||||
volumes:
|
||||
production_jellyfin_config: {}
|
||||
production_jellyfin_cache: {}
|
||||
|
||||
services:
|
||||
jellyfin:
|
||||
image: jellyfin/jellyfin:latest
|
||||
container_name: mistborn_production_jellyfin
|
||||
volumes:
|
||||
- production_jellyfin_config:/config
|
||||
- production_jellyfin_cache:/cache
|
||||
- ../../mistborn_volumes/extra/nextcloud:/media:ro
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.jellyfin-http.rule=Host(`jellyfin.mistborn`)"
|
||||
- "traefik.http.routers.jellyfin-http.entrypoints=web"
|
||||
- "traefik.http.routers.jellyfin-http.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.jellyfin-https.rule=Host(`jellyfin.mistborn`)"
|
||||
- "traefik.http.routers.jellyfin-https.entrypoints=websecure"
|
||||
- "traefik.http.routers.jellyfin-https.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.jellyfin-https.tls.certresolver=basic"
|
||||
- "traefik.http.services.jellyfin-service.loadbalancer.server.port=8096"
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
default:
|
||||
external:
|
||||
name: mistborn_default
|
||||
|
After Width: | Height: | Size: 24 KiB |
@@ -0,0 +1,8 @@
|
||||
[DEFAULT]
|
||||
name = jellyfin
|
||||
subdomain = jellyfin
|
||||
desc = The Free Software Media System. Jellyfin is the volunteer-built media solution that puts you in control of your media. Stream to any device from your own server, with no strings attached.
|
||||
img = img/jellyfin.png
|
||||
compose = compose/docker-compose.yml
|
||||
service = service/plugin.service
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
[Unit]
|
||||
Description=Mistborn Jellyfin Service
|
||||
Requires=Mistborn-nextcloud.service
|
||||
After=Mistborn-nextcloud.service
|
||||
PartOf=Mistborn-base.service
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
RestartSec=15
|
||||
User=root
|
||||
Group=docker
|
||||
PermissionsStartOnly=true
|
||||
# Shutdown container (if running) when unit is stopped
|
||||
ExecStartPre=/opt/mistborn/scripts/wrappers/mistborn_docker.sh jellyfin docker-compose -f /opt/mistborn/extra/jellyfin.yml down
|
||||
|
||||
# Start container when unit is started
|
||||
ExecStart=/opt/mistborn/scripts/wrappers/mistborn_docker.sh jellyfin docker-compose -f /opt/mistborn/extra/jellyfin.yml up --build
|
||||
# Stop container when unit is stopped
|
||||
ExecStop=/opt/mistborn/scripts/wrappers/mistborn_docker.sh jellyfin docker-compose -f /opt/mistborn/extra/jellyfin.yml down
|
||||
# Post stop
|
||||
|
||||
[Install]
|
||||
WantedBy=Mistborn-base.service
|
||||
@@ -0,0 +1,255 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
# Frontend
|
||||
jitsi-web:
|
||||
image: jitsi/web:latest
|
||||
restart: unless-stopped
|
||||
#ports:
|
||||
#- '${HTTP_PORT}:80'
|
||||
#- '${HTTPS_PORT}:443'
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.jitsi-http.rule=Host(`jitsi.mistborn`)"
|
||||
- "traefik.http.routers.jitsi-http.entrypoints=web"
|
||||
- "traefik.http.routers.jitsi-http.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.jitsi-https.rule=Host(`jitsi.mistborn`)"
|
||||
- "traefik.http.routers.jitsi-https.entrypoints=websecure"
|
||||
- "traefik.http.routers.jitsi-https.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.jitsi-https.tls.certresolver=basic"
|
||||
- "traefik.http.services.jitsi-service.loadbalancer.server.port=${HTTP_PORT}"
|
||||
volumes:
|
||||
- ${CONFIG}/web:/config:Z
|
||||
- ${CONFIG}/transcripts:/usr/share/jitsi-meet/transcripts:Z
|
||||
env_file:
|
||||
- ../.envs/.production/.jitsi
|
||||
environment:
|
||||
- ENABLE_LETSENCRYPT
|
||||
- ENABLE_HTTP_REDIRECT
|
||||
- ENABLE_XMPP_WEBSOCKET
|
||||
- DISABLE_HTTPS
|
||||
- LETSENCRYPT_DOMAIN
|
||||
- LETSENCRYPT_EMAIL
|
||||
- LETSENCRYPT_USE_STAGING
|
||||
- PUBLIC_URL
|
||||
- TZ
|
||||
- AMPLITUDE_ID
|
||||
- ANALYTICS_SCRIPT_URLS
|
||||
- ANALYTICS_WHITELISTED_EVENTS
|
||||
- BRIDGE_CHANNEL
|
||||
- BRANDING_DATA_URL
|
||||
- CALLSTATS_CUSTOM_SCRIPT_URL
|
||||
- CALLSTATS_ID
|
||||
- CALLSTATS_SECRET
|
||||
- CHROME_EXTENSION_BANNER_JSON
|
||||
- CONFCODE_URL
|
||||
- CONFIG_EXTERNAL_CONNECT
|
||||
- DEPLOYMENTINFO_ENVIRONMENT
|
||||
- DEPLOYMENTINFO_ENVIRONMENT_TYPE
|
||||
- DEPLOYMENTINFO_USERREGION
|
||||
- DIALIN_NUMBERS_URL
|
||||
- DIALOUT_AUTH_URL
|
||||
- DIALOUT_CODES_URL
|
||||
- DROPBOX_APPKEY
|
||||
- DROPBOX_REDIRECT_URI
|
||||
- ENABLE_AUDIO_PROCESSING
|
||||
- ENABLE_AUTH
|
||||
- ENABLE_CALENDAR
|
||||
- ENABLE_FILE_RECORDING_SERVICE
|
||||
- ENABLE_FILE_RECORDING_SERVICE_SHARING
|
||||
- ENABLE_GUESTS
|
||||
- ENABLE_IPV6
|
||||
- ENABLE_LIPSYNC
|
||||
- ENABLE_NO_AUDIO_DETECTION
|
||||
- ENABLE_P2P
|
||||
- ENABLE_PREJOIN_PAGE
|
||||
- ENABLE_RECORDING
|
||||
- ENABLE_REMB
|
||||
- ENABLE_REQUIRE_DISPLAY_NAME
|
||||
- ENABLE_SIMULCAST
|
||||
- ENABLE_STATS_ID
|
||||
- ENABLE_STEREO
|
||||
- ENABLE_SUBDOMAINS
|
||||
- ENABLE_TALK_WHILE_MUTED
|
||||
- ENABLE_TCC
|
||||
- ENABLE_TRANSCRIPTIONS
|
||||
- ETHERPAD_PUBLIC_URL
|
||||
- ETHERPAD_URL_BASE
|
||||
- GOOGLE_ANALYTICS_ID
|
||||
- GOOGLE_API_APP_CLIENT_ID
|
||||
- INVITE_SERVICE_URL
|
||||
- JICOFO_AUTH_USER
|
||||
- MATOMO_ENDPOINT
|
||||
- MATOMO_SITE_ID
|
||||
- MICROSOFT_API_APP_CLIENT_ID
|
||||
- NGINX_RESOLVER
|
||||
- NGINX_WORKER_PROCESSES
|
||||
- NGINX_WORKER_CONNECTIONS
|
||||
- PEOPLE_SEARCH_URL
|
||||
- RESOLUTION
|
||||
- RESOLUTION_MIN
|
||||
- RESOLUTION_WIDTH
|
||||
- RESOLUTION_WIDTH_MIN
|
||||
- START_AUDIO_ONLY
|
||||
- START_AUDIO_MUTED
|
||||
- START_BITRATE
|
||||
- START_VIDEO_MUTED
|
||||
- TESTING_CAP_SCREENSHARE_BITRATE
|
||||
- TESTING_OCTO_PROBABILITY
|
||||
- XMPP_AUTH_DOMAIN
|
||||
- XMPP_BOSH_URL_BASE
|
||||
- XMPP_DOMAIN
|
||||
- XMPP_GUEST_DOMAIN
|
||||
- XMPP_MUC_DOMAIN
|
||||
- XMPP_RECORDER_DOMAIN
|
||||
- TOKEN_AUTH_URL
|
||||
networks:
|
||||
default:
|
||||
meet.jitsi:
|
||||
aliases:
|
||||
- ${XMPP_DOMAIN}
|
||||
|
||||
# XMPP server
|
||||
jitsi-prosody:
|
||||
image: jitsi/prosody:latest
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- '5222'
|
||||
- '5347'
|
||||
- '5280'
|
||||
volumes:
|
||||
- ${CONFIG}/prosody/config:/config:Z
|
||||
- ${CONFIG}/prosody/prosody-plugins-custom:/prosody-plugins-custom:Z
|
||||
env_file:
|
||||
- ../.envs/.production/.jitsi
|
||||
environment:
|
||||
- AUTH_TYPE
|
||||
- ENABLE_AUTH
|
||||
- ENABLE_GUESTS
|
||||
- ENABLE_LOBBY
|
||||
- ENABLE_XMPP_WEBSOCKET
|
||||
- GLOBAL_MODULES
|
||||
- GLOBAL_CONFIG
|
||||
- LDAP_URL
|
||||
- LDAP_BASE
|
||||
- LDAP_BINDDN
|
||||
- LDAP_BINDPW
|
||||
- LDAP_FILTER
|
||||
- LDAP_AUTH_METHOD
|
||||
- LDAP_VERSION
|
||||
- LDAP_USE_TLS
|
||||
- LDAP_TLS_CIPHERS
|
||||
- LDAP_TLS_CHECK_PEER
|
||||
- LDAP_TLS_CACERT_FILE
|
||||
- LDAP_TLS_CACERT_DIR
|
||||
- LDAP_START_TLS
|
||||
- XMPP_DOMAIN
|
||||
- XMPP_AUTH_DOMAIN
|
||||
- XMPP_GUEST_DOMAIN
|
||||
- XMPP_MUC_DOMAIN
|
||||
- XMPP_INTERNAL_MUC_DOMAIN
|
||||
- XMPP_MODULES
|
||||
- XMPP_MUC_MODULES
|
||||
- XMPP_INTERNAL_MUC_MODULES
|
||||
- XMPP_RECORDER_DOMAIN
|
||||
- XMPP_CROSS_DOMAIN
|
||||
- JICOFO_COMPONENT_SECRET
|
||||
- JICOFO_AUTH_USER
|
||||
- JICOFO_AUTH_PASSWORD
|
||||
- JVB_AUTH_USER
|
||||
- JVB_AUTH_PASSWORD
|
||||
- JIGASI_XMPP_USER
|
||||
- JIGASI_XMPP_PASSWORD
|
||||
- JIBRI_XMPP_USER
|
||||
- JIBRI_XMPP_PASSWORD
|
||||
- JIBRI_RECORDER_USER
|
||||
- JIBRI_RECORDER_PASSWORD
|
||||
- JWT_APP_ID
|
||||
- JWT_APP_SECRET
|
||||
- JWT_ACCEPTED_ISSUERS
|
||||
- JWT_ACCEPTED_AUDIENCES
|
||||
- JWT_ASAP_KEYSERVER
|
||||
- JWT_ALLOW_EMPTY
|
||||
- JWT_AUTH_TYPE
|
||||
- JWT_TOKEN_AUTH_MODULE
|
||||
- LOG_LEVEL
|
||||
- PUBLIC_URL
|
||||
- TZ
|
||||
networks:
|
||||
meet.jitsi:
|
||||
aliases:
|
||||
- ${XMPP_SERVER}
|
||||
|
||||
# Focus component
|
||||
jitsi-jicofo:
|
||||
image: jitsi/jicofo:latest
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ${CONFIG}/jicofo:/config:Z
|
||||
env_file:
|
||||
- ../.envs/.production/.jitsi
|
||||
environment:
|
||||
- AUTH_TYPE
|
||||
- ENABLE_AUTH
|
||||
- XMPP_DOMAIN
|
||||
- XMPP_AUTH_DOMAIN
|
||||
- XMPP_INTERNAL_MUC_DOMAIN
|
||||
- XMPP_MUC_DOMAIN
|
||||
- XMPP_SERVER
|
||||
- JICOFO_COMPONENT_SECRET
|
||||
- JICOFO_AUTH_USER
|
||||
- JICOFO_AUTH_PASSWORD
|
||||
- JICOFO_RESERVATION_REST_BASE_URL
|
||||
- JVB_BREWERY_MUC
|
||||
- JIGASI_BREWERY_MUC
|
||||
- JIGASI_SIP_URI
|
||||
- JIBRI_BREWERY_MUC
|
||||
- JIBRI_PENDING_TIMEOUT
|
||||
- TZ
|
||||
depends_on:
|
||||
- jitsi-prosody
|
||||
networks:
|
||||
meet.jitsi:
|
||||
|
||||
# Video bridge
|
||||
jitsi-jvb:
|
||||
image: jitsi/jvb:latest
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "${MISTBORN_BIND_IP}:${JVB_PORT}:${JVB_PORT}/udp"
|
||||
- "${MISTBORN_BIND_IP}:${JVB_TCP_PORT}:${JVB_TCP_PORT}"
|
||||
volumes:
|
||||
- ${CONFIG}/jvb:/config:Z
|
||||
env_file:
|
||||
- ../.envs/.production/.jitsi
|
||||
environment:
|
||||
- DOCKER_HOST_ADDRESS
|
||||
- XMPP_AUTH_DOMAIN
|
||||
- XMPP_INTERNAL_MUC_DOMAIN
|
||||
- XMPP_SERVER
|
||||
- JVB_AUTH_USER
|
||||
- JVB_AUTH_PASSWORD
|
||||
- JVB_BREWERY_MUC
|
||||
- JVB_PORT
|
||||
- JVB_TCP_HARVESTER_DISABLED
|
||||
- JVB_TCP_PORT
|
||||
- JVB_TCP_MAPPED_PORT
|
||||
- JVB_STUN_SERVERS
|
||||
- JVB_ENABLE_APIS
|
||||
- JVB_WS_DOMAIN
|
||||
- JVB_WS_SERVER_ID
|
||||
- PUBLIC_URL
|
||||
- TZ
|
||||
depends_on:
|
||||
- jitsi-prosody
|
||||
networks:
|
||||
meet.jitsi:
|
||||
aliases:
|
||||
- jvb.meet.jitsi
|
||||
|
||||
# Custom network so all services can communicate using a FQDN
|
||||
networks:
|
||||
default:
|
||||
external:
|
||||
name: mistborn_default
|
||||
meet.jitsi:
|
||||
@@ -0,0 +1,13 @@
|
||||
#!/bin/bash
|
||||
|
||||
# JITSI
|
||||
JITSI_PROD_FILE="$1"
|
||||
cp ${MISTBORN_HOME}/scripts/conf/jitsi.env $JITSI_PROD_FILE
|
||||
mkdir -p ${MISTBORN_HOME}/.envs/.production/.jitsi-cfg/{web/letsencrypt,transcripts,prosody,jicofo,jvb}
|
||||
sed -i "s/JICOFO_COMPONENT_SECRET.*/JICOFO_COMPONENT_SECRET=$(python3 -c "import secrets; import string; print(f''.join([secrets.choice(string.ascii_letters+string.digits) for x in range(32)]))")/" "$JITSI_PROD_FILE"
|
||||
sed -i "s/JICOFO_AUTH_PASSWORD.*/JICOFO_AUTH_PASSWORD=$(python3 -c "import secrets; import string; print(f''.join([secrets.choice(string.ascii_letters+string.digits) for x in range(32)]))")/" "$JITSI_PROD_FILE"
|
||||
sed -i "s/JVB_AUTH_PASSWORD.*/JVB_AUTH_PASSWORD=$(python3 -c "import secrets; import string; print(f''.join([secrets.choice(string.ascii_letters+string.digits) for x in range(32)]))")/" "$JITSI_PROD_FILE"
|
||||
sed -i "s/JIGASI_XMPP_PASSWORD.*/JIGASI_XMPP_PASSWORD=$(python3 -c "import secrets; import string; print(f''.join([secrets.choice(string.ascii_letters+string.digits) for x in range(32)]))")/" "$JITSI_PROD_FILE"
|
||||
sed -i "s/JIBRI_RECORDER_PASSWORD.*/JIBRI_RECORDER_PASSWORD=$(python3 -c "import secrets; import string; print(f''.join([secrets.choice(string.ascii_letters+string.digits) for x in range(32)]))")/" "$JITSI_PROD_FILE"
|
||||
sed -i "s/JIBRI_XMPP_PASSWORD.*/JIBRI_XMPP_PASSWORD=$(python3 -c "import secrets; import string; print(f''.join([secrets.choice(string.ascii_letters+string.digits) for x in range(32)]))")/" "$JITSI_PROD_FILE"
|
||||
chmod 600 $JITSI_PROD_FILE
|
||||
|
After Width: | Height: | Size: 20 KiB |
@@ -0,0 +1,10 @@
|
||||
[DEFAULT]
|
||||
name = jitsi
|
||||
subdomain = jitsi
|
||||
desc = Jitsi is a collection of free and open-source multiplatform voice, videoconferencing and instant messaging applications for the web platform, Windows, Linux, Mac OS X and Android.
|
||||
img = img/jitsi.png
|
||||
compose = compose/docker-compose.yml
|
||||
service = service/plugin.service
|
||||
environment = environment/environment.sh
|
||||
resources = resources
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
|
||||
iptables -w -D DOCKER-USER -i $DIFACE -p udp --dport $JVB_PORT -j MISTBORN_LOG_DROP
|
||||
iptables -w -D DOCKER-USER -i $DIFACE -p tcp --dport $JVB_TCP_PORT -j MISTBORN_LOG_DROP
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
|
||||
iptables -w -I DOCKER-USER -i $DIFACE -p udp --dport $JVB_PORT -j MISTBORN_LOG_DROP
|
||||
iptables -w -I DOCKER-USER -i $DIFACE -p tcp --dport $JVB_TCP_PORT -j MISTBORN_LOG_DROP
|
||||
@@ -0,0 +1,27 @@
|
||||
[Unit]
|
||||
Description=Mistborn Jitsi Service
|
||||
Requires=Mistborn-base.service
|
||||
After=Mistborn-base.service
|
||||
PartOf=Mistborn-base.service
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
RestartSec=15
|
||||
User=root
|
||||
Group=docker
|
||||
PermissionsStartOnly=true
|
||||
|
||||
# Shutdown container (if running) when unit is stopped
|
||||
ExecStartPre=/opt/mistborn/scripts/wrappers/mistborn_docker.sh jitsi docker-compose -f /opt/mistborn/extra/jitsi-meet.yml down
|
||||
ExecStartPre=/opt/mistborn/scripts/wrappers/mistborn_docker.sh jitsi /opt/mistborn/scripts/services/jitsi/iptables_up.sh
|
||||
|
||||
# Start container when unit is started
|
||||
ExecStart=/opt/mistborn/scripts/wrappers/mistborn_docker.sh jitsi docker-compose -f /opt/mistborn/extra/jitsi-meet.yml up --build
|
||||
|
||||
# Stop container when unit is stopped
|
||||
ExecStop=/opt/mistborn/scripts/wrappers/mistborn_docker.sh jitsi docker-compose -f /opt/mistborn/extra/jitsi-meet.yml down
|
||||
# Post stop
|
||||
ExecStopPost=-/opt/mistborn/scripts/wrappers/mistborn_docker.sh jitsi /opt/mistborn/scripts/services/jitsi/iptables_down.sh
|
||||
|
||||
[Install]
|
||||
WantedBy=Mistborn-base.service
|
||||
@@ -0,0 +1,29 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
nextcloud:
|
||||
image: nextcloud
|
||||
container_name: mistborn_production_nextcloud
|
||||
env_file:
|
||||
- ../.envs/.production/.postgres
|
||||
- ../.envs/.production/.nextcloud
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.nextcloud-http.rule=Host(`nextcloud.mistborn`)"
|
||||
- "traefik.http.routers.nextcloud-http.entrypoints=web"
|
||||
- "traefik.http.routers.nextcloud-http.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.nextcloud-https.rule=Host(`nextcloud.mistborn`)"
|
||||
- "traefik.http.routers.nextcloud-https.entrypoints=websecure"
|
||||
- "traefik.http.routers.nextcloud-https.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.nextcloud-https.tls.certresolver=basic"
|
||||
- "traefik.http.services.nextcloud-service.loadbalancer.server.port=80"
|
||||
volumes:
|
||||
- ../../mistborn_volumes/extra/nextcloud:/var/www/html
|
||||
environment:
|
||||
- VIRTUAL_HOST=nextcloud.mistborn
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
default:
|
||||
external:
|
||||
name: mistborn_default
|
||||
@@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
# generate nextcloud .env files
|
||||
NEXTCLOUD_PROD_FILE="$1"
|
||||
#NEXTCLOUD_PASSWORD=$(python3 -c "import secrets; import string; print(f''.join([secrets.choice(string.ascii_letters+string.digits) for x in range(32)]))")
|
||||
NEXTCLOUD_PASSWORD="${MISTBORN_DEFAULT_PASSWORD}"
|
||||
echo "NEXTCLOUD_ADMIN_USER=mistborn" > $NEXTCLOUD_PROD_FILE
|
||||
echo "NEXTCLOUD_ADMIN_PASSWORD=$NEXTCLOUD_PASSWORD" >> $NEXTCLOUD_PROD_FILE
|
||||
echo "NEXTCLOUD_TRUSTED_DOMAINS=nextcloud.mistborn" >> $NEXTCLOUD_PROD_FILE
|
||||
chmod 600 $NEXTCLOUD_PROD_FILE
|
||||
|
After Width: | Height: | Size: 18 KiB |
@@ -0,0 +1,9 @@
|
||||
[DEFAULT]
|
||||
name = nextcloud
|
||||
subdomain = nextcloud
|
||||
desc = Nextcloud is a suite of client-server software for creating and using file hosting services. Nextcloud application functionally is similar to Dropbox.
|
||||
img = img/nextcloud.png
|
||||
compose = compose/docker-compose.yml
|
||||
service = service/plugin.service
|
||||
environment = environment/environment.sh
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
[Unit]
|
||||
Description=Mistborn Nextcloud Service
|
||||
Requires=Mistborn-base.service
|
||||
After=Mistborn-base.service
|
||||
PartOf=Mistborn-base.service
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
RestartSec=15
|
||||
User=root
|
||||
Group=docker
|
||||
PermissionsStartOnly=true
|
||||
# Shutdown container (if running) when unit is stopped
|
||||
ExecStartPre=/opt/mistborn/scripts/wrappers/mistborn_docker.sh nextcloud docker-compose -f /opt/mistborn/extra/nextcloud.yml down
|
||||
|
||||
# Start container when unit is started
|
||||
ExecStart=/opt/mistborn/scripts/wrappers/mistborn_docker.sh nextcloud docker-compose -f /opt/mistborn/extra/nextcloud.yml up --build
|
||||
# Stop container when unit is stopped
|
||||
ExecStop=/opt/mistborn/scripts/wrappers/mistborn_docker.sh nextcloud docker-compose -f /opt/mistborn/extra/nextcloud.yml down
|
||||
# Post stop
|
||||
|
||||
[Install]
|
||||
WantedBy=Mistborn-base.service
|
||||
@@ -0,0 +1,27 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
onlyoffice:
|
||||
container_name: mistborn_production_onlyoffice
|
||||
image: onlyoffice/documentserver:latest
|
||||
volumes:
|
||||
- ../../mistborn_volumes/extra/onlyoffice/logs:/var/log/onlyoffice
|
||||
- ../../mistborn_volumes/extra/onlyoffice/cache:/var/lib/onlyoffice
|
||||
env_file:
|
||||
- ../.envs/.production/.onlyoffice
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.onlyoffice-http.rule=Host(`onlyoffice.mistborn`)"
|
||||
- "traefik.http.routers.onlyoffice-http.entrypoints=web"
|
||||
- "traefik.http.routers.onlyoffice-http.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.onlyoffice-https.rule=Host(`onlyoffice.mistborn`)"
|
||||
- "traefik.http.routers.onlyoffice-https.entrypoints=websecure"
|
||||
- "traefik.http.routers.onlyoffice-https.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.onlyoffice-https.tls.certresolver=basic"
|
||||
- "traefik.http.services.onlyoffice-service.loadbalancer.server.port=80"
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
default:
|
||||
external:
|
||||
name: mistborn_default
|
||||
@@ -0,0 +1,8 @@
|
||||
#!/bin/bash
|
||||
|
||||
# generate onlyoffice .env files
|
||||
ONLYOFFICE_PROD_FILE="$1"
|
||||
JWT_SECRET="${MISTBORN_DEFAULT_PASSWORD}"
|
||||
echo "JWT_ENABLED=true" > $ONLYOFFICE_PROD_FILE
|
||||
echo "JWT_SECRET=$JWT_SECRET" >> $ONLYOFFICE_PROD_FILE
|
||||
chmod 600 $ONLYOFFICE_PROD_FILE
|
||||
|
After Width: | Height: | Size: 8.5 KiB |
@@ -0,0 +1,9 @@
|
||||
[DEFAULT]
|
||||
name = onlyoffice
|
||||
subdomain = onlyoffice
|
||||
desc = An open source office suite featuring online document editors, platform for document management, corporate communication, mail and project management tools.
|
||||
img = img/onlyoffice.jpg
|
||||
compose = compose/docker-compose.yml
|
||||
service = service/plugin.service
|
||||
environment = environment/environment.sh
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
[Unit]
|
||||
Description=Mistborn OnlyOffice Service
|
||||
Requires=Mistborn-base.service
|
||||
After=Mistborn-base.service
|
||||
PartOf=Mistborn-base.service
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
RestartSec=15
|
||||
User=root
|
||||
Group=docker
|
||||
PermissionsStartOnly=true
|
||||
# Shutdown container (if running) when unit is stopped
|
||||
ExecStartPre=/opt/mistborn/scripts/wrappers/mistborn_docker.sh onlyoffice docker-compose -f /opt/mistborn/extra/onlyoffice.yml down
|
||||
|
||||
# Start container when unit is started
|
||||
ExecStart=/opt/mistborn/scripts/wrappers/mistborn_docker.sh onlyoffice docker-compose -f /opt/mistborn/extra/onlyoffice.yml up --build
|
||||
# Stop container when unit is stopped
|
||||
ExecStop=/opt/mistborn/scripts/wrappers/mistborn_docker.sh onlyoffice docker-compose -f /opt/mistborn/extra/onlyoffice.yml down
|
||||
# Post stop
|
||||
|
||||
[Install]
|
||||
WantedBy=Mistborn-base.service
|
||||
@@ -0,0 +1,33 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
raspap:
|
||||
image: "cyber5k/raspap:${MISTBORN_TAG}"
|
||||
container_name: mistborn_production_raspap
|
||||
#network_mode: host
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.raspap-http.rule=Host(`raspap.mistborn`)"
|
||||
- "traefik.http.routers.raspap-http.entrypoints=web"
|
||||
- "traefik.http.routers.raspap-http.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.raspap-https.rule=Host(`raspap.mistborn`)"
|
||||
- "traefik.http.routers.raspap-https.entrypoints=websecure"
|
||||
- "traefik.http.routers.raspap-https.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.raspap-https.tls.certresolver=basic"
|
||||
- "traefik.http.services.raspap-service.loadbalancer.server.port=80"
|
||||
env_file:
|
||||
- ../.envs/.production/.raspap
|
||||
cap_add:
|
||||
#- NET_ADMIN
|
||||
- SYS_ADMIN
|
||||
#- CAP_FOWNER
|
||||
privileged: true
|
||||
volumes:
|
||||
- /sys/fs/cgroup:/sys/fs/cgroup:ro
|
||||
#command: /start
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
default:
|
||||
external:
|
||||
name: mistborn_default
|
||||
@@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# RaspAP
|
||||
RASPAP_PROD_FILE="$1"
|
||||
echo "MISTBORN_DEFAULT_PASSWORD=$MISTBORN_DEFAULT_PASSWORD" > $RASPAP_PROD_FILE
|
||||
chmod 600 $RASPAP_PROD_FILE
|
||||
|
After Width: | Height: | Size: 122 KiB |
@@ -0,0 +1,9 @@
|
||||
[DEFAULT]
|
||||
name = raspap
|
||||
subdomain = raspap
|
||||
desc = The easiest, full-featured wireless router setup for Debian-based devices. Period. (Mistborn integration in alpha testing)
|
||||
img = img/raspap.png
|
||||
compose = compose/docker-compose.yml
|
||||
service = service/plugin.service
|
||||
environment = environment/environment.sh
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
[Unit]
|
||||
Description=Mistborn RaspAP Service
|
||||
Requires=Mistborn-base.service
|
||||
After=Mistborn-base.service
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
RestartSec=15
|
||||
User=root
|
||||
Group=docker
|
||||
PermissionsStartOnly=true
|
||||
ExecStartPre=/sbin/iptables -I DOCKER-USER -i DIFACE -p tcp --dport 8095 -j MISTBORN_LOG_DROP
|
||||
#ExecStartPre=/bin/bash /opt/mistborn_volumes/extra/raspap/etc-raspap/hostapd/servicestart.sh --interface uap0 --seconds 3
|
||||
# Shutdown container (if running) when unit is stopped
|
||||
ExecStartPre=/opt/mistborn/scripts/wrappers/mistborn_docker.sh raspap docker-compose -f /opt/mistborn/extra/raspap.yml down
|
||||
|
||||
# Start container when unit is started
|
||||
ExecStart=/opt/mistborn/scripts/wrappers/mistborn_docker.sh raspap docker-compose -f /opt/mistborn/extra/raspap.yml up --build
|
||||
# Stop container when unit is stopped
|
||||
ExecStop=/opt/mistborn/scripts/wrappers/mistborn_docker.sh raspap docker-compose -f /opt/mistborn/extra/raspap.yml down
|
||||
ExecStopPost=-/sbin/iptables -D DOCKER-USER -i DIFACE -p tcp --dport 8095 -j MISTBORN_LOG_DROP
|
||||
# Post stop
|
||||
|
||||
[Install]
|
||||
WantedBy=Mistborn-base.service
|
||||
@@ -0,0 +1,72 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
# rocketchat
|
||||
rocketchat:
|
||||
image: rocket.chat:latest
|
||||
container_name: mistborn_production_rocketchat
|
||||
command: bash -c 'for i in `seq 1 30`; do node main.js && s=$$? && break || s=$$?; echo "Tried $$i times. Waiting 5 secs..."; sleep 5; done; (exit $$s)'
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ../../mistborn_volumes/extra/rocketchat/uploads:/app/uploads
|
||||
environment:
|
||||
- PORT=3000
|
||||
- ROOT_URL=http://chat.mistborn
|
||||
- MONGO_URL=mongodb://mongo:27017/rocketchat
|
||||
- MONGO_OPLOG_URL=mongodb://mongo:27017/local
|
||||
- Accounts_UseDNSDomainCheck=False
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.chat-http.rule=Host(`chat.mistborn`)"
|
||||
- "traefik.http.routers.chat-http.entrypoints=web"
|
||||
- "traefik.http.routers.chat-http.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.chat-https.rule=Host(`chat.mistborn`)"
|
||||
- "traefik.http.routers.chat-https.entrypoints=websecure"
|
||||
- "traefik.http.routers.chat-https.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.chat-https.tls.certresolver=basic"
|
||||
- "traefik.http.services.chat-service.loadbalancer.server.port=3000"
|
||||
depends_on:
|
||||
- mongo
|
||||
#ports:
|
||||
# - 3000:3000
|
||||
|
||||
mongo:
|
||||
image: mongo:4.0
|
||||
container_name: mistborn_production_rocketchat_mongo
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ../../mistborn_volumes/extra/rocketchat/data/db:/data/db
|
||||
- ../../mistborn_volumes/extra/rocketchat/data/dump:/dump
|
||||
command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1
|
||||
|
||||
# this container's job is just run the command to initialize the replica set.
|
||||
# it will run the command and remove himself (it will not stay running)
|
||||
mongo-init-replica:
|
||||
image: mongo
|
||||
command: 'bash -c "for i in `seq 1 30`; do mongo mongo/rocketchat --eval \"rs.initiate({ _id: ''rs0'', members: [ { _id: 0, host: ''localhost:27017'' } ]})\" && s=$$? && break || s=$$?; echo \"Tried $$i times. Waiting 5 secs...\"; sleep 5; done; (exit $$s)"'
|
||||
depends_on:
|
||||
- mongo
|
||||
|
||||
# hubot, the popular chatbot (add the bot user first and change the password before starting this image)
|
||||
hubot:
|
||||
image: rocketchat/hubot-rocketchat:latest
|
||||
container_name: mistborn_production_rocketchat_hubot
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- ROCKETCHAT_URL=chat.mistborn #:3000
|
||||
# you can add more scripts as you'd like here, they need to be installable by npm
|
||||
- EXTERNAL_SCRIPTS=hubot-help,hubot-seen,hubot-links,hubot-diagnostics
|
||||
env_file:
|
||||
- ../.envs/.production/.rocketchat
|
||||
depends_on:
|
||||
- rocketchat
|
||||
volumes:
|
||||
- ../../mistborn_volumes/extra/rocketchat/hubot/scripts:/home/hubot/scripts
|
||||
# this is used to expose the hubot port for notifications on the host on port 3001, e.g. for hubot-jenkins-notifier
|
||||
ports:
|
||||
- "${MISTBORN_BIND_IP}:3001:8080/tcp"
|
||||
|
||||
networks:
|
||||
default:
|
||||
external:
|
||||
name: mistborn_default
|
||||
@@ -0,0 +1,15 @@
|
||||
#!/bin/bash
|
||||
|
||||
# generate rocketchat .env files
|
||||
ROCKETCHAT_PROD_FILE="$1"
|
||||
#ROCKETCHAT_PASSWORD=$(python3 -c "import secrets; import string; print(f''.join([secrets.choice(string.ascii_letters+string.digits) for x in range(32)]))")
|
||||
ROCKETCHAT_PASSWORD="${MISTBORN_DEFAULT_PASSWORD}"
|
||||
echo "ROCKETCHAT_USER=bot" > $ROCKETCHAT_PROD_FILE
|
||||
echo "ROCKETCHAT_ROOM=GENERAL" >> $ROCKETCHAT_PROD_FILE
|
||||
echo "BOT_NAME=bot" >> $ROCKETCHAT_PROD_FILE
|
||||
echo "ROCKETCHAT_PASSWORD=$ROCKETCHAT_PASSWORD" >> $ROCKETCHAT_PROD_FILE
|
||||
|
||||
# docker environment
|
||||
echo "MISTBORN_BIND_IP=${MISTBORN_BIND_IP}" >> $ROCKETCHAT_PROD_FILE
|
||||
|
||||
chmod 600 $ROCKETCHAT_PROD_FILE
|
||||
|
After Width: | Height: | Size: 13 KiB |
@@ -0,0 +1,9 @@
|
||||
[DEFAULT]
|
||||
name = rocketchat
|
||||
subdomain = rocketchat
|
||||
desc = Rocket.Chat is the leading open source team chat software solution.
|
||||
img = img/rocketchat.png
|
||||
compose = compose/docker-compose.yml
|
||||
service = service/plugin.service
|
||||
environment = environment/environment.sh
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
[Unit]
|
||||
Description=Mistborn Rocket Chat Service
|
||||
Requires=Mistborn-base.service
|
||||
After=Mistborn-base.service
|
||||
PartOf=Mistborn-base.service
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
RestartSec=15
|
||||
User=root
|
||||
Group=docker
|
||||
PermissionsStartOnly=true
|
||||
# Shutdown container (if running) when unit is stopped
|
||||
ExecStartPre=/opt/mistborn/scripts/wrappers/mistborn_docker.sh rocketchat docker-compose -f /opt/mistborn/extra/rocketchat.yml down
|
||||
|
||||
ExecStartPre=/sbin/iptables -w -I DOCKER-USER -i DIFACE -p tcp --dport 3001 -j MISTBORN_LOG_DROP
|
||||
# Start container when unit is started
|
||||
ExecStart=/opt/mistborn/scripts/wrappers/mistborn_docker.sh rocketchat docker-compose -f /opt/mistborn/extra/rocketchat.yml up --build
|
||||
# Stop container when unit is stopped
|
||||
ExecStop=/opt/mistborn/scripts/wrappers/mistborn_docker.sh rocketchat docker-compose -f /opt/mistborn/extra/rocketchat.yml down
|
||||
# Post stop
|
||||
ExecStopPost=-/sbin/iptables -D DOCKER-USER -i DIFACE -p tcp --dport 3001 -j MISTBORN_LOG_DROP
|
||||
|
||||
[Install]
|
||||
WantedBy=Mistborn-base.service
|
||||
@@ -0,0 +1,35 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
syncthing:
|
||||
image: linuxserver/syncthing:latest
|
||||
container_name: mistborn_production_syncthing
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- TZ=Amereica/New_York
|
||||
- UMASK_SET=022
|
||||
volumes:
|
||||
- ../../mistborn_volumes/extra/syncthing/config:/config
|
||||
- ../../mistborn_volumes/extra/syncthing/data1:/data1
|
||||
- ../../mistborn_volumes/extra/syncthing/data2:/data2
|
||||
ports:
|
||||
#- 8384:8384
|
||||
- "${MISTBORN_BIND_IP}:22000:22000/tcp" # listening port
|
||||
- "${MISTBORN_BIND_IP}:21027:21027/udp" # protocol discovery
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.syncthing-http.rule=Host(`syncthing.mistborn`)"
|
||||
- "traefik.http.routers.syncthing-http.entrypoints=web"
|
||||
- "traefik.http.routers.syncthing-http.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.syncthing-https.rule=Host(`syncthing.mistborn`)"
|
||||
- "traefik.http.routers.syncthing-https.entrypoints=websecure"
|
||||
- "traefik.http.routers.syncthing-https.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.syncthing-https.tls.certresolver=basic"
|
||||
- "traefik.http.services.syncthing-service.loadbalancer.server.port=8384"
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
default:
|
||||
external:
|
||||
name: mistborn_default
|
||||
|
After Width: | Height: | Size: 48 KiB |
@@ -0,0 +1,8 @@
|
||||
[DEFAULT]
|
||||
name = syncthing
|
||||
subdomain = syncthing
|
||||
desc = Syncthing is a free, open-source peer-to-peer file synchronization application available for Windows, Mac, Linux, Android, Solaris, Darwin, and BSD. It can sync files between devices on a local network, or between remote devices over the Internet. Data security and data safety are built into the design of the software.
|
||||
img = img/syncthing.png
|
||||
compose = compose/docker-compose.yml
|
||||
service = service/plugin.service
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
[Unit]
|
||||
Description=Mistborn Syncthing Service
|
||||
Requires=Mistborn-base.service
|
||||
After=Mistborn-base.service
|
||||
PartOf=Mistborn-base.service
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
RestartSec=15
|
||||
User=root
|
||||
Group=docker
|
||||
PermissionsStartOnly=true
|
||||
# Shutdown container (if running) when unit is stopped
|
||||
ExecStartPre=/opt/mistborn/scripts/wrappers/mistborn_docker.sh syncthing docker-compose -f /opt/mistborn/extra/syncthing.yml down
|
||||
|
||||
ExecStartPre=/sbin/iptables -w -I DOCKER-USER -i DIFACE -p udp --dport 21027 -j MISTBORN_LOG_DROP
|
||||
ExecStartPre=/sbin/iptables -w -I DOCKER-USER -i DIFACE -p tcp --dport 22000 -j MISTBORN_LOG_DROP
|
||||
# Start container when unit is started
|
||||
ExecStart=/opt/mistborn/scripts/wrappers/mistborn_docker.sh syncthing docker-compose -f /opt/mistborn/extra/syncthing.yml up --build
|
||||
# Stop container when unit is stopped
|
||||
ExecStop=/opt/mistborn/scripts/wrappers/mistborn_docker.sh syncthing docker-compose -f /opt/mistborn/extra/syncthing.yml down
|
||||
# Post stop
|
||||
ExecStopPost=-/sbin/iptables -D DOCKER-USER -i DIFACE -p udp --dport 21027 -j MISTBORN_LOG_DROP
|
||||
ExecStopPost=-/sbin/iptables -D DOCKER-USER -i DIFACE -p tcp --dport 22000 -j MISTBORN_LOG_DROP
|
||||
|
||||
[Install]
|
||||
WantedBy=Mistborn-base.service
|
||||
@@ -0,0 +1,16 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
tor-client:
|
||||
build:
|
||||
context: ../compose/production/tor
|
||||
dockerfile: ./Dockerfile
|
||||
image: mistborn_production_tor
|
||||
container_name: mistborn_production_tor
|
||||
ports:
|
||||
- "${MISTBORN_BIND_IP}:9150:9150/tcp"
|
||||
|
||||
networks:
|
||||
default:
|
||||
external:
|
||||
name: mistborn_default
|
||||
|
After Width: | Height: | Size: 25 KiB |
@@ -0,0 +1,8 @@
|
||||
[DEFAULT]
|
||||
name = tor
|
||||
subdomain = tor
|
||||
desc = Tor is free and open-source software for enabling anonymous communication.
|
||||
img = img/tor.png
|
||||
compose = compose/docker-compose.yml
|
||||
service = service/plugin.service
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
[Unit]
|
||||
Description=Mistborn Tor Service
|
||||
Requires=Mistborn-base.service
|
||||
After=Mistborn-base.service
|
||||
PartOf=Mistborn-base.service
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
RestartSec=15
|
||||
User=root
|
||||
Group=docker
|
||||
PermissionsStartOnly=true
|
||||
# Shutdown container (if running) when unit is stopped
|
||||
ExecStartPre=/opt/mistborn/scripts/wrappers/mistborn_docker.sh tor docker-compose -f /opt/mistborn/extra/tor.yml down
|
||||
|
||||
ExecStartPre=/sbin/iptables -w -I DOCKER-USER -i DIFACE -p tcp --dport 9150 -j MISTBORN_LOG_DROP
|
||||
# Start container when unit is started
|
||||
ExecStart=/opt/mistborn/scripts/wrappers/mistborn_docker.sh tor docker-compose -f /opt/mistborn/extra/tor.yml up --build
|
||||
# Stop container when unit is stopped
|
||||
ExecStop=/opt/mistborn/scripts/wrappers/mistborn_docker.sh tor docker-compose -f /opt/mistborn/extra/tor.yml down
|
||||
# Post stop
|
||||
ExecStopPost=-/sbin/iptables -D DOCKER-USER -i DIFACE -p tcp --dport 9150 -j MISTBORN_LOG_DROP
|
||||
|
||||
[Install]
|
||||
WantedBy=Mistborn-base.service
|
||||
@@ -0,0 +1,70 @@
|
||||
# Wazuh App Copyright (C) 2021 Wazuh Inc. (License GPLv2)
|
||||
version: '3.7'
|
||||
|
||||
services:
|
||||
wazuh:
|
||||
image: wazuh/wazuh-odfe:4.1.5
|
||||
hostname: wazuh-manager
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "${MISTBORN_BIND_IP}:1514:1514"
|
||||
- "${MISTBORN_BIND_IP}:1515:1515"
|
||||
- "${MISTBORN_BIND_IP}:514:514/udp"
|
||||
- "${MISTBORN_BIND_IP}:55000:55000"
|
||||
environment:
|
||||
- FILEBEAT_SSL_VERIFICATION_MODE=none
|
||||
env_file:
|
||||
- ../.envs/.production/.wazuh
|
||||
volumes:
|
||||
- ossec_api_configuration:/var/ossec/api/configuration
|
||||
- ossec_etc:/var/ossec/etc
|
||||
- ossec_logs:/var/ossec/logs
|
||||
- ossec_queue:/var/ossec/queue
|
||||
- ossec_var_multigroups:/var/ossec/var/multigroups
|
||||
- ossec_integrations:/var/ossec/integrations
|
||||
- ossec_active_response:/var/ossec/active-response/bin
|
||||
- ossec_agentless:/var/ossec/agentless
|
||||
- ossec_wodles:/var/ossec/wodles
|
||||
- filebeat_etc:/etc/filebeat
|
||||
- filebeat_var:/var/lib/filebeat
|
||||
|
||||
wazuh-kibana:
|
||||
image: wazuh/wazuh-kibana-odfe:4.1.5
|
||||
hostname: wazuh-kibana
|
||||
restart: unless-stopped
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.wazuhk-http.rule=Host(`wazuh.mistborn`)"
|
||||
- "traefik.http.routers.wazuhk-http.entrypoints=web"
|
||||
- "traefik.http.routers.wazuhk-http.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.wazuhk-https.rule=Host(`wazuh.mistborn`)"
|
||||
- "traefik.http.routers.wazuhk-https.entrypoints=websecure"
|
||||
- "traefik.http.routers.wazuhk-https.middlewares=mistborn_auth@file"
|
||||
- "traefik.http.routers.wazuhk-https.tls.certresolver=basic"
|
||||
- "traefik.http.services.wazuhk-service.loadbalancer.server.port=5601"
|
||||
#ports:
|
||||
# - "${MISTBORN_BIND_IP}:5601:5601"
|
||||
environment:
|
||||
- SERVER_SSL_ENABLED=false
|
||||
- SERVER_SSL_CERTIFICATE=/usr/share/kibana/config/opendistroforelasticsearch.example.org.cert
|
||||
- SERVER_SSL_KEY=/usr/share/kibana/config/opendistroforelasticsearch.example.org.key
|
||||
env_file:
|
||||
- ../.envs/.production/.wazuh
|
||||
|
||||
volumes:
|
||||
ossec_api_configuration:
|
||||
ossec_etc:
|
||||
ossec_logs:
|
||||
ossec_queue:
|
||||
ossec_var_multigroups:
|
||||
ossec_integrations:
|
||||
ossec_active_response:
|
||||
ossec_agentless:
|
||||
ossec_wodles:
|
||||
filebeat_etc:
|
||||
filebeat_var:
|
||||
|
||||
networks:
|
||||
default:
|
||||
external:
|
||||
name: mistborn_default
|
||||
@@ -0,0 +1,92 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Wazuh
|
||||
WAZUH_PROD_FILE="$1"
|
||||
echo "ELASTIC_USERNAME=mistborn" > $WAZUH_PROD_FILE
|
||||
echo "ELASTIC_PASSWORD=$MISTBORN_DEFAULT_PASSWORD" >> $WAZUH_PROD_FILE
|
||||
|
||||
echo "ELASTICSEARCH_USERNAME=mistborn" >> $WAZUH_PROD_FILE
|
||||
echo "ELASTICSEARCH_PASSWORD=$MISTBORN_DEFAULT_PASSWORD" >> $WAZUH_PROD_FILE
|
||||
|
||||
# kibana odfe
|
||||
# kibana-odfe/config/wazuh_app_config.sh
|
||||
# https://wazuh
|
||||
echo "WAZUH_API_URL=https://10.2.3.1" >> $WAZUH_PROD_FILE
|
||||
echo "API_PORT=55000" >> $WAZUH_PROD_FILE
|
||||
echo "API_USERNAME=wazuh-wui" >> $WAZUH_PROD_FILE
|
||||
|
||||
#API_PASSWORD=$(python3 -c "import secrets; import string; print(f''.join([secrets.choice(string.ascii_letters+string.digits) for x in range(32)]))")
|
||||
|
||||
API_PASSWORD_PYTHON=$(cat << EOF
|
||||
|
||||
import secrets
|
||||
import random
|
||||
import string
|
||||
|
||||
random_pass = ([secrets.choice("@$!*?-"),
|
||||
secrets.choice(string.digits),
|
||||
secrets.choice(string.ascii_lowercase),
|
||||
secrets.choice(string.ascii_uppercase),
|
||||
]
|
||||
+ [secrets.choice(string.ascii_lowercase
|
||||
+ string.ascii_uppercase
|
||||
+ "@$!*?-"
|
||||
+ string.digits) for i in range(12)])
|
||||
|
||||
random.shuffle(random_pass)
|
||||
random_pass = ''.join(random_pass)
|
||||
print(random_pass)
|
||||
|
||||
EOF
|
||||
)
|
||||
|
||||
API_PASSWORD=$(python3 -c "${API_PASSWORD_PYTHON}")
|
||||
|
||||
echo "API_PASSWORD=${API_PASSWORD}" >> $WAZUH_PROD_FILE
|
||||
|
||||
# kibana-odfe/config/entrypoint.sh:
|
||||
# https://elasticsearch:9200
|
||||
echo "ELASTICSEARCH_URL=https://10.2.3.1:9200" >> $WAZUH_PROD_FILE
|
||||
|
||||
|
||||
cat >> ${WAZUH_PROD_FILE}<< EOF
|
||||
|
||||
PATTERN="wazuh-alerts-*"
|
||||
|
||||
CHECKS_PATTERN=true
|
||||
CHECKS_TEMPLATE=true
|
||||
CHECKS_API=true
|
||||
CHECKS_SETUP=true
|
||||
|
||||
EXTENSIONS_PCI=true
|
||||
EXTENSIONS_GDPR=true
|
||||
EXTENSIONS_HIPAA=true
|
||||
EXTENSIONS_NIST=true
|
||||
EXTENSIONS_TSC=true
|
||||
EXTENSIONS_AUDIT=true
|
||||
EXTENSIONS_OSCAP=false
|
||||
EXTENSIONS_CISCAT=false
|
||||
EXTENSIONS_AWS=false
|
||||
EXTENSIONS_GCP=false
|
||||
EXTENSIONS_VIRUSTOTAL=true
|
||||
EXTENSIONS_OSQUERY=true
|
||||
EXTENSIONS_DOCKER=true
|
||||
|
||||
APP_TIMEOUT=20000
|
||||
|
||||
API_SELECTOR=true
|
||||
IP_SELECTOR=true
|
||||
IP_IGNORE="[]"
|
||||
|
||||
WAZUH_MONITORING_ENABLED=true
|
||||
WAZUH_MONITORING_FREQUENCY=900
|
||||
WAZUH_MONITORING_SHARDS=2
|
||||
WAZUH_MONITORING_REPLICAS=0
|
||||
|
||||
ADMIN_PRIVILEGES=true
|
||||
|
||||
EOF
|
||||
|
||||
echo "MISTBORN_DEFAULT_PASSWORD=$MISTBORN_DEFAULT_PASSWORD" >> $WAZUH_PROD_FILE
|
||||
|
||||
chmod 600 $WAZUH_PROD_FILE
|
||||
@@ -0,0 +1,8 @@
|
||||
[DEFAULT]
|
||||
name = wazuh
|
||||
subdomain = wazuh
|
||||
compose = compose/docker-compose.yml
|
||||
service = service/plugin.service
|
||||
environment = environment/environment.sh
|
||||
resources = resources
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
#!/bin/bash
|
||||
|
||||
# detect if already installed
|
||||
if dpkg -s wazuh-agent &> /dev/null; then
|
||||
echo "Wazuh agent already installed"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# install curl
|
||||
echo "install curl"
|
||||
sudo -E apt-get install -y curl
|
||||
|
||||
# prepare repo
|
||||
echo "Adding Wazuh Repository"
|
||||
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | sudo -E apt-key add -
|
||||
echo "deb https://packages.wazuh.com/4.x/apt/ stable main" | sudo -E tee /etc/apt/sources.list.d/wazuh.list
|
||||
|
||||
apt-get update
|
||||
|
||||
# wait for service to be listening
|
||||
while ! nc -z 10.2.3.1 55000; do
|
||||
WAIT_TIME=10
|
||||
echo "Waiting ${WAIT_TIME} seconds for Wazuh API..."
|
||||
sleep ${WAIT_TIME}
|
||||
done
|
||||
|
||||
# install
|
||||
echo "Installing Wazuh agent"
|
||||
WAZUH_MANAGER="10.2.3.1" apt-get install wazuh-agent
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
|
||||
systemctl start wazuh-agent
|
||||
systemctl enable wazuh-agent
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
|
||||
systemctl stop wazuh-agent
|
||||
systemctl disable wazuh-agent
|
||||
@@ -0,0 +1,129 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# detect if suricata is installed
|
||||
if [[ $(dpkg-query -W -f='${Status}' suricata 2>/dev/null | grep -c "ok installed") -eq 1 ]]; then
|
||||
echo "Suricata Installed"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
source /opt/mistborn/scripts/subinstallers/platform.sh
|
||||
|
||||
# minimal dependencies
|
||||
sudo -E apt-get -y install libpcre3 libpcre3-dbg libpcre3-dev build-essential libpcap-dev \
|
||||
libyaml-0-2 libyaml-dev pkg-config zlib1g zlib1g-dev \
|
||||
make libmagic-dev libjansson-dev jq wget
|
||||
|
||||
## recommended dependencies
|
||||
#sudo -E apt-get -y install libpcre3 libpcre3-dbg libpcre3-dev build-essential libpcap-dev \
|
||||
# libnet1-dev libyaml-0-2 libyaml-dev pkg-config zlib1g zlib1g-dev \
|
||||
# libcap-ng-dev libcap-ng0 make libmagic-dev \
|
||||
# libgeoip-dev liblua5.1-dev libhiredis-dev libevent-dev \
|
||||
# python-yaml rustc cargo
|
||||
|
||||
# iptables/nftables integration
|
||||
sudo -E apt-get -y install libnetfilter-queue-dev libnetfilter-queue1 \
|
||||
libnetfilter-log-dev libnetfilter-log1 \
|
||||
libnfnetlink-dev libnfnetlink0
|
||||
|
||||
|
||||
if [ "$DISTRO" == "ubuntu" ]; then
|
||||
echo "Installing Suricata Ubuntu PPA"
|
||||
sudo -E add-apt-repository -y ppa:oisf/suricata-stable
|
||||
sudo -E apt-get update
|
||||
sudo -E apt-get install -y suricata
|
||||
elif [ "$DISTRO" == "debian" ]; then
|
||||
# retrieve version codename
|
||||
source /etc/os-release
|
||||
echo "deb http://http.debian.net/debian $VERSION_CODENAME-backports main" | \
|
||||
sudo -E tee /etc/apt/sources.list.d/backports.list
|
||||
sudo -E apt-get update
|
||||
sudo -E apt-get install -y suricata -t ${VERSION_CODENAME}-backports
|
||||
else
|
||||
echo "Basic Suricata installation"
|
||||
sudo -E apt-get install -y suricata
|
||||
fi
|
||||
|
||||
# # iptables
|
||||
# sudo iptables -A INPUT -j NFQUEUE
|
||||
# sudo iptables -I FORWARD -j NFQUEUE
|
||||
# sudo iptables -I OUTPUT -j NFQUEUE
|
||||
|
||||
# # rsyslog to create /var/log/suricata.log
|
||||
# sudo cp ./scripts/conf/20-suricata.conf /etc/rsyslog.d/
|
||||
# sudo chown root:root /etc/rsyslog.d/20-suricata.conf
|
||||
# sudo systemctl restart rsyslog
|
||||
|
||||
# rules
|
||||
pushd .
|
||||
cd /tmp
|
||||
wget https://rules.emergingthreats.net/open/suricata-4.0/emerging.rules.tar.gz
|
||||
tar zxvf emerging.rules.tar.gz
|
||||
sudo -E rm /etc/suricata/rules/* -f
|
||||
sudo -E mv rules/*.rules /etc/suricata/rules/
|
||||
popd
|
||||
|
||||
# suricata yaml
|
||||
sudo -E rm -f /etc/suricata/suricata.yaml
|
||||
sudo -E wget -O /etc/suricata/suricata.yaml http://www.branchnetconsulting.com/wazuh/suricata.yaml
|
||||
|
||||
IFACE=$(ip -o -4 route show to default | awk 'NR==1{print $5}')
|
||||
sudo sed -i "s/eth0/${IFACE}/g" /etc/suricata/suricata.yaml
|
||||
sudo sed -i "s/eth0/${IFACE}/g" /etc/default/suricata
|
||||
|
||||
#systemctl restart suricata
|
||||
|
||||
# wait for service to be listening
|
||||
while ! nc -z 10.2.3.1 55000; do
|
||||
WAIT_TIME=10
|
||||
echo "Waiting ${WAIT_TIME} seconds for Wazuh API..."
|
||||
sleep ${WAIT_TIME}
|
||||
done
|
||||
|
||||
# set working directory to mistborn for docker-compose
|
||||
pushd .
|
||||
cd /opt/mistborn
|
||||
|
||||
# ensure group exists
|
||||
sudo docker-compose --env-file /opt/mistborn/.env -f extra/wazuh.yml exec -T wazuh /var/ossec/bin/agent_groups -a -g suricata -q 2>/dev/null
|
||||
|
||||
# add this host to group
|
||||
WAZUH_ID=$(sudo docker-compose --env-file /opt/mistborn/.env -f extra/wazuh.yml exec -T wazuh /var/ossec/bin/manage_agents -l | egrep ^\ *ID | grep $(hostname) | awk '{print $2}' | tr -d ',')
|
||||
sudo docker-compose --env-file /opt/mistborn/.env -f extra/wazuh.yml exec -T wazuh /var/ossec/bin/agent_groups -a -i ${WAZUH_ID} -g suricata -q
|
||||
|
||||
# write agent.conf
|
||||
sudo docker-compose --env-file /opt/mistborn/.env -f extra/wazuh.yml exec -T wazuh bash -c "cat > /var/ossec/etc/shared/suricata/agent.conf << EOF
|
||||
<agent_config>
|
||||
<localfile>
|
||||
<log_format>json</log_format>
|
||||
<location>/var/log/suricata/eve.json</location>
|
||||
</localfile>
|
||||
</agent_config>
|
||||
EOF
|
||||
"
|
||||
|
||||
# restart manager
|
||||
sudo docker-compose --env-file /opt/mistborn/.env -f extra/wazuh.yml restart wazuh
|
||||
|
||||
popd
|
||||
|
||||
# suricata-update
|
||||
sudo -E apt install python3-pip
|
||||
sudo -E pip3 install pyyaml
|
||||
sudo -E pip3 install https://github.com/OISF/suricata-update/archive/master.zip
|
||||
|
||||
sudo -E pip3 install --pre --upgrade suricata-update
|
||||
|
||||
# sudo -E suricata-update enable-source oisf/trafficid
|
||||
# sudo -E suricata-update enable-source etnetera/aggressive
|
||||
# sudo -E suricata-update enable-source sslbl/ssl-fp-blacklist
|
||||
# sudo -E suricata-update enable-source et/open
|
||||
# sudo -E suricata-update enable-source tgreen/hunting
|
||||
# sudo -E suricata-update enable-source sslbl/ja3-fingerprints
|
||||
# sudo -E suricata-update enable-source ptresearch/attackdetection
|
||||
|
||||
sudo -E suricata-update
|
||||
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl restart suricata
|
||||
@@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
systemctl start suricata
|
||||
systemctl enable suricata
|
||||
|
||||
#apt-get install -y python-pyinotify
|
||||
#python /opt/mistborn/scripts/services/scirius/suri_reloader -p /etc/suricata/rules &
|
||||
@@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
systemctl stop suricata
|
||||
systemctl disable suricata
|
||||
|
||||
#kill $(pgrep -f suri_reloader) 2>/dev/null
|
||||
@@ -0,0 +1,30 @@
|
||||
[Unit]
|
||||
Description=Mistborn Wazuh Service
|
||||
Requires=Mistborn-elasticsearch.service
|
||||
After=Mistborn-elasticsearch.service
|
||||
PartOf=Mistborn-base.service
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
RestartSec=15
|
||||
TimeoutStartSec=600
|
||||
User=root
|
||||
Group=docker
|
||||
PermissionsStartOnly=true
|
||||
# Shutdown container (if running) when unit is stopped
|
||||
ExecStartPre=/opt/mistborn/scripts/wrappers/mistborn_docker.sh wazuh docker-compose -f /opt/mistborn/extra/wazuh.yml down
|
||||
# Start container when unit is started
|
||||
ExecStart=/opt/mistborn/scripts/wrappers/mistborn_docker.sh wazuh docker-compose -f /opt/mistborn/extra/wazuh.yml up --build
|
||||
# Agent install
|
||||
ExecStartPost=/opt/mistborn/scripts/wrappers/mistborn_docker.sh wazuh /opt/mistborn/scripts/services/wazuh/agent.sh
|
||||
ExecStartPost=-/opt/mistborn/scripts/wrappers/mistborn_docker.sh wazuh /opt/mistborn/scripts/services/wazuh/agent_start.sh
|
||||
# Suricata
|
||||
ExecStartPost=-/opt/mistborn/scripts/wrappers/mistborn_docker.sh wazuh /opt/mistborn/scripts/services/wazuh/suricata/suricata_init.sh
|
||||
ExecStartPost=-/opt/mistborn/scripts/wrappers/mistborn_docker.sh wazuh /opt/mistborn/scripts/services/wazuh/suricata/suricata_start.sh
|
||||
# Stop container when unit is stopped
|
||||
ExecStop=/opt/mistborn/scripts/wrappers/mistborn_docker.sh wazuh docker-compose -f /opt/mistborn/extra/wazuh.yml down
|
||||
ExecStopPost=-/opt/mistborn/scripts/wrappers/mistborn_docker.sh wazuh /opt/mistborn/scripts/services/wazuh/suricata/suricata_stop.sh
|
||||
ExecStopPost=-/opt/mistborn/scripts/wrappers/mistborn_docker.sh wazuh /opt/mistborn/scripts/services/wazuh/agent_stop.sh
|
||||
|
||||
[Install]
|
||||
WantedBy=Mistborn-base.service
|
||||