Add missing app files and fix Docker configuration

- Add all PHP app files (controllers, middleware, providers, models, enums)
  that were previously gitignored via app/.gitignore wildcard
- Fix app/.gitignore to no longer ignore all files
- Fix docker-compose.yml: use named volume for postgres to avoid chown permission errors on server
- Fix Dockerfile: use --classmap-authoritative for composer dump-autoload

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-06 05:11:39 +05:00
parent 50e72d171f
commit c193bbc32a
50 changed files with 1310 additions and 6 deletions

View File

@@ -52,7 +52,7 @@ RUN composer install \
--no-autoloader \
--prefer-dist
RUN composer dump-autoload --no-scripts --optimize && \
RUN composer dump-autoload --no-scripts --optimize --classmap-authoritative && \
chown -R root:www-data /var/www && \
chmod 755 -R /var/www && \
chmod -R 775 /var/www/bootstrap/cache

4
app/.gitignore vendored
View File

@@ -1,3 +1 @@
*
!public/
!.gitignore
.gitignore

32
app/Console/Kernel.php Normal file
View File

@@ -0,0 +1,32 @@
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
// $schedule->command('inspire')->hourly();
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}

11
app/Enums/RoleEnum.php Normal file
View File

@@ -0,0 +1,11 @@
<?php
namespace App\Enums;
enum RoleEnum: string
{
case ADMIN = 'admin';
case USER = 'user';
case APPRAISER = 'appraiser';
case DILLER = 'diller';
}

View File

@@ -0,0 +1,50 @@
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
class Handler extends ExceptionHandler
{
/**
* A list of exception types with their corresponding custom log levels.
*
* @var array<class-string<\Throwable>, \Psr\Log\LogLevel::*>
*/
protected $levels = [
//
];
/**
* A list of the exception types that are not reported.
*
* @var array<int, class-string<\Throwable>>
*/
protected $dontReport = [
//
];
/**
* A list of the inputs that are never flashed to the session on validation exceptions.
*
* @var array<int, string>
*/
protected $dontFlash = [
'current_password',
'password',
'password_confirmation',
];
/**
* Register the exception handling callbacks for the application.
*
* @return void
*/
public function register()
{
$this->reportable(function (Throwable $e) {
//
});
}
}

View File

@@ -0,0 +1,18 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ConfirmsPasswords;
class ConfirmPasswordController extends Controller
{
use ConfirmsPasswords;
protected $redirectTo = '/';
public function __construct()
{
$this->middleware('auth');
}
}

View File

