Blame view

sail 15.2 KB
995960380   Андрей Ларионов   Исправления офисо...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
  #!/usr/bin/env bash
  
  UNAMEOUT="$(uname -s)"
  
  # Verify operating system is supported...
  case "${UNAMEOUT}" in
      Linux*)             MACHINE=linux;;
      Darwin*)            MACHINE=mac;;
      *)                  MACHINE="UNKNOWN"
  esac
  
  if [ "$MACHINE" == "UNKNOWN" ]; then
      echo "Unsupported operating system [$(uname -s)]. Laravel Sail supports macOS, Linux, and Windows (WSL2)." >&2
  
      exit 1
  fi
  
  # Determine if stdout is a terminal...
  if test -t 1; then
      # Determine if colors are supported...
      ncolors=$(tput colors)
  
      if test -n "$ncolors" && test "$ncolors" -ge 8; then
          BOLD="$(tput bold)"
          YELLOW="$(tput setaf 3)"
          GREEN="$(tput setaf 2)"
          NC="$(tput sgr0)"
      fi
  fi
  
  # Function that prints the available commands...
  function display_help {
      echo "Laravel Sail"
      echo
      echo "${YELLOW}Usage:${NC}" >&2
      echo "  sail COMMAND [options] [arguments]"
      echo
      echo "Unknown commands are passed to the docker-compose binary."
      echo
      echo "${YELLOW}docker-compose Commands:${NC}"
      echo "  ${GREEN}sail up${NC}        Start the application"
      echo "  ${GREEN}sail up -d${NC}     Start the application in the background"
      echo "  ${GREEN}sail stop${NC}      Stop the application"
      echo "  ${GREEN}sail restart${NC}   Restart the application"
      echo "  ${GREEN}sail ps${NC}        Display the status of all containers"
      echo
      echo "${YELLOW}Artisan Commands:${NC}"
      echo "  ${GREEN}sail artisan ...${NC}          Run an Artisan command"
      echo "  ${GREEN}sail artisan queue:work${NC}"
      echo
      echo "${YELLOW}PHP Commands:${NC}"
      echo "  ${GREEN}sail php ...${NC}   Run a snippet of PHP code"
      echo "  ${GREEN}sail php -v${NC}"
      echo
      echo "${YELLOW}Composer Commands:${NC}"
      echo "  ${GREEN}sail composer ...${NC}                       Run a Composer command"
      echo "  ${GREEN}sail composer require laravel/sanctum${NC}"
      echo
      echo "${YELLOW}Node Commands:${NC}"
      echo "  ${GREEN}sail node ...${NC}         Run a Node command"
      echo "  ${GREEN}sail node --version${NC}"
      echo
      echo "${YELLOW}NPM Commands:${NC}"
      echo "  ${GREEN}sail npm ...${NC}        Run a npm command"
      echo "  ${GREEN}sail npx${NC}            Run a npx command"
      echo "  ${GREEN}sail npm run prod${NC}"
      echo
      echo "${YELLOW}Yarn Commands:${NC}"
      echo "  ${GREEN}sail yarn ...${NC}        Run a Yarn command"
      echo "  ${GREEN}sail yarn run prod${NC}"
      echo
      echo "${YELLOW}Database Commands:${NC}"
      echo "  ${GREEN}sail mysql${NC}     Start a MySQL CLI session within the 'mysql' container"
      echo "  ${GREEN}sail mariadb${NC}   Start a MySQL CLI session within the 'mariadb' container"
      echo "  ${GREEN}sail psql${NC}      Start a PostgreSQL CLI session within the 'pgsql' container"
      echo "  ${GREEN}sail redis${NC}     Start a Redis CLI session within the 'redis' container"
      echo
      echo "${YELLOW}Debugging:${NC}"
      echo "  ${GREEN}sail debug ...${NC}          Run an Artisan command in debug mode"
      echo "  ${GREEN}sail debug queue:work${NC}"
      echo
      echo "${YELLOW}Running Tests:${NC}"
      echo "  ${GREEN}sail test${NC}          Run the PHPUnit tests via the Artisan test command"
      echo "  ${GREEN}sail phpunit ...${NC}   Run PHPUnit"
      echo "  ${GREEN}sail pest ...${NC}      Run Pest"
      echo "  ${GREEN}sail pint ...${NC}      Run Pint"
      echo "  ${GREEN}sail dusk${NC}          Run the Dusk tests (Requires the laravel/dusk package)"
      echo "  ${GREEN}sail dusk:fails${NC}    Re-run previously failed Dusk tests (Requires the laravel/dusk package)"
      echo
      echo "${YELLOW}Container CLI:${NC}"
      echo "  ${GREEN}sail shell${NC}        Start a shell session within the application container"
      echo "  ${GREEN}sail bash${NC}         Alias for 'sail shell'"
      echo "  ${GREEN}sail root-shell${NC}   Start a root shell session within the application container"
      echo "  ${GREEN}sail root-bash${NC}    Alias for 'sail root-shell'"
      echo "  ${GREEN}sail tinker${NC}       Start a new Laravel Tinker session"
      echo
      echo "${YELLOW}Sharing:${NC}"
      echo "  ${GREEN}sail share${NC}   Share the application publicly via a temporary URL"
      echo "  ${GREEN}sail open${NC}    Open the site in your browser"
      echo
      echo "${YELLOW}Binaries:${NC}"
      echo "  ${GREEN}sail bin ...${NC}   Run Composer binary scripts from the vendor/bin directory"
      echo
      echo "${YELLOW}Customization:${NC}"
      echo "  ${GREEN}sail artisan sail:publish${NC}   Publish the Sail configuration files"
      echo "  ${GREEN}sail build --no-cache${NC}       Rebuild all of the Sail containers"
  
      exit 1
  }
  
  # Proxy the "help" command...
  if [ $# -gt 0 ]; then
      if [ "$1" == "help" ] || [ "$1" == "-h" ] || [ "$1" == "-help" ] || [ "$1" == "--help" ]; then
          display_help
      fi
  else
      display_help
  fi
  
  # Source the ".env" file so Laravel's environment variables are available...
  if [ ! -z "$APP_ENV" ] && [ -f ./.env.$APP_ENV ]; then
    source ./.env.$APP_ENV;
  elif [ -f ./.env ]; then
    source ./.env;
  fi
  
  # Define environment variables...
  export APP_PORT=${APP_PORT:-80}
  export APP_SERVICE=${APP_SERVICE:-"laravel.test"}
  export DB_PORT=${DB_PORT:-3306}
  export WWWUSER=${WWWUSER:-$UID}
  export WWWGROUP=${WWWGROUP:-$(id -g)}
  
  export SAIL_FILES=${SAIL_FILES:-""}
  export SAIL_SHARE_DASHBOARD=${SAIL_SHARE_DASHBOARD:-4040}
  export SAIL_SHARE_SERVER_HOST=${SAIL_SHARE_SERVER_HOST:-"laravel-sail.site"}
  export SAIL_SHARE_SERVER_PORT=${SAIL_SHARE_SERVER_PORT:-8080}
  export SAIL_SHARE_SUBDOMAIN=${SAIL_SHARE_SUBDOMAIN:-""}
  export SAIL_SHARE_DOMAIN=${SAIL_SHARE_DOMAIN:-"$SAIL_SHARE_SERVER_HOST"}
  
  # Function that outputs Sail is not running...
  function sail_is_not_running {
      echo "${BOLD}Sail is not running.${NC}" >&2
      echo "" >&2
      echo "${BOLD}You may Sail using the following commands:${NC} './vendor/bin/sail up' or './vendor/bin/sail up -d'" >&2
  
      exit 1
  }
  
  # Define Docker Compose command prefix...
  docker compose &> /dev/null
  if [ $? == 0 ]; then
      DOCKER_COMPOSE=(docker compose)
  else
      DOCKER_COMPOSE=(docker-compose)
  fi
  
  if [ -n "$SAIL_FILES" ]; then
      # Convert SAIL_FILES to an array...
      IFS=':' read -ra SAIL_FILES <<< "$SAIL_FILES"
  
      for FILE in "${SAIL_FILES[@]}"; do
          if [ -f "$FILE" ]; then
              DOCKER_COMPOSE+=(-f "$FILE")
          else
              echo "${BOLD}Unable to find Docker Compose file: '${FILE}'${NC}" >&2
  
              exit 1
          fi
      done
  fi
  
  EXEC="yes"
  
  if [ -z "$SAIL_SKIP_CHECKS" ]; then
      # Ensure that Docker is running...
      if ! docker info > /dev/null 2>&1; then
          echo "${BOLD}Docker is not running.${NC}" >&2
  
          exit 1
      fi
  
      # Determine if Sail is currently up...
      if "${DOCKER_COMPOSE[@]}" ps "$APP_SERVICE" 2>&1 | grep 'Exit\|exited'; then
          echo "${BOLD}Shutting down old Sail processes...${NC}" >&2
  
          "${DOCKER_COMPOSE[@]}" down > /dev/null 2>&1
  
          EXEC="no"
      elif [ -z "$("${DOCKER_COMPOSE[@]}" ps -q)" ]; then
          EXEC="no"
      fi
  fi
  
  ARGS=()
  
  # Proxy PHP commands to the "php" binary on the application container...
  if [ "$1" == "php" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" "php" "$@")
      else
          sail_is_not_running
      fi
  
  # Proxy vendor binary commands on the application container...
  elif [ "$1" == "bin" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" ./vendor/bin/"$@")
      else
          sail_is_not_running
      fi
  
  # Proxy docker-compose commands to the docker-compose binary on the application container...
  elif [ "$1" == "docker-compose" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" "${DOCKER_COMPOSE[@]}")
      else
          sail_is_not_running
      fi
  
  # Proxy Composer commands to the "composer" binary on the application container...
  elif [ "$1" == "composer" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" "composer" "$@")
      else
          sail_is_not_running
      fi
  
  # Proxy Artisan commands to the "artisan" binary on the application container...
  elif [ "$1" == "artisan" ] || [ "$1" == "art" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" php artisan "$@")
      else
          sail_is_not_running
      fi
  
  # Proxy the "debug" command to the "php artisan" binary on the application container with xdebug enabled...
  elif [ "$1" == "debug" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail -e XDEBUG_SESSION=1)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" php artisan "$@")
      else
          sail_is_not_running
      fi
  
  # Proxy the "test" command to the "php artisan test" Artisan command...
  elif [ "$1" == "test" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" php artisan test "$@")
      else
          sail_is_not_running
      fi
  
  # Proxy the "phpunit" command to "php vendor/bin/phpunit"...
  elif [ "$1" == "phpunit" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" php vendor/bin/phpunit "$@")
      else
          sail_is_not_running
      fi
  
  # Proxy the "pest" command to "php vendor/bin/pest"...
  elif [ "$1" == "pest" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" php vendor/bin/pest "$@")
      else
          sail_is_not_running
      fi
  
  # Proxy the "pint" command to "php vendor/bin/pint"...
  elif [ "$1" == "pint" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" php vendor/bin/pint "$@")
      else
          sail_is_not_running
      fi
  
  # Proxy the "dusk" command to the "php artisan dusk" Artisan command...
  elif [ "$1" == "dusk" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=(-e "APP_URL=http://${APP_SERVICE}")
          ARGS+=(-e "DUSK_DRIVER_URL=http://selenium:4444/wd/hub")
          ARGS+=("$APP_SERVICE" php artisan dusk "$@")
      else
          sail_is_not_running
      fi
  
  # Proxy the "dusk:fails" command to the "php artisan dusk:fails" Artisan command...
  elif [ "$1" == "dusk:fails" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=(-e "APP_URL=http://${APP_SERVICE}")
          ARGS+=(-e "DUSK_DRIVER_URL=http://selenium:4444/wd/hub")
          ARGS+=("$APP_SERVICE" php artisan dusk:fails "$@")
      else
          sail_is_not_running
      fi
  
  # Initiate a Laravel Tinker session within the application container...
  elif [ "$1" == "tinker" ] ; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" php artisan tinker)
      else
          sail_is_not_running
      fi
  
  # Proxy Node commands to the "node" binary on the application container...
  elif [ "$1" == "node" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" node "$@")
      else
          sail_is_not_running
      fi
  
  # Proxy NPM commands to the "npm" binary on the application container...
  elif [ "$1" == "npm" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" npm "$@")
      else
          sail_is_not_running
      fi
  
  # Proxy NPX commands to the "npx" binary on the application container...
  elif [ "$1" == "npx" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" npx "$@")
      else
          sail_is_not_running
      fi
  
  # Proxy YARN commands to the "yarn" binary on the application container...
  elif [ "$1" == "yarn" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" yarn "$@")
      else
          sail_is_not_running
      fi
  
  # Initiate a MySQL CLI terminal session within the "mysql" container...
  elif [ "$1" == "mysql" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=(mysql bash -c)
          ARGS+=("MYSQL_PWD=\${MYSQL_PASSWORD} mysql -u \${MYSQL_USER} \${MYSQL_DATABASE}")
      else
          sail_is_not_running
      fi
  
  # Initiate a MySQL CLI terminal session within the "mariadb" container...
  elif [ "$1" == "mariadb" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=(mariadb bash -c)
          ARGS+=("MYSQL_PWD=\${MYSQL_PASSWORD} mysql -u \${MYSQL_USER} \${MYSQL_DATABASE}")
      else
          sail_is_not_running
      fi
  
  # Initiate a PostgreSQL CLI terminal session within the "pgsql" container...
  elif [ "$1" == "psql" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=(pgsql bash -c)
          ARGS+=("PGPASSWORD=\${PGPASSWORD} psql -U \${POSTGRES_USER} \${POSTGRES_DB}")
      else
          sail_is_not_running
      fi
  
  # Initiate a Bash shell within the application container...
  elif [ "$1" == "shell" ] || [ "$1" == "bash" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec -u sail)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" bash "$@")
      else
          sail_is_not_running
      fi
  
  # Initiate a root user Bash shell within the application container...
  elif [ "$1" == "root-shell" ] || [ "$1" == "root-bash" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=("$APP_SERVICE" bash "$@")
      else
          sail_is_not_running
      fi
  
  # Initiate a Redis CLI terminal session within the "redis" container...
  elif [ "$1" == "redis" ] ; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          ARGS+=(exec)
          [ ! -t 0 ] && ARGS+=(-T)
          ARGS+=(redis redis-cli)
      else
          sail_is_not_running
      fi
  
  # Share the site...
  elif [ "$1" == "share" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          docker run --init --rm -p "$SAIL_SHARE_DASHBOARD":4040 -t beyondcodegmbh/expose-server:latest share http://host.docker.internal:"$APP_PORT" \
              --server-host="$SAIL_SHARE_SERVER_HOST" \
              --server-port="$SAIL_SHARE_SERVER_PORT" \
              --auth="$SAIL_SHARE_TOKEN" \
              --subdomain="$SAIL_SHARE_SUBDOMAIN" \
              --domain="$SAIL_SHARE_DOMAIN" \
              "$@"
  
          exit
      else
          sail_is_not_running
      fi
  
  # Open the site...
  elif [ "$1" == "open" ]; then
      shift 1
  
      if [ "$EXEC" == "yes" ]; then
          open $APP_URL
  
          exit
      else
          sail_is_not_running
      fi
  
  # Pass unknown commands to the "docker-compose" binary...
  else
      ARGS+=("$@")
  fi
  
  # Run Docker Compose with the defined arguments...
  "${DOCKER_COMPOSE[@]}" "${ARGS[@]}"