commit 9684a2d49f002965d745d312205141c2a7e4f747 Author: khaliiiiiil Date: Wed Nov 27 09:12:43 2024 +0100 Commit with the entrypoint_Dockerfile solution and the odoo connectivity diff --git a/.env b/.env new file mode 100644 index 0000000..31d8b37 --- /dev/null +++ b/.env @@ -0,0 +1,5 @@ +POSTGRES_PASSWORD=openpgpwd +POSTGRES_USER=openpg +POSTGRES_DB=pulumi +ODOO_PASSWORD=admin +GRAFANA_PASSWORD=grafana_pwd diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a3807e5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.pyc +venv/ diff --git a/Pulumi.yaml b/Pulumi.yaml new file mode 100644 index 0000000..fed8d2a --- /dev/null +++ b/Pulumi.yaml @@ -0,0 +1,11 @@ +name: last_version_test_1 +description: A minimal OpenStack Python Pulumi program +runtime: + name: python + options: + toolchain: pip + virtualenv: venv +config: + pulumi:tags: + value: + pulumi:template: openstack-python diff --git a/__main__.py b/__main__.py new file mode 100644 index 0000000..fb75224 --- /dev/null +++ b/__main__.py @@ -0,0 +1,81 @@ +import pulumi +import pulumi_docker as docker +import json +import os + +# Load the JSON configuration file +try: + with open("config.json", "r") as f: + containers_data = json.load(f) +except FileNotFoundError: + raise Exception("Error: 'config.json' file not found.") + +# Create the network +try: + network = docker.Network("testNetwork") + +except Exception as e: + pulumi.log.error(f"Failed to create network: {e}") + network = None + +# Create containers +for container in containers_data.get("containers", []): + instances = container.get("instances", 1) + for i in range(instances): + container_name = f"{container['name']}-{i}" if instances > 1 else container["name"] + + # Configure volumes + volumes = {} + for volume in container.get("volumes", []): + try: + if "volume_name" in volume and volume["volume_name"] not in volumes: + volumes[volume["volume_name"]] = docker.Volume(volume["volume_name"]) + except Exception as e: + pulumi.log.error(f"Failed to create volume {volume.get('volume_name')}: {e}") + volumes_config = [] + try: + if "volumes" in container: + volumes_config = [ + docker.ContainerVolumeArgs( + container_path=volume["container_path"], + volume_name=volumes[volume["volume_name"]].name + ) if "volume_name" in volume else + docker.ContainerVolumeArgs( + container_path=volume["container_path"], + host_path=os.path.abspath(volume["host_path"]) + ) + for volume in container["volumes"] + ] + except KeyError as e: + 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}") + + # Create the container + try: + container_resource = docker.Container( + container_name, + image=container["image"], + hostname=container_name, + envs=[ + f"{key}={value}" for key, value in container.get("envs", {}).items() + ] if "envs" in container else [], + ports=[ + docker.ContainerPortArgs( + internal=port["internal"], + external=port["external"] + i + ) for port in container.get("ports", []) + ] if "ports" in container else [], + volumes=volumes_config, + network_mode=network.name if network else None, + ) + 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: + pulumi.log.error(f"Failed to create container {container_name}: {e}") diff --git a/backup.Dockerfile b/backup.Dockerfile new file mode 100644 index 0000000..80d895d --- /dev/null +++ b/backup.Dockerfile @@ -0,0 +1,14 @@ +# Use the Alpine image as the base +FROM alpine:latest as backup_custom + +# Copy the entrypoint script into the container +COPY entrypoint_backup.sh /usr/local/bin/entrypoint_backup.sh + +# Switch to root user for setup +USER root + +# Make the entrypoint script executable +RUN chmod +x /usr/local/bin/entrypoint_backup.sh + +# Set the new entrypoint +ENTRYPOINT ["/usr/local/bin/entrypoint_backup.sh"] diff --git a/config.json b/config.json new file mode 100644 index 0000000..71ea9fc --- /dev/null +++ b/config.json @@ -0,0 +1,98 @@ +{ + "containers": [ + { + "name": "admin", + "image": "postgres:latest", + "envs": { + "POSTGRES_DB": "admin", + "POSTGRES_USER": "admin", + "POSTGRES_PASSWORD": "admin" + }, + "network_mode": "testNetwork", + "ports": [{"internal": 5432, "external": 5432}], + "volumes": [ + { + "container_path": "/var/lib/postgresql/data", + "volume_name": "postgres-data" + } + ] + }, + { + "name": "odoo", + "image": "odoo_custom", + "envs": { + "HOST": "admin", + "USER": "admin", + "PASSWORD": "admin", + "DATABASE": "admin", + "ODOO_PASSWORD": "admin" + }, + "network_mode": "testNetwork", + "ports": [{"internal": 8069, "external": 8069}], + "instances": 3, + "volumes": [ + { + "host_path": "./odoo.conf", + "container_path": "/etc/odoo/odoo.conf" + } + ] + }, + { + "name": "grafana", + "image": "grafana/grafana:latest", + "envs": { + "GF_SECURITY_ADMIN_PASSWORD": "grafana_pwd", + "GF_DATASOURCES_PROMETHEUS_URL": "http://prometheus:9090" + }, + "network_mode": "testNetwork", + "ports": [{"internal": 3000, "external": 3000}], + "instances": 2 + }, + { + "name": "prometheus", + "image": "prom/prometheus:latest", + "network_mode": "testNetwork", + "ports": [{"internal": 9090, "external": 9090}], + "volumes": [ + { + "container_path": "/prometheus", + "volume_name": "prometheus-data" + }, + { + "container_path": "/etc/prometheus/prometheus.yml", + "host_path": "./prometheus.yml" + } + ] + }, + { + "name": "fluentd", + "image": "fluent/fluentd:v1.13-1", + "network_mode": "testNetwork", + "ports": [{"internal": 24224, "external": 24224}], + "volumes": [ + { + "container_path": "/fluentd/etc/fluent.conf", + "host_path": "./fluent.conf" + } + ] + }, + { + "name": "backup", + "image": "backup_custom", + "envs": { + "POSTGRES_HOST": "admin", + "POSTGRES_DB": "admin", + "POSTGRES_USER": "admin", + "POSTGRES_PASSWORD": "admin" + }, + "network_mode": "testNetwork", + "volumes": [ + { + "container_path": "/backup", + "volume_name": "backup-data" + } + ] + } + ] + } + \ No newline at end of file diff --git a/entrypoint_backup.sh b/entrypoint_backup.sh new file mode 100644 index 0000000..6ee9b8f --- /dev/null +++ b/entrypoint_backup.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +# Install PostgreSQL client +apk add --no-cache postgresql-client + +# Wait until the PostgreSQL server is ready +until pg_isready -h admin -U admin; do + echo "Waiting for PostgreSQL..." + sleep 2 +done + diff --git a/entrypoint_odoo.sh b/entrypoint_odoo.sh new file mode 100644 index 0000000..fec612d --- /dev/null +++ b/entrypoint_odoo.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +odoo -i base diff --git a/fluent.conf b/fluent.conf new file mode 100644 index 0000000..39b2e17 --- /dev/null +++ b/fluent.conf @@ -0,0 +1,14 @@ + + @type forward + port 8069 # Odoo logs + + + + @type forward + port 3000 # Grafana logs + + + + @type file + path /fluentd/logs/collected-logs + diff --git a/odoo.Dockerfile b/odoo.Dockerfile new file mode 100644 index 0000000..a50af7d --- /dev/null +++ b/odoo.Dockerfile @@ -0,0 +1,13 @@ +# Use the existing Odoo image as the base +FROM odoo:latest as odoo-custom + +# Copy the entrypoint script into the container +COPY entrypoint_odoo.sh /usr/local/bin/entrypoint_odoo.sh + +USER root + +# Make the entrypoint script executable +RUN chmod +x /usr/local/bin/entrypoint_odoo.sh + +# Set the new entrypoint +ENTRYPOINT ["/usr/local/bin/entrypoint_odoo.sh"] diff --git a/odoo.conf b/odoo.conf new file mode 100644 index 0000000..12ad7b5 --- /dev/null +++ b/odoo.conf @@ -0,0 +1,7 @@ +[options] +db_host = admin +db_port = 5432 +db_user = admin +db_password = admin +default_productivity_apps = True +db_name = false diff --git a/prometheus.yml b/prometheus.yml new file mode 100644 index 0000000..c420029 --- /dev/null +++ b/prometheus.yml @@ -0,0 +1,15 @@ +global: + scrape_interval: 15s # How often to scrape metrics (every 15 seconds) + +scrape_configs: + - job_name: 'postgres' # For scraping PostgreSQL + static_configs: + - targets: ['postgres:5432'] + + - job_name: 'odoo' # For scraping Odoo + static_configs: + - targets: ['odoo:8069'] + + - job_name: 'grafana' # For scraping Grafana + static_configs: + - targets: ['grafana:3000'] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..6d7c490 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pulumi>=3.0.0,<4.0.0 +pulumi-openstack>=3.0.0,<4.0.0