Compare commits
	
		
			11 Commits
		
	
	
		
			748d05f8fc
			...
			develop
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						995b34ead5
	
				 | 
					
					
						|||
| 
						
						
							
						
						e2b9e60b36
	
				 | 
					
					
						|||
| 
						
						
							
						
						47ef821c0f
	
				 | 
					
					
						|||
| 
						
						
							
						
						0f07c8c6ab
	
				 | 
					
					
						|||
| 
						
						
							
						
						af053b4d53
	
				 | 
					
					
						|||
| 
						
						
							
						
						de69776bc8
	
				 | 
					
					
						|||
| 
						
						
							
						
						cce94cd210
	
				 | 
					
					
						|||
| 
						
						
							
						
						ed6a036d8d
	
				 | 
					
					
						|||
| 
						
						
							
						
						3871670c91
	
				 | 
					
					
						|||
| 
						
						
							
						
						0e93b2e780
	
				 | 
					
					
						|||
| 
						
						
							
						
						1b5f805195
	
				 | 
					
					
						
							
								
								
									
										15
									
								
								app/.dockerignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								app/.dockerignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
**/.env
 | 
			
		||||
**/*.env
 | 
			
		||||
**/.env.example
 | 
			
		||||
**/storage/app/*
 | 
			
		||||
**/storage/debugbar
 | 
			
		||||
**/storage/framework/cache/*
 | 
			
		||||
**/storage/framework/sessions/*
 | 
			
		||||
**/storage/framework/views/*
 | 
			
		||||
**/storage/framework/testing/*
 | 
			
		||||
**/storage/logs/*
 | 
			
		||||
**/vendor/
 | 
			
		||||
**/node_modules/
 | 
			
		||||
**/public/build/
 | 
			
		||||
**/public/storage
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										15
									
								
								app/application/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										15
									
								
								app/application/package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -15,7 +15,6 @@
 | 
			
		||||
                "sass": "^1.47.0",
 | 
			
		||||
                "simplebar": "^5.3.4",
 | 
			
		||||
                "smooth-scroll": "^16.1.3",
 | 
			
		||||
                "sweetalert2": "^11.0.18",
 | 
			
		||||
                "vanillajs-datepicker": "^1.2.0",
 | 
			
		||||
                "waypoints": "^4.0.1"
 | 
			
		||||
            },
 | 
			
		||||
