LinkStack 4.8.8 常用 CLI 命令与工具详解

以 php83 artisan 为主体逐条实测 LinkStack 4.8.8 的 CLI 命令族:应用信息、迁移与库表、spatie 备份族、缓存、维护模式、路由调度与翻译工具,含 config:cache 禁用根因、backup:list 健康盲区与 6 则排障实录。

LinkStackLinkStack面板PHP 应用2026/11/03

LinkStack 4.8.8 常用 CLI 命令与工具详解

目标:LinkStack 构建在 Laravel 9 之上,CLI 运维面就是 php83 artisan 命令族。本文按命令族实测 20+ 条命令的真实回显——应用信息(about/env/tinker)、数据库与迁移(migrate 族/db:show/db:table/db:monitor)、spatie 备份族(backup:run/clean/list/monitor,含 MySQL 形态两处必修配置)、缓存与性能(含 config:cache 在本应用不可用的根因)、维护模式(artisan down 与 .env 的 MAINTENANCE_MODE 差异实测)、路由与调度、用户数据清理、翻译工具,并沉淀 6 则排障实录。已在 Ubuntu 22.04(x86_64)服务器、LinkStack 4.8.8(MariaDB 11.4 系统库,Docker Compose 形态)上全量实测通过。部署见《LinkStack 4.8.8 Docker Compose 部署指南》,配置体系见《LinkStack 4.8.8 配置参数详解》。

一、环境信息

  • 操作系统:Ubuntu 22.04(x86_64)
  • LinkStack:v4.8.8(官方镜像 linkstackorg/linkstack:v4.8.8)
  • 框架内核:Laravel Framework 9.52.22(php83 artisan --version 实测)
  • PHP:8.3.36(php83 artisan about --only=environment 实测);Alpine 基础镜像,CLI 二进制名为 php83,PATH 中没有裸 php(见第十一章 Q1)
  • 系统数据库:MariaDB 11.4(DB_CONNECTION=mysql),缓存/会话驱动均为 file
  • 应用目录:容器内 /htdocs;本文所有命令的宿主机执行形态:
cd /opt/linkstack-stack && docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan <命令>'

非容器(源码直装)形态则直接 cd 到应用根目录用 php artisan 执行,回显一致。

💡 技术拓展:artisan 是 Laravel 框架自带的命令行工具(基于 Symfony Console),凡构建在 Laravel 上的产品都继承这一整套命令:安装初始化、数据库迁移、缓存清理、维护模式、密钥管理都走 php artisan <命令>。LinkStack 没有自研独立 CLI(如 Nextcloud 的 occ),artisan 就是它唯一的运维螺丝刀;LinkStack 的增量在于以 Composer 包形式挂进来的专属命令族(backup:*、visits:clean、translate 等)。

二、命令族总览

php83 artisan list 实测输出共 159 行、约 130 条命令。与运维相关的族与本文实测小节:

命令族代表命令来源本文实测小节
应用信息about / env / tinkerLaravel三
数据库与迁移migrate / migrate:status / db:show / db:table / db:monitorLaravel四
备份backup:run / backup:clean / backup:list / backup:monitorspatie/laravel-backup(LinkStack 捆绑)五
缓存与性能cache:clear / config:clear / config:cache / view:clear / package:discoverLaravel六
维护模式down / upLaravel七
路由与调度route:list / schedule:listLaravel八
用户与数据auth:clear-resets / visits:clean / storage:link / key:generateLaravel + laravel-visits九
翻译工具translate / translation-checkLinkStack 自有十
GeoIPgeoip:clear / geoip:updatelaravel-localization 系九.2(含排障)

make:* 脚手架族(39 条)与 livewire:* 开发族用于二次开发,运维场景用不到,不展开。

2.1 查看单命令帮助

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan help backup:run'

实测输出(节选):

Description:
  Run the backup.

Usage:
  backup:run [options]

Options:
      --filename[=FILENAME]          
      --only-db                      
      --db-name[=DB-NAME]             (multiple values allowed)
      --only-files                   
      --only-to-disk[=ONLY-TO-DISK]  
      --disable-notifications        
      --timeout[=TIMEOUT]            

三、应用信息类

3.1 about(运行环境快照)

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan about --only=environment'

