From be16da351097a34281c1987b3083f84679e31625 Mon Sep 17 00:00:00 2001 From: Damien Robinson Date: Wed, 24 Jan 2024 14:14:24 +1000 Subject: [PATCH] feat: add spin --- .dockerignore | 3 + .github/workflows/README.md | 17 +++ .../workflows/action_deploy-production.yml | 64 +++++++++ .../service_docker-build-and-publish.yml | 73 +++++++++++ .gitignore | 1 + .../conf/spin/collections/.gitignore | 2 + .../dev/certificates/local-dev-key.pem | 51 +++++++ .../traefik/dev/certificates/local-dev.pem | 38 ++++++ .../conf/traefik/dev/traefik-certs.yml | 11 ++ .infrastructure/conf/traefik/dev/traefik.yml | 30 +++++ .infrastructure/conf/traefik/prod/traefik.yml | 70 ++++++++++ .infrastructure/volume_data/.gitignore | 2 + .spin-inventory.ini | 30 +++++ .spin.yml | 118 +++++++++++++++++ Dockerfile | 15 +++ composer.json | 1 + composer.lock | 47 ++++++- docker-compose.ci.yml | 37 ++++++ docker-compose.dev.yml | 75 +++++++++++ docker-compose.prod.yml | 124 ++++++++++++++++-- docker-compose.yml | 115 +++------------- 21 files changed, 812 insertions(+), 112 deletions(-) create mode 100644 .dockerignore create mode 100644 .github/workflows/README.md create mode 100644 .github/workflows/action_deploy-production.yml create mode 100644 .github/workflows/service_docker-build-and-publish.yml create mode 100644 .infrastructure/conf/spin/collections/.gitignore create mode 100644 .infrastructure/conf/traefik/dev/certificates/local-dev-key.pem create mode 100644 .infrastructure/conf/traefik/dev/certificates/local-dev.pem create mode 100644 .infrastructure/conf/traefik/dev/traefik-certs.yml create mode 100644 .infrastructure/conf/traefik/dev/traefik.yml create mode 100644 .infrastructure/conf/traefik/prod/traefik.yml create mode 100644 .infrastructure/volume_data/.gitignore create mode 100644 .spin-inventory.ini create mode 100644 .spin.yml create mode 100644 Dockerfile create mode 100644 docker-compose.ci.yml create mode 100644 docker-compose.dev.yml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..348934c0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +.infrastructure +.github +.gitlab-ci.yml diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 00000000..2e10fb86 --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,17 @@ +# Spin GitHub Actions Workflow Checklist +> [!WARNING] +> 🤠 Hey Partner, there's some manual steps you need to take care of before you'll get success with these workflows. + +# 🚨 WARNING: You must set the following secrets in GitHub: + +- DEPLOYMENT_SSH_PRIVATE_KEY +- DEPLOYMENT_SSH_HOSTNAME +- DB_ROOT_PASSWORD +- DB_NAME +- DB_USERNAME +- DB_PASSWORD +- ENV_FILE_BASE64 + +Ensure these secrets match the environment you're deploying to. +https://github.com///settings/environments + diff --git a/.github/workflows/action_deploy-production.yml b/.github/workflows/action_deploy-production.yml new file mode 100644 index 00000000..a937469d --- /dev/null +++ b/.github/workflows/action_deploy-production.yml @@ -0,0 +1,64 @@ +name: Production Deployment +on: + release: + types: + - released + +######################################################################## +# 🚨 WARNING: You must set the following secrets in GitHub: +# +# - DEPLOYMENT_SSH_PRIVATE_KEY +# - DEPLOYMENT_SSH_HOSTNAME +# - DB_ROOT_PASSWORD +# - DB_NAME +# - DB_USERNAME +# - DB_PASSWORD +# - ENV_FILE_BASE64 +# +# Ensure these secrets match the environment you're deploying to. +# https://github.com///settings/environments +######################################################################## + +# 👇 Set these variables to match your application needs. Most of them should work great by default. +env: + DEPLOYMENT_URL_HOSTNAME: api.daim.dev + DEPLOYMENT_URL: https://api.daim.dev + +jobs: + build: + uses: ./.github/workflows/service_docker-build-and-publish.yml + with: + # 👇 Ensure these are the tags you want to publish to your registry. + docker-tags: ghcr.io/${{ github.repository }}:${{ github.ref_name }},ghcr.io/${{ github.repository }}:latest + environment: production # 👈 Make sure you created this environment in GitHub with the secrets above. + secrets: inherit + + deploy: + needs: build + runs-on: ubuntu-22.04 + environment: + name: production # 👈 Make sure you created this environment in GitHub with the secrets above. + url: "${{ env.DEPLOYMENT_URL }}" + steps: + + - name: Get project name from repository name. + run: | + echo "PROJECT_NAME=${GITHUB_REPOSITORY#*/}" >> $GITHUB_ENV + + - uses: serversideup/github-action-docker-swarm-deploy@v1 + with: + # 👇 Ensure these are correct and that you've set the appropriate secrets. + deployment_ssh_private_key: "${{ secrets.DEPLOYMENT_SSH_PRIVATE_KEY }}" + remote_ssh_server_hostname: "${{ secrets.DEPLOYMENT_SSH_HOSTNAME }}" + registry: "ghcr.io" + registry-username: "${{ github.actor }}" + registry-token: "${{ secrets.GITHUB_TOKEN }}" + stack_name: "${{ env.PROJECT_NAME }}" + env: + # 👇 Ensure this makes sense for your application. + TRAEFIK_HOST_RULE: "Host(`${{ env.DEPLOYMENT_URL_HOSTNAME }}`)" + DB_ROOT_PASSWORD: "${{ secrets.DB_ROOT_PASSWORD }}" + DB_NAME: "${{ secrets.DB_NAME }}" + DB_USERNAME: "${{ secrets.DB_USERNAME }}" + DB_PASSWORD: "${{ secrets.DB_PASSWORD }}" + DEPLOYMENT_IMAGE_PHP: "ghcr.io/${{ github.repository }}:${{ github.ref_name }}" \ No newline at end of file diff --git a/.github/workflows/service_docker-build-and-publish.yml b/.github/workflows/service_docker-build-and-publish.yml new file mode 100644 index 00000000..42bdd90c --- /dev/null +++ b/.github/workflows/service_docker-build-and-publish.yml @@ -0,0 +1,73 @@ +on: + workflow_call: + inputs: + platforms: + type: string + default: 'linux/amd64' + docker-tags: + required: true + type: string + dockerfile: + type: string + default: './Dockerfile' + target: + type: string + default: '' + environment: + type: string + required: true + +env: + DOCKER_COMPOSE_CMD: docker compose -f docker-compose.yml -f docker-compose.ci.yml + +jobs: + docker-publish: + runs-on: ubuntu-22.04 + environment: + name: ${{ inputs.environment }} + steps: + + - name: Checkout + uses: actions/checkout@v4 + + - name: Restore composer cache (if available) + id: composer-vendor-restore + uses: actions/cache/restore@v3 + with: + path: vendor/ + key: ${{ runner.os }}-composer-vendor-${{ hashFiles('composer.lock') }} + + - if: ${{ steps.composer-vendor-restore.outputs.cache-hit != 'true' }} + name: List the composer packages + continue-on-error: true + run: | + $DOCKER_COMPOSE_CMD \ + run \ + php \ + composer show --locked + + - if: ${{ steps.composer-vendor-restore.outputs.cache-hit != 'true' }} + name: Install Composer dependencies + run: | + $DOCKER_COMPOSE_CMD \ + run \ + php \ + composer install --optimize-autoloader --no-interaction --no-progress --no-ansi + + - name: Set env file + run: | + echo $BASE_64_SECRET | base64 -d > .env + chmod 600 .env + env: + BASE_64_SECRET: ${{ secrets.ENV_FILE_BASE64 }} + + - name: docker-build-action + uses: serversideup/github-action-docker-build@v5 + with: + tags: "${{ inputs.docker-tags }}" + dockerfile: "${{ inputs.dockerfile }}" + registry: "ghcr.io" + registry-username: "${{ github.actor }}" + registry-token: "${{ secrets.GITHUB_TOKEN }}" + platforms: "${{ inputs.platforms }}" + target: "${{ inputs.target }}" \ No newline at end of file diff --git a/.gitignore b/.gitignore index 8af42cd1..e3540178 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ yarn-error.log /public/css /public/build /public/mix-manifest.json +.vault-password diff --git a/.infrastructure/conf/spin/collections/.gitignore b/.infrastructure/conf/spin/collections/.gitignore new file mode 100644 index 00000000..c96a04f0 --- /dev/null +++ b/.infrastructure/conf/spin/collections/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/.infrastructure/conf/traefik/dev/certificates/local-dev-key.pem b/.infrastructure/conf/traefik/dev/certificates/local-dev-key.pem new file mode 100644 index 00000000..c3ac81de --- /dev/null +++ b/.infrastructure/conf/traefik/dev/certificates/local-dev-key.pem @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/.infrastructure/conf/traefik/dev/certificates/local-dev.pem b/.infrastructure/conf/traefik/dev/certificates/local-dev.pem new file mode 100644 index 00000000..78bd0db6 --- /dev/null +++ b/.infrastructure/conf/traefik/dev/certificates/local-dev.pem @@ -0,0 +1,38 @@ +-----BEGIN CERTIFICATE----- +MIIGkjCCBHqgAwIBAgIUKttFImgEG9cO56DRD/WAJQKHIAswDQYJKoZIhvcNAQEN +BQAwezELMAkGA1UEBhMCVVMxEjAQBgNVBAgTCVdpc2NvbnNpbjESMBAGA1UEBxMJ +TWlsd2F1a2VlMRcwFQYDVQQKEw5TZXJ2ZXIgU2lkZSBVcDEPMA0GA1UECxMGRGV2 +T3BzMRowGAYDVQQDExFTZXJ2ZXIgU2lkZSBVcCBDQTAeFw0yMzExMDkwMTAzMDBa +Fw00MzExMDQwMTAzMDBaMHQxCzAJBgNVBAYTAlVTMRIwEAYDVQQIEwlXaXNjb25z +aW4xEjAQBgNVBAcTCU1pbHdhdWtlZTEXMBUGA1UEChMOU2VydmVyIFNpZGUgVXAx +DzANBgNVBAsTBkRldk9wczETMBEGA1UEAwwKKi5kZXYudGVzdDCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMw+LRIDAzZqiTKn1tSnEe7CGp/vM9yfn1kS +GERJJNuFG2kM16H93WGMz87ZlYe2ouDYQJyPzH8z5SXTxVYD7xhDtEwws/RpoTXR +Zl0Imf3Q0H0fG+acv5nYjQarGFgwZY/iOSqzKhPqVYg6Cji8VWV6PpRAnNigms/0 +TiYI+29vfgDqOYf2/0c0p5kCRrggAF/liIout091QNxpM25yhozGj1U1T0qZi4ZK +batbe5GGpt6fW5Q8PqNwc0CpexrXSy3CqcWAcH7BosggmLuaI6hnitHpyTQ2bX8j +/JOoXiv56Xql6EHFoi1ccF1alKswkrdPC+RfLvtrTmy1ujWdm5lj1JmUlzQuKiY4 +5YK8K5ZZAyRvktyzyWFvlWc702BXHxO39ZoiwWul9+xdN4bZ4ZS8exKdRBHzV5YT +4al/ngPOyKOn8get7nZigyYg8ha2Eu0HM+FixUh6JO4u2PBV9JmnnUcnvLqQXqeG +vaj+oaHbQM5KpwKCUKlLYIYCRT4euWd5gBVd3+GID6cY5GDza6Z2FKPk7Rhk23h+ +sCzEL/dWaAOh0IJQvPMBFMjvFfYZbteph79Z/33LAPYrT/T6/YE+DKYQZjwQ2LTV +GHxsTE05AIRpU8N0MzVqRtwFmgVmXaE3ThwosxRk7P3SXJSCbeIGfe1z429aFij3 +OTJi15VlAgMBAAGjggETMIIBDzAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYI +KwYBBQUHAwEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU+njyDOLRRQQPlzgAq38z +Ug209jMwHwYDVR0jBBgwFoAUNZc4wBBAJBUFKQnjiV4tknKqGPUwgZkGA1UdEQSB +kTCBjoIKKi5kZXYudGVzdIILKi5naXRwb2QuaW+CCioubmdyb2suaW+CECoubG9j +YWx0dW5uZWwubWWCDCouc2VydmVvLm5ldIIJKi5sb2NhLmx0gggqLm5pcC5pb4IK +Ki5zc2xpcC5pb4IIKi54aXAuaW+CDioudHVubmVsdG8uZGV2ggwqLmlubGV0cy5k +ZXYwDQYJKoZIhvcNAQENBQADggIBABP+PX9/Fu2kLuk1MuTs1vcAluf52i11XAPt +QpeWCqS4lTu8P//8VPVcjdfWnqZP2xoQYS2yvMvcs6ec8Lwz7cds5NmIj5QBTRwV +avi1J5IO62lEX6qLIUFpJFP29xtyMHZxBA/gcPeRZjcaE5CRBemUzrjSsVFr9TWl +VcrNkGnw9MWvMuozesMWQbT4PC9kBb5Kh8mCi1uEFxRrlt1Jc7VtCQkINMNOoxty +FYVZyd4rQtPSglFFuLrhI0wtrv1lGjiHNemipDI5TKb9swgIpqtNhXbe0vMtOHKC +21+VHFSVRRvGRwklsGkCTC6FYnHSOVRVs9DQr8XP2sbjO6fIhlWvgt1AajYIzvfO +9YNOsrnVeSEZrdVD8kkVL15iQewpLtgxQdm6lXedK0SNSTqWAT8+FBNKyt8FLQPv +Owd68TCPNP7KUxwZHEeHfSn6BPdAgWhSNBLTPrwupQb9AdnQzvNA6seT4yKhI2Zj +V7XPY92M99t6Ac7yimcT8zQQCVbNKZuFTHxb5FxQ7LWRyUK7+WlWPwLWzpU8fAlD +KmLNIBn1HURVWDtECBpHb9ZjMh02EAea+wzpPNKiW/4+npBf6di7vUeFQs+dbB7J +f1gR970Cmsaec3ZVOPdlcuJckNwBcvTSc07tDu5vP1nZlgp99IFVP/CQz48rVJTZ +2lhEyLbm +-----END CERTIFICATE----- diff --git a/.infrastructure/conf/traefik/dev/traefik-certs.yml b/.infrastructure/conf/traefik/dev/traefik-certs.yml new file mode 100644 index 00000000..d77709a6 --- /dev/null +++ b/.infrastructure/conf/traefik/dev/traefik-certs.yml @@ -0,0 +1,11 @@ +tls: + stores: + default: + defaultCertificate: + certFile: /certificates/local-dev.pem + keyFile: /certificates/local-dev-key.pem + certificates: + - certFile: /certificates/local-dev.pem + keyFile: /certificates/local-dev-key.pem + stores: + - default \ No newline at end of file diff --git a/.infrastructure/conf/traefik/dev/traefik.yml b/.infrastructure/conf/traefik/dev/traefik.yml new file mode 100644 index 00000000..219e1a91 --- /dev/null +++ b/.infrastructure/conf/traefik/dev/traefik.yml @@ -0,0 +1,30 @@ +# Allow self-signed certificates +serversTransport: + insecureSkipVerify: true + +providers: + docker: + network: development + exposedbydefault: false + file: + filename: /traefik-certs.yml + watch: true +entryPoints: + web: + address: ":80" + http: + redirections: + entrypoint: + to: websecure + scheme: https + + websecure: + address: ":443" + +accessLog: {} +log: + level: ERROR + +api: + dashboard: true + insecure: true \ No newline at end of file diff --git a/.infrastructure/conf/traefik/prod/traefik.yml b/.infrastructure/conf/traefik/prod/traefik.yml new file mode 100644 index 00000000..508ff727 --- /dev/null +++ b/.infrastructure/conf/traefik/prod/traefik.yml @@ -0,0 +1,70 @@ +# Cloudflare TrustedIPs +x-trustedIps: &trustedIPs + - "173.245.48.0/20" + - "103.21.244.0/22" + - "103.22.200.0/22" + - "103.31.4.0/22" + - "141.101.64.0/18" + - "108.162.192.0/18" + - "190.93.240.0/20" + - "188.114.96.0/20" + - "197.234.240.0/22" + - "198.41.128.0/17" + - "162.158.0.0/15" + - "104.16.0.0/13" + - "104.24.0.0/14" + - "172.64.0.0/13" + - "131.0.72.0/22" + - "2400:cb00::/32" + - "2606:4700::/32" + - "2803:f800::/32" + - "2405:b500::/32" + - "2405:8100::/32" + - "2a06:98c0::/29" + - "2c0f:f248::/32" + +# Allow self-signed certificates +serversTransport: + insecureSkipVerify: true + +providers: + docker: + network: web-public + exposedbydefault: false + swarmMode: true + +entryPoints: + web: + address: ":80" + http: + redirections: + entrypoint: + to: websecure + scheme: https + forwardedHeaders: + trustedIPs: *trustedIPs + proxyProtocol: + trustedIPs: *trustedIPs + + websecure: + address: ":443" + forwardedHeaders: + trustedIPs: *trustedIPs + proxyProtocol: + trustedIPs: *trustedIPs + +accessLog: {} +log: + level: ERROR + +api: + dashboard: true + insecure: true + +certificatesResolvers: + letsencryptresolver: + acme: + email: "changeme@example.com" + storage: "/certificates/acme.json" + httpChallenge: + entryPoint: web diff --git a/.infrastructure/volume_data/.gitignore b/.infrastructure/volume_data/.gitignore new file mode 100644 index 00000000..c96a04f0 --- /dev/null +++ b/.infrastructure/volume_data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/.spin-inventory.ini b/.spin-inventory.ini new file mode 100644 index 00000000..bc706b10 --- /dev/null +++ b/.spin-inventory.ini @@ -0,0 +1,30 @@ +$ANSIBLE_VAULT;1.1;AES256 +31306530336563333765663561386538623663623762656130393666386431653934386261313535 +3932363834346265623838346237613732333765363665610a383338623365363730363066633666 +33346133613033616330316265623930346534326534323166393934653264353563373633373734 +6664343164663634660a643961313936336138313564313363666635313930343535636664383237 +61386166336636376466306136366263643162373730613633393730616135666636306262646230 +35653033343863306136663362303432626439653863393232353735343338343431356364396334 +34626137643434643139333336316534343837313730653465613661623262363736303336393662 +39613038613639626365666535623466333464346135313432383130353837356266343362333665 +65333136653639316436626131303963653963336536373733323930333334373263366561323930 +34613731333638626339393765316437326335353036623430336137303262663233353161363631 +36366331356435343634363039623633613435393062666665653661616230373432643463393131 +62383862343462636435633734386665656238373366346263393630323465323137643536366465 +32396162663838353064633662643766363434306165396266616132626663653063626162333936 +36323239383564616137633933303264393366653437623833633931353030353365656533653664 +38623838333632393033633737323438346262393565366132333731336462333761616337376231 +33386231316663383734616531636165616464366235316666393635346239666133326531396134 +35666161396537396139653865373236396236666130626261333439323963323661643061393930 +61613331383461626165363466646362653039653865353264343934643665663839343262643135 +62393663346431346233346135383030383563646630383037636630316661306239373930396237 +35653035623330326131613465663836316434313130643863396636633934323431646330383865 +66623633383434326537353663663961636566633832633062616437663436323164313331626462 +31386131353031313063633163346430626335336334653666306538663137316637323663376466 +36663935616163306466313432656239333765326536636131346438646635373563633163333735 +32653361353364323965393735373637343963396334333837383463663337306263313836376632 +30376135366430613463613661356561613238663565306437613036366633336636656237323631 +33323532343635616461326439316661316666333665383036666437323232623465646437616133 +31633432303764316634333835616139636136363266653337663764386530316435373735323463 +35363335313432356331373534373062376465656434626135646339326434303235396537373163 +3736 diff --git a/.spin.yml b/.spin.yml new file mode 100644 index 00000000..dc17973c --- /dev/null +++ b/.spin.yml @@ -0,0 +1,118 @@ +$ANSIBLE_VAULT;1.1;AES256 +36323463613666656265336166373430633238666338396361323235373666663336396664646532 +3961633731663539373033396266333534343231356131650a323632333261366631323934666463 +66373566353031613930623736616432636261386564653434323065633765353133613237663038 +6337303734333535650a336161656665646433333262353834343436306631336363306237653634 +38393735623133336336353464666661386661663731636564333065313630396332383363346433 +39616137626132303832613631383962343664396538656436653564623062373165633562633439 +39373663336663373936653839316635613134303435366636616364323932303761393365353564 +35616634643065666466663064643838623332396364356532373763393738623232303539316633 +34303138386439343763666562616364393465623731396265623936396430373130386635653562 +39323864643862346434326637333538343335373535333838386433356636346666393263383537 +33366232316363346637643035323431616533653734616331313362613366396239626364336461 +37653530666565346266633736626233383665353164343466373965363330666334623565323933 +33306666636361353138313863313161373863353763373139353233623662383339646662646238 +63653865316665373063666635396462373836623166323439653137326533313462623236323632 +37393663353436373964343439346237393065303838316633383237636464363530396266373264 +63643934373239613431393562616665633534336462343232336364376161326330323566376534 +61383531653938653366396437326462303962343364623635303733363366306365326361613961 +30313765633339353462373862313464373339313662386133386565616163623565363031353962 +37333434633735643533393366366335656638383964653661333936323630343938633536646338 +30346335333563303735323033643762613936623837363465346536373832393566663733363338 +30363166336536366433323436383031363437333732353630633464343939323931323933366263 +33343761656137303335386338326536643131356538623462306666373262346130613666363034 +64373566386637366565663737323731613866323538363633313462666561313733366563376632 +66396131653336336364616633396330393161313434323764653832353764626331653532396363 +35643331316632353634313138356562393833653030366637346162353132336439316563613063 +35303733333163366535666230346135393332363230363732386663313939663933343061613733 +37303033306435343234346132626535306362313133303864363336383430633563353766366537 +65643536326437393465616639396364666237636366306166666462653864663030303537666233 +39353438363636343934623937323936626431313134663534633939643033313163323533316532 +33663865666538333761636566666338353661656239313230373765643937313032373233613965 +61633233633266383666353139623137663637356362333863366635663637623665656430333537 +34346537316664633032616237376232623036613665326639316361653032653432343836613736 +62653635353163323733333735346261643265666332616665336134393433663665363332323461 +38616530353034646136653733353738666632366138646131353632636466343834626638613332 +66366438316631386137616433653330653535616161353433376235343962336234316534353631 +61366534386135636633663861663264343166356231396333613066336662316134653565323264 +34333861613336326436656661333864366262363132616562333234623836363137336564613865 +64363565616533313136343437393130323163616566323031326435373530376536393263353932 +30386364333237343636376132636366303861646364346464313235623236653763336530363131 +31303763656434313630653162373762363837653332313538643739643930366632656166336433 +33316561363933623565313037643263653665326461616261626130623637633439643733303135 +63313037653435333839386136333235626438376635393034346332653065646536633034313534 +35346233353564393137623437386663303039633431363066393964656534303361666230633736 +39323563383237396463393631623562353234653935653835393961383862633037336663393963 +37353663393661633936613833643761316566623630306539383533303735626531313832346565 +66363137613137643961376263336639323963313562356264346437613931663062383235646266 +65393637323631616265363737636565323032353138356237323332613562396337626536373335 +61666463616434393064663238306161623034383163356537383566643630303135363730623530 +30333230393135623366303839333530343237373638616235333136386531636339383338633963 +35623736633731323363383161393831333065383231366639343738663734643632666265343436 +66323566366134383565636533336166646137316139313261653663353438373466353864663232 +37386265363736643032336464336236316562663338666330343331346136666431626337393632 +33393338626539393533306534353865386364653430656265303664373131653438323734316663 +61663330323864353161306334323161393962636236353161346132373639626364343731326632 +62663364386336383633356439393534393033376533393132653464373264396639356365353166 +62613966623065383838656438343337333763653565396265303566633839633563313565346133 +66396666303466393666346639343739373962663231326164623138356264626135393132393731 +37383736346339626236383333643232336661393731366338656261616564613831663463316632 +39646336623032343132346365653938333562653235396565626239393837393334396466383130 +36616538313332393661626461336637383436336435383265383837666331383765333630333934 +61333761636266663566373339623932353032633666633735326537366461643635366139663638 +35616162353339383462326438353166646131333936363566373962346131663563303934376430 +37376131636432346233643764326535383331343762363338376631313362313531616134323566 +33626631383231396366663664323564613438653936633239663234366531393434303031646433 +39653965323365376663363365343563306661313935643265623864333435663866653338666337 +61663632396538633831313162393264303365373138386231623439343839653031303763663362 +35346163376334306663633465616634353062623038396534393633326137326464383632646465 +61373233303130393562646663386263366235656462613634313134376663343730626662326361 +35323436373636393838346562643964626636636132653531346239363266323339323635326239 +34613331653539323732623737326161383266383035316430346238656235663062346234353935 +37646132626634363931626464613563653065343633316238323730393031653633656431393833 +35636565333165666636316563386437353436643465366461303062383234633334623531363830 +61326333363563343565653333363131376638346232363430653736653939373365396333633063 +66373738303135396539623038316131323837323533643231303662356263643935306231653831 +37313539333539646135363063353935313566363630653465346165363365643433623562306130 +66666135393930343639313635666630313030326538353832333733393438626431313766356636 +66326332393164343561653564346632383234666561363663656232623130396265386435653830 +31346137363662343135366163663566353636663237633766306231346135396330663031626437 +62626261623061636565383734316463366337386365336164633339623862383462656232373662 +63316635643761303938363066323330623161303466643666333730313536626431633837343239 +34306365373966653961386664373030303330383237386236313339626362393536653131303431 +39393163656163343965386330303763356235373661376332323464343963323937376236303961 +66353765353034613064633333626335376133333139393966383533313963393362333261386133 +34633138363766323162373763376133323533643765626364326361666161623731373265333535 +61343532653263656634326233396631306130376436303637666334386164323436386461303234 +36376132626362323766396261346438326164306533666161326636356532383963313065386637 +62316137636238393538313265313336306132326562376663353037343935636463353265373038 +64646432383663636665393638376665356333343130393930323333623232343033336164666439 +37623364623262333662326438303137393565663635353737636338316439373661353632653632 +65353032396438313461623666346361623934633138333236336537373566306563653832613661 +62326561343937653366366165613966386565303632353837616238616530373534313137633061 +65336535353165393539656161636531363864356166323532343837373333623539643233386639 +64643566326333356165613163613965646266656233303063353935313031333864633762653832 +34303832626436356662663962616361316664373134646165366332336133313564363732636235 +66363162646361383262663065313133306136613065393863366666396431303131393037636134 +30653634313432653331623863326464336535613039396461643231653266636334663938396134 +36633165613339303836393730393231396363306234373266313936336137666364366633383838 +32653636643863643765616365303764343536356562393638353238306161666439613065323438 +39623332613762346532393339333866393562666663346637636462343763643963663735303638 +37623064343665633265333730653065653132333439303263613333336439653834373430366163 +32396664376434373934613933656534653435383763353937376265663464643738313866383635 +61363066393637346335663333366666323536633739643363373963366264343235306439323462 +62336264376637636336646430343030646263353161666436613766653934303465643962633330 +38383738616232353933346564326631656462363665626431613462313537623332343236343863 +31653462333432663730393335353133333432303934373162663037613765613263376262383336 +36303330633964326466316135333166653939623034626463653538343436653632646539613733 +35643239623033623630353838363661363335333736373233663638623464336261356565663466 +33633137343639653731623436343764373432643366346639396137613766663961353038646566 +61343064376362373363623032343962333434366530303561656131316139646562376637323635 +36653165373031333132316338373163353634653362656331343062366565633764383362626461 +32386665323232616535396439396231363339353234306663373061656562633966376438323135 +36303030323334366334353366326465386339366261326564636534303339373731336134666463 +33353337316535636336396530663664386537303964353936336332633530333639633737333035 +63636663386335323130626364383563343165613839633633356130613065626464383433653935 +32326566663133346239396665373537383862336332653137353637666335376164616236613338 +62643664653663623961323136373165373162393533663230373965623435373334373235663462 +61396333343535626339336563336438393732343636653965396261383432346662 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..87796d91 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,15 @@ +# Learn more about the Server Side Up PHP Docker Images at: +# https://serversideup.net/open-source/docker-php/ + +FROM serversideup/php:beta-8.3-fpm-nginx as base + +FROM base as development + +# Fix permission issues in development by setting the "www-data" +# user to the same user and group that is running docker. +ARG USER_ID +ARG GROUP_ID +RUN docker-php-serversideup-set-id www-data ${USER_ID} ${GROUP_ID} + +FROM base as deploy +COPY --chown=www-data:www-data . /var/www/html \ No newline at end of file diff --git a/composer.json b/composer.json index f7a67958..1ea4b021 100644 --- a/composer.json +++ b/composer.json @@ -20,6 +20,7 @@ "mockery/mockery": "1.6.7", "nunomaduro/collision": "^7.0", "phpunit/phpunit": "^10", + "serversideup/spin": "^1.1", "spatie/laravel-ignition": "^2.0", "squizlabs/php_codesniffer": "3.8.1" }, diff --git a/composer.lock b/composer.lock index e0f34117..40a56f02 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a0bad77602b29d5220b4ff033de830a3", + "content-hash": "c8c1450f387063e8a906057eb202ce1d", "packages": [ { "name": "brick/math", @@ -8547,6 +8547,51 @@ ], "time": "2023-02-07T11:34:05+00:00" }, + { + "name": "serversideup/spin", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/serversideup/spin.git", + "reference": "03bb69dbdc6d6a68b82b4bb4cfeb7accc4f8758f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/serversideup/spin/zipball/03bb69dbdc6d6a68b82b4bb4cfeb7accc4f8758f", + "reference": "03bb69dbdc6d6a68b82b4bb4cfeb7accc4f8758f", + "shasum": "" + }, + "bin": [ + "bin/spin" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Dan Pastori", + "homepage": "https://twitter.com/danpastori" + }, + { + "name": "Jay Rogers", + "homepage": "https://twitter.com/jaydrogers" + } + ], + "description": "Replicate your production environment locally using Docker. Just run \"spin up\". It's really that easy.", + "support": { + "issues": "https://github.com/serversideup/spin/issues", + "source": "https://github.com/serversideup/spin/tree/v1.1.0" + }, + "funding": [ + { + "url": "https://github.com/serversideup", + "type": "github" + } + ], + "time": "2022-05-20T15:13:10+00:00" + }, { "name": "spatie/backtrace", "version": "1.5.3", diff --git a/docker-compose.ci.yml b/docker-compose.ci.yml new file mode 100644 index 00000000..5a2c0777 --- /dev/null +++ b/docker-compose.ci.yml @@ -0,0 +1,37 @@ +version: '3.8' +services: + mariadb: + networks: + - ci + environment: + MYSQL_ROOT_PASSWORD: "rootpassword" + MYSQL_DATABASE: "laravel_testing" + MYSQL_USER: "mysqluser" + MYSQL_PASSWORD: "mysqlpassword" + + php: + networks: + - ci + volumes: + - .:/var/www/html/ + working_dir: /var/www/html/ + environment: + AUTORUN_ENABLED: false + depends_on: + - mariadb + + node: + image: node:20 + volumes: + - .:/usr/src/app/ + working_dir: /usr/src/app/ + networks: + - ci + + mailpit: + image: axllent/mailpit + networks: + - ci + +networks: + ci: \ No newline at end of file diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 00000000..6eaaf0a4 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,75 @@ +version: '3.8' +services: + traefik: + networks: + development: + aliases: + - laravel.dev.test + ports: + - "80:80" + - "443:443" + volumes: + # Add Docker as a mounted volume, so that Traefik can read the labels of other services + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./.infrastructure/conf/traefik/dev/traefik.yml:/traefik.yml:ro + - ./.infrastructure/conf/traefik/dev/traefik-certs.yml:/traefik-certs.yml + - ./.infrastructure/conf/traefik/dev/certificates/:/certificates + + php: + build: + target: development + args: + USER_ID: ${SPIN_USER_ID} + GROUP_ID: ${SPIN_GROUP_ID} + volumes: + - .:/var/www/html/ + networks: + - development + depends_on: + - traefik + - mariadb + labels: + - "traefik.enable=true" + - "traefik.http.routers.laravel.rule=HostRegexp(`laravel.dev.test`)" + - "traefik.http.routers.laravel.entrypoints=websecure" + - "traefik.http.routers.laravel.tls=true" + - "traefik.http.services.laravel.loadbalancer.server.port=80" + - "traefik.http.services.laravel.loadbalancer.server.scheme=http" + + node: + image: node:20 + volumes: + - .:/usr/src/app/ + working_dir: /usr/src/app/ + networks: + - development + + mariadb: + networks: + - development + volumes: + - ./.infrastructure/volume_data/mariadb/database_data/:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: "rootpassword" + MYSQL_DATABASE: "laravel" + MYSQL_USER: "mysqluser" + MYSQL_PASSWORD: "mysqlpassword" + ports: + - "3306:3306" + + mailpit: + image: axllent/mailpit + networks: + - development + labels: + - "traefik.enable=true" + - "traefik.http.routers.mailpit.rule=Host(`mailpit.dev.test`)" + - "traefik.http.routers.mailpit.entrypoints=websecure" + - "traefik.http.routers.mailpit.tls=true" + - "traefik.http.services.mailpit.loadbalancer.server.port=8025" + - "traefik.http.services.mailpit.loadbalancer.server.scheme=http" + depends_on: + - traefik + +networks: + development: diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index e5f2e546..12e903e6 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -1,12 +1,114 @@ -version: '3' +version: '3.8' services: - laravel: - restart: always - pgsql: - restart: always - redis: - restart: always - meilisearch: - restart: always - mailhog: - restart: always + + traefik: + networks: + - web-public + ports: + - "80:80" + - "443:443" + deploy: + update_config: + parallelism: 1 + delay: 5s + order: stop-first + placement: + constraints: + - node.role==manager + volumes: + # Add Docker as a mounted volume, so that Traefik can read the labels of other services + - /var/run/docker.sock:/var/run/docker.sock:ro + - certificates:/certificates + configs: + - source: traefik + target: /etc/traefik/traefik.yml + + mariadb: + networks: + - web-public + environment: + MARIADB_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}" + MARIADB_DATABASE: "${DB_NAME}" + MARIADB_USER: "${DB_USERNAME}" + MARIADB_PASSWORD: "${DB_PASSWORD}" + deploy: + placement: + constraints: + - node.role==manager + volumes: + - database_data:/var/lib/mysql + - database_custom_conf:/etc/mysql/conf.d + - database_shared:/shared + + ssh: + # We use an SSH image so we can securely tunnel into the Docker network with + # tools like Sequel Pro, TablePlus, Sequel Ace, etc. + # Learn more how to secure your tunnel here: https://github.com/serversideup/docker-ssh + image: serversideup/docker-ssh + ports: + - target: 2222 + published: 2222 + mode: host + environment: + # Change the keys below to your own keys + AUTHORIZED_KEYS: > + "# Start Keys + ssh-ed25519 1234567890abcdefghijklmnoqrstuvwxyz user-a + ssh-ed25519 abcdefghijklmnoqrstuvwxyz1234567890 user-b + # End Keys" + # Be sure to configure the allowed IP addresses too + ALLOWED_IPS: "AllowUsers *@127.0.0.1" + volumes: + - tunnel_ssh_host_keys:/etc/ssh/ssh_host_keys + networks: + - web-public + + php: + image: ${DEPLOYMENT_IMAGE_PHP} # 👈 Be sure to change this to your own image + networks: + - web-public + volumes: + - "storage_private:/var/www/html/storage/app/private/" + - "storage_public:/var/www/html/storage/app/public/" + - "storage_sessions:/var/www/html/storage/framework/sessions" + - "storage_logs:/var/www/html/storage/logs" + environment: + PHP_POOL_NAME: "my-php-app" + deploy: + replicas: 2 + update_config: + parallelism: 1 + delay: 5s + order: start-first + labels: + - "traefik.enable=true" + - "traefik.http.routers.my-php-app.rule=${TRAEFIK_HOST_RULE}" + - "traefik.http.routers.my-php-app.entrypoints=websecure" + - "traefik.http.routers.my-php-app.tls=true" + - "traefik.http.routers.my-php-app.tls.certresolver=letsencryptresolver" + - "traefik.http.services.my-php-app.loadbalancer.server.port=80" + - "traefik.http.services.my-php-app.loadbalancer.server.scheme=http" + # Health check + - "traefik.http.services.my-php-app.loadbalancer.healthcheck.path=/ping" + - "traefik.http.services.my-php-app.loadbalancer.healthcheck.interval=100ms" + - "traefik.http.services.my-php-app.loadbalancer.healthcheck.timeout=75ms" + - "traefik.http.services.my-php-app.loadbalancer.healthcheck.scheme=http" + +configs: + traefik: + name: "traefik.yml" + file: ./.infrastructure/conf/traefik/prod/traefik.yml + +volumes: + certificates: + database_data: + database_custom_conf: + database_shared: + storage_private: + storage_public: + storage_sessions: + storage_logs: + tunnel_ssh_host_keys: + +networks: + web-public: diff --git a/docker-compose.yml b/docker-compose.yml index a8ffc0e8..ca7c2c97 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,101 +1,16 @@ -# For more information: https://laravel.com/docs/sail -version: '3' +version: '3.8' services: - laravel: - build: - context: ./vendor/laravel/sail/runtimes/8.2 - dockerfile: Dockerfile - args: - WWWGROUP: '${WWWGROUP}' - image: sail-8.2/app - extra_hosts: - - 'host.docker.internal:host-gateway' - ports: - - '${APP_PORT:-80}:80' - environment: - WWWUSER: '${WWWUSER}' - LARAVEL_SAIL: 1 - XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}' - XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}' - NODE_VERSION: 18 - env_file: - - .env - volumes: - - '.:/var/www/html' - networks: - - daim-api - depends_on: - - pgsql - - redis - - meilisearch - pgsql: - image: 'postgres:16' - ports: - - '${FORWARD_DB_PORT:-5432}:5432' - environment: - PGPASSWORD: '${DB_PASSWORD:-secret}' - POSTGRES_DB: '${DB_DATABASE}' - POSTGRES_USER: '${DB_USERNAME}' - POSTGRES_PASSWORD: '${DB_PASSWORD:-secret}' - volumes: - - 'daim-api-pgsql:/var/lib/postgresql/data' - networks: - - daim-api - healthcheck: - test: - - CMD - - pg_isready - - '-q' - - '-d' - - '${DB_DATABASE}' - - '-U' - - '${DB_USERNAME}' - redis: - image: 'redis:alpine' - ports: - - '${FORWARD_REDIS_PORT:-6379}:6379' - volumes: - - 'daim-api-redis:/data' - networks: - - daim-api - healthcheck: - test: - - CMD - - redis-cli - - ping - retries: 3 - timeout: 5s - meilisearch: - image: 'getmeili/meilisearch:latest' - ports: - - '${FORWARD_MEILISEARCH_PORT:-7700}:7700' - volumes: - - 'daim-api-meilisearch:/data.ms' - networks: - - daim-api - healthcheck: - test: - - CMD - - wget - - '--no-verbose' - - '--spider' - - 'http://localhost:7700/health' - retries: 3 - timeout: 5s - mailhog: - image: 'mailhog/mailhog:latest' - ports: - - '${FORWARD_MAILHOG_PORT:-1025}:1025' - - '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025' - networks: - - daim-api -networks: - daim-api: - driver: bridge -volumes: - daim-api-pgsql: - driver: local - daim-api-redis: - driver: local - daim-api-meilisearch: - driver: local + + traefik: + image: traefik:v2.10 + + mariadb: + image: mariadb:10.11 + + php: + build: + context: . + target: base + depends_on: + - traefik + - mariadb \ No newline at end of file