feat: add Drupal LocalGov example
This commit is contained in:
commit
17c5703d29
19 changed files with 1800 additions and 0 deletions
10
.env.example
Normal file
10
.env.example
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
export DOCKER_UID=1000
|
||||
|
||||
export COMPOSE_PROJECT_NAME=docker-example-drupal-localgov
|
||||
export COMPOSE_PROFILES=web,php,database
|
||||
|
||||
export DOCKER_WEB_VOLUME=.:/app
|
||||
|
||||
export MYSQL_DATABASE=app
|
||||
export MYSQL_PASSWORD=app
|
||||
export MYSQL_USER=app
|
||||
175
.github/workflows/test.yml
vendored
Normal file
175
.github/workflows/test.yml
vendored
Normal file
|
|
@ -0,0 +1,175 @@
|
|||
##
|
||||
# Managed by https://github.com/localgovdrupal/github_workflow_manager
|
||||
---
|
||||
name: Test localgovdrupal/localgov-project project
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '2.x'
|
||||
pull_request:
|
||||
branches:
|
||||
- '2.x'
|
||||
schedule:
|
||||
- cron: "0 7 * * *"
|
||||
|
||||
env:
|
||||
LOCALGOV_DRUPAL_PROJECT: localgovdrupal/localgov-project
|
||||
LOCALGOV_DRUPAL_PROJECT_PATH:
|
||||
|
||||
jobs:
|
||||
|
||||
build:
|
||||
name: Install LocalGov Drupal
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
localgov-version: ["2.x"]
|
||||
drupal-version: ["~9.1"]
|
||||
php-version: ["7.4","8.1"]
|
||||
|
||||
steps:
|
||||
|
||||
- name: Save git branch and git repo names to env if this is not a pull request
|
||||
if: github.event_name != 'pull_request'
|
||||
run: |
|
||||
echo "GIT_BASE=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV
|
||||
echo "GIT_BRANCH=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV
|
||||
echo "GIT_REPO=${GITHUB_REPOSITORY}" >> $GITHUB_ENV
|
||||
|
||||
- name: Save git branch and git repo names to env if this is a pull request
|
||||
if: github.event_name == 'pull_request'
|
||||
run: |
|
||||
echo "GIT_BASE=${GITHUB_BASE_REF}" >> $GITHUB_ENV
|
||||
echo "GIT_BRANCH=${GITHUB_HEAD_REF}" >> $GITHUB_ENV
|
||||
echo "GIT_REPO=${{ github.event.pull_request.head.repo.full_name }}" >> $GITHUB_ENV
|
||||
|
||||
- name: Set composer branch reference for version branches
|
||||
if: endsWith(github.ref, '.x')
|
||||
run: echo "COMPOSER_REF=${GIT_BRANCH}-dev" >> $GITHUB_ENV
|
||||
|
||||
- name: Set composer branch reference for non-version branches
|
||||
if: endsWith(github.ref, '.x') == false
|
||||
run: echo "COMPOSER_REF=dev-${GIT_BRANCH}" >> $GITHUB_ENV
|
||||
|
||||
- name: Cached workspace
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ./html
|
||||
key: localgov-build-${{ matrix.localgov-version }}-${{ matrix.drupal-version }}-${{ matrix.php-version }}-${{ github.run_id }}-${{ secrets.CACHE_VERSION }}
|
||||
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: ${{ matrix.php-version }}
|
||||
|
||||
- name: Clone drupal_container
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: localgovdrupal/drupal-container
|
||||
ref: php${{ matrix.php-version }}
|
||||
|
||||
- name: Create LocalGov Drupal project
|
||||
run: composer create-project --stability dev localgovdrupal/localgov-project:${COMPOSER_REF} ./html
|
||||
|
||||
phpcs:
|
||||
name: Coding standards checks
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
localgov-version: ["2.x"]
|
||||
drupal-version: ["~9.1"]
|
||||
php-version: ["7.4","8.1"]
|
||||
|
||||
steps:
|
||||
|
||||
- name: Cached workspace
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ./html
|
||||
key: localgov-build-${{ matrix.localgov-version }}-${{ matrix.drupal-version }}-${{ matrix.php-version }}-${{ github.run_id }}-${{ secrets.CACHE_VERSION }}
|
||||
restore-keys: |
|
||||
localgov-build-${{ matrix.localgov-version }}-${{ matrix.drupal-version }}-${{ matrix.php-version }}-
|
||||
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: ${{ matrix.php-version }}
|
||||
|
||||
- name: Run coding standards checks
|
||||
run: |
|
||||
cd html
|
||||
./bin/phpcs -p ${LOCALGOV_DRUPAL_PROJECT_PATH}
|
||||
|
||||
phpstan:
|
||||
name: Deprecated code checks
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
localgov-version: ["2.x"]
|
||||
drupal-version: ["~9.1"]
|
||||
php-version: ["7.4","8.1"]
|
||||
|
||||
steps:
|
||||
|
||||
- name: Cached workspace
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ./html
|
||||
key: localgov-build-${{ matrix.localgov-version }}-${{ matrix.drupal-version }}-${{ matrix.php-version }}-${{ github.run_id }}-${{ secrets.CACHE_VERSION }}
|
||||
restore-keys: |
|
||||
localgov-build-${{ matrix.localgov-version }}-${{ matrix.drupal-version }}-${{ matrix.php-version }}-
|
||||
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: ${{ matrix.php-version }}
|
||||
|
||||
- name: Run deprecated code checks
|
||||
run: |
|
||||
cd html
|
||||
./bin/phpstan analyse -c ./phpstan.neon ./web/modules/contrib/localgov* ./web/profiles/contrib/localgov* ./web/themes/contrib/localgov*
|
||||
phpunit:
|
||||
name: PHPUnit tests
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
localgov-version: ["2.x"]
|
||||
drupal-version: ["~9.1"]
|
||||
php-version: ["7.4","8.1"]
|
||||
|
||||
steps:
|
||||
|
||||
- name: Clone Drupal container
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
repository: localgovdrupal/drupal-container
|
||||
ref: php${{ matrix.php-version }}
|
||||
|
||||
- name: Cached workspace
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ./html
|
||||
key: localgov-build-${{ matrix.localgov-version }}-${{ matrix.drupal-version }}-${{ matrix.php-version }}-${{ github.run_id }}-${{ secrets.CACHE_VERSION }}
|
||||
restore-keys: |
|
||||
localgov-build-${{ matrix.localgov-version }}-${{ matrix.drupal-version }}-${{ matrix.php-version }}-
|
||||
|
||||
- name: Start Docker environment
|
||||
run: docker-compose -f docker-compose.yml up -d
|
||||
|
||||
- name: Run PHPUnit tests
|
||||
run: |
|
||||
mkdir -p ./html/web/sites/simpletest && chmod 777 ./html/web/sites/simpletest
|
||||
docker exec -t drupal bash -c 'chown docker:docker -R /var/www/html'
|
||||
docker exec -u docker -t drupal bash -c "cd /var/www/html && ./bin/paratest --processes=4"
|
||||
79
.gitignore
vendored
Normal file
79
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
# Ignore directories generated by Composer
|
||||
/bin
|
||||
/drush/contrib/
|
||||
/vendor/
|
||||
/web/core/
|
||||
/web/modules/contrib/
|
||||
/web/themes/contrib/
|
||||
/web/profiles/contrib/
|
||||
/web/libraries/
|
||||
|
||||
# Ignore composer.lock as this is template project
|
||||
/composer.lock
|
||||
|
||||
# Ignore sensitive information
|
||||
/web/sites/*/settings*.php
|
||||
/web/sites/*/services*.yml
|
||||
|
||||
# Ignore Drupal's file directory
|
||||
/web/sites/*/files/
|
||||
|
||||
# Ignore scaffold files
|
||||
/.editorconfig
|
||||
/.gitattributes
|
||||
/web/.csslintrc
|
||||
/web/.eslintignore
|
||||
/web/.eslintrc.json
|
||||
/web/.gitignore
|
||||
/web/.ht.router.php
|
||||
/web/.htaccess
|
||||
/web/INSTALL.txt
|
||||
/web/README.md
|
||||
/web/README.txt
|
||||
/web/autoload.php
|
||||
/web/example.gitignore
|
||||
/web/index.php
|
||||
/web/modules/README.txt
|
||||
/web/profiles/README.txt
|
||||
/web/robots.txt
|
||||
/web/sites/README.txt
|
||||
/web/sites/default/default.services.yml
|
||||
/web/sites/default/default.settings.php
|
||||
/web/sites/development.services.yml
|
||||
/web/sites/example.settings.local.php
|
||||
/web/sites/example.sites.php
|
||||
/web/themes/README.txt
|
||||
/web/update.php
|
||||
/web/web.config
|
||||
|
||||
# Ignore SimpleTest multi-site environment
|
||||
/web/sites/simpletest
|
||||
|
||||
# Ignore IDE files
|
||||
.idea/
|
||||
.vscode/
|
||||
|
||||
# Ignore .env files as they are personal
|
||||
/.env
|
||||
|
||||
# Ignore DB dumps
|
||||
*.sql
|
||||
*.sql.gz
|
||||
*.mysql
|
||||
*.mysql.gz
|
||||
|
||||
# Ignore Lando overrides
|
||||
.lando.local.yml
|
||||
|
||||
# Ignore Lando Solr config
|
||||
/.lando/solr
|
||||
|
||||
# Ignore temp files
|
||||
/.phpunit.result.cache
|
||||
|
||||
# Ignore ddev configuration folders
|
||||
.ddev/.global_commands/
|
||||
.ddev/commands/
|
||||
.ddev/homeadditions/
|
||||
.ddev/providers/
|
||||
.ddev/xhprof/
|
||||
65
Dockerfile
Normal file
65
Dockerfile
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
FROM php:8.1-fpm-bullseye AS base
|
||||
|
||||
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
|
||||
RUN which composer && composer -V
|
||||
|
||||
ARG DOCKER_UID=1000
|
||||
ENV DOCKER_UID="${DOCKER_UID}"
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
RUN adduser --disabled-password --uid "${DOCKER_UID}" app \
|
||||
&& chown app:app -R /app
|
||||
|
||||
USER app
|
||||
|
||||
ENV PATH="${PATH}:/app/vendor/bin"
|
||||
|
||||
COPY --chown=app:app composer.* ./
|
||||
|
||||
################################################################################
|
||||
|
||||
FROM base AS build
|
||||
|
||||
USER root
|
||||
|
||||
RUN apt-get update -yqq \
|
||||
&& apt-get install -yqq --no-install-recommends \
|
||||
git libpng-dev libzip-dev mariadb-client unzip
|
||||
|
||||
RUN docker-php-ext-install gd pdo_mysql zip
|
||||
|
||||
COPY --chown=app:app assets assets
|
||||
|
||||
USER app
|
||||
|
||||
RUN composer validate --strict
|
||||
RUN composer install
|
||||
|
||||
COPY --chown=app:app tools/docker/images/php/root /
|
||||
|
||||
ENTRYPOINT ["/usr/local/bin/docker-entrypoint-php"]
|
||||
CMD ["php-fpm"]
|
||||
|
||||
################################################################################
|
||||
|
||||
FROM base AS test
|
||||
|
||||
COPY --chown=app:app . .
|
||||
|
||||
RUN parallel-lint src --no-progress \
|
||||
&& phpcs -vv \
|
||||
&& phpstan \
|
||||
&& phpunit --testdox
|
||||
|
||||
|
||||
|
||||
################################################################################
|
||||
|
||||
FROM nginx:1 as web
|
||||
|
||||
EXPOSE 8080
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY tools/docker/images/web/root /
|
||||
339
LICENSE
Normal file
339
LICENSE
Normal file
|
|
@ -0,0 +1,339 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
{description}
|
||||
Copyright (C) {year} {fullname}
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
{signature of Ty Coon}, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
22
README.md
Normal file
22
README.md
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
# LocalGov Drupal Composer project template
|
||||
|
||||

|
||||
|
||||
A Composer-based installer for the LocalGov Drupal distribution.
|
||||
|
||||
This project template should provide a kickstart for managing your site dependencies with Composer.
|
||||
|
||||
## Usage
|
||||
|
||||
For guidance on installing see:
|
||||
|
||||
- [Installing LocalGov Drupal locally with composer](https://github.com/localgovdrupal/localgov/blob/2.x/README.md#installing-localgov-drupal-locally-with-composer)
|
||||
- [Getting started on LocalGov Drupal docs](https://docs.localgovdrupal.org/devs/getting-started/)
|
||||
|
||||
## Maintainers
|
||||
|
||||
This project is currently maintained by:
|
||||
|
||||
- Ekes: https://www.drupal.org/u/ekes
|
||||
- Finn Lewis: https://www.drupal.org/u/finn-lewis
|
||||
- Stephen Cox: https://www.drupal.org/u/stephen-cox
|
||||
13
assets/composer/development.services.yml
Normal file
13
assets/composer/development.services.yml
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
# Local development services.
|
||||
#
|
||||
# To activate this feature, follow the instructions at the top of the
|
||||
# 'example.settings.local.php' file, which sits next to this file.
|
||||
parameters:
|
||||
http.response.debug_cacheability_headers: true
|
||||
twig.config:
|
||||
debug: true
|
||||
auto_reload: false
|
||||
cache: false
|
||||
services:
|
||||
cache.backend.null:
|
||||
class: Drupal\Core\Cache\NullBackendFactory
|
||||
765
assets/composer/settings.php
Normal file
765
assets/composer/settings.php
Normal file
|
|
@ -0,0 +1,765 @@
|
|||
<?php
|
||||
|
||||
// @codingStandardsIgnoreFile
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Drupal site-specific configuration file.
|
||||
*
|
||||
* IMPORTANT NOTE:
|
||||
* This file may have been set to read-only by the Drupal installation program.
|
||||
* If you make changes to this file, be sure to protect it again after making
|
||||
* your modifications. Failure to remove write permissions to this file is a
|
||||
* security risk.
|
||||
*
|
||||
* In order to use the selection rules below the multisite aliasing file named
|
||||
* sites/sites.php must be present. Its optional settings will be loaded, and
|
||||
* the aliases in the array $sites will override the default directory rules
|
||||
* below. See sites/example.sites.php for more information about aliases.
|
||||
*
|
||||
* The configuration directory will be discovered by stripping the website's
|
||||
* hostname from left to right and pathname from right to left. The first
|
||||
* configuration file found will be used and any others will be ignored. If no
|
||||
* other configuration file is found then the default configuration file at
|
||||
* 'sites/default' will be used.
|
||||
*
|
||||
* For example, for a fictitious site installed at
|
||||
* https://www.drupal.org:8080/mysite/test/, the 'settings.php' file is searched
|
||||
* for in the following directories:
|
||||
*
|
||||
* - sites/8080.www.drupal.org.mysite.test
|
||||
* - sites/www.drupal.org.mysite.test
|
||||
* - sites/drupal.org.mysite.test
|
||||
* - sites/org.mysite.test
|
||||
*
|
||||
* - sites/8080.www.drupal.org.mysite
|
||||
* - sites/www.drupal.org.mysite
|
||||
* - sites/drupal.org.mysite
|
||||
* - sites/org.mysite
|
||||
*
|
||||
* - sites/8080.www.drupal.org
|
||||
* - sites/www.drupal.org
|
||||
* - sites/drupal.org
|
||||
* - sites/org
|
||||
*
|
||||
* - sites/default
|
||||
*
|
||||
* Note that if you are installing on a non-standard port number, prefix the
|
||||
* hostname with that number. For example,
|
||||
* https://www.drupal.org:8080/mysite/test/ could be loaded from
|
||||
* sites/8080.www.drupal.org.mysite.test/.
|
||||
*
|
||||
* @see example.sites.php
|
||||
* @see \Drupal\Core\DrupalKernel::getSitePath()
|
||||
*
|
||||
* In addition to customizing application settings through variables in
|
||||
* settings.php, you can create a services.yml file in the same directory to
|
||||
* register custom, site-specific service definitions and/or swap out default
|
||||
* implementations with custom ones.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Database settings:
|
||||
*
|
||||
* The $databases array specifies the database connection or
|
||||
* connections that Drupal may use. Drupal is able to connect
|
||||
* to multiple databases, including multiple types of databases,
|
||||
* during the same request.
|
||||
*
|
||||
* One example of the simplest connection array is shown below. To use the
|
||||
* sample settings, copy and uncomment the code below between the @code and
|
||||
* @endcode lines and paste it after the $databases declaration. You will need
|
||||
* to replace the database username and password and possibly the host and port
|
||||
* with the appropriate credentials for your database system.
|
||||
*
|
||||
* The next section describes how to customize the $databases array for more
|
||||
* specific needs.
|
||||
*
|
||||
* @code
|
||||
* $databases['default']['default'] = [
|
||||
* 'database' => 'databasename',
|
||||
* 'username' => 'sqlusername',
|
||||
* 'password' => 'sqlpassword',
|
||||
* 'host' => 'localhost',
|
||||
* 'port' => '3306',
|
||||
* 'driver' => 'mysql',
|
||||
* 'prefix' => '',
|
||||
* 'collation' => 'utf8mb4_general_ci',
|
||||
* ];
|
||||
* @endcode
|
||||
*/
|
||||
$databases = [];
|
||||
|
||||
/**
|
||||
* Customizing database settings.
|
||||
*
|
||||
* Many of the values of the $databases array can be customized for your
|
||||
* particular database system. Refer to the sample in the section above as a
|
||||
* starting point.
|
||||
*
|
||||
* The "driver" property indicates what Drupal database driver the
|
||||
* connection should use. This is usually the same as the name of the
|
||||
* database type, such as mysql or sqlite, but not always. The other
|
||||
* properties will vary depending on the driver. For SQLite, you must
|
||||
* specify a database file name in a directory that is writable by the
|
||||
* webserver. For most other drivers, you must specify a
|
||||
* username, password, host, and database name.
|
||||
*
|
||||
* Transaction support is enabled by default for all drivers that support it,
|
||||
* including MySQL. To explicitly disable it, set the 'transactions' key to
|
||||
* FALSE.
|
||||
* Note that some configurations of MySQL, such as the MyISAM engine, don't
|
||||
* support it and will proceed silently even if enabled. If you experience
|
||||
* transaction related crashes with such configuration, set the 'transactions'
|
||||
* key to FALSE.
|
||||
*
|
||||
* For each database, you may optionally specify multiple "target" databases.
|
||||
* A target database allows Drupal to try to send certain queries to a
|
||||
* different database if it can but fall back to the default connection if not.
|
||||
* That is useful for primary/replica replication, as Drupal may try to connect
|
||||
* to a replica server when appropriate and if one is not available will simply
|
||||
* fall back to the single primary server (The terms primary/replica are
|
||||
* traditionally referred to as master/slave in database server documentation).
|
||||
*
|
||||
* The general format for the $databases array is as follows:
|
||||
* @code
|
||||
* $databases['default']['default'] = $info_array;
|
||||
* $databases['default']['replica'][] = $info_array;
|
||||
* $databases['default']['replica'][] = $info_array;
|
||||
* $databases['extra']['default'] = $info_array;
|
||||
* @endcode
|
||||
*
|
||||
* In the above example, $info_array is an array of settings described above.
|
||||
* The first line sets a "default" database that has one primary database
|
||||
* (the second level default). The second and third lines create an array
|
||||
* of potential replica databases. Drupal will select one at random for a given
|
||||
* request as needed. The fourth line creates a new database with a name of
|
||||
* "extra".
|
||||
*
|
||||
* You can optionally set prefixes for some or all database table names
|
||||
* by using the 'prefix' setting. If a prefix is specified, the table
|
||||
* name will be prepended with its value. Be sure to use valid database
|
||||
* characters only, usually alphanumeric and underscore. If no prefixes
|
||||
* are desired, leave it as an empty string ''.
|
||||
*
|
||||
* To have all database names prefixed, set 'prefix' as a string:
|
||||
* @code
|
||||
* 'prefix' => 'main_',
|
||||
* @endcode
|
||||
*
|
||||
* Per-table prefixes are deprecated as of Drupal 8.2, and will be removed in
|
||||
* Drupal 9.0. After that, only a single prefix for all tables will be
|
||||
* supported.
|
||||
*
|
||||
* To provide prefixes for specific tables, set 'prefix' as an array.
|
||||
* The array's keys are the table names and the values are the prefixes.
|
||||
* The 'default' element is mandatory and holds the prefix for any tables
|
||||
* not specified elsewhere in the array. Example:
|
||||
* @code
|
||||
* 'prefix' => [
|
||||
* 'default' => 'main_',
|
||||
* 'users' => 'shared_',
|
||||
* 'sessions' => 'shared_',
|
||||
* 'role' => 'shared_',
|
||||
* 'authmap' => 'shared_',
|
||||
* ],
|
||||
* @endcode
|
||||
* You can also use a reference to a schema/database as a prefix. This may be
|
||||
* useful if your Drupal installation exists in a schema that is not the default
|
||||
* or you want to access several databases from the same code base at the same
|
||||
* time.
|
||||
* Example:
|
||||
* @code
|
||||
* 'prefix' => [
|
||||
* 'default' => 'main.',
|
||||
* 'users' => 'shared.',
|
||||
* 'sessions' => 'shared.',
|
||||
* 'role' => 'shared.',
|
||||
* 'authmap' => 'shared.',
|
||||
* ];
|
||||
* @endcode
|
||||
* NOTE: MySQL and SQLite's definition of a schema is a database.
|
||||
*
|
||||
* Advanced users can add or override initial commands to execute when
|
||||
* connecting to the database server, as well as PDO connection settings. For
|
||||
* example, to enable MySQL SELECT queries to exceed the max_join_size system
|
||||
* variable, and to reduce the database connection timeout to 5 seconds:
|
||||
* @code
|
||||
* $databases['default']['default'] = [
|
||||
* 'init_commands' => [
|
||||
* 'big_selects' => 'SET SQL_BIG_SELECTS=1',
|
||||
* ],
|
||||
* 'pdo' => [
|
||||
* PDO::ATTR_TIMEOUT => 5,
|
||||
* ],
|
||||
* ];
|
||||
* @endcode
|
||||
*
|
||||
* WARNING: The above defaults are designed for database portability. Changing
|
||||
* them may cause unexpected behavior, including potential data loss. See
|
||||
* https://www.drupal.org/developing/api/database/configuration for more
|
||||
* information on these defaults and the potential issues.
|
||||
*
|
||||
* More details can be found in the constructor methods for each driver:
|
||||
* - \Drupal\Core\Database\Driver\mysql\Connection::__construct()
|
||||
* - \Drupal\Core\Database\Driver\pgsql\Connection::__construct()
|
||||
* - \Drupal\Core\Database\Driver\sqlite\Connection::__construct()
|
||||
*
|
||||
* Sample Database configuration format for PostgreSQL (pgsql):
|
||||
* @code
|
||||
* $databases['default']['default'] = [
|
||||
* 'driver' => 'pgsql',
|
||||
* 'database' => 'databasename',
|
||||
* 'username' => 'sqlusername',
|
||||
* 'password' => 'sqlpassword',
|
||||
* 'host' => 'localhost',
|
||||
* 'prefix' => '',
|
||||
* ];
|
||||
* @endcode
|
||||
*
|
||||
* Sample Database configuration format for SQLite (sqlite):
|
||||
* @code
|
||||
* $databases['default']['default'] = [
|
||||
* 'driver' => 'sqlite',
|
||||
* 'database' => '/path/to/databasefilename',
|
||||
* ];
|
||||
* @endcode
|
||||
*/
|
||||
|
||||
/**
|
||||
* Location of the site configuration files.
|
||||
*
|
||||
* The $settings['config_sync_directory'] specifies the location of file system
|
||||
* directory used for syncing configuration data. On install, the directory is
|
||||
* created. This is used for configuration imports.
|
||||
*
|
||||
* The default location for this directory is inside a randomly-named
|
||||
* directory in the public files path. The setting below allows you to set
|
||||
* its location.
|
||||
*/
|
||||
$settings['config_sync_directory'] = '../config/sync';
|
||||
|
||||
/**
|
||||
* Settings:
|
||||
*
|
||||
* $settings contains environment-specific configuration, such as the files
|
||||
* directory and reverse proxy address, and temporary configuration, such as
|
||||
* security overrides.
|
||||
*
|
||||
* @see \Drupal\Core\Site\Settings::get()
|
||||
*/
|
||||
|
||||
/**
|
||||
* Salt for one-time login links, cancel links, form tokens, etc.
|
||||
*
|
||||
* This variable will be set to a random value by the installer. All one-time
|
||||
* login links will be invalidated if the value is changed. Note that if your
|
||||
* site is deployed on a cluster of web servers, you must ensure that this
|
||||
* variable has the same value on each server.
|
||||
*
|
||||
* For enhanced security, you may set this variable to the contents of a file
|
||||
* outside your document root; you should also ensure that this file is not
|
||||
* stored with backups of your database.
|
||||
*
|
||||
* Example:
|
||||
* @code
|
||||
* $settings['hash_salt'] = file_get_contents('/home/example/salt.txt');
|
||||
* @endcode
|
||||
*/
|
||||
$settings['hash_salt'] = 'SOelBL-o8b_k0BIJBRC7piYZxDFPFjnsRANJW7t9xJJEXidbTDKDBYzUxXsejPEEgJg_wSfXIQ';
|
||||
|
||||
/**
|
||||
* Deployment identifier.
|
||||
*
|
||||
* Drupal's dependency injection container will be automatically invalidated and
|
||||
* rebuilt when the Drupal core version changes. When updating contributed or
|
||||
* custom code that changes the container, changing this identifier will also
|
||||
* allow the container to be invalidated as soon as code is deployed.
|
||||
*/
|
||||
# $settings['deployment_identifier'] = \Drupal::VERSION;
|
||||
|
||||
/**
|
||||
* Access control for update.php script.
|
||||
*
|
||||
* If you are updating your Drupal installation using the update.php script but
|
||||
* are not logged in using either an account with the "Administer software
|
||||
* updates" permission or the site maintenance account (the account that was
|
||||
* created during installation), you will need to modify the access check
|
||||
* statement below. Change the FALSE to a TRUE to disable the access check.
|
||||
* After finishing the upgrade, be sure to open this file again and change the
|
||||
* TRUE back to a FALSE!
|
||||
*/
|
||||
$settings['update_free_access'] = FALSE;
|
||||
|
||||
/**
|
||||
* External access proxy settings:
|
||||
*
|
||||
* If your site must access the Internet via a web proxy then you can enter the
|
||||
* proxy settings here. Set the full URL of the proxy, including the port, in
|
||||
* variables:
|
||||
* - $settings['http_client_config']['proxy']['http']: The proxy URL for HTTP
|
||||
* requests.
|
||||
* - $settings['http_client_config']['proxy']['https']: The proxy URL for HTTPS
|
||||
* requests.
|
||||
* You can pass in the user name and password for basic authentication in the
|
||||
* URLs in these settings.
|
||||
*
|
||||
* You can also define an array of host names that can be accessed directly,
|
||||
* bypassing the proxy, in $settings['http_client_config']['proxy']['no'].
|
||||
*/
|
||||
# $settings['http_client_config']['proxy']['http'] = 'http://proxy_user:proxy_pass@example.com:8080';
|
||||
# $settings['http_client_config']['proxy']['https'] = 'http://proxy_user:proxy_pass@example.com:8080';
|
||||
# $settings['http_client_config']['proxy']['no'] = ['127.0.0.1', 'localhost'];
|
||||
|
||||
/**
|
||||
* Reverse Proxy Configuration:
|
||||
*
|
||||
* Reverse proxy servers are often used to enhance the performance
|
||||
* of heavily visited sites and may also provide other site caching,
|
||||
* security, or encryption benefits. In an environment where Drupal
|
||||
* is behind a reverse proxy, the real IP address of the client should
|
||||
* be determined such that the correct client IP address is available
|
||||
* to Drupal's logging, statistics, and access management systems. In
|
||||
* the most simple scenario, the proxy server will add an
|
||||
* X-Forwarded-For header to the request that contains the client IP
|
||||
* address. However, HTTP headers are vulnerable to spoofing, where a
|
||||
* malicious client could bypass restrictions by setting the
|
||||
* X-Forwarded-For header directly. Therefore, Drupal's proxy
|
||||
* configuration requires the IP addresses of all remote proxies to be
|
||||
* specified in $settings['reverse_proxy_addresses'] to work correctly.
|
||||
*
|
||||
* Enable this setting to get Drupal to determine the client IP from the
|
||||
* X-Forwarded-For header. If you are unsure about this setting, do not have a
|
||||
* reverse proxy, or Drupal operates in a shared hosting environment, this
|
||||
* setting should remain commented out.
|
||||
*
|
||||
* In order for this setting to be used you must specify every possible
|
||||
* reverse proxy IP address in $settings['reverse_proxy_addresses'].
|
||||
* If a complete list of reverse proxies is not available in your
|
||||
* environment (for example, if you use a CDN) you may set the
|
||||
* $_SERVER['REMOTE_ADDR'] variable directly in settings.php.
|
||||
* Be aware, however, that it is likely that this would allow IP
|
||||
* address spoofing unless more advanced precautions are taken.
|
||||
*/
|
||||
# $settings['reverse_proxy'] = TRUE;
|
||||
|
||||
/**
|
||||
* Specify every reverse proxy IP address in your environment.
|
||||
* This setting is required if $settings['reverse_proxy'] is TRUE.
|
||||
*/
|
||||
# $settings['reverse_proxy_addresses'] = ['a.b.c.d', ...];
|
||||
|
||||
/**
|
||||
* Reverse proxy trusted headers.
|
||||
*
|
||||
* Sets which headers to trust from your reverse proxy.
|
||||
*
|
||||
* Common values are:
|
||||
* - \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL
|
||||
* - \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED
|
||||
*
|
||||
* Note the default value of
|
||||
* @code
|
||||
* \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED
|
||||
* @endcode
|
||||
* is not secure by default. The value should be set to only the specific
|
||||
* headers the reverse proxy uses. For example:
|
||||
* @code
|
||||
* \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL
|
||||
* @endcode
|
||||
* This would trust the following headers:
|
||||
* - X_FORWARDED_FOR
|
||||
* - X_FORWARDED_HOST
|
||||
* - X_FORWARDED_PROTO
|
||||
* - X_FORWARDED_PORT
|
||||
*
|
||||
* @see \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL
|
||||
* @see \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED
|
||||
* @see \Symfony\Component\HttpFoundation\Request::setTrustedProxies
|
||||
*/
|
||||
# $settings['reverse_proxy_trusted_headers'] = \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED;
|
||||
|
||||
|
||||
/**
|
||||
* Page caching:
|
||||
*
|
||||
* By default, Drupal sends a "Vary: Cookie" HTTP header for anonymous page
|
||||
* views. This tells a HTTP proxy that it may return a page from its local
|
||||
* cache without contacting the web server, if the user sends the same Cookie
|
||||
* header as the user who originally requested the cached page. Without "Vary:
|
||||
* Cookie", authenticated users would also be served the anonymous page from
|
||||
* the cache. If the site has mostly anonymous users except a few known
|
||||
* editors/administrators, the Vary header can be omitted. This allows for
|
||||
* better caching in HTTP proxies (including reverse proxies), i.e. even if
|
||||
* clients send different cookies, they still get content served from the cache.
|
||||
* However, authenticated users should access the site directly (i.e. not use an
|
||||
* HTTP proxy, and bypass the reverse proxy if one is used) in order to avoid
|
||||
* getting cached pages from the proxy.
|
||||
*/
|
||||
# $settings['omit_vary_cookie'] = TRUE;
|
||||
|
||||
|
||||
/**
|
||||
* Cache TTL for client error (4xx) responses.
|
||||
*
|
||||
* Items cached per-URL tend to result in a large number of cache items, and
|
||||
* this can be problematic on 404 pages which by their nature are unbounded. A
|
||||
* fixed TTL can be set for these items, defaulting to one hour, so that cache
|
||||
* backends which do not support LRU can purge older entries. To disable caching
|
||||
* of client error responses set the value to 0. Currently applies only to
|
||||
* page_cache module.
|
||||
*/
|
||||
# $settings['cache_ttl_4xx'] = 3600;
|
||||
|
||||
/**
|
||||
* Expiration of cached forms.
|
||||
*
|
||||
* Drupal's Form API stores details of forms in a cache and these entries are
|
||||
* kept for at least 6 hours by default. Expired entries are cleared by cron.
|
||||
*
|
||||
* @see \Drupal\Core\Form\FormCache::setCache()
|
||||
*/
|
||||
# $settings['form_cache_expiration'] = 21600;
|
||||
|
||||
/**
|
||||
* Class Loader.
|
||||
*
|
||||
* If the APC extension is detected, the Symfony APC class loader is used for
|
||||
* performance reasons. Detection can be prevented by setting
|
||||
* class_loader_auto_detect to false, as in the example below.
|
||||
*/
|
||||
# $settings['class_loader_auto_detect'] = FALSE;
|
||||
|
||||
/*
|
||||
* If the APC extension is not detected, either because APC is missing or
|
||||
* because auto-detection has been disabled, auto-loading falls back to
|
||||
* Composer's ClassLoader, which is good for development as it does not break
|
||||
* when code is moved in the file system. You can also decorate the base class
|
||||
* loader with another cached solution than the Symfony APC class loader, as
|
||||
* all production sites should have a cached class loader of some sort enabled.
|
||||
*
|
||||
* To do so, you may decorate and replace the local $class_loader variable. For
|
||||
* example, to use Symfony's APC class loader without automatic detection,
|
||||
* uncomment the code below.
|
||||
*/
|
||||
/*
|
||||
if ($settings['hash_salt']) {
|
||||
$prefix = 'drupal.' . hash('sha256', 'drupal.' . $settings['hash_salt']);
|
||||
$apc_loader = new \Symfony\Component\ClassLoader\ApcClassLoader($prefix, $class_loader);
|
||||
unset($prefix);
|
||||
$class_loader->unregister();
|
||||
$apc_loader->register();
|
||||
$class_loader = $apc_loader;
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Authorized file system operations:
|
||||
*
|
||||
* The Update Manager module included with Drupal provides a mechanism for
|
||||
* site administrators to securely install missing updates for the site
|
||||
* directly through the web user interface. On securely-configured servers,
|
||||
* the Update manager will require the administrator to provide SSH or FTP
|
||||
* credentials before allowing the installation to proceed; this allows the
|
||||
* site to update the new files as the user who owns all the Drupal files,
|
||||
* instead of as the user the webserver is running as. On servers where the
|
||||
* webserver user is itself the owner of the Drupal files, the administrator
|
||||
* will not be prompted for SSH or FTP credentials (note that these server
|
||||
* setups are common on shared hosting, but are inherently insecure).
|
||||
*
|
||||
* Some sites might wish to disable the above functionality, and only update
|
||||
* the code directly via SSH or FTP themselves. This setting completely
|
||||
* disables all functionality related to these authorized file operations.
|
||||
*
|
||||
* @see https://www.drupal.org/node/244924
|
||||
*
|
||||
* Remove the leading hash signs to disable.
|
||||
*/
|
||||
# $settings['allow_authorize_operations'] = FALSE;
|
||||
|
||||
/**
|
||||
* Default mode for directories and files written by Drupal.
|
||||
*
|
||||
* Value should be in PHP Octal Notation, with leading zero.
|
||||
*/
|
||||
# $settings['file_chmod_directory'] = 0775;
|
||||
# $settings['file_chmod_file'] = 0664;
|
||||
|
||||
/**
|
||||
* Public file base URL:
|
||||
*
|
||||
* An alternative base URL to be used for serving public files. This must
|
||||
* include any leading directory path.
|
||||
*
|
||||
* A different value from the domain used by Drupal to be used for accessing
|
||||
* public files. This can be used for a simple CDN integration, or to improve
|
||||
* security by serving user-uploaded files from a different domain or subdomain
|
||||
* pointing to the same server. Do not include a trailing slash.
|
||||
*/
|
||||
# $settings['file_public_base_url'] = 'http://downloads.example.com/files';
|
||||
|
||||
/**
|
||||
* Public file path:
|
||||
*
|
||||
* A local file system path where public files will be stored. This directory
|
||||
* must exist and be writable by Drupal. This directory must be relative to
|
||||
* the Drupal installation directory and be accessible over the web.
|
||||
*/
|
||||
# $settings['file_public_path'] = 'sites/default/files';
|
||||
|
||||
/**
|
||||
* Private file path:
|
||||
*
|
||||
* A local file system path where private files will be stored. This directory
|
||||
* must be absolute, outside of the Drupal installation directory and not
|
||||
* accessible over the web.
|
||||
*
|
||||
* Note: Caches need to be cleared when this value is changed to make the
|
||||
* private:// stream wrapper available to the system.
|
||||
*
|
||||
* See https://www.drupal.org/documentation/modules/file for more information
|
||||
* about securing private files.
|
||||
*/
|
||||
# $settings['file_private_path'] = '';
|
||||
|
||||
/**
|
||||
* Temporary file path:
|
||||
*
|
||||
* A local file system path where temporary files will be stored. This directory
|
||||
* must be absolute, outside of the Drupal installation directory and not
|
||||
* accessible over the web.
|
||||
*
|
||||
* If this is not set, the default for the operating system will be used.
|
||||
*
|
||||
* @see \Drupal\Component\FileSystem\FileSystem::getOsTemporaryDirectory()
|
||||
*/
|
||||
# $settings['file_temp_path'] = '/tmp';
|
||||
|
||||
/**
|
||||
* Session write interval:
|
||||
*
|
||||
* Set the minimum interval between each session write to database.
|
||||
* For performance reasons it defaults to 180.
|
||||
*/
|
||||
# $settings['session_write_interval'] = 180;
|
||||
|
||||
/**
|
||||
* String overrides:
|
||||
*
|
||||
* To override specific strings on your site with or without enabling the Locale
|
||||
* module, add an entry to this list. This functionality allows you to change
|
||||
* a small number of your site's default English language interface strings.
|
||||
*
|
||||
* Remove the leading hash signs to enable.
|
||||
*
|
||||
* The "en" part of the variable name, is dynamic and can be any langcode of
|
||||
* any added language. (eg locale_custom_strings_de for german).
|
||||
*/
|
||||
# $settings['locale_custom_strings_en'][''] = [
|
||||
# 'forum' => 'Discussion board',
|
||||
# '@count min' => '@count minutes',
|
||||
# ];
|
||||
|
||||
/**
|
||||
* A custom theme for the offline page:
|
||||
*
|
||||
* This applies when the site is explicitly set to maintenance mode through the
|
||||
* administration page or when the database is inactive due to an error.
|
||||
* The template file should also be copied into the theme. It is located inside
|
||||
* 'core/modules/system/templates/maintenance-page.html.twig'.
|
||||
*
|
||||
* Note: This setting does not apply to installation and update pages.
|
||||
*/
|
||||
# $settings['maintenance_theme'] = 'bartik';
|
||||
|
||||
/**
|
||||
* PHP settings:
|
||||
*
|
||||
* To see what PHP settings are possible, including whether they can be set at
|
||||
* runtime (by using ini_set()), read the PHP documentation:
|
||||
* http://php.net/manual/ini.list.php
|
||||
* See \Drupal\Core\DrupalKernel::bootEnvironment() for required runtime
|
||||
* settings and the .htaccess file for non-runtime settings.
|
||||
* Settings defined there should not be duplicated here so as to avoid conflict
|
||||
* issues.
|
||||
*/
|
||||
|
||||
/**
|
||||
* If you encounter a situation where users post a large amount of text, and
|
||||
* the result is stripped out upon viewing but can still be edited, Drupal's
|
||||
* output filter may not have sufficient memory to process it. If you
|
||||
* experience this issue, you may wish to uncomment the following two lines
|
||||
* and increase the limits of these variables. For more information, see
|
||||
* http://php.net/manual/pcre.configuration.php.
|
||||
*/
|
||||
# ini_set('pcre.backtrack_limit', 200000);
|
||||
# ini_set('pcre.recursion_limit', 200000);
|
||||
|
||||
/**
|
||||
* Configuration overrides.
|
||||
*
|
||||
* To globally override specific configuration values for this site,
|
||||
* set them here. You usually don't need to use this feature. This is
|
||||
* useful in a configuration file for a vhost or directory, rather than
|
||||
* the default settings.php.
|
||||
*
|
||||
* Note that any values you provide in these variable overrides will not be
|
||||
* viewable from the Drupal administration interface. The administration
|
||||
* interface displays the values stored in configuration so that you can stage
|
||||
* changes to other environments that don't have the overrides.
|
||||
*
|
||||
* There are particular configuration values that are risky to override. For
|
||||
* example, overriding the list of installed modules in 'core.extension' is not
|
||||
* supported as module install or uninstall has not occurred. Other examples
|
||||
* include field storage configuration, because it has effects on database
|
||||
* structure, and 'core.menu.static_menu_link_overrides' since this is cached in
|
||||
* a way that is not config override aware. Also, note that changing
|
||||
* configuration values in settings.php will not fire any of the configuration
|
||||
* change events.
|
||||
*/
|
||||
# $config['system.site']['name'] = 'My Drupal site';
|
||||
# $config['user.settings']['anonymous'] = 'Visitor';
|
||||
|
||||
/**
|
||||
* Fast 404 pages:
|
||||
*
|
||||
* Drupal can generate fully themed 404 pages. However, some of these responses
|
||||
* are for images or other resource files that are not displayed to the user.
|
||||
* This can waste bandwidth, and also generate server load.
|
||||
*
|
||||
* The options below return a simple, fast 404 page for URLs matching a
|
||||
* specific pattern:
|
||||
* - $config['system.performance']['fast_404']['exclude_paths']: A regular
|
||||
* expression to match paths to exclude, such as images generated by image
|
||||
* styles, or dynamically-resized images. The default pattern provided below
|
||||
* also excludes the private file system. If you need to add more paths, you
|
||||
* can add '|path' to the expression.
|
||||
* - $config['system.performance']['fast_404']['paths']: A regular expression to
|
||||
* match paths that should return a simple 404 page, rather than the fully
|
||||
* themed 404 page. If you don't have any aliases ending in htm or html you
|
||||
* can add '|s?html?' to the expression.
|
||||
* - $config['system.performance']['fast_404']['html']: The html to return for
|
||||
* simple 404 pages.
|
||||
*
|
||||
* Remove the leading hash signs if you would like to alter this functionality.
|
||||
*/
|
||||
# $config['system.performance']['fast_404']['exclude_paths'] = '/\/(?:styles)|(?:system\/files)\//';
|
||||
# $config['system.performance']['fast_404']['paths'] = '/\.(?:txt|png|gif|jpe?g|css|js|ico|swf|flv|cgi|bat|pl|dll|exe|asp)$/i';
|
||||
# $config['system.performance']['fast_404']['html'] = '<!DOCTYPE html><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>';
|
||||
|
||||
/**
|
||||
* Load services definition file.
|
||||
*/
|
||||
$settings['container_yamls'][] = $app_root . '/' . $site_path . '/services.yml';
|
||||
|
||||
/**
|
||||
* Override the default service container class.
|
||||
*
|
||||
* This is useful for example to trace the service container for performance
|
||||
* tracking purposes, for testing a service container with an error condition or
|
||||
* to test a service container that throws an exception.
|
||||
*/
|
||||
# $settings['container_base_class'] = '\Drupal\Core\DependencyInjection\Container';
|
||||
|
||||
/**
|
||||
* Override the default yaml parser class.
|
||||
*
|
||||
* Provide a fully qualified class name here if you would like to provide an
|
||||
* alternate implementation YAML parser. The class must implement the
|
||||
* \Drupal\Component\Serialization\SerializationInterface interface.
|
||||
*/
|
||||
# $settings['yaml_parser_class'] = NULL;
|
||||
|
||||
/**
|
||||
* Trusted host configuration.
|
||||
*
|
||||
* Drupal core can use the Symfony trusted host mechanism to prevent HTTP Host
|
||||
* header spoofing.
|
||||
*
|
||||
* To enable the trusted host mechanism, you enable your allowable hosts
|
||||
* in $settings['trusted_host_patterns']. This should be an array of regular
|
||||
* expression patterns, without delimiters, representing the hosts you would
|
||||
* like to allow.
|
||||
*
|
||||
* For example:
|
||||
* @code
|
||||
* $settings['trusted_host_patterns'] = [
|
||||
* '^www\.example\.com$',
|
||||
* ];
|
||||
* @endcode
|
||||
* will allow the site to only run from www.example.com.
|
||||
*
|
||||
* If you are running multisite, or if you are running your site from
|
||||
* different domain names (eg, you don't redirect http://www.example.com to
|
||||
* http://example.com), you should specify all of the host patterns that are
|
||||
* allowed by your site.
|
||||
*
|
||||
* For example:
|
||||
* @code
|
||||
* $settings['trusted_host_patterns'] = [
|
||||
* '^example\.com$',
|
||||
* '^.+\.example\.com$',
|
||||
* '^example\.org$',
|
||||
* '^.+\.example\.org$',
|
||||
* ];
|
||||
* @endcode
|
||||
* will allow the site to run off of all variants of example.com and
|
||||
* example.org, with all subdomains included.
|
||||
*/
|
||||
|
||||
/**
|
||||
* The default list of directories that will be ignored by Drupal's file API.
|
||||
*
|
||||
* By default ignore node_modules and bower_components folders to avoid issues
|
||||
* with common frontend tools and recursive scanning of directories looking for
|
||||
* extensions.
|
||||
*
|
||||
* @see \Drupal\Core\File\FileSystemInterface::scanDirectory()
|
||||
* @see \Drupal\Core\Extension\ExtensionDiscovery::scanDirectory()
|
||||
*/
|
||||
$settings['file_scan_ignore_directories'] = [
|
||||
'node_modules',
|
||||
'bower_components',
|
||||
];
|
||||
|
||||
/**
|
||||
* The default number of entities to update in a batch process.
|
||||
*
|
||||
* This is used by update and post-update functions that need to go through and
|
||||
* change all the entities on a site, so it is useful to increase this number
|
||||
* if your hosting configuration (i.e. RAM allocation, CPU speed) allows for a
|
||||
* larger number of entities to be processed in a single batch run.
|
||||
*/
|
||||
$settings['entity_update_batch_size'] = 50;
|
||||
|
||||
/**
|
||||
* Entity update backup.
|
||||
*
|
||||
* This is used to inform the entity storage handler that the backup tables as
|
||||
* well as the original entity type and field storage definitions should be
|
||||
* retained after a successful entity update process.
|
||||
*/
|
||||
$settings['entity_update_backup'] = TRUE;
|
||||
|
||||
/**
|
||||
* Load local development override configuration, if available.
|
||||
*
|
||||
* Use settings.local.php to override variables on secondary (staging,
|
||||
* development, etc) installations of this site. Typically used to disable
|
||||
* caching, JavaScript/CSS compression, re-routing of outgoing emails, and
|
||||
* other things that should not happen on development and testing sites.
|
||||
*
|
||||
* Keep this code block at the end of this file to take full effect.
|
||||
*/
|
||||
if (file_exists($app_root . '/' . $site_path . '/settings.local.php')) {
|
||||
include $app_root . '/' . $site_path . '/settings.local.php';
|
||||
}
|
||||
elseif (getenv('LANDO_SERVICE_NAME') == 'appserver' && file_exists($app_root . '/' . $site_path . '/settings.lando.php')) {
|
||||
include $app_root . '/' . $site_path . '/settings.lando.php';
|
||||
}
|
||||
|
||||
// Automatically generated include for settings managed by ddev.
|
||||
$ddev_settings = dirname(__FILE__) . '/settings.ddev.php';
|
||||
if (getenv('IS_DDEV_PROJECT') == 'true' && is_readable($ddev_settings)) {
|
||||
require $ddev_settings;
|
||||
}
|
||||
53
build.yaml
Normal file
53
build.yaml
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
name: docker-example-drupal-localgov
|
||||
language: php
|
||||
type: drupal-project
|
||||
|
||||
web:
|
||||
type: nginx
|
||||
|
||||
database:
|
||||
type: mariadb
|
||||
version: 10
|
||||
|
||||
php:
|
||||
version: 8.1-fpm-bullseye
|
||||
phpcs:
|
||||
standard: Drupal,DrupalPractice
|
||||
phpstan:
|
||||
level: max
|
||||
|
||||
docker-compose:
|
||||
services:
|
||||
database: ~
|
||||
php:
|
||||
build:
|
||||
target: build
|
||||
|
||||
dockerfile:
|
||||
stages:
|
||||
build:
|
||||
extends: base
|
||||
packages:
|
||||
- git
|
||||
- libpng-dev
|
||||
- libzip-dev
|
||||
- mariadb-client
|
||||
- unzip
|
||||
extensions:
|
||||
install:
|
||||
- gd
|
||||
- pdo_mysql
|
||||
- zip
|
||||
commands:
|
||||
- composer validate --strict
|
||||
- composer install
|
||||
extra_directories:
|
||||
- assets
|
||||
|
||||
test:
|
||||
extends: base
|
||||
commands:
|
||||
- parallel-lint src --no-progress
|
||||
- phpcs -vv
|
||||
- phpstan
|
||||
- phpunit --testdox
|
||||
81
composer.json
Normal file
81
composer.json
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
{
|
||||
"name": "localgovdrupal/localgov-project",
|
||||
"description": "Project template for the LocalGov Drupal distribution.",
|
||||
"type": "project",
|
||||
"license": "GPL-2.0-or-later",
|
||||
"homepage": "https://github.com/localgovdrupal/localgov_project",
|
||||
"repositories": {
|
||||
"drupal": {
|
||||
"type": "composer",
|
||||
"url": "https://packages.drupal.org/8"
|
||||
}
|
||||
},
|
||||
"require": {
|
||||
"composer/installers": "^1.10",
|
||||
"cweagans/composer-patches": "^1.6",
|
||||
"drupal/core-composer-scaffold": "^10.0",
|
||||
"drupal/core-recommended": "^10.0",
|
||||
"localgovdrupal/localgov": "3.x",
|
||||
"localgovdrupal/localgov_search_solr": "dev-feature/drupal-10 as 1.1.0-alpha1"
|
||||
},
|
||||
"require-dev": {
|
||||
"brianium/paratest": "^6.0",
|
||||
"drupal/coder": "^8.3",
|
||||
"drupal/core-dev": "^10.0",
|
||||
"mglaman/phpstan-drupal": "^1.0",
|
||||
"phpspec/prophecy-phpunit": "^2",
|
||||
"phpstan/phpstan": "^1.0",
|
||||
"phpstan/phpstan-deprecation-rules": "^1.0",
|
||||
"squizlabs/php_codesniffer": "^3.6"
|
||||
},
|
||||
"conflict": {
|
||||
"drupal/drupal": "*"
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true,
|
||||
"config": {
|
||||
"sort-packages": true,
|
||||
"bin-dir": "bin/",
|
||||
"allow-plugins": {
|
||||
"composer/installers": true,
|
||||
"cweagans/composer-patches": true,
|
||||
"drupal/core-composer-scaffold": true,
|
||||
"drupal/core-project-message": true,
|
||||
"phpstan/extension-installer": true,
|
||||
"dealerdirect/phpcodesniffer-composer-installer": true,
|
||||
"php-http/discovery": true
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"enable-patching": true,
|
||||
"drupal-scaffold": {
|
||||
"locations": {
|
||||
"web-root": "web/"
|
||||
},
|
||||
"file-mapping": {
|
||||
"[web-root]/sites/default/settings.php": {
|
||||
"mode": "replace",
|
||||
"path": "assets/composer/settings.php",
|
||||
"overwrite": false
|
||||
},
|
||||
"[web-root]/sites/default/settings.lando.php": {
|
||||
"mode": "replace",
|
||||
"path": "assets/composer/settings.lando.php",
|
||||
"overwrite": false
|
||||
},
|
||||
"[web-root]/sites/development.services.yml": "assets/composer/development.services.yml"
|
||||
}
|
||||
},
|
||||
"installer-paths": {
|
||||
"web/core": ["type:drupal-core"],
|
||||
"web/libraries/{$name}": ["type:drupal-library"],
|
||||
"web/modules/contrib/{$name}": ["type:drupal-module"],
|
||||
"web/profiles/contrib/{$name}": ["type:drupal-profile"],
|
||||
"web/themes/contrib/{$name}": ["type:drupal-theme"],
|
||||
"drush/Commands/contrib/{$name}": ["type:drupal-drush"],
|
||||
"web/modules/custom/{$name}": ["type:drupal-custom-module"],
|
||||
"web/themes/custom/{$name}": ["type:drupal-custom-theme"]
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
27
config/sync/.htaccess
Normal file
27
config/sync/.htaccess
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
# Deny all requests from Apache 2.4+.
|
||||
<IfModule mod_authz_core.c>
|
||||
Require all denied
|
||||
</IfModule>
|
||||
|
||||
# Deny all requests from Apache 2.0-2.2.
|
||||
<IfModule !mod_authz_core.c>
|
||||
Deny from all
|
||||
</IfModule>
|
||||
|
||||
# Turn off all options we don't need.
|
||||
Options -Indexes -ExecCGI -Includes -MultiViews
|
||||
|
||||
# Set the catch-all handler to prevent scripts from being executed.
|
||||
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006
|
||||
<Files *>
|
||||
# Override the handler again if we're run later in the evaluation list.
|
||||
SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003
|
||||
</Files>
|
||||
|
||||
# If we know how to do it safely, disable the PHP engine entirely.
|
||||
<IfModule mod_php5.c>
|
||||
php_flag engine off
|
||||
</IfModule>
|
||||
<IfModule mod_php7.c>
|
||||
php_flag engine off
|
||||
</IfModule>
|
||||
66
docker-compose.yaml
Normal file
66
docker-compose.yaml
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
x-app: &default-app
|
||||
volumes:
|
||||
- "${DOCKER_WEB_VOLUME:-./web:/app/web}"
|
||||
env_file:
|
||||
- .env
|
||||
restart: "${DOCKER_RESTART_POLICY:-unless-stopped}"
|
||||
networks:
|
||||
- default
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: "${DOCKER_MYSQL_CPUS:-0}"
|
||||
memory: "${DOCKER_MYSQL_MEMORY:-0}"
|
||||
labels:
|
||||
- "traefik.enabled=false"
|
||||
tty: true
|
||||
|
||||
services:
|
||||
web:
|
||||
<<: *default-app
|
||||
build:
|
||||
context: .
|
||||
target: web
|
||||
depends_on:
|
||||
- php
|
||||
networks:
|
||||
- default
|
||||
- web
|
||||
labels:
|
||||
- "traefik.docker.network=traefik_proxy"
|
||||
- "traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=Host(
|
||||
`${COMPOSE_PROJECT_NAME}.localhost`,
|
||||
)"
|
||||
profiles: [web]
|
||||
|
||||
php:
|
||||
<<: *default-app
|
||||
build:
|
||||
context: .
|
||||
target: build
|
||||
depends_on:
|
||||
- database
|
||||
profiles: [php]
|
||||
|
||||
database:
|
||||
image: mariadb:10
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: "${DOCKER_MYSQL_CPUS:-0}"
|
||||
memory: "${DOCKER_MYSQL_MEMORY:-0}"
|
||||
volumes:
|
||||
- db-data:/var/lib/mysql
|
||||
env_file:
|
||||
- .env
|
||||
labels:
|
||||
- "traefik.enabled=false"
|
||||
environment:
|
||||
MYSQL_RANDOM_ROOT_PASSWORD: true
|
||||
profiles: [database]
|
||||
|
||||
volumes:
|
||||
db-data: {}
|
||||
networks:
|
||||
web:
|
||||
name: traefik_proxy
|
||||
19
justfile
Normal file
19
justfile
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
default:
|
||||
@just --list
|
||||
|
||||
composer *args:
|
||||
just _exec php composer {{ args }}
|
||||
|
||||
phpunit *args:
|
||||
just _run --rm php phpunit {{ args }}
|
||||
|
||||
alias test := phpunit
|
||||
|
||||
drush *args:
|
||||
just _exec php drush {{ args }}
|
||||
|
||||
_exec +args:
|
||||
docker compose exec {{ args }}
|
||||
|
||||
_run +args:
|
||||
docker compose run {{ args }}
|
||||
7
phpcs.xml.dist
Normal file
7
phpcs.xml.dist
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0"?>
|
||||
<ruleset name="docker-example-drupal-localgov coding standards">
|
||||
<description>PHPCS configuration file for docker-example-drupal-localgov.</description>
|
||||
<file>src</file>
|
||||
<arg value="np"/>
|
||||
<rule ref="Drupal,DrupalPractice"/>
|
||||
</ruleset>
|
||||
12
phpstan.neon
Normal file
12
phpstan.neon
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
parameters:
|
||||
customRulesetUsed: true
|
||||
reportUnmatchedIgnoredErrors: false
|
||||
# Ignore phpstan-drupal extension's rules.
|
||||
ignoreErrors:
|
||||
- '#\Drupal calls should be avoided in classes, use dependency injection instead#'
|
||||
- '#Plugin definitions cannot be altered.#'
|
||||
- '#Missing cache backend declaration for performance.#'
|
||||
- '#Plugin manager has cache backend specified but does not declare cache tags.#'
|
||||
#includes:
|
||||
# - vendor/mglaman/phpstan-drupal/extension.neon
|
||||
# - vendor/phpstan/phpstan-deprecation-rules/rules.neon
|
||||
5
phpstan.neon.dist
Normal file
5
phpstan.neon.dist
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
parameters:
|
||||
level: max
|
||||
paths:
|
||||
- src
|
||||
|
||||
37
phpunit.xml.dist
Normal file
37
phpunit.xml.dist
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<phpunit
|
||||
beStrictAboutChangesToGlobalState="true"
|
||||
beStrictAboutOutputDuringTests="true"
|
||||
beStrictAboutTestsThatDoNotTestAnything="true"
|
||||
bootstrap="web/core/tests/bootstrap.php"
|
||||
cacheResult="false"
|
||||
colors="true"
|
||||
failOnWarning="true"
|
||||
printerClass="\Drupal\Tests\Listeners\HtmlOutputPrinter"
|
||||
>
|
||||
<php>
|
||||
<env name="BROWSERTEST_OUTPUT_BASE_URL" value=""/>
|
||||
<env name="BROWSERTEST_OUTPUT_DIRECTORY" value=""/>
|
||||
<env name="MINK_DRIVER_ARGS" value=''/>
|
||||
<env name="MINK_DRIVER_ARGS_WEBDRIVER" value=''/>
|
||||
<env name="MINK_DRIVER_CLASS" value=''/>
|
||||
<env name="SIMPLETEST_BASE_URL" value="http://web"/>
|
||||
<env name="SIMPLETEST_DB" value="sqlite://localhost//dev/shm/test.sqlite"/>
|
||||
|
||||
<ini name="error_reporting" value="32767"/>
|
||||
<ini name="memory_limit" value="-1"/>
|
||||
</php>
|
||||
|
||||
<testsuites>
|
||||
<testsuite name="functional">
|
||||
<directory>./web/modules/custom/**/tests/**/Functional</directory>
|
||||
</testsuite>
|
||||
<testsuite name="kernel">
|
||||
<directory>./web/modules/custom/**/tests/**/Kernel</directory>
|
||||
</testsuite>
|
||||
<testsuite name="unit">
|
||||
<directory>./web/modules/custom/**/tests/**/Unit</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
</phpunit>
|
||||
5
tools/docker/images/php/root/usr/local/bin/docker-entrypoint-php
Executable file
5
tools/docker/images/php/root/usr/local/bin/docker-entrypoint-php
Executable file
|
|
@ -0,0 +1,5 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
[[ -f composer.json && ! -d vendor ]] && composer install
|
||||
|
||||
eval "$@"
|
||||
20
tools/docker/images/web/root/etc/nginx/conf.d/default.conf
Normal file
20
tools/docker/images/web/root/etc/nginx/conf.d/default.conf
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
server {
|
||||
server_name _;
|
||||
|
||||
root /app/web;
|
||||
|
||||
location / {
|
||||
try_files $uri /index.php?$query_string;
|
||||
}
|
||||
|
||||
location ~ \.php(/|$) {
|
||||
fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
|
||||
try_files $fastcgi_script_name =404;
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
fastcgi_param PATH_INFO $fastcgi_path_info;
|
||||
fastcgi_param QUERY_STRING $query_string;
|
||||
fastcgi_intercept_errors on;
|
||||
fastcgi_pass php:9000;
|
||||
}
|
||||
}
|
||||
Reference in a new issue