diff --git a/app/Filament/Admin/Resources/DomainResource.php b/app/Filament/Admin/Resources/DomainResource.php index df51acbf..6ce8c77c 100644 --- a/app/Filament/Admin/Resources/DomainResource.php +++ b/app/Filament/Admin/Resources/DomainResource.php @@ -33,6 +33,16 @@ public static function form(Form $form): Form ->required(), Forms\Components\DatePicker::make('expiration_date') ->required(), + Forms\Components\TextInput::make('virtual_host') + ->required() + ->maxLength(255), + Forms\Components\TextInput::make('letsencrypt_host') + ->required() + ->maxLength(255), + Forms\Components\TextInput::make('letsencrypt_email') + ->email() + ->required() + ->maxLength(255), ]); } @@ -88,4 +98,30 @@ public static function getPages(): array 'edit' => Pages\EditDomain::route('/{record}/edit'), ]; } + + protected function generateDockerComposeContent($data): string + { + return <<generateDockerComposeContent($data); + Storage::disk('local')->put('docker-compose-'.$data['domain_name'].'.yml', $composeContent); + + $process = new Process(['docker-compose', '-f', storage_path('app/docker-compose-'.$data['domain_name'].'.yml'), 'up', '-d']); + $process->run(); + + return $domain; + } } diff --git a/app/Filament/Admin/Resources/DomainResource/Pages/EditDomain.php b/app/Filament/Admin/Resources/DomainResource/Pages/EditDomain.php index 67e5de7d..8cadb5d0 100644 --- a/app/Filament/Admin/Resources/DomainResource/Pages/EditDomain.php +++ b/app/Filament/Admin/Resources/DomainResource/Pages/EditDomain.php @@ -6,6 +6,9 @@ use Filament\Actions; use Filament\Resources\Pages\EditRecord; +use Illuminate\Support\Facades\Storage; +use Symfony\Component\Process\Process; + class EditDomain extends EditRecord { protected static string $resource = DomainResource::class; @@ -16,4 +19,17 @@ protected function getHeaderActions(): array Actions\DeleteAction::make(), ]; } + + protected function handleRecordUpdate(Domain $record, array $data): Domain + { + $record->update($data); + + $composeContent = $this->generateDockerComposeContent($data); + Storage::disk('local')->put('docker-compose-'.$data['domain_name'].'.yml', $composeContent); + + $process = new Process(['docker-compose', '-f', storage_path('app/docker-compose-'.$data['domain_name'].'.yml'), 'up', '-d']); + $process->run(); + + return $record; + } } diff --git a/app/Filament/Admin/Resources/EmailResource.php b/app/Filament/Admin/Resources/EmailResource.php new file mode 100644 index 00000000..cd91862e --- /dev/null +++ b/app/Filament/Admin/Resources/EmailResource.php @@ -0,0 +1,129 @@ +schema([ + Forms\Components\TextInput::make('email') + ->email() + ->required() + ->maxLength(255), + Forms\Components\TextInput::make('password') + ->password() + ->required() + ->maxLength(255), + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make('email') + ->searchable(), + Tables\Columns\TextColumn::make('created_at') + ->dateTime(), + ]) + ->filters([ + // + ]) + ->actions([ + Tables\Actions\EditAction::make(), + Tables\Actions\DeleteAction::make(), + ]) + ->bulkActions([ + Tables\Actions\DeleteBulkAction::make(), + ]); + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ManageEmails::route('/'), + ]; + } + + protected function handleRecordCreation(array $data): Email + { + $email = Email::create($data); + + // Generate Dovecot configuration + $dovecotConfig = $this->generateDovecotConfig($email); + Storage::disk('dovecot')->put($email->email, $dovecotConfig); + + // Generate Postfix configuration + $postfixConfig = $this->generatePostfixConfig($email); + Storage::disk('postfix')->put($email->email, $postfixConfig); + + // Restart Dovecot and Postfix containers + $this->restartContainers(); + + return $email; + } + + protected function handleRecordUpdate(Email $email, array $data): Email + { + $email->update($data); + + // Update Dovecot configuration + $dovecotConfig = $this->generateDovecotConfig($email); + Storage::disk('dovecot')->put($email->email, $dovecotConfig); + + // Update Postfix configuration + $postfixConfig = $this->generatePostfixConfig($email); + Storage::disk('postfix')->put($email->email, $postfixConfig); + + // Restart Dovecot and Postfix containers + $this->restartContainers(); + + return $email; + } + + protected function handleRecordDeletion(Email $email) + { + // Remove Dovecot configuration + Storage::disk('dovecot')->delete($email->email); + + // Remove Postfix configuration + Storage::disk('postfix')->delete($email->email); + + // Restart Dovecot and Postfix containers + $this->restartContainers(); + + $email->delete(); + } + + protected function generateDovecotConfig(Email $email): string + { + // Generate Dovecot configuration based on $email + // ... + } + + protected function generatePostfixConfig(Email $email): string + { + // Generate Postfix configuration based on $email + // ... + } + + protected function restartContainers() + { + // Restart Dovecot and Postfix containers + // ... + } +} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index dbb16512..43d3020f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,7 +13,7 @@ services: - ./html:/usr/share/nginx/html labels: - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy - + letsencrypt: image: jrcs/letsencrypt-nginx-proxy-companion restart: always @@ -23,4 +23,37 @@ services: - ./html:/usr/share/nginx/html:rw - /var/run/docker.sock:/var/run/docker.sock:ro environment: - - NGINX_PROXY_CONTAINER=nginx-proxy \ No newline at end of file + - NGINX_PROXY_CONTAINER=nginx-proxy + + postfix: + image: boky/postfix + restart: always + environment: + - SMTP_SERVER=example.com + - SMTP_USERNAME=user@example.com + - SMTP_PASSWORD=password + ports: + - "25:25" + - "587:587" + + dovecot: + image: dovecot/dovecot + restart: always + ports: + - "110:110" + - "143:143" + - "993:993" + - "995:995" + volumes: + - ./mail:/var/mail + + bind9: + image: internetsystemsconsortium/bind9:9.16 + restart: always + ports: + - "53:53/udp" + - "53:53/tcp" + volumes: + - ./bind:/etc/bind + - ./bind/cache:/var/cache/bind + - ./bind/records:/var/lib/bind \ No newline at end of file