ꡬ성

ꡬ성

SSH-FrontiΓ¨reλŠ” TOML νŒŒμΌμ„ μ‚¬μš©ν•˜μ—¬ 도메인, μ•‘μ…˜, μ ‘κ·Ό μˆ˜μ€€, 인자 및 인증 토큰을 μ„ μ–Έν•©λ‹ˆλ‹€.

μœ„μΉ˜

기본 경둜: /etc/ssh-frontiere/config.toml

μž¬μ •μ˜ (μš°μ„ μˆœμœ„ 순):

  1. authorized_keys의 command= 쀄에 μžˆλŠ” --config <path>
  2. ν™˜κ²½ λ³€μˆ˜ SSH_FRONTIERE_CONFIG
  3. 기본 경둜

ꢌμž₯ κΆŒν•œ: root:forge-runner 640 (μ‚¬μš©ν•˜λŠ” μ„œλΉ„μŠ€ 계정에 맞게 그룹을 μ‘°μ •ν•˜μ„Έμš”).

파일 ꡬ쑰

[global]                              # 일반 μ„€μ •
[domains.<id>]                        # κΈ°λŠ₯ 도메인
  [domains.<id>.actions.<id>]         # ν—ˆκ°€λœ μ•‘μ…˜
    [domains.<id>.actions.<id>.args]  # λͺ…λͺ…λœ 인자 (선택사항)
[auth]                                # RBAC 인증 (선택사항)
  [auth.tokens.<id>]                  # μ‹œν¬λ¦Ώ, μˆ˜μ€€ 및 νƒœκ·Έλ₯Ό κ°€μ§„ 토큰

[global] μ„Ήμ…˜

ν‚€μœ ν˜•κΈ°λ³Έκ°’μ„€λͺ…
log_filestringν•„μˆ˜JSON 둜그 파일 경둜
default_timeoutμ •μˆ˜300κΈ°λ³Έ νƒ€μž„μ•„μ›ƒ(초)
max_stdout_charsμ •μˆ˜65536stdout μ œν•œ (64 Ko)
max_stderr_charsμ •μˆ˜16384stderr μ œν•œ (16 Ko)
max_output_charsμ •μˆ˜131072전체 ν•˜λ“œ 리밋 (128 Ko)
max_stream_bytesμ •μˆ˜10485760슀트리밍 λ³Όλ₯¨ μ œν•œ (10 Mo)
timeout_sessionμ •μˆ˜3600μ„Έμ…˜ keepalive νƒ€μž„μ•„μ›ƒ
max_auth_failuresμ •μˆ˜3잠금 μ „ 인증 μ‹œλ„ 횟수
ban_commandstring""IP 차단 λͺ…λ Ή (ν”Œλ ˆμ΄μŠ€ν™€λ” {ip})
log_commentsboolfalseν΄λΌμ΄μ–ΈνŠΈμ˜ # 쀄을 기둝
expose_session_idboolfalseλ°°λ„ˆμ— μ„Έμ…˜ UUID ν‘œμ‹œ

log_level, default_level, mask_sensitive ν‚€λŠ” 이전 κ΅¬μ„±κ³Όμ˜ ν˜Έν™˜μ„±μ„ μœ„ν•΄ νŒŒμ„œμ—μ„œ μˆ˜μš©ν•˜μ§€λ§Œ, 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

[domains] μ„Ήμ…˜

도메인은 κΈ°λŠ₯적 μ˜μ—­(예: forgejo, infra, notify)μž…λ‹ˆλ‹€. 각 도메인은 ν—ˆκ°€λœ μ•‘μ…˜μ„ ν¬ν•¨ν•©λ‹ˆλ‹€.

[domains.forgejo]
description = "Forge Git infrastructure"

[domains.forgejo.actions.backup-config]
description = "Sauvegarde la configuration"
level = "ops"
timeout = 600
execute = "sudo /usr/local/bin/backup-config.sh {domain}"
max_body_size = 65536       # body μ œν•œ (64 Ko, 선택사항)

각 μ•‘μ…˜μ€ λ‹€μŒ ν‚€λ₯Ό λ°›μŠ΅λ‹ˆλ‹€: description (ν•„μˆ˜), level (ν•„μˆ˜), execute (ν•„μˆ˜), timeout (선택사항, μ „μ—­ μ„€μ • μž¬μ •μ˜), tags (선택사항), max_body_size (선택사항, κΈ°λ³Έκ°’ 65536λ°”μ΄νŠΈ β€” +body ν”„λ‘œν† μ½œμš© μ œν•œ).

μ‹ λ’° μˆ˜μ€€

μ—„κ²©ν•œ 계측 ꡬ쑰: read < ops < admin

μˆ˜μ€€μš©λ„
read쑰회: healthcheck, status, list
ops일반 운영: backup, deploy, restart
adminλͺ¨λ“  μ•‘μ…˜ + 관리

인자

μΈμžλŠ” TOML λ”•μ…”λ„ˆλ¦¬λ‘œ μ„ μ–Έλ©λ‹ˆλ‹€:

[domains.forgejo.actions.deploy.args]
tag = { type = "enum", values = ["latest", "stable", "canary"], default = "latest" }
ν•„λ“œμœ ν˜•μ„€λͺ…
typestring"enum" λ˜λŠ” "string"
valuesλ¦¬μŠ€νŠΈν—ˆμš©λœ κ°’ (enum용)
defaultstringκΈ°λ³Έκ°’ (인자λ₯Ό μ„ νƒμ‚¬ν•­μœΌλ‘œ λ§Œλ“¦)
sensitivebooltrue이면 λ‘œκ·Έμ—μ„œ λ§ˆμŠ€ν‚Ή
freebooltrue이면 μ œμ•½ 없이 λͺ¨λ“  κ°’ ν—ˆμš©

execute의 ν”Œλ ˆμ΄μŠ€ν™€λ”

ν”Œλ ˆμ΄μŠ€ν™€λ”μ„€λͺ…
{domain}도메인 이름 (항상 μ‚¬μš© κ°€λŠ₯)
{인자λͺ…}ν•΄λ‹Ή 인자의 κ°’

κ°€μ‹œμ„± νƒœκ·Έ

νƒœκ·ΈλŠ” μ•‘μ…˜ 접근을 μˆ˜ν‰μ μœΌλ‘œ ν•„ν„°λ§ν•©λ‹ˆλ‹€. νƒœκ·Έκ°€ μ—†λŠ” μ•‘μ…˜μ€ λͺ¨λ‘μ—κ²Œ μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€. νƒœκ·Έκ°€ μžˆλŠ” μ•‘μ…˜μ€ ν•˜λ‚˜ μ΄μƒμ˜ 곡톡 νƒœκ·Έλ₯Ό κ°€μ§„ ID만 μ ‘κ·Ό κ°€λŠ₯ν•©λ‹ˆλ‹€.

[domains.forgejo.actions.deploy]
# ...
tags = ["forgejo", "deploy"]

[auth] μ„Ήμ…˜ (선택사항)

RBAC 인증은 μ±Œλ¦°μ§€-응닡을 ν†΅ν•œ κΆŒν•œ μƒμŠΉμ„ κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€:

[auth]
challenge_nonce = false              # true = μž¬μ‚¬μš© λ°©μ§€ λ…ΌμŠ€ λͺ¨λ“œ

[auth.tokens.runner-ci]
secret = "b64:c2VjcmV0LXJ1bm5lci1jaQ=="   # base64 μΈμ½”λ”©λœ μ‹œν¬λ¦Ώ
level = "ops"                               # λΆ€μ—¬λ˜λŠ” μˆ˜μ€€
tags = ["forgejo"]                          # κ°€μ‹œμ„± νƒœκ·Έ

μ‹œν¬λ¦Ώμ€ b64: 접두사가 λΆ™κ³  base64둜 μΈμ½”λ”©λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. μ‹œν¬λ¦Ώμ„ μƒμ„±ν•˜λ €λ©΄:

echo -n "mon-secret-aleatoire" | base64
# bW9uLXNlY3JldC1hbGVhdG9pcmU=

λ‘œλ“œ μ‹œ 검증

ꡬ성은 맀번 λ‘œλ“œν•  λ•Œλ§ˆλ‹€ μ™„μ „νžˆ κ²€μ¦λ©λ‹ˆλ‹€(fail-fast). 였λ₯˜ μ‹œ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œ μ½”λ“œ 129둜 μ€‘λ‹¨λ©λ‹ˆλ‹€. 검증 ν•­λͺ©:

전체 예제

[global]
log_file = "/var/log/ssh-frontiere/commands.json"
default_timeout = 300
max_stdout_chars = 65536
max_stderr_chars = 16384
max_output_chars = 131072
timeout_session = 3600
max_auth_failures = 3

[domains.forgejo]
description = "Forge Git infrastructure"

[domains.forgejo.actions.backup-config]
description = "Forgejo ꡬ성 λ°±μ—…"
level = "ops"
timeout = 600
execute = "sudo /usr/local/bin/backup-config.sh {domain}"

[domains.forgejo.actions.deploy]
description = "버전 νƒœκ·Έλ‘œ 배포"
level = "ops"
timeout = 300
execute = "sudo /usr/local/bin/deploy.sh {domain} {tag}"

[domains.forgejo.actions.deploy.args]
tag = { type = "enum", values = ["latest", "stable", "canary"], default = "latest" }

[domains.infra]
description = "μ„œλ²„ 인프라"

[domains.infra.actions.healthcheck]
description = "μ„œλΉ„μŠ€ μƒνƒœ 점검"
level = "read"
timeout = 30
execute = "/usr/local/bin/healthcheck.sh"

[auth]
challenge_nonce = false

[auth.tokens.runner-ci]
secret = "b64:c2VjcmV0LXJ1bm5lci1jaQ=="
level = "ops"
tags = ["forgejo"]

λͺ¨λ“  μ‚¬μš© 사둀λ₯Ό ν¬ν•¨ν•œ μžμ„Έν•œ κ°€μ΄λ“œλŠ” μ €μž₯μ†Œμ˜ 전체 ꡬ성 κ°€μ΄λ“œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.


λ‹€μŒ: 배포 β€” ν”„λ‘œλ•μ…˜ 적용.