ありがとうございます。認証済みのフィード自体は、私の側で正しく生成されていることを確認できました。
残りの問題はクライアントの互換性のようです。GoogleカレンダーもOutlookも、認証されたICSフィードに直接サブスクライブすることに難色を示しているようです。そのため、当面はホストレベルのNginxリバースプロキシを単一コンテナのDiscourseインストール(Discourse install)の前に配置し、代わりにプレーンな.icsファイルをそこで提供することで回避する予定です。
標準の単一コンテナ設定を使用しているため、これはコンテナからポート80/443を解放し、Discourseに内部のハイポートでリッスンさせ、その後ホストのNginxにフォーラムをプロキシさせ、静的カレンダーフィードパスも提供させることを意味すると思われます。
およそ、使用を想定しているコマンドは次のとおりです。
# 1. ホストのnginxとcertbotをインストール
sudo apt update
sudo apt install -y nginx snapd
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -sf /snap/bin/certbot /usr/bin/certbot
# 2. Discourseコンテナを停止して、ポート80/443を解放
cd /var/discourse
sudo ./launcher stop app
# 3. コンテナの設定を編集して、Discourseが直接80/443にバインドしないようにする
sudo nano /var/discourse/containers/app.yml
app.yml内で、exposeセクションを次のように変更します。
expose:
- "80:80"
- "443:443"
から、次のようなものに:
expose:
- "127.0.0.1:8080:80"
そして、存在する場合は、TLSがホストのリバースプロキシで終了するように、コンテナのSSL/Let’s Encryptテンプレートを削除します。
その後、再ビルドします。
cd /var/discourse
sudo ./launcher rebuild app
次に、次のようなホストレベルのNginxサイトを作成します。
sudo nano /etc/nginx/sites-available/discourse
以下のような内容で設定します。
server {
listen 80;
listen [::]:80;
server_name forum.example.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
location /private-calendar/ethan.ics {
alias /var/www/private-calendar/ethan.ics;
default_type text/calendar;
add_header Content-Type "text/calendar; charset=utf-8";
}
}
有効化してリロードします。
sudo mkdir -p /var/www/private-calendar
sudo mkdir -p /var/www/certbot
sudo ln -s /etc/nginx/sites-available/discourse /etc/nginx/sites-enabled/discourse
sudo nginx -t
sudo systemctl reload nginx
その後、Certbotを使用してLet’s Encrypt証明書を取得し、Nginx設定を更新させます。
sudo certbot --nginx -d forum.example.com
sudo nginx -t
sudo systemctl reload nginx
その後、Nginx設定には通常、HTTPSサーバーブロックも含まれます。例えば次のようになります。
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name forum.example.com;
ssl_certificate /etc/letsencrypt/live/forum.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/forum.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
location /private-calendar/ethan.ics {
alias /var/www/private-calendar/ethan.ics;
default_type text/calendar;
add_header Content-Type "text/calendar; charset=utf-8";
}
}
その時点で、ホスト上でスクリプト/タイマーを使用して、認証されたDiscourse ICSを取得し、次のように書き出すことができます。
/var/www/private-calendar/ethan.ics
これにより、Googleカレンダー/Outlookは通常の公開ICS URLとしてサブスクライブできるようになります。
したがって、私の見解では、Discourse側はこれで解決したと思われます。残りの実際的なギャップは、主に主要なカレンダークライアントが認証されたICSフィードをあまりうまく処理しないという点であり、そのため現時点では公開プロキシ/静的ファイルアプローチにフォールバックしているわけです。
また、CertbotがホストのNginxに対してLet’s Encryptの発行/更新を直接管理できるため、これが最も簡単なルートであると想定しています。acme.shを使用することもできますが、この特定のセットアップでは最も簡単なパスというよりは手動での選択になるという印象です。