实测输出:

  Environment ................................................................  
  Application Name ................................................. LinkStack  
  Laravel Version .................................................... 9.52.22  
  PHP Version ......................................................... 8.3.36  
  Composer Version ......................................................... -  
  Environment .......................................................... local  
  Debug Mode ......................................................... ENABLED  
  URL ........................................................................  
  Maintenance Mode ....................................................... OFF  

Debug Mode ENABLED 即 .env 的 APP_DEBUG=true——生产收工前用这行回显自查(改法见配置篇第八章)。

3.2 env(当前环境名)

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan env'

实测输出:

   INFO  The application environment is [local].  

3.3 tinker(一次性 PHP 交互/求值)

查业务数据统计(实测):

docker compose exec linkstack sh -c \
  "cd /htdocs && HOME=/tmp php83 artisan tinker --execute='echo \App\Models\User::count().\" users, \".\App\Models\Link::count().\" links, \".\App\Models\Button::count().\" buttons\";'"

实测输出:

1 users, 0 links, 117 buttons

(1 个管理员用户、0 条链接、117 个内置按钮类型记录。)

⚠️ 必须带 HOME=/tmp:镜像内 apache 用户的 HOME(/var/www)对进程不可写,psysh(tinker 的 REPL 引擎)启动即报错(详见第十一章 Q3)。

四、数据库与迁移类

4.1 migrate(升级后补跑迁移必用)

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan migrate'

实测输出(已是最新时):

   INFO  Nothing to migrate.  

换镜像 tag 升级 LinkStack 版本后,此命令(加 --force)把新版本的迁移补齐,是官方 Docker 升级流程的固定一步(见部署篇第十章)。

4.2 migrate:status(迁移台账)

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan migrate:status'

实测输出(全 12 条,安装向导时批量执行,Batch 全为 1):

  Migration name .............................................. Batch / Status  
  2014_10_12_000000_create_users_table ............................... [1] Ran  
  2014_10_12_100000_create_password_resets_table ..................... [1] Ran  
  2019_08_19_000000_create_failed_jobs_table ......................... [1] Ran  
  2021_03_17_044922_create_buttons_table ............................. [1] Ran  
  2021_03_18_082008_create_links_table ............................... [1] Ran  
  2021_03_18_082232_create_pages_table ............................... [1] Ran  
  2022_09_20_110657_sociallogin ...................................... [1] Ran  
  2022_09_20_143006_social_accounts .................................. [1] Ran  
  2022_09_21_115126_create_visits_table .............................. [1] Ran  
  2022_09_22_123137_link-type ........................................ [1] Ran  
  2023_03_08_184401_remove_unique_constraint_from_users_table ........ [1] Ran  
  2023_03_09_121613_update_columns_to_text_type ...................... [1] Ran  

4.3 db:show(库级信息)

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan db:show'

实测输出(节选):

  Database ......................................................... linkstack  
  Host .................................................................... db  
  Port .................................................................. 3306  
  Username ......................................................... linkstack  
  Open Connections ......................................................... 1  
  Tables .................................................................. 10  
  Total Size ......................................................... 0.30MiB  

  Table ........................................................... Size (MiB)  
  users ................................................................. 0.05  
  link_types ............................................................ 0.02  
  buttons ............................................................... 0.02  
  pages ................................................................. 0.02  
  migrations ............................................................ 0.02  
  visits ................................................................ 0.03  
  password_resets ....................................................... 0.03  
  social_accounts ....................................................... 0.05  
  failed_jobs ........................................................... 0.03  
  links ................................................................. 0.05  

4.4 db:table(表结构速查)

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan db:table users'

实测输出(节选):

  users ......................................................................  
  Columns ................................................................. 17  
  Size ............................................................... 0.05MiB  

  Column ................................................................ Type  
  id autoincrement, bigint, unsigned .................................. bigint  
  name string ......................................................... string  
  email string ........................................................ string  
  email_verified_at datetime, nullable .............................. datetime  
  password string, nullable ........................................... string  
  littlelink_name string, nullable .................................... string  
  littlelink_description text, nullable ................................. text  
  role string .................................................... user string  
  block string ..................................................... no string  
  ...

  Index ......................................................................  
  PRIMARY id ................................................. unique, primary  
  users_email_unique email ............................................ unique  
  users_littlelink_name_unique littlelink_name ........................ unique  

