pihole-dns-setup
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChinesePi-hole DNS Setup Skill
Pi-hole DNS配置技能
Configure Pi-hole local DNS records for local network resolution of temet.ai domains.
配置Pi-hole本地DNS记录,实现temet.ai域名的本地网络解析。
Quick Start
快速开始
Run automated DNS setup from domains.toml:
bash
cd /home/dawiddutoit/projects/network && ./scripts/manage-domains.sh applyOr manually add a single DNS record:
bash
undefined从domains.toml运行自动化DNS搭建:
bash
cd /home/dawiddutoit/projects/network && ./scripts/manage-domains.sh apply或手动添加单个DNS记录:
bash
undefinedGet Pi IP
获取树莓派IP
PI_IP=$(hostname -I | awk '{print $1}')
PI_IP=$(hostname -I | awk '{print $1}')
Test DNS resolution
测试DNS解析
dig @localhost pihole.temet.ai +short
undefineddig @localhost pihole.temet.ai +short
undefinedTable of Contents
目录
- When to Use This Skill
- What This Skill Does
- Instructions
- 3.1 Detect Pi IP Address
- 3.2 Get Domains from Configuration
- 3.3 Apply DNS Changes
- 3.4 Verify DNS Resolution
- 3.5 Router DNS Reminder
- Supporting Files
- Expected Outcomes
- Requirements
- Red Flags to Avoid
When to Use This Skill
何时使用该技能
Explicit Triggers:
- "Set up Pi-hole DNS"
- "Configure local DNS"
- "Add DNS record for [domain]"
- "Set up DNS entries"
- "Make [service].temet.ai resolve locally"
Implicit Triggers:
- After adding a new service to domains.toml
- When local resolution fails for temet.ai domains
- Setting up a fresh Pi-hole installation
- Migrating services to new IP addresses
Debugging Triggers:
- "DNS not resolving"
- "Can't access [service].temet.ai on local network"
- "dig returns wrong IP"
- "Works remotely but not locally"
明确触发场景:
- “搭建Pi-hole DNS”
- “配置本地DNS”
- “为[域名]添加DNS记录”
- “搭建DNS条目”
- “让[service].temet.ai在本地解析”
隐含触发场景:
- 向domains.toml添加新服务后
- temet.ai域名在本地无法解析时
- 全新安装Pi-hole后
- 将服务迁移到新IP地址时
调试触发场景:
- “DNS无法解析”
- “无法在本地网络访问[service].temet.ai”
- “dig返回错误IP”
- “远程可访问但本地不行”
What This Skill Does
该技能的作用
- Detects Pi IP - Auto-discovers the Raspberry Pi's local IP address
- Reads Configuration - Gets domain list from domains.toml
- Updates DNS - Configures Pi-hole with local DNS entries via docker-compose.yml
- Verifies Resolution - Tests DNS resolution works correctly
- Provides Guidance - Reminds about router DNS configuration
- 检测树莓派IP - 自动发现树莓派的本地IP地址
- 读取配置 - 从domains.toml获取域名列表
- 更新DNS - 通过docker-compose.yml为Pi-hole配置本地DNS条目
- 验证解析 - 测试DNS解析是否正常工作
- 提供指导 - 提醒配置路由器DNS
Instructions
操作步骤
3.1 Detect Pi IP Address
3.1 检测树莓派IP地址
Get the Pi's local IP automatically:
bash
hostname -I | awk '{print $1}'Expected output: (or similar)
192.168.68.135Alternative methods if needed:
bash
undefined自动获取树莓派本地IP:
bash
hostname -I | awk '{print $1}'预期输出:(或类似)
192.168.68.135其他可选方法:
bash
undefinedFrom network interface
从网络接口获取
ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(.\d+){3}'
ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(.\d+){3}'
From Pi-hole container environment
从Pi-hole容器环境变量获取
docker exec pihole printenv | grep PIHOLE_INTERFACE
undefineddocker exec pihole printenv | grep PIHOLE_INTERFACE
undefined3.2 Get Domains from Configuration
3.2 从配置文件获取域名
Read domains from :
domains.tomlbash
undefined从读取域名:
domains.tomlbash
undefinedList all configured services with DNS entries
列出所有配置了DNS条目的服务
./scripts/manage-domains.sh list
Or parse directly:
```bash
grep -E "^subdomain = |^dns_ip = " /home/dawiddutoit/projects/network/domains.tomlCurrent domains defined in domains.toml:
| Service | Domain | DNS IP |
|---|---|---|
| Pi-hole | pihole.temet.ai | 192.168.68.135 |
| Jaeger | jaeger.temet.ai | 192.168.68.135 |
| Langfuse | langfuse.temet.ai | 192.168.68.135 |
| Home Assistant | ha.temet.ai | 192.168.68.135 |
| Code Server | code.temet.ai | 192.168.68.135 |
| Sprinkler | sprinkler.temet.ai | 192.168.68.105 |
| Webhook | webhook.temet.ai | 192.168.68.135 |
| Root | temet.ai | 192.168.68.135 |
./scripts/manage-domains.sh list
或直接解析:
```bash
grep -E "^subdomain = |^dns_ip = " /home/dawiddutoit/projects/network/domains.tomldomains.toml中当前定义的域名:
| 服务 | 域名 | DNS IP |
|---|---|---|
| Pi-hole | pihole.temet.ai | 192.168.68.135 |
| Jaeger | jaeger.temet.ai | 192.168.68.135 |
| Langfuse | langfuse.temet.ai | 192.168.68.135 |
| Home Assistant | ha.temet.ai | 192.168.68.135 |
| Code Server | code.temet.ai | 192.168.68.135 |
| Sprinkler | sprinkler.temet.ai | 192.168.68.105 |
| Webhook | webhook.temet.ai | 192.168.68.135 |
| 根域名 | temet.ai | 192.168.68.135 |
3.3 Apply DNS Changes
3.3 应用DNS变更
Automated Method (Recommended):
bash
cd /home/dawiddutoit/projects/network && ./scripts/manage-domains.sh applyThis runs which:
generate-pihole-dns.py- Reads domains.toml
- Updates in docker-compose.yml
FTLCONF_dns_hosts - Restarts Pi-hole to apply changes
Manual DNS Entry (Single Domain):
If you need to add a single entry without full apply:
bash
undefined自动化方法(推荐):
bash
cd /home/dawiddutoit/projects/network && ./scripts/manage-domains.sh apply该命令会运行,执行以下操作:
generate-pihole-dns.py- 读取domains.toml
- 更新docker-compose.yml中的
FTLCONF_dns_hosts - 重启Pi-hole以应用变更
手动添加DNS条目(单个域名):
如果无需完整应用,仅需添加单个条目:
bash
undefinedEdit docker-compose.yml FTLCONF_dns_hosts section
编辑docker-compose.yml中的FTLCONF_dns_hosts部分
Then restart Pi-hole
然后重启Pi-hole
docker compose -f /home/dawiddutoit/projects/network/docker-compose.yml restart pihole
**How DNS Configuration Works:**
Pi-hole v6 uses `FTLCONF_dns_hosts` environment variable for custom DNS:
```yaml
environment:
FTLCONF_dns_hosts: |
192.168.68.135 pihole.temet.ai
192.168.68.135 jaeger.temet.ai
192.168.68.105 sprinkler.temet.aidocker compose -f /home/dawiddutoit/projects/network/docker-compose.yml restart pihole
**DNS配置原理:**
Pi-hole v6使用`FTLCONF_dns_hosts`环境变量配置自定义DNS:
```yaml
environment:
FTLCONF_dns_hosts: |
192.168.68.135 pihole.temet.ai
192.168.68.135 jaeger.temet.ai
192.168.68.105 sprinkler.temet.ai3.4 Verify DNS Resolution
3.4 验证DNS解析
After applying changes, verify DNS works:
Test individual domain:
bash
dig @localhost pihole.temet.ai +short应用变更后,验证DNS是否正常工作:
测试单个域名:
bash
dig @localhost pihole.temet.ai +shortExpected: 192.168.68.135
预期输出:192.168.68.135
**Test all configured domains:**
```bash
for domain in pihole jaeger langfuse ha code webhook; do
echo -n "$domain.temet.ai -> "
dig @localhost $domain.temet.ai +short
doneTest from another device on the network:
bash
undefined
**测试所有配置的域名:**
```bash
for domain in pihole jaeger langfuse ha code webhook; do
echo -n "$domain.temet.ai -> "
dig @localhost $domain.temet.ai +short
done从网络中的其他设备测试:
bash
undefinedReplace 192.168.68.135 with Pi's IP
将192.168.68.135替换为树莓派的IP
dig @192.168.68.135 pihole.temet.ai +short
**Check Pi-hole DNS logs:**
```bash
docker exec pihole pihole -tdig @192.168.68.135 pihole.temet.ai +short
**查看Pi-hole DNS日志:**
```bash
docker exec pihole pihole -tWatch live DNS queries
实时查看DNS查询日志
undefinedundefined3.5 Router DNS Reminder
3.5 路由器DNS配置提醒
Important: For DNS to work network-wide, configure your router:
-
Set router's DHCP to use Pi-hole as primary DNS:
- Primary DNS: (Pi's IP)
192.168.68.135 - Secondary DNS: (fallback)
1.1.1.1
- Primary DNS:
-
Or configure each device individually to use Pi-hole DNS
Verify device is using Pi-hole:
bash
undefined重要提示: 要让DNS在整个网络生效,需配置路由器:
-
将路由器的DHCP设置为使用Pi-hole作为主DNS:
- 主DNS:(树莓派的IP)
192.168.68.135 - 备用DNS:(备用选项)
1.1.1.1
- 主DNS:
-
或者为每个设备单独配置使用Pi-hole DNS
验证设备是否使用Pi-hole:
bash
undefinedOn the device, check what DNS server it's using
在设备上查看正在使用的DNS服务器
cat /etc/resolv.conf
cat /etc/resolv.conf
Should show: nameserver 192.168.68.135
应显示:nameserver 192.168.68.135
undefinedundefinedSupporting Files
支持文件
| File | Purpose |
|---|---|
| DNS configuration deep-dive, Pi-hole internals, troubleshooting |
| Common scenarios and configurations |
| DNS verification script |
| 文件 | 用途 |
|---|---|
| DNS配置深入解析、Pi-hole内部原理、故障排查 |
| 常见场景与配置示例 |
| DNS验证脚本 |
Expected Outcomes
预期结果
Success:
- All domains resolve to correct IPs locally
- returns expected IP
dig @localhost domain.temet.ai - Services accessible at on local network
https://domain.temet.ai
Partial Success:
- DNS works from Pi but not from other devices
- Cause: Router not configured to use Pi-hole as DNS
Failure Indicators:
- returns NXDOMAIN -> DNS entry not configured
dig - returns wrong IP -> Stale configuration
dig - Pi-hole not responding -> Container not running
成功:
- 所有域名在本地解析到正确IP
- 返回预期IP
dig @localhost domain.temet.ai - 可在本地网络通过访问服务
https://domain.temet.ai
部分成功:
- DNS在树莓派上正常工作,但在其他设备上不行
- 原因:路由器未配置为使用Pi-hole作为DNS
失败迹象:
- 返回NXDOMAIN -> DNS条目未配置
dig - 返回错误IP -> 配置过期
dig - Pi-hole无响应 -> 容器未运行
Requirements
环境要求
Environment:
- Pi-hole container running:
docker ps | grep pihole - Docker Compose available
- domains.toml configured
Tools needed:
- Read (configuration files)
- Bash (dig, docker commands)
- Grep (parsing domains)
环境:
- Pi-hole容器正在运行:
docker ps | grep pihole - 已安装Docker Compose
- domains.toml已配置
所需工具:
- 读取权限(配置文件)
- Bash(dig、docker命令)
- Grep(解析域名)
Red Flags to Avoid
注意事项
- Do not add DNS entries directly to Pi-hole web UI (use domains.toml)
- Do not forget to restart Pi-hole after config changes
- Do not skip the router DNS configuration reminder
- Do not use as DNS IP (use actual Pi IP)
127.0.0.1 - Do not assume DNS propagates instantly (may take 1-2 minutes)
- Do not forget IoT devices may need different IPs (sprinkler -> 192.168.68.105)
- 不要直接在Pi-hole网页UI中添加DNS条目(请使用domains.toml)
- 配置变更后不要忘记重启Pi-hole
- 不要忽略路由器DNS配置提醒
- 不要使用作为DNS IP(请使用树莓派实际IP)
127.0.0.1 - 不要假设DNS会立即生效(可能需要1-2分钟)
- 不要忘记IoT设备可能需要不同的IP(如sprinkler -> 192.168.68.105)
Notes
备注
- DNS entries are stored in docker-compose.yml
FTLCONF_dns_hosts - The script reads domains.toml and updates docker-compose.yml
generate-pihole-dns.py - Local DNS resolution allows fast LAN access without internet roundtrip
- Remote access uses Cloudflare DNS (separate from Pi-hole)
- Always verify DNS after changes with
dig @localhost domain +short
- DNS条目存储在docker-compose.yml的中
FTLCONF_dns_hosts - 脚本读取domains.toml并更新docker-compose.yml
generate-pihole-dns.py - 本地DNS解析可实现快速局域网访问,无需绕路互联网
- 远程访问使用Cloudflare DNS(与Pi-hole分离)
- 变更后请始终使用验证DNS
dig @localhost domain +short