diff --git a/infra/zlambda.md b/infra/zlambda.md index 61a1ec3..b8fd219 100644 --- a/infra/zlambda.md +++ b/infra/zlambda.md @@ -11,7 +11,7 @@ tags: [nixos, linode, zlambda, infra] Linode Tokyo VM (라벨 `zlambda`, id 47271589)을 2026-04-08 Debian 12 → **NixOS 25.05 (Warbler)** 로 교체. nixos-anywhere로 무관리 원격 설치. -이전에 운영하던 [[netbis]] DR APISIX, microsocks, tlsproxy, vault-prod, wg-easy 등은 모두 제거됨. 현재는 베이스(sshd + tailscaled + docker)만 떠 있는 상태. +이전에 운영하던 [[netbis]] DR APISIX, microsocks, tlsproxy, vault-prod, wg-easy 등은 제거됨. 이후 같은 날 **APISIX + etcd를 NixOS `virtualisation.oci-containers`로 재선언**하여 기동 완료 (`apisix.nix`). 라우트/SSL은 아직 비어 있음. ## 접속 @@ -80,12 +80,22 @@ flake input: - `services.openssh` (PermitRootLogin prohibit-password, PasswordAuth off) - `services.tailscale.enable = true` - `virtualisation.docker.enable = true` (autoPrune 켜짐) +- `virtualisation.oci-containers.backend = "docker"` (`apisix.nix` 모듈에서 apisix + apisix-etcd 선언) - `nix.settings.experimental-features = [ "nix-command" "flakes" ]` - 패키지: vim git curl wget htop tmux jq rsync - TZ: Asia/Tokyo, locale en_US.UTF-8 - `networking.firewall.enable = false` (Linode firewall에 일임) - `system.stateVersion = "25.05"` +`apisix.nix` 모듈 요약: +- 컨테이너: apisix(172.22.222.20), apisix-etcd(172.22.222.3), docker network `apisix-net` (172.22.222.0/24) +- 포트: 80→9080, 443→9443, 9180(admin) +- 데이터: etcd는 `/var/lib/apisix/etcd` bind mount, apisix 로그는 named volume `apisix-logs` +- config.yaml은 `pkgs.writeText`로 Nix store에 생성 후 read-only 마운트 +- systemd 의존성: `init-apisix-net.service`(oneshot network 생성) → `docker-apisix-etcd` → `docker-apisix` +- Admin key `edd1c9f034335f136f87ad84b625c8f1` (현재 평문 하드코딩 — TODO: sops-nix 또는 agenix로 이전) +- 상세 운영: [[netbis]] + **커널 / sysctl 튜닝** (2026-04-08 추가): - `boot.kernelModules = [ "br_netfilter" ]` (docker bridge sysctl 활성화용) - 네트워크: BBR + fq qdisc, somaxconn 4096, tcp_fin_timeout 15, tcp_tw_reuse, tcp_keepalive 600/30/6, netdev_max_backlog 16384, tcp_max_syn_backlog 8192 diff --git a/services/netbis.md b/services/netbis.md index 09933e2..37ceda2 100644 --- a/services/netbis.md +++ b/services/netbis.md @@ -1,6 +1,6 @@ --- title: Netbis 예비서버 ([[zlambda]]) -updated: 2026-04-08 NixOS 전환으로 APISIX 미가동 +updated: 2026-04-08 APISIX NixOS oci-containers로 재가동 aliases: [netbis-sandbox-tokyo] tags: [netbis, apisix, dr, cloudflare, nixos] --- @@ -11,7 +11,7 @@ Netbis 팀 도메인의 예비(DR) 리버스 프록시 서버. 평소에는 트 기존 Ironclad 인프라([[apisix]], [[crowdsec-safeline]])와는 별도 구성. -> **2026-04-08 상태**: 호스트 OS를 Debian 12 → **NixOS 25.05**로 교체하면서 APISIX/etcd 컨테이너가 모두 제거됨. 호스트 이름도 `sandbox-tokyo` → `zlambda`로 통일. 현재 베이스 시스템(sshd + tailscaled + docker)만 떠 있고 **DR 역할은 미가동**. 재가동하려면 docker compose로 APISIX/etcd 재배포 필요. NixOS configuration은 Gitea [[zlambda|kaffa/nixos-infra]] flake에서 관리. +> **2026-04-08 상태**: Debian 12 → **NixOS 25.05** 전환 후 APISIX/etcd를 NixOS `virtualisation.oci-containers`로 재선언하여 기동 완료. 설정은 [[zlambda|kaffa/nixos-infra]] flake의 `apisix.nix` 모듈에 있음. 컨테이너는 구동되지만 **라우트/SSL은 비어 있으므로 DR 역할 부트스트랩은 별도 작업** (acme.sh 재발급 → admin API로 라우트/업스트림/SSL 등록). ## 서버 정보 @@ -30,16 +30,23 @@ Netbis 팀 도메인의 예비(DR) 리버스 프록시 서버. 평소에는 트 ## APISIX 구성 -Docker Compose (/opt/apisix/)로 배포. +NixOS `virtualisation.oci-containers`로 선언 — `~/nixos-infra/apisix.nix`. 재배포는 `nixos-rebuild switch --flake .#zlambda`. | 컨테이너 | 이미지 | 포트 | |----------|--------|------| | apisix | apache/apisix:3.15.0-debian | 80(→9080), 443(→9443), 9180 | -| apisix-etcd | gcr.io/etcd-development/etcd:v3.5.11 | 2379 (내부) | +| apisix-etcd | quay.io/coreos/etcd:v3.5.11 | 2379 (내부) | -- Admin API: `http://127.0.0.1:9180` (0.0.0.0/0 허용) +- Docker 네트워크: `apisix-net` (172.22.222.0/24), etcd=172.22.222.3, apisix=172.22.222.20 +- Admin API: `http://127.0.0.1:9180` (admin key 필수, Linode 방화벽이 public 차단 → Tailscale 경유) - Admin Key: `edd1c9f034335f136f87ad84b625c8f1` - APISIX 컨테이너 ulimits: nofile 655360 +- 영속 데이터: + - etcd: bind mount `/var/lib/apisix/etcd` (root 소유) + - apisix 로그: docker named volume `apisix-logs` (이미지 VOLUME 선언이 uid 1001 권한 세팅) +- config.yaml은 Nix store에서 생성되어 read-only bind mount (변경 시 rebuild) +- systemd 의존: `init-apisix-net.service`(oneshot) → `docker-apisix-etcd.service` → `docker-apisix.service` +- 플러그인: real-ip, cors, ip-restriction, proxy-rewrite, response-rewrite, redirect, limit-*, prometheus, http-logger, file-logger 등 (config.yaml 참조). **crowdsec-bouncer 플러그인은 미포함** (커스텀 lua 이전 필요 시 별도 작업). ### global_rules @@ -236,8 +243,8 @@ Workers Paid에 포함. CrowdSec Worker Bouncer 요청 로그를 R2에 저장 ## 이전에 운영했던 서비스 (제거됨) -sandbox-tokyo에서 기존 운영하던 아래 서비스는 2026-04-03 중지, 2026-04-08 NixOS 전환으로 완전 제거: -- APISIX 3.15.0 + apisix-etcd (Docker Compose) +sandbox-tokyo에서 기존 운영하던 아래 서비스는 2026-04-03 중지, 2026-04-08 NixOS 전환으로 제거: +- ~~APISIX 3.15.0 + apisix-etcd (Docker Compose)~~ → **2026-04-08 NixOS oci-containers로 재가동** - vault-prod (HashiCorp Vault) - wg-easy (WireGuard VPN) - nginx-tcp-proxy @@ -245,4 +252,18 @@ sandbox-tokyo에서 기존 운영하던 아래 서비스는 2026-04-03 중지, 2 - tlsproxy - Caddy (systemd, disabled) -재구성 시 참고: NixOS 위에 Docker는 이미 설치돼 있으므로 docker compose 디렉토리만 다시 만들면 됨. +재구성 시 참고: NixOS 모듈로 선언하는 패턴은 `apisix.nix` 참조. 간단한 외부 이미지 컨테이너는 `virtualisation.oci-containers.containers.` 블록 하나 + 필요 시 docker network 생성용 systemd oneshot만 있으면 된다. + +## 부트스트랩 체크리스트 (재가동 시) + +DR 활성화 전에 필요한 작업: + +- [ ] Linode 방화벽/네트워크: Cloudflare IP 대역이 80/443에 도달하는지 확인 +- [ ] acme.sh 재설치 (NixOS 환경에서 `services.acme` 또는 docker로 별도 실행). 기존 cert 경로 `/root/.acme.sh/{domain}_ecc/`는 삭제됨 +- [ ] 6개 도메인 × wildcard cert 재발급 (ZeroSSL, Cloudflare DNS-01) +- [ ] admin API로 11개 라우트 + 업스트림 + SSL 등록 (위 "라우트 및 업스트림" 표 참고) +- [ ] global_rules: real-ip(Cloudflare IPs) + http-logger(CrowdSec jp1 10.253.100.240) +- [ ] CrowdSec LAPI 키 재확인 — netbis 전용 바운서용 (vault에 저장) +- [ ] Cloudflare DNS 전환 (각 zone A 레코드 → 139.162.71.52) + +crowdsec-bouncer 플러그인이 필요하면 osaka에서 `crowdsec-bouncer.lua` 파일 가져와 apisix.nix 볼륨에 추가하고 config.yaml plugins에 등록.