NixOSで雑に開発サーバを建てる
とりあえずメモとして雑に書いておきます
前提
ローカル開発用のドメインとして thotep.net を使っている
これは昔メールアドレス用に取得したドメインの名残り
DNSなどのドメイン周りは Cloudflare で統一されている そのため security.acme では Cloudflare 経由の DNS-01 Challenge で証明書を作っている
また wildcard ドメインを活用することで必要になりそうな証明書をまるっと取得している
Caddy は Go 言語製の HTTP 1/2/3 サーバで、設定も簡単 WebSocket などもよしなにやってくれる
設定の解説
1. security.acme で Let's Encrypt の証明書を取ってくる
この際事前の設定テストでは Let's Encrypt の staging の URL を指定すること
これは security.acme.defaults.server で指定できる
ここが抜けていると設定の試行錯誤で本番を連打することになり、Rate Limit に引っ掛ってめんどうな事に……
2. cert.<example.tld> の extraDomainNames で複数の wildcard 証明書を取ってくる
こうすることにより開発用ドメインをいくらでも生やせる
便利
3. あとは services.caddy で実際のサーバ設定をする
気をつけるべき点として、services.caddy.virtualHosts.<example.tls>.useACMEHost を指定すること
これが抜けると Caddy 本体が Let's Encrypt 経由で証明書を取ってこようとするので、そこは注意
ここに指定する値は、certs.<example.tld> の example.tls の部分
おまけ
自分の開発サーバでは 100.64.0.0/10 を開発サーバの listen アドレスとして使っている
100.640.0.0/10 Tailscale で割り当てられた Tailscale VPN 内のアドレス空間
開発サーバを自身の端末間に限り、特定のネットワーク接続に依存させない、という条件だと Tailscale が便利
以下設定ファイル
NixOSの設定ファイルです
現実に使っているやつから持ってきました
code:devserver.nix
{ pkgs, ... }:
{
security.acme = {
acceptTerms = true;
defaults = {
enableDebugLogs = false;
email = "nyarla@kalaclista.com";
dnsProvider = "cloudflare";
dnsResolver = "1.1.1.1:53";
environmentFile = "/persist/var/lib/acme/cloudflare";
};
certs."localhost.thotep.net" = {
extraDomainNames = [
"*.localhost.thotep.net"
"*.f.localhost.thotep.net"
];
};
};
services.caddy = {
enable = true;
virtualHosts = {
"gts.f.localhost.thotep.net" = {
useACMEHost = "localhost.thotep.net";
logFormat = ''
output stdout
'';
extraConfig = ''
reverse_proxy 127.0.0.1:50000
'';
};
"masto.f.localhost.thotep.net" = {
useACMEHost = "localhost.thotep.net";
logFormat = ''
output stdout
'';
extraConfig = ''
handle /api/v1/streaming* {
reverse_proxy 127.0.0.1:50021
}
handle {
reverse_proxy 127.0.0.1:50020
}
'';
};
"misskey.f.localhost.thotep.net" = {
useACMEHost = "localhost.thotep.net";
logFormat = ''
output stdout
'';
extraConfig = ''
reverse_proxy 127.0.0.1:50030
'';
};
};
};
}