mirror of
https://github.com/krislamo/graylog_demo
synced 2026-01-11 13:53:16 +00:00
Compare commits
16 Commits
certs
...
86fcc23047
| Author | SHA1 | Date | |
|---|---|---|---|
|
86fcc23047
|
|||
|
b4e33f4b41
|
|||
|
651a26584a
|
|||
|
e7caff95de
|
|||
|
8cca097e66
|
|||
|
be5f069cdb
|
|||
|
3ae07d16f4
|
|||
|
3c896e40b1
|
|||
|
b5ab0d95bc
|
|||
|
9f78958df4
|
|||
|
9815a86386
|
|||
|
eac9696e19
|
|||
|
c95cbdbaa6
|
|||
|
d9139b715a
|
|||
|
79980fde84
|
|||
|
|
e509d3bad6 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
.vagrant
|
.vagrant
|
||||||
|
tmp
|
||||||
|
|||||||
17
README.md
17
README.md
@@ -1,22 +1,21 @@
|
|||||||
# Graylog Demo
|
# Graylog Demo
|
||||||
|
|
||||||
|
|
||||||
This is a demonstration of Graylog, a centralized log management system featuring a shell provisioned CentOS 7 Vagrant box. To illustrate various log collection methods `httpd`, `rsyslog` and `docker` are installed and a simple WordPress instance is deployed via Docker Compose. Log collection incorporates Fluentd to ship logs into a Graylog instance from containers, the syslog, and arbitrary filesystem logs.
|
This is a demonstration of Graylog, a centralized log management system featuring a shell provisioned CentOS 7 Vagrant box. To illustrate various log collection methods `httpd`, `rsyslog` and `docker` are installed and a simple WordPress instance is deployed via Docker Compose. Log collection incorporates td-agent (a version of Fluentd) to ship logs into a Graylog instance from containers, the syslog, and arbitrary filesystem logs.
|
||||||
|
|
||||||
This demonstration assumes you are familiar with using Vagrant + VirtualBox to automate the installation of virtual machines, although you can reference the Vagrantfile's shell provisioning sections to manually set up a system if you so desire. Please install these prerequisites before attempting the quick start below.
|
This demonstration assumes you are familiar with using Vagrant + VirtualBox to automate the installation of virtual machines, although you can reference the Vagrantfile's shell provisioning sections to manually set up a system if you so desire. Please install these prerequisites before attempting the quick start below.
|
||||||
|
|
||||||
#### Notes about setup
|
#### Notes about setup
|
||||||
- This demonstration uses Traefik for routing and the [xip.io](http://xip.io/) wildcard DNS service. If DNS fails to resolve for whatever reason you may want to set the domains to the IP inside your operating system's hosts file, e.g.
|
- This demonstration uses Traefik for some routing and the [xip.io](http://xip.io/) wildcard DNS service. If DNS fails to resolve for whatever reason you may want to set the domains to the IP inside your operating system's hosts file, e.g.
|
||||||
|
|
||||||
```
|
```
|
||||||
172.28.128.30 traefik.172.28.128.30.xip.io
|
172.28.128.30 traefik.172.28.128.30.xip.io
|
||||||
172.28.128.30 graylog.172.28.128.30.xip.io
|
172.28.128.30 graylog.172.28.128.30.xip.io
|
||||||
172.28.128.30 wordpress.172.28.128.30.xip.io
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- Vagrant will provision a virtual machine with a static private Class B address (specifically `172.28.128.30`). If you would like to change this IP address to something different you will need to change the `PRIVATE_NET_IP` variable and the scripted API calls in the `Vagrantfile`. You'll also need to modify the few wildcard DNS references to it in the two `docker-compose.yml` files.
|
- Vagrant will provision two virtual machines with two consecutive private Class B addresses (starting from `172.28.128.30`). If you would like to change this base IP address to something different you will need to look through the project and find various references. Unfortunately, this is not a simple variable you can set for the entire project.
|
||||||
|
|
||||||
- Vagrant is set to allocate 4 cores and 4 GB of RAM, you may need to adjust this for your machine if necessary.
|
- Vagrant is set to allocate 4 cores and 4 GB of RAM per machine (this is 8 cores / 8 GB of memory total) you may need to adjust this for your machine if necessary.
|
||||||
|
|
||||||
- After deploying, Graylog takes the longest to become available and it may take 30 seconds to a few minutes to bring it up depending on your machine.
|
- After deploying, Graylog takes the longest to become available and it may take 30 seconds to a few minutes to bring it up depending on your machine.
|
||||||
|
|
||||||
@@ -26,7 +25,7 @@ This demonstration assumes you are familiar with using Vagrant + VirtualBox to a
|
|||||||
|
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
_This section assumes you will be using the default `172.28.128.30` IP address_
|
_This section assumes you will be using the default `172.28.128.30` and `172.28.128.31` IP addresses_
|
||||||
1. Clone the repository and navigate inside its directory
|
1. Clone the repository and navigate inside its directory
|
||||||
2. Create and provision the VM using `vagrant up`
|
2. Create and provision the VM using `vagrant up`
|
||||||
3. Navigate to [http://graylog.172.28.128.30.xip.io:8080/](http://graylog.172.28.128.30.xip.io:8080/)
|
3. Navigate to [http://graylog.172.28.128.30.xip.io:8080/](http://graylog.172.28.128.30.xip.io:8080/)
|
||||||
@@ -36,13 +35,13 @@ _This section assumes you will be using the default `172.28.128.30` IP address_
|
|||||||
7. Press the start button on the top right to start updating the feed every second
|
7. Press the start button on the top right to start updating the feed every second
|
||||||
|
|
||||||
#### Docker Test
|
#### Docker Test
|
||||||
- Generate Docker logs by simply navigating to the WordPress install page [http://wordpress.172.28.128.30.xip.io:8080/](http://wordpress.172.28.128.30.xip.io:8080/)
|
- Generate Docker logs by simply navigating to the WordPress install page: [http://172.28.128.31:8080](http://172.28.128.31:8080/wp-admin/install.php)
|
||||||
|
|
||||||
#### File Test
|
#### File Test
|
||||||
- Collect logs from Apache's `access_log` file by going to [http://172.28.128.30/](http://172.28.128.30/)
|
- Collect logs from Apache's `access_log` file by going to [http://172.28.128.31/](http://172.28.128.31/)
|
||||||
|
|
||||||
#### Syslog Test
|
#### Syslog Test
|
||||||
1. Go back to the terminal inside the project's directory and type `vagrant ssh`
|
1. Go back to the terminal inside the project's directory and type `vagrant ssh systems` or `vagrant ssh graylog`
|
||||||
2. You can test Syslog collection with `logger` e.g. `logger -t test Hello world` (or just wait for some to appear)
|
2. You can test Syslog collection with `logger` e.g. `logger -t test Hello world` (or just wait for some to appear)
|
||||||
|
|
||||||
### Copyrights and Licenses
|
### Copyrights and Licenses
|
||||||
|
|||||||
113
Vagrantfile
vendored
113
Vagrantfile
vendored
@@ -1,18 +1,27 @@
|
|||||||
# vi: set ft=ruby :
|
# vi: set ft=ruby :
|
||||||
|
|
||||||
PRIVATE_NET_IP = "172.28.128.30"
|
PRIVATE_NET_IP = "172.28.128."
|
||||||
|
|
||||||
Vagrant.configure("2") do |config|
|
Vagrant.configure("2") do |config|
|
||||||
config.vm.box = "centos/7"
|
|
||||||
config.vm.network "private_network", ip: PRIVATE_NET_IP
|
|
||||||
config.vm.synced_folder ".", "/vagrant", type: "nfs"
|
|
||||||
|
|
||||||
config.vm.provider "virtualbox" do |vbox|
|
vmservers = ["graylog", "systems"]
|
||||||
|
last_octet = 30
|
||||||
|
|
||||||
|
vmservers.each do |server|
|
||||||
|
config.vm.define "#{server}" do |node|
|
||||||
|
node.vm.box = "centos/7"
|
||||||
|
node.vm.hostname = "#{server}"
|
||||||
|
node.vm.network "private_network", ip: PRIVATE_NET_IP + last_octet.to_s
|
||||||
|
node.vm.synced_folder ".", "/vagrant", type: "nfs"
|
||||||
|
last_octet = last_octet + 1
|
||||||
|
|
||||||
|
node.vm.provider "virtualbox" do |vbox|
|
||||||
vbox.memory = 4096
|
vbox.memory = 4096
|
||||||
vbox.cpus = 4
|
vbox.cpus = 4
|
||||||
end
|
end
|
||||||
|
|
||||||
config.vm.provision "shell", inline: <<-SHELL
|
# Common provision
|
||||||
|
node.vm.provision "shell", inline: <<-SHELL
|
||||||
|
|
||||||
# Set SELinux to permissive
|
# Set SELinux to permissive
|
||||||
setenforce 0
|
setenforce 0
|
||||||
@@ -36,51 +45,60 @@ Vagrant.configure("2") do |config|
|
|||||||
# Convenience
|
# Convenience
|
||||||
yum install -y vim
|
yum install -y vim
|
||||||
|
|
||||||
# Install jq
|
|
||||||
yum install -y epel-release
|
|
||||||
yum install -y jq
|
|
||||||
|
|
||||||
# Install apache
|
|
||||||
yum install -y httpd
|
|
||||||
systemctl start httpd
|
|
||||||
systemctl -q enable httpd
|
|
||||||
|
|
||||||
# Install rsyslog
|
# Install rsyslog
|
||||||
yum install -y rsyslog
|
yum install -y rsyslog
|
||||||
systemctl start rsyslog
|
systemctl start rsyslog
|
||||||
systemctl -q enable rsyslog
|
systemctl -q enable rsyslog
|
||||||
|
|
||||||
# Install td-agent
|
|
||||||
cp /vagrant/td-agent.repo /etc/yum.repos.d/
|
|
||||||
yum check-update
|
|
||||||
yum install -y td-agent
|
|
||||||
td-agent-gem install fluent-plugin-gelf-hs gelf
|
|
||||||
cp /vagrant/td-agent.conf /etc/td-agent/td-agent.conf
|
|
||||||
mkdir /var/log/containers
|
|
||||||
chown -R td-agent:td-agent /var/log/containers
|
|
||||||
chmod -R 755 /var/log
|
|
||||||
systemctl restart td-agent
|
|
||||||
systemctl -q enable td-agent
|
|
||||||
|
|
||||||
# Add rsyslog forwarding option if it does not exist
|
# Add rsyslog forwarding option if it does not exist
|
||||||
if ! grep -q "127.0.0.1:5140" /etc/rsyslog.conf; then
|
if ! grep -q "127.0.0.1:5140" /etc/rsyslog.conf; then
|
||||||
echo "*.* @127.0.0.1:5140" >> /etc/rsyslog.conf
|
echo "*.* @127.0.0.1:5140" >> /etc/rsyslog.conf
|
||||||
systemctl restart rsyslog
|
systemctl restart rsyslog
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Setup TLS
|
||||||
|
if [ ! -f /vagrant/tmp/ca_key.pem ]; then
|
||||||
|
echo "Generating TLS certificates..."
|
||||||
|
cd /vagrant/tmp
|
||||||
|
openssl req -newkey rsa:4096 \
|
||||||
|
-x509 \
|
||||||
|
-sha256 \
|
||||||
|
-days 3650 \
|
||||||
|
-nodes \
|
||||||
|
-out ca_cert.pem \
|
||||||
|
-keyout ca_key.pem \
|
||||||
|
-subj "/C=US/ST=Local/L=Local/O=Org/OU=IT/CN=example.com" \
|
||||||
|
2> /dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install td-agent
|
||||||
|
cp /vagrant/td-agent.repo /etc/yum.repos.d/
|
||||||
|
yum check-update
|
||||||
|
yum install -y td-agent
|
||||||
|
td-agent-gem install fluent-plugin-gelf-hs gelf
|
||||||
|
systemctl -q enable td-agent
|
||||||
|
|
||||||
SHELL
|
SHELL
|
||||||
|
|
||||||
# Install newest docker-compose
|
# Commmon provision: install docker-compose
|
||||||
config.vm.provision "shell", path: "install-compose.sh"
|
node.vm.provision "shell", path: "install-compose.sh"
|
||||||
|
|
||||||
# Start compose services and add default input
|
# Graylog specific provision
|
||||||
config.vm.provision "shell", inline: <<-SHELL
|
if server == "graylog"
|
||||||
# Bring up containers
|
node.vm.provision "shell", inline: <<-SHELL
|
||||||
|
|
||||||
|
cp /vagrant/td-agent-server.conf /etc/td-agent/td-agent.conf
|
||||||
|
mkdir -p /var/log/graylog_buffer
|
||||||
|
chown -R td-agent:td-agent /var/log/graylog_buffer
|
||||||
|
systemctl restart td-agent
|
||||||
|
|
||||||
|
# Install jq
|
||||||
|
yum install -y epel-release
|
||||||
|
yum install -y jq
|
||||||
|
|
||||||
|
# Start Graylog
|
||||||
cd /vagrant
|
cd /vagrant
|
||||||
/usr/local/bin/docker-compose up -d 2> /dev/null
|
/usr/local/bin/docker-compose up -d 2> /dev/null
|
||||||
cd /vagrant/wordpress
|
|
||||||
/usr/local/bin/docker-compose up -d 2> /dev/null
|
|
||||||
cd /vagrant
|
|
||||||
|
|
||||||
# Wait 120 seconds for Graylog to come online
|
# Wait 120 seconds for Graylog to come online
|
||||||
SECONDS=0
|
SECONDS=0
|
||||||
@@ -130,6 +148,31 @@ Vagrant.configure("2") do |config|
|
|||||||
-u admin:admin \
|
-u admin:admin \
|
||||||
"http://graylog.172.28.128.30.xip.io:8080/api/system/inputs" \
|
"http://graylog.172.28.128.30.xip.io:8080/api/system/inputs" \
|
||||||
-d @GELFTCPInput.json
|
-d @GELFTCPInput.json
|
||||||
|
|
||||||
|
SHELL
|
||||||
|
|
||||||
|
elsif server == "systems"
|
||||||
|
node.vm.provision "shell", inline: <<-SHELL
|
||||||
|
|
||||||
|
# Install apache
|
||||||
|
yum install -y httpd
|
||||||
|
systemctl start httpd
|
||||||
|
systemctl -q enable httpd
|
||||||
|
|
||||||
|
# Configure td-agent
|
||||||
|
cp /vagrant/td-agent.conf /etc/td-agent/td-agent.conf
|
||||||
|
mkdir -p /var/log/containers /var/log/fluentd_buffer
|
||||||
|
chown -R td-agent:td-agent /var/log/containers /var/log/fluentd_buffer
|
||||||
|
chmod -R 755 /var/log
|
||||||
|
systemctl restart td-agent
|
||||||
|
|
||||||
|
# Bring up WordPress test containers
|
||||||
|
cd /vagrant/wordpress
|
||||||
|
/usr/local/bin/docker-compose up -d 2> /dev/null
|
||||||
|
|
||||||
SHELL
|
SHELL
|
||||||
|
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ version: '3.7'
|
|||||||
services:
|
services:
|
||||||
|
|
||||||
traefik:
|
traefik:
|
||||||
image: traefik:2.1.4
|
image: traefik:2.2.1
|
||||||
restart: always
|
restart: always
|
||||||
networks:
|
networks:
|
||||||
- traefik-net
|
- traefik-net
|
||||||
@@ -24,15 +24,27 @@ services:
|
|||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
volumes:
|
volumes:
|
||||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||||
|
logging:
|
||||||
|
driver: "fluentd"
|
||||||
|
options:
|
||||||
|
fluentd-address: "tcp://127.0.0.1:24224"
|
||||||
|
fluentd-async-connect: "true"
|
||||||
|
tag: traefik
|
||||||
|
|
||||||
mongo:
|
mongo:
|
||||||
image: mongo:4.2.2
|
image: mongo:4.2.8
|
||||||
restart: always
|
restart: always
|
||||||
networks:
|
networks:
|
||||||
- graylog
|
- graylog
|
||||||
|
logging:
|
||||||
|
driver: "fluentd"
|
||||||
|
options:
|
||||||
|
fluentd-address: "tcp://127.0.0.1:24224"
|
||||||
|
fluentd-async-connect: "true"
|
||||||
|
tag: graylog.db
|
||||||
|
|
||||||
elasticsearch:
|
elasticsearch:
|
||||||
image: elasticsearch:6.8.6
|
image: elasticsearch:6.8.10
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
- http:host=0.0.0.0
|
- http:host=0.0.0.0
|
||||||
@@ -45,9 +57,15 @@ services:
|
|||||||
hard: -1
|
hard: -1
|
||||||
networks:
|
networks:
|
||||||
- graylog
|
- graylog
|
||||||
|
logging:
|
||||||
|
driver: "fluentd"
|
||||||
|
options:
|
||||||
|
fluentd-address: "tcp://127.0.0.1:24224"
|
||||||
|
fluentd-async-connect: "true"
|
||||||
|
tag: graylog.elasticsearch
|
||||||
|
|
||||||
graylog:
|
graylog:
|
||||||
image: graylog/graylog:3.2.2
|
image: graylog/graylog:3.3.2
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
- GRAYLOG_PASSWORD_SECRET=LongerPassword01
|
- GRAYLOG_PASSWORD_SECRET=LongerPassword01
|
||||||
@@ -76,6 +94,12 @@ services:
|
|||||||
- 12201:12201
|
- 12201:12201
|
||||||
# GELF UDP
|
# GELF UDP
|
||||||
- 12201:12201/udp
|
- 12201:12201/udp
|
||||||
|
logging:
|
||||||
|
driver: "fluentd"
|
||||||
|
options:
|
||||||
|
fluentd-address: "tcp://127.0.0.1:24224"
|
||||||
|
fluentd-async-connect: "true"
|
||||||
|
tag: graylog
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
traefik-net:
|
traefik-net:
|
||||||
|
|||||||
42
td-agent-server.conf
Normal file
42
td-agent-server.conf
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<source>
|
||||||
|
@type forward
|
||||||
|
port 2514
|
||||||
|
<transport tls>
|
||||||
|
version TLSv1_2
|
||||||
|
insecure true
|
||||||
|
cert_path /vagrant/tmp/ca_cert.pem
|
||||||
|
private_key_path /vagrant/tmp/ca_key.pem
|
||||||
|
</transport>
|
||||||
|
</source>
|
||||||
|
|
||||||
|
<source>
|
||||||
|
@type forward
|
||||||
|
port 24224
|
||||||
|
</source>
|
||||||
|
|
||||||
|
<source>
|
||||||
|
@type syslog
|
||||||
|
port 5140
|
||||||
|
tag system.local
|
||||||
|
</source>
|
||||||
|
|
||||||
|
<filter httpd.access>
|
||||||
|
@type parser
|
||||||
|
key_name message
|
||||||
|
reserve_data true
|
||||||
|
<parse>
|
||||||
|
@type apache2
|
||||||
|
</parse>
|
||||||
|
</filter>
|
||||||
|
|
||||||
|
<match **>
|
||||||
|
@type gelf
|
||||||
|
protocol tcp
|
||||||
|
host localhost
|
||||||
|
port 12201
|
||||||
|
<buffer>
|
||||||
|
@type file
|
||||||
|
path /var/log/graylog_buffer
|
||||||
|
flush_interval 0s
|
||||||
|
</buffer>
|
||||||
|
</match>
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
pos_file /var/log/td-agent/access_log.pos
|
pos_file /var/log/td-agent/access_log.pos
|
||||||
tag httpd.access
|
tag httpd.access
|
||||||
<parse>
|
<parse>
|
||||||
@type apache2
|
@type none
|
||||||
</parse>
|
</parse>
|
||||||
</source>
|
</source>
|
||||||
|
|
||||||
@@ -26,9 +26,14 @@
|
|||||||
path /var/log/containers/${tag}
|
path /var/log/containers/${tag}
|
||||||
append true
|
append true
|
||||||
<buffer tag>
|
<buffer tag>
|
||||||
timekey 5s
|
@type file
|
||||||
flush_mode immediate
|
path /var/log/containers/buffer
|
||||||
|
flush_interval 0s
|
||||||
</buffer>
|
</buffer>
|
||||||
|
<format>
|
||||||
|
@type single_value
|
||||||
|
message_key log
|
||||||
|
</format>
|
||||||
</store>
|
</store>
|
||||||
<store>
|
<store>
|
||||||
@type rewrite_tag_filter
|
@type rewrite_tag_filter
|
||||||
@@ -41,9 +46,17 @@
|
|||||||
</match>
|
</match>
|
||||||
|
|
||||||
<match **>
|
<match **>
|
||||||
@type gelf
|
@type forward
|
||||||
protocol tcp
|
transport tls
|
||||||
host localhost
|
tls_cert_path /vagrant/tmp/ca_cert.pem
|
||||||
port 12201
|
<server>
|
||||||
flush_interval 5s
|
name example.com
|
||||||
|
host 172.28.128.30
|
||||||
|
port 2514
|
||||||
|
</server>
|
||||||
|
<buffer>
|
||||||
|
@type file
|
||||||
|
path /var/log/fluentd_buffer
|
||||||
|
flush_interval 0s
|
||||||
|
</buffer>
|
||||||
</match>
|
</match>
|
||||||
|
|||||||
@@ -11,26 +11,25 @@ services:
|
|||||||
MYSQL_USER: wordpress
|
MYSQL_USER: wordpress
|
||||||
MYSQL_PASSWORD: Password1
|
MYSQL_PASSWORD: Password1
|
||||||
MYSQL_RANDOM_ROOT_PASSWORD: '1'
|
MYSQL_RANDOM_ROOT_PASSWORD: '1'
|
||||||
networks:
|
logging:
|
||||||
- default
|
driver: "fluentd"
|
||||||
|
options:
|
||||||
|
fluentd-address: "tcp://127.0.0.1:24224"
|
||||||
|
fluentd-async-connect: "true"
|
||||||
|
tag: devel.kris.db
|
||||||
|
|
||||||
wordpress:
|
wordpress:
|
||||||
depends_on:
|
depends_on:
|
||||||
- db
|
- db
|
||||||
image: wordpress:latest
|
image: wordpress:latest
|
||||||
restart: always
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 8080:80
|
||||||
environment:
|
environment:
|
||||||
WORDPRESS_DB_HOST: db:3306
|
WORDPRESS_DB_HOST: db:3306
|
||||||
WORDPRESS_DB_USER: wordpress
|
WORDPRESS_DB_USER: wordpress
|
||||||
WORDPRESS_DB_PASSWORD: Password1
|
WORDPRESS_DB_PASSWORD: Password1
|
||||||
WORDPRESS_DB_NAME: wordpress
|
WORDPRESS_DB_NAME: wordpress
|
||||||
networks:
|
|
||||||
- default
|
|
||||||
- traefik-net
|
|
||||||
labels:
|
|
||||||
- "traefik.http.routers.wordpress.rule=Host(`wordpress.172.28.128.30.xip.io`)"
|
|
||||||
- "traefik.docker.network=vagrant_traefik-net"
|
|
||||||
- "traefik.enable=true"
|
|
||||||
logging:
|
logging:
|
||||||
driver: "fluentd"
|
driver: "fluentd"
|
||||||
options:
|
options:
|
||||||
@@ -38,10 +37,5 @@ services:
|
|||||||
fluentd-async-connect: "true"
|
fluentd-async-connect: "true"
|
||||||
tag: devel.kris
|
tag: devel.kris
|
||||||
|
|
||||||
networks:
|
|
||||||
traefik-net:
|
|
||||||
external:
|
|
||||||
name: vagrant_traefik-net
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
db_data: {}
|
db_data: {}
|
||||||
|
|||||||
Reference in New Issue
Block a user