ローカルのBTCPay Serverをhttpsで公開する
torで実行しているサービスをnginxのリバースプロキシを通してhttpsで公開する。
https://docs.btcpayserver.org/Deployment/ReverseProxyToTor/
こちらにほぼ沿うが躓きを報告する。(動作の保証はないです)
動機
ローカルルーターをポートフォーワードしたくない。
IPを公開したくない。
環境
embassy-os (Umbrellに近いパーソナルサーバー)
※最近、x86 isoが公開された
BTCPay Server 1.7.3
ドメイン
VPS (Digital Ocean 紹介リンク)/Ubuntu 22.04.1 LTS
手順
VPS 設定
socat
など必要なプログラムをインストール
# switch to root user (if not logged in as root)
sudo su -
# install dependencies
apt update
apt install -y nginx socat tor python3-certbot-nginx
socat設定
サービスファイル作成
[Unit]
Description=HTTP-to-SOCKS proxy
After=network.target
[Service]
EnvironmentFile=/etc/http-to-socks-proxy/%i.conf
ExecStart=/usr/bin/socat tcp4-LISTEN:${LOCAL_PORT},reuseaddr,fork,keepalive,bind=127.0.0.1 SOCKS4A:${PROXY_HOST}:${REMOTE_HOST}:${REMOTE_PORT},socksport=${PROXY_PORT}
[Install]
WantedBy=multi-user.target
/etc/http-to-socks-proxy/btcpayserver.conf
にサービスの設定ファイルを作成
# ディレクト作成
mkdir -p /etc/http-to-socks-proxy/
# 以下をbtcpayserver.confファイルに書き込み
nano /etc/http-to-socks-proxy/btcpayserver.conf
REMOTE_HOSTのbtcpayserverhiddenserviceaddress.onionは
>Interface>Tor address
のアドレスを張り付ける(http://は不要)
PROXY_HOST=127.0.0.1
PROXY_PORT=9050
LOCAL_PORT=9081
REMOTE_HOST=btcpayserverhiddenserviceaddress.onion
REMOTE_PORT=80
ソフトリンクを作成して、サービスを実行可能にする
# ソフトリンク作成
ln -s /etc/systemd/system/http-to-socks-proxy\@.service /etc/systemd/system/multi-user.target.wants/http-to-socks-proxy\@btcpayserver.service
# サービス開始
systemctl start http-to-socks-proxy@btcpayserver
# サービスの実行確認
systemctl status http-to-socks-proxy@btcpayserver
# トンネルが実行できているか確認
netstat -tulpn | grep socat
# 以下のような出力が返る
# tcp 0 0 127.0.0.1:9081 0.0.0.0:* LISTEN 951/socat
ウェブサーバー設定
VPSのドメイン設定
AレコードでドメインまたはサブドメインをVPSのIPに設定する
SSLとLet's Encryptの準備
# 4096 bit鍵生成
openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
# Let's Encrypt 用のディレクトリ作成・権限変更
mkdir -p /var/lib/letsencrypt/.well-known
chgrp www-data /var/lib/letsencrypt
chmod g+s /var/lib/letsencrypt
nginx設定: http
/etc/nginx/conf.d/map.conf
を作成
map $http_x_forwarded_proto $proxy_x_forwarded_proto {
default $http_x_forwarded_proto;
'' $scheme;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
/etc/nginx/sites-available/btcpayserver.conf
にドメイン用設定を作成
server {
listen 80;
server_name btcpayserver.mydomain.com;
# Let's Encrypt verification requests
location ~ /.well-known/acme-challenge/ {
allow all;
root /var/lib/letsencrypt/;
default_type "text/plain";
try_files $uri =404;
}
# Redirect everything else to https
location / {
return 301 https://$server_name$request_uri;
}
}
※ location ~ /.well-known/acme-challenge/ としないとcertbotが実行できなかった。
ソフトリンクを作成して、nginxを再起動
ln -s /etc/nginx/sites-available/btcpayserver.conf /etc/nginx/sites-enabled/btcpayserver.conf
systemctl restart nginx
certbotでSSL証明書を取得
admin@mydomain.com: 提出用のメールアドレス
btcpayserver.mydomain.com: 自分のドメインまたはサブドメイン
certbot certonly --agree-tos --email admin@mydomain.com --webroot -w /var/lib/letsencrypt/ -d btcpayserver.mydomain.com
nginx設定: https化
先ほど作成した、/etc/nginx/sites-available/btcpayserver.conf
に以下を追記する。
btcpayserver.mydomain.com: 自分のドメインに置き換え
server_name, ssl_certificate, ssl_certificate_key
server {
listen 443 ssl http2;
server_name btcpayserver.mydomain.com;
# SSL settings
ssl_stapling on;
ssl_stapling_verify on;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
# Update this with the path of your certificate files
ssl_certificate /etc/letsencrypt/live/btcpayserver.mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/btcpayserver.mydomain.com/privkey.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;
add_header Strict-Transport-Security "max-age=63072000" always;
add_header Content-Security-Policy "frame-ancestors 'self';";
add_header X-Content-Type-Options nosniff;
# Proxy requests to the socat service
location / {
proxy_pass http://127.0.0.1:9081/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
nginx 全体設定
/etc/nginx/conf.d/default.conf
のhttpブロックに以下を追記
http {
#---既に書いてある設定---
# settings for btcpayserver ----
# Needed to allow very long URLs to prevent issues while signing PSBTs
server_names_hash_bucket_size 127;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
client_header_buffer_size 500k;
large_client_header_buffers 4 500k;
http2_max_field_size 500k;
http2_max_header_size 500k;
# Needed websocket support (used by Ledger hardware wallets)
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# increasing time-out
proxy_read_timeout 1800;
proxy_connect_timeout 1800;
proxy_send_timeout 1800;
# end settings for btcpayserver
}
nginx再起動
systemctl restart nginx
自分のドメインにアクセスすると、BTCPay Serverにつながる(はず)
自分のBTCPay Serverです。(アクセスに時間がかかります)
参考資料
BTCPay Server Reverse Proxy To Tor
BTCPay Server: I get 503 Service Temporarily Unavailable nginx
Github issue: Timeout