@@ -1659,15 +1658,6 @@
 | 
			
		||||
                "url": "https://github.com/chalk/supports-color?sponsor=1"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/sweetalert2": {
 | 
			
		||||
            "version": "11.7.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.7.12.tgz",
 | 
			
		||||
            "integrity": "sha512-TQJy8mQymJLzqWPQOMQErd81Zd/rSYr0UL4pEc7bqEihtjS+zt7LWJXLhfPp93e+Hf3Z2FHMB6QGNskAMCsdTg==",
 | 
			
		||||
            "funding": {
 | 
			
		||||
                "type": "individual",
 | 
			
		||||
                "url": "https://github.com/sponsors/limonte"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "node_modules/tapable": {
 | 
			
		||||
            "version": "2.2.1",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
 | 
			
		||||
@@ -3050,11 +3040,6 @@
 | 
			
		||||
                "has-flag": "^4.0.0"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "sweetalert2": {
 | 
			
		||||
            "version": "11.7.12",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.7.12.tgz",
 | 
			
		||||
            "integrity": "sha512-TQJy8mQymJLzqWPQOMQErd81Zd/rSYr0UL4pEc7bqEihtjS+zt7LWJXLhfPp93e+Hf3Z2FHMB6QGNskAMCsdTg=="
 | 
			
		||||
        },
 | 
			
		||||
        "tapable": {
 | 
			
		||||
            "version": "2.2.1",
 | 
			
		||||
            "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,6 @@
 | 
			
		||||
        "sass": "^1.47.0",
 | 
			
		||||
        "simplebar": "^5.3.4",
 | 
			
		||||
        "smooth-scroll": "^16.1.3",
 | 
			
		||||
        "sweetalert2": "^11.0.18",
 | 
			
		||||
        "vanillajs-datepicker": "^1.2.0",
 | 
			
		||||
        "waypoints": "^4.0.1"
 | 
			
		||||
    },
 | 
			
		||||
 
 | 
			
		||||
@@ -23,8 +23,8 @@
 | 
			
		||||
                    <form method="post" action="{{ route('profile.update-password') }}">
 | 
			
		||||
                        @csrf
 | 
			
		||||
                        @method('PUT')
 | 
			
		||||
                        <x-private.forms.input :title="__('validation.attributes.password')" name="password" type="password" required />
 | 
			
		||||
                        <x-private.forms.input :title="__('validation.attributes.password_confirmation')" name="password_confirmation" type="password" required />
 | 
			
		||||
                        <x-private.forms.input :title="__('validation.attributes.password')" name="password" type="password" autocomplete="off" required />
 | 
			
		||||
                        <x-private.forms.input :title="__('validation.attributes.password_confirmation')" name="password_confirmation" autocomplete="off" type="password" required />
 | 
			
		||||
                        <button class="btn btn-primary" type="submit">{{ __('Save') }}</button>
 | 
			
		||||
                    </form>
 | 
			
		||||
                </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,7 @@
 | 
			
		||||
                                <span class="input-group-text" id="basic-addon2">
 | 
			
		||||
                                    <svg class="icon icon-xs text-gray-600" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z" clip-rule="evenodd"></path></svg>
 | 
			
		||||
                                </span>
 | 
			
		||||
                                <input type="password" name="password" placeholder="Password" @demo value="{{ config('app.demo_password', null) }}" @endif class="form-control" id="password" required>
 | 
			
		||||
                                <input type="password" name="password" placeholder="Password" @demo value="{{ config('app.demo_password', null) }}" @endif class="form-control" id="password" autocomplete="off" required>
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </div>
 | 
			
		||||
                        <!-- End of Form -->
 | 
			
		||||
 
 | 
			
		||||
@@ -19,51 +19,9 @@
 | 
			
		||||
const d = document;
 | 
			
		||||
 | 
			
		||||
import * as bootstrap from 'bootstrap';
 | 
			
		||||
import Swal from 'sweetalert2';
 | 
			
		||||
import SmoothScroll from 'smooth-scroll';
 | 
			
		||||
 | 
			
		||||
d.addEventListener("DOMContentLoaded", function(event) {
 | 
			
		||||
 | 
			
		||||
    const swalWithBootstrapButtons = Swal.mixin({
 | 
			
		||||
        customClass: {
 | 
			
		||||
            confirmButton: 'btn btn-primary me-3',
 | 
			
		||||
            cancelButton: 'btn btn-gray'
 | 
			
		||||
        },
 | 
			
		||||
        buttonsStyling: false
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    var themeSettingsEl = document.getElementById('theme-settings');
 | 
			
		||||
    var themeSettingsExpandEl = document.getElementById('theme-settings-expand');
 | 
			
		||||
 | 
			
		||||
    if(themeSettingsEl) {
 | 
			
		||||
 | 
			
		||||
        var themeSettingsCollapse = new bootstrap.Collapse(themeSettingsEl, {
 | 
			
		||||
            show: true,
 | 
			
		||||
            toggle: false
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        if (window.localStorage.getItem('settings_expanded') === 'true') {
 | 
			
		||||
            themeSettingsCollapse.show();
 | 
			
		||||
            themeSettingsExpandEl.classList.remove('show');
 | 
			
		||||
        } else {
 | 
			
		||||
            themeSettingsCollapse.hide();
 | 
			
		||||
            themeSettingsExpandEl.classList.add('show');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        themeSettingsEl.addEventListener('hidden.bs.collapse', function () {
 | 
			
		||||
            themeSettingsExpandEl.classList.add('show');
 | 
			
		||||
            window.localStorage.setItem('settings_expanded', false);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        themeSettingsExpandEl.addEventListener('click', function () {
 | 
			
		||||
            themeSettingsExpandEl.classList.remove('show');
 | 
			
		||||
            window.localStorage.setItem('settings_expanded', true);
 | 
			
		||||
            setTimeout(function() {
 | 
			
		||||
                themeSettingsCollapse.show();
 | 
			
		||||
            }, 300);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // options
 | 
			
		||||
    const breakpoints = {
 | 
			
		||||
        sm: 540,
 | 
			
		||||
@@ -82,13 +40,6 @@ d.addEventListener("DOMContentLoaded", function(event) {
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var iconNotifications = d.querySelector('.notification-bell');
 | 
			
		||||
    if (iconNotifications) {
 | 
			
		||||
        iconNotifications.addEventListener('shown.bs.dropdown', function () {
 | 
			
		||||
            iconNotifications.classList.remove('unread');
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [].slice.call(d.querySelectorAll('[data-background]')).map(function(el) {
 | 
			
		||||
        el.style.background = 'url(' + el.getAttribute('data-background') + ')';
 | 
			
		||||
    });
 | 
			
		||||
@@ -129,68 +80,6 @@ d.addEventListener("DOMContentLoaded", function(event) {
 | 
			
		||||
          });
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    if(d.querySelector('.input-slider-container')) {
 | 
			
		||||
        [].slice.call(d.querySelectorAll('.input-slider-container')).map(function(el) {
 | 
			
		||||
            var slider = el.querySelector(':scope .input-slider');
 | 
			
		||||
            var sliderId = slider.getAttribute('id');
 | 
			
		||||
            var minValue = slider.getAttribute('data-range-value-min');
 | 
			
		||||
            var maxValue = slider.getAttribute('data-range-value-max');
 | 
			
		||||
 | 
			
		||||
            var sliderValue = el.querySelector(':scope .range-slider-value');
 | 
			
		||||
            var sliderValueId = sliderValue.getAttribute('id');
 | 
			
		||||
            var startValue = sliderValue.getAttribute('data-range-value-low');
 | 
			
		||||
 | 
			
		||||
            var c = d.getElementById(sliderId),
 | 
			
		||||
                id = d.getElementById(sliderValueId);
 | 
			
		||||
 | 
			
		||||
            noUiSlider.create(c, {
 | 
			
		||||
                start: [parseInt(startValue)],
 | 
			
		||||
                connect: [true, false],
 | 
			
		||||
                //step: 1000,
 | 
			
		||||
                range: {
 | 
			
		||||
                    'min': [parseInt(minValue)],
 | 
			
		||||
                    'max': [parseInt(maxValue)]
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (d.getElementById('input-slider-range')) {
 | 
			
		||||
        var c = d.getElementById("input-slider-range"),
 | 
			
		||||
            low = d.getElementById("input-slider-range-value-low"),
 | 
			
		||||
            e = d.getElementById("input-slider-range-value-high"),
 | 
			
		||||
            f = [d, e];
 | 
			
		||||
 | 
			
		||||
        noUiSlider.create(c, {
 | 
			
		||||
            start: [parseInt(low.getAttribute('data-range-value-low')), parseInt(e.getAttribute('data-range-value-high'))],
 | 
			
		||||
            connect: !0,
 | 
			
		||||
            tooltips: true,
 | 
			
		||||
            range: {
 | 
			
		||||
                min: parseInt(c.getAttribute('data-range-value-min')),
 | 
			
		||||
                max: parseInt(c.getAttribute('data-range-value-max'))
 | 
			
		||||
            }
 | 
			
		||||
        }), c.noUiSlider.on("update", function (a, b) {
 | 
			
		||||
            f[b].textContent = a[b]
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (d.getElementById('loadOnClick')) {
 | 
			
		||||
        d.getElementById('loadOnClick').addEventListener('click', function () {
 | 
			
		||||
            var button = this;
 | 
			
		||||
            var loadContent = d.getElementById('extraContent');
 | 
			
		||||
            var allLoaded = d.getElementById('allLoadedText');
 | 
			
		||||
 | 
			
		||||
            button.classList.add('btn-loading');
 | 
			
		||||
            button.setAttribute('disabled', 'true');
 | 
			
		||||
 | 
			
		||||
            setTimeout(function () {
 | 
			
		||||
                loadContent.style.display = 'block';
 | 
			
		||||
                button.style.display = 'none';
 | 
			
		||||
                allLoaded.style.display = 'block';
 | 
			
		||||
            }, 1500);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var scroll = new SmoothScroll('a[href*="#"]', {
 | 
			
		||||
        speed: 500,
 | 
			
		||||
        speedAsDuration: true
 | 
			
		||||
@@ -199,68 +88,4 @@ d.addEventListener("DOMContentLoaded", function(event) {
 | 
			
		||||
    if(d.querySelector('.current-year')){
 | 
			
		||||
        d.querySelector('.current-year').textContent = new Date().getFullYear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Glide JS
 | 
			
		||||
 | 
			
		||||
    if (d.querySelector('.glide')) {
 | 
			
		||||
        new Glide('.glide', {
 | 
			
		||||
            type: 'carousel',
 | 
			
		||||
            startAt: 0,
 | 
			
		||||
            perView: 3
 | 
			
		||||
          }).mount();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (d.querySelector('.glide-testimonials')) {
 | 
			
		||||
        new Glide('.glide-testimonials', {
 | 
			
		||||
            type: 'carousel',
 | 
			
		||||
            startAt: 0,
 | 
			
		||||
            perView: 1,
 | 
			
		||||
            autoplay: 2000
 | 
			
		||||
          }).mount();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (d.querySelector('.glide-clients')) {
 | 
			
		||||
        new Glide('.glide-clients', {
 | 
			
		||||
            type: 'carousel',
 | 
			
		||||
            startAt: 0,
 | 
			
		||||
            perView: 5,
 | 
			
		||||
            autoplay: 2000
 | 
			
		||||
          }).mount();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (d.querySelector('.glide-news-widget')) {
 | 
			
		||||
        new Glide('.glide-news-widget', {
 | 
			
		||||
            type: 'carousel',
 | 
			
		||||
            startAt: 0,
 | 
			
		||||
            perView: 1,
 | 
			
		||||
            autoplay: 2000
 | 
			
		||||
          }).mount();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (d.querySelector('.glide-autoplay')) {
 | 
			
		||||
        new Glide('.glide-autoplay', {
 | 
			
		||||
            type: 'carousel',
 | 
			
		||||
            startAt: 0,
 | 
			
		||||
            perView: 3,
 | 
			
		||||
            autoplay: 2000
 | 
			
		||||
          }).mount();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Pricing countup
 | 
			
		||||
    var billingSwitchEl = d.getElementById('billingSwitch');
 | 
			
		||||
    if(billingSwitchEl) {
 | 
			
		||||
        const countUpStandard = new countUp.CountUp('priceStandard', 99, { startVal: 199 });
 | 
			
		||||
        const countUpPremium = new countUp.CountUp('pricePremium', 199, { startVal: 299 });
 | 
			
		||||
 | 
			
		||||
        billingSwitchEl.addEventListener('change', function() {
 | 
			
		||||
            if(billingSwitch.checked) {
 | 
			
		||||
                countUpStandard.start();
 | 
			
		||||
                countUpPremium.start();
 | 
			
		||||
            } else {
 | 
			
		||||
                countUpStandard.reset();
 | 
			
		||||
                countUpPremium.reset();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +0,0 @@
 | 
			
		||||
**/*.env
 | 
			
		||||
**/*.env.example
 | 
			
		||||
application/bootstrap/cache/*
 | 
			
		||||
application/storage/**
 | 
			
		||||
application/vendor/**
 | 
			
		||||
application/node_modules/**
 | 
			
		||||
application/public/build/**
 | 
			
		||||
application/public/storage
 | 
			
		||||
@@ -103,6 +103,7 @@ php artisan config:cache
 | 
			
		||||
php artisan event:cache
 | 
			
		||||
php artisan route:cache
 | 
			
		||||
php artisan view:cache
 | 
			
		||||
php artisan storage:link
 | 
			
		||||
if [ "$role" = "app" ]; then
 | 
			
		||||
  php artisan migrate --force
 | 
			
		||||
fi
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,10 @@ if [ "$role" = "app" ]; then
 | 
			
		||||
    exec unitd --no-daemon --control unix:/var/run/control.unit.sock --user unit --group unit
 | 
			
		||||
elif [ "$role" = "queue" ]; then
 | 
			
		||||
    echo "Running the queue..."
 | 
			
		||||
    php /var/www/html/artisan queue:work --verbose --sleep=5 --tries=10
 | 
			
		||||
    while [ true ]
 | 
			
		||||
    do
 | 
			
		||||
      php /var/www/html/artisan queue:work --verbose --sleep=5 --tries=10 --max-time=3600
 | 
			
		||||
    done
 | 
			
		||||
elif [ "$role" = "websockets" ]; then
 | 
			
		||||
    echo "Running the websockets..."
 | 
			
		||||
    php /var/www/html/artisan reverb:start --port=9000
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,10 @@ if [ "$role" = "app" ]; then
 | 
			
		||||
    exec unitd --no-daemon --control unix:/var/run/control.unit.sock --user unit --group unit
 | 
			
		||||
elif [ "$role" = "queue" ]; then
 | 
			
		||||
    echo "Running the queue..."
 | 
			
		||||
    while [ true ]
 | 
			
		||||
    do
 | 
			
		||||
      php /var/www/html/artisan queue:work --verbose --sleep=5 --tries=10 --max-time=3600
 | 
			
		||||
    done
 | 
			
		||||
elif [ "$role" = "websockets" ]; then
 | 
			
		||||
    echo "Running the websockets..."
 | 
			
		||||
    php /var/www/html/artisan reverb:start --port=9000
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,9 @@ services:
 | 
			
		||||
      - redis
 | 
			
		||||
      - reverb
 | 
			
		||||
    env_file: app/application/.env
 | 
			
		||||
    environment:
 | 
			
		||||
      CONTAINER_ROLE: app
 | 
			
		||||
      UNIT_SOURCE: '"172.16.0.0/12"'
 | 
			
		||||
  queue:
 | 
			
		||||
    build:
 | 
			
		||||
      context: app
 | 
			
		||||
@@ -80,6 +83,8 @@ services:
 | 
			
		||||
  redis:
 | 
			
		||||
    image: redis:3.0-alpine
 | 
			
		||||
    #  restart: always
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./redis/data:/data
 | 
			
		||||
  db:
 | 
			
		||||
    image: docker.io/mysql:8.0.33
 | 
			
		||||
    command: --default-authentication-plugin=mysql_native_password
 | 
			
		||||
 
 | 
			
		||||
@@ -11,15 +11,18 @@ services:
 | 
			
		||||
    ports:
 | 
			
		||||
      - ${DOCKER_NGINX_PORT}:80
 | 
			
		||||
  app:
 | 
			
		||||
    image: korelf/service-captcha:0.8.0
 | 
			
		||||
    image: korelf/service-captcha:0.8.2
 | 
			
		||||
    #  restart: always
 | 
			
		||||
    depends_on:
 | 
			
		||||
      - db
 | 
			
		||||
      - redis
 | 
			
		||||
      - reverb
 | 
			
		||||
    env_file: app/.env
 | 
			
		||||
    environment:
 | 
			
		||||
      CONTAINER_ROLE: app
 | 
			
		||||
      UNIT_SOURCE: '"172.16.0.0/12"'
 | 
			
		||||
  queue:
 | 
			
		||||
    image: korelf/service-captcha:0.8.0
 | 
			
		||||
    image: korelf/service-captcha:0.8.2
 | 
			
		||||
    #  restart: always
 | 
			
		||||
    depends_on:
 | 
			
		||||
      - db
 | 
			
		||||
@@ -28,7 +31,7 @@ services:
 | 
			
		||||
      CONTAINER_ROLE: queue
 | 
			
		||||
    env_file: app/.env
 | 
			
		||||
  reverb:
 | 
			
		||||
    image: korelf/service-captcha:0.8.0
 | 
			
		||||
    image: korelf/service-captcha:0.8.2
 | 
			
		||||
    #  restart: always
 | 
			
		||||
    depends_on:
 | 
			
		||||
      - db
 | 
			
		||||
@@ -39,7 +42,7 @@ services:
 | 
			
		||||
    ports:
 | 
			
		||||
      - ${DOCKER_WEBSOCKET_PORT}:9000
 | 
			
		||||
  scheduler:
 | 
			
		||||
    image: korelf/service-captcha:0.8.0
 | 
			
		||||
    image: korelf/service-captcha:0.8.2
 | 
			
		||||
    #  restart: always
 | 
			
		||||
    depends_on:
 | 
			
		||||
      - db
 | 
			
		||||
@@ -50,6 +53,8 @@ services:
 | 
			
		||||
  redis:
 | 
			
		||||
    image: redis:3.0-alpine
 | 
			
		||||
    #  restart: always
 | 
			
		||||
    volumes:
 | 
			
		||||
      - ./redis/data:/data
 | 
			
		||||
  swagger:
 | 
			
		||||
    image: swaggerapi/swagger-ui
 | 
			
		||||
    depends_on:
 | 
			
		||||
 
 | 
			
		||||
@@ -62,6 +62,8 @@ services:
 | 
			
		||||
            - ./app/application:/var/www/html
 | 
			
		||||
    redis:
 | 
			
		||||
        image: redis:3.0-alpine
 | 
			
		||||
        volumes:
 | 
			
		||||
            - ./redis/data:/data
 | 
			
		||||
    db:
 | 
			
		||||
        image: mysql:8.0.33
 | 
			
		||||
        command: --default-authentication-plugin=mysql_native_password
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								redis/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								redis/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
data/
 | 
			
		||||
		Reference in New Issue
	
	Block a user