ローカルの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

Remaining : 0 characters / 0 images
100

Sign up / Continue after login

Related stories

Writer

Share

Popular stories

Compass Mining でビットコインマイニングを始めてみた

212

電話番号を公開せずにアカウントを作成する方法:Lightningで認証する!

72