Laravel11 にReverbでチャットを作った。

Websocket がよく分かってなかったこともあり、すごく苦労したので、その時のメモ

.envについて

REVERB_HOST=0.0.0.0
REVERB_PORT=8080
REVERB_SCHEME=http

server.conf について

/etc/nginx/conf.d/server.conf にコピーする。

ここは、なぜかソースが消えちゃうという問題が発生。なので、saerver.templateというファイルを作って、
docker-compose 起動時にコピー

    - ./nginx/server.template:/etc/nginx/conf.d/server.template
        entrypoint: ["/bin/sh", "-c", "cp /etc/nginx/conf.d/server.template /etc/nginx/conf.d/server.conf && exec nginx -g 'daemon off;'"]

実際のコードには、以下を入れる

location /app/ {
    proxy_pass http://laravel.test:8080/app/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    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_pass http://laravel.test:8080/app/;

この部分が結構難点で、

docker inspect -f ‘{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}’ tinder10-laravel.test-1

こんな感じで、IPアドレス(ローカルを調べて)設定する。

これを、127.0.0.1 にしたり、DNS名にしたりしたけどダメで、結局 コンテナ名を設定するだった。

IPアドレスだと、dockerを立ち上げるたびに変わることがあるので、コンテナ名とした。

/app/ で、対応しているので、/appは必須 これがないと、nginxから呼び出されない。 これも試行錯誤した。

config.broadcast

        'reverb' => [
            'driver' => 'reverb',
            'key' => env('REVERB_APP_KEY'),
            'secret' => env('REVERB_APP_SECRET'),
            'app_id' => env('REVERB_APP_ID'),
            'options' => [
                'host' => env('REVERB_HOST', 'localhost'),
                'port' => env('REVERB_PORT', 8080), // デフォルトを 8080 に修正
                'useTLS' => true,
                'scheme' => env('REVERB_SCHEME', 'https'),
                #'useTLS' => env('REVERB_PORT', 443) == 443 || env('REVERB_SCHEME', 'http') === 'https', // 修正
            ],
            'client_options' => [
                // Guzzle client options
            ],
        ],

useTLS をtrue とした。

config.reverb.php

ここで app に指定しているのを忘れて、無駄に時間を

    'apps' => [

        'provider' => 'config',

        'apps' => [
            [
                'key' => env('REVERB_APP_KEY'),
                'secret' => env('REVERB_APP_SECRET'),
                'app_id' => env('REVERB_APP_ID'),
                'options' => [
                    'host' => env('REVERB_HOST'),
                    'port' => env('REVERB_PORT', 443),
                    'scheme' => env('REVERB_SCHEME', 'https'),
                    'useTLS' => env('REVERB_SCHEME', 'https') === 'https',
                ],
                'allowed_origins' => ['*'],
                'ping_interval' => env('REVERB_APP_PING_INTERVAL', 60),
                'activity_timeout' => env('REVERB_APP_ACTIVITY_TIMEOUT', 30),
                'max_message_size' => env('REVERB_APP_MAX_MESSAGE_SIZE', 10_000),
            ],
        ],

    ],

php.ini

Letsencriptのセキュリティファイルの指定

curl.cainfo="/etc/ssl/certs/fullchain.pem"
openssl.cafile="/etc/ssl/certs/fullchain.pem"

当然と言えば当然なのだけど、nginx と reverb(laravel.text)は、それぞれに、セキュリティファイルが必要

上にも書いたけど、nginx のコンテナは、なかなか一度入るとキャッシュが効いて、それが上書きするので厄介。

chainn.pem を最初入れてたのをfull chain.pemに切り替えたのに、それがアップすると、chain.pemの内容になっていてそれに気がつくのにすごく時間がかかった。chatgptがサイズが違うって教えてくれて気がついた。

docker-compose.yml

一応nginxの最終系

    nginx:
        image: 'nginx:latest'
        ports:
            - '${HTTP_PORT:-80}:80'
            - '${SSL_PORT:-443}:443'
        environment:
            - SSL_PORT=${SSL_PORT:-443}
            - APP_SERVICE=${APP_SERVICE:-laravel.test}
            - SERVER_NAME=${SERVER_NAME:-localhost}
            - SSL_DOMAIN=${SSL_DOMAIN:-localhost}
            - SSL_ALT_NAME=${SSL_ALT_NAME:-DNS:localhost}
        volumes:
            #- ./nginx/server.conf:/etc/nginx/conf.d/default.conf
                        #- ./nginx/server.conf:/etc/nginx/conf.d/default.conf
            #- 'sail-nginx:/etc/nginx/certs'
            - './vendor/ryoluo/sail-ssl/nginx/templates:/etc/nginx/templates'
            - './vendor/ryoluo/sail-ssl/nginx/generate-ssl-cert.sh:/docker-entrypoint.d/99-generate-ssl-cert.sh'
            - './docker/dev.tinder.navi.jpn.com/privkey1.pem:/etc/nginx/certs/server.key'
            - './docker/dev.tinder.navi.jpn.com/fullchain1.pem:/etc/nginx/certs/server.pem'
            - ./nginx/server.template:/etc/nginx/conf.d/server.template
        entrypoint: ["/bin/sh", "-c", "cp /etc/nginx/conf.d/server.template /etc/nginx/conf.d/server.conf && exec nginx -g 'daemon off;'"]