summaryrefslogtreecommitdiff
path: root/mail/dns
diff options
context:
space:
mode:
authoryyamashita <yyamashita@hetzner.yyamashita.com>2026-06-01 21:19:05 +0900
committeryyamashita <yyamashita@hetzner.yyamashita.com>2026-06-01 21:19:05 +0900
commited78863260dedd56152976ebc630229461e2b0a2 (patch)
tree0e0ba6fbefe3a3cd00c556dcd2b9da4fabea7f3b /mail/dns
parentc55ae2d5daf229b12556d6283ba4e5e8161a5eb5 (diff)
Fix DKIM key generation: use host opendkim-tools instead of Docker
Ubuntu 24.04 ホストに直接 apt install して opendkim-genkey を実行する。 Debian Bookworm の Docker 内では OpenSSL 3.x 互換性問題で失敗するため。 setup-route53.py: ホストゾーン自動検出・SERVER_IP 自動取得を追加。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'mail/dns')
-rwxr-xr-xmail/dns/setup-route53.py34
1 files changed, 22 insertions, 12 deletions
diff --git a/mail/dns/setup-route53.py b/mail/dns/setup-route53.py
index a3c69a4..0864c9a 100755
--- a/mail/dns/setup-route53.py
+++ b/mail/dns/setup-route53.py
@@ -6,12 +6,10 @@ Route 53 DNS 設定スクリプト: SPF / DKIM / DMARC
pip3 install boto3
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
- export HOSTED_ZONE_ID=Z... # Route 53 ホストゾーン ID (yyamashita.com)
- export SERVER_IP=<HetznerサーバーIP> # 自動検出不可の場合のみ
python3 /app/infra/mail/dns/setup-route53.py
-domains.txt に記載されたサービスドメインと hetzner.yyamashita.com に対して
-SPF / DKIM / DMARC TXT レコードを UPSERT する。
+HOSTED_ZONE_ID は yyamashita.com のゾーンを自動検出する。
+SERVER_IP は自動取得(必要に応じて環境変数で上書き可能)。
"""
import os
@@ -27,10 +25,9 @@ except ImportError:
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
DOMAINS_FILE = os.environ.get("DOMAINS_FILE", os.path.join(SCRIPT_DIR, "..", "domains.txt"))
-HOSTED_ZONE_ID = os.environ.get("HOSTED_ZONE_ID", "")
-AWS_REGION = os.environ.get("AWS_REGION", "us-east-1")
SELECTOR = "mail"
PRIMARY = "hetzner.yyamashita.com"
+ZONE_DOMAIN = "yyamashita.com"
def get_server_ip():
@@ -45,6 +42,17 @@ def get_server_ip():
return ""
+def get_hosted_zone_id(client):
+ if zone_id := os.environ.get("HOSTED_ZONE_ID", ""):
+ return zone_id
+ paginator = client.get_paginator("list_hosted_zones")
+ for page in paginator.paginate():
+ for zone in page["HostedZones"]:
+ if zone["Name"].rstrip(".") == ZONE_DOMAIN:
+ return zone["Id"].split("/")[-1]
+ return ""
+
+
def read_domains(path):
domains = []
with open(path) as f:
@@ -78,9 +86,12 @@ def txt_record(fqdn, raw_value):
def main():
- if not HOSTED_ZONE_ID:
- print("ERROR: HOSTED_ZONE_ID が未設定です", file=sys.stderr)
- print(" export HOSTED_ZONE_ID=Z...", file=sys.stderr)
+ client = boto3.client("route53")
+
+ zone_id = get_hosted_zone_id(client)
+ if not zone_id:
+ print(f"ERROR: {ZONE_DOMAIN} のホストゾーンが見つかりません", file=sys.stderr)
+ print(" export HOSTED_ZONE_ID=Z... で手動指定してください", file=sys.stderr)
sys.exit(1)
server_ip = get_server_ip()
@@ -100,7 +111,7 @@ def main():
service_domains = read_domains(DOMAINS_FILE)
print(f"サーバー IP : {server_ip}")
- print(f"ホストゾーン: {HOSTED_ZONE_ID}")
+ print(f"ホストゾーン: {zone_id} ({ZONE_DOMAIN})")
print(f"ドメイン : {[PRIMARY] + service_domains}")
print()
@@ -122,9 +133,8 @@ def main():
rrs = c["ResourceRecordSet"]
print(f" {rrs['Type']} {rrs['Name']}")
- client = boto3.client("route53", region_name=AWS_REGION)
resp = client.change_resource_record_sets(
- HostedZoneId=HOSTED_ZONE_ID,
+ HostedZoneId=zone_id,
ChangeBatch={
"Comment": "Mail auth records (SPF/DKIM/DMARC) via hetzner-infra",
"Changes": changes,