{"id":19586313,"url":"https://github.com/tbobm/spe-clo5","last_synced_at":"2026-05-07T02:32:11.785Z","repository":{"id":44092380,"uuid":"268804853","full_name":"tbobm/spe-clo5","owner":"tbobm","description":"School - Ansible, gitlab, monitoring and CI/CD. Production-like infrastructure with CI/CD, metrics and automated deployments","archived":false,"fork":false,"pushed_at":"2022-06-02T13:09:31.000Z","size":1200,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-02-26T12:45:27.826Z","etag":null,"topics":["ansible","docker","gitlab","gitlab-runner","monitoring","traefik"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tbobm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-06-02T13:13:26.000Z","updated_at":"2022-07-08T14:43:12.000Z","dependencies_parsed_at":"2022-08-29T03:01:26.869Z","dependency_job_id":null,"html_url":"https://github.com/tbobm/spe-clo5","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/tbobm/spe-clo5","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tbobm%2Fspe-clo5","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tbobm%2Fspe-clo5/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tbobm%2Fspe-clo5/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tbobm%2Fspe-clo5/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tbobm","download_url":"https://codeload.github.com/tbobm/spe-clo5/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tbobm%2Fspe-clo5/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32720109,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-07T02:14:30.463Z","status":"ssl_error","status_checked_at":"2026-05-07T02:14:29.405Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansible","docker","gitlab","gitlab-runner","monitoring","traefik"],"created_at":"2024-11-11T07:59:22.886Z","updated_at":"2026-05-07T02:32:11.768Z","avatar_url":"https://github.com/tbobm.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SPE-CLO5\n\nA [special note to ETNA's students](#special-note) is available at the bottom of the README.\n\n## Goal\n\nSetup a CI/CD infrastructure with the following components:\n- Gitlab\n- Gitlab-runner\n- Docker in swarm mode\n- A monitoring stack (supposedly a TICK stack, but prometheus/grafana/node\\_exporter will be our go-to)\n- Traefik\n\nThe code itself will be hosted on the private gitlab server and will trigger unit test and fonctionnal tests upon push.\nIf the code is validated, it will trigger a blue/green deployment in \"production\"\n\n## Ansible roles\n\n### Docker-related\n\n- [docker\\_swarm](./roles/docker_swarm/README.md)\n- [docker\\_registry](./roles/docker_registry/README.md)\n- [docker\\_monitoring](./roles/docker_monitoring/README.md)\n\n### Gitlab-related\n\nThe registration token is located in [gitlab.yml](./vars/gitlab.yml).\nIn order to use it in the `gitlab_runner` role, provide the flag `-e @vars/gitlab.yml` and decrypt it using the ansible-vault secret while executing the playbook.\n\n- [install\\_gitlab](./roles/install_gitlab/README.md)\n  In order to configure the users, you will need to provide a `gitlab_token` and a list of users.\n  `ansible-playbook -i inventory.yml -e @vars/users.yml gitlab.yml`\n- [gitlab\\_runner](./roles/gitlab_runner/README.md)\n\n### Utility roles\n\n- [setup\\_net\\_fs](./roles/setup_net_fs/README.md) - Install and configure GlusterFS\n- [setup\\_local\\_domain\\_name](./roles/setup_local_domain_name/README.md) - Install and configure dnsmasq\n\n## Graphs\n\n### Target technical infrastructure graph\n\nTraefik routing (shortened)\n\n[![](https://mermaid.ink/img/eyJjb2RlIjoiZ3JhcGggTFJcbiAgQVtDbGllbnRdLS0-fEhUVFAgcmVxdWVzdHwgQ3t0cmFlZmlrfVxuICBDIC0tPnx1c2VyLW1hbmFnZXIuYmV0YS5jbG81LmxvY2FsL3wgRHtzdGFnaW5nIHVzZXItbWFuYWdlcn1cbiAgc3ViZ3JhcGggc3RhZ2luZ1xuICAgIEQgLS0-fGNvbm5lY3QgdG8gY29ycmVzcG9uZGluZyBkYXRhYmFzZXxEQltzdGFnaW5nIGRiIHVzZXItbWFuYWdlcl1cbiAgICBEIC0tPnxjb250YWN0IG90aGVyIHNlcnZpY2V8U0Vbc3RhZ2luZyBlc3RhYmxpc2htZW50IG1hbmFnZXJdXG4gIGVuZFxuICBDIC0tPnx1c2VyLW1hbmFnZXIuY2xvNS5sb2NhbC98IEVbcHJvZHVjdGlvbiB1c2VyLW1hbmFnZXJdXG4gIHN1YmdyYXBoIHByb2RcbiAgICBFIC0tPnxjb25uZWN0IHRvIGNvcnJlc3BvbmRpbmcgZGF0YWJhc2V8RFBbcHJvZHVjdGlvbiBkYiB1c2VyLW1hbmFnZXJdXG4gICAgRSAtLT58Y29udGFjdCBvdGhlciBzZXJ2aWNlfFBFW3Byb2R1Y3Rpb24gZXN0YWJsaXNobWVudCBtYW5hZ2VyXVxuICBlbmRcbiAgQyAtLT58dXNlci1tYW5hZ2VyLmNsbzUubG9jYWwvYmx1ZXwgRltibHVlIHByb2R1Y3Rpb24gdXNlci1tYW5hZ2VyXVxuICBzdWJncmFwaCBwcm9kLWJsdWVcbiAgICBGIC0tPnxjb25uZWN0IHRvIGNvcnJlc3BvbmRpbmcgZGF0YWJhc2V8REJCW2JsdWUgcHJvZHVjdGlvbiBkYiB1c2VyLW1hbmFnZXJdXG4gICAgRiAtLT58Y29udGFjdCBvdGhlciBzZXJ2aWNlfEJFW2JsdWUgcHJvZHVjdGlvbiBlc3RhYmxpc2htZW50IG1hbmFnZXJdXG4gIGVuZFxuICBDIC0tPnxncmFmYW5hLmNsbzUubG9jYWx8IEdbZ3JhZmFuYV1cbiAgc3ViZ3JhcGggbW9uaXRvcmluZ1xuICAgIEcgLS0-fGNvbm5lY3QgdG8gcHJvbWV0aGV1c3xQW3Byb21ldGhldXNdXG4gICAgUCAtLT58c2NyYXBlIG5vZGVfZXhwb3J0ZXJzfE5FQVtub2RlX2V4cG9ydGVyIEFdXG4gICAgUCAtLT58c2NyYXBlIG5vZGVfZXhwb3J0ZXJzfE5FQltub2RlX2V4cG9ydGVyIEJdXG4gICAgUCAtLT58c2NyYXBlIG5vZGVfZXhwb3J0ZXJzfE5FQ1tub2RlX2V4cG9ydGVyIENdXG4gICAgUCAtLT58c2NyYXBlIGNhZHZpc29yc3xDQVtjYWR2aXNvciBBXVxuICAgIFAgLS0-fHNjcmFwZSBjYWR2aXNvcnN8Q0JbY2Fkdmlzb3IgQl1cbiAgICBQIC0tPnxzY3JhcGUgY2Fkdmlzb3JzfENDW2NhZHZpc29yIENdXG4gIGVuZFxuIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifSwidXBkYXRlRWRpdG9yIjpmYWxzZX0)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoiZ3JhcGggTFJcbiAgQVtDbGllbnRdLS0-fEhUVFAgcmVxdWVzdHwgQ3t0cmFlZmlrfVxuICBDIC0tPnx1c2VyLW1hbmFnZXIuYmV0YS5jbG81LmxvY2FsL3wgRHtzdGFnaW5nIHVzZXItbWFuYWdlcn1cbiAgc3ViZ3JhcGggc3RhZ2luZ1xuICAgIEQgLS0-fGNvbm5lY3QgdG8gY29ycmVzcG9uZGluZyBkYXRhYmFzZXxEQltzdGFnaW5nIGRiIHVzZXItbWFuYWdlcl1cbiAgICBEIC0tPnxjb250YWN0IG90aGVyIHNlcnZpY2V8U0Vbc3RhZ2luZyBlc3RhYmxpc2htZW50IG1hbmFnZXJdXG4gIGVuZFxuICBDIC0tPnx1c2VyLW1hbmFnZXIuY2xvNS5sb2NhbC98IEVbcHJvZHVjdGlvbiB1c2VyLW1hbmFnZXJdXG4gIHN1YmdyYXBoIHByb2RcbiAgICBFIC0tPnxjb25uZWN0IHRvIGNvcnJlc3BvbmRpbmcgZGF0YWJhc2V8RFBbcHJvZHVjdGlvbiBkYiB1c2VyLW1hbmFnZXJdXG4gICAgRSAtLT58Y29udGFjdCBvdGhlciBzZXJ2aWNlfFBFW3Byb2R1Y3Rpb24gZXN0YWJsaXNobWVudCBtYW5hZ2VyXVxuICBlbmRcbiAgQyAtLT58dXNlci1tYW5hZ2VyLmNsbzUubG9jYWwvYmx1ZXwgRltibHVlIHByb2R1Y3Rpb24gdXNlci1tYW5hZ2VyXVxuICBzdWJncmFwaCBwcm9kLWJsdWVcbiAgICBGIC0tPnxjb25uZWN0IHRvIGNvcnJlc3BvbmRpbmcgZGF0YWJhc2V8REJCW2JsdWUgcHJvZHVjdGlvbiBkYiB1c2VyLW1hbmFnZXJdXG4gICAgRiAtLT58Y29udGFjdCBvdGhlciBzZXJ2aWNlfEJFW2JsdWUgcHJvZHVjdGlvbiBlc3RhYmxpc2htZW50IG1hbmFnZXJdXG4gIGVuZFxuICBDIC0tPnxncmFmYW5hLmNsbzUubG9jYWx8IEdbZ3JhZmFuYV1cbiAgc3ViZ3JhcGggbW9uaXRvcmluZ1xuICAgIEcgLS0-fGNvbm5lY3QgdG8gcHJvbWV0aGV1c3xQW3Byb21ldGhldXNdXG4gICAgUCAtLT58c2NyYXBlIG5vZGVfZXhwb3J0ZXJzfE5FQVtub2RlX2V4cG9ydGVyIEFdXG4gICAgUCAtLT58c2NyYXBlIG5vZGVfZXhwb3J0ZXJzfE5FQltub2RlX2V4cG9ydGVyIEJdXG4gICAgUCAtLT58c2NyYXBlIG5vZGVfZXhwb3J0ZXJzfE5FQ1tub2RlX2V4cG9ydGVyIENdXG4gICAgUCAtLT58c2NyYXBlIGNhZHZpc29yc3xDQVtjYWR2aXNvciBBXVxuICAgIFAgLS0-fHNjcmFwZSBjYWR2aXNvcnN8Q0JbY2Fkdmlzb3IgQl1cbiAgICBQIC0tPnxzY3JhcGUgY2Fkdmlzb3JzfENDW2NhZHZpc29yIENdXG4gIGVuZFxuIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifSwidXBkYXRlRWRpdG9yIjpmYWxzZX0)\n\n\n_source:_\n```markdown\ngraph LR\n  A[Client]--\u003e|HTTP request| C{traefik}\n  C --\u003e|user-manager.beta.clo5.local/| D{staging user-manager}\n  subgraph staging D --\u003e|connect to corresponding database|DB[staging db user-manager]\n    D --\u003e|contact other service|SE[staging establishment manager]\n  end\n  C --\u003e|user-manager.clo5.local/| E[production user-manager]\n  subgraph prod\n    E --\u003e|connect to corresponding database|DP[production db user-manager]\n    E --\u003e|contact other service|PE[production establishment manager]\n  end\n  C --\u003e|user-manager.clo5.local/blue| F[blue production user-manager]\n  subgraph prod-blue\n    F --\u003e|connect to corresponding database|DBB[blue production db user-manager]\n    F --\u003e|contact other service|BE[blue production establishment manager]\n  end\n  C --\u003e|grafana.clo5.local| G[grafana]\n  subgraph monitoring\n    G --\u003e|connect to prometheus|P[prometheus]\n    P --\u003e|scrape node_exporters|NEA[node_exporter A]\n    P --\u003e|scrape node_exporters|NEB[node_exporter B]\n    P --\u003e|scrape node_exporters|NEC[node_exporter C]\n    P --\u003e|scrape cadvisors|CA[cadvisor A]\n    P --\u003e|scrape cadvisors|CB[cadvisor B]\n    P --\u003e|scrape cadvisors|CC[cadvisor C]\n  end\n```\n\n### Current technical infrastructure graph\n\nTraefik routing\n\n[![](https://mermaid.ink/img/eyJjb2RlIjoiZ3JhcGggTFJcbiAgQVtDbGllbnRdLS0-fEhUVFAgcmVxdWVzdHwgQ3t0cmFlZmlrfVxuICBDIC0tPnx1c2VyLW1hbmFnZXIuYmV0YS5jbG81LmxvY2FsL3wgRHtzdGFnaW5nIHVzZXItbWFuYWdlcn1cbiAgc3ViZ3JhcGggc3RhZ2luZ1xuICAgIEQgLS0-fGNvbm5lY3QgdG8gc2hhcmVkIGRhdGFiYXNlfERCW3N0YWdpbmcgZGJdXG4gIGVuZFxuICBDIC0tPnxncmFmYW5hLmNsbzUubG9jYWx8IEdbZ3JhZmFuYV1cbiAgc3ViZ3JhcGggbW9uaXRvcmluZ1xuICAgIEcgLS0-fGNvbm5lY3QgdG8gcHJvbWV0aGV1c3xQW3Byb21ldGhldXNdXG4gICAgUCAtLT58c2NyYXBlIG5vZGVfZXhwb3J0ZXJzfE5FQVtub2RlX2V4cG9ydGVyIEFdXG4gICAgUCAtLT58c2NyYXBlIG5vZGVfZXhwb3J0ZXJzfE5FQltub2RlX2V4cG9ydGVyIEJdXG4gICAgUCAtLT58c2NyYXBlIG5vZGVfZXhwb3J0ZXJzfE5FQ1tub2RlX2V4cG9ydGVyIENdXG4gICAgUCAtLT58c2NyYXBlIGNhZHZpc29yc3xDQVtjYWR2aXNvciBBXVxuICAgIFAgLS0-fHNjcmFwZSBjYWR2aXNvcnN8Q0JbY2Fkdmlzb3IgQl1cbiAgICBQIC0tPnxzY3JhcGUgY2Fkdmlzb3JzfENDW2NhZHZpc29yIENdXG4gICAgUCAtLT58c2NyYXBlIGdpdGxhYi1ydW5uZXJzfEdBW2dpdGxhYi1ydW5uZXIgQV1cbiAgICBQIC0tPnxzY3JhcGUgZ2l0bGFiLXJ1bm5lcnN8R0JbZ2l0bGFiLXJ1bm5lciBCXVxuICAgIFAgLS0-fHNjcmFwZSBnaXRsYWItcnVubmVyc3xHQ1tnaXRsYWItcnVubmVyIENdXG4gIGVuZFxuIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifSwidXBkYXRlRWRpdG9yIjpmYWxzZX0)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoiZ3JhcGggTFJcbiAgQVtDbGllbnRdLS0-fEhUVFAgcmVxdWVzdHwgQ3t0cmFlZmlrfVxuICBDIC0tPnx1c2VyLW1hbmFnZXIuYmV0YS5jbG81LmxvY2FsL3wgRHtzdGFnaW5nIHVzZXItbWFuYWdlcn1cbiAgc3ViZ3JhcGggc3RhZ2luZ1xuICAgIEQgLS0-fGNvbm5lY3QgdG8gc2hhcmVkIGRhdGFiYXNlfERCW3N0YWdpbmcgZGJdXG4gIGVuZFxuICBDIC0tPnxncmFmYW5hLmNsbzUubG9jYWx8IEdbZ3JhZmFuYV1cbiAgc3ViZ3JhcGggbW9uaXRvcmluZ1xuICAgIEcgLS0-fGNvbm5lY3QgdG8gcHJvbWV0aGV1c3xQW3Byb21ldGhldXNdXG4gICAgUCAtLT58c2NyYXBlIG5vZGVfZXhwb3J0ZXJzfE5FQVtub2RlX2V4cG9ydGVyIEFdXG4gICAgUCAtLT58c2NyYXBlIG5vZGVfZXhwb3J0ZXJzfE5FQltub2RlX2V4cG9ydGVyIEJdXG4gICAgUCAtLT58c2NyYXBlIG5vZGVfZXhwb3J0ZXJzfE5FQ1tub2RlX2V4cG9ydGVyIENdXG4gICAgUCAtLT58c2NyYXBlIGNhZHZpc29yc3xDQVtjYWR2aXNvciBBXVxuICAgIFAgLS0-fHNjcmFwZSBjYWR2aXNvcnN8Q0JbY2Fkdmlzb3IgQl1cbiAgICBQIC0tPnxzY3JhcGUgY2Fkdmlzb3JzfENDW2NhZHZpc29yIENdXG4gICAgUCAtLT58c2NyYXBlIGdpdGxhYi1ydW5uZXJzfEdBW2dpdGxhYi1ydW5uZXIgQV1cbiAgICBQIC0tPnxzY3JhcGUgZ2l0bGFiLXJ1bm5lcnN8R0JbZ2l0bGFiLXJ1bm5lciBCXVxuICAgIFAgLS0-fHNjcmFwZSBnaXRsYWItcnVubmVyc3xHQ1tnaXRsYWItcnVubmVyIENdXG4gIGVuZFxuIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifSwidXBkYXRlRWRpdG9yIjpmYWxzZX0)\n\n_source:_\n```markdown\ngraph LR\n  A[Client]--\u003e|HTTP request| C{traefik}\n  C --\u003e|user-manager.beta.clo5.local/| D{staging user-manager}\n  subgraph staging\n    D --\u003e|connect to shared database|DB[staging db]\n  end\n  C --\u003e|grafana.clo5.local| G[grafana]\n  subgraph monitoring\n    G --\u003e|connect to prometheus|P[prometheus]\n    P --\u003e|scrape node_exporters|NEA[node_exporter A]\n    P --\u003e|scrape node_exporters|NEB[node_exporter B]\n    P --\u003e|scrape node_exporters|NEC[node_exporter C]\n    P --\u003e|scrape cadvisors|CA[cadvisor A]\n    P --\u003e|scrape cadvisors|CB[cadvisor B]\n    P --\u003e|scrape cadvisors|CC[cadvisor C]\n    P --\u003e|scrape gitlab-runners|GA[gitlab-runner A]\n    P --\u003e|scrape gitlab-runners|GB[gitlab-runner B]\n    P --\u003e|scrape gitlab-runners|GC[gitlab-runner C]\n  end\n\n```\n\n## Special note\n\nIf you ended up finding this _public_ project, congrats and welcome !\n\nFirst of all, feel free to leave a :star: if you liked my implementation.\n\nOne tiny point to keep in mind if you're currently doing the SPE-CLO5 module: I am still a teacher at ETNA's and I might end up reviewing your project.\nThe School's staff is aware of this repository and I don't want any of you to get into trouble because you were a bit curious !\nThink twice before \"getting inspired\" by the implementation made by someone that might end up grading your work. :wink:\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftbobm%2Fspe-clo5","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftbobm%2Fspe-clo5","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftbobm%2Fspe-clo5/lists"}