# Little Beast シンプル、実践的、アンチ・ブロート ![GitHub repo size](https://img.shields.io/github/repo-size/TechnicalSuwako/LittleBeast) [![lines count](https://img.shields.io/endpoint?url=https://ghloc.vercel.app/api/TechnicalSuwako/LittleBeast/badge?filter=.php%24%2C.maron%24%2C.css%24&branch=master$)](https://ghloc.vercel.app/TechnicalSuwako/LittleBeast?filter=.php%24%2C.maron%24%2C.css%24) サンプル:[https://lbdemo.technicalsuwako.moe/](https://lbdemo.technicalsuwako.moe/) ## Little Beast とは? Little Beast は PHP 8.5 以上向けのフレームワークで、076.moe(ゲーム開発会社)と technicalsuwako.moe(社長のブログ)向けに作られました。\ メイン考え方は「必要な物だけ拡張し、不要な物は削除する」です。\ 各コア機能はライブラリに分割されている為、必要な物だけを選び易い設計になっています。\ 全てのモジュールはゼロから書かれており、データベースは一切必要ありません。 Little Beast はテクニカル諏訪子がゲーム開発に完全復帰する前の最後の Web プロジェクトです。 ## Little Beast が「ではない」物 * 汎用フレームワーク * 使い憎い * Web 開発者向け * 万人向け * インストールが面倒 * 教条的 * 民主的に運営される ## Little Beast が「持っていない」物 * データベース(全てファイルベース) * 依存関係 * パッケージマネージャー * Docker/Kubernetes/Vagrant/Nix 等のコンテナ * JavaScript * ブロートウェア * ORM * キューやバックグラウンドジョブ * クラウド/サーバーレス統合 * スキャフォールディング * コード生成 * 抽象化レイヤー * 不要なファイル * DEI、行動規範、その他の差別的慣行 ## 独自機能 * データベース不要 * Composer や PEAR 不要 * サーバーオーバーヘッドゼロ * コンテナ不要 * Maron テンプレートエンジン * カスタム Markdown * ActivityPub * 多言語対応 * マルチブログ対応 * 100% 綺麗で正しい HTML5 と CSS3 * 100% 正しい PHP * SEO フレンドリー * モジュラー CSS * Atom フィード * 組み込みテストスイート ## インストール方法 ```sh cd /var/www/htdocs git clone https://github.com/TechnicalSuwako/LittleBeast.git . mv config/config.sample.php config/config.php ``` HTTP サーバーを設定して `/public` をルートとして `php-fpm` で実行して下さい。\ それだけです! ### OpenBSD サーバー ```sh pkg_add php-8.5.5 php-gmp-8.5.5 rcctl enable php85_fpm httpd relayd rcctl start php85_fpm httpd relayd ``` #### httpd ``` server "technicalsuwako.moe" { listen on * tls port 8443 gzip-static tls { certificate "/etc/ssl/technicalsuwako.moe.crt" key "/etc/ssl/private/technicalsuwako.moe.key" } root "/htdocs/technicalsuwako.moe/www/public" directory index "index.php" location "/.well-known/acme-challenge/*" { root "/acme" request strip 2 } location "/*.php" { fastcgi socket "/run/php-fpm.sock" } location "/*.php[/?]*" { fastcgi socket "/run/php-fpm.sock" } location "/" { directory index "index.php" } location match "/blog/" { request rewrite "/index.php" } location match "/about" { request rewrite "/index.php" } location match "/monero" { request rewrite "/index.php" } location match "/secret" { request rewrite "/index.php" } location match "/ap/" { request rewrite "/index.php" } location "/.well-known/webfinger" { request rewrite "/index.php" } location "/blog.atom" { request rewrite "/index.php" } } server "www.technicalsuwako.moe" { listen on * tls port 8443 gzip-static tls { certificate "/etc/ssl/technicalsuwako.moe.crt" key "/etc/ssl/private/technicalsuwako.moe.key" } block return 301 "https://technicalsuwako.moe$REQUEST_URI" } ``` #### relayd ``` relayd_addr="0.0.0.0" router_addr="192.168.10.106" table { $router_addr } http protocol reverse { tcp { nodelay, sack, socket buffer 65536, backlog 100 } tls ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256" tls keypair "technicalsuwako.moe" return error match request header append "X-Forwarded-For" value "$REMOTE_ADDR" match request header append "X-Forwarded-Port" value "$REMOTE_PORT" #match response header set "Referrer-Policy" value "same-origin" match response header set "X-Frame-Options" value "deny" match response header set "X-Content-Type-Options" value "nosniff" match response header set "Referrer-Policy" value "strict-origin-when-cross-origin" match response header set "Strict-Transport-Security" value "max-age=31536000; includeSubDomains; preload" match response header set "Cross-Origin-Opener-Policy" value "same-origin" match response header set "Content-Security-Policy" value "img-src 'self' https://*.076.moe http://*.076.moe https://*.technicalsuwako.moe http://*.technicalsuwako.moe; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'; object-src 'none';" match response header append "Permissions-Policy" value "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=()" match request header "Accept-Encoding" value "gzip" tag "gzip" match response header "Content-Type" value "text/*" tag "compress" match response header "Content-Type" value "text/html" tag "charset=UTF-8" match response header "Content-Type" value "application/javascript" tag "compress" match response header "Content-Type" value "application/json" tag "compress" pass request quick header "Host" value "technicalsuwako.moe" forward to pass } relay www_tls { listen on $relayd_addr port 443 tls protocol reverse # Default forward to port 8443 check tcp } relay www_www { listen on $relayd_addr port 80 protocol reverse # Default forward to port 8080 check tcp } ``` ## 必要な PHP モジュール * php_gmp