@@ -0,0 +1,11 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
class ForgotPasswordController extends Controller
{
use SendsPasswordResetEmails;
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
use AuthenticatesUsers;
protected $redirectTo = '/';
public function __construct()
{
$this->middleware('guest')->except('logout');
}
public function username()
{
return 'phone';
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
class RegisterController extends Controller
{
use RegistersUsers;
protected $redirectTo = '/';
public function __construct()
{
$this->middleware('guest');
}
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
}

View File

@@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ResetsPasswords;
class ResetPasswordController extends Controller
{
use ResetsPasswords;
protected $redirectTo = '/';
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\VerifiesEmails;
class VerificationController extends Controller
{
use VerifiesEmails;
protected $redirectTo = '/';
public function __construct()
{
$this->middleware('auth');
$this->middleware('signed')->only('verify');
$this->middleware('throttle:6,1')->only('verify', 'resend');
}
}

View File

@@ -0,0 +1,58 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class AutoController extends Controller
{
public function index()
{
return view('auto.index');
}
public function create()
{
return view('auto.create');
}
public function store(Request $request)
{
return redirect()->route('auto.index');
}
public function edit($id)
{
return view('auto.edit', compact('id'));
}
public function update(Request $request, $id)
{
return redirect()->route('auto.index');
}
public function show($order)
{
return view('auto.show', compact('order'));
}
public function showActivities($order)
{
return view('auto.show-activities', compact('order'));
}
public function showTeam($order)
{
return view('auto.show-team', compact('order'));
}
public function showDocuments($order)
{
return view('auto.show-documents', compact('order'));
}
public function orderClone($id)
{
return redirect()->route('auto.index');
}
}

View File

@@ -0,0 +1,48 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class BonusController extends Controller
{
public function index()
{
return view('bonus.index');
}
public function create()
{
return view('bonus.create');
}
public function store(Request $request)
{
return redirect()->route('bonus.index');
}
public function show($id)
{
return view('bonus.show', compact('id'));
}
public function edit($id)
{
return view('bonus.edit', compact('id'));
}
public function update(Request $request, $id)
{
return redirect()->route('bonus.index');
}
public function destroy($id)
{
return redirect()->route('bonus.index');
}
public function storeCredit(Request $request)
{
return redirect()->back();
}
}

View File

@@ -0,0 +1,43 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class CertificateController extends Controller
{
public function index()
{
return view('certificate.index');
}
public function create()
{
return view('certificate.create');
}
public function store(Request $request)
{
return redirect()->route('certificates.index');
}
public function show($id)
{
return view('certificate.show', compact('id'));
}
public function edit($id)
{
return view('certificate.edit', compact('id'));
}
public function update(Request $request, $id)
{
return redirect()->route('certificates.index');
}
public function destroy($id)
{
return redirect()->route('certificates.index');
}
}

View File

@@ -0,0 +1,43 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ConcernController extends Controller
{
public function index()
{
return view('concerns.index');
}
public function create()
{
return view('concerns.create');
}
public function store(Request $request)
{
return redirect()->route('concerns.index');
}
public function show($id)
{
return view('concerns.show', compact('id'));
}
public function edit($id)
{
return view('concerns.edit', compact('id'));
}
public function update(Request $request, $id)
{
return redirect()->route('concerns.index');
}
public function destroy($id)
{
return redirect()->route('concerns.index');
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ConclusionController extends Controller
{
public function create($id, $type)
{
return view('conclusion.create', compact('id', 'type'));
}
public function store(Request $request)
{
return redirect()->back();
}
public function reject(Request $request)
{
return redirect()->back();
}
public function testWaterMark()
{
return view('conclusion.watermark');
}
}

View File

@@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}

View File

@@ -0,0 +1,43 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class DebitController extends Controller
{
public function index()
{
return view('debit.index');
}
public function create()
{
return view('debit.create');
}
public function store(Request $request)
{
return redirect()->route('debit.index');
}
public function show($id)
{
return view('debit.show', compact('id'));
}
public function edit($id)
{
return view('debit.edit', compact('id'));
}
public function update(Request $request, $id)
{
return redirect()->route('debit.index');
}
public function destroy($id)
{
return redirect()->route('debit.index');
}
}

View File

@@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class DillerController extends Controller
{
public function __invoke(Request $request)
{
return view('diller.index');
}
}

View File

@@ -0,0 +1,43 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class DistrictController extends Controller
{
public function index()
{
return view('districts.index');
}
public function create()
{
return view('districts.create');
}
public function store(Request $request)
{
return redirect()->route('districts.index');
}
public function show($id)
{
return view('districts.show', compact('id'));
}
public function edit($id)
{
return view('districts.edit', compact('id'));
}
public function update(Request $request, $id)
{
return redirect()->route('districts.index');
}
public function destroy($id)
{
return redirect()->route('districts.index');
}
}

View File

@@ -0,0 +1,58 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class EstateController extends Controller
{
public function index()
{
return view('estate.index');
}
public function create()
{
return view('estate.create');
}
public function store(Request $request)
{
return redirect()->route('estate.index');
}
public function edit($id)
{
return view('estate.edit', compact('id'));
}
public function update(Request $request, $id)
{
return redirect()->route('estate.index');
}
public function show($order)
{
return view('estate.show', compact('order'));
}
public function showActivities($order)
{
return view('estate.show-activities', compact('order'));
}
public function showTeam($order)
{
return view('estate.show-team', compact('order'));
}
public function showDocuments($order)
{
return view('estate.show-documents', compact('order'));
}
public function orderClone($id)
{
return redirect()->route('estate.index');
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class FileStoreController extends Controller
{
public function attachFiles(Request $request)
{
return redirect()->back();
}
public function attachProfileFiles(Request $request)
{
return redirect()->back();
}
public function downloadFile($file)
{
abort(404);
}
public function delete($file)
{
return redirect()->back();
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function index()
{
return view('index');
}
public function lang($locale)
{
session()->put('locale', $locale);
return redirect()->back();
}
public function pages($any = null)
{
return view('pages.index');
}
}

View File

@@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class NotificationTemplateController extends Controller
{
public function index()
{
return view('notification.template.index');
}
}

View File

@@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class NotificationTypeController extends Controller
{
public function __invoke(Request $request)
{
return view('notification.type.index');
}
}

View File

@@ -0,0 +1,18 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class OrderMembersController extends Controller
{
public function remove(Request $request)
{
return redirect()->back();
}
public function invite(Request $request)
{
return redirect()->back();
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProfileController extends Controller
{
public function updateProfile(Request $request, $id)
{
return redirect()->back();
}
public function updatePassword(Request $request, $id)
{
return redirect()->back();
}
public function profile()
{
return view('profile.index');
}
public function showActivities()
{
return view('profile.show-activities');
}
public function showProjects()
{
return view('profile.show-projects');
}
public function showDocuments()
{
return view('profile.show-documents');
}
}

View File

@@ -0,0 +1,43 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PurposeController extends Controller
{
public function index()
{
return view('purposes.index');
}
public function create()
{
return view('purposes.create');
}
public function store(Request $request)
{
return redirect()->route('purposes.index');
}
public function show($id)
{
return view('purposes.show', compact('id'));
}
public function edit($id)
{
return view('purposes.edit', compact('id'));
}
public function update(Request $request, $id)
{
return redirect()->route('purposes.index');
}
public function destroy($id)
{
return redirect()->route('purposes.index');
}
}

View File

@@ -0,0 +1,18 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class QrController extends Controller
{
public function show($content)
{
return view('qr.show', compact('content'));
}
public function reGenerate($id, $type)
{
return redirect()->back();
}
}

View File

@@ -0,0 +1,48 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class RegionController extends Controller
{
public function index()
{
return view('regions.index');
}
public function create()
{
return view('regions.create');
}
public function store(Request $request)
{
return redirect()->route('regions.index');
}
public function show($id)
{
return view('regions.show', compact('id'));
}
public function edit($id)
{
return view('regions.edit', compact('id'));
}
public function update(Request $request, $id)
{
return redirect()->route('regions.index');
}
public function destroy($id)
{
return redirect()->route('regions.index');
}
public function districts($id)
{
return response()->json([]);
}
}

View File

@@ -0,0 +1,18 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class RoleController extends Controller
{
public function index()
{
return view('role.index');
}
public function permit(Request $request)
{
return redirect()->back();
}
}

View File

@@ -0,0 +1,11 @@
<?php
namespace App\Http\Controllers;
class ToolsController extends Controller
{
public function index()
{
return view('tools.index');
}
}

View File

@@ -0,0 +1,68 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index()
{
return view('user.index');
}
public function create(Request $request)
{
return redirect()->route('user.index');
}
public function show($id)
{
return view('user.show', compact('id'));
}
public function edit()
{
return view('user.edit');
}
public function update(Request $request)
{
return redirect()->back();
}
public function favourite($id)
{
return redirect()->back();
}
public function updatePassword(Request $request)
{
return redirect()->back();
}
public function activate($id)
{
return redirect()->back();
}
public function block($id)
{
return redirect()->back();
}
public function appraisers()
{
return view('user.appraisers');
}
public function appraisersBonus()
{
return view('user.appraisers-bonus');
}
public function destroy($id)
{
return redirect()->route('user.index');
}
}

View File

@@ -0,0 +1,18 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserInfoController extends Controller
{
public function edit()
{
return view('user-info.edit');
}
public function update(Request $request)
{
return redirect()->back();
}
}

67
app/Http/Kernel.php Normal file
View File

@@ -0,0 +1,67 @@
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array<int, class-string|string>
*/
protected $middleware = [
// \App\Http\Middleware\TrustHosts::class,
\App\Http\Middleware\TrustProxies::class,
\Fruitcake\Cors\HandleCors::class,
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
/**
* The application's route middleware groups.
*
* @var array<string, array<int, class-string|string>>
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array<string, class-string|string>
*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \App\Http\Middleware\ConfirmPassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
}

View File

@@ -0,0 +1,16 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
use Illuminate\Http\Request;
class Authenticate extends Middleware
{
protected function redirectTo($request)
{
if (! $request->expectsJson()) {
return route('login');
}
}
}

View File

@@ -0,0 +1,10 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\RequirePassword;
class ConfirmPassword extends RequirePassword
{
//
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
class EncryptCookies extends Middleware
{
protected $except = [
//
];
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance as Middleware;
class PreventRequestsDuringMaintenance extends Middleware
{
protected $except = [
//
];
}

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Http\Middleware;
use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
public function handle(Request $request, Closure $next, string ...$guards): mixed
{
$guards = empty($guards) ? [null] : $guards;
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
return redirect(RouteServiceProvider::HOME);
}
}
return $next($request);
}
}

View File

@@ -0,0 +1,14 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
class TrimStrings extends Middleware
{
protected $except = [
'current_password',
'password',
'password_confirmation',
];
}

View File

@@ -0,0 +1,18 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Middleware\TrustProxies as Middleware;
use Illuminate\Http\Request;
class TrustProxies extends Middleware
{
protected $proxies;
protected $headers =
Request::HEADER_X_FORWARDED_FOR |
Request::HEADER_X_FORWARDED_HOST |
Request::HEADER_X_FORWARDED_PORT |
Request::HEADER_X_FORWARDED_PROTO |
Request::HEADER_X_FORWARDED_AWS_ELB;
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
protected $except = [
//
];
}

22
app/Models/Debit.php Normal file
View File

@@ -0,0 +1,22 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Debit extends Model
{
public static $NOPAID = 'nopaid';
public static $PAID = 'paid';
public static $REJECTED = 'rejected';
protected $fillable = [
'appraiser_id',
'order_id',
'cost',
'customer',
'expired',
'order_type',
'status',
];
}

34
app/Models/User.php Normal file
View File

@@ -0,0 +1,34 @@
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
protected $fillable = [
'name',
'phone',
'password',
'avatar',
'status',
'role',
'balance',
'last_login',
'email_verified_at',
];
protected $hidden = [
'password',
'remember_token',
];
protected $casts = [
'email_verified_at' => 'datetime',
'last_login' => 'datetime',
];
}

View File

@@ -0,0 +1,18 @@
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
//
}
public function boot()
{
//
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
//
];
public function boot()
{
$this->registerPolicies();
}
}

View File

@@ -0,0 +1,21 @@
<?php
namespace App\Providers;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];
public function boot()
{
//
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
public const HOME = '/';
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
});
}
protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
}
}

View File

@@ -27,11 +27,13 @@ services:
image: postgres:10
restart: always
volumes:
- ./postgres/data:/var/lib/postgresql/data
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_DATABASE: rate_app
POSTGRES_USER: rate_app
POSTGRES_PASSWORD: rate_app
# command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
redis:
image: redis
volumes:
postgres_data: