Prepare production Docker deployment

This commit is contained in:
2026-06-03 01:58:00 +05:00
parent 7b655ff3de
commit c3497ee62d
9 changed files with 97 additions and 37 deletions
+3 -1
View File
@@ -2,19 +2,21 @@ APP_NAME=AirService
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=https://example.ru
APP_URL=https://csk74.online
LOG_CHANNEL=stderr
LOG_LEVEL=error
DB_CONNECTION=sqlite
DB_DATABASE=/var/www/html/database/sqlite/database.sqlite
DB_FOREIGN_KEYS=true
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=database
SESSION_DRIVER=file
SESSION_SECURE_COOKIE=true
SESSION_LIFETIME=120
# S3 (опционально, если нужно хранение файлов)
+3 -2
View File
@@ -11,11 +11,12 @@ FROM php:8.2-fpm-alpine AS app
WORKDIR /var/www/html
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
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
@@ -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', 'Вы вышли из системы.');
}
}
+18
View File
@@ -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
View File
@@ -13,7 +13,8 @@ services:
expose:
- "9000"
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
- sqlite_data:/var/www/html/database/sqlite
networks:
@@ -36,7 +37,8 @@ services:
- .env
command: ["php", "artisan", "queue:work", "--sleep=3", "--tries=3", "--max-time=3600"]
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
- sqlite_data:/var/www/html/database/sqlite
networks:
@@ -53,16 +55,16 @@ services:
container_name: airservice_nginx
restart: unless-stopped
ports:
- "10.20.0.20:18201:80"
- "10.20.0.25:18084:80"
volumes:
- storage_uploads:/var/www/html/public/storage:ro
- storage_public:/var/www/html/public/storage:ro
networks:
- backend
depends_on:
app:
condition: service_healthy
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
timeout: 5s
retries: 5
@@ -74,5 +76,6 @@ networks:
volumes:
sqlite_data:
storage_uploads:
storage_public:
storage_attachments:
storage_logs:
+16
View File
@@ -4,14 +4,30 @@ set -e
if [ "$DB_CONNECTION" = "sqlite" ]; then
DB_DIR=$(dirname "$DB_DATABASE")
mkdir -p "$DB_DIR"
if [ ! -f "$DB_DATABASE" ]; then
touch "$DB_DATABASE"
fi
chown -R www-data:www-data "$DB_DIR"
chmod 775 "$DB_DIR"
chmod 664 "$DB_DATABASE"
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 storage:link || true
php artisan config:cache
php artisan route:cache
php artisan view:cache
+2 -4
View File
@@ -1,6 +1,6 @@
<?php
use Illuminate\Http\Request;
use App\Http\Controllers\Api\AuthenticatedUserController;
use Illuminate\Support\Facades\Route;
/*
@@ -14,6 +14,4 @@ use Illuminate\Support\Facades\Route;
|
*/
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
Route::middleware('auth:sanctum')->get('/user', AuthenticatedUserController::class);
+6 -24
View File
@@ -2,7 +2,9 @@
use App\Http\Controllers\AttachmentController;
use App\Http\Controllers\Auth\ForgotPasswordController;
use App\Http\Controllers\Auth\LogoutController;
use App\Http\Controllers\Auth\ResetPasswordController;
use App\Http\Controllers\HomeController;
use App\Livewire\Auth\LoginPage;
use App\Livewire\Dashboard\DashboardPage;
use App\Livewire\Directories\DepartmentsPage;
@@ -26,19 +28,9 @@ use App\Livewire\Tasks\MyTasksPage;
use App\Livewire\Users\UserFormPage;
use App\Livewire\Users\UserShowPage;
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;
Route::get('/', function () {
if (!auth()->check()) {
return redirect()->route('login');
}
return redirect()->route(RoleRedirect::routeFor(auth()->user()));
});
Route::get('/', HomeController::class);
Route::middleware('guest')->group(function () {
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('/logout', function (Request $request, ActivityLogService $activityLogService) {
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::post('/logout', LogoutController::class)->middleware('auth')->name('logout');
Route::middleware(['auth', 'active_user'])->group(function () {
Route::get('/profile', ProfilePage::class)->name('profile');
@@ -89,7 +71,7 @@ Route::middleware(['auth', 'active_user'])->group(function () {
->whereNumber('user')
->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/technicians', TechniciansReportPage::class)->name('reports.technicians');
Route::get('/reports/sla', SlaReportPage::class)->name('reports.sla');
@@ -102,7 +84,7 @@ Route::middleware(['auth', 'active_user'])->group(function () {
->whereNumber('user')
->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/equipment-categories', EquipmentCategoriesPage::class)->name('directories.equipment-categories');
Route::get('/directories/request-types', RequestTypesPage::class)->name('directories.request-types');