role(user/admin)与 block(yes/no)是字符串枚举而非布尔——排查"用户登不进"时可直接查这两列。

4.5 db:monitor(连接数巡检)

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan db:monitor --databases=mysql'

实测输出:

  Database name .................................................. Connections  
  mysql ............................................................... [1] OK  

五、备份命令族(backup:*,spatie/laravel-backup)

LinkStack 捆绑 spatie/laravel-backup 提供"应用文件+数据库"整包备份,产物为 zip。

5.1 前置修复(MySQL 形态必做,否则必失败)

镜像默认按 SQLite 形态出厂:/htdocs/config/backup.php 的数据库列表硬编码 ['sqlite'](实测第 84 行),且镜像未带 mysqldump。MySQL/MariaDB 部署需两步修复(排障全记录见部署篇第十一章 Q3):

docker compose exec -u root linkstack sh -c "sed -i \"s/'sqlite',/'mysql',/\" /htdocs/config/backup.php"
docker compose exec -u root linkstack apk add --no-cache mariadb-client

第一处改动在 /htdocs 卷内、持久;第二处装在容器层、重建容器后丢失,固化需自建衍生镜像。

5.2 backup:run(执行整包备份)

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan backup:run'

实测输出(尾部):

Starting backup...
Dumping database linkstack...
Determining files to backup...
Zipping 10746 files and directories...
Created zip containing 10746 files and directories. Size is 21.43 MB
Copying zip to disk named backups...
Successfully copied zip to disk named backups.
Sending notification failed
Backup completed!
  • --only-db / --only-files 可分别只备库或只备文件(实测 --help 见 2.1);
  • Sending notification failed 无害——未配置通知渠道,不影响产物;
  • 产物落点(实测 find):/htdocs/backups/updater-backups/,文件名形如 M7LPHX5HgpIIqL4S-2026-11-02-17-12-27.zip(该目录同时是内置更新器的备份池,backup.php 第 13 行 'name' => 'updater-backups')。

5.3 backup:list / backup:monitor(健康视图有盲区)

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan backup:list'

实测输出(backup:run 刚成功之后):

+-----------+-------+-----------+---------+--------------+--------------------+--------------+
| Name      | Disk  | Reachable | Healthy | # of backups | Newest backup      | Used storage |
+-----------+-------+-----------+---------+--------------+--------------------+--------------+
| LinkStack | local | ✅        | ❌      |            0 | No backups present |         0 KB |
+-----------+-------+-----------+---------+--------------+--------------------+--------------+

盲区根因(读 config/backup.php 实测):健康检查统计的是 source 所在默认盘 local(storage/app/),而 zip 实际复制到 backups 盘(base_path('backups'))——两盘不同路径,list 永远报 0。判断备份是否成功请直接看 /htdocs/backups/updater-backups/ 下的 zip 文件。

backup:monitor 实测输出:

The LinkStack backups on the local disk are considered unhealthy!

   Spatie\Backup\Exceptions\NotificationCouldNotBeSent 

  There is no notification class that can handle event `Spatie\Backup\Events\UnhealthyBackupWasFound`.

两条告警叠加:盘盲区判"不健康" + 未配通知类导致连告警都发不出去。要修可把 backup.php 的 monitoral_health 检查盘与落盘对齐(改 destination.disks 为 local 或在 health_check 里换盘),个人实例直接 cron 跑 backup:run + 文件级监控更省事。

5.4 backup:clean(按保留策略清理)

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan backup:clean'

实测输出(目录里有两份 zip、相隔 14 分钟时运行):

Starting cleanup...
Cleaning backups of updater-backups on disk backups...
Deleted backup `updater-backups/M7LPHX5HgpIIqL4S-2026-11-02-17-12-27.zip`.
Cleanup failed because: There is no notification class that can handle event `Spatie\Backup\Events\CleanupWasSuccessful`..

   Spatie\Backup\Exceptions\NotificationCouldNotBeSent 

  There is no notification class that can handle event `Spatie\Backup\Events\CleanupHasFailed`.

