Compare commits

..

13 Commits
0.8.0 ... main

Author SHA1 Message Date
d55c24cfe0 Merge pull request 'Версия 0.8.2' (#6) from develop into main
Reviewed-on: #6
2024-06-11 23:34:32 +05:00
e2b9e60b36
Updated to korelf/service-captcha:0.8.2. 2024-06-11 23:19:32 +05:00
47ef821c0f
Added environment UNIT_SOURCE as an example. 2024-06-11 23:02:48 +05:00
0f07c8c6ab
Improved queue launch in Docker.
Now it does not die, but in a loop inside it restarts php /var/www/html/artisan queue:work --verbose --sleep=5 --tries=10 --max-time=3600.
2024-06-11 22:44:48 +05:00
af053b4d53
Добавил к Redis Volumes. 2024-06-11 22:42:58 +05:00
de69776bc8
Added php artisan storage:link. 2024-06-11 22:42:10 +05:00
cce94cd210
Added autocomplete="off" attribute to input password. 2024-06-11 22:39:15 +05:00
ed6a036d8d
Deleted sweetalert2. 2024-06-11 22:34:55 +05:00
3871670c91
Removed extra code. 2024-06-11 22:30:56 +05:00
0e93b2e780
Fixed .dockerignore. 2024-05-19 21:01:26 +05:00
1b5f805195
Captcha update to 0.8.1. 2024-04-28 20:00:01 +05:00
748d05f8fc Merge pull request 'Версия 0.8.1' (#5) from develop into main
Reviewed-on: #5
2024-04-28 19:54:56 +05:00
b662a85572
Fixed the use of the UNIT_SOURCE parameter for Nginx Unit. 2024-04-28 19:48:20 +05:00
15 changed files with 54 additions and 214 deletions

15
app/.dockerignore Normal file
View 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

View File

@ -15,7 +15,6 @@
"sass": "^1.47.0", "sass": "^1.47.0",
"simplebar": "^5.3.4", "simplebar": "^5.3.4",
"smooth-scroll": "^16.1.3", "smooth-scroll": "^16.1.3",
"sweetalert2": "^11.0.18",
"vanillajs-datepicker": "^1.2.0", "vanillajs-datepicker": "^1.2.0",
"waypoints": "^4.0.1" "waypoints": "^4.0.1"
}, },
@ -1659,15 +1658,6 @@
"url": "https://github.com/chalk/supports-color?sponsor=1" "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": { "node_modules/tapable": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@ -3050,11 +3040,6 @@
"has-flag": "^4.0.0" "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": { "tapable": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",

View File

@ -15,7 +15,6 @@
"sass": "^1.47.0", "sass": "^1.47.0",
"simplebar": "^5.3.4", "simplebar": "^5.3.4",
"smooth-scroll": "^16.1.3", "smooth-scroll": "^16.1.3",
"sweetalert2": "^11.0.18",
"vanillajs-datepicker": "^1.2.0", "vanillajs-datepicker": "^1.2.0",
"waypoints": "^4.0.1" "waypoints": "^4.0.1"
}, },

View File

@ -23,8 +23,8 @@
<form method="post" action="{{ route('profile.update-password') }}"> <form method="post" action="{{ route('profile.update-password') }}">
@csrf @csrf
@method('PUT') @method('PUT')
<x-private.forms.input :title="__('validation.attributes.password')" name="password" 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" type="password" 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> <button class="btn btn-primary" type="submit">{{ __('Save') }}</button>
</form> </form>
</div> </div>

View File

@ -37,7 +37,7 @@
<span class="input-group-text" id="basic-addon2"> <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> <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> </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>
</div> </div>
<!-- End of Form --> <!-- End of Form -->

View File

@ -19,51 +19,9 @@
const d = document; const d = document;
import * as bootstrap from 'bootstrap'; import * as bootstrap from 'bootstrap';
import Swal from 'sweetalert2';
import SmoothScroll from 'smooth-scroll'; import SmoothScroll from 'smooth-scroll';
d.addEventListener("DOMContentLoaded", function(event) { 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 // options
const breakpoints = { const breakpoints = {
sm: 540, 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) { [].slice.call(d.querySelectorAll('[data-background]')).map(function(el) {
el.style.background = 'url(' + el.getAttribute('data-background') + ')'; el.style.background = 'url(' + el.getAttribute('data-background') + ')';
}); });
@ -110,7 +61,7 @@ d.addEventListener("DOMContentLoaded", function(event) {
//Tooltips //Tooltips
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')) var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl) return new bootstrap.Tooltip(tooltipTriggerEl)
}) })
@ -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*="#"]', { var scroll = new SmoothScroll('a[href*="#"]', {
speed: 500, speed: 500,
speedAsDuration: true speedAsDuration: true
@ -199,68 +88,4 @@ d.addEventListener("DOMContentLoaded", function(event) {
if(d.querySelector('.current-year')){ if(d.querySelector('.current-year')){
d.querySelector('.current-year').textContent = new Date().getFullYear(); 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();
}
});
}
}); });

View File

@ -1,8 +0,0 @@
**/*.env
**/*.env.example
application/bootstrap/cache/*
application/storage/**
application/vendor/**
application/node_modules/**
application/public/build/**
application/public/storage

View File

@ -5,6 +5,7 @@ set -euo pipefail
WAITLOOPS=5 WAITLOOPS=5
SLEEPSEC=1 SLEEPSEC=1
unitd="unitd" unitd="unitd"
role=${CONTAINER_ROLE:-app}
curl_put() curl_put()
{ {
@ -22,7 +23,7 @@ curl_put()
return 0 return 0
} }
if [ "$unitd" = "unitd" ] || [ "$unitd" = "unitd-debug" ]; then if [ "$role" = "app" ]; then
echo "$0: Launching Unit daemon to perform initial configuration..." echo "$0: Launching Unit daemon to perform initial configuration..."
/usr/sbin/$unitd --control unix:/var/run/control.unit.sock /usr/sbin/$unitd --control unix:/var/run/control.unit.sock
for i in $(/usr/bin/seq $WAITLOOPS); do for i in $(/usr/bin/seq $WAITLOOPS); do
@ -61,7 +62,7 @@ if [ "$unitd" = "unitd" ] || [ "$unitd" = "unitd-debug" ]; then
if [ ! -z ${UNIT_SOURCE+x} ] if [ ! -z ${UNIT_SOURCE+x} ]
then then
echo "[${UNIT_SOURCE}]" > /docker-entrypoint.d/unit_source.json echo $UNIT_SOURCE > /docker-entrypoint.d/unit_source.json
curl_put "/docker-entrypoint.d/unit_source.json" "config/listeners/*:9000/forwarded/source" curl_put "/docker-entrypoint.d/unit_source.json" "config/listeners/*:9000/forwarded/source"
fi fi

View File

@ -5,6 +5,7 @@ set -euo pipefail
WAITLOOPS=5 WAITLOOPS=5
SLEEPSEC=1 SLEEPSEC=1
unitd="unitd" unitd="unitd"
role=${CONTAINER_ROLE:-app}
curl_put() curl_put()
{ {
@ -22,7 +23,7 @@ curl_put()
return 0 return 0
} }
if [ "$unitd" = "unitd" ] || [ "$unitd" = "unitd-debug" ]; then if [ "$role" = "app" ]; then
echo "$0: Launching Unit daemon to perform initial configuration..." echo "$0: Launching Unit daemon to perform initial configuration..."
/usr/sbin/$unitd --control unix:/var/run/control.unit.sock /usr/sbin/$unitd --control unix:/var/run/control.unit.sock
for i in $(/usr/bin/seq $WAITLOOPS); do for i in $(/usr/bin/seq $WAITLOOPS); do
@ -61,7 +62,7 @@ if [ "$unitd" = "unitd" ] || [ "$unitd" = "unitd-debug" ]; then
if [ ! -z ${UNIT_SOURCE+x} ] if [ ! -z ${UNIT_SOURCE+x} ]
then then
echo "[${UNIT_SOURCE}]" > /docker-entrypoint.d/unit_source.json echo $UNIT_SOURCE > /docker-entrypoint.d/unit_source.json
curl_put "/docker-entrypoint.d/unit_source.json" "config/listeners/*:9000/forwarded/source" curl_put "/docker-entrypoint.d/unit_source.json" "config/listeners/*:9000/forwarded/source"
fi fi
@ -102,7 +103,10 @@ php artisan config:cache
php artisan event:cache php artisan event:cache
php artisan route:cache php artisan route:cache
php artisan view:cache php artisan view:cache
php artisan migrate --force php artisan storage:link
if [ "$role" = "app" ]; then
php artisan migrate --force
fi
chown -R unit:unit /var/www/html chown -R unit:unit /var/www/html
chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache

View File

@ -5,7 +5,10 @@ if [ "$role" = "app" ]; then
exec unitd --no-daemon --control unix:/var/run/control.unit.sock --user unit --group unit exec unitd --no-daemon --control unix:/var/run/control.unit.sock --user unit --group unit
elif [ "$role" = "queue" ]; then elif [ "$role" = "queue" ]; then
echo "Running the queue..." 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 elif [ "$role" = "websockets" ]; then
echo "Running the websockets..." echo "Running the websockets..."
php /var/www/html/artisan reverb:start --port=9000 php /var/www/html/artisan reverb:start --port=9000

View File

@ -5,7 +5,10 @@ if [ "$role" = "app" ]; then
exec unitd --no-daemon --control unix:/var/run/control.unit.sock --user unit --group unit exec unitd --no-daemon --control unix:/var/run/control.unit.sock --user unit --group unit
elif [ "$role" = "queue" ]; then elif [ "$role" = "queue" ]; then
echo "Running the queue..." echo "Running the queue..."
php /var/www/html/artisan queue:work --verbose --sleep=5 --tries=10 --max-time=3600 while [ true ]
do
php /var/www/html/artisan queue:work --verbose --sleep=5 --tries=10 --max-time=3600
done
elif [ "$role" = "websockets" ]; then elif [ "$role" = "websockets" ]; then
echo "Running the websockets..." echo "Running the websockets..."
php /var/www/html/artisan reverb:start --port=9000 php /var/www/html/artisan reverb:start --port=9000

View File

@ -28,6 +28,9 @@ services:
- redis - redis
- reverb - reverb
env_file: app/application/.env env_file: app/application/.env
environment:
CONTAINER_ROLE: app
UNIT_SOURCE: '["172.16.0.0/12"]'
queue: queue:
build: build:
context: app context: app
@ -80,6 +83,8 @@ services:
redis: redis:
image: redis:3.0-alpine image: redis:3.0-alpine
# restart: always # restart: always
volumes:
- ./redis/data:/data
db: db:
image: docker.io/mysql:8.0.33 image: docker.io/mysql:8.0.33
command: --default-authentication-plugin=mysql_native_password command: --default-authentication-plugin=mysql_native_password

View File

@ -11,15 +11,18 @@ services:
ports: ports:
- ${DOCKER_NGINX_PORT}:80 - ${DOCKER_NGINX_PORT}:80
app: app:
image: korelf/service-captcha:0.8.0 image: korelf/service-captcha:0.8.2
# restart: always # restart: always
depends_on: depends_on:
- db - db
- redis - redis
- reverb - reverb
env_file: app/.env env_file: app/.env
environment:
CONTAINER_ROLE: app
UNIT_SOURCE: '["172.16.0.0/12"]'
queue: queue:
image: korelf/service-captcha:0.8.0 image: korelf/service-captcha:0.8.2
# restart: always # restart: always
depends_on: depends_on:
- db - db
@ -28,7 +31,7 @@ services:
CONTAINER_ROLE: queue CONTAINER_ROLE: queue
env_file: app/.env env_file: app/.env
reverb: reverb:
image: korelf/service-captcha:0.8.0 image: korelf/service-captcha:0.8.2
# restart: always # restart: always
depends_on: depends_on:
- db - db
@ -39,7 +42,7 @@ services:
ports: ports:
- ${DOCKER_WEBSOCKET_PORT}:9000 - ${DOCKER_WEBSOCKET_PORT}:9000
scheduler: scheduler:
image: korelf/service-captcha:0.8.0 image: korelf/service-captcha:0.8.2
# restart: always # restart: always
depends_on: depends_on:
- db - db
@ -50,6 +53,8 @@ services:
redis: redis:
image: redis:3.0-alpine image: redis:3.0-alpine
# restart: always # restart: always
volumes:
- ./redis/data:/data
swagger: swagger:
image: swaggerapi/swagger-ui image: swaggerapi/swagger-ui
depends_on: depends_on:

View File

@ -62,6 +62,8 @@ services:
- ./app/application:/var/www/html - ./app/application:/var/www/html
redis: redis:
image: redis:3.0-alpine image: redis:3.0-alpine
volumes:
- ./redis/data:/data
db: db:
image: mysql:8.0.33 image: mysql:8.0.33
command: --default-authentication-plugin=mysql_native_password command: --default-authentication-plugin=mysql_native_password

1
redis/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
data/