μ΄ μλ²λ Proxy Tier μ λ΅μ ν΅ν΄ 보μκ³Ό μ κ·Όμ±μ λΆλ¦¬ν©λλ€.
graph TD
%% External Access
User((User)) -->|HTTPS/443| CF[Cloudflare Proxy]
Dev((Developer)) -->|VPN/SSH| Tailscale[Tailscale Network]
%% Gateway Layer
CF -->|TLS Encrypted| Traefik[Traefik Gateway]
Tailscale -.->|Admin Access| Server[Ubuntu Server]
%% Docker Networks
subgraph Docker Host [Home Server]
direction TB
subgraph Gateway Net [jongmin-net]
Traefik
Homepage[Homepage Dashboard]
Portainer[Portainer]
WebApp[App Frontend]
end
subgraph Internal Net [Isolated Networks]
DB[(Database)]
Redis[(Cache)]
Worker[Background Worker]
end
%% Connections
Traefik -->|Routing| Homepage
Traefik -->|Routing| Portainer
Traefik -->|Routing| WebApp
WebApp <-->|Private| DB
WebApp <-->|Private| Redis
end
%% Security
Traefik -.->|Auth Check| BasicAuth[Global Basic Auth]
.
βββ ansible.cfg # Ansible μ€μ
βββ inventory/
β βββ hosts.yml # μλ² μ μ μ 보
β βββ group_vars/all/
β βββ vars # κ³΅κ° λ³μ
β βββ vault # λ―Όκ° μ 보 (Vault μνΈν)
βββ playbooks/ # λ©μΈ λ°°ν¬ μ€ν¬λ¦½νΈ (site.yml)
βββ roles/ # Ansible Roles (Core Infra)
β βββ common/
β β βββ defaults/ # κΈ°λ³Έκ° λ³μ
β β βββ tasks/ # κΈ°λ³Έ μ€μ
β βββ cpu_power_management/
β β βββ defaults/ # κΈ°λ³Έκ° λ³μ
β β βββ tasks/ # CPU λΆμ€νΈ λΉνμ±ν
β β βββ templates/ # Systemd μλΉμ€ ν
νλ¦Ώ
β β βββ handlers/ # μ¬μμ νΈλ€λ¬
β βββ docker/
β β βββ defaults/ # κΈ°λ³Έκ° λ³μ
β β βββ tasks/ # Docker Engine & Portainer
β βββ traefik/
β β βββ defaults/ # κΈ°λ³Έκ° λ³μ
β β βββ tasks/ # Gateway & SSL
β β βββ templates/ # μ€μ νμΌ ν
νλ¦Ώ
β β βββ handlers/ # μ¬μμ νΈλ€λ¬
β βββ homepage/ # Dashboard
β βββ tailscale/ # VPN
β βββ ddns/ # Dynamic DNS μ
λ°μ΄νΈ
β βββ fail2ban/ # μΉ¨μ
μ°¨λ¨ (Brute-force λ°©μ΄)
β βββ monitoring/ # Grafana / Prometheus / Loki / Tempo μ€ν
βββ docs/ # π Documentation
β βββ CD_SCRIPT_GUIDE.md # [μ€μ] μλΉμ€ λ°°ν¬ κ°μ΄λ
β βββ MONITORING_GUIDE.md # λͺ¨λν°λ§ μ€ν κ°μ΄λ
β βββ TROUBLESHOOTING.md # νΈλ¬λΈμν
λͺ¨μ
β βββ ANSIBLE_DOCKER_GUIDE.md # μΈνλΌ vs μ± κ΄λ¦¬ κΈ°μ€
β βββ ACCOUNT_AND_PERMISSION_MANAGEMENT.md # κ³μ λ° κΆν κ΄λ¦¬
β βββ TRAEFIK_GUIDE.md # κ²μ΄νΈμ¨μ΄ μμΈ μ€μ
β βββ HOMEPAGE_GUIDE.md # λμ보λ 컀μ€ν°λ§μ΄μ§
β βββ TAILSCALE_ACL_GUIDE.md # VPN μ κ·Ό μ μ΄ μ μ±
β βββ PORTAINER_GUIDE.md # 컨ν
μ΄λ GUI κ΄λ¦¬
βββ README.md # μ΄ νμΌAnsible Best Practicesλ₯Ό λ°λΌ λ³μλ₯Ό 체κ³μ μΌλ‘ κ΄λ¦¬ν©λλ€:
- κ³΅κ° λ³μ (
inventory/group_vars/all/vars): λλ©μΈ, λ€νΈμν¬ μ΄λ¦ λ± - λ―Όκ° λ³μ (
inventory/group_vars/all/vault): API ν ν°, λΉλ°λ²νΈ λ± (vault_μ λμ¬) - Role κΈ°λ³Έκ° (
roles/*/defaults/main.yml): κ° roleμ κΈ°λ³Έ μ€μ κ°
κ³΅κ° λ³μ μΆκ°:
vi inventory/group_vars/all/varsλ―Όκ° λ³μ μΆκ°:
# 1. vars νμΌμ μ°Έμ‘° μΆκ°
echo 'new_token: "{{ vault_new_token }}"' >> inventory/group_vars/all/vars
# 2. vault νμΌμ μ€μ κ° μΆκ° (μνΈνλ κ²½μ°)
ansible-vault edit inventory/group_vars/all/vault- Ubuntu 24.04 LTS
- Ansible μ€μΉ (
brew install ansible) - Git Clone & Vault μ€μ
# Vault ν
νλ¦Ώ 볡μ¬
cp inventory/group_vars/all_vault.yml.template inventory/group_vars/all/vault
# Vault νμΌ νΈμ§ (μ€μ API ν ν° λ± μ
λ ₯)
ansible-vault edit inventory/group_vars/all/vaultinventory/hosts.yml νμΌμμ νκ² μλ²μ IPλ₯Ό μμ νμΈμ.
ansible_host: 192.168.x.x # μ€μ μλ² IP μ
λ ₯μ΄μ νκ²½μμλ vault νμΌμ λ°λμ μνΈννμΈμ:
# Vault νμΌ μνΈν
ansible-vault encrypt inventory/group_vars/all/vault
# μνΈνλ νμΌ νΈμ§
ansible-vault edit inventory/group_vars/all/vault# Vault λΉλ°λ²νΈ μμ΄ μ€ν (κ°λ° νκ²½, vault νλ¬Έ)
ansible-playbook -i inventory/hosts.yml playbooks/site.yml
# Vault λΉλ°λ²νΈμ ν¨κ» μ€ν (μ΄μ νκ²½, vault μνΈν)
ansible-playbook -i inventory/hosts.yml playbooks/site.yml --ask-vault-pass
# Dry-run (λ³κ²½μ¬ν 미리 νμΈ)
ansible-playbook -i inventory/hosts.yml playbooks/site.yml --check --ask-vault-pass- μλΉμ€ λ°°ν¬ κ°μ΄λ (CD Guide): μλ‘μ΄ μλΉμ€λ₯Ό λ°°ν¬ν λ κ°μ₯ λ¨Όμ μ½μ΄μΌ ν λ¬Έμ. λ€νΈμν¬ κ΅¬μ‘°μ CD μ€ν¬λ¦½νΈ ν νλ¦Ώμ μ 곡ν©λλ€.
- Docker μ΄μ μ λ΅: Ansibleλ‘ κ΄λ¦¬νλ κ²κ³Ό Portainerλ‘ κ΄λ¦¬νλ κ²μ μ°¨μ΄λ₯Ό μ€λͺ ν©λλ€.
- Portainer κ°μ΄λ: GUIλ₯Ό μ΄μ©ν 컨ν μ΄λ λͺ¨λν°λ§ λ° μμ λ°°ν¬ λ°©λ².
- λͺ¨λν°λ§ κ°μ΄λ: Grafana / Prometheus / Loki / Tempo μ€ν μ΄μ λ° λμ보λ κ°μ΄λ.
- νΈλ¬λΈμν κ°μ΄λ: μμ£Ό λ°μνλ λ¬Έμ ν΄κ²° λ°©λ² λͺ¨μ.
μ΄ μλ²λ Traefik λ―Έλ€μ¨μ΄λ₯Ό μ¬μ©νμ¬ μλΉμ€λ³λ‘ μ κ·Ό μ μ΄λ₯Ό μνν©λλ€.
λ€μμ ν΅μ¬ μΈνλΌ μλΉμ€λ μ μ μ μ μ μΈμ¦(auth-jongmin)μ΄ νμν©λλ€.
- Homepage:
https://jongmine.cloud - Traefik Dashboard:
https://traefik.jongmine.cloud - Portainer:
https://portainer.jongmine.cloud - Glances:
https://glances.jongmine.cloud
- κ³΅κ° μλΉμ€ (API λ±): λ³λμ λ―Έλ€μ¨μ΄ μ€μ μμ΄ λ°°ν¬νλ©΄ μΈλΆμμ μμ λ‘κ² μ κ·Ό κ°λ₯ν©λλ€.
- λΉκ³΅κ° μλΉμ€: 보μμ΄ νμν κ²½μ° Docker Labelμ
traefik.http.routers.[name].middlewares=auth-jongmin@fileμ μΆκ°ν΄μΌ ν©λλ€. - μμΈ μ€μ λ°©λ²μ μλΉμ€ λ°°ν¬ κ°μ΄λλ₯Ό μ°Έκ³ νμΈμ.
| νλͺ© | κ° |
|---|---|
| CPU | AMD Ryzen 7 4700U with Radeon Graphics (8 cores) |
| λ©λͺ¨λ¦¬ | 32GB RAM |
| Swap | 4GB |
| μ€ν λ¦¬μ§ | 512GB |
| OS | Ubuntu 24.04.4 LTS |
- Traefik κ°μ΄λ: κ²μ΄νΈμ¨μ΄ μν€ν μ², μ μ μΈμ¦, λΌμ°ν μμΈ μ€μ .
- Homepage κ°μ΄λ: λμ보λ μμ ― 컀μ€ν°λ§μ΄μ§.
- Tailscale ACL κ°μ΄λ: VPN μ κ·Ό μ μ΄ μ μ± JSON κ°μ΄λ.
- κ³μ λ° κΆν κ΄λ¦¬:
sallang-deployλ± μλΉμ€ κ³μ μ μν κ³Ό Sudo κΆν μμΈ.