删除动作真实成功(跑完只剩最新一份 zip),报错只是"清理成功的通知发不出去"(未配通知渠道,同 5.2 的 Sending notification failed,无害)。⚠️ 保留策略实测坑:LinkStack 出厂 backup.php 的 default_strategy 六档 keep_all_backups_for_days/keep_daily_backups_for_days/keep_weekly_backups_for_weeks/keep_monthly_backups_for_months/keep_yearly_backups_for_years 全为 0(实测 208-236 行),意味着 backup:clean 会把除最新一份以外的所有历史备份立即删光(策略注释原文:"never delete the newest backup")。想留历史必须先把对应天数改大于 0 再挂 cron。

六、缓存与性能类

6.1 可用:cache:clear / config:clear / view:clear / package:discover

实测输出:

   INFO  Application cache cleared successfully.        # php83 artisan cache:clear
   INFO  Configuration cache cleared successfully.      # php83 artisan config:clear
   INFO  Compiled views cleared successfully.           # php83 artisan view:clear
   INFO  Discovering packages.                          # php83 artisan package:discover

改 .env 后一般无需清缓存(LinkStack 配置每请求现读,见配置篇第五章);但若曾误跑过 config:cache 留下半成品,用 config:clear 兜底。

6.2 禁用:config:cache 与 optimize(本应用 fatal)

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan config:cache'

实测输出:

PHP Fatal error:  Cannot redeclare locales() (previously declared in /htdocs/config/app.php:3) in /htdocs/config/app.php on line 3

   Symfony\Component\ErrorHandler\Error\FatalError 

  Cannot redeclare locales() (previously declared in /htdocs/config/app.php:3)

  at config/app.php:3

根因:LinkStack 在 config/app.php 文件顶层直接定义了函数 locales()(供 languages 配置项调用)。config:cache 会把所有 config 文件合并进单个缓存文件,同一文件被加载两次即触发重复声明 fatal。这是 LinkStack 源码结构决定的硬限制——任何性能优化都不要对它跑 config:cache;optimize 命令内部第一步就是 config:cache,同样禁用。若误跑后行为异常,用 config:clear 清掉半成品缓存即可恢复(实测站点全程正常)。

七、维护模式:artisan down/up 与 MAINTENANCE_MODE 是两套

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan down'
curl -s -o /dev/null -w 'GET / http=%{http_code}\n' http://127.0.0.1:8132/
docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan up'
curl -s -o /dev/null -w 'GET / http=%{http_code}\n' http://127.0.0.1:8132/

实测输出:

   INFO  Application is now in maintenance mode.  
GET / http=503
   INFO  Application is now live.  
GET / http=200

与 .env 的 MAINTENANCE_MODE=true(配置篇 5.6 实测:HTTP 200 + 维护占位页)不同,artisan down 走 Laravel 框架标准机制(写 storage/framework/down),返回真 503——给 LB/监控看的就是这个。两者用途:down/up 用于计划内运维窗口(配合 --render 可自定义模板);MAINTENANCE_MODE 是 LinkStack 产品层开关(后台可见性)。

八、路由与调度类

8.1 route:list(路由表审计)

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan route:list'

实测输出(节选;全表 GET/POST 路由 121 条):

  GET|HEAD        +{littlelink} ....... littlelink › UserController@littlelink
  GET|HEAD        / ............................... home › HomeController@home
  GET|HEAD        @ .......................................................... 
  GET|HEAD        @{littlelink} ....... littlelink › UserController@littlelink
  GET|HEAD        admin/advanced-config showFileEditor › AdminController@show…
  POST            admin/advanced-config ...... editAC › AdminController@editAC
  GET|HEAD        admin/backups .... showBackups › AdminController@showBackups
  GET|HEAD        admin/config ....... showConfig › AdminController@showConfig
  POST            admin/config ....... editConfig › AdminController@editConfig

两个实用发现:① 用户页同时注册了 +{littlelink} 与 @{littlelink} 两条路由——这就是配置篇实测 /@root 与 /+root 都 200 的原因;② admin/config(POST editConfig)即后台设置页的落点,等价于手改 .env。

⚠️ 实测坑:Laravel 9 的 route:list 没有 --columns 选项(传了直接报 The "--columns" option does not exist.),想精简输出用管道 grep/head。

8.2 schedule:list(计划任务)

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan schedule:list'

实测输出:

   INFO  No scheduled tasks have been defined.  

LinkStack 未定义任何 Laravel 调度任务——访客清理、备份等都不自动跑,需要定时请在宿主机 crontab 调本文命令(示例:每日备份 0 3 * * * cd /opt/linkstack-stack && docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan backup:run' >> /var/log/linkstack-backup.log 2>&1)。

九、用户与数据维护类

实测输出:

   INFO  Expired reset tokens cleared successfully.     # php83 artisan auth:clear-resets
   ERROR  The [storage] link already exists.           # php83 artisan storage:link

storage:link 幂等报错无害(public/storage → ../storage 软链已由安装流程建好)。

key:generate --show 实测输出:

base64:MxJYdtwW0ASfQtcsRkHMQKPcjiAYO6o0wJpi60cW5IU=

--show 只打印新密钥不写盘,安全;不带 --show 会直接覆盖 .env 的 APP_KEY——已加密数据(社交登录凭据等)立即不可解,生产严禁乱跑。

9.2 visits:clean 与 geoip:clear

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan visits:clean'

实测无输出(静默成功):清理 laravel-visits 的过期统计键。

geoip:clear 实测报错(排障见第十一章 Q5):

   BadMethodCallException 

  This cache store does not support tagging.

9.3 db(进数据库 CLI)

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan db'

实测输出:

   Symfony\Component\Process\Exception\RuntimeException 

  TTY mode requires /dev/tty to be read/writable.

  at vendor/symfony/process/Process.php:1019

db 命令强制 TTY,docker compose exec(不带 -T 也不分配伪终端给子进程链)下不可用。进 MariaDB 更直接的方式仍是 docker compose exec db mariadb -ulinkstack -pq1w2e3r4 linkstack(部署篇 4.6)。

十、翻译工具(LinkStack 自有)

translate 批量翻译语言文件、translation-check 校验某语言包与基准的差异(社区贡献 PR 前的自检工具):

docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan translation-check'
docker compose exec linkstack sh -c 'cd /htdocs && php83 artisan translation-check en'

实测输出:

                                               
  Not enough arguments (missing: "language").  

 [OK] en translation file is up to date!                                        

参数为语言目录名;实测 /htdocs/lang 共 14 个语言:ar bg de el en es fr gl pt-BR ru sv vi zh zh-TW(简体中文 zh)。日常运维基本用不到,参与翻译贡献时才跑。

十一、排障实录

Q1:php artisan ... 报 sh: line 0: php: not found? Alpine 镜像的 PHP 包只装带版本号二进制 /usr/bin/php83。一律改用 php83 artisan(php83 -m 同理)。

Q2:在容器根目录跑 artisan 报 Could not open input file: artisan? artisan 脚本在应用根 /htdocs,先 cd /htdocs(本文命令模板已内置)。

Q3:tinker 报 Writing to directory /var/www/.config/psysh is not allowed.? 实测报错出处 vendor/psy/psysh/src/ConfigPaths.php:456:apache 用户 HOME=/var/www 不可写,psysh 要写配置目录即失败。解决:前缀 HOME=/tmp(3.3 节实测通过)。

Q4:backup:run 报 sh: line 1: sqlite3: not found(Exitcode 127)? config/backup.php 硬编码 ['sqlite'] 而实际库是 MySQL,且镜像无 mysqldump。两步修复见 5.1(完整排障过程在部署篇 Q3)。

Q5:geoip:clear 抛 This cache store does not support tagging.? 根因:默认 CACHE_DRIVER=file,而 geoip 位置缓存用 tag 机制,file/array 驱动不支持 tag(报错出处 Illuminate/Cache/Repository.php:507)。影响面仅"清 GeoIP 缓存"这一动作,不影响访客统计功能本身;确需此命令把缓存驱动改 redis 后再用。

Q6:route:list --columns=method,uri 报 The "--columns" option does not exist.? Laravel 9 无此选项(10+ 才有),直接 route:list | grep <关键词> 过滤。

十二、参考链接

  • 源码仓库:https://github.com/LinkStackOrg/LinkStack(v4.8.8,2026-10-22)
  • Laravel 9 artisan 文档:https://laravel.com/docs/9.x/artisan
  • spatie/laravel-backup:https://github.com/spatie/laravel-backup
  • 本文实测记录:2026-11-02,LinkStack v4.8.8 + MariaDB 11.4,Ubuntu 22.04 宿主机