refactor: 更新项目结构和文档,移除不再使用的配置文件
- 修改README.md,更新项目特性和目录结构说明 - 重命名基础设施代码目录为tofu,并添加Docker Swarm配置目录 - 移除不再使用的Docker Compose和Traefik配置文件 - 更新Terraform配置,专注于Oracle Cloud支持,移除华为云相关配置 - 清理开发环境变量和示例文件
This commit is contained in:
41
swarm/stacks/consul-ash3c-stack.yml
Normal file
41
swarm/stacks/consul-ash3c-stack.yml
Normal file
@@ -0,0 +1,41 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
consul:
|
||||
image: consul:latest
|
||||
hostname: consul-ash3c
|
||||
command: >
|
||||
sh -c "
|
||||
IP=$$(hostname -i | awk '{print $$1}');
|
||||
consul agent -server -bootstrap-expect=2
|
||||
-datacenter=dc1 -data-dir=/consul/data
|
||||
-node=consul-ash3c -bind=$$IP -advertise=100.116.80.94 -client=0.0.0.0
|
||||
-retry-join=100.117.106.136
|
||||
-ui
|
||||
-log-level=INFO
|
||||
"
|
||||
ports:
|
||||
- "8500:8500"
|
||||
- "8600:8600/udp"
|
||||
volumes:
|
||||
- consul_data:/consul/data
|
||||
networks:
|
||||
- consul-net
|
||||
deploy:
|
||||
mode: replicated
|
||||
replicas: 1
|
||||
placement:
|
||||
constraints:
|
||||
- node.hostname == ash3c
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
delay: 5s
|
||||
max_attempts: 3
|
||||
|
||||
volumes:
|
||||
consul_data:
|
||||
|
||||
networks:
|
||||
consul-net:
|
||||
driver: overlay
|
||||
attachable: true
|
||||
76
swarm/stacks/consul-cluster-stack.yml
Normal file
76
swarm/stacks/consul-cluster-stack.yml
Normal file
@@ -0,0 +1,76 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
consul-master:
|
||||
image: consul:latest
|
||||
hostname: consul-master
|
||||
command: >
|
||||
sh -c "
|
||||
IP=$$(hostname -i | awk '{print $$1}');
|
||||
consul agent -server -bootstrap-expect=2
|
||||
-datacenter=dc1 -data-dir=/consul/data
|
||||
-node=consul-master -bind=$$IP -advertise=$$IP -client=0.0.0.0
|
||||
-ui
|
||||
-log-level=INFO
|
||||
"
|
||||
ports:
|
||||
- "8500:8500"
|
||||
- "8600:8600/udp"
|
||||
volumes:
|
||||
- consul_master_data:/consul/data
|
||||
networks:
|
||||
consul-net:
|
||||
aliases:
|
||||
- consul-master
|
||||
deploy:
|
||||
mode: replicated
|
||||
replicas: 1
|
||||
placement:
|
||||
constraints:
|
||||
- node.hostname == master
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
delay: 5s
|
||||
max_attempts: 3
|
||||
|
||||
consul-ash3c:
|
||||
image: consul:latest
|
||||
hostname: consul-ash3c
|
||||
command: >
|
||||
sh -c "
|
||||
IP=$$(hostname -i | awk '{print $$1}');
|
||||
consul agent -server -bootstrap-expect=2
|
||||
-datacenter=dc1 -data-dir=/consul/data
|
||||
-node=consul-ash3c -bind=$$IP -advertise=$$IP -client=0.0.0.0
|
||||
-retry-join=consul-cluster_consul-master
|
||||
-ui
|
||||
-log-level=INFO
|
||||
"
|
||||
ports:
|
||||
- "8501:8500"
|
||||
- "8601:8600/udp"
|
||||
volumes:
|
||||
- consul_ash3c_data:/consul/data
|
||||
networks:
|
||||
consul-net:
|
||||
aliases:
|
||||
- consul-ash3c
|
||||
deploy:
|
||||
mode: replicated
|
||||
replicas: 1
|
||||
placement:
|
||||
constraints:
|
||||
- node.hostname == ash3c
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
delay: 5s
|
||||
max_attempts: 3
|
||||
|
||||
volumes:
|
||||
consul_master_data:
|
||||
consul_ash3c_data:
|
||||
|
||||
networks:
|
||||
consul-net:
|
||||
driver: overlay
|
||||
attachable: true
|
||||
40
swarm/stacks/consul-master-stack.yml
Normal file
40
swarm/stacks/consul-master-stack.yml
Normal file
@@ -0,0 +1,40 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
consul:
|
||||
image: consul:latest
|
||||
hostname: consul-master
|
||||
command: >
|
||||
sh -c "
|
||||
IP=$$(hostname -i | awk '{print $$1}');
|
||||
consul agent -server -bootstrap-expect=2
|
||||
-datacenter=dc1 -data-dir=/consul/data
|
||||
-node=consul-master -bind=$$IP -advertise=100.117.106.136 -client=0.0.0.0
|
||||
-ui
|
||||
-log-level=INFO
|
||||
"
|
||||
ports:
|
||||
- "8500:8500"
|
||||
- "8600:8600/udp"
|
||||
volumes:
|
||||
- consul_data:/consul/data
|
||||
networks:
|
||||
- consul-net
|
||||
deploy:
|
||||
mode: replicated
|
||||
replicas: 1
|
||||
placement:
|
||||
constraints:
|
||||
- node.hostname == master
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
delay: 5s
|
||||
max_attempts: 3
|
||||
|
||||
volumes:
|
||||
consul_data:
|
||||
|
||||
networks:
|
||||
consul-net:
|
||||
driver: overlay
|
||||
attachable: true
|
||||
39
swarm/stacks/consul-simple-stack.yml
Normal file
39
swarm/stacks/consul-simple-stack.yml
Normal file
@@ -0,0 +1,39 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
consul:
|
||||
image: consul:latest
|
||||
hostname: consul
|
||||
command: >
|
||||
consul agent -server -bootstrap-expect=1
|
||||
-datacenter=dc1 -data-dir=/consul/data
|
||||
-node=consul -client=0.0.0.0
|
||||
-ui
|
||||
-log-level=INFO
|
||||
ports:
|
||||
- "8500:8500"
|
||||
- "8600:8600/udp"
|
||||
volumes:
|
||||
- consul_data:/consul/data
|
||||
networks:
|
||||
- consul-net
|
||||
deploy:
|
||||
mode: replicated
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
delay: 5s
|
||||
max_attempts: 3
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.consul.rule=Host(`consul.local`)"
|
||||
- "traefik.http.services.consul.loadbalancer.server.port=8500"
|
||||
- "traefik.docker.network=consul-net"
|
||||
|
||||
volumes:
|
||||
consul_data:
|
||||
|
||||
networks:
|
||||
consul-net:
|
||||
driver: overlay
|
||||
attachable: true
|
||||
166
swarm/stacks/demo-services-stack.yml
Normal file
166
swarm/stacks/demo-services-stack.yml
Normal file
@@ -0,0 +1,166 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
# Web 应用示例
|
||||
webapp:
|
||||
image: nginx:alpine
|
||||
networks:
|
||||
- traefik-public
|
||||
configs:
|
||||
- source: webapp-html
|
||||
target: /usr/share/nginx/html/index.html
|
||||
deploy:
|
||||
replicas: 2
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.http.routers.webapp.rule=Host(`app.local`)
|
||||
- traefik.http.routers.webapp.entrypoints=web
|
||||
- traefik.http.services.webapp.loadbalancer.server.port=80
|
||||
update_config:
|
||||
parallelism: 1
|
||||
delay: 10s
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
|
||||
# API 服务示例
|
||||
api:
|
||||
image: httpd:alpine
|
||||
networks:
|
||||
- traefik-public
|
||||
configs:
|
||||
- source: api-html
|
||||
target: /usr/local/apache2/htdocs/index.html
|
||||
deploy:
|
||||
replicas: 2
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.http.routers.api.rule=Host(`api.local`)
|
||||
- traefik.http.routers.api.entrypoints=web
|
||||
- traefik.http.services.api.loadbalancer.server.port=80
|
||||
# 添加路径前缀
|
||||
- traefik.http.routers.api-path.rule=Host(`app.local`) && PathPrefix(`/api`)
|
||||
- traefik.http.routers.api-path.entrypoints=web
|
||||
- traefik.http.routers.api-path.service=api
|
||||
update_config:
|
||||
parallelism: 1
|
||||
delay: 10s
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
|
||||
# 监控服务示例
|
||||
monitor:
|
||||
image: nginx:alpine
|
||||
networks:
|
||||
- traefik-public
|
||||
configs:
|
||||
- source: monitor-html
|
||||
target: /usr/share/nginx/html/index.html
|
||||
deploy:
|
||||
replicas: 1
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.http.routers.monitor.rule=Host(`monitor.local`)
|
||||
- traefik.http.routers.monitor.entrypoints=web
|
||||
- traefik.http.services.monitor.loadbalancer.server.port=80
|
||||
# 添加基本认证 (可选)
|
||||
- traefik.http.routers.monitor.middlewares=auth
|
||||
- traefik.http.middlewares.auth.basicauth.users=admin:$$2y$$10$$DLKjKQKQKQKQKQKQKQKQKe
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
|
||||
networks:
|
||||
traefik-public:
|
||||
external: true
|
||||
|
||||
configs:
|
||||
webapp-html:
|
||||
content: |
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Web App - Traefik Swarm Demo</title>
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; margin: 40px; background: #f5f5f5; }
|
||||
.container { background: white; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
|
||||
h1 { color: #2c3e50; }
|
||||
.info { background: #e8f4fd; padding: 15px; border-radius: 4px; margin: 20px 0; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>🚀 Web Application</h1>
|
||||
<div class="info">
|
||||
<p><strong>服务:</strong> webapp</p>
|
||||
<p><strong>访问地址:</strong> http://app.local</p>
|
||||
<p><strong>负载均衡:</strong> Traefik + Docker Swarm</p>
|
||||
<p><strong>时间:</strong> <span id="time"></span></p>
|
||||
</div>
|
||||
<p>这是通过 Traefik 路由的 Web 应用示例。</p>
|
||||
</div>
|
||||
<script>
|
||||
document.getElementById('time').textContent = new Date().toLocaleString();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
api-html:
|
||||
content: |
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>API Service - Traefik Swarm Demo</title>
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; margin: 40px; background: #f5f5f5; }
|
||||
.container { background: white; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
|
||||
h1 { color: #27ae60; }
|
||||
.info { background: #e8f8f5; padding: 15px; border-radius: 4px; margin: 20px 0; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>🔌 API Service</h1>
|
||||
<div class="info">
|
||||
<p><strong>服务:</strong> api</p>
|
||||
<p><strong>访问地址:</strong> http://api.local</p>
|
||||
<p><strong>路径路由:</strong> http://app.local/api</p>
|
||||
<p><strong>负载均衡:</strong> Traefik + Docker Swarm</p>
|
||||
<p><strong>时间:</strong> <span id="time"></span></p>
|
||||
</div>
|
||||
<p>这是通过 Traefik 路由的 API 服务示例。</p>
|
||||
</div>
|
||||
<script>
|
||||
document.getElementById('time').textContent = new Date().toLocaleString();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
monitor-html:
|
||||
content: |
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Monitor Service - Traefik Swarm Demo</title>
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; margin: 40px; background: #f5f5f5; }
|
||||
.container { background: white; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
|
||||
h1 { color: #e74c3c; }
|
||||
.info { background: #fdf2e9; padding: 15px; border-radius: 4px; margin: 20px 0; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>📊 Monitor Service</h1>
|
||||
<div class="info">
|
||||
<p><strong>服务:</strong> monitor</p>
|
||||
<p><strong>访问地址:</strong> http://monitor.local</p>
|
||||
<p><strong>认证:</strong> 基本认证保护</p>
|
||||
<p><strong>负载均衡:</strong> Traefik + Docker Swarm</p>
|
||||
<p><strong>时间:</strong> <span id="time"></span></p>
|
||||
</div>
|
||||
<p>这是通过 Traefik 路由的监控服务示例。</p>
|
||||
</div>
|
||||
<script>
|
||||
document.getElementById('time').textContent = new Date().toLocaleString();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
70
swarm/stacks/traefik-swarm-stack.yml
Normal file
70
swarm/stacks/traefik-swarm-stack.yml
Normal file
@@ -0,0 +1,70 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
traefik:
|
||||
image: traefik:v3.0
|
||||
command:
|
||||
# API 和 Dashboard
|
||||
- --api.dashboard=true
|
||||
- --api.insecure=true
|
||||
|
||||
# 入口点
|
||||
- --entrypoints.web.address=:80
|
||||
- --entrypoints.websecure.address=:443
|
||||
|
||||
# Docker Swarm Provider
|
||||
- --providers.swarm=true
|
||||
- --providers.swarm.endpoint=unix:///var/run/docker.sock
|
||||
- --providers.swarm.exposedByDefault=false
|
||||
- --providers.swarm.network=traefik-public
|
||||
|
||||
# 日志
|
||||
- --log.level=INFO
|
||||
- --accesslog=true
|
||||
|
||||
# 指标
|
||||
- --metrics.prometheus=true
|
||||
- --metrics.prometheus.addEntryPointsLabels=true
|
||||
- --metrics.prometheus.addServicesLabels=true
|
||||
|
||||
# 证书解析器 (可选)
|
||||
- --certificatesresolvers.letsencrypt.acme.httpchallenge=true
|
||||
- --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web
|
||||
- --certificatesresolvers.letsencrypt.acme.email=admin@example.com
|
||||
- --certificatesresolvers.letsencrypt.acme.storage=/certificates/acme.json
|
||||
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
- "8080:8080" # Dashboard
|
||||
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
- traefik-certificates:/certificates
|
||||
|
||||
networks:
|
||||
- traefik-public
|
||||
|
||||
deploy:
|
||||
mode: global
|
||||
placement:
|
||||
constraints:
|
||||
- node.role == manager
|
||||
labels:
|
||||
# Traefik Dashboard 路由
|
||||
- traefik.enable=true
|
||||
- traefik.http.routers.traefik-dashboard.rule=Host(`traefik.local`)
|
||||
- traefik.http.routers.traefik-dashboard.service=api@internal
|
||||
- traefik.http.services.traefik-dashboard.loadbalancer.server.port=8080
|
||||
update_config:
|
||||
parallelism: 1
|
||||
delay: 10s
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
|
||||
networks:
|
||||
traefik-public:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
traefik-certificates:
|
||||
Reference in New Issue
Block a user