@@ -162,6 +162,7 @@ protected function generateCaddyfile(): void
162162 {
163163 $ getAllDomains = Domain::whereNot ('status ' , '<=> ' , 'broken ' )->get ();
164164 $ caddyBlocks = [];
165+ $ wildcardGroups = [];
165166
166167 // Get Apache port settings (non-SSL ports for proxying)
167168 $ apacheHttpPort = setting ('caddy.apache_proxy_port ' ) ?? setting ('general.apache_http_port ' ) ?? '8080 ' ;
@@ -174,45 +175,60 @@ protected function generateCaddyfile(): void
174175 $ cloudflareApiToken = setting ('caddy.cloudflare_api_token ' );
175176 $ zeroSSlApiToken = setting ('caddy.zerossl_api_token ' );
176177
177- foreach ($ getAllDomains as $ domain ) {
178- $ isBroken = false ;
178+ // Check if wildcard is enabled
179+ $ useWildcard = setting ('caddy.enable_wildcard_ssl ' , false );
180+ $ wildcardDomainSetting = setting ('caddy.wildcard_domain ' );
179181
182+ // First pass - create regular blocks and identify wildcard subdomains
183+ foreach ($ getAllDomains as $ domain ) {
180184 if ($ domain ->status === 'broken ' ) {
181185 continue ;
182186 }
183187
184188 // Check if domain is valid
185189 if (!filter_var ($ domain ->domain , FILTER_VALIDATE_DOMAIN )) {
186- $ isBroken = true ;
187- }
188-
189- if ($ isBroken ) {
190190 continue ;
191191 }
192+
192193 $ domainLog = '/var/log/caddy/ ' . $ domain ->domain . '.log ' ;
193194 shell_exec ("chown caddy:caddy '/var/log/caddy/ " );
194195 shell_exec ("chmod -R 777 /var/log/caddy/ " );
195196
196-
197197 shell_exec ("sudo setfacl -R -m u:caddy:rx " . $ domain ->document_root );
198198 shell_exec ("sudo setfacl -R -m u:caddy:rx " . $ domain ->domain_public );
199199 shell_exec ("sudo setfacl -R -m u:caddy:rx " . $ domain ->home_root );
200200
201-
202201 // Set permissions for Caddy to access user directories
203202 shell_exec ("chmod o+x {$ domain ->home_root }" );
204203 shell_exec ("chmod -R o+rX {$ domain ->document_root }" );
205204
206-
207205 if (!file_exists ($ domainLog )) {
208206 // Create log file for the domain if it doesn't exist
209207 touch ($ domainLog );
210208 shell_exec ("chown caddy:caddy {$ domainLog }" );
211209 shell_exec ("chmod 777 {$ domainLog }" );
212210 }
213211
212+ // Check if this domain belongs under a wildcard
213+ $ isWildcardSubdomain = false ;
214+ $ parentDomain = null ;
215+
216+ if ($ useWildcard && $ cloudflareApiToken && !empty ($ wildcardDomainSetting )) {
217+ if (strpos ($ domain ->domain , '. ' . $ wildcardDomainSetting ) !== false &&
218+ substr_count ($ domain ->domain , '. ' ) > substr_count ($ wildcardDomainSetting , '. ' )) {
219+ $ isWildcardSubdomain = true ;
220+ $ parentDomain = $ wildcardDomainSetting ;
221+
222+ // Add to wildcard group
223+ if (!isset ($ wildcardGroups [$ parentDomain ])) {
224+ $ wildcardGroups [$ parentDomain ] = [];
225+ }
226+ $ wildcardGroups [$ parentDomain ][] = $ this ->createCaddyBlock ($ domain , $ apacheHttpPort );
227+ continue ;
228+ }
229+ }
214230
215- // Create Caddy block for SSL termination and proxy to Apache
231+ // Non-wildcard domain, create regular block
216232 $ caddyBlock = $ this ->createCaddyBlock ($ domain , $ apacheHttpPort );
217233 if ($ caddyBlock ) {
218234 $ caddyBlocks [] = $ caddyBlock ;
@@ -228,6 +244,16 @@ protected function generateCaddyfile(): void
228244 }
229245 }
230246
247+ // Add wildcard groups to the blocks list
248+ foreach ($ wildcardGroups as $ parentDomain => $ subdomains ) {
249+ $ caddyBlocks [] = [
250+ 'is_wildcard_group ' => true ,
251+ 'parent_domain ' => $ parentDomain ,
252+ 'subdomains ' => $ subdomains ,
253+ 'cloudflareApiToken ' => $ cloudflareApiToken
254+ ];
255+ }
256+
231257 // Generate Caddyfile
232258 $ caddyfile = view ('caddy::caddyfile-build ' , [
233259 'caddyBlocks ' => $ caddyBlocks ,
@@ -255,25 +281,19 @@ private function createCaddyBlock(Domain $domain, $apacheHttpPort): ?array
255281 return null ;
256282 }
257283
258- //gi matcth the wilcard use tls_cloudflare
259-
260284 $ useWildcard = setting ('caddy.enable_wildcard_ssl ' , false );
261285 $ cloudflareApiToken = setting ('caddy.cloudflare_api_token ' );
262286 $ wildcardDomainSettings = setting ('caddy.wildcard_domain ' );
263287 $ tls_cloudflare = false ;
264288 $ use_wildcard = false ;
265- $ wildcardDomain = null ;
266- if ($ useWildcard && $ cloudflareApiToken && !empty ($ domain ->domain )) {
267289
290+ if ($ useWildcard && $ cloudflareApiToken && !empty ($ domain ->domain )) {
268291 if (!empty ($ wildcardDomainSettings ) && strpos ($ domain ->domain , $ wildcardDomainSettings ) !== false ) {
269292 $ tls_cloudflare = true ;
270293 $ use_wildcard = true ;
271294 }
272-
273-
274295 }
275296
276-
277297 return array (
278298 'domain ' => $ domain ->domain ,
279299 'proxy_to ' => "127.0.0.1: {$ apacheHttpPort }" ,
0 commit comments