# 🧹 μ—…κ·Έλ ˆμ΄λ“œμ™€ μ‚­μ œ μ—…κ·Έλ ˆμ΄λ“œκ°€ λ°”κΎΈλŠ” 것은 두 κ°€μ§€ β€” λ°”μ΄λ„ˆλ¦¬μ™€ μ„œλΉ„μŠ€ μœ λ‹› β€” 뿐이고, μ„€μ •κ³Ό μΈμ¦μ„œλŠ” κ·ΈλŒ€λ‘œ λ‘‘λ‹ˆλ‹€. 이 νŽ˜μ΄μ§€λŠ” 그것을 보여 μ£Όκ³ , μ»¨ν…Œμ΄λ„ˆμ—μ„œμ˜ 같은 절차, 버전을 λ˜λŒλ €μ•Ό ν•  λ•Œμ˜ 경둜, 그리고 μ² κ±°λ₯Ό λ‹€λ£Ήλ‹ˆλ‹€. ## 🧾 무엇이 무엇을 κ²¬λ””λŠ”κ°€ | 경둜 | μ—…κ·Έλ ˆμ΄λ“œ μ‹œ | | --- | --- | | `/etc/Pingclair/Pingclairfile` | μœ μ§€. μ„€μΉ˜ ν”„λ‘œκ·Έλž¨μ€ 없을 λ•Œλ§Œ μ”λ‹ˆλ‹€. | | `/etc/Pingclair/Pingclairfile.example` | ν˜„μž¬ 예제둜 κ΅μ²΄λ©λ‹ˆλ‹€. | | `/var/lib/pingclair/.local/share/pingclair` | μœ μ§€. λ°œκΈ‰λœ μΈμ¦μ„œμ™€ ACME μƒνƒœκ°€ κ·ΈλŒ€λ‘œ λ‚¨μŠ΅λ‹ˆλ‹€. | | `/var/lib/pingclair/html` | μœ μ§€. | | `/usr/local/bin/pingclair`와 `pc` | μƒˆ 릴리슀둜 κ΅μ²΄λ©λ‹ˆλ‹€. | | `/etc/systemd/system/pingclair.service` | λ‹€μ‹œ 쓰이고 μ„œλΉ„μŠ€κ°€ μž¬μ‹œμž‘λ©λ‹ˆλ‹€. | ## ⬆️ μ„€μΉ˜ ν”„λ‘œκ·Έλž¨μœΌλ‘œ μ—…κ·Έλ ˆμ΄λ“œ ```bash curl -fsSL https://pingclair.com/install.sh | sudo bash ``` μŠ€ν¬λ¦½νŠΈλŠ” GitHub에 μ΅œμ‹  릴리슀 νƒœκ·Έλ₯Ό 묻고, 좜λ ₯ν•˜κ³ , μ•„μΉ΄μ΄λΈŒμ˜ SHA-256을 κ²€μ¦ν•˜κ³ , λ°”μ΄λ„ˆλ¦¬μ™€ μœ λ‹›μ„ κ΅μ²΄ν•œ λ’€ μ„œλΉ„μŠ€λ₯Ό μž¬μ‹œμž‘ν•©λ‹ˆλ‹€. 이미 μžˆλŠ” μ„€μ • νŒŒμΌμ€ κ±΄λ“œλ¦¬μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 이것이 μ΄ˆκΈ°ν™”κ°€ μ•„λ‹ˆλΌ μ—…κ·Έλ ˆμ΄λ“œκ°€ λ©λ‹ˆλ‹€. ```text Detected architecture: x86_64 Fetching latest release from dorianverlaine/pingclair... Installing v0.2.0-rc.3 β€” a release candidate, not a final release. pingclair-linux-x86_64.tar.gz: OK βœ… Installation Complete! Config: /etc/Pingclair/Pingclairfile ``` μƒˆ 버전과, 이전 섀정이 μ—¬μ „νžˆ μ„œλΉ„μŠ€λ˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. ```bash pingclair version pc service status curl -i http://localhost/ ``` ```text v0.2.0-rc.3 ``` μ„€μΉ˜ ν”„λ‘œκ·Έλž¨μ€ 항상 μ΅œμ‹  릴리슀λ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€. νŠΉμ • 버전을 μ§€μ •ν•˜λŠ” ν”Œλž˜κ·ΈλŠ” μ—†μŠ΅λ‹ˆλ‹€. 그럴 λ•ŒλŠ” μ•„λž˜ 둀백을 μ”λ‹ˆλ‹€. ## 🐳 μ»¨ν…Œμ΄λ„ˆ μ—…κ·Έλ ˆμ΄λ“œ ν˜ΈμŠ€νŠΈμ—λŠ” 아무것도 μ„€μΉ˜λ˜μ§€ μ•ŠμœΌλ―€λ‘œ μ—…κ·Έλ ˆμ΄λ“œλŠ” νƒœκ·Έ λ³€κ²½κ³Ό pullμž…λ‹ˆλ‹€. compose νŒŒμΌμ—μ„œ μƒˆ 릴리슀λ₯Ό κ³ μ •ν•©λ‹ˆλ‹€. ```yaml services: pingclair: image: ghcr.io/dorianverlaine/pingclair:v0.2.0-rc.3 ``` ```bash docker compose pull docker compose up -d docker logs pingclair 2>&1 | head -3 ``` ```text πŸš€ Starting Pingclair with config: /etc/pingclair/Pingclairfile πŸš€ Starting Pingclair v0.2.0-rc.3 πŸ“„ Loaded configuration from: /etc/pingclair/Pingclairfile ``` μ„€μ •κ³Ό μΈμ¦μ„œ μ €μž₯μ†ŒλŠ” λ³Όλ₯¨ μ•ˆμ— μžˆμœΌλ―€λ‘œ μƒˆ μ»¨ν…Œμ΄λ„ˆλŠ” 이전 μ»¨ν…Œμ΄λ„ˆκ°€ 남긴 μžλ¦¬μ—μ„œ 그것듀을 μ°ΎμŠ΅λ‹ˆλ‹€. μ£Όμ˜ν•  점이 λ‘˜ μžˆμŠ΅λ‹ˆλ‹€. - **80 포트λ₯Ό λ§€ν•‘ν•œ μ»¨ν…Œμ΄λ„ˆλŠ” systemd μ„œλΉ„μŠ€κ°€ λ„λŠ” λ™μ•ˆ μ‹œμž‘ν•  수 μ—†μŠ΅λ‹ˆλ‹€.** λ‘˜ 쀑 ν•˜λ‚˜λ₯Ό λ©ˆμΆ”μ‹­μ‹œμ˜€: `sudo pc service stop`, λ˜λŠ” μ»¨ν…Œμ΄λ„ˆ μͺ½ 곡개 포트λ₯Ό λ°”κΎΈμ‹­μ‹œμ˜€. - **`latest`λŠ” μ΅œμ‹  릴리슀λ₯Ό λ”°λΌκ°‘λ‹ˆλ‹€.** μš΄μ˜μ—μ„œλŠ” 버전을 κ³ μ •ν•΄, μ—…κ·Έλ ˆμ΄λ“œκ°€ pull의 λΆ€μž‘μš©μ΄ μ•„λ‹ˆλΌ 결정이 되게 ν•˜μ‹­μ‹œμ˜€. ## βͺ 이전 릴리슀둜 되돌리기 μƒˆ 버전을 λ˜λŒλ €μ•Ό ν•  λ•ŒλŠ” 릴리슀 ν˜ΈμŠ€νŠΈμ—μ„œ 이전 버전을 λ°›μ•„, κ·Έ 버전이 κ³΅κ°œν•œ λ‹€μ΄μ œμŠ€νŠΈμ™€ λŒ€μ‘°ν•œ λ’€ λ°”μ΄λ„ˆλ¦¬λ₯Ό κ΅μ²΄ν•©λ‹ˆλ‹€. ```bash mkdir -p /tmp/rollback && cd /tmp/rollback version=0.2.0-rc.2 base="https://releases.pingclair.com/pingclair/releases/$version" curl -fsSL "$base/release.json" -o release.json tarball=pingclair-linux-x86_64.tar.gz expected="$(jq -r ".assets[] | select(.name == \"$tarball\") | .digest" release.json | sed 's/^sha256://')" curl -fsSLO "$base/$tarball" printf '%s %s\n' "$expected" "$tarball" | sha256sum -c - mkdir -p extract && tar -xzf "$tarball" -C extract ``` ```text pingclair-linux-x86_64.tar.gz: OK ``` ```bash sudo systemctl stop pingclair sudo install -m 0755 extract/pingclair /usr/local/bin/pingclair sudo systemctl start pingclair pingclair version ``` ```text v0.2.0-rc.2 ``` 되돌린 버전에 λŒ€ν•΄ 섀정을 κ²€μ¦ν•˜μ‹­μ‹œμ˜€. κ·Έ 버전이 κ΅¬ν˜„ν•˜μ§€ μ•Šμ€ μ§€μ‹œμ–΄λŠ” λ¬΄μ‹œλ˜μ§€ μ•Šκ³  이름을 λŒ€λ©° κ±°λΆ€λ©λ‹ˆλ‹€. ```bash sudo pingclair validate /etc/Pingclair/Pingclairfile ``` ## 🧹 μ‚­μ œν•˜κΈ° ```bash sudo pc service stop sudo systemctl disable pingclair sudo rm /etc/systemd/system/pingclair.service sudo systemctl daemon-reload sudo rm /usr/local/bin/pingclair /usr/local/bin/pc ``` κ·Έ λ’€ `systemctl status pingclair`λŠ” `Unit pingclair.service could not be found`라고 λ‹΅ν•˜κ³ , λͺ…령은 사라지며, 80 ν¬νŠΈμ—μ„œ 아무것도 λ“£μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ””μŠ€ν¬μ— λ‚¨λŠ” 것은 μ˜λ„μ μœΌλ‘œ λ‹Ήμ‹ μ˜ λ°μ΄ν„°μž…λ‹ˆλ‹€. ```text /etc/Pingclair/Pingclairfile μ„€μ •. κ·ΈλŒ€λ‘œ μœ νš¨ν•©λ‹ˆλ‹€ /var/lib/pingclair/.local/share/pingclair λ°œκΈ‰λœ μΈμ¦μ„œμ™€ ACME μƒνƒœ /var/lib/pingclair/html μ•ˆλ‚΄ νŽ˜μ΄μ§€ /var/log/pingclair 둜그 좜λ ₯ 디렉터리 ``` λ‹€μ‹œ μ„€μΉ˜ν•  κ³„νšμ΄λ©΄ `/var/lib/pingclair/.local/share/pingclair`λ₯Ό λ‚¨κΈ°μ‹­μ‹œμ˜€. μΈμ¦μ„œμ™€ λ‚΄λΆ€ λ£¨νŠΈκ°€ 살아남고, κ·Έ 루트λ₯Ό μ‹ λ’°ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈλ„ 계속 λ™μž‘ν•©λ‹ˆλ‹€. κ·Έ ν˜ΈμŠ€νŠΈμ—μ„œ Pingclairλ₯Ό 끝낸닀면 μ„œλΉ„μŠ€ κ³„μ •κΉŒμ§€ μ§€μ›λ‹ˆλ‹€. ```bash sudo rm -rf /etc/Pingclair /var/lib/pingclair /var/log/pingclair sudo userdel pingclair ``` ## ⚠️ 잘 λ˜μ§€ μ•Šμ„ λ•Œ - **μ˜ˆμƒκ³Ό λ‹€λ₯Έ 버전이 μ„€μΉ˜λ¨.** μ„€μΉ˜ ν”„λ‘œκ·Έλž¨μ€ 항상 μ΅œμ‹  릴리슀 νƒœκ·Έλ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€. `pingclair version`으둜 ν™•μΈν•˜κ³ , νŠΉμ • 버전이 ν•„μš”ν–ˆλ‹€λ©΄ μœ„μ˜ 둀백을 μ“°μ‹­μ‹œμ˜€. - **μ—…κ·Έλ ˆμ΄λ“œ ν›„ μ„œλΉ„μŠ€κ°€ μ‹œμž‘ν•˜μ§€ μ•ŠμŒ.** `sudo pingclair validate /etc/Pingclair/Pingclairfile`을 μ½μœΌμ‹­μ‹œμ˜€. μƒˆ 버전이 κ±°λΆ€ν•˜λŠ” μ§€μ‹œμ–΄λŠ” 이름과 λŒ€μ•ˆμ„ 밝히며 fail closed ν•˜λ―€λ‘œ journal이 κ³ μΉ  쀄을 μ•Œλ € μ€λ‹ˆλ‹€. - **μ»¨ν…Œμ΄λ„ˆκ°€ κ³§λ°”λ‘œ μ’…λ£Œλ¨.** `docker logs `κ°€ 이유λ₯Ό 보여 μ€λ‹ˆλ‹€. ν”ν•œ 원인은 λ§ˆμš΄νŠΈν•œ μ„€μ • 디렉터리에 `/etc/pingclair/Pingclairfile`이 μ—†λŠ” 것, λ˜λŠ” ν˜ΈμŠ€νŠΈμ—μ„œ ν¬νŠΈκ°€ 이미 μ‚¬μš© 쀑인 κ²ƒμž…λ‹ˆλ‹€. - **μ €μž₯μ†Œλ₯Ό λ‹€μ‹œ λ§Œλ“  λ’€ ν΄λΌμ΄μ–ΈνŠΈκ°€ μΈμ¦μ„œλ₯Ό 거뢀함.** λ‚΄λΆ€ 인증 기관을 μž¬μƒμ„±ν•˜λ©΄ μ˜› λ£¨νŠΈλŠ” 아무것도 μ„œλͺ…ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μƒˆ 루트λ₯Ό `sudo PINGCLAIR_TLS_STORE=/var/lib/pingclair/.local/share/pingclair pingclair trust`둜 μ„€μΉ˜ν•˜μ‹­μ‹œμ˜€. ## 🧭 λ‹€μŒ 단계 - [μ„€μΉ˜](/ko/start/install/): 이 νŽ˜μ΄μ§€κ°€ λ‚¨κΈ°κ±°λ‚˜ μ§€μš°λŠ” 배치. - [μ„œλΉ„μŠ€λ‘œ μ‹€ν–‰](/ko/start/service/): μ—…κ·Έλ ˆμ΄λ“œκ°€ λ‹€μ‹œ μ“°λŠ” μœ λ‹›. - [ν”„λ‘œμ νŠΈ μƒνƒœ](/ko/project/status/): ν˜„μž¬ λ¦΄λ¦¬μŠ€κ°€ 무엇을 μ§€μ›ν•˜κ³  무엇을 κ±°λΆ€ν•˜λŠ”μ§€.