├── traefik ├── certs │ └── .gitignore └── conf │ └── traefik.yml ├── .templatesyncignore ├── .github ├── FUNDING.yml ├── .release-please-manifest.json ├── assets │ ├── traefik.png │ ├── screenshot.png │ └── traefik-routers.png ├── CODEOWNERS ├── renovate.json ├── .markdownlint.json ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── 5-security-report.yml │ ├── 3-failing-test.yml │ ├── 4-docs-bug-report.yml │ ├── 2-feature-request.yml │ └── 1-bug-report.yml ├── workflows │ ├── shellcheck.yml │ ├── apply-labels.yml │ ├── auto-merge-release.yml │ ├── sync-from-tpl.yml │ ├── create-release.yml │ ├── e2e-macos.yml │ ├── e2e-ubuntu.yml │ └── coding-standards.yml ├── labeler.yml ├── .yamllint.yaml ├── SECURITY.md ├── .release-please-config.json ├── .commitlint.config.mjs ├── .cz.config.js └── CONTRIBUTING.md ├── goss.yaml ├── .gitignore ├── .editorconfig ├── .pre-commit-config.yaml ├── LICENSE.md ├── docker-compose.override.yaml.dist ├── mkcert.sh ├── docker-compose.yaml ├── .env.example ├── Makefile ├── CHANGELOG.md └── README.md /traefik/certs/.gitignore: -------------------------------------------------------------------------------- 1 | !.gitignore 2 | -------------------------------------------------------------------------------- /.templatesyncignore: -------------------------------------------------------------------------------- 1 | CHANGELOG.md 2 | package.json 3 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | github: wayofdev 4 | 5 | ... 6 | -------------------------------------------------------------------------------- /.github/.release-please-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | ".": "2.0.3" 3 | } 4 | -------------------------------------------------------------------------------- /goss.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | process: 4 | traefik: 5 | running: true 6 | 7 | ... 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | docker-compose.override.yaml 3 | .DS_Store 4 | .env 5 | traefik/certs/* 6 | -------------------------------------------------------------------------------- /.github/assets/traefik.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wayofdev/docker-shared-services/HEAD/.github/assets/traefik.png -------------------------------------------------------------------------------- /.github/assets/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wayofdev/docker-shared-services/HEAD/.github/assets/screenshot.png -------------------------------------------------------------------------------- /.github/assets/traefik-routers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wayofdev/docker-shared-services/HEAD/.github/assets/traefik-routers.png -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners 2 | 3 | * @lotyp 4 | -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:base", 5 | ":semanticCommitTypeAll(deps)" 6 | ], 7 | "automerge": true, 8 | "platformAutomerge": true 9 | } 10 | -------------------------------------------------------------------------------- /.github/.markdownlint.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/DavidAnson/markdownlint/main/schema/markdownlint-config-schema.json", 3 | "line-length": false, 4 | "no-inline-html": false, 5 | "first-line-h1": false, 6 | "no-duplicate-heading": false 7 | } 8 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | indent_style = space 8 | indent_size = 4 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | 17 | [Makefile] 18 | indent_style = tab 19 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | blank_issues_enabled: true 4 | 5 | contact_links: 6 | - name: Start a discussion or ask a question. 7 | url: https://github.com/wayofdev/.github/discussions 8 | about: Please ask and answer questions here. 9 | 10 | - name: Join our Discord Community 11 | url: https://discord.gg/CE3TcCC5vr 12 | about: Join our Discord community to get help, share your ideas, and chat with other developers. 13 | 14 | ... 15 | -------------------------------------------------------------------------------- /.github/workflows/shellcheck.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | on: # yamllint disable-line rule:truthy 4 | pull_request: 5 | branches: 6 | - master 7 | 8 | name: 🐞 Differential shell-check 9 | 10 | permissions: 11 | contents: read 12 | 13 | jobs: 14 | shellcheck: 15 | uses: wayofdev/gh-actions/.github/workflows/shellcheck.yml@v3.1.1 16 | with: 17 | os: ubuntu-latest 18 | severity: warning 19 | secrets: 20 | token: ${{ secrets.GITHUB_TOKEN }} 21 | 22 | ... 23 | -------------------------------------------------------------------------------- /.github/labeler.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | # this file is for the labeler workflow job 4 | # Documentation https://github.com/marketplace/actions/labeler 5 | 6 | "type: bug": 7 | - head-branch: ['^bug', '^fix', 'bug', 'fix'] 8 | 9 | "type: enhancement": 10 | - head-branch: ['^feature', '^feat', 'feature'] 11 | 12 | "type: documentation": 13 | - changed-files: 14 | - any-glob-to-any-file: ['assets/**/*', '.github/*', './*.md'] 15 | 16 | "type: maintenance": 17 | - changed-files: 18 | - any-glob-to-any-file: ['goss.yaml', '.github/workflows/*'] 19 | 20 | ... 21 | -------------------------------------------------------------------------------- /.github/workflows/apply-labels.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | # This workflow will triage pull requests and apply a label based on the 4 | # paths that are modified in the pull request. 5 | # 6 | # To use this workflow, you will need to set up a .github/labeler.yml 7 | # file with configuration. For more information, see: 8 | # https://github.com/actions/labeler/blob/master/README.md 9 | 10 | on: # yamllint disable-line rule:truthy 11 | pull_request: 12 | 13 | name: 🏷️ Add labels 14 | 15 | jobs: 16 | label: 17 | uses: wayofdev/gh-actions/.github/workflows/apply-labels.yml@v3.1.1 18 | with: 19 | os: ubuntu-latest 20 | secrets: 21 | token: ${{ secrets.GITHUB_TOKEN }} 22 | 23 | ... 24 | -------------------------------------------------------------------------------- /.github/workflows/auto-merge-release.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | # https://github.com/peter-evans/enable-pull-request-automerge 4 | 5 | on: # yamllint disable-line rule:truthy 6 | pull_request: 7 | branches: 8 | - master 9 | 10 | permissions: 11 | pull-requests: write 12 | contents: write 13 | 14 | name: 🤞 Auto merge release 15 | 16 | jobs: 17 | auto-merge: 18 | uses: wayofdev/gh-actions/.github/workflows/auto-merge-release.yml@v3.1.1 19 | with: 20 | os: ubuntu-latest 21 | pull-request-number: ${{ github.event.pull_request.number }} 22 | actor: lotyp 23 | merge-method: merge 24 | secrets: 25 | # to trigger other workflows, pass PAT token instead of GITHUB_TOKEN 26 | token: ${{ secrets.PERSONAL_GITHUB_TOKEN }} 27 | 28 | ... 29 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | repos: 4 | - repo: https://github.com/pre-commit/pre-commit-hooks 5 | rev: v4.6.0 6 | hooks: 7 | - id: trailing-whitespace 8 | - id: end-of-file-fixer 9 | - id: check-added-large-files 10 | args: ['--maxkb=600'] 11 | 12 | - repo: https://github.com/commitizen-tools/commitizen 13 | rev: v3.27.0 14 | hooks: 15 | - id: commitizen 16 | stages: 17 | - commit-msg 18 | 19 | - repo: local 20 | hooks: 21 | - id: markdownlint 22 | name: markdownlint-cli2 23 | description: Run markdownlint-cli2 on your Markdown files using the docker image 24 | language: docker_image 25 | types: [markdown] 26 | entry: 'davidanson/markdownlint-cli2-rules:latest' 27 | args: ['--config', '.github/.markdownlint.json'] 28 | 29 | ... 30 | -------------------------------------------------------------------------------- /.github/workflows/sync-from-tpl.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | on: # yamllint disable-line rule:truthy 4 | # Trigger At 00:00 on each 1st day of month 5 | schedule: 6 | - cron: "0 0 1 * *" 7 | # Manual trigger 8 | workflow_dispatch: 9 | 10 | name: ♻️ Sync changes from upstream template 11 | 12 | jobs: 13 | repo-sync: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - name: 📦 Check out the codebase 18 | uses: actions/checkout@v4.1.7 19 | with: 20 | token: ${{ secrets.WORKFLOW_TOKEN }} 21 | 22 | - name: ♻️ Sync changes from upstream template 23 | uses: AndreasAugustin/actions-template-sync@v2.2.3 24 | with: 25 | github_token: ${{ secrets.WORKFLOW_TOKEN }} 26 | source_repo_path: wayofdev/docker-shared-services 27 | upstream_branch: master 28 | pr_labels: 'type: maintenance' 29 | 30 | ... 31 | -------------------------------------------------------------------------------- /.github/workflows/create-release.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | # https://github.com/wayofdev/gh-actions/blob/master/.github/workflows/create-release.yml 4 | # https://github.com/google-github-actions/release-please-action#release-types-supported 5 | # https://github.com/googleapis/release-please/blob/main/docs/customizing.md 6 | 7 | on: # yamllint disable-line rule:truthy 8 | push: 9 | branches: 10 | - master 11 | 12 | name: 📦 Create release 13 | 14 | jobs: 15 | release: 16 | runs-on: ubuntu-latest 17 | steps: 18 | - name: 🎉 Create release 19 | uses: googleapis/release-please-action@v4.1.3 20 | id: release 21 | with: 22 | token: ${{ secrets.PERSONAL_GITHUB_TOKEN }} 23 | config-file: .github/.release-please-config.json 24 | manifest-file: .github/.release-please-manifest.json 25 | target-branch: master 26 | 27 | ... 28 | -------------------------------------------------------------------------------- /traefik/conf/traefik.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | global: 4 | sendAnonymousUsage: false 5 | 6 | providers: 7 | docker: 8 | exposedByDefault: false 9 | network: network.ss 10 | file: 11 | directory: /etc/traefik 12 | watch: true 13 | 14 | api: 15 | insecure: true 16 | 17 | serversTransport: 18 | insecureSkipVerify: true 19 | 20 | entryPoints: 21 | web: 22 | address: ':80' 23 | http: 24 | redirections: 25 | entryPoint: 26 | to: websecure 27 | scheme: https 28 | 29 | websecure: 30 | address: ':443' 31 | 32 | tls: 33 | certificates: 34 | - certFile: /etc/traefik/cert.pem 35 | keyFile: /etc/traefik/key.pem 36 | stores: 37 | default: 38 | defaultCertificate: 39 | certFile: /etc/traefik/cert.pem 40 | keyFile: /etc/traefik/key.pem 41 | 42 | ping: 43 | entryPoint: 'web' 44 | 45 | log: 46 | level: DEBUG 47 | 48 | ... 49 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2021 "lotyp, Andrij Orlenko" 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/.yamllint.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | extends: default 4 | 5 | rules: 6 | braces: 7 | # Defaults 8 | # min-spaces-inside: 0 9 | # max-spaces-inside: 0 10 | 11 | # Keep 0 min-spaces to not error on empty {} collection definitions 12 | min-spaces-inside: 0 13 | 14 | # Allow one space inside braces to improve code readability 15 | max-spaces-inside: 1 16 | 17 | brackets: 18 | # Defaults 19 | # min-spaces-inside: 0 20 | # max-spaces-inside: 0 21 | 22 | # Keep 0 min-spaces to not error on empty [] collection definitions 23 | min-spaces-inside: 0 24 | 25 | # Allow one space inside braces to improve code readability 26 | max-spaces-inside: 1 27 | 28 | colons: 29 | # Defaults 30 | # min-spaces-before: 0 31 | # max-spaces-after: 1 32 | 33 | # Allow multiple spaces after a colon to allow indentation of YAML 34 | # dictionary values 35 | max-spaces-after: -1 36 | 37 | commas: 38 | # Defaults 39 | # max-spaces-after: 1 40 | 41 | # Allow multiple spaces after a comma to allow indentation of YAML 42 | # dictionary values 43 | max-spaces-after: -1 44 | 45 | comments: 46 | require-starting-space: true 47 | min-spaces-from-content: 1 48 | 49 | line-length: disable 50 | 51 | ... 52 | -------------------------------------------------------------------------------- /docker-compose.override.yaml.dist: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | 3 | services: 4 | pgadmin: 5 | image: dpage/pgadmin4:latest 6 | container_name: pgadmin 7 | restart: on-failure 8 | environment: 9 | PGADMIN_DEFAULT_EMAIL: admin 10 | PGADMIN_DEFAULT_PASSWORD: admin 11 | labels: 12 | - traefik.enable=true 13 | - traefik.http.routers.pgadmin.rule=Host(`pg-admin${SHARED_DOMAIN_SEGMENT}.docker`) 14 | - traefik.http.routers.pgadmin.entrypoints=web 15 | - traefik.http.services.pgadmin.loadbalancer.server.port=80 16 | healthcheck: 17 | test: ["CMD", "wget", "-O", "-", "http://localhost:80/misc/ping"] 18 | 19 | selenium-chrome: 20 | image: selenium/standalone-chrome:latest 21 | container_name: selenium_chrome 22 | restart: on-failure 23 | networks: 24 | default: 25 | aliases: 26 | - ss-selenium-chrome 27 | - selenium-chrome.alias 28 | environment: 29 | SCREEN_WIDTH: 1920 30 | SCREEN_HEIGHT: 1080 31 | volumes: 32 | - /dev/shm:/dev/shm 33 | labels: 34 | - traefik.enable=true 35 | - traefik.http.routers.selenium-chrome.rule=Host(`selenium-chrome${SHARED_DOMAIN_SEGMENT}.docker`) 36 | - traefik.http.routers.selenium-chrome.entrypoints=web 37 | - traefik.http.services.selenium-chrome.loadbalancer.server.port=4444 38 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/5-security-report.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | name: ⚠️ Security Report 4 | description: Please report security issues directly through GitHub Security Advisories to ensure privacy. 5 | title: '[Security]: ' 6 | labels: ['type: bug', 'priority: high', 'type: security'] 7 | 8 | assignees: 9 | - lotyp 10 | 11 | body: 12 | - type: markdown 13 | attributes: 14 | value: > 15 | ⚠️ **Please DO NOT report security vulnerabilities here.** Instead, use the GitHub Security Advisories feature to report them privately and securely. This helps us address issues responsibly without exposing them publicly. 16 | 17 | - type: markdown 18 | attributes: 19 | value: > 20 | GitHub Advisories do not automatically notify maintainers, so by using the advisories, you help maintain confidentiality while ensuring the issue is documented and tracked properly. 21 | 22 | - type: markdown 23 | attributes: 24 | value: 'To create a new advisory, go to: [Create Security Advisory](https://github.com/wayofdev/docker-shared-services/security/advisories/new)' 25 | 26 | - type: textarea 27 | id: github-advisory-url 28 | attributes: 29 | label: Your GitHub Advisory URL 30 | description: Optionally, you can paste the URL of the GitHub Security Advisory you have created here for reference. 31 | placeholder: Paste the GitHub Security Advisory URL here... 32 | validations: 33 | required: false 34 | 35 | ... 36 | -------------------------------------------------------------------------------- /.github/workflows/e2e-macos.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | on: # yamllint disable-line rule:truthy 4 | push: 5 | branches: 6 | - 'master' 7 | pull_request: 8 | branches: 9 | - 'master' 10 | 11 | name: 🧪 End-to-end testing (macOS) 12 | 13 | jobs: 14 | build: 15 | timeout-minutes: 16 16 | runs-on: macos-13 17 | steps: 18 | - name: ‼️ Temporary succeed without check 19 | run: | 20 | echo "This is a temporary success stub." 21 | echo "Temporarily disable this job due to port 53 conflict with dnsmasq" 22 | exit 0 23 | 24 | # - name: 📦 Check out the codebase 25 | # uses: actions/checkout@v4.1.6 26 | # 27 | # - name: 🚀 Install Docker 28 | # uses: douglascamata/setup-docker-macos-action@v1-alpha.13 29 | # with: 30 | # upgrade-qemu: true 31 | # 32 | # - name: 🌎 Generate .env file 33 | # run: make env 34 | # 35 | # - name: 🏗️ Start docker-compose services 36 | # run: make up 37 | # 38 | # - name: 🧪 Test DNS Resolver with dig 39 | # run: | 40 | # if ! dig @127.0.0.1 -p 53 any-domain.docker +short; then 41 | # echo "DNS resolution failed!" 42 | # exit 1 43 | # fi 44 | # 45 | # - name: 🧪 Test DNS resolver with ping 46 | # run: | 47 | # if ! ping -c 3 any-domain.docker; then 48 | # echo "Ping test failed!" 49 | # exit 1 50 | # fi 51 | # 52 | # - name: ⚙️ Stop docker-compose services 53 | # if: always() 54 | # run: make down 55 | -------------------------------------------------------------------------------- /mkcert.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Function to check if mkcert is installed 4 | check_mkcert_installed() { 5 | if ! command -v mkcert &> /dev/null; then 6 | echo "[Error] mkcert is not installed. Please install mkcert first." 7 | exit 1 8 | fi 9 | } 10 | 11 | # Function to install mkcert CA 12 | install_mkcert_ca() { 13 | echo "[Info] Installing mkcert CA..." 14 | mkcert -install 15 | } 16 | 17 | # Function to load environment variables from .env file 18 | load_env() { 19 | if [ ! -f .env ]; then 20 | echo "[Warning] .env file not found. Please generate it using make env command!" 21 | exit 1 22 | else 23 | set -a 24 | # shellcheck disable=SC2002 25 | source <(cat .env | sed -e '/^#/d;/^\s*$/d' -e "s/'/'\\\''/g" -e "s/=\(.*\)/='\1'/g") 26 | set +a 27 | fi 28 | } 29 | 30 | # Function to display domains to be loaded 31 | display_domains() { 32 | local DOMAINS 33 | local DOMAIN 34 | 35 | DOMAINS=$(echo "$TLS_DOMAINS" | sed -e 's/^"//' -e 's/"$//') 36 | 37 | echo "[Info] Domains to load:" 38 | for DOMAIN in $DOMAINS; do 39 | echo " - ${DOMAIN}" 40 | done 41 | } 42 | 43 | # Function to generate certificates 44 | generate_certs() { 45 | local DOMAINS 46 | DOMAINS=$(echo "$TLS_DOMAINS" | sed -e 's/^"//' -e 's/"$//') 47 | # shellcheck disable=SC2086 48 | mkcert -key-file traefik/certs/key.pem -cert-file traefik/certs/cert.pem $DOMAINS 49 | } 50 | 51 | # Main script execution 52 | main() { 53 | check_mkcert_installed 54 | install_mkcert_ca 55 | load_env 56 | display_domains 57 | generate_certs 58 | } 59 | 60 | main 61 | -------------------------------------------------------------------------------- /.github/SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | Thank you for helping keep `wayofdev/docker-shared-services` and its users safe. We greatly appreciate your efforts to disclose security vulnerabilities responsibly. 4 | 5 |
6 | 7 | ## 🚨 Reporting a Vulnerability 8 | 9 | We take all security bugs in `wayofdev/docker-shared-services` seriously. Please follow the instructions below to report security vulnerabilities. 10 | 11 | ### → How to Report a Vulnerability 12 | 13 | 1. **GitHub Security Advisories**: Please report security issues directly through our GitHub Security Advisories page: [https://github.com/wayofdev/docker-shared-services/security/advisories/new](https://github.com/wayofdev/docker-shared-services/security/advisories/new). This ensures that sensitive information is handled confidentially. 14 | 15 | 2. **Empty Security Issue**: After submitting through GitHub Security Advisories, please also create an empty security issue to alert us, as GitHub Advisories do not send automatic notifications. This can be done [here](https://github.com/wayofdev/docker-shared-services/issues/new?assignees=&labels=type%3A+bug%2Cpriority%3A+high%2Ctype%3A+security&projects=&template=5-security-report.yml&title=%5BSecurity%5D%3A+). 16 | 17 | 3. **Direct Contact**: For highly sensitive information, in addition to the GitHub Security Advisories, please email us directly at `the@wayof.dev` with the subject line "SECURITY - Vulnerability Report". This will be treated with the highest priority. 18 | 19 | Please do not discuss potential security issues in public forums or through our public GitHub issues tracker. 20 | 21 | ## ❌ Third-Party Bug Bounty Platforms 22 | 23 | At this moment, we DO NOT accept reports from third-party bug bounty platforms to minimize risk. All vulnerability reports should come through the specified channels above. 24 | 25 |
26 | -------------------------------------------------------------------------------- /.github/workflows/e2e-ubuntu.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | on: # yamllint disable-line rule:truthy 4 | push: 5 | branches: 6 | - 'master' 7 | pull_request: 8 | branches: 9 | - 'master' 10 | 11 | name: 🧪 End-to-end testing (Ubuntu) 12 | 13 | jobs: 14 | build: 15 | timeout-minutes: 8 16 | runs-on: ubuntu-latest 17 | # Job steps will be run against this container, instead of host. 18 | # This tries to resolve problem with 53 port already bound on host runner machine. 19 | # More info: 20 | # https://docs.github.com/en/actions/using-jobs/running-jobs-in-a-container 21 | container: 22 | image: ubuntu:latest 23 | options: --privileged 24 | steps: 25 | - name: ‼️ Temporary succeed without check 26 | run: | 27 | echo "This is a temporary success stub." 28 | echo "Temporarily disable this job due to port 53 conflict with dnsmasq" 29 | exit 0 30 | 31 | # - name: 📦 Check out the codebase 32 | # uses: actions/checkout@v4.1.6 33 | # 34 | # - name: 🐳 Set up Docker 35 | # run: | 36 | # apt update 37 | # apt install -y curl make apt-utils net-tools procps iproute2 iputils-ping 38 | # curl -fsSL https://get.docker.com -o get-docker.sh 39 | # sh get-docker.sh 40 | # 41 | # - name: 🌎 Generate .env file 42 | # run: make env 43 | # 44 | # - name: 🏗️ Start docker-compose services 45 | # run: | 46 | # make up 47 | # 48 | # - name: 🧪 Test DNS Resolver with dig 49 | # run: | 50 | # if ! dig @127.0.0.1 -p 53 any-domain.docker +short; then 51 | # echo "DNS resolution failed!" 52 | # exit 1 53 | # fi 54 | # 55 | # - name: 🧪 Test DNS resolver with ping 56 | # run: | 57 | # if ! ping -c 3 any-domain.docker; then 58 | # echo "Ping test failed!" 59 | # exit 1 60 | # fi 61 | # 62 | # - name: ⚙️ Stop docker-compose services 63 | # if: always() 64 | # run: make down 65 | -------------------------------------------------------------------------------- /.github/.release-please-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", 3 | "release-type": "php", 4 | "packages": { 5 | ".": { 6 | "package-name": "docker-shared-services", 7 | "changelog-path": "/CHANGELOG.md" 8 | } 9 | }, 10 | "include-component-in-tag": false, 11 | "changelog-sections": [ 12 | { 13 | "type": "feat", 14 | "section": "Features", 15 | "hidden": false 16 | }, 17 | { 18 | "type": "fix", 19 | "section": "Bug Fixes", 20 | "hidden": false 21 | }, 22 | { 23 | "type": "perf", 24 | "section": "Performance Improvements", 25 | "hidden": false 26 | }, 27 | { 28 | "type": "docs", 29 | "section": "Documentation", 30 | "hidden": false 31 | }, 32 | { 33 | "type": "deps", 34 | "section": "Dependencies", 35 | "hidden": false 36 | }, 37 | { 38 | "type": "refactor", 39 | "section": "Code Refactoring", 40 | "hidden": false 41 | }, 42 | { 43 | "type": "test", 44 | "section": "Tests", 45 | "hidden": true 46 | }, 47 | { 48 | "type": "build", 49 | "section": "Build System", 50 | "hidden": true 51 | }, 52 | { 53 | "type": "ci", 54 | "section": "Continuous Integration", 55 | "hidden": true 56 | }, 57 | { 58 | "type": "chore", 59 | "section": "Miscellaneous", 60 | "hidden": true 61 | }, 62 | { 63 | "type": "style", 64 | "section": "Styles", 65 | "hidden": true 66 | }, 67 | { 68 | "type": "revert", 69 | "section": "Reverts", 70 | "hidden": true 71 | } 72 | ] 73 | } 74 | -------------------------------------------------------------------------------- /.github/.commitlint.config.mjs: -------------------------------------------------------------------------------- 1 | // More info: https://github.com/wayofdev/npm-shareable-configs/blob/master/packages/commitlint-config/src/index.js 2 | const automaticCommitPattern = /^chore\(release\):.*\[skip ci]/ 3 | 4 | export default { 5 | extends: ['@commitlint/config-conventional'], 6 | /* 7 | This resolves a linting conflict between commitlint's body-max-line-length 8 | due to @semantic-release/git putting release notes in the commit body 9 | https://github.com/semantic-release/git/issues/331 10 | */ 11 | ignores: [(commitMessage) => automaticCommitPattern.test(commitMessage)], 12 | rules: { 13 | 'body-leading-blank': [1, 'always'], 14 | 'body-max-line-length': [2, 'always', 120], 15 | 'footer-leading-blank': [1, 'always'], 16 | 'footer-max-line-length': [2, 'always', 120], 17 | 'header-max-length': [2, 'always', 100], 18 | 'scope-case': [2, 'always', 'lower-case'], 19 | 'subject-case': [2, 'never', ['sentence-case', 'start-case', 'pascal-case', 'upper-case']], 20 | 'subject-empty': [2, 'never'], 21 | 'subject-full-stop': [2, 'never', '.'], 22 | 'type-case': [2, 'always', 'lower-case'], 23 | 'type-empty': [2, 'never'], 24 | 'type-enum': [ 25 | 2, 26 | 'always', 27 | [ 28 | 'feat', // New feature 29 | 'fix', // Bug fix 30 | 'perf', // Performance improvement 31 | 'docs', // Documentation changes 32 | 'style', // Code style update (formatting, missing semi colons, etc) 33 | 'deps', // Dependency updates 34 | 'refactor', // Code refactoring 35 | 'ci', // Continuous integration changes 36 | 'test', // Adding missing tests 37 | 'revert', // Revert to a previous commit 38 | 'build', // Changes that affect the build system 39 | 'chore', // Other changes that don't modify src or test files 40 | 'security', // Security improvements 41 | ], 42 | ], 43 | }, 44 | } 45 | -------------------------------------------------------------------------------- /.github/workflows/coding-standards.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | on: # yamllint disable-line rule:truthy 4 | pull_request: 5 | branches: 6 | - master 7 | 8 | name: 🧹 Fix coding standards 9 | 10 | jobs: 11 | commit-linting: 12 | timeout-minutes: 4 13 | runs-on: ubuntu-latest 14 | concurrency: 15 | cancel-in-progress: true 16 | group: commit-linting-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} 17 | permissions: 18 | contents: read 19 | pull-requests: read 20 | steps: 21 | - name: 📦 Check out the codebase 22 | uses: actions/checkout@v4.1.7 23 | 24 | - name: 🧐 Lint commits using "commitlint" 25 | uses: wagoid/commitlint-github-action@v6.0.1 26 | with: 27 | configFile: ${{ github.workspace }}/.github/.commitlint.config.mjs 28 | failOnWarnings: false 29 | failOnErrors: true 30 | helpURL: 'https://github.com/conventional-changelog/commitlint/#what-is-commitlint' 31 | 32 | yaml-linting: 33 | timeout-minutes: 4 34 | runs-on: ubuntu-latest 35 | concurrency: 36 | cancel-in-progress: true 37 | group: yaml-linting-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} 38 | permissions: 39 | contents: read 40 | pull-requests: read 41 | steps: 42 | - name: 📦 Check out the codebase 43 | uses: actions/checkout@v4.1.7 44 | 45 | - name: 🧐 Lint YAML files 46 | uses: ibiqlik/action-yamllint@v3.1.1 47 | with: 48 | config_file: .github/.yamllint.yaml 49 | file_or_dir: '.' 50 | strict: true 51 | 52 | markdown-linting: 53 | timeout-minutes: 4 54 | runs-on: ubuntu-latest 55 | concurrency: 56 | cancel-in-progress: true 57 | group: markdown-linting-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} 58 | steps: 59 | - name: 📦 Check out the codebase 60 | uses: actions/checkout@v4.1.7 61 | 62 | - name: 🧐 Lint Markdown files 63 | uses: DavidAnson/markdownlint-cli2-action@v16.0.0 64 | with: 65 | config: '.github/.markdownlint.json' 66 | globs: | 67 | **/*.md 68 | !CHANGELOG.md 69 | -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | services: 4 | router: 5 | image: traefik:v3.0.4 6 | container_name: router 7 | restart: on-failure 8 | ports: 9 | - '80:80' 10 | - '443:443' 11 | volumes: 12 | - /var/run/docker.sock:/var/run/docker.sock:ro 13 | - ./traefik/conf/traefik.yml:/etc/traefik/traefik.yml 14 | - ./traefik/certs/cert.pem:/etc/traefik/cert.pem 15 | - ./traefik/certs/key.pem:/etc/traefik/key.pem 16 | labels: 17 | - traefik.enable=true 18 | - traefik.http.routers.router.rule=Host(`router${SHARED_DOMAIN_SEGMENT}.docker`) 19 | - traefik.http.routers.router.entrypoints=websecure 20 | - traefik.http.services.router.loadbalancer.server.port=8080 21 | - traefik.http.routers.router.tls=true 22 | healthcheck: 23 | test: ['CMD-SHELL', 'traefik healthcheck --ping'] 24 | interval: 4s 25 | timeout: 4s 26 | retries: 8 27 | start_period: 4s 28 | 29 | ui: 30 | image: portainer/portainer-ce:2.20.3-alpine 31 | container_name: ui 32 | restart: on-failure 33 | ports: 34 | - '9000' 35 | volumes: 36 | - /var/run/docker.sock:/var/run/docker.sock 37 | - ui_data:/data 38 | command: '-H unix:///var/run/docker.sock' 39 | labels: 40 | - traefik.enable=true 41 | - traefik.http.routers.ui.rule=Host(`ui${SHARED_DOMAIN_SEGMENT}.docker`) 42 | - traefik.http.routers.ui.entrypoints=websecure 43 | - traefik.http.services.ui.loadbalancer.server.port=9000 44 | - traefik.http.routers.ui.tls=true 45 | healthcheck: 46 | test: 'wget -q --no-verbose --tries=3 --spider --no-check-certificate http://127.0.0.1:9000/api/system/status || exit 1' 47 | interval: 4s 48 | timeout: 4s 49 | retries: 8 50 | start_period: 4s 51 | 52 | dns: 53 | image: drpsychick/dnsmasq:latest 54 | container_name: dnsmasq 55 | restart: unless-stopped 56 | env_file: 57 | - .env 58 | ports: 59 | - '53:53/tcp' 60 | - '53:53/udp' 61 | cap_add: 62 | - NET_ADMIN 63 | healthcheck: 64 | test: ['CMD-SHELL', 'nslookup localhost 127.0.0.1 || exit 1'] 65 | interval: 4s 66 | timeout: 4s 67 | retries: 8 68 | start_period: 4s 69 | 70 | networks: 71 | default: 72 | name: network.${COMPOSE_PROJECT_NAME} 73 | ipam: 74 | config: 75 | - subnet: 172.100.61.0/24 76 | 77 | volumes: 78 | ui_data: 79 | 80 | ... 81 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/3-failing-test.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | name: 🧪 Failing Test 4 | description: Report failing tests or CI jobs. 5 | title: '[Test]: ' 6 | labels: ['type: test'] 7 | 8 | assignees: 9 | - lotyp 10 | 11 | body: 12 | - type: markdown 13 | attributes: 14 | value: 🧪 **Failing Test** 15 | 16 | - type: textarea 17 | id: failing-tests 18 | attributes: 19 | label: Which jobs/test(s) are failing 20 | description: Please specify which CI jobs or tests are failing. Include test names or job identifiers. 21 | placeholder: List the failing jobs or tests here... 22 | validations: 23 | required: true 24 | 25 | - type: textarea 26 | id: reason-for-failure 27 | attributes: 28 | label: Reason for failure/description 29 | description: Explain why the test is failing or what might be missing to make it pass. If available, include error messages or output logs. 30 | placeholder: Provide details on why the test is failing, including error logs or output messages... 31 | validations: 32 | required: true 33 | 34 | - type: textarea 35 | id: media-prove 36 | attributes: 37 | label: Media prove 38 | description: If applicable, add screenshots, videos, or links to logs that help explain the issue. Visual aids can be very helpful in diagnosing problems. 39 | placeholder: Upload files or paste links here... 40 | validations: 41 | required: false 42 | 43 | - type: textarea 44 | id: additional-context 45 | attributes: 46 | label: Additional context 47 | description: Add any other context about the problem, such as related issues, recent changes, or environmental specifics that might influence the test outcome. 48 | placeholder: Include any other relevant information that might help understand the issue... 49 | validations: 50 | required: false 51 | 52 | - type: markdown 53 | attributes: 54 | value: | 55 | 📛 To ensure a smooth issue processing, please check if a similar bug report has already been submitted before creating a new one. 56 | We highly value your contributions, so please make sure to familiarize yourself with our repository's guidelines: 57 | - [Code of Conduct](https://github.com/wayofdev/docker-shared-services/blob/master/.github/CODE_OF_CONDUCT.md) 58 | - [Contribution Guidelines](https://github.com/wayofdev/docker-shared-services/blob/master/.github/CONTRIBUTING.md) 59 | 60 | Additionally, consider joining our discussions on: 61 | - [WayOfDev Discord Community](https://discord.gg/CE3TcCC5vr) 62 | 63 | ... 64 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # 2 | # SS = Shared Services 3 | # https://docs.docker.com/compose/reference/envvars/#compose_project_name 4 | # 5 | COMPOSE_PROJECT_NAME=ss 6 | 7 | # 8 | # Domain, under which default, shared services will run. 9 | # Default: .wod 10 | # Example subdomains, under which services will run under: 11 | # - pg-admin.wod.docker 12 | # - router.wod.docker 13 | # - ui.wod.docker 14 | # Can be left blank, but then $TLS_DOMAINS need to contain all top level domains of your projects. 15 | # 16 | # Example: 17 | # Using empty SHARED_DOMAIN_SEGMENT="" 18 | # TLS_DOMAINS="pg-admin.docker router.docker ui.docker" 19 | # Using custom SHARED_DOMAIN_SEGMENT=".wod" 20 | # TLS_DOMAINS="pg-admin.wod.docker router.wod.docker ui.wod.docker" 21 | # 22 | SHARED_DOMAIN_SEGMENT= 23 | 24 | # 25 | # Specify domains for mkcert 26 | # Because of browser limitations, each top-level domain should be added separately. 27 | # This ensures that certificates are correctly recognized by browsers. 28 | # Examples of top-level domains: 29 | # - pg-admin.docker 30 | # - router.docker 31 | # - ui.docker 32 | # 33 | # Wildcards can be used, but note that they only cover one level of subdomains. 34 | # Example: 35 | # - *.laravel-starter-tpl.docker will match api.laravel-starter-tpl.docker 36 | # - However, it will not match api.prod.laravel-starter-tpl.docker 37 | # 38 | TLS_DOMAINS="ui.docker router.docker pg-admin.docker *.wod.docker *.tpl.wod.docker *.laravel-starter-tpl.docker *.spiral-starter-tpl.docker *.laravel-cycle-starter-tpl.docker *.laravel-app.docker *.spiral-app-temporal-demo.docker" 39 | 40 | # 41 | # DNSMasq Configuration 42 | # 43 | # This service will route all *.docker domains to the local macOS or Linux machine. 44 | # Example: your-project.docker will be routed to the local machine 127.0.0.1 45 | # 46 | # `ping your-project.docker` will return 47 | # 48 | # PING your-project.docker (127.0.0.1): 56 data bytes 49 | # 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.129 ms 50 | # 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.173 ms 51 | # 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.111 ms 52 | # 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.176 ms 53 | # 54 | # This allows further configuration of Traefik to route the traffic to the correct container. 55 | # 56 | # For more information, see: 57 | # https://github.com/DrPsychick/docker-dnsmasq 58 | # 59 | # Note: To use, for example .mac domain, you need to change 60 | # DMQ_GLOBAL=address=/docker/127.0.0.1 (to =>) DMQ_GLOBAL=address=/mac/127.0.0.1 61 | # 62 | DMQ_DHCP_DNS=dhcp-option=6,172.17.10.1,8.8.8.8,8.8.4.4 63 | DMQ_DHCP_GATEWAY=dhcp-option=3,172.17.10.1 64 | DMQ_DHCP_PXE= 65 | DMQ_DHCP_RANGES=dhcp-range=172.17.10.10,172.17.10.100,24h 66 | DMQ_DHCP_TFTP= 67 | DMQ_DHCP_WINS= 68 | DMQ_DNS_ADDRESS= 69 | DMQ_DNS_ALIAS= 70 | DMQ_DNS_CNAME= 71 | DMQ_DNS_DOMAIN=domain=local 72 | DMQ_DNS_FLAGS=expand-hosts\ndomain-needed\nselfmx\ndns-loop-detect 73 | DMQ_DNS_LOCAL=local=/local/ 74 | DMQ_DNS_RESOLV=no-resolv 75 | DMQ_DNS_SERVER=server=8.8.8.8\nserver=8.8.4.4 76 | DMQ_DNS_SRV= 77 | DMQ_DNS_TXT= 78 | DMQ_GLOBAL=address=/docker/127.0.0.1 79 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/4-docs-bug-report.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | name: 📚 Documentation or README.md issue report 4 | description: Report an issue in the project's documentation or README.md file. 5 | title: '[Docs]: ' 6 | labels: ['type: documentation', 'type: maintenance'] 7 | 8 | assignees: 9 | - lotyp 10 | 11 | body: 12 | - type: markdown 13 | attributes: 14 | value: 📚 **Documentation Issue Report** 15 | 16 | - type: textarea 17 | id: documentation-bug-description 18 | attributes: 19 | label: Describe the bug 20 | description: Provide a clear and concise description of what the error or issue is in the documentation. 21 | placeholder: Explain the issue with the documentation... 22 | validations: 23 | required: true 24 | 25 | - type: textarea 26 | id: steps-to-reproduce 27 | attributes: 28 | label: To Reproduce 29 | description: | 30 | Please provide steps to reproduce the error in the documentation: 31 | 1. Navigate to the section or URL where the error occurs... 32 | 2. Specify the misleading or incorrect information... 33 | 3. Suggest what is expected if applicable... 34 | placeholder: | 35 | 1. URL or Section... 36 | 2. Misleading information... 37 | 3. Expected correction... 38 | validations: 39 | required: true 40 | 41 | - type: textarea 42 | id: media-prove 43 | attributes: 44 | label: Media prove 45 | description: If applicable, add screenshots or videos to better illustrate the issue with the documentation. 46 | placeholder: Upload files or paste links here... 47 | validations: 48 | required: false 49 | 50 | - type: textarea 51 | id: desired-solution 52 | attributes: 53 | label: Describe the solution you would like 54 | description: Describe what changes or improvements you would like to see in the documentation. 55 | placeholder: Describe the desired changes or improvements... 56 | validations: 57 | required: true 58 | 59 | - type: textarea 60 | id: additional-context 61 | attributes: 62 | label: Additional context 63 | description: Add any other context or additional information that could help clarify the documentation issue. 64 | placeholder: Provide any additional context here... 65 | validations: 66 | required: false 67 | 68 | - type: markdown 69 | attributes: 70 | value: | 71 | 📛 To ensure a smooth issue processing, please check if a similar bug report has already been submitted before creating a new one. 72 | We highly value your contributions, so please make sure to familiarize yourself with our repository's guidelines: 73 | - [Code of Conduct](https://github.com/wayofdev/docker-shared-services/blob/master/.github/CODE_OF_CONDUCT.md) 74 | - [Contribution Guidelines](https://github.com/wayofdev/docker-shared-services/blob/master/.github/CONTRIBUTING.md) 75 | 76 | Additionally, consider joining our discussions on: 77 | - [WayOfDev Discord Community](https://discord.gg/CE3TcCC5vr) 78 | 79 | ... 80 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/2-feature-request.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | name: 🚀 Feature Request 4 | description: Suggest an idea or possible new feature for this project. 5 | title: '[Feature]: ' 6 | labels: ['type: enhancement'] 7 | 8 | assignees: 9 | - lotyp 10 | 11 | body: 12 | - type: markdown 13 | attributes: 14 | value: 🚀 **Feature Request** 15 | 16 | - type: textarea 17 | id: problem-related 18 | attributes: 19 | label: Is your feature request related to a problem? Please describe. 20 | description: | 21 | Please provide a clear and detailed description of what the problem is. 22 | For example, 'I'm always frustrated when...'. 23 | This will help us understand the context and the impact of the problem. 24 | placeholder: Describe the problem... 25 | validations: 26 | required: true 27 | 28 | - type: textarea 29 | id: desired-solution 30 | attributes: 31 | label: "Describe the solution you'd like" 32 | description: | 33 | What would you like to see happen? Please provide a detailed explanation of the desired feature. 34 | You may include bullet points to outline objectives, key activities, and expected outcomes. 35 | placeholder: | 36 | 1. Objective: [What you hope to achieve with this feature] 37 | 2. Key Activities: [Steps to implement the feature] 38 | 3. Expected Outcome: [Benefits and results of the feature] 39 | validations: 40 | required: true 41 | 42 | - type: textarea 43 | id: alternative-solutions 44 | attributes: 45 | label: "Describe alternatives you've considered" 46 | description: | 47 | Are there alternative solutions or features you've considered? Please describe them. 48 | Understanding different possible solutions can help in finding the best path forward. 49 | placeholder: Describe any alternative solutions or workarounds you have considered... 50 | validations: 51 | required: false 52 | 53 | - type: textarea 54 | id: additional-context 55 | attributes: 56 | label: Additional context 57 | description: | 58 | Add any other context or screenshots about the feature request here. 59 | Links to similar features, or visual aids that support your proposal, if applicable. 60 | placeholder: Insert any additional context or links to similar features here... 61 | validations: 62 | required: false 63 | 64 | - type: markdown 65 | attributes: 66 | value: | 67 | 📛 To ensure a smooth issue processing, please check if a similar feature request has already been submitted before creating a new one. 68 | We highly value your contributions, so please make sure to familiarize yourself with our repository's guidelines: 69 | - [Code of Conduct](https://github.com/wayofdev/docker-shared-services/blob/master/.github/CODE_OF_CONDUCT.md) 70 | - [Contribution Guidelines](https://github.com/wayofdev/docker-shared-services/blob/master/.github/CONTRIBUTING.md) 71 | 72 | Additionally, consider joining our discussions on: 73 | - [WayOfDev Discord Community](https://discord.gg/CE3TcCC5vr) 74 | 75 | ... 76 | -------------------------------------------------------------------------------- /.github/.cz.config.js: -------------------------------------------------------------------------------- 1 | // @see https://cz-git.qbb.sh/config/#configure-template 2 | module.exports = { 3 | alias: { fd: 'docs: fix typos' }, 4 | messages: { 5 | type: 'Select the type of change that you\'re committing:', 6 | scope: 'Denote the SCOPE of this change (optional):', 7 | customScope: 'Denote the SCOPE of this change:', 8 | subject: 'Write a SHORT, IMPERATIVE tense description of the change:\n', 9 | body: 'Provide a LONGER description of the change (optional). Use "|" to break new line:\n', 10 | breaking: 'List any BREAKING CHANGES (optional). Use "|" to break new line:\n', 11 | footerPrefixesSelect: 'Select the ISSUES type of changeList by this change (optional):', 12 | customFooterPrefix: 'Input ISSUES prefix:', 13 | footer: 'List any ISSUES by this change. E.g.: #31, #34:\n', 14 | generatingByAI: 'Generating your AI commit subject...', 15 | generatedSelectByAI: 'Select suitable subject by AI generated:', 16 | confirmCommit: 'Are you sure you want to proceed with the commit above?' 17 | }, 18 | types: [ 19 | { value: 'feat', name: 'feat: A new feature', emoji: ':sparkles:' }, 20 | { value: 'fix', name: 'fix: A bug fix', emoji: ':bug:' }, 21 | { value: 'perf', name: 'perf: A code change that improves performance', emoji: ':zap:' }, 22 | { value: 'docs', name: 'docs: Documentation only changes', emoji: ':memo:' }, 23 | { value: 'style', name: 'style: Changes that do not affect the meaning of the code', emoji: ':lipstick:' }, 24 | { value: 'deps', name: 'deps: A dependency update', emoji: ':package:' }, 25 | { value: 'refactor', name: 'refactor: A code change that neither fixes a bug nor adds a feature', emoji: ':recycle:' }, 26 | { value: 'ci', name: 'ci: Changes to our CI configuration files and scripts', emoji: ':ferris_wheel:' }, 27 | { value: 'test', name: 'test: Adding missing tests or correcting existing tests', emoji: ':white_check_mark:' }, 28 | { value: 'revert', name: 'revert: Reverts a previous commit', emoji: ':rewind:' }, 29 | { value: 'build', name: 'build: Changes that affect the build system or external dependencies', emoji: ':package:' }, 30 | { value: 'chore', name: 'chore: Other changes that don\'t modify src or test files', emoji: ':hammer:' }, 31 | { value: 'security', name: 'security: A code change that fixes a security issue', emoji: ':lock:' } 32 | ], 33 | useEmoji: false, 34 | emojiAlign: 'center', 35 | useAI: false, 36 | aiNumber: 1, 37 | themeColorCode: '', 38 | scopes: [], 39 | allowCustomScopes: true, 40 | allowEmptyScopes: true, 41 | customScopesAlign: 'bottom', 42 | customScopesAlias: 'custom', 43 | emptyScopesAlias: 'empty', 44 | upperCaseSubject: false, 45 | markBreakingChangeMode: false, 46 | allowBreakingChanges: ['feat', 'fix'], 47 | breaklineNumber: 100, 48 | breaklineChar: '|', 49 | skipQuestions: [], 50 | issuePrefixes: [{ value: 'closed', name: 'closed: ISSUES has been processed' }], 51 | customIssuePrefixAlign: 'top', 52 | emptyIssuePrefixAlias: 'skip', 53 | customIssuePrefixAlias: 'custom', 54 | allowCustomIssuePrefix: true, 55 | allowEmptyIssuePrefix: true, 56 | confirmColorize: true, 57 | maxHeaderLength: Infinity, 58 | maxSubjectLength: Infinity, 59 | minSubjectLength: 0, 60 | scopeOverrides: undefined, 61 | defaultBody: '', 62 | defaultIssues: '', 63 | defaultScope: '', 64 | defaultSubject: '' 65 | } 66 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/1-bug-report.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | name: 🐞 Bug Report 4 | description: Report an issue to help the project improve. 5 | title: '[Bug]: ' 6 | labels: ['type: bug'] 7 | 8 | assignees: 9 | - lotyp 10 | 11 | body: 12 | - type: markdown 13 | attributes: 14 | value: 🐞 **Bug Report** 15 | 16 | - type: textarea 17 | id: bug-description 18 | attributes: 19 | label: Describe the bug 20 | description: Please provide a clear and detailed description of what the bug is. This helps us understand the issue quickly and look for potential fixes. 21 | placeholder: Explain the bug in as much detail as possible... 22 | validations: 23 | required: true 24 | 25 | - type: textarea 26 | id: regression 27 | attributes: 28 | label: Is this a regression? 29 | description: | 30 | Was this functionality working in a previous version? 31 | If yes, please mention the last version in which it worked properly. 32 | Understanding regressions helps prioritize fixes. 33 | placeholder: Yes or No, and details about the last working version... 34 | validations: 35 | required: false 36 | 37 | - type: textarea 38 | id: steps-to-reproduce 39 | attributes: 40 | label: To Reproduce 41 | description: | 42 | 'Please provide step-by-step instructions that reproduce the issue: 43 | 1. Use x argument / navigate to... 44 | 2. Fill this information... 45 | 3. Go to... 46 | 4. See error 47 | placeholder: Detailed steps to reproduce the bug... 48 | validations: 49 | required: true 50 | 51 | - type: textarea 52 | id: expected-behaviour 53 | attributes: 54 | label: Expected behaviour 55 | description: | 56 | Describe what you expected to happen. 57 | Clear expectations help understand the gap between current and desired states. 58 | placeholder: What did you expect to happen instead of the bug? 59 | validations: 60 | required: true 61 | 62 | - type: textarea 63 | id: media 64 | attributes: 65 | label: Media prove 66 | description: If applicable, add screenshots or videos to better illustrate the issue. Visual aids can significantly aid in diagnosing problems quicker. 67 | placeholder: Upload files or paste links here... 68 | validations: 69 | required: false 70 | 71 | - type: textarea 72 | id: environment 73 | attributes: 74 | label: Your environment 75 | description: | 76 | Provide detailed information about your environment to help us replicate the issue: 77 | * OS: [e.g. Ubuntu 22.04, macOS Sonoma 14.2.0] 78 | * Docker version: [e.g. 26.0] 79 | * Project version: [e.g. 1.0.0] 80 | * Any relevant environment details 81 | placeholder: List your environment details here... 82 | validations: 83 | required: false 84 | 85 | - type: textarea 86 | id: additional-context 87 | attributes: 88 | label: Additional context 89 | description: Include any other context about the problem here, such as unusual system configurations, previous issues, or possible causes. 90 | placeholder: Any additional information that could help us resolve the issue... 91 | validations: 92 | required: false 93 | 94 | - type: markdown 95 | attributes: 96 | value: | 97 | 📛 To ensure a smooth issue processing, please check if a similar bug report has already been submitted before creating a new one. 98 | We highly value your contributions, so please make sure to familiarize yourself with our repository's guidelines: 99 | - [Code of Conduct](https://github.com/wayofdev/docker-shared-services/blob/master/.github/CODE_OF_CONDUCT.md) 100 | - [Contribution Guidelines](https://github.com/wayofdev/docker-shared-services/blob/master/.github/CONTRIBUTING.md) 101 | 102 | Additionally, consider joining our discussions on: 103 | - [WayOfDev Discord Community](https://discord.gg/CE3TcCC5vr) 104 | 105 | ... 106 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | -include .env 2 | 3 | # BuildKit enables higher performance docker builds and caching possibility 4 | # to decrease build times and increase productivity for free. 5 | # https://docs.docker.com/compose/environment-variables/envvars/ 6 | export DOCKER_BUILDKIT ?= 1 7 | 8 | ifeq ($(COMPOSE_PROJECT_NAME),) 9 | COMPOSE_PROJECT_NAME=ss 10 | endif 11 | 12 | # Docker binary to use, when executing docker tasks 13 | DOCKER ?= docker 14 | 15 | # Binary to use, when executing docker-compose tasks 16 | DOCKER_COMPOSE ?= $(DOCKER) compose 17 | 18 | # Support image with all needed binaries, like envsubst, mkcert, wait4x 19 | SUPPORT_IMAGE ?= wayofdev/build-deps:alpine-latest 20 | 21 | BUILDER_PARAMS ?= $(DOCKER) run --rm -i \ 22 | --env-file ./.env \ 23 | --env COMPOSE_PROJECT_NAME=$(COMPOSE_PROJECT_NAME) \ 24 | --env SHARED_DOMAIN_SEGMENT="$(SHARED_DOMAIN_SEGMENT)" 25 | 26 | BUILDER ?= $(BUILDER_PARAMS) $(SUPPORT_IMAGE) 27 | BUILDER_WIRED ?= $(BUILDER_PARAMS) --network network.$(COMPOSE_PROJECT_NAME) $(SUPPORT_IMAGE) 28 | 29 | # Shorthand envsubst command, executed through build-deps 30 | ENVSUBST ?= $(BUILDER) envsubst 31 | 32 | # Yamllint docker image 33 | YAML_LINT_RUNNER ?= $(DOCKER) run --rm $$(tty -s && echo "-it" || echo) \ 34 | -v $(PWD):/data \ 35 | cytopia/yamllint:latest \ 36 | -c ./.github/.yamllint.yaml \ 37 | -f colored . 38 | 39 | ACTION_LINT_RUNNER ?= $(DOCKER) run --rm $$(tty -s && echo "-it" || echo) \ 40 | -v $(shell pwd):/repo \ 41 | --workdir /repo \ 42 | rhysd/actionlint:latest \ 43 | -color 44 | 45 | MARKDOWN_LINT_RUNNER ?= $(DOCKER) run --rm $$(tty -s && echo "-it" || echo) \ 46 | -v $(shell pwd):/app \ 47 | --workdir /app \ 48 | davidanson/markdownlint-cli2-rules:latest \ 49 | --config ".github/.markdownlint.json" 50 | 51 | EXPORT_VARS = '\ 52 | $${SHARED_DOMAIN_SEGMENT} \ 53 | $${COMPOSE_PROJECT_NAME}' 54 | 55 | # 56 | # Self documenting Makefile code 57 | # ------------------------------------------------------------------------------------ 58 | ifneq ($(TERM),) 59 | BLACK := $(shell tput setaf 0) 60 | RED := $(shell tput setaf 1) 61 | GREEN := $(shell tput setaf 2) 62 | YELLOW := $(shell tput setaf 3) 63 | LIGHTPURPLE := $(shell tput setaf 4) 64 | PURPLE := $(shell tput setaf 5) 65 | BLUE := $(shell tput setaf 6) 66 | WHITE := $(shell tput setaf 7) 67 | RST := $(shell tput sgr0) 68 | else 69 | BLACK := "" 70 | RED := "" 71 | GREEN := "" 72 | YELLOW := "" 73 | LIGHTPURPLE := "" 74 | PURPLE := "" 75 | BLUE := "" 76 | WHITE := "" 77 | RST := "" 78 | endif 79 | MAKE_LOGFILE = /tmp/wayofdev-docker-shared-services.log 80 | MAKE_CMD_COLOR := $(BLUE) 81 | 82 | default: all 83 | 84 | help: 85 | @echo 'Management commands for project:' 86 | @echo 'Usage:' 87 | @echo ' ${MAKE_CMD_COLOR}make${RST} Creates containers, spins up project' 88 | @grep -E '^[a-zA-Z_0-9%-]+:.*?## .*$$' Makefile | awk 'BEGIN {FS = ":.*?## "}; {printf " ${MAKE_CMD_COLOR}make %-21s${RST} %s\n", $$1, $$2}' 89 | @echo 90 | @echo ' 📑 Logs are stored in $(MAKE_LOGFILE)' 91 | @echo 92 | @echo ' 📦 Package docker-shared-services (https://github.com/wayofdev/docker-shared-services)' 93 | @echo ' 🤠 Author Andrij Orlenko (https://github.com/lotyp)' 94 | @echo ' 🏢 ${YELLOW}Org wayofdev (https://github.com/wayofdev)${RST}' 95 | @echo 96 | .PHONY: help 97 | 98 | .EXPORT_ALL_VARIABLES: 99 | 100 | # 101 | # Default action 102 | # Defines default command when `make` is executed without additional parameters 103 | # ------------------------------------------------------------------------------------ 104 | all: hooks env up 105 | PHONY: all 106 | 107 | # 108 | # System Actions 109 | # ------------------------------------------------------------------------------------ 110 | env: ## Generate .env file from example, use `make env force=true`, to force re-create file 111 | ifeq ($(FORCE),true) 112 | @echo "${YELLOW}Force re-creating .env file from example...${RST}" 113 | @# $(ENVSUBST) $(EXPORT_VARS) < ./.env.example > ./.env 114 | cp ./.env.example ./.env 115 | else ifneq ("$(wildcard ./.env)","") 116 | @echo "" 117 | @echo "${YELLOW}The .env file already exists! Use FORCE=true to re-create.${RST}" 118 | else 119 | @echo "Creating .env file from example" 120 | @# $(ENVSUBST) $(EXPORT_VARS) < ./.env.example > ./.env 121 | cp ./.env.example ./.env 122 | endif 123 | .PHONY: env 124 | 125 | override-create: ## Generate override file from dist 126 | cp -v docker-compose.override.yaml.dist docker-compose.override.yaml 127 | .PHONY: override-create 128 | 129 | cert-install: ## Run mkcert to install CA into system storage and generate default certs for traefik 130 | bash mkcert.sh 131 | .PHONY: cert-install 132 | 133 | # 134 | # Docker Actions 135 | # ------------------------------------------------------------------------------------ 136 | up: ## Fire up project 137 | $(DOCKER_COMPOSE) up --remove-orphans -d --wait 138 | .PHONY: up 139 | 140 | up-router: ## Start only traefik service 141 | $(DOCKER_COMPOSE) up --remove-orphans -d --no-deps router --wait 142 | .PHONY: up-router 143 | 144 | up-dns: ## Start only dns service 145 | $(DOCKER_COMPOSE) up --remove-orphans -d --no-deps dns --wait 146 | .PHONY: up-dns 147 | 148 | down: ## Stops and destroys running containers 149 | $(DOCKER_COMPOSE) down --remove-orphans 150 | .PHONY: down 151 | 152 | stop: ## Stops all containers, without removing them 153 | $(DOCKER_COMPOSE) stop 154 | .PHONY: stop 155 | 156 | restart: down up ## Restart all containers, running in this project 157 | .PHONY: restart 158 | 159 | logs: ## Show logs for running containers in this project 160 | $(DOCKER_COMPOSE) logs -f 161 | .PHONY: logs 162 | 163 | ps: ## List running containers in this project 164 | $(DOCKER_COMPOSE) ps 165 | .PHONY: ps 166 | 167 | pull: ## Pull upstream images, specified in docker-compose.yml file 168 | $(DOCKER_COMPOSE) pull 169 | .PHONY: pull 170 | 171 | clean: 172 | $(DOCKER_COMPOSE) rm --force --stop 173 | .PHONY: clean 174 | 175 | prune: ## Stops and removes all containers and volumes 176 | $(DOCKER_COMPOSE) down --remove-orphans --volumes 177 | .PHONY: prune 178 | 179 | # 180 | # Code Quality, Git, Linting 181 | # ------------------------------------------------------------------------------------ 182 | hooks: ## Install git hooks from pre-commit-config 183 | pre-commit install 184 | pre-commit install --hook-type commit-msg 185 | pre-commit autoupdate 186 | .PHONY: hooks 187 | 188 | lint: lint-yaml lint-actions lint-md ## Lint all files in project 189 | .PHONY: lint 190 | 191 | lint-yaml: ## Lints yaml files inside project 192 | @$(YAML_LINT_RUNNER) | tee -a $(MAKE_LOGFILE) 193 | .PHONY: lint-yaml 194 | 195 | lint-actions: ## Lint all github actions 196 | @$(ACTION_LINT_RUNNER) | tee -a $(MAKE_LOGFILE) 197 | .PHONY: lint-actions 198 | 199 | lint-md: ## Lint all markdown files using markdownlint-cli2 200 | @$(MARKDOWN_LINT_RUNNER) --fix "**/*.md" "!CHANGELOG.md" | tee -a $(MAKE_LOGFILE) 201 | .PHONY: lint-md 202 | 203 | lint-md-dry: ## Lint all markdown files using markdownlint-cli2 in dry-run mode 204 | @$(MARKDOWN_LINT_RUNNER) "**/*.md" "!CHANGELOG.md" | tee -a $(MAKE_LOGFILE) 205 | .PHONY: lint-md-dry 206 | 207 | # 208 | # Testing 209 | # ------------------------------------------------------------------------------------ 210 | # dcgoss binary is used for testing 211 | # README: https://github.com/aelsabbahy/goss/tree/master/extras/dcgoss 212 | # macOS install: https://github.com/goss-org/goss/tree/master/extras/dgoss#mac-osx 213 | # 214 | test: ## Run self-tests using dcgoss 215 | dcgoss run router 216 | .PHONY: test 217 | 218 | # 219 | # Release 220 | # ------------------------------------------------------------------------------------ 221 | commit: ## Run commitizen to create commit message 222 | czg commit --config="./.github/.cz.config.js" 223 | .PHONY: commit 224 | -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Welcome to our project! 4 | 5 | We appreciate your interest in contributing. This guide will help you get started, ensuring an effective collaboration. 6 | 7 |
8 | 9 | ## 🗂 Table of Contents 10 | 11 | * [Introduction](#-introduction) 12 | * [Development Requirements](#-development-requirements) 13 | * [Optional Tools](#-optional-tools) 14 | * [Using the Makefile](#-using-the-makefile) 15 | * [Workflow](#-workflow) 16 | * [Continuous Integration with GitHub Actions](#-continuous-integration-with-github-actions) 17 | * [Before You Contribute](#-before-you-contribute) 18 | * [Commit Message Guidelines](#-commit-message-guidelines) 19 | * [Coding Standards and Tools](#-coding-standards-and-tools) 20 | * [Yaml Lint](#-yaml-lint) 21 | * [Action Lint](#-action-lint) 22 | * [Markdown Lint](#-markdown-lint) 23 | * [Tests](#-tests) 24 | * [Pre-commit Hooks](#-pre-commit-hooks) 25 | * [Configured Hooks](#-configured-hooks) 26 | * [Installing Pre-commit Hooks](#-installing-pre-commit-hooks) 27 | 28 |
29 | 30 | ## 👋 Introduction 31 | 32 | If you would like to contribute, please **open an issue** or a pull request. We are always looking for ways to improve the project and would love to hear your ideas. 33 | 34 | The latest changes are always in **`master`** branch, so please make your Pull Request against that branch. 35 | 36 |
37 | 38 | ## 🚩 Development Requirements 39 | 40 | Before you begin, you will need to set up your local development environment. Here is what you'll need: 41 | 42 | * **Operating System**: macOS Monterey+, Linux, or Windows with WSL2. 43 | * **Docker**: Version 26.0.0 or newer. Installation guides: 44 | * [How To Install and Use Docker on Ubuntu 22.04](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04) 45 | * [How To Install Docker Desktop on Mac](https://docs.docker.com/desktop/install/mac-install/) 46 | * **Homebrew** (macOS only): Install via [brew.sh](https://brew.sh/). 47 | * **mkcert** Install via [brew.sh/formula/mkcert](https://formulae.brew.sh/formula/mkcert#default) or follow their instructions [here](https://github.com/FiloSottile/mkcert?tab=readme-ov-file#installation). 48 | 49 | ### → Optional Tools 50 | 51 | * [Pre-commit](https://pre-commit.com) — Automates the running of git pre-commit hooks. 52 | * Installation: `brew install pre-commit` and `make hooks` 53 | * [Cz-git](https://cz-git.qbb.sh) — Commitizen adapter, that assists in formatting git commits. 54 | * Installation: `brew install czg` 55 | 56 |
57 | 58 | ## 🔧 Using the Makefile 59 | 60 | This project uses a Makefile to streamline common development tasks. The Makefile includes utilities for managing Docker environments, running tests, and linting code. 61 | 62 | ```bash 63 | make help 64 | ``` 65 | 66 | ![Screenshot](./assets/screenshot.png) 67 | 68 | ### → Key Commands 69 | 70 | * `make up`: Starts all services using Docker Compose. 71 | * `make up-router`: Starts only traefik router container. 72 | * `make up-dns`: Starts only dnsmasq container. 73 | * `make down`: Stops and removes all services. 74 | * `make stop`: Stops all services. 75 | * `make logs`: Displays logs for all services. 76 | * `make lint`: Executes all linting procedures for YAML, PHP, and Composer files. 77 | * `make commit`: Runs cz-git, a commitizen adapter for commit message formatting in a native environment. 78 | 79 | Refer to the output of `make help` for a comprehensive list of available commands. 80 | 81 |
82 | 83 | ## 💻 Workflow 84 | 85 | > [!IMPORTANT] 86 | > 87 | > Please feature/fix/update... into individual PRs (not one changing everything) 88 | 89 | * **Fork the Repository**: Start by forking the repository to your GitHub account. 90 | * **Create a Branch**: In your fork, create a new branch for your work. Name it appropriately based on the feature, fix, or update you're working on. 91 | * **Make Your Changes**: Implement your changes 92 | * **Run Tests**: Ensure all tests pass and the code adheres to the coding standards. 93 | * **Update Documentation**: If you've made changes that affect the project's documentation, ensure it is updated. 94 | * **Run Linters**: Ensure your code passes all linting checks using `make lint`. 95 | * **Commit Your Changes**: Use the [Conventional Commits](#-commit-message-guidelines) standard for your commit messages. You can use `make commit` to assist in creating commit messages. 96 | * **Push Your Changes**: Push your branch to your fork on GitHub. 97 | * **Open a Pull Request**: Submit a pull request to the `master` branch of the original repository. Ensure your PR is focused, addressing a single feature, fix, or improvement. 98 | 99 |
100 | 101 | ## 🔨 Continuous Integration with GitHub Actions 102 | 103 | Our project employs [GitHub Actions](https://github.com/features/actions) for continuous integration, ensuring code quality and reliability. We encourage contributors to review our workflow configurations to understand the CI processes: 104 | 105 | | Workflow | Description | 106 | |--------------------------------------------------------------|----------------------------------------------------| 107 | | [`apply-labels.yml`](workflows/apply-labels.yml) | Auto labels PRs based on rules. | 108 | | [`auto-merge-release.yml`](workflows/auto-merge-release.yml) | Automatically merges release PRs. | 109 | | [`coding-standards.yml`](workflows/coding-standards.yml) | Checks `yaml`, `md` and commit coding standards. | 110 | | [`create-release.yml`](workflows/create-release.yml) | Creates a new release based on tags. | 111 | | [`e2e-macos.yml`](workflows/e2e-macos.yml) | End-to-end tests on macOS. **Currently disabled** | 112 | | [`e2e-ubuntu.yml`](workflows/e2e-ubuntu.yml) | End-to-end tests on Ubuntu. **Currently disabled** | 113 | | [`shellcheck.yml`](workflows/shellcheck.yml) | Lints shell scripts. | 114 | | [`sync-from-tpl.yml`](workflows/shellcheck.yml) | Triggered only on down-stream templates. | 115 | 116 |
117 | 118 | ## 📝 Before You Contribute 119 | 120 | * **Tests**: Include tests that cover any new features or bug fixes, if applicable. 121 | * **Code Quality**: Utilize `make lint` for code style checks. 122 | * **Documentation**: Update relevant documentation to reflect your changes, ensuring other developers can understand and use your contributions effectively. 123 | * **Commits**: use Conventional Commits standard to create a commit 124 | 125 |
126 | 127 | ## 📩 Commit Message Guidelines 128 | 129 | We follow the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) standard. Please structure your commit messages as follows, using the appropriate prefix: 130 | 131 | **Examples:** 132 | 133 | ```bash 134 | git commit -am 'feat: some feature was introduced' 135 | git commit -am 'fix: something has been fixed' 136 | ``` 137 | 138 | **Allowed Prefixes:** 139 | 140 | | Prefix | Purpose | 141 | |-------------|---------------------------------------------------------------| 142 | | `feat:` | Introduces a new feature | 143 | | `fix:` | Fixes a bug | 144 | | `perf:` | Improves performance | 145 | | `docs:` | Documentation only changes | 146 | | `style:` | Code style changes (formatting, missing semi-colons, etc.) | 147 | | `deps:` | Updates dependencies | 148 | | `refactor:` | Code changes that neither fixes a bug nor adds a feature | 149 | | `ci:` | Changes to our CI configuration files and scripts | 150 | | `test:` | Adding missing tests or correcting existing tests | 151 | | `revert:` | Reverts a previous commit | 152 | | `build:` | Changes that affect the build system or external dependencies | 153 | | `chore:` | Other changes that don't modify src or test files | 154 | | `security:` | A code change that fixes a security issue | 155 | 156 |
157 | 158 | ## 🔍 Coding Standards and Tools 159 | 160 | We enforce coding standards to maintain high code quality and readability. Here's a list of tools we use: 161 | 162 | ### → Yaml Lint 163 | 164 | We use [`yamllint`](https://github.com/adrienverge/yamllint) to enforce coding standards in YAML files. 165 | 166 | To lint yaml files run: 167 | 168 | ```bash 169 | make lint-yaml 170 | ``` 171 | 172 | by default, [`cytopia/yamllint`](https://github.com/cytopia/docker-yamllint) Docker image will be used to run linter. 173 | 174 | ### → Action Lint 175 | 176 | We use [`actionlint`](https://github.com/rhysd/actionlint) to enforce coding standards in GitHub Actions workflows. 177 | 178 | To lint GitHub Actions run: 179 | 180 | ```bash 181 | make lint-actions 182 | ``` 183 | 184 | ### → Markdown Lint 185 | 186 | We use [`markdownlint-cli2`](https://github.com/davidanson/markdownlint-cli2) to enforce coding standards in Markdown files. 187 | 188 | To lint markdown files run: 189 | 190 | ```bash 191 | make lint-md-dry 192 | make lint-md 193 | ``` 194 | 195 |
196 | 197 | ## 🧪 Tests 198 | 199 | We use [`dgoss`](https://github.com/goss-org/goss/blob/master/extras/dgoss/README.md) and [`dcgoss`](https://github.com/goss-org/goss/blob/master/extras/dcgoss/README.md) to test Docker images and `docker-compose` files. 200 | 201 | Run 202 | 203 | ```sh 204 | make tests 205 | ``` 206 | 207 | to run all the tests. 208 | 209 |
210 | 211 | ## 📦 Pre-commit Hooks 212 | 213 | Pre-commit hooks are an optional but highly recommended way to automate the linting and quality checks before committing changes to the repository. This project provides a predefined configuration that helps in maintaining code quality and consistency. 214 | 215 | ### → Configured Hooks 216 | 217 | Our pre-commit configuration includes several hooks: 218 | 219 | * **Trailing Whitespace**: Removes unnecessary trailing spaces. 220 | * **End-of-File Fixer**: Ensures that files end with a newline. 221 | * **Check Added Large Files**: Prevents accidentally adding large files to the git repository, with a current limit set to 600 KB. 222 | * **Commitizen**: Ensures commit messages meet the conventional commit format. This hook is triggered at the commit message stage. 223 | 224 | * **Markdown Lint:** Enforces coding standards in Markdown files. 225 | 226 | ### → Installing Pre-commit Hooks 227 | 228 | To utilize these hooks, you first need to install them using the command provided by the Makefile: 229 | 230 | ```bash 231 | make hooks 232 | ``` 233 | 234 |
235 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [2.0.3](https://github.com/wayofdev/docker-shared-services/compare/v2.0.2...v2.0.3) (2024-07-04) 4 | 5 | 6 | ### Documentation 7 | 8 | * readme.md updates ([276caa2](https://github.com/wayofdev/docker-shared-services/commit/276caa2c64bd438428a91948e4dc5866f337aca7)) 9 | 10 | 11 | ### Dependencies 12 | 13 | * **deps:** update actions/checkout action to v4.1.7 ([2f1ede2](https://github.com/wayofdev/docker-shared-services/commit/2f1ede2d88bb5dba5aa045da084ca3c781111e82)) 14 | * **deps:** update andreasaugustin/actions-template-sync action to v2.2.3 ([ab4260a](https://github.com/wayofdev/docker-shared-services/commit/ab4260aba4b1ef4a13ddebe8510fd4156351b28a)) 15 | * **deps:** update traefik docker tag to v3.0.2 ([43cc65e](https://github.com/wayofdev/docker-shared-services/commit/43cc65e6491494fb30a1063c31b7625cac052934)) 16 | * **deps:** update traefik docker tag to v3.0.3 ([57c3bae](https://github.com/wayofdev/docker-shared-services/commit/57c3bae7827105f8fa50d371231542e901b7709c)) 17 | * **deps:** update traefik docker tag to v3.0.4 ([7e9860b](https://github.com/wayofdev/docker-shared-services/commit/7e9860bf70f6a4318e6181c3334acc0b17de04a2)) 18 | 19 | ## [2.0.2](https://github.com/wayofdev/docker-shared-services/compare/v2.0.1...v2.0.2) (2024-06-12) 20 | 21 | 22 | ### Bug Fixes 23 | 24 | * add check if mkcert is installed ([5697f49](https://github.com/wayofdev/docker-shared-services/commit/5697f49cfeeafa4cc38eae29afb071e05ddb687e)) 25 | 26 | 27 | ### Documentation 28 | 29 | * update readme.md ([1351c1b](https://github.com/wayofdev/docker-shared-services/commit/1351c1b030cf63ee544a7f42e5ba1c77adfb0733)) 30 | * updates to contributing guide ([ded9951](https://github.com/wayofdev/docker-shared-services/commit/ded99519a88e73bc807b379cfcffcc73fd965f7b)) 31 | * updating README.md ([5edfa6d](https://github.com/wayofdev/docker-shared-services/commit/5edfa6db3093afbec9ebf3a80cfd86b68a9d4889)) 32 | 33 | 34 | ### Dependencies 35 | 36 | * **deps:** update andreasaugustin/actions-template-sync action to v2.2.1 ([05f73ec](https://github.com/wayofdev/docker-shared-services/commit/05f73ecfb97ae4a44217fdd05032a01c8cb64578)) 37 | * **deps:** update googleapis/release-please-action action to v4.1.3 ([315dd16](https://github.com/wayofdev/docker-shared-services/commit/315dd16273ea6400f34fe2a11dc0a7a0cf7d4bde)) 38 | * **deps:** update wayofdev/gh-actions action to v3.1.1 ([7450e6a](https://github.com/wayofdev/docker-shared-services/commit/7450e6aeca1ad9efa56554171a5f579fd4c6e2bc)) 39 | 40 | ## [2.0.1](https://github.com/wayofdev/docker-shared-services/compare/v2.0.0...v2.0.1) (2024-06-05) 41 | 42 | 43 | ### Bug Fixes 44 | 45 | * traefik network name ([f31b22e](https://github.com/wayofdev/docker-shared-services/commit/f31b22e342bc6cd313bb2cd951b525dd590dceff)) 46 | 47 | 48 | ### Documentation 49 | 50 | * add outcome ([5785297](https://github.com/wayofdev/docker-shared-services/commit/5785297a6fe0c28d8184aee5f429cf3724fc6092)) 51 | * adding more friendly quick-start guide ([12c6fb7](https://github.com/wayofdev/docker-shared-services/commit/12c6fb72143b7ca241b8db6a3f705876a385bc50)) 52 | * clean-up readme ([5bc6f7f](https://github.com/wayofdev/docker-shared-services/commit/5bc6f7f4e574ace5600241ca83814ca08b2f3b35)) 53 | * document custom dns resolver ([6f10366](https://github.com/wayofdev/docker-shared-services/commit/6f1036679de68c229fe7634b7fb9f9b074574877)) 54 | * update contributing ([6f998c6](https://github.com/wayofdev/docker-shared-services/commit/6f998c6c6992d599e20dcb850526e7ca349484c8)) 55 | * update CONTRIBUTING.md guide lines. ([bf1f2d4](https://github.com/wayofdev/docker-shared-services/commit/bf1f2d40e341197fd130045451a3110bfb5d275d)) 56 | * update readme ([ca67c9c](https://github.com/wayofdev/docker-shared-services/commit/ca67c9ca64225b51bf2096ddb95084dde2458f22)) 57 | * update readme ([7f32657](https://github.com/wayofdev/docker-shared-services/commit/7f32657f9dc289a5623b4e9a9735f84bc3e2acf6)) 58 | * updating readme ([d86b21a](https://github.com/wayofdev/docker-shared-services/commit/d86b21a93fd972bd08bb330639c4723f30dc45c2)) 59 | 60 | ## [2.0.0](https://github.com/wayofdev/docker-shared-services/compare/v1.5.19...v2.0.0) (2024-06-01) 61 | 62 | 63 | ### ⚠ BREAKING CHANGES 64 | 65 | * bump major version 66 | 67 | ### Features 68 | 69 | * bump major version ([1dd8255](https://github.com/wayofdev/docker-shared-services/commit/1dd8255cd45bb5911ee7e5df4a2874b7269a13aa)) 70 | * use drpsychick/dnsmasq for local dns ([7c318f6](https://github.com/wayofdev/docker-shared-services/commit/7c318f6335a936d0f630de84e7cc8b823bafea2b)) 71 | 72 | 73 | ### Documentation 74 | 75 | * add issue templates, readme updates ([8ced1ec](https://github.com/wayofdev/docker-shared-services/commit/8ced1ec3346cdb5a2b91e8efa8e77d14449ebb5e)) 76 | * update readme.md ([f11be7f](https://github.com/wayofdev/docker-shared-services/commit/f11be7fd345ea89596f221a9dcff57000c0a9c93)) 77 | 78 | ## [1.5.19](https://github.com/wayofdev/docker-shared-services/compare/v1.5.18...v1.5.19) (2023-12-01) 79 | 80 | 81 | ### Miscellaneous 82 | 83 | * **deps:** update traefik docker tag to v2.10.6 ([1e39ece](https://github.com/wayofdev/docker-shared-services/commit/1e39ece21851c836937c67bd89528e6978c7e345)) 84 | 85 | ## [1.5.18](https://github.com/wayofdev/docker-shared-services/compare/v1.5.17...v1.5.18) (2023-11-21) 86 | 87 | 88 | ### Miscellaneous 89 | 90 | * **deps:** update portainer/portainer-ce docker tag to v2.19.3 ([5650a78](https://github.com/wayofdev/docker-shared-services/commit/5650a78e4ad57d6c8a2f7803f5648a8d476f67c8)) 91 | 92 | ## [1.5.17](https://github.com/wayofdev/docker-shared-services/compare/v1.5.16...v1.5.17) (2023-11-13) 93 | 94 | 95 | ### Miscellaneous 96 | 97 | * **deps:** update portainer/portainer-ce docker tag to v2.19.2 ([08231a0](https://github.com/wayofdev/docker-shared-services/commit/08231a0a40a8c409e8f052727d54d244590839ec)) 98 | 99 | ## [1.5.16](https://github.com/wayofdev/docker-shared-services/compare/v1.5.15...v1.5.16) (2023-10-19) 100 | 101 | 102 | ### Miscellaneous 103 | 104 | * **deps:** update actions/checkout digest to b4ffde6 ([4cb3f7c](https://github.com/wayofdev/docker-shared-services/commit/4cb3f7ce57ed4da4d5020f64845988827069a485)) 105 | 106 | ## [1.5.15](https://github.com/wayofdev/docker-shared-services/compare/v1.5.14...v1.5.15) (2023-10-11) 107 | 108 | 109 | ### Miscellaneous 110 | 111 | * **deps:** update traefik docker tag to v2.10.5 ([816b9c4](https://github.com/wayofdev/docker-shared-services/commit/816b9c43308943b7520c92cff6854aa650dd33d9)) 112 | 113 | ## [1.5.14](https://github.com/wayofdev/docker-shared-services/compare/v1.5.13...v1.5.14) (2023-09-24) 114 | 115 | 116 | ### Miscellaneous 117 | 118 | * **deps:** update andreasaugustin/actions-template-sync action to v1.1.8 ([ffd10f3](https://github.com/wayofdev/docker-shared-services/commit/ffd10f347e5ede5a61b34ae2d1932360b7119647)) 119 | 120 | ## [1.5.13](https://github.com/wayofdev/docker-shared-services/compare/v1.5.12...v1.5.13) (2023-09-24) 121 | 122 | 123 | ### Miscellaneous 124 | 125 | * **deps:** update andreasaugustin/actions-template-sync action to v1.1.4 ([d7f7bd6](https://github.com/wayofdev/docker-shared-services/commit/d7f7bd6ea87264555fb681d02fb1f337d441d6b2)) 126 | 127 | ## [1.5.12](https://github.com/wayofdev/docker-shared-services/compare/v1.5.11...v1.5.12) (2023-09-22) 128 | 129 | 130 | ### Miscellaneous 131 | 132 | * **deps:** update actions/checkout digest to 8ade135 ([49228c4](https://github.com/wayofdev/docker-shared-services/commit/49228c4caf7eb9545158013b4b66d2793cc838f6)) 133 | 134 | ## [1.5.11](https://github.com/wayofdev/docker-shared-services/compare/v1.5.10...v1.5.11) (2023-09-20) 135 | 136 | 137 | ### Miscellaneous 138 | 139 | * **deps:** update portainer/portainer-ce docker tag to v2.19.1 ([9de0f52](https://github.com/wayofdev/docker-shared-services/commit/9de0f52b2fbe49689d7382e30cbbd28ebb5d528a)) 140 | 141 | ## [1.5.10](https://github.com/wayofdev/docker-shared-services/compare/v1.5.9...v1.5.10) (2023-09-16) 142 | 143 | 144 | ### Miscellaneous 145 | 146 | * **deps:** update andreasaugustin/actions-template-sync action to v1.1.3 ([4f5b537](https://github.com/wayofdev/docker-shared-services/commit/4f5b53717cb6c446c7050f215973eaec8b0c8cae)) 147 | 148 | ## [1.5.9](https://github.com/wayofdev/docker-shared-services/compare/v1.5.8...v1.5.9) (2023-09-12) 149 | 150 | 151 | ### Miscellaneous 152 | 153 | * **deps:** update docker/setup-buildx-action action to v3 ([81a81b7](https://github.com/wayofdev/docker-shared-services/commit/81a81b7baefbd2811493e98133a9de28d2290a32)) 154 | 155 | ## [1.5.8](https://github.com/wayofdev/docker-shared-services/compare/v1.5.7...v1.5.8) (2023-09-12) 156 | 157 | 158 | ### Miscellaneous 159 | 160 | * **deps:** update docker/setup-qemu-action action to v3 ([92022b8](https://github.com/wayofdev/docker-shared-services/commit/92022b8fe638c540e391ab788cc69703cee9fc53)) 161 | 162 | ## [1.5.7](https://github.com/wayofdev/docker-shared-services/compare/v1.5.6...v1.5.7) (2023-09-04) 163 | 164 | 165 | ### Miscellaneous 166 | 167 | * **deps:** update actions/checkout action to v4 ([12b6c6c](https://github.com/wayofdev/docker-shared-services/commit/12b6c6c222732b1bebd43c461c485055d34bdab0)) 168 | 169 | ## [1.5.6](https://github.com/wayofdev/docker-shared-services/compare/v1.5.5...v1.5.6) (2023-09-03) 170 | 171 | 172 | ### Miscellaneous 173 | 174 | * **deps:** update andreasaugustin/actions-template-sync action to v1.1.2 ([8f1054b](https://github.com/wayofdev/docker-shared-services/commit/8f1054bfe9d38253442589efa7ceeff5b8294258)) 175 | 176 | ## [1.5.5](https://github.com/wayofdev/docker-shared-services/compare/v1.5.4...v1.5.5) (2023-08-31) 177 | 178 | 179 | ### Miscellaneous 180 | 181 | * **deps:** update traefik docker tag to v2.10.4 ([38cb60a](https://github.com/wayofdev/docker-shared-services/commit/38cb60acdfacf405fce1e7812a9559d534fd14a8)) 182 | 183 | ## [1.5.4](https://github.com/wayofdev/docker-shared-services/compare/v1.5.3...v1.5.4) (2023-08-31) 184 | 185 | 186 | ### Miscellaneous 187 | 188 | * **deps:** update portainer/portainer-ce docker tag to v2.19.0 ([f1c857a](https://github.com/wayofdev/docker-shared-services/commit/f1c857a4ee14602c2431d24b379f15341aaa61cb)) 189 | 190 | ## [1.5.3](https://github.com/wayofdev/docker-shared-services/compare/v1.5.2...v1.5.3) (2023-07-22) 191 | 192 | 193 | ### Miscellaneous 194 | 195 | * **deps:** update andreasaugustin/actions-template-sync action to v1.1.1 ([97deeb5](https://github.com/wayofdev/docker-shared-services/commit/97deeb5fae959d77e17d36dcf118cbbf7cb12079)) 196 | 197 | ## [1.5.2](https://github.com/wayofdev/docker-shared-services/compare/v1.5.1...v1.5.2) (2023-07-17) 198 | 199 | 200 | ### Miscellaneous 201 | 202 | * **deps:** update andreasaugustin/actions-template-sync action to v1 ([d26d675](https://github.com/wayofdev/docker-shared-services/commit/d26d675981833298cb5e6fe0816e0d09ad084e03)) 203 | 204 | ## [1.5.1](https://github.com/wayofdev/docker-shared-services/compare/v1.5.0...v1.5.1) (2023-07-06) 205 | 206 | 207 | ### Miscellaneous 208 | 209 | * **deps:** update portainer/portainer-ce docker tag to v2.18.4 ([8486c6b](https://github.com/wayofdev/docker-shared-services/commit/8486c6bc6919b3ce9702dcc6f593603ee598ea20)) 210 | 211 | ## [1.5.0](https://github.com/wayofdev/docker-shared-services/compare/v1.4.11...v1.5.0) (2023-07-02) 212 | 213 | 214 | ### Features 215 | 216 | * move to reusable github workflows ([5bb40d3](https://github.com/wayofdev/docker-shared-services/commit/5bb40d30ab301282a67daa48a46dfd866b1904ee)) 217 | * use docker based dnsmasq instead of ansible-dnsmasq-role ([8c94c3f](https://github.com/wayofdev/docker-shared-services/commit/8c94c3fabdb60962dff08cafaece0e75e17b7e04)) 218 | 219 | 220 | ### Documentation 221 | 222 | * dnsmasq is not needed anymore ([6d2f2cd](https://github.com/wayofdev/docker-shared-services/commit/6d2f2cd381fcc40899016c98c346ab118f577a6b)) 223 | 224 | ## [1.4.11](https://github.com/wayofdev/docker-shared-services/compare/v1.4.10...v1.4.11) (2023-06-30) 225 | 226 | 227 | ### Bug Fixes 228 | 229 | * gateway timeouts ([0483d74](https://github.com/wayofdev/docker-shared-services/commit/0483d74f263e82c36f23208ff30d0005747daa7c)) 230 | 231 | 232 | ### Miscellaneous 233 | 234 | * **deps:** update traefik docker tag to v2.10.3 ([f60baf6](https://github.com/wayofdev/docker-shared-services/commit/f60baf6c7614de6e405738a6d369264b8f3e0b84)) 235 | 236 | ## [1.4.10](https://github.com/wayofdev/docker-shared-services/compare/v1.4.9...v1.4.10) (2023-05-22) 237 | 238 | 239 | ### Miscellaneous 240 | 241 | * **deps:** update portainer/portainer-ce docker tag to v2.18.3 ([96f1808](https://github.com/wayofdev/docker-shared-services/commit/96f1808fd6446e7cc05f71211ba124f4dcfce392)) 242 | 243 | ## [1.4.9](https://github.com/wayofdev/docker-shared-services/compare/v1.4.8...v1.4.9) (2023-05-04) 244 | 245 | 246 | ### Bug Fixes 247 | 248 | * actions ([bbfa709](https://github.com/wayofdev/docker-shared-services/commit/bbfa7099cb8d91c002c8039bdfed7604ac103e2b)) 249 | 250 | ## [1.4.8](https://github.com/wayofdev/docker-shared-services/compare/v1.4.7...v1.4.8) (2023-05-01) 251 | 252 | 253 | ### Miscellaneous 254 | 255 | * **deps:** update portainer/portainer-ce docker tag to v2.18.2 ([0f9e5dd](https://github.com/wayofdev/docker-shared-services/commit/0f9e5dd43ff952aad370317d6b630419b995afcd)) 256 | 257 | ## [1.4.7](https://github.com/wayofdev/docker-shared-services/compare/v1.4.6...v1.4.7) (2023-04-27) 258 | 259 | 260 | ### Miscellaneous 261 | 262 | * **deps:** update traefik docker tag to v2.10.1 ([5638520](https://github.com/wayofdev/docker-shared-services/commit/56385203e65b757cac25b5b98876af0224c0b46b)) 263 | 264 | ## [1.4.6](https://github.com/wayofdev/docker-shared-services/compare/v1.4.5...v1.4.6) (2023-04-25) 265 | 266 | 267 | ### Miscellaneous 268 | 269 | * **deps:** update traefik docker tag to v2.10.0 ([ca75995](https://github.com/wayofdev/docker-shared-services/commit/ca75995528a544b72bda0ab9679606092622a55a)) 270 | 271 | ## [1.4.5](https://github.com/wayofdev/docker-shared-services/compare/v1.4.4...v1.4.5) (2023-04-18) 272 | 273 | 274 | ### Miscellaneous 275 | 276 | * **deps:** update portainer/portainer-ce docker tag to v2.18.1 ([25d1e30](https://github.com/wayofdev/docker-shared-services/commit/25d1e30a0938139f9c0dd257e44ac9efe03abe2e)) 277 | 278 | ## [1.4.4](https://github.com/wayofdev/docker-shared-services/compare/v1.4.3...v1.4.4) (2023-04-06) 279 | 280 | 281 | ### Miscellaneous 282 | 283 | * **deps:** update traefik docker tag to v2.9.10 ([88e12ae](https://github.com/wayofdev/docker-shared-services/commit/88e12ae105bc313a6d6c1c46679b7c5f071d80ba)) 284 | 285 | ## [1.4.3](https://github.com/wayofdev/docker-shared-services/compare/v1.4.2...v1.4.3) (2023-03-23) 286 | 287 | 288 | ### Miscellaneous 289 | 290 | * **deps:** update peter-evans/enable-pull-request-automerge action to v3 ([e236b15](https://github.com/wayofdev/docker-shared-services/commit/e236b15bd23cee1156eb6e598ecd801b5b924f36)) 291 | 292 | ## [1.4.2](https://github.com/wayofdev/docker-shared-services/compare/v1.4.1...v1.4.2) (2023-03-21) 293 | 294 | 295 | ### Miscellaneous 296 | 297 | * **deps:** update traefik docker tag to v2.9.9 ([da56591](https://github.com/wayofdev/docker-shared-services/commit/da565910a9a89bf2cfd6a8eb7160f5237cd4d159)) 298 | 299 | ## [1.4.1](https://github.com/wayofdev/docker-shared-services/compare/v1.4.0...v1.4.1) (2023-03-21) 300 | 301 | 302 | ### Miscellaneous 303 | 304 | * **deps:** update andreasaugustin/actions-template-sync action to v0.8.0 ([ce5af80](https://github.com/wayofdev/docker-shared-services/commit/ce5af808fb89f1bc9e0e7d849ef2ebf289c5ca26)) 305 | 306 | ## [1.4.0](https://github.com/wayofdev/docker-shared-services/compare/v1.3.0...v1.4.0) (2023-03-14) 307 | 308 | 309 | ### Features 310 | 311 | * enable auto-merge ([335a94d](https://github.com/wayofdev/docker-shared-services/commit/335a94d0efdc0ec86bf352f63302e99820fa67d5)) 312 | 313 | 314 | ### Miscellaneous 315 | 316 | * **deps:** update portainer/portainer-ce docker tag to v2.17.1 ([392667a](https://github.com/wayofdev/docker-shared-services/commit/392667a0433ff3a16fc582ae4f2653233f4fc0e8)) 317 | 318 | ## [1.3.0](https://github.com/wayofdev/docker-shared-services/compare/v1.2.0...v1.3.0) (2023-03-14) 319 | 320 | 321 | ### Features 322 | 323 | * update workflow files ([47da695](https://github.com/wayofdev/docker-shared-services/commit/47da695f972fc90777be674c3a922c92d5d5a0ea)) 324 | 325 | 326 | ### Bug Fixes 327 | 328 | * certs directory should be present ([c0189d2](https://github.com/wayofdev/docker-shared-services/commit/c0189d20b5ed8d8b3efd68d0a5064c7a3244ee40)) 329 | 330 | 331 | ### Documentation 332 | 333 | * readme update ([2602b25](https://github.com/wayofdev/docker-shared-services/commit/2602b25ae99058d5b6aae317c2e2711a2a5dc720)) 334 | 335 | ## [1.2.0](https://github.com/wayofdev/docker-shared-services/compare/v1.1.2...v1.2.0) (2022-11-22) 336 | 337 | 338 | ### Features 339 | 340 | * add health checks for services ([87f6879](https://github.com/wayofdev/docker-shared-services/commit/87f68798d4f5723261bc48623986462b2f449d82)) 341 | * add labels and auto-sync ([76a505b](https://github.com/wayofdev/docker-shared-services/commit/76a505b610e9635ae6c838e4cd09c4e70eba3533)) 342 | 343 | 344 | ### Bug Fixes 345 | 346 | * not working health check ([34f75d8](https://github.com/wayofdev/docker-shared-services/commit/34f75d8b3b466579b61699cbeba1f87fb439dbdc)) 347 | * traefik config ([76a505b](https://github.com/wayofdev/docker-shared-services/commit/76a505b610e9635ae6c838e4cd09c4e70eba3533)) 348 | 349 | 350 | ### Documentation 351 | 352 | * changing default hosts ([9623fff](https://github.com/wayofdev/docker-shared-services/commit/9623fff2aeeefa3199286a64955ceed272001f4f)) 353 | 354 | 355 | ### Miscellaneous 356 | 357 | * fix table in docs ([219feab](https://github.com/wayofdev/docker-shared-services/commit/219feab37438d602e84be8e05ef6e033da37cbac)) 358 | 359 | ## [1.1.2](https://github.com/wayofdev/docker-shared-services/compare/v1.1.1...v1.1.2) (2022-11-14) 360 | 361 | 362 | ### Bug Fixes 363 | 364 | * remove quotes for domain namespace ([2ea50cb](https://github.com/wayofdev/docker-shared-services/commit/2ea50cb63f45848f87c003d0cd1229af3bf59029)) 365 | * remove quotes, as Makefile will add them as chars ([678f511](https://github.com/wayofdev/docker-shared-services/commit/678f511ae2fbb1bc26fcc3b039d15b41adfc9885)) 366 | 367 | 368 | ### Documentation 369 | 370 | * bold domains not showing as bold ([6c50c38](https://github.com/wayofdev/docker-shared-services/commit/6c50c380fcb8762cfea62f4662580de7bee2d2d0)) 371 | * formatting ([aeb897c](https://github.com/wayofdev/docker-shared-services/commit/aeb897ce4ecd8ecd7fc71b399120cc4e65bd3d2c)) 372 | 373 | ## [1.1.1](https://github.com/wayofdev/docker-shared-services/compare/v1.1.0...v1.1.1) (2022-11-11) 374 | 375 | 376 | ### Bug Fixes 377 | 378 | * network name should be underlined ([1c5a886](https://github.com/wayofdev/docker-shared-services/commit/1c5a88678fe17d5de193a9218ccb943c43fcdacb)) 379 | 380 | 381 | ### Documentation 382 | 383 | * more description ([39859af](https://github.com/wayofdev/docker-shared-services/commit/39859afe4b10c30de2f2a7d0f1f3f5d532a66dcd)) 384 | 385 | ## [1.1.0](https://github.com/wayofdev/docker-shared-services/compare/v1.0.0...v1.1.0) (2022-11-10) 386 | 387 | 388 | ### Features 389 | 390 | * fail-proof execution of project, if .env was not configured ([2144ce5](https://github.com/wayofdev/docker-shared-services/commit/2144ce505461befa8a02a79b1193b866a2b0633a)) 391 | * updating ([2144ce5](https://github.com/wayofdev/docker-shared-services/commit/2144ce505461befa8a02a79b1193b866a2b0633a)) 392 | 393 | 394 | ### Documentation 395 | 396 | * readme fix ([7f78d9e](https://github.com/wayofdev/docker-shared-services/commit/7f78d9e6e097102de8b0060c3946aa00fd855c89)) 397 | * steps to check if working ([f7b8378](https://github.com/wayofdev/docker-shared-services/commit/f7b8378b899b04c3b77701e1b205c2ff5c6df215)) 398 | 399 | ## 1.0.0 (2022-11-07) 400 | 401 | 402 | ### Features 403 | 404 | * initial repository commit ([ff862e6](https://github.com/wayofdev/docker-shared-services/commit/ff862e6571b4ff72cda0997b80683b01c04be922)) 405 | 406 | 407 | ### Documentation 408 | 409 | * no need for docker pulls label ([1955f2e](https://github.com/wayofdev/docker-shared-services/commit/1955f2e1e238fa6d3243a77c4a75fc8b176435b7)) 410 | * updating readme ([b9745d4](https://github.com/wayofdev/docker-shared-services/commit/b9745d491aa5a2199115ca6f91645460fbb3a26b)) 411 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 |
3 | 4 | 5 | 6 | WayOfDev Logo 7 | 8 | 9 |
10 |

11 | 12 |

13 | Build Status 14 | Latest Stable Version 15 | Software License 16 | Commits since latest release 17 | Discord Link 18 | Follow on Twitter (X) 19 |
20 |

21 | 22 | # Docker Shared Services 23 | 24 | This repository provides a Docker-powered local development environment for Dockerized projects, compatible with macOS and Linux. 25 | 26 | It includes a set of docker-compose files and [Træfik](https://traefik.io/) configuration with SSL support, backed by [mkcert](https://github.com/FiloSottile/mkcert), to enable running a local network with custom DNS provided by [dnsmasq](https://thekelleys.org.uk/dnsmasq/doc.html). This setup facilitates developing microservices locally with access outside the Docker network. 27 | 28 |
29 | 30 | ## 🗂️ Table of Contents 31 | 32 | - [Key Features](#-key-features) 33 | - [Purpose](#-purpose) 34 | - [Benefits for Team](#-benefits-for-team) 35 | - [Requirements](#-requirements) 36 | - [Quick Start Guide (macOS)](#-quick-start-guide-macos) 37 | - [Quick Start Guide (Linux)](#-quick-start-guide-linux) 38 | - [Connecting your Projects to Shared Services](#-connecting-your-projects-to-shared-services) 39 | - [Example: Spin-up Laravel Sail Project](#-example-spin-up-laravel-sail-project) 40 | - [Example: Want to See a Ready-Made Template?](#-example-want-to-see-a-ready-made-template) 41 | - [Security Policy](#-security-policy) 42 | - [Want to Contribute?](#-want-to-contribute) 43 | - [Contributors](#-contributors) 44 | - [Social Links](#-social-links) 45 | - [License](#-license) 46 | 47 |
48 | 49 | ## 🌟 Key Features 50 | 51 | - **Automated Local DNS and SSL Setup**: Eliminates manual edits to `/etc/hosts` and self-signed certificate warnings. 52 | - **Consistent Development Environment**: Uniform setup for all team members, reducing environment-related bugs. 53 | - **Elimination of Port Conflicts**: Traefik handles port management, allowing multiple dockerized projects to run concurrently. 54 | - **User-Friendly Local URLs**: Access projects via custom local domains like `project.docker` instead of `localhost:8000`. 55 | - **Simplified CORS and Cookie Management**: SSL support for local domains mirrors production settings. 56 | - **Enhanced Testing Environment**: Test OAuth, secure cookies, and HTTPS APIs locally. 57 | - **Improved Service Discovery and Routing**: Traefik automates service discovery and routing within your Docker network. 58 | - **Ease of Integration with Existing Projects**: Connect your existing Docker projects to this setup effortlessly. 59 | 60 |
61 | 62 | ## 🤔 Purpose 63 | 64 | ### → Simplifying Local Development 65 | 66 | This project simplifies local development by addressing common issues such as: 67 | 68 | - Frequent updates to the `/etc/hosts` file. 69 | - Requirement of administrative access for changes. 70 | - Lack of SSL support for custom domains. 71 | - Port conflicts when forwarding Docker service ports to the host machine. 72 | - Use of cumbersome hostnames like `localhost:8800` for local projects. 73 | - Complex CORS setup and Cookie configuration. 74 | 75 | For Linux and macOS users, dnsmasq eliminates the need to edit the hosts file for each project, providing a streamlined solution when used with Traefik, mkcert, and Docker. This repository configures Traefik to work with dnsmasq, offering a system-wide DNS solution for microservices and enabling DNS and SSL features with local domains. 76 | 77 |
78 | 79 | ## 👏 Benefits for Team 80 | 81 | ### → Enhance Development Workflow 82 | 83 | Integrating this Docker Shared Services project into your team's tech stack can significantly enhance your development workflow. This setup is compatible with a wide range of HTTP-based projects, including backend frameworks like Laravel, Symfony, or Spiral, frontend frameworks, and any other services that run in Docker and communicate over HTTP. 84 | 85 | By standardizing the local network setup across different machines, your team can: 86 | 87 | - Maintain consistency. 88 | - Reduce configuration work. 89 | - Resolve port conflicts between multiple Docker services. 90 | - Provide SSL support for local domains. 91 | - Work with CORS and Cookies in a scenario close to production. 92 | - Set up OAuth providers to work with custom local domains. 93 | 94 | This ensures smoother collaboration and boosts overall productivity. 95 | 96 |
97 | 98 | If you **like/use** this project, please consider ⭐️ **starring** it. Thanks! 99 | 100 |
101 | 102 | ## 🚩 Requirements 103 | 104 | - **macOS** Monterey+ or **Linux** 105 | - **Docker** 26.0 or newer 106 | - [How To Install and Use Docker on Ubuntu 22.04](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04) 107 | - [How To Install Docker Desktop on Mac](https://docs.docker.com/desktop/install/mac-install/) 108 | - Installed [mkcert](https://github.com/FiloSottile/mkcert) binary in system 109 | - See full installation instructions in their official [README.md](https://github.com/FiloSottile/mkcert) 110 | - Quick installation on macOS: `brew install mkcert nss` 111 | - ~~Installed and configured [dnsmasq](https://thekelleys.org.uk/dnsmasq/doc.html) daemon~~ 112 | - ~~Can be installed and configured automatically via our [ansible-role-dnsmasq](https://github.com/wayofdev/ansible-role-dnsmasq) ansible role~~ 113 | - [DNSMasq](https://thekelleys.org.uk/dnsmasq/doc.html) service now is shipped and configured with this repository. 114 | 115 |
116 | 117 | ## 💻 Quick Start Guide (macOS) 118 | 119 | 1. **Install Homebrew** (if not installed): 120 | 121 | If [Homebrew](https://brew.sh) is not already installed, run the following command: 122 | 123 | ```bash 124 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 125 | ``` 126 | 127 | 2. **Install Docker** (if not installed): 128 | 129 | Set up Docker Desktop via Homebrew: 130 | 131 | ```bash 132 | brew install --cask docker 133 | ``` 134 | 135 | 3. **Install `mkcert` and `nss`:** 136 | 137 | `mkcert` is a tool that creates locally-trusted development certificates, and `nss` provides support for mkcert certificates in Firefox. 138 | 139 | ```bash 140 | brew install mkcert nss 141 | ``` 142 | 143 | 4. **Create shared project directory:** 144 | 145 | This repository should be run once per machine, so let's create a shared directory for this project: 146 | 147 | ```bash 148 | mkdir -p ~/projects/infra && cd ~/projects/infra 149 | ``` 150 | 151 | 5. **Clone this repository:** 152 | 153 | ```bash 154 | git clone \ 155 | git@github.com:wayofdev/docker-shared-services.git \ 156 | ~/projects/infra/docker-shared-services && \ 157 | cd ~/projects/infra/docker-shared-services 158 | ``` 159 | 160 | 6. **Create `.env` file:** 161 | 162 | Generate a default `.env` file, which contains configuration settings for the project. 163 | 164 | ```bash 165 | make env 166 | ``` 167 | 168 | Open this file and read the notes inside to make any necessary changes to fit your setup. 169 | 170 | 7. **Install root certificate** and generate default project certs: 171 | 172 | This step installs the root certificate into your system's trust store and generates default SSL certificates for your local domains, which are listed in the `.env` file, under the variable `TLS_DOMAINS`. 173 | 174 | ```bash 175 | make cert-install 176 | ``` 177 | 178 | > [!WARNING] 179 | > 180 | > Currently, on macOS, you may need to enter your password several times to allow `mkcert` to install the root certificate. 181 | > **This is a one-time operation** and details can be found in this upstream GitHub [issue](https://github.com/FiloSottile/mkcert/issues/415). 182 | 183 | 8. **Run this project:** 184 | 185 | Start the Docker services defined in the repository. 186 | 187 | ```bash 188 | make up 189 | ``` 190 | 191 | 9. **Check that all Docker services are running:** 192 | 193 | Ensure Docker is running and services are up by using the `make ps` and `make logs` commands. 194 | 195 | ```bash 196 | make ps 197 | make logs 198 | ``` 199 | 200 | 10. **Add custom DNS resolver to your system:** 201 | 202 | This allows macOS to understand that `*.docker` domains should be resolved by a custom resolver via `127.0.0.1`, where our DNSMasq, which runs inside Docker, will handle all DNS requests. 203 | 204 | ```bash 205 | sudo sh -c 'echo "nameserver 127.0.0.1" > /etc/resolver/docker' 206 | sudo dscacheutil -flushcache 207 | sudo killall -HUP mDNSResponder 208 | ``` 209 | 210 | You can check that DNS was added by running: 211 | 212 | ```bash 213 | scutil --dns 214 | ``` 215 | 216 | Example output: 217 | 218 | ```bash 219 | resolver #8 220 | domain : docker 221 | nameserver[0] : 127.0.0.1 222 | flags : Request A records, Request AAAA records 223 | reach : 0x00030002 (Reachable,Local Address,Directly Reachable Address) 224 | ``` 225 | 226 | > [!NOTE] 227 | > 228 | > Instead of creating the `/etc/resolver/docker` file, you can add `127.0.0.1` to your macOS DNS Servers in your Ethernet or Wi-Fi settings. 229 | > 230 | > Go to **System Preferences → Network → Wi-Fi → Details → DNS** and add `127.0.0.1` as the first DNS server. 231 | > 232 | > This allows you to do it one time, and if you need to create a new local domain, for example `*.mac`, in the future, it will be automatically resolved without creating a separate `/etc/resolver/mac` file. 233 | 234 | 11. **Ping `router.docker` to check if DNS is working:** 235 | 236 | Ensure that the DNS setup is functioning correctly. 237 | 238 | ```bash 239 | ping router.docker -c 3 240 | ping any-domain.docker -c 3 241 | ``` 242 | 243 | 12. **Access Traefik dashboard:** 244 | 245 | Open [https://router.docker](https://router.docker). 246 | 247 | You should see the Traefik Dashboard: 248 | 249 | ![Traefik dashboard](.github/assets/traefik.png?raw=true "Traefik dashboard example") 250 | 251 | ### → Outcome 252 | 253 | At this point, you should have a working local development environment with DNS and SSL support ready to be used with your projects. 254 | 255 | Services will be running under a shared Docker network called `network.ss`, and all projects or microservices that will share the same [Docker network](https://docs.docker.com/network/) will be visible to Traefik. The local DNS, served by DNSMasq, will be available on `*.docker` domains. 256 | 257 |
258 | 259 | ## 🐧 Quick Start Guide (Linux) 260 | 261 | In this section, we'll walk through setting up the `docker-shared-services` project on an Ubuntu distribution. While the steps are specific to Ubuntu, they should be adaptable to other Linux distributions with minor modifications. 262 | 263 | 1. **Install Docker:** 264 | Easiest and quickest way to get started is to [install Docker Desktop for Linux](https://docs.docker.com/desktop/install/linux-install/#generic-installation-steps). 265 | 266 | - [Install Docker Desktop on Ubuntu](https://docs.docker.com/desktop/install/ubuntu/) 267 | 268 | 2. **Install `certutil`:** 269 | 270 | ```bash 271 | sudo apt update 272 | sudo apt install libnss3-tools 273 | ``` 274 | 275 | 3. **Install `mkcert`:** 276 | 277 | ```bash 278 | curl -JLO "https://dl.filippo.io/mkcert/latest?for=linux/amd64" 279 | chmod +x mkcert-v*-linux-amd64 280 | sudo cp mkcert-v*-linux-amd64 /usr/local/bin/mkcert 281 | ``` 282 | 283 | More detailed instructions can be found in the [`mkcert README.md`](https://github.com/FiloSottile/mkcert?tab=readme-ov-file#linux). 284 | 285 | 4. **Create shared project directory:** 286 | 287 | ```bash 288 | mkdir -p ~/projects/infra && cd ~/projects/infra 289 | ``` 290 | 291 | 5. **Clone this repository:** 292 | 293 | ```bash 294 | git clone \ 295 | git@github.com:wayofdev/docker-shared-services.git \ 296 | ~/projects/infra/docker-shared-services && \ 297 | cd ~/projects/infra/docker-shared-services 298 | ``` 299 | 300 | 6. **Create `.env` file:** 301 | 302 | Generate a default `.env` file, which contains configuration settings for the project. 303 | 304 | ```bash 305 | make env 306 | ``` 307 | 308 | Open this file and read the notes inside to make any necessary changes to fit your setup. 309 | 310 | 7. **Install root certificate** and generate default project certs: 311 | 312 | ```bash 313 | make cert-install 314 | ``` 315 | 316 | 8. **Disable stub DNS listener:** 317 | 318 | To prevent conflicts with the DNSMasq service, disable the stub DNS listener in the `systemd-resolved` service. 319 | 320 | ```bash 321 | sudo sed -i 's/#DNSStubListener=yes/DNSStubListener=no/' /etc/systemd/resolved.conf 322 | sudo systemctl restart systemd-resolved 323 | ``` 324 | 325 | 9. **Edit /etc/resolv.conf:** 326 | 327 | Update the `/etc/resolv.conf` file to use the local DNS server. 328 | 329 | ```bash 330 | echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf > /dev/null 331 | ``` 332 | 333 | Editing `/etc/resolv.conf` directly is not recommended for persistent changes since it is often managed by other services (like Netplan or NetworkManager). However, for a temporary change, you can use: 334 | 335 | 10. **Run this project:** 336 | 337 | Start the Docker services defined in the repository. 338 | 339 | ```bash 340 | make up 341 | ``` 342 | 343 | 11. **Check that all Docker services are running:** 344 | 345 | Ensure Docker is running and services are up by using the `make ps` and `make logs` commands. 346 | 347 | ```bash 348 | make ps 349 | make logs 350 | ``` 351 | 352 | 12. **Ping `router.docker` to check if DNS is working:** 353 | 354 | Ensure that the DNS setup is functioning correctly. 355 | 356 | ```bash 357 | ping router.docker -c 3 358 | ping any-domain.docker -c 3 359 | ``` 360 | 361 | 13. **Access Traefik dashboard:** 362 | 363 | Open [https://router.docker](https://router.docker). 364 | 365 | You should see the Traefik Dashboard: 366 | 367 | ![Traefik dashboard](.github/assets/traefik.png?raw=true "Traefik dashboard example") 368 | 369 | ### → Outcome 370 | 371 | At this point, you should have a working local development environment with DNS and SSL support ready to be used with your projects. 372 | 373 | Services will be running under a shared Docker network called `network.ss`, and all projects or microservices that will share the same [Docker network](https://docs.docker.com/network/) will be visible to Traefik. The local DNS, served by DNSMasq, will be available on `*.docker` domains. 374 | 375 |
376 | 377 | ## 🔌 Connecting your Projects to Shared Services 378 | 379 | To connect your projects to the shared services, configure your project's `docker-compose.yaml` file to connect to the shared network and Traefik. 380 | 381 | This project comes with an example Portainer service, which also starts by default with the `make up` command. You can check the [`docker-compose.yaml`](https://github.com/wayofdev/docker-shared-services/blob/master/docker-compose.yaml) to see how Traefik labels and the shared network are used to spin up Portainer on the host, which supports SSL by default. 382 | 383 | ### → Sample Configuration 384 | 385 | Your project should use the shared Docker network `network.ss` and Traefik labels to expose services to the outside world. 386 | 387 | 1. **Change your project's `docker-compose.yaml` file:** 388 | 389 | ```diff 390 | --- 391 | 392 | services: 393 | web: 394 | image: wayofdev/nginx:k8s-alpine-latest 395 | restart: on-failure 396 | + networks: 397 | + - default 398 | + - shared 399 | volumes: 400 | - ./app:/app:rw,cached 401 | + labels: 402 | + - traefik.enable=true 403 | + - traefik.http.routers.api-my-project-secure.rule=Host(`api.my-project.docker`) 404 | + - traefik.http.routers.api-my-project-secure.entrypoints=websecure 405 | + - traefik.http.routers.api-my-project-secure.tls=true 406 | + - traefik.http.services.api-my-project-secure.loadbalancer.server.port=8880 407 | + - traefik.docker.network=network.ss 408 | 409 | networks: 410 | + shared: 411 | + external: true 412 | + name: network.ss 413 | + default: 414 | + name: project.my-project 415 | ``` 416 | 417 | In this configuration, we added the shared network and Traefik labels to the web service. These labels help Traefik route the traffic to the service based on the specified rules. 418 | 419 | Replace `my-project` with your preferred project name. 420 | 421 | 2. **Generate SSL certs for your project:** 422 | 423 | Go to the `docker-shared-services` directory: 424 | 425 | ```bash 426 | cd ~/projects/infra/docker-shared-services 427 | ``` 428 | 429 | Edit the `.env` file to add your custom domain: 430 | 431 | ```bash 432 | nano .env 433 | ``` 434 | 435 | Add `*.my-project.docker` to end of `TLS_DOMAINS` variable: 436 | 437 | ```bash 438 | TLS_DOMAINS="ui.docker router.docker *.my-project.docker" 439 | ``` 440 | 441 | Generate SSL certificates and reload `docker-shared-services`: 442 | 443 | ```bash 444 | make cert-install restart 445 | ``` 446 | 447 |
448 | 449 | ## 🚀 Example: Spin-up Laravel Sail Project 450 | 451 | Let's walk through an example of setting up a Laravel project using Sail and integrating it with the `docker-shared-services`. 452 | 453 | 1. Create an example Laravel project based on Sail: 454 | 455 | ```bash 456 | curl -s "https://laravel.build/example-app" | bash 457 | ``` 458 | 459 | 2. Open the `docker-compose.yaml` file of the `example-app` project and make adjustments: 460 | 461 | ```diff 462 | services: 463 | laravel.test: 464 | build: 465 | context: ./vendor/laravel/sail/runtimes/8.3 466 | dockerfile: Dockerfile 467 | args: 468 | WWWGROUP: '${WWWGROUP}' 469 | image: sail-8.3/app 470 | - extra_hosts: 471 | - - 'host.docker.internal:host-gateway' 472 | ports: 473 | - - '${APP_PORT:-80}:80' 474 | - - '${VITE_PORT:-5173}:${VITE_PORT:-5173}' 475 | networks: 476 | - sail 477 | + - shared 478 | depends_on: 479 | - ... 480 | + labels: 481 | + - traefik.enable=true 482 | + - traefik.http.routers.test-laravel-app-secure.rule=Host(`api.laravel-app.docker`) 483 | + - traefik.http.routers.test-laravel-app-secure.entrypoints=websecure 484 | + - traefik.http.routers.test-laravel-app-secure.tls=true 485 | + - traefik.http.services.test-laravel-app-secure.loadbalancer.server.port=80 486 | + - traefik.docker.network=network.ss 487 | 488 | mailpit: 489 | image: 'axllent/mailpit:latest' 490 | networks: 491 | - sail 492 | + - shared 493 | ports: 494 | - - '${FORWARD_MAILPIT_PORT:-1025}:1025' 495 | - - '${FORWARD_MAILPIT_DASHBOARD_PORT:-8025}:8025' 496 | + labels: 497 | + - traefik.enable=true 498 | + - traefik.http.routers.mail-laravel-app-secure.rule=Host(`mail.laravel-app.docker`) 499 | + - traefik.http.routers.mail-laravel-app-secure.entrypoints=websecure 500 | + - traefik.http.routers.mail-laravel-app-secure.tls=true 501 | + - traefik.http.services.mail-laravel-app-secure.loadbalancer.server.port=8025 502 | + - traefik.docker.network=network.ss 503 | 504 | networks: 505 | sail: 506 | driver: bridge 507 | + shared: 508 | + external: true 509 | + name: network.ss 510 | ``` 511 | 512 | These changes connect the Laravel app and Mailpit docker services to the shared network and expose them via Traefik. 513 | 514 | 3. **Run the Laravel project:** 515 | 516 | Navigate to the `example-app` directory and start the services using Sail. 517 | 518 | ```bash 519 | ./vendor/bin/sail up -d 520 | ``` 521 | 522 | 4. **Check Traefik routers**: 523 | 524 | Open and check that there are two routers: 525 | 526 | - `Host(api.laravel-app.docker)` → `test-laravel-app-secure@docker` 527 | - `Host(mail.laravel-app.docker)` → `mail-laravel-app-secure@docker` 528 | 529 | ![Traefik Routers](.github/assets/traefik-routers.png?raw=true "Traefik Routers Example") 530 | 531 | 5. **Check the setup**: 532 | 533 | Ensure that your Laravel application and Mailpit services are running correctly by accessing their respective domains: 534 | 535 | - **Laravel app** — [https://api.laravel-app.docker](https://api.laravel-app.docker/) 536 | - **Mailpit** — [https://mail.laravel-app.docker](https://mail.laravel-app.docker/) 537 | 538 | At this point, your Laravel project is integrated with the `wayofdev/docker-shared-services`, utilizing DNS and SSL support for local development. 539 | 540 |
541 | 542 | ## 👀 Example: Want to See a Ready-Made Template? 543 | 544 | If you come from the PHP or Laravel world, or if you want to see how a complete project can be integrated with `docker-shared-services`, check out [wayofdev/laravel-starter-tpl](https://github.com/wayofdev/laravel-starter-tpl). 545 | 546 | This Dockerized Laravel starter template works seamlessly with [wayofdev/docker-shared-services](https://github.com/wayofdev/docker-shared-services), providing a foundation with integrated DNS and SSL support, and can show you `the way` to implement patterns, stated in this article, in your projects. 547 | 548 |
549 | 550 | ## 🔒 Security Policy 551 | 552 | This project has a [security policy](.github/SECURITY.md). 553 | 554 |
555 | 556 | ## 🙌 Want to Contribute? 557 | 558 | Thank you for considering contributing to the wayofdev community! We are open to all kinds of contributions. If you want to: 559 | 560 | - 🤔 [Suggest a feature](https://github.com/wayofdev/docker-shared-services/issues/new?assignees=&labels=type%3A+enhancement&projects=&template=2-feature-request.yml&title=%5BFeature%5D%3A+) 561 | - 🐛 [Report an issue](https://github.com/wayofdev/docker-shared-services/issues/new?assignees=&labels=type%3A+documentation%2Ctype%3A+maintenance&projects=&template=1-bug-report.yml&title=%5BBug%5D%3A+) 562 | - 📖 [Improve documentation](https://github.com/wayofdev/docker-shared-services/issues/new?assignees=&labels=type%3A+documentation%2Ctype%3A+maintenance&projects=&template=4-docs-bug-report.yml&title=%5BDocs%5D%3A+) 563 | - 👨‍💻 Contribute to the code 564 | 565 | You are more than welcome. Before contributing, kindly check our [contribution guidelines](.github/CONTRIBUTING.md). 566 | 567 | [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg?style=for-the-badge)](https://conventionalcommits.org) 568 | 569 |
570 | 571 | ## 🫡 Contributors 572 | 573 |

574 | 575 | Contributors Badge 576 | 577 |
578 |
579 |

580 | 581 | ## 🌐 Social Links 582 | 583 | - **Twitter:** Follow our organization [@wayofdev](https://twitter.com/intent/follow?screen_name=wayofdev) and the author [@wlotyp](https://twitter.com/intent/follow?screen_name=wlotyp). 584 | - **Discord:** Join our community on [Discord](https://discord.gg/CE3TcCC5vr). 585 | 586 |
587 | 588 | ## 📄 License 589 | 590 | [![Licence](https://img.shields.io/github/license/wayofdev/docker-shared-services?style=for-the-badge&color=blue)](./LICENSE.md) 591 | 592 |
593 | --------------------------------------------------------------------------------