LeafCMS GitHub 开始安装
Docs

系统里的说明

下面和后台「说明」是同一套:怎么用、后台每一栏、主题、模板标签,以及环境和安装。

上线要准备什么

本机 php artisan serve 只适合试用。正式站点需要 PHP、数据库,以及 nginx(或同类)把请求指到 public 目录。

PHP 环境

需要 PHP 8.2 或更高,并打开这些扩展:pdo、mbstring、openssl、tokenizer、xml、ctype、json、fileinfo、curl。用 MySQL 再开 pdo_mysql;用 SQLite 再开 pdo_sqlite。

图片水印和缩略图需要 gd 或 imagick,没有也能装,只是这两项不可用。

建议在 php.ini 里:

memory_limit = 256M
upload_max_filesize = 32M
post_max_size = 32M
max_execution_time = 60
date.timezone = Asia/Shanghai

改完后重启 php-fpm 或网站服务。目录 storage 和 bootstrap/cache 必须可写。宝塔若禁用了 exec / symlink,不必再跑 php artisan storage:link,上传文件由站点自己从 /storage 读出。要做成真正软链(图片不走 PHP),在宝塔终端执行 ln -s 站点目录/storage/app/public 站点目录/public/storage。

MySQL

正式站点建议 MySQL 5.7 / 8.0 或 MariaDB 10.3+,字符集用 utf8mb4。先建空库,再把账号写进 .env。

CREATE DATABASE cms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'cms'@'127.0.0.1' IDENTIFIED BY '请换成强密码';
GRANT ALL ON cms.* TO 'cms'@'127.0.0.1';
FLUSH PRIVILEGES;
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=cms
DB_USERNAME=cms
DB_PASSWORD=请换成强密码

试用可以继续用 SQLite(DB_CONNECTION=sqlite),不用另装数据库。改完 .env 后执行 php artisan config:clear。

nginx

网站根目录必须是项目里的 public,不要指到项目根。下面把 /var/www/leafcms 换成你的路径,php8.3-fpm.sock 换成本机 PHP-FPM 套接字。

server {
    listen 80;
    server_name www.example.com;
    root /var/www/leafcms/public;
    index index.php;
    charset utf-8;
    client_max_body_size 32m;

    location / {
        try_files /html/site_1$uri/index.html /html/site_1$uri $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

第一行 try_files 会优先读后台生成的磁盘静态页。没有文件时再交给 PHP。多站点把 site_1 改成对应站的编号。HTTPS 请在前面加证书或由面板处理。

还要在 .env 写上 APP_URL=https://www.example.com,APP_ENV=production,APP_DEBUG=false。若站点在反向代理后面,再设 TRUST_PROXIES=*。

搜索引擎 robots.txt

前台地址是 /robots.txt。默认允许抓首页,禁止 /admin、/install、/member、/preview,并带上各语言的 sitemap。关站时整站是 Disallow: /。

还要挡住某几段路径时,到设置 → 更多写「robots.txt 补充规则」,例如:

Disallow: /private
Disallow: /drafts

不要写 HTML 标签。大约最多 40 行、每行 200 字。改完打开前台 /robots.txt 核对。这和页面里的 <meta name="robots"> 不是一回事。收录范围装好后在后台「运营 → 更多 → 地图」(站点地图)。

图片放到对象存储

默认传到本机 storage/app/public。有软链时 nginx 直接吐文件;没有软链时走站点 /storage 路由,不依赖宝塔放开 exec。只换访问域名时,在设置 → 更多填「图片走这个域名」,不必改盘。

要用阿里云 OSS / 腾讯云 COS / AWS S3 存文件:先 composer require league/flysystem-aws-s3-v3,再在 .env 写:

CMS_MEDIA_DISK=s3
AWS_ACCESS_KEY_ID=你的 Key
AWS_SECRET_ACCESS_KEY=你的 Secret
AWS_DEFAULT_REGION=oss-cn-hangzhou
AWS_BUCKET=桶名
AWS_URL=https://桶名.oss-cn-hangzhou.aliyuncs.com
AWS_ENDPOINT=https://oss-cn-hangzhou.aliyuncs.com
AWS_USE_PATH_STYLE_ENDPOINT=false

对象存储上不跑本机 GD 水印。需要水印时先在本机盘处理,或用 CDN 的图片处理。改完执行 php artisan config:clear。

nginx 反代到 Docker

容器只映射 8000 时,浏览器直连看到的是 Docker 网关 IP。前面加 nginx,把真实客户端 IP 传进去:

location / {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port $server_port;
}

容器环境变量里也要有 TRUST_PROXIES=*(本仓库 docker-compose.yml 已写上)。只映射端口、前面没有 nginx 时,程序拿不到访客公网 IP。

采集和统计清理要每分钟叫醒 Laravel,见「定时」。

飞机群 @sanpang