Prepare production Docker deployment
This commit is contained in:
+3
-1
@@ -2,19 +2,21 @@ APP_NAME=AirService
|
|||||||
APP_ENV=production
|
APP_ENV=production
|
||||||
APP_KEY=
|
APP_KEY=
|
||||||
APP_DEBUG=false
|
APP_DEBUG=false
|
||||||
APP_URL=https://example.ru
|
APP_URL=https://csk74.online
|
||||||
|
|
||||||
LOG_CHANNEL=stderr
|
LOG_CHANNEL=stderr
|
||||||
LOG_LEVEL=error
|
LOG_LEVEL=error
|
||||||
|
|
||||||
DB_CONNECTION=sqlite
|
DB_CONNECTION=sqlite
|
||||||
DB_DATABASE=/var/www/html/database/sqlite/database.sqlite
|
DB_DATABASE=/var/www/html/database/sqlite/database.sqlite
|
||||||
|
DB_FOREIGN_KEYS=true
|
||||||
|
|
||||||
BROADCAST_DRIVER=log
|
BROADCAST_DRIVER=log
|
||||||
CACHE_DRIVER=file
|
CACHE_DRIVER=file
|
||||||
FILESYSTEM_DISK=local
|
FILESYSTEM_DISK=local
|
||||||
QUEUE_CONNECTION=database
|
QUEUE_CONNECTION=database
|
||||||
SESSION_DRIVER=file
|
SESSION_DRIVER=file
|
||||||
|
SESSION_SECURE_COOKIE=true
|
||||||
SESSION_LIFETIME=120
|
SESSION_LIFETIME=120
|
||||||
|
|
||||||
# S3 (опционально, если нужно хранение файлов)
|
# S3 (опционально, если нужно хранение файлов)
|
||||||
|
|||||||
+3
-2
@@ -11,11 +11,12 @@ FROM php:8.2-fpm-alpine AS app
|
|||||||
WORKDIR /var/www/html
|
WORKDIR /var/www/html
|
||||||
|
|
||||||
RUN apk add --no-cache \
|
RUN apk add --no-cache \
|
||||||
libpng-dev libjpeg-turbo-dev freetype-dev libzip-dev sqlite \
|
libpng-dev libjpeg-turbo-dev freetype-dev libzip-dev sqlite sqlite-dev \
|
||||||
|
oniguruma-dev libxml2-dev \
|
||||||
zip unzip git
|
zip unzip git
|
||||||
|
|
||||||
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
|
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
|
||||||
&& docker-php-ext-install pdo pdo_sqlite gd zip opcache pcntl
|
&& docker-php-ext-install pdo pdo_sqlite mbstring dom xml gd zip opcache pcntl
|
||||||
|
|
||||||
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
|
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use Illuminate\Contracts\Auth\Authenticatable;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class AuthenticatedUserController extends Controller
|
||||||
|
{
|
||||||
|
public function __invoke(Request $request): ?Authenticatable
|
||||||
|
{
|
||||||
|
return $request->user();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Auth;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Services\ActivityLogService;
|
||||||
|
use Illuminate\Http\RedirectResponse;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
|
||||||
|
class LogoutController extends Controller
|
||||||
|
{
|
||||||
|
public function __invoke(Request $request, ActivityLogService $activityLogService): RedirectResponse
|
||||||
|
{
|
||||||
|
if (auth()->check()) {
|
||||||
|
$activityLogService->log(auth()->user(), auth()->user(), auth()->id(), 'logout', 'Выход из системы', $request->ip());
|
||||||
|
}
|
||||||
|
|
||||||
|
Auth::logout();
|
||||||
|
$request->session()->invalidate();
|
||||||
|
$request->session()->regenerateToken();
|
||||||
|
|
||||||
|
return redirect()->route('login')->with('success', 'Вы вышли из системы.');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Support\RoleRedirect;
|
||||||
|
use Illuminate\Http\RedirectResponse;
|
||||||
|
|
||||||
|
class HomeController extends Controller
|
||||||
|
{
|
||||||
|
public function __invoke(): RedirectResponse
|
||||||
|
{
|
||||||
|
if (! auth()->check()) {
|
||||||
|
return redirect()->route('login');
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect()->route(RoleRedirect::routeFor(auth()->user()));
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
-6
@@ -13,7 +13,8 @@ services:
|
|||||||
expose:
|
expose:
|
||||||
- "9000"
|
- "9000"
|
||||||
volumes:
|
volumes:
|
||||||
- storage_uploads:/var/www/html/storage/app/public
|
- storage_public:/var/www/html/storage/app/public
|
||||||
|
- storage_attachments:/var/www/html/storage/app/request-attachments
|
||||||
- storage_logs:/var/www/html/storage/logs
|
- storage_logs:/var/www/html/storage/logs
|
||||||
- sqlite_data:/var/www/html/database/sqlite
|
- sqlite_data:/var/www/html/database/sqlite
|
||||||
networks:
|
networks:
|
||||||
@@ -36,7 +37,8 @@ services:
|
|||||||
- .env
|
- .env
|
||||||
command: ["php", "artisan", "queue:work", "--sleep=3", "--tries=3", "--max-time=3600"]
|
command: ["php", "artisan", "queue:work", "--sleep=3", "--tries=3", "--max-time=3600"]
|
||||||
volumes:
|
volumes:
|
||||||
- storage_uploads:/var/www/html/storage/app/public
|
- storage_public:/var/www/html/storage/app/public
|
||||||
|
- storage_attachments:/var/www/html/storage/app/request-attachments
|
||||||
- storage_logs:/var/www/html/storage/logs
|
- storage_logs:/var/www/html/storage/logs
|
||||||
- sqlite_data:/var/www/html/database/sqlite
|
- sqlite_data:/var/www/html/database/sqlite
|
||||||
networks:
|
networks:
|
||||||
@@ -53,16 +55,16 @@ services:
|
|||||||
container_name: airservice_nginx
|
container_name: airservice_nginx
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- "10.20.0.20:18201:80"
|
- "10.20.0.25:18084:80"
|
||||||
volumes:
|
volumes:
|
||||||
- storage_uploads:/var/www/html/public/storage:ro
|
- storage_public:/var/www/html/public/storage:ro
|
||||||
networks:
|
networks:
|
||||||
- backend
|
- backend
|
||||||
depends_on:
|
depends_on:
|
||||||
app:
|
app:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD-SHELL", "wget -qO- http://127.0.0.1/health || exit 1"]
|
test: ["CMD-SHELL", "wget -qO- http://127.0.0.1/health | grep -q ok"]
|
||||||
interval: 30s
|
interval: 30s
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 5
|
retries: 5
|
||||||
@@ -74,5 +76,6 @@ networks:
|
|||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
sqlite_data:
|
sqlite_data:
|
||||||
storage_uploads:
|
storage_public:
|
||||||
|
storage_attachments:
|
||||||
storage_logs:
|
storage_logs:
|
||||||
|
|||||||
@@ -4,14 +4,30 @@ set -e
|
|||||||
if [ "$DB_CONNECTION" = "sqlite" ]; then
|
if [ "$DB_CONNECTION" = "sqlite" ]; then
|
||||||
DB_DIR=$(dirname "$DB_DATABASE")
|
DB_DIR=$(dirname "$DB_DATABASE")
|
||||||
mkdir -p "$DB_DIR"
|
mkdir -p "$DB_DIR"
|
||||||
|
|
||||||
if [ ! -f "$DB_DATABASE" ]; then
|
if [ ! -f "$DB_DATABASE" ]; then
|
||||||
touch "$DB_DATABASE"
|
touch "$DB_DATABASE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
chown -R www-data:www-data "$DB_DIR"
|
chown -R www-data:www-data "$DB_DIR"
|
||||||
|
chmod 775 "$DB_DIR"
|
||||||
chmod 664 "$DB_DATABASE"
|
chmod 664 "$DB_DATABASE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
mkdir -p \
|
||||||
|
/var/www/html/storage/app/public \
|
||||||
|
/var/www/html/storage/app/request-attachments \
|
||||||
|
/var/www/html/storage/logs \
|
||||||
|
/var/www/html/storage/framework/cache \
|
||||||
|
/var/www/html/storage/framework/sessions \
|
||||||
|
/var/www/html/storage/framework/views \
|
||||||
|
/var/www/html/bootstrap/cache
|
||||||
|
|
||||||
|
chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache
|
||||||
|
chmod -R ug+rwX /var/www/html/storage /var/www/html/bootstrap/cache
|
||||||
|
|
||||||
php artisan migrate --force
|
php artisan migrate --force
|
||||||
|
php artisan storage:link || true
|
||||||
php artisan config:cache
|
php artisan config:cache
|
||||||
php artisan route:cache
|
php artisan route:cache
|
||||||
php artisan view:cache
|
php artisan view:cache
|
||||||
|
|||||||
+2
-4
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use Illuminate\Http\Request;
|
use App\Http\Controllers\Api\AuthenticatedUserController;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -14,6 +14,4 @@ use Illuminate\Support\Facades\Route;
|
|||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
|
Route::middleware('auth:sanctum')->get('/user', AuthenticatedUserController::class);
|
||||||
return $request->user();
|
|
||||||
});
|
|
||||||
|
|||||||
+6
-24
@@ -2,7 +2,9 @@
|
|||||||
|
|
||||||
use App\Http\Controllers\AttachmentController;
|
use App\Http\Controllers\AttachmentController;
|
||||||
use App\Http\Controllers\Auth\ForgotPasswordController;
|
use App\Http\Controllers\Auth\ForgotPasswordController;
|
||||||
|
use App\Http\Controllers\Auth\LogoutController;
|
||||||
use App\Http\Controllers\Auth\ResetPasswordController;
|
use App\Http\Controllers\Auth\ResetPasswordController;
|
||||||
|
use App\Http\Controllers\HomeController;
|
||||||
use App\Livewire\Auth\LoginPage;
|
use App\Livewire\Auth\LoginPage;
|
||||||
use App\Livewire\Dashboard\DashboardPage;
|
use App\Livewire\Dashboard\DashboardPage;
|
||||||
use App\Livewire\Directories\DepartmentsPage;
|
use App\Livewire\Directories\DepartmentsPage;
|
||||||
@@ -26,19 +28,9 @@ use App\Livewire\Tasks\MyTasksPage;
|
|||||||
use App\Livewire\Users\UserFormPage;
|
use App\Livewire\Users\UserFormPage;
|
||||||
use App\Livewire\Users\UserShowPage;
|
use App\Livewire\Users\UserShowPage;
|
||||||
use App\Livewire\Users\UsersIndexPage;
|
use App\Livewire\Users\UsersIndexPage;
|
||||||
use App\Services\ActivityLogService;
|
|
||||||
use App\Support\RoleRedirect;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Illuminate\Support\Facades\Auth;
|
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
|
|
||||||
Route::get('/', function () {
|
Route::get('/', HomeController::class);
|
||||||
if (!auth()->check()) {
|
|
||||||
return redirect()->route('login');
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->route(RoleRedirect::routeFor(auth()->user()));
|
|
||||||
});
|
|
||||||
|
|
||||||
Route::middleware('guest')->group(function () {
|
Route::middleware('guest')->group(function () {
|
||||||
Route::get('/login', LoginPage::class)->name('login');
|
Route::get('/login', LoginPage::class)->name('login');
|
||||||
@@ -48,17 +40,7 @@ Route::middleware('guest')->group(function () {
|
|||||||
Route::post('/reset-password', [ResetPasswordController::class, 'store'])->name('password.store');
|
Route::post('/reset-password', [ResetPasswordController::class, 'store'])->name('password.store');
|
||||||
});
|
});
|
||||||
|
|
||||||
Route::post('/logout', function (Request $request, ActivityLogService $activityLogService) {
|
Route::post('/logout', LogoutController::class)->middleware('auth')->name('logout');
|
||||||
if (auth()->check()) {
|
|
||||||
$activityLogService->log(auth()->user(), auth()->user(), auth()->id(), 'logout', 'Выход из системы', $request->ip());
|
|
||||||
}
|
|
||||||
|
|
||||||
Auth::logout();
|
|
||||||
$request->session()->invalidate();
|
|
||||||
$request->session()->regenerateToken();
|
|
||||||
|
|
||||||
return redirect()->route('login')->with('success', 'Вы вышли из системы.');
|
|
||||||
})->middleware('auth')->name('logout');
|
|
||||||
|
|
||||||
Route::middleware(['auth', 'active_user'])->group(function () {
|
Route::middleware(['auth', 'active_user'])->group(function () {
|
||||||
Route::get('/profile', ProfilePage::class)->name('profile');
|
Route::get('/profile', ProfilePage::class)->name('profile');
|
||||||
@@ -89,7 +71,7 @@ Route::middleware(['auth', 'active_user'])->group(function () {
|
|||||||
->whereNumber('user')
|
->whereNumber('user')
|
||||||
->name('users.show');
|
->name('users.show');
|
||||||
|
|
||||||
Route::get('/reports', fn () => redirect()->route('reports.general'))->name('reports');
|
Route::redirect('/reports', '/reports/general')->name('reports');
|
||||||
Route::get('/reports/general', GeneralReportPage::class)->name('reports.general');
|
Route::get('/reports/general', GeneralReportPage::class)->name('reports.general');
|
||||||
Route::get('/reports/technicians', TechniciansReportPage::class)->name('reports.technicians');
|
Route::get('/reports/technicians', TechniciansReportPage::class)->name('reports.technicians');
|
||||||
Route::get('/reports/sla', SlaReportPage::class)->name('reports.sla');
|
Route::get('/reports/sla', SlaReportPage::class)->name('reports.sla');
|
||||||
@@ -102,7 +84,7 @@ Route::middleware(['auth', 'active_user'])->group(function () {
|
|||||||
->whereNumber('user')
|
->whereNumber('user')
|
||||||
->name('users.edit');
|
->name('users.edit');
|
||||||
|
|
||||||
Route::get('/directories', fn () => redirect()->route('directories.departments'))->name('directories');
|
Route::redirect('/directories', '/directories/departments')->name('directories');
|
||||||
Route::get('/directories/departments', DepartmentsPage::class)->name('directories.departments');
|
Route::get('/directories/departments', DepartmentsPage::class)->name('directories.departments');
|
||||||
Route::get('/directories/equipment-categories', EquipmentCategoriesPage::class)->name('directories.equipment-categories');
|
Route::get('/directories/equipment-categories', EquipmentCategoriesPage::class)->name('directories.equipment-categories');
|
||||||
Route::get('/directories/request-types', RequestTypesPage::class)->name('directories.request-types');
|
Route::get('/directories/request-types', RequestTypesPage::class)->name('directories.request-types');
|
||||||
|
|||||||
Reference in New Issue
Block a user