second commit

This commit is contained in:
FetenDridi 2024-11-25 00:51:34 +01:00
parent 441ad8f89b
commit f84e163629
5 changed files with 185 additions and 176 deletions

View File

@ -3,102 +3,82 @@ import pulumi_docker as docker
import json import json
import os import os
# Load the configuration from JSON file # Load the JSON configuration file
try: try:
with open("config.json", "r") as f: with open("config.json", "r") as f:
containers_data = json.load(f) containers_data = json.load(f)
print("Loaded configuration from config.json successfully.") except FileNotFoundError:
except FileNotFoundError as e: raise Exception("Error: 'config.json' file not found.")
print(f"Error: {e}. The file 'config.json' was not found.")
raise
except json.JSONDecodeError as e:
print(f"Error: {e}. There was an issue parsing 'config.json'.")
raise
except Exception as e:
print(f"Unexpected error while loading config.json: {e}")
raise
# Create the Docker network # Create the network
try: try:
network = docker.Network("testNetwork") network = docker.Network("testNetwork")
print("Docker network 'testNetwork' created successfully.") pulumi.export("network", network.name)
except Exception as e: except Exception as e:
print(f"Error creating Docker network: {e}") pulumi.log.error(f"Failed to create network: {e}")
raise network = None
# Create volumes for containers # Create volumes
volumes = {} volumes = {}
for container in containers_data["containers"]: for container in containers_data.get("containers", []):
for volume in container.get("volumes", []): for volume in container.get("volumes", []):
if "volume_name" in volume and volume["volume_name"] not in volumes: try:
try: if "volume_name" in volume and volume["volume_name"] not in volumes:
volumes[volume["volume_name"]] = docker.Volume(volume["volume_name"]) volumes[volume["volume_name"]] = docker.Volume(volume["volume_name"])
print(f"Volume {volume['volume_name']} created successfully.") except Exception as e:
except Exception as e: pulumi.log.error(f"Failed to create volume {volume.get('volume_name')}: {e}")
print(f"Error creating volume {volume['volume_name']}: {e}")
raise
# Create the containers pulumi.export("volumes", {name: vol.name for name, vol in volumes.items()})
for container in containers_data["containers"]:
# Create containers
for container in containers_data.get("containers", []):
instances = container.get("instances", 1) instances = container.get("instances", 1)
for i in range(instances): for i in range(instances):
container_name = f"{container['name']}-{i}" if instances > 1 else container["name"] container_name = f"{container['name']}-{i}" if instances > 1 else container["name"]
# Configure volumes # Configure volumes
volumes_config = [] volumes_config = []
for volume in container.get("volumes", []): try:
try: if "volumes" in container:
if "volume_name" in volume: volumes_config = [
volumes_config.append(docker.ContainerVolumeArgs( docker.ContainerVolumeArgs(
container_path=volume["container_path"], container_path=volume["container_path"],
volume_name=volumes[volume["volume_name"]].name volume_name=volumes[volume["volume_name"]].name
)) ) if "volume_name" in volume else
else: docker.ContainerVolumeArgs(
volumes_config.append(docker.ContainerVolumeArgs(
container_path=volume["container_path"], container_path=volume["container_path"],
host_path=os.path.abspath(volume["host_path"]) host_path=os.path.abspath(volume["host_path"])
)) )
print(f"Volume for container {container_name} configured successfully.") for volume in container["volumes"]
except Exception as e: ]
print(f"Error configuring volume for container {container_name}: {e}") except KeyError as e:
raise pulumi.log.warn(f"Missing key in volume configuration: {e}")
except Exception as e:
pulumi.log.error(f"Error configuring volumes for container {container_name}: {e}")
# Set entrypoint script (if any)
entrypoint_script = "/entrypoint.sh" # Path where entrypoint.sh will be mounted
# Create the container # Create the container
try: try:
docker.Container( container_resource = docker.Container(
container_name, container_name,
image=container["image"], image=container["image"],
envs=[f"{key}={value}" for key, value in container.get("envs", {}).items()], envs=[f"{key}={value}" for key, value in container.get("envs", {}).items()] if "envs" in container else [],
ports=[docker.ContainerPortArgs( ports=[
internal=port["internal"], docker.ContainerPortArgs(
external=port["external"] + i internal=port["internal"],
) for port in container.get("ports", [])], external=port["external"] + i
volumes=volumes_config + [ ) for port in container.get("ports", [])
# Mount the entrypoint.sh script into the container (if it exists) ] if "ports" in container else [],
docker.ContainerVolumeArgs( volumes=volumes_config,
container_path="/entrypoint.sh", # Path inside the container network_mode=network.name if network else None,
host_path=os.path.abspath("entrypoint.sh") # Path on the host machine command=container.get("command", []),
)
] if "entrypoint.sh" in container.get("volumes", []) else [],
network_mode=network.name,
command=container.get("command", []) # Set the command from the JSON (if exists)
) )
print(f"Container {container_name} created successfully.") ports = container.get("ports", [])
if ports:
for port in ports:
external_port = port["external"] + i
pulumi.export(
f"{container_name}_url",
f"http://localhost:{external_port}"
)
except Exception as e: except Exception as e:
print(f"Error creating container {container_name}: {e}") pulumi.log.error(f"Failed to create container {container_name}: {e}")
raise
# Export the container URLs
urls = {}
for container in containers_data["containers"]:
for i in range(container.get("instances", 1)):
container_name = f"{container['name']}-{i}" if container.get("instances", 1) > 1 else container["name"]
for port in container.get("ports", []):
if "external" in port:
external_port = port["external"] + i
urls[container_name] = f"http://localhost:{external_port}"
pulumi.export("urls", urls)

View File

@ -1,110 +1,90 @@
{ {
"containers": [ "containers": [
{ {
"name": "db", "name": "db",
"image": "postgres:latest", "image": "postgres:latest",
"envs": { "envs": {
"POSTGRES_DB": "admin", "POSTGRES_DB": "admin",
"POSTGRES_USER": "admin", "POSTGRES_USER": "admin",
"POSTGRES_PASSWORD": "admin" "POSTGRES_PASSWORD": "admin"
},
"ports": [
{"internal": 5432, "external": 5432}
],
"volumes": [
{
"container_path": "/var/lib/postgresql/data",
"volume_name": "postgres-data"
}
]
}, },
{ "ports": [{"internal": 5432, "external": 5432}],
"name": "odoo-1", "volumes": [
"image": "odoo:latest", {
"envs": { "container_path": "/var/lib/postgresql/data",
"HOST": "db", "volume_name": "postgres-data"
"USER": "admin", }
"PASSWORD": "admin", ]
"DATABASE": "admin", },
"ODOO_PASSWORD": "admin" {
}, "name": "odoo",
"ports": [ "image": "odoo:latest",
{"internal": 8069, "external": 8069}, "envs": {
{"internal": 8070, "external": 8080} "HOST": "db",
], "USER": "admin",
"instances": 1, "PASSWORD": "admin",
"volumes": [ "DATABASE": "admin",
{ "ODOO_PASSWORD": "admin"
"container_path": "/entrypoint.sh",
"host_path": "entrypoint.sh"
}
]
}, },
{ "ports": [{"internal": 8069, "external": 8069}],
"name": "odoo-2", "instances": 2,
"image": "odoo:latest", "command": ["/bin/bash", "-c", "sleep 10 && /opt/odoo/odoo-bin -i base"]
"envs": { },
"HOST": "db", {
"USER": "admin", "name": "grafana",
"PASSWORD": "admin", "image": "grafana/grafana:latest",
"DATABASE": "admin", "envs": {
"ODOO_PASSWORD": "admin" "GF_SECURITY_ADMIN_PASSWORD": "grafana_pwd",
}, "GF_DATASOURCES_PROMETHEUS_URL": "http://prometheus:9090"
"ports": [
{"internal": 8069, "external": 8072},
{"internal": 8071, "external": 8081}
],
"instances": 1,
"volumes": [
{
"container_path": "/entrypoint.sh",
"host_path": "entrypoint.sh"
}
]
}, },
{ "ports": [{"internal": 3000, "external": 3000}],
"name": "grafana", "instances": 2
"image": "grafana/grafana:latest", },
"envs": { {
"GF_SECURITY_ADMIN_PASSWORD": "grafana_pwd", "name": "prometheus",
"GF_DATASOURCES_PROMETHEUS_URL": "http://prometheus:9090" "image": "prom/prometheus:latest",
"ports": [{"internal": 9090, "external": 9090}],
"volumes": [
{
"container_path": "/prometheus",
"volume_name": "prometheus-data"
}, },
"ports": [ {
{"internal": 3000, "external": 3000} "container_path": "/etc/prometheus/prometheus.yml",
], "host_path": "./prometheus.yml"
"instances": 2 }
]
},
{
"name": "fluentd",
"image": "fluent/fluentd:v1.13-1",
"ports": [{"internal": 24224, "external": 24224}],
"volumes": [
{
"container_path": "/fluentd/etc/fluent.conf",
"host_path": "./fluent.conf"
}
]
},
{
"name": "backup",
"image": "alpine:latest",
"envs": {
"POSTGRES_HOST": "db",
"POSTGRES_DB": "admin",
"POSTGRES_USER": "admin",
"POSTGRES_PASSWORD": "admin"
}, },
{ "command": [
"name": "prometheus", "/bin/sh", "-c",
"image": "prom/prometheus:latest", "apk add --no-cache postgresql-client && sleep 10"
"envs": { ],
"PROMETHEUS_STORAGE_TSDB_RETENTION": "15d" "volumes": [
}, {
"ports": [ "container_path": "/backup",
{"internal": 9090, "external": 9090} "volume_name": "backup-data"
], }
"volumes": [ ]
{ }
"container_path": "/prometheus", ]
"volume_name": "prometheus-data" }
}
]
},
{
"name": "fluentd",
"image": "fluent/fluentd:v1.13-1",
"envs": {
"FLUENTD_ARGS": "--no-supervisor"
},
"ports": [
{"internal": 24224, "external": 24224}
],
"volumes": [
{
"container_path": "/fluentd/log",
"volume_name": "fluentd-log"
}
]
}
]
}

View File

@ -1,5 +1,10 @@
#!/bin/bash #!/bin/bash
set -e set -e
sleep 10
until pg_isready -h db -U admin; do
echo "Waiting for PostgreSQL to be ready..."
sleep 10
done
odoo -i base odoo -i base
exec "$@" exec "$@"

24
fluent.conf Normal file
View File

@ -0,0 +1,24 @@
<source>
@type forward
port 24224 # Fluentd default forward port
bind 0.0.0.0
</source>
<source>
@type forward
port 8069 # Odoo logs
bind 0.0.0.0
</source>
<source>
@type forward
port 3000 # Grafana logs
bind 0.0.0.0
</source>
<match **>
@type stdout
</match>

20
prometheus.yml Normal file
View File

@ -0,0 +1,20 @@
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'postgres'
static_configs:
- targets: ['db:5432']
- job_name: 'odoo'
static_configs:
- targets: ['odoo-0:8069', 'odoo-1:8069']
- job_name: 'grafana'
static_configs:
- targets: ['grafana:3000']
- job_name: 'fluentd'
static_configs:
- targets: ['fluentd:24224']