Compare commits

..

1 Commits

Author SHA1 Message Date
Julius Härtl f334ecfbdd WIP new structure
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2018-08-27 11:18:18 +02:00
180 changed files with 509 additions and 103540 deletions
-11
View File
@@ -1,11 +0,0 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
- package-ecosystem: "docker"
directory: "/docker/"
schedule:
interval: "daily"
-147
View File
@@ -1,147 +0,0 @@
name: 'Docker Publish'
on:
schedule:
- cron: '0 2 * * *'
pull_request:
push:
branches:
- master
release:
types: [published]
jobs:
push_to_registry:
name: Build image
runs-on: ubuntu-latest
if: github.repository == 'juliusknorr/nextcloud-docker-dev'
strategy:
fail-fast: false
matrix:
container:
- php85
- php84
- php83
- php82
- php81
- php80
- php74
- php73
- php72
- php71
- push
- saml
- nginx
- elasticsearch
- keycloak
- mailhog
- ldap
- lookupserver
- smb
- codedev
- code
- talk-janus
- noop
permissions:
packages: write
contents: read
steps:
- name: Check out the repo
uses: actions/checkout@v6
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Cache Docker layers
uses: actions/cache@v5
with:
path: /tmp/.buildx-cache
key: ${{ matrix.container }}-buildx-${{ github.sha }}
restore-keys: |
${{ matrix.container }}-buildx-
- name: Log in to GitHub Container Registry
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Available platforms
run: echo ${{ steps.buildx.outputs.platforms }}
- name: Set dockerfile path
id: dockerfile
run: |
NAME="${{ matrix.container }}"
DOCKERFILE=$([[ -f "docker/$NAME/Dockerfile" ]] && echo "docker/$NAME/Dockerfile" || echo "docker/Dockerfile.$NAME")
echo "DOCKERFILE=$DOCKERFILE" >> $GITHUB_OUTPUT
- name: Build container image
uses: docker/build-push-action@v7
with:
push: false
context: docker/
platforms: linux/amd64,linux/arm64
file: ${{ steps.dockerfile.outputs.DOCKERFILE }}
tags: |
ghcr.io/juliusknorr/nextcloud-dev-${{ matrix.container }}:${{ github.sha }}
ghcr.io/juliusknorr/nextcloud-dev-${{ matrix.container }}:latest
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new
- name: Push container image
uses: docker/build-push-action@v7
if: github.ref == 'refs/heads/master' || github.event_name == 'release'
with:
push: true
context: docker/
platforms: linux/amd64,linux/arm64
file: ${{ steps.dockerfile.outputs.DOCKERFILE }}
tags: |
ghcr.io/juliusknorr/nextcloud-dev-${{ matrix.container }}:${{ github.event_name == 'release' && 'release' || 'latest' }}
ghcr.io/juliusknorr/nextcloud-dev-${{ matrix.container }}:${{ github.ref_name }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new
- name: Start containers with docker compose
if: matrix.container == 'php82' || matrix.container == 'php83' || matrix.container == 'php84'
run: |
./bootstrap.sh
PHP_VERSION=$(echo ${{ matrix.container }} | sed -e 's/^php//')
echo "PHP_VERSION=${PHP_VERSION}" >> .env
# exit if php version is not numeric or below 80 or above 84 to only test against supported ones in server master
if ! [[ $PHP_VERSION =~ ^[0-9]+$ ]] || [[ $PHP_VERSION -lt 80 ]] || [[ $PHP_VERSION -gt 84 ]]; then
exit 0
fi
docker compose up -d nextcloud
# wait for nextcloud to be up
# wait up to 5 minutes
for i in {1..300}; do
if curl -s http://nextcloud.local/index.php/login | grep -q 'Login'; then
break
fi
sleep 1
done
curl http://nextcloud.local/status.php
- uses: actions/setup-node@v6
if: matrix.container == 'php82' || matrix.container == 'php83' || matrix.container == 'php84'
with:
node-version: latest
- name: Install dependencies
if: matrix.container == 'php82' || matrix.container == 'php83' || matrix.container == 'php84'
working-directory: tests
run: npm ci
- name: Install Playwright Browsers
if: matrix.container == 'php82' || matrix.container == 'php83' || matrix.container == 'php84'
working-directory: tests
run: npx playwright install --with-deps
- name: Run Playwright tests
if: matrix.container == 'php82' || matrix.container == 'php83' || matrix.container == 'php84'
working-directory: tests
run: npx playwright test
- uses: actions/upload-artifact@v6
if: matrix.container == 'php82' || matrix.container == 'php83' || matrix.container == 'php84'
with:
name: playwright-report-${{ matrix.container }}
path: tests/playwright-report/
retention-days: 30
- name: Move cache
run: |
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
-51
View File
@@ -1,51 +0,0 @@
name: Publish MkDocs to GitHub Pages
on:
push:
branches:
- master
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
# Single deploy job since we're just deploying
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup Pages
uses: actions/configure-pages@v5
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: 3.x
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install mkdocs mkdocs-material
- name: Build MkDocs
run: mkdocs build
- name: Upload artifact
uses: actions/upload-pages-artifact@v4
with:
# Upload entire repository
path: './site'
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
-18
View File
@@ -1,18 +0,0 @@
on:
pull_request:
push:
branches:
- master
name: 'Shellcheck'
jobs:
shellcheck:
name: Shellcheck
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Run ShellCheck
uses: ludeeus/action-shellcheck@master
env:
SHELLCHECK_OPTS: -x
-18
View File
@@ -1,18 +0,0 @@
/.vscode
/data/nginx/vhost.d/
/data/ssl/
/data/shared/
/workspace/
/.env
/*.env
!example.env
/data/skeleton/
/wip/
/site
node_modules/
/tests/test-results/
/tests/playwright-report/
/tests/blob-report/
/tests/playwright/.cache/
/.idea/
.DS_Store
+62
View File
@@ -0,0 +1,62 @@
FROM php:7.0-apache
RUN apt-get update
RUN apt-get install -y --no-install-recommends \
libcurl4-openssl-dev \
libfreetype6-dev \
libicu-dev \
libjpeg-dev \
libldap2-dev \
libmcrypt-dev \
libmemcached-dev \
libpng-dev \
libpq-dev \
libxml2-dev
RUN debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; \
docker-php-ext-configure gd --with-freetype-dir=/usr --with-png-dir=/usr --with-jpeg-dir=/usr; \
docker-php-ext-configure ldap --with-libdir="lib/$debMultiarch"; \
docker-php-ext-install \
exif \
gd \
intl \
ldap \
mcrypt \
opcache \
pcntl \
pdo_mysql \
pdo_pgsql \
zip
RUN pecl install APCu-5.1.11; \
pecl install memcached-3.0.4; \
pecl install redis-3.1.6; \
pecl install xdebug \
\
docker-php-ext-enable \
apcu \
memcached \
redis \
xdebug
# dev tools
RUN apt-get install -y --no-install-recommends \
git curl vim sudo
RUN bash -c 'echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/xdebug.ini; \
echo "xdebug.remote_connect_back=on" >> /usr/local/etc/php/conf.d/xdebug.ini; \
echo "xdebug.idekey=PHPSTORM" >> /usr/local/etc/php/conf.d/xdebug.ini; \
echo "xdebug.remote_autostart=1" >> /usr/local/etc/php/conf.d/xdebug.ini; \
echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" >> /usr/local/etc/php/conf.d/xdebug.ini \
'
ADD configs/autoconfig_mysql.php configs/autoconfig_pgsql.php configs/autoconfig_oci.php configs/s3.php configs/config.php /root/
ADD bootstrap.sh occ /usr/local/bin/
ENV WEBROOT /var/www/html
WORKDIR /var/www/html
ENTRYPOINT ["/usr/local/bin/bootstrap.sh"]
CMD ["apache2-foreground"]
-661
View File
@@ -1,661 +0,0 @@
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
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
them 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.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey 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;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If 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 convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero 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 that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
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.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
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.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
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
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.
-67
View File
@@ -1,67 +0,0 @@
SHELL := /bin/bash
.PHONY: images docker-build pull-all docs docs-watch
.ONESHELL:
images: docker/*/Dockerfile docker/Dockerfile.*
.ONESHELL:
pull-all:
for file in $$(find docker/ -maxdepth 1 -type f -iname 'Dockerfile.*'); do \
NAME=$$(echo $$file | sed 's/^.*\.//'); \
echo "=> Pulling image $$NAME"; docker pull "ghcr.io/juliusknorr/nextcloud-dev-$${NAME}"; \
done
for file in $$(find docker -maxdepth 2 -type f -iname 'Dockerfile'); do \
NAME=$$(basename $$(dirname $$file)); \
echo "=> Pulling image $$NAME"; docker pull "ghcr.io/juliusknorr/nextcloud-dev-$${NAME}"; \
done
pull-installed:
docker image ls | grep juliusknorr/nextcloud-dev | cut -f 1 -d " "
docker image ls | grep juliusknorr/nextcloud-dev | cut -f 1 -d " " | xargs -L 1 docker pull
# Empty target to always build
docker-build:
docker/%/Dockerfile: docker-build
NAME=$$(basename $$(dirname $@)); \
echo "=> Building dockerfile" $@ as ghcr.io/juliusknorr/nextcloud-dev-$$NAME:latest; \
(cd docker && docker build -t ghcr.io/juliusknorr/nextcloud-dev-$$NAME:latest -f $$NAME/Dockerfile .)
docker/Dockerfile.%: docker-build
NAME=$$(echo $$(basename $@) | sed 's/^.*\.//'); \
echo "=> Building dockerfile" $@ as ghcr.io/juliusknorr/nextcloud-dev-$$NAME:latest; \
(cd docker && docker build -t ghcr.io/juliusknorr/nextcloud-dev-$$NAME:latest -f Dockerfile.$$NAME .)
check: dockerfilelint shellcheck
.ONESHELL:
dockerfilelint:
for file in $$(find docker/ -type f -iname 'Dockerfile.*' -maxdepth 1); do dockerfilelint $$file; done;
for file in $$(find docker -type f -iname 'Dockerfile' -maxdepth 2); do dockerfilelint $$file; done;
.ONESHELL:
shellcheck:
for file in $$(find . -type f -iname '*.sh' -not -path './wip/*'); do shellcheck --format=gcc -x $$file; done;
for file in $$(find ./scripts -type f); do shellcheck --format=gcc -x $$file; done;
.ONESHELL:
template-apply:
cat docker/Dockerfile.php.template | sed 's/php:8.2/php:7.1/' > docker/Dockerfile.php71
cat docker/Dockerfile.php.template | sed 's/php:8.2/php:7.2/' > docker/Dockerfile.php72
cat docker/Dockerfile.php.template | sed 's/php:8.2/php:7.3/' > docker/Dockerfile.php73
cat docker/Dockerfile.php.template | sed 's/php:8.2/php:7.4/' > docker/Dockerfile.php74
cat docker/Dockerfile.php.template | sed 's/php:8.2/php:8.0/' > docker/Dockerfile.php80
cat docker/Dockerfile.php.template | sed 's/php:8.2/php:8.1/' > docker/Dockerfile.php81
cat docker/Dockerfile.php.template | sed 's/php:8.2/php:8.2/' > docker/php82/Dockerfile
cat docker/Dockerfile.php.template | sed 's/php:8.2/php:8.3/' > docker/php83/Dockerfile
cat docker/Dockerfile.php.template | sed 's/php:8.2/php:8.4/' > docker/php84/Dockerfile
cat docker/Dockerfile.php.template | sed 's/php:8.2/php:8.5/' > docker/php85/Dockerfile
docs:
pip3 install mkdocs
mkdocs
docs-watch:
pip3 install mkdocs
mkdocs serve
+95 -79
View File
@@ -1,103 +1,119 @@
# Nextcloud development environment on Docker Compose
# nextcloud-dev-docker-compose
[Documentation](https://juliusknorr.github.io/nextcloud-docker-dev/) | [Nextcloud Developer Portal](https://nextcloud.com/developer/)
Nextcloud development environment using docker-compose
Nextcloud's development environment using Docker Compose providing a large variety of services for Nextcloud server and app development and testing.
## Features
**DO NOT USE THIS IN PRODUCTION** Various settings in this setup are considered insecure and default passwords and secrets are used all over the place
- sqlite setup running on localhost:8010
- mysql setup running on localhost:8011
- Xdebug enabled
- ☁ Nextcloud containers for running multiple versions
- 🐘 Multiple PHP versions
- 🔒 Nginx proxy with optional SSL termination
- 🛢️ MySQL/PostgreSQL/MariaDB/SQLite/MaxScale, Redis cache
- 💾 Local or S3 primary storage
- 👥 LDAP with example user data, Keycloak
- ✉ Mailhog for testing mail sending
- 🚀 Blackfire, Xdebug for profiling and debugging
- 📄 Lots of integrating service containers: Collabora Online, Onlyoffice, Elasticsearch, ...
## Getting startd
## Tutorial
git clone git@github.com:nextcloud/server.git
cd server
export NEXTCLOUD_SOURCE=$PWD
docker-compose up
You can find a step-by-step tutorial on how to use this setup in the [Nextcloud Developer Portal](https://nextcloud.com/developer/). It will guide you through the setup and show you how to use it for app development: https://cloud.nextcloud.com/s/iyNGp8ryWxc7Efa?path=%2F1%20Setting%20up%20a%20development%20environment
## Environment variables
In detail explanation of the setup and its features and configuration options can be found in the [nextcloud-docker-dev documentation](https://juliusknorr.github.io/nextcloud-docker-dev/).
NEXTCLOUD_SOURCE local path to your nextcloud source directory
NEXTCLOUD_AUTOINSTALL set to YES if you want to automatically install
NEXTCLOUD_AUTOINSTALL_APPS set list of apps to be enabled after installation
## Quickstart
## Using the nc-dev-setup script
### Persistent development setup
Clone the repo to some location of your choice
> [!TIP]
> This is the recommended way to run the setup for development. You will have a local clone of all required source code.
git clone https://github.com/juliushaertl/nextcloud-docker-dev.git
cd nextcloud-docker-dev
To start the setup run the following commands to clone the repository and bootstrap the setup. This will prepare your setup and clone the Nextcloud server repository and required apps into the `workspace` folder.
```bash
git clone https://github.com/juliusknorr/nextcloud-docker-dev
cd nextcloud-docker-dev
./bootstrap.sh
```
Create a configuration directory
Depending on your docker version you will need to use `docker-compose` instead of `docker compose` in the following commands.
mkdir -p ~/.nextcloud/nc-dev-setup/
This may take some time depending on your internet connection speed.
Symlink docker-compose file and binary
ln -s nc-dev-setup /usr/local/bin/nc-dev
ln -s docker-compose.yml ~/.nextcloud/nc-dev-setup/docker-compose.yml
Once done you can start the Nextcloud container using:
```bash
docker compose up nextcloud
```
Create a configuration file for your source tree:
You can also start it in the background using `docker compose up -d nextcloud`.
echo "NEXTCLOUD_SOURCE=~/repos/nextcloud/server" > ~/.nextcloud/nc-dev-server/master.conf
echo "NEXTCLOUD_AUTOINSTALL=YES" >> ~/.nextcloud/nc-dev-server/master.conf
echo "NEXTCLOUD_AUTOINSTALL_APPS=YES" >> ~/.nextcloud/nc-dev-server/master.conf
You can then access your Nextcloud instance at [http://nextcloud.local](http://nextcloud.local). The default username is `admin` and the password is `admin`. [Other users can be found in the documentation](https://juliusknorr.github.io/nextcloud-docker-dev/basics/overview/#default-users).
> [!WARN]
> Note that for performance reasons the server repository might have been cloned with `--depth=1` by default. To get the full history it is highly recommended to run:
>
> ```bash
> cd workspace/server
> git fetch --unshallow
> git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
> git fetch origin
> ```
If you want to use multiple nextcloud versions in parallel, you can easily add another configuration file for that:
### Standalone containers
echo "NEXTCLOUD_SOURCE=~/repos/nextcloud/server" > ~/.nextcloud/nc-dev-server/stable12.conf
echo "NEXTCLOUD_AUTOINSTALL=YES" >> ~/.nextcloud/nc-dev-server/stable12.conf
echo "NEXTCLOUD_AUTOINSTALL_APPS=YES" >> ~/.nextcloud/nc-dev-server/stable12.conf
> [!TIP]
> This is a very simple way but doesn't cover all features. If you are looking for a fully featured setup you may skip to the next section
There is a standalone version of the Nextcloud containers available that can be used to run Nextcloud without the other services. This is useful if you are just wanting to get started with app development against a specific server version, or to just have a quick way to develop, test or debug.
These containers support automatic fetching of the server source code and use SQLite as the database. The server source code is fetched from the official Nextcloud server repository and the version can be specified using the `NEXTCLOUD_VERSION` environment variable. The default version is `master`.
## LDAP
Running the containers does not need this repository to be cloned.
Example ldif is generated using http://ldapwiki.com/wiki/LDIF%20Generator
Example for running a Nextcloud server from the master branch of server:
```bash
docker run --rm -p 8080:80 ghcr.io/juliusknorr/nextcloud-dev-php81:latest
```
For app development you can mount your app directly into the container:
```bash
docker run --rm -p 8080:80 -v ~/path/to/appid:/var/www/html/apps-extra/appid ghcr.io/juliusknorr/nextcloud-dev-php81:latest
```
The `SERVER_BRANCH` environment variable can be used to run different versions of Nextcloud by specifying either a server branch or git tag.
```bash
docker run --rm -p 8080:80 -e SERVER_BRANCH=v24.0.1 ghcr.io/juliusknorr/nextcloud-dev-php81:latest
```
You can also mount your local server source code into the container to run a local version of Nextcloud:
```bash
docker run --rm -p 8080:80 -e SERVER_BRANCH=v24.0.1 -v /tmp/server:/var/www/html ghcr.io/juliusknorr/nextcloud-dev-php81:latest
```
## More features
You can find documentation for more advanced features in [nextcloud-docker-dev documentation](https://juliusknorr.github.io/nextcloud-docker-dev/) for example:
- Running stable Nextcloud versions in parallel
- Using different database backends
- Using HTTPS
occ ldap:show-config
+-------------------------------+--------------------------------------------------------------------+
| Configuration | |
+-------------------------------+--------------------------------------------------------------------+
| hasMemberOfFilterSupport | 0 |
| hasPagedResultSupport | |
| homeFolderNamingRule | |
| lastJpegPhotoLookup | 0 |
| ldapAgentName | cn=admin,dc=example,dc=org |
| ldapAgentPassword | *** |
| ldapAttributesForGroupSearch | |
| ldapAttributesForUserSearch | |
| ldapBackupHost | ldap2.example.org |
| ldapBackupPort | 389 |
| ldapBase | dc=example,dc=org |
| ldapBaseGroups | |
| ldapBaseUsers | |
| ldapCacheTTL | 600 |
| ldapConfigurationActive | 1 |
| ldapDefaultPPolicyDN | |
| ldapDynamicGroupMemberURL | |
| ldapEmailAttribute | mail |
| ldapExperiencedAdmin | 0 |
| ldapExpertUUIDGroupAttr | |
| ldapExpertUUIDUserAttr | |
| ldapExpertUsernameAttr | |
| ldapGidNumber | gidNumber |
| ldapGroupDisplayName | cn |
| ldapGroupFilter | (&(|(objectclass=organizationalUnit))) |
| ldapGroupFilterGroups | |
| ldapGroupFilterMode | 0 |
| ldapGroupFilterObjectclass | organizationalUnit |
| ldapGroupMemberAssocAttr | uniqueMember |
| ldapHost | ldap.example.org |
| ldapIgnoreNamingRules | |
| ldapLoginFilter | (&(|(objectclass=inetOrgPerson)(objectclass=person))(|(uid=%uid))) |
| ldapLoginFilterAttributes | uid |
| ldapLoginFilterEmail | 0 |
| ldapLoginFilterMode | 0 |
| ldapLoginFilterUsername | 1 |
| ldapNestedGroups | 0 |
| ldapOverrideMainServer | |
| ldapPagingSize | 500 |
| ldapPort | 389 |
| ldapQuotaAttribute | |
| ldapQuotaDefault | |
| ldapTLS | 0 |
| ldapUserAvatarRule | default |
| ldapUserDisplayName | cn |
| ldapUserDisplayName2 | |
| ldapUserFilter | (|(objectclass=inetOrgPerson)(objectclass=person)) |
| ldapUserFilterGroups | |
| ldapUserFilterMode | 0 |
| ldapUserFilterObjectclass | inetOrgPerson;person |
| ldapUuidGroupAttribute | auto |
| ldapUuidUserAttribute | auto |
| turnOffCertCheck | 0 |
| turnOnPasswordChange | 0 |
| useMemberOfToDetectMembership | 1 |
+-------------------------------+--------------------------------------------------------------------+
+54 -284
View File
@@ -1,299 +1,69 @@
#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail
OCC="sudo -u www-data $WEBROOT/occ"
APPS_TO_INSTALL=(viewer recommendations files_pdfviewer profiler hmr_enabler circles)
NEXTCLOUD_AUTOINSTALL_APPS=(viewer profiler hmr_enabler)
SERVER_CLONE=squashed
APPS_CLONE_FILTER=
STATUS=`$OCC status`
print_help() {
cat << EOF
bootstrap.sh [--full-clone|--clone-no-blobs] [--clone-all-apps-filtered] [--] APPS
setup() {
cp /root/config.php $WEBROOT/config/config.php
This command will initialize the debug environment for app developers.
if [ "$SQL" = "mysql" ]
then
# wait until mysql is ready
while ! timeout 1 bash -c "echo > /dev/tcp/nc-database-mysql/3306"; do sleep 2; done
cp /root/autoconfig_mysql.php $WEBROOT/config/autoconfig.php
SQLHOST=nc-database-mysql
fi
The following options can be provided:
if [ "$SQL" = "pgsql" ]
then
while ! timeout 1 bash -c "echo > /dev/tcp/nc-database-postgres/5432"; do sleep 2; done
cp /root/autoconfig_pgsql.php $WEBROOT/config/autoconfig.php
SQLHOST=nc-database-postgres
fi
--full-clone Clone the server repository with the complete history included
--clone-no-blobs Clone the server repository with the history but omitting the
file contents. A network connection might be required if checking
out commits is done.
--full-clone and --clone-no-blobs is mutually exclusive.
--clone-all-apps-filtered
Do not only reduce the history of the server repository but also
the cloned apps.
if [ "$SQL" = "oci" ]
then
cp /root/autoconfig_oci.php $WEBROOT/config/autoconfig.php
fi
# We copy the default config to the container
cp /root/config.php /var/www/html/config/config.php
chown -R www-data:www-data $WEBROOT/data $WEBROOT/config $WEBROOT/apps-writable
USER=admin
PASSWORD=admin
if [ "$NEXTCLOUD_AUTOINSTALL" = "YES" ]
then
echo "Starting auto installation"
if [ "$SQL" = "oci" ]; then
$OCC maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database=$SQL --database-name=xe --database-host=$SQLHOST --database-user=system --database-pass=oracle
else
$OCC maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database=$SQL --database-name=nextcloud --database-host=$SQLHOST --database-user=nextcloud --database-pass=nextcloud
fi;
for app in $NEXTCLOUD_AUTOINSTALL_APPS; do
echo "Enable app ${app}"
$OCC app:enable $app
done
fi;
APPS The apps to add to the development setup on top of the default apps
The default apps to be installed: ${APPS_TO_INSTALL[@]}
EOF
}
while [ $# -gt 0 ]
do
case "$1" in
--full-clone)
SERVER_CLONE=full
;;
--clone-no-blobs)
SERVER_CLONE=filter-blobs
;;
--clone-all-apps-filtered)
APPS_CLONE_FILTER=y
;;
--help|-h)
print_help
exit 0
;;
--)
shift
break
;;
*)
APPS_TO_INSTALL+=("$1")
NEXTCLOUD_AUTOINSTALL_APPS+=("$1")
;;
esac
shift
done
# You can specify additional apps to install on the command line.
APPS_TO_INSTALL+=( "$@" )
NEXTCLOUD_AUTOINSTALL_APPS+=( "$@" )
# Already executed
if [ -f ".env" ]; then
echo "⏩ .env file found, so assuming you already ran this script."
echo " Validating the setup"
# shellcheck disable=SC1091
source .env
set +o errexit
echo "Server master repository path: ${REPO_PATH_SERVER}"
REPO_VERSION=$(grep "OC_VersionString" "${REPO_PATH_SERVER}/version.php" | cut -d "'" -f 2)
if [ -d "$REPO_PATH_SERVER" ] && [ -n "$REPO_VERSION" ]; then
echo "$REPO_VERSION"
elif [ -z "$REPO_VERSION" ]; then
echo "❌ Repository version.php cannot be detected"
else
echo "❌ Repository path does not exist"
fi
for i in stable29 stable30 stable31 stable32 stable33
do
echo "Stable $i repository path: ${STABLE_ROOT_PATH}/${i}"
STABLE_VERSION=$(grep "OC_VersionString" "${STABLE_ROOT_PATH}/${i}/version.php" | cut -d "'" -f 2)
if [ -d "${STABLE_ROOT_PATH}/${i}" ] && [ -n "$STABLE_VERSION" ]; then
echo "$STABLE_VERSION"
elif [ -z "$REPO_VERSION" ]; then
echo "$i version.php cannot be detected"
else
echo "$i repository path does not exist"
fi
done
exit 0
fi
case $SERVER_CLONE in
squashed)
CLONE_PARAMS=(--depth 1)
;;
filter-blobs)
CLONE_PARAMS=(--filter blob:none)
;;
full)
CLONE_PARAMS=()
;;
*)
echo "Unknown cloning parameter $SERVER_CLONE was found. Please report this."
exit 1
esac
if [ -n "$APPS_CLONE_FILTER" ]
if [[ "$STATUS" != *"installed: true"* ]]
then
APPS_CLONE_PARAMS=("${CLONE_PARAMS[@]}")
else
APPS_CLONE_PARAMS=()
setup
# run custom shell script from nc root
[ -e /var/www/html/nc-dev-autosetup.sh ] && bash /var/www/html/nc-dev-autosetup.sh
echo "Finished setup using $SQL database…"
fi
indent() {
sed 's/^/ /'
}
echo "=> Watching log file"
tail --follow --retry $WEBROOT/data/nextcloud.log &
indent_cli() {
if [[ "$OSTYPE" == "darwin"* ]]; then
sed -l 's/^/ > /'
else
sed -u 's/^/ > /'
fi
}
function install_server() {
if [ -d workspace/server/.git ]; then
echo "🆗 Server is already installed." | indent
return
fi
mkdir -p workspace/
(
(
echo "🌏 Fetching server (this might take a while to finish)" &&
git clone ${CLONE_PARAMS[@]+"${CLONE_PARAMS[@]}"} https://github.com/nextcloud/server.git workspace/server --progress 2>&1 &&
cd workspace/server && git submodule update --init --progress 2>&1
) || echo "❌ Failed to clone Nextcloud server code"
) | indent
}
function install_app() {
TARGET=workspace/server/apps-extra/"$1"
if [ -d "$TARGET"/.git ]; then
echo "🆗 App $1 is already installed." | indent
return
fi
(
echo "🌏 Fetching $1"
(git clone ${APPS_CLONE_PARAMS[@]+"${APPS_CLONE_PARAMS[@]}"} https://github.com/nextcloud/"$1".git "$TARGET" 2>&1 | indent_cli &&
echo "$1 installed") ||
echo "❌ Failed to install $1"
) | indent
}
function is_installed() {
(
if [ -x "$(command -v "$1")" ]; then
echo "$1 is properly installed"
else
echo "❌ Install $1 before running this script"
exit 1
fi
) | indent
}
echo
echo "⏩ Performing system checks"
is_installed docker
is_installed git
DCC=
docker-compose version >/dev/null 2>/dev/null && DCC='docker-compose'
docker compose version >/dev/null 2>/dev/null && DCC='docker compose'
if [ -z "$DCC" ]; then
echo "❌ Install docker-compose before running this script"
exit 1
fi
(
(docker ps 2>&1 >/dev/null && echo "✅ Docker is properly executable") ||
(echo "❌ Cannot run docker ps, you might need to check that your user is able to use docker properly" && exit 1)
) | indent
echo
echo
echo "⏩ Setup your environment in an .env file"
if [ ! -f ".env" ]; then
cat <<EOT >.env
COMPOSE_PROJECT_NAME=master
PROTOCOL=http
DOMAIN_SUFFIX=.local
REPO_PATH_SERVER="$PWD/workspace/server"
STABLE_ROOT_PATH="$PWD/workspace"
NEXTCLOUD_AUTOINSTALL_APPS="${NEXTCLOUD_AUTOINSTALL_APPS[@]}"
DOCKER_SUBNET=192.168.21.0/24
PORTBASE=821
PHP_XDEBUG_MODE=develop
# SQL variant to use, possible values: sqlite, mysql, pgsql
SQL=mysql
PRIMARY=local
# other values: "database-pgsql"
EOT
fi
./scripts/update-hosts
if [[ $(uname -m) == 'arm64' ]]; then
echo "Setting custom containers for arm platform"
echo "CONTAINER_ONLYOFFICE=onlyoffice/documentserver:latest-arm64" >> .env
echo "CONTAINER_KEYCLOAK=mihaibob/keycloak:15.0.1" >> .env
fi
echo
echo "⏩ Setting up folder structure and fetching repositories"
install_server
mkdir -p workspace/server/apps-extra
for app in "${APPS_TO_INSTALL[@]}"
do
install_app "$app"
done
cat <<EOF
╔═════════════════════════════════════════╗
║ oOo Ready to start developing 🎉 ║
╚═════════════════════════════════════════╝
🚀 Start the Nextcloud server by running
$ $DCC up -d nextcloud
💤 Stop it with
$ $DCC stop nextcloud
🗑 Fresh install and wipe all data
$ $DCC down -v
EOF
case $SERVER_CLONE in
squashed)
cat <<EOF
Note that for performance reasons the server repository has been cloned with
--depth=1. To get the full history it is highly recommended to run:
$ cd workspace/server
$ git fetch --unshallow
$ git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
$ git fetch origin
This may take some time depending on your internet connection speed.
You might as well use the script in scripts/download-full-history.sh.
EOF
;;
clone-no-blobs)
cat <<EOF
Note that for performance reasons the server repository has been cloned with
--filter=blob:none. You have a complete history in the server repository.
If you checkout older commits, git will eventually download missing blobs on
the fly if they are not present locally.
You should be prepared to have a live internet connection when browsing the
history of the server repository.
You might as well use the script in scripts/download-full-history.sh.
EOF
;;
full)
;;
esac
cat <<EOF
For more details about the individual setup options see
the README.md file or checkout the repo at
https://github.com/juliusknorr/nextcloud-docker-dev
EOF
echo "=> Starting apache"
exec "$@"
@@ -2,7 +2,7 @@
$AUTOCONFIG = [
'dbname' => 'nextcloud',
'dbhost' => 'database-mysql',
'dbhost' => 'nc-database-mysql',
'dbuser' => 'nextcloud',
'dbpass' => 'nextcloud',
'dbtype' => 'mysql'
+9
View File
@@ -0,0 +1,9 @@
<?php
$AUTOCONFIG = [
'dbname' => 'nextcloud',
'dbhost' => 'nc-database-postgres',
'dbuser' => 'nextcloud',
'dbpass' => 'nextcloud',
'dbtype' => 'pgsql'
];
+26
View File
@@ -0,0 +1,26 @@
<?php $CONFIG=[
'debug' => true,
'apps_paths' =>
array (
0 =>
array (
'path' => '/var/www/html/apps',
'url' => '/apps',
'writable' => false,
),
1 =>
array (
'path' => '/var/www/html/apps-extra',
'url' => '/apps-extra',
'writable' => false,
),
2 =>
array (
'path' => '/var/www/html/apps-writable',
'url' => '/apps-writable',
'writable' => true,
),
),
//PLACEHOLDER
];
+2
View File
@@ -0,0 +1,2 @@
# m h dom mon dow command
*/15 * * * * sudo -u www-data php -f /var/www/html/cron.php >> /var/log/cron/owncloud.log 2>&1
+19
View File
@@ -0,0 +1,19 @@
error_page 403 /core/templates/403.php;
error_page 404 /core/templates/404.php;
location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README) {
deny all;
}
location / {
## The following 2 rules are only needed with webfinger
rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
rewrite ^/.well-known/carddav /remote.php/dav/ permanent;
rewrite ^/.well-known/caldav /remote.php/dav/ permanent;
rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
try_files $uri $uri/ index.php;
}
+14
View File
@@ -0,0 +1,14 @@
'objectstore' => [
'class' => 'OC\Files\ObjectStore\S3',
'arguments' => [
// replace with your bucket
'bucket' => 'nextcloud',
'autocreate' => true,
'key' => 'dummy',
'secret' => 'dummyj',
'hostname' => 's3',
'port' => 4569,
'use_ssl' => false,
'use_path_style'=>true
],
],
-4
View File
@@ -1,4 +0,0 @@
<?php
// This file is deprecated, please put your custom config in data/shared/config.php from now on
$CONFIG = array(
);
View File
-5
View File
@@ -1,5 +0,0 @@
Adjust values in generate-ldap.py and put it into the bootstrap folder:
```
python generate-ldap.py > ../ldap/99_others.ldif
```
-83
View File
@@ -1,83 +0,0 @@
import json
import random
domain = "planetexpress.com"
base = "dc=planetexpress,dc=com"
ou_users= "ou=people,%s" % base
ou_groups = "ou=groups,%s" % base
template_group = '''
dn: cn={cn},{ou_groups}
objectclass: groupOfNames
objectclass: top
cn: {cn}
description: {displayName}
'''
template_user = '''
dn: cn={cn},{ou_users}
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: {cn}
sn: {cn}
description: {description}
givenName: {givenName}
mail: {uid}@{domain}
uid: {uid}
userPassword: {password}
'''
# Generate named groups from json with n random users per group
users_per_group = 20
# Generate groups "Group %d"
random_groups = 50
users_per_random_group = 50
users = ""
groups = ""
def generate_user(i = None):
fn = first_names[random.randint(0, len(first_names)-1)]
ln = last_names[random.randint(0, len(last_names)-1)]
cn = "%s %s" % (fn, ln)
uid = "%s%s" % (fn, ln)
if i:
fn = "Robot%s" % i
ln = "Unit%s" % i
cn = "robotunit%s" %i
uid = "robotunit%s" %i
user_ldif = (template_user.format(cn=cn, uid=uid, password=uid, description="a user", givenName=fn, ou_users=ou_users, domain=domain))
return (fn, ln, cn, uid, user_ldif)
uid_list = []
with open('names.json') as json_file:
data = json.load(json_file)
first_names = data['fns']
last_names = data['sns']
for group in data['groups']:
groups += template_group.format(cn=group, displayName=group, ou_groups=ou_groups, domain=domain)
for i in range(0, users_per_group):
user = generate_user()
users += user[4] + "\n"
groups += "member: cn={cn},{ou_users}\n".format(cn=user[2], ou_users=ou_users)
for gid in range(0, random_groups):
randomGroup = ("Robots %d" % gid)
groups += template_group.format(cn=randomGroup, displayName=randomGroup, ou_groups=ou_groups, domain=domain)
for i in range(0, users_per_random_group):
user = generate_user("%d-%d" % (gid, i))
users += user[4] + "\n"
groups += "member: cn={cn},{ou_users}\n".format(cn=user[2], ou_users=ou_users)
print(users)
print(groups)
File diff suppressed because it is too large Load Diff
-43
View File
@@ -1,43 +0,0 @@
{
"configData": {
"hasMemberOfFilterSupport": "0",
"lastJpegPhotoLookup": "0",
"ldapAgentName": "cn=admin,dc=example,dc=org",
"ldapAgentPassword": "admin",
"ldapBackupHost": "ldap",
"ldapBackupPort": "389",
"ldapBase": "dc=example,dc=org",
"ldapCacheTTL": "600",
"ldapConfigurationActive": "1",
"ldapEmailAttribute": "mail",
"ldapExperiencedAdmin": "0",
"ldapExpertUsernameAttr": "uid",
"ldapGidNumber": "gidNumber",
"ldapGroupDisplayName": "cn",
"ldapGroupFilter": "(&(|(objectclass=organizationalUnit)))",
"ldapGroupFilterMode": "0",
"ldapGroupFilterObjectclass": "organizationalUnit",
"ldapGroupMemberAssocAttr": "uniqueMember",
"ldapHost": "ldap",
"ldapLoginFilter": "(&(|(objectclass=inetOrgPerson)(objectclass=person))(|(uid=%uid)))",
"ldapLoginFilterAttributes": "uid",
"ldapLoginFilterEmail": "0",
"ldapLoginFilterMode": "0",
"ldapLoginFilterUsername": "1",
"ldapNestedGroups": "0",
"ldapPagingSize": "500",
"ldapPort": "389",
"ldapTLS": "0",
"ldapUserAvatarRule": "default",
"ldapUserDisplayName2": "description",
"ldapUserDisplayName": "cn",
"ldapUserFilter": "(|(objectclass=inetOrgPerson)(objectclass=person))",
"ldapUserFilterMode": "0",
"ldapUserFilterObjectclass": "inetOrgPerson;person",
"ldapUuidGroupAttribute": "auto",
"ldapUuidUserAttribute": "auto",
"turnOffCertCheck": "0",
"turnOnPasswordChange": "0",
"useMemberOfToDetectMembership": "1"
}
}
-11
View File
@@ -1,11 +0,0 @@
dn: ou=people,dc=planetexpress,dc=com
objectClass: top
objectClass: organizationalUnit
description: Planet Express crew
ou: people
dn: ou=groups,dc=planetexpress,dc=com
objectClass: top
objectClass: organizationalUnit
description: Planet Express Groups
ou: groups
-14
View File
@@ -1,14 +0,0 @@
dn: cn=Amy Wong+sn=Kroker,ou=people,dc=planetexpress,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: Amy Wong
sn: Kroker
description: Human
givenName: Amy
mail: amy@planetexpress.com
ou: Intern
uid: amy
userPassword:: e3NzaGF9M3UzcUdCSmFMc2tiUEg0OVJrYlFtUk9HTktFb1lOUXZkU2lOZmc9P
Q==
-495
View File
@@ -1,495 +0,0 @@
dn:: Y249QmVuZGVyIEJlbmRpbmcgUm9kcsOtZ3VleixvdT1wZW9wbGUsZGM9cGxhbmV0ZXhwcmV
zcyxkYz1jb20=
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn:: QmVuZGVyIEJlbmRpbmcgUm9kcsOtZ3Vleg==
sn:: Um9kcsOtZ3Vleg==
description: Robot
displayName: Bender
employeeType: Ship's Robot
givenName: Bender
jpegPhoto:: /9j/4AAQSkZJRgABAQEAYABgAAD/4QBgRXhpZgAASUkqAAgAAAACADEBAgAHAAAA
JgAAAGmHBAABAAAALgAAAAAAAABHb29nbGUAAAMAAJAHAAQAAAAwMjIwAqAEAAEAAAC0AQAAA6A
EAAEAAAA6AgAAAAAAAP/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8RERMWHB
cTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4eHh4eH
h4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIAjoBtAMBIgACEQED
EQH/xAAdAAEAAgMAAwEAAAAAAAAAAAAABgcEBQgBAgMJ/8QAZhAAAQMDAgIFBgcHCxAHBgcAAgA
DBAEFBgcSESIIEyEyQhQxQVJichUjUWGCkqIWM3GBkbLSFyQ0OENWdJWhwvAYJTY3RFNVY3V2hJ
Sxs7TTNVeDk8HR8glUc8Ti8SZkZaOlw+H/xAAbAQEAAgMBAQAAAAAAAAAAAAAAAQIDBAUGB//EA
DMRAQACAQMBBQYFAwUAAAAAAAABAgMEERIhBQYTMUEUMlFhcZEVIkKx0SNSoTNygcHw/9oADAMB
AAIRAxEAPwDstERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBEVL9JzUS8Yta
LXimFO0LNMlkjFt47N9Y7XH4x8uytKUHjSnEvaLwEgsLIs7wnHJnkd/zCwWqT2fETLi0052+yRc
fTRbi0XO33i3tXC03CLcIbo8W5EV4XWzp7JD2VXOGIaB4HbbUNMgto5JeXvjZ9xnGZm+6RVqRbd
3LzVr7ReIiUfvtnl9H7JY+f4GLw4hJeaj5HZNxuA21UuHXhuruoQ/ZIvVIhEOvUWDabhCu9piXW
3SG5MOYyEiO8HaLjZjuEqfhpVZyAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiIC
IiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgLmbU4vKOmxijEuo9XFxZ16IO/zOGcgCLh6a7eNO
Hb3eK6ZXPvSvx2+QZGN6vYuw/MuGJukM2GDPWE7Cd7HSpT2aVLj2dgnUuNNiCeqHa3sxpGj2Xty
6Uq3SzSjHjXhzi0RB9oRWzwXMLBm1hZvWPXAJMd0BIg3fGsF6pj4S5S/m7lWmt2RvZtcI2jWCuj
OvN4dCl0kMiLrNvibvjDMvCXd9rb7RDuC5OjJIek6AYSb7tXDG0tBStfVDlEfxUGlFZS1WKWWNj
mK2nHoZmca1wmYbRH3iBoKAPH8QraoCIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAi
IgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAo3qbMYtum+Tz5HGjMazy3j20412i0REpIq76
SE4rfoNm7zbYnU7NIZ4V+R0Nla/bQcf6WaQYhkOnNmu16gyW58gHDdNqUQ76daeyu3zdzb5lcfQ
RtMG1O6kRokcaUiX4obThDuPqm6nQRqXnqtVpFG8k0wxtnfv425h3jw4d8d+37S33Q1M2NQNXbZ
Qqkw3dYsoePe3vdfU/wAXKKDphERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQERE
BERAREQEREBERAREQEREBERAREQEREBERAREQFTXTQlHE6NWWGy91RmMVoe3z0KU0JU+ruVyrnv
p7u0/UKbgCBE/cL1FjRxp6T5z/F2ASDRYey1GxKzx2B2tNQGACm7uiIDtWR0Ov7bGsf8Mt35slZ
i1PRg3R+kjqbEZIm4zkKE6bVK8pObBrurT1uc/rEg6jREQEREBERAREQEREBERAREQEREBERARE
QEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBc4dOV05Vn0/sHKAT8sjl
V3z1CoiQeb/ta/kXR65j6ZDnXam6RW5w9zBXGXINmheMOo2FX7X8qDPWn6NJAPSg1JCtabytkIh
px7dvVtf+YrcLQ6Eftxsg/zP/8AmIyDqtERAREQEREBERAREQEREBERAREQEREBERAREQEREBER
AREQEREBERAREQEREBERAREQEREBERAREQEREBEWLPlRIMU5U2SxGjh33HnKAFPR2lVBlIq9u2t
Gk1seozK1Ex3fXj2Mzge2+9s3bfxrRXfpJaK23gLudRXSIakIxor7/H5uIBWlPxoLbccbbAnDKg
gNOJVrXspRcVdJLVLCX+kHh94t16Yults9ukUlyYBi+3Q3RdERGo17S7vH8NFr8j1Yh623+Uzlm
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
mail: bender@planetexpress.com
ou: Delivering Crew
uid: bender
userPassword:: e3NzaGF9amxCTnNmVVdKK0tIWHprRFVuYTJSSTBjK09PNmlGdzAxZHd3K3c9P
Q==
-411
View File
@@ -1,411 +0,0 @@
dn: cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Philip J. Fry
sn: Fry
description: Human
displayName: Fry
employeeType: Delivery boy
givenName: Philip
jpegPhoto:: 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
mail: fry@planetexpress.com
ou: Delivering Crew
uid: fry
userPassword:: e3NzaGF9d0wvVG0wSHNaeU90K29jbXlrU290UkpURnczd0ZKOWRlaEU4eFE9P
Q==
-17
View File
@@ -1,17 +0,0 @@
dn: cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: Hermes Conrad
sn: Conrad
description: Human
employeeType: Bureaucrat
employeeType: Accountant
givenName: Hermes
mail: hermes@planetexpress.com
ou: Office Management
uid: hermes
userPassword:: e3NzaGF9M3UzcUdCSmFMc2tiUEg0OVJrYlFtUk9HTktFb1lOUXZkU2lOZmc9P
Q==
-489
View File
@@ -1,489 +0,0 @@
dn: cn=Turanga Leela,ou=people,dc=planetexpress,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Turanga Leela
sn: Turanga
description: Mutant
employeeType: Captain
employeeType: Pilot
givenName: Leela
jpegPhoto:: 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
mail: leela@planetexpress.com
ou: Delivering Crew
uid: leela
userPassword:: e3NzaGF9eCtEOFJJTDFQNUJ3OFo1N28ra2tFeDlLNm14d0JSY0tSNmo1R2c9P
Q==
-497
View File
@@ -1,497 +0,0 @@
dn: cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Hubert J. Farnsworth
sn: Farnsworth
description: Human
displayName: Professor Farnsworth
employeeType: Owner
employeeType: Founder
givenName: Hubert
jpegPhoto:: /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBQgMFBofBgYHCg0dHhwHBwgMFB0j
HAcJCw8aLCgfCQsTHCI3NCcMEhwgKTQ5LhkgJyw0PTwzJC4wMTgyNDL/2wBDAQkJDBgyMjIyCQs
NITIyMjIMDRwyMjIyMhghMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wA
ARCAH7AnYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAHwEAA
wEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh
MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUp
TVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7
i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAtREAAgECBAQDBAcFB
AQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygp
KjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJm
aoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9
oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo
AKKKKACiiqep6xZ2cZfU7uOCIfKXb+Jj0EajkluwAJPYUAXKjnuYYlJup4okHLyyEAIP8AaY1wV
74t1q+40lG0i26fap1BnuQf+eVuchB/vb29VWs5fDFizBr+KS/m6i6vWMjK3/TPzMgf8BCj0rjq
YqK+G7N4UX10Ovk+JPhwf6nW4Lo9CLNWl5+lur/54qE/EvSv4LTXmHZvscwyP91kB/QVlqAPugA
dAB2A9BTq53jH0po2+rrrJml/wsvTP+fLXv8AwEl/+IpV+JmjD/j4GrwD+/LaTgAf7UojIGPcis
2loWLf8kQ+rr+ZnR6d4w0S7ONN13TZ5OhgSRdyk/3oc55HtWtXnl9pFlcjGo6faXK9AsyBsA+gY
Gq0Gk3Vt/yAde1SyHQWzt5kZHp9nn3YH+6yVtDFr7cWjOVB/ZaPTKK4e28f39tx4m0nfH0bVNOD
MqD1ubE5YY/2TIPXFdhY6la3SB9Ou4LiFhvhniYESD2YeldcJp/BJMwlF/aTLFFFFWSFFFFABRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU
UAFFFFABRRRQAUUVBe38FujPezJFEoM88rdI40HJP0FAFHX/Ettp6A3IeSRj9nsbOPG6+uCPuxA
+g5J6AcniuFS1ubiQS6/Kk9zz9lhX/V6RG38Nmh7kdWI3N7DABDLcXkhn1ON0kYeVp9o3/MJsSR
hQP702AX9+OiirwrxsXiL6U3ps/M9ChS6zXmvIcKUUgpRXCjpHClpBS1SELS0lLVCCiiigArN/s
24tnMnhuaK1nJ33du+fK1X/r7iXvjowG4d8jitKirhJr4GTKK+0jS0j4gWk7CPVYJNMuz8sVrOR
tvGH/PhdjAbjtw3qorp64C7sLe4Ure20M8Z4eKQAhvqp9Kr2V1rOnf8gq5bUbUcf2Vdv88Cf9ON
+2T8o7PuHYMor0qOKX/L1W8zjqUH9jU9HorH0Lxdp+oAi0kkinXm806cbZLPP/PWI9j2IJU9ia2
K7V5HMFFFFMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigArhvGd8bmZII3BiUDVtXUf8tMN+7R/Z3Uuf90Z4Ndw7qoJkZVUfM7H
oigfxH2FeW6VO1wHll3bpnOoru6x2rABFI/6ZwBfxzXJjallp191G+Hhd6+rNEUopBSivCR6Y4U
opBSimhCPKiAmWREUcs7HAUe5NRQapaSnFveQO3UIrDJA9B7VzviC7Mkm3PyJglf70zjPI/2FxW
WwP8LFWHzRuOsbDup9jW8Yd2ZOXZHoFLVTTb0zxqzAAkYkA7SKcHH/AAIGrdQWgooooAKKKKACi
iigClf6PDOVJeWCdfms7+A4ezY/88pPRu4IKnuDWvpHjG4hITxOYRn93baxGMJcsegvU/gZvrsY
9CCQtVaR41YESIrKfkdCOGUjow9xXRRrNbbdUZVKaf8Amd1RXDaZrcmnYFwzy2HQMcltHX694x+
adsr93uEdWAMbKyn5kZejKR/CR6ivXpVE/gfr5HBOLXxIWiiitCAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOc8d3bR2cgiYq8m3R4i
Oqm+kCkr/wBc0Yn8K51EVQAigAfKqj+FQO30rS8dTFpLVB03yapIP7yWsBXn6PKp+uKzhXjZjLV
Lyuehg1p+A4UopBSiuBHUOFKKQUopoRyOsxFZm3D722dPdQgHH0K1SJA6nA6k+grsNQ0mK5A8wl
GHMUq9Yyf6NWfb+ElBH2y6Eyj5vKVMByP+emWPH5V0xmuvoYyi+he0KFkgTeCCczYPYSuTyPYGt
KkA9B9BS1kaIKKKKACiiigAooooAKKKKACq+la6+lSBb6QnTHIjt5j/AMwG6kYAK5/55zseOyHj
7pG2xTJoI5FInjR0IMUsbDiRGHIYe4rWjUaeno13M6kE9/kd5RXEeEtbktXFvqk7uMFvD15Iebq
3jHMUzn+O1Xp3Zeeoau3r3IST+FnmyXcKKKKoQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
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
KTZapar/wAut7F1C57OMMPVSDW1XkreE9eWRn07xobKVgonMFuNs7RA4M0LyMCVBx06Vfg8ReN7
L/j8g0fX4R94w/uZj/uqdynHp8v1r1Y3+0vU43OP2Zeh6XRWD4a8c6ZqgYWLzQ3CcX2l3K7ZbAn
/AJ7QnsfUEj3replBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAGR4l8O
JqMJQy+TKCLrT7oDmyvYT8rAex4I7gkd64jTNQeZSLuHyblD9j1K1/59rpAMhT6OCCD3BBr06uH
8daWluftNm8SSKPJ1W2JA/tWxX/nnnHz2vVfUZXuMcmLo3Xu7rVeZvQqW3+ZAKUVzM/xM8MxAGT
xDZEEbwIyWIBH8SID29s1mSfG/wALqflvLuQf31ibB/76x/KvIjSl0pz+473NdZxO7FLXAj436A
f9Tb6vKOzpFxn8WHSnJ8cfDef3z6hCe6yRH5PqFJ61fsZf8+5E+0j/ADI72lrj7f4w+FJOmuKh/
uyRuMc92K4/WtW18d+Hpv8Aj38RaUT2VpVBP0ViP5UnTl1hIakukom3RUcNzDIM280Ui/3kII/M
VJUlBXMSsL25O75raA+XEva41Rl5JH/TohAHuT3Fb+oX8dtG7zfcRWupP9yJSev0FY+g2MkECC5
/1xH2m9b+/dzksxP1kJruwMNbtbbep5uZ1bK0Xvo/Q0aKKK9Y+fCoLu7WJc+W8jEiKCBOtxK3QR
j3/IDk8A1PUej2/nSNJJyik2OnL/dKHDtj1dxtHsOPvGguEf8AglnStDER33pWS6I2ySA5FrGf4
LUHoB3OAWPJ7AatFFB1egUUVk3/AIqsYG2K0t1c9Rp9qNzgHvIg6A+rFR70B6GtUN1ZQzqVuog6
HqP7pHdGHQqehBBHaqGnSaxI27UYLK0hwRHYqS0hY45nuAQBt9AGH+1WrQBxusT6jHtgWSfdI2y
LVV4IsEBLb2A4kVRtGBzkMOhA07W0hhRVtYljjUCKKNf4EUdq0tV0wXMZAYJIP39pNj/j2uU6Ef
Q8H1GQeDWVYXhmQFo/LbmOeL/nhPGxDKT/ANM3BFZ06aXwLzZOJqSdud/3UWKz3lluZfKspJI1A
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
UUUAFFFFABRRRQA/9k=
mail: professor@planetexpress.com
mail: hubert@planetexpress.com
ou: Office Management
title: Professor
uid: professor
userPassword:: e3NzaGF9azRDRS9ta3Frb3NFampzVkhJWEhGMTFaU0h6ZVExUzdhdnQveWc9P
Q==
-489
View File
@@ -1,489 +0,0 @@
dn: cn=John A. Zoidberg,ou=people,dc=planetexpress,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: John A. Zoidberg
sn: Zoidberg
description: Decapodian
displayName: Zoidberg
employeeType: Doctor
givenName: John
jpegPhoto:: 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
9oADAMBAAIAAwAAABAh5ggYl4k5NHyEkk5bpem3Ax9FErk/bQBF+kk4k82pb7iw9m2sbeobbFrE
knI3WdI7QT4mRMmbbbbRKraBbVbcn+wxm2qpbb+9s0okiU0nUkm9dTSo7bKnbYigkkX804nshpg
7HvBnZLbYC4mh2dMk9rkm4rabbbZzbc4w8TF8jsRCi5XNm7W1fXS+3ImCVtwVs0W5F7J6WiDSDD
Ily0tnKvciouSd3cE7aEwk96Ktv32/x/ls/V7ZG7ZskkdtttttvRo546fLbbbbbxE5tttnltnTv
ABQg7WHbbE3TNvt/XNtTBIRiELbuXMd2sqthst5axJ6jUklbYgZWPbPptttvC8O4vTjZnbY5eA/
PTmtts7dr7IgkQB7bR/VPskrottrbS7ZUimsbbZb5Ctt0q6aqbY/bO2u0fbbbbblttmCNhHbUbb
TPXD7bbbbAitv/DLvbZvbaWy+l7bbbbF/1v7Ee7bb7bSXZ6y7bbbaWf8APW2O22M22qu3dpO222
1rWiJ2022ju202wPtG2222FOMau2O2xb22e2Wht/2220uWKL322yDn2b2s2NtCe2yVp2C2j21Vd
O22W23ttp++1teySOn2gLOyl522Vttttttr2gu2xiJu2fz223ttttttt+xW221pL720+201tttt
tto22yu2d3lsoX21xtttttttv221lc4cu22i1Ctttttttt5222cT/M22226tttttttttW228uL+
b2227tttttttttthCSZJYf//EACkRAQABAgMHBQEBAQAAAAAAAAERACEQMUEgUWFxgZHwMKGxwd
HhQPH/2gAIAQMBAT8QwiopIxTBwNJhkI31j+9KDE7gsfr7UCHUE/NLWey/KJQC6ln2olhPQ6Jl2
pk5ezydh24qKMWoqMIwG+Ma+eeb6jzzz6qMGmmhglGXffe8XhuNaOhAyDYjv5s+2dZujmNN3FlN
kd5Q6SoJ2b51vg6/lNBcOSZU1GyejFRiYR5559eeefx89/PLPnnnSnBwGCmVpOTudNcWkN0u76U
1gA4p+KSB5S9M1pqs7MR4E/hTTSbU0NG0tTgZUeeefdHnnfycPPPP6+eefdODgxXKiCXiXm3pQJ
ajLjuNXccKRqSvoHkw9kxairVarVarVah2GmnEqda8881rzzv78KfPOvmizTg4uPafNH38WMjoU
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
oUVB777av/9k=
mail: zoidberg@planetexpress.com
ou: Staff
title: Ph.D.
uid: zoidberg
userPassword:: e3NzaGF9UEgvVjZ3S3Mxc3lRems0RGFCd0hXdlJQNmhlZ2xQWmtCR2hWdUE9P
Q==
-8
View File
@@ -1,8 +0,0 @@
dn: cn=admin_staff,ou=groups,dc=planetexpress,dc=com
objectclass: groupOfNames
objectclass: top
cn: admin_staff
description: Admin staff
member: cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com
member: cn=Hermes Conrad,ou=people,dc=planetexpress,dc=com
member: cn=ship_crew,ou=groups,dc=planetexpress,dc=com
-9
View File
@@ -1,9 +0,0 @@
dn: cn=ship_crew,ou=groups,dc=planetexpress,dc=com
objectclass: groupOfNames
objectclass: top
cn: ship_crew
description: Ship crew
member: cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com
member: cn=Turanga Leela,ou=people,dc=planetexpress,dc=com
member: cn=Bender Bending Rodríguez,ou=people,dc=planetexpress,dc=com
member: cn=admin_staff,ou=groups,dc=planetexpress,dc=com
-9
View File
@@ -1,9 +0,0 @@
dn: cn=everyone,ou=groups,dc=planetexpress,dc=com
objectclass: groupOfNames
objectclass: top
cn: everyone
description: Everyone
member: cn=Philip J. Fry,ou=people,dc=planetexpress,dc=com
member: cn=Turanga Leela,ou=people,dc=planetexpress,dc=com
member: cn=Bender Bending Rodríguez,ou=people,dc=planetexpress,dc=com
File diff suppressed because it is too large Load Diff
View File
-1
View File
@@ -1 +0,0 @@
nextcloud.local:5432:database-pgsql:postgres:postgres
-14
View File
@@ -1,14 +0,0 @@
{
"Servers": {
"1": {
"Name": "nextcloud.local",
"Group": "Server Group 1",
"Port": 5432,
"Username": "postgres",
"Host": "database-pgsql",
"SSLMode": "prefer",
"MaintenanceDB": "postgres",
"PassFile": "/pgadmin4/config/pgpassfile"
}
}
}
-40
View File
@@ -1,40 +0,0 @@
# Keycloak SAML test setup
Currently the Keycloak realm only supports the main instance (nextcloud.local). For other instances this would need a separate realm and adjusting the imported realm in `docker/configs/keycloak`.
Setup can be done automatically through:
```bash
occ saml:config:create
occ saml:config:set \
--general-idp0_display_name "Keycloak SAML" \
--general-uid_mapping "username" \
--idp-entityId "http://keycloak.local/realms/Example" \
--idp-singleLogoutService.url "http://keycloak.local/realms/Example/protocol/saml" \
--idp-singleSignOnService.url "http://keycloak.local/realms/Example/protocol/saml" \
--idp-x509cert="$(cat keycloak.crt)" \
--security-authnRequestsSigned 1 \
--security-logoutRequestSigned 1 \
--security-logoutResponseSigned 1 \
--security-wantAssertionsEncrypted 0 \
--security-wantAssertionsSigned 1 \
--security-wantMessagesSigned 1 \
--security-nameIdEncrypted 0 --security-wantNameId 0 \
--security-wantNameIdEncrypted 0 \
--sp-x509cert="$(cat public.cert)" \
--sp-privateKey="$(cat private.key)" \
"1"
```
## References
- Setup keycloak for SAML usage: https://janikvonrotz.ch/2020/04/21/configure-saml-authentication-for-nextcloud-with-keycloack/
## Generate keys for Nextcloud
openssl req -nodes -new -x509 -keyout private.key -out public.crt
## update keycloak from example realm
nc-dev exec keycloak /opt/keycloak/bin/kc.sh export --realm Example --users skip --dir /opt/keycloak/data/import
-3
View File
@@ -1,3 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICnTCCAYUCBgGFAJ9a7jANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdFeGFtcGxlMB4XDTIyMTIxMTA5NTcwMVoXDTMyMTIxMTA5NTg0MVowEjEQMA4GA1UEAwwHRXhhbXBsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJv17u7hBOhwsRmlylApsmRplV1qPrliFmiOenUZSYwdkAtIu9Cu00BBx6FqmUnaTrMzprrjw1Kv8ADifmeT4m4ICul+nClici29o0eVh9a3dbYUZoyruXEEPd3mWVCXebkTfqA7AI8hVGHXk9R23PakQdrGJHoe1QSH3Vk41NyQbYZ5+U4gvnQqmaMgrYFtubQsS4ZdqzrkG5Ry0OigpWjOGT6dnSB0/AttN7pIfnaBGzmgIcQzBrW3c/9qhNuUBAhP3AKwYt/HptOfFkh7atOqrksIelHyuLTqsuXSJ/vAEAuEib1ns8ggYWTTRI9ROvdoJ5kvVBzflSB5Cr10LrsCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAmi2oHhClIZIl/dwLxwVFaLZ7ZcHMLcQjytxrhQhl9i/xIByQXH5DXHtsmg1HcX8BET3Hrm7McxIspBOzHBxZPGLJlZwZ5aVzI6ZwMvy49rR5tbQlRppzM3VkT10P1ccIT6Cx9PtgL9BcgiPkRyzmhq3z10Ayd2PnY0G8Z0Lc7Qc6sXz9+DCFM6GkkvECPLlEdlagtYdQAH2om2qPaj1GjYY+QgvAuRmO04Biu2E/zhMvEG0KH+OgSHf6dTrcUhk0+nl2QRs7kueakRvn+Z6VXkwkcBokNq4+Ka6z9YmimrRv/CiWoLKIcYknHaNaP/PZI6joDcg3IgxWLOLWNHxTGw==
-----END CERTIFICATE-----
-28
View File
@@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDlz0NWHyNGjVCR
FXahaaxhrVTAmeViELJO3pUtiqpYwhxV+nqqRUfBa0KGYHA1bIuM41/OWwHQjwFt
opH5OYTTsqXicdVkq+5rYP+tKdJv0+S4puEAQsiLUgEWLpVfSmBIoyGGnU4hUCUR
NDySoo5cjmevRUbd5Rvt76hOcYEHPmQOfT3se3wf0fY1sDkcUTK82UAz+3LypLzp
atd5keVmwkJC1xtJ+hXdvwL9u0zRD/IJCE1JZK7+w5CqB3AUaVBiwbqHfgvxjPWm
WF8bZSErciJM9u7pbFO/lXTcpqRZBC/r80a6bVv0tAtEU+MSgWxXgPqQsIKCDHib
JwWgD9jpAgMBAAECggEBAK3xbFFSbjvnmJTIPyu7tYuVS7Igijvo0V3bIeT/sSJP
gm0dkx0wJTjke80ET8pQJ2xzab/iqIP4yib2xzBx9fTaoq68ZL23WVYTbFLgdfTI
2LVfMq0k33B8mG/2wH8I58nzF9wxUsLqS7Qy6qo+uiyaaSaD9DjeQn6dSLJfPT+B
7cG1lKJVnpMEmjCc8b7x7jB2wMIuGVHbNEm+FRe94S8wm+psb6q7eG7JF2PDqsJp
Hm+s0jhjwICS4rSTJ9gsg4YNAHx/xnWJn6nZiXh+mu5Irhb2kEQuE1xX1Fhy5GBI
qqij2kFAqjn8PZ+RMsH43ITTf17eVq/lMkqcaHJtwgECgYEA8tutP46emqtLgDnp
F82tFweQ+luQqohNcaIg4SOIh7eAik15lWYSYSSzsIpBcM9aVJ/ZdCrI9DD/Ba/n
jUfoSsPo8PYy59zuGaheUyiQpUva2NNUSGkwQ4aT5aVVyn0cksCCq3ZoQ8wmu1aK
JKgzRtQhkZMWOG8aJ+ie1s/PIKkCgYEA8j7TM6w1CELI6j/Xsb9VUr7m/GsU76CN
W4eu3yOq6KSkXw8RveYzcHxdyP1TNn10e0n21BjYCKr001q+xgfwUMYcxxpwi+H2
RXxyDwjXHmw5VVDXXH8uGHUFC2iYRENKTGmRV4EWc+XnRYk7O41/nsxMqPeBENhT
cfMAeZa23kECgYA/kwozTR5v1s+Y7Y/7Tzg0gyKMp1OjkLLVQF/jD+45uOvJSKa/
WU0OaREw8cBXy7AV3xKJunmIkxrvXjD7ZwuEJuzfx1NkJw2dYdnvYvsailTr1caG
fiLISn6E61cd/spwED0krYZ12Qd6mxjmp7FkpTt0ZFC4zTzHnbmW+id6oQKBgGDB
NxosbgIeqqDlXwFfqnSiSyAGpRYQymUEjJQTavAA0qYlHrD6gREsm0jr5ZCeCygz
IqMUSTUtExxX4lq2UQXyGwxrQwib+AFI80WOAl3kXAH3iA0pvv+Fvb4QyMB7H/Hl
OGf65zzjVrwvU7k1iwOiFfxm3uYbgTjCFi56RBABAoGBAMpRrYBQ4qfVLtIMqnXH
xSPMN109PpG74ooyDSmnQutqKx+cnz6PWid+gK/KKZKdh5DG/ScVFCHGy+YqImnA
ein9E7+uV6mbOzMnQGKm2Q5vbuG/UWY7bLVoxMN0XS1PTMk/fCC75l1gX1BsO1UX
mBctbrmbnZ3Of6966dUuGXnS
-----END PRIVATE KEY-----
-17
View File
@@ -1,17 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICvjCCAaYCCQDS+w+GXVpJsDANBgkqhkiG9w0BAQsFADAhMQswCQYDVQQGEwJE
RTESMBAGA1UECgwJZGV2LmxvY2FsMB4XDTIyMTIxMDA1MjgxMloXDTIzMDEwOTA1
MjgxMlowITELMAkGA1UEBhMCREUxEjAQBgNVBAoMCWRldi5sb2NhbDCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAOXPQ1YfI0aNUJEVdqFprGGtVMCZ5WIQ
sk7elS2KqljCHFX6eqpFR8FrQoZgcDVsi4zjX85bAdCPAW2ikfk5hNOypeJx1WSr
7mtg/60p0m/T5Lim4QBCyItSARYulV9KYEijIYadTiFQJRE0PJKijlyOZ69FRt3l
G+3vqE5xgQc+ZA59Pex7fB/R9jWwORxRMrzZQDP7cvKkvOlq13mR5WbCQkLXG0n6
Fd2/Av27TNEP8gkITUlkrv7DkKoHcBRpUGLBuod+C/GM9aZYXxtlIStyIkz27uls
U7+VdNympFkEL+vzRrptW/S0C0RT4xKBbFeA+pCwgoIMeJsnBaAP2OkCAwEAATAN
BgkqhkiG9w0BAQsFAAOCAQEAOJ3+a1d06LN83gh3iNEvwWNudKVPi7MvyltW2WVB
zQBoN2wCYC0crl7PRxXqACvpw2nE2qZaJ0KrrbVWUVMf2lAwRKk4g2F3WcwBjqak
WwWEgIDuocLt1WX5nHbI6hb9E2jAwa8wpYbAiRQF5HnZGxI+1ZXKROZvhOPIiAVT
v4jTPGr5lgxJ1lKqnVRfKIHZlPWPFGTmuwSkuq+9lwqp/HdCOIiV54c5yi0XBMvE
jLhqoE5cxSVNswLF7thD7B2E1NTpyH83Z7rHtK/HDHinUVfOTKhnt15JAf2I2zwh
9HErW/Bz4zQlmmBL0uMpgOjTix9h55p2JMuM7/Bd7ng2Dg==
-----END CERTIFICATE-----
View File
-20
View File
@@ -1,20 +0,0 @@
# Hook scripts
Scripts in this directory will be picked up by the docker containers
automatically. They can be used for automating setup specific to a developers
use cases
- For all Nextcloud containers:
- before-install.sh
- after-install.sh
## Example for before-start.sh
```bash
#!/bin/bash
echo "🤖 triggered hook before-start.sh"
env
export OC_PASS="mycustomuser"
occ user:add --password-from-env mycustomuser
```
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 331 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 343 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 292 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 245 KiB

View File
+37
View File
@@ -0,0 +1,37 @@
version: '2'
services:
nc-server-ldap:
image: juliushaertl/nextcloud-dev
environment:
SQL: 'sqlite'
NEXTCLOUD_AUTOINSTALL: "YES"
NEXTCLOUD_AUTOINSTALL_APPS: "user_ldap"
# auto provision ldap config
volumes:
- /home/jus/repos/nextcloud/server:/var/www/html
- nc-data-ldap:/var/www/html/data
- nc-apps-ldap:/var/www/html/apps-writable
- nc-config-ldap:/var/www/html/config
ports:
- "8000:80"
# use same setup for ldap severs since replication seems broken on osixia/openldap
ldap.example.org:
image: osixia/openldap
command: --copy-service --loglevel debug
volumes:
- ./exampledata/example.ldif:/container/service/slapd/assets/config/bootstrap/ldif/50-bootstrap.ldif
ldap2.example.org:
image: osixia/openldap
command: --copy-service --loglevel debug
volumes:
- ./exampledata/example.ldif:/container/service/slapd/assets/config/bootstrap/ldif/50-bootstrap.ldif
nc-cache-redis:
image: redis:3
volumes:
nc-data-ldap:
nc-config-ldap:
nc-apps-ldap:
+28
View File
@@ -0,0 +1,28 @@
version: '2'
services:
nc-server-sqlite:
build:
context: .
environment:
SQL: 'sqlite'
NEXTCLOUD_AUTOINSTALL:
NEXTCLOUD_AUTOINSTALL_APPS: "deck"
volumes:
- '/home/jus/repos/nextcloud/server:/var/www/html'
- nc-data-sqlite:/var/www/html/data
- nc-config-sqlite:/var/www/html/config
ports:
- "8000:80"
volumes:
nc-data-sqlite:
nc-config-sqlite:
networks:
default:
ipam:
driver: default
config:
- subnet: 192.168.21.0/24
gateway: 192.168.21.1
+53 -1262
View File
File diff suppressed because it is too large Load Diff
-3
View File
@@ -1,3 +0,0 @@
rules:
latest_tag: off
sudo_usage: off
-108
View File
@@ -1,108 +0,0 @@
FROM php:8.2-apache
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions
RUN install-php-extensions \
apcu \
bcmath \
excimer \
exif \
gd \
gmp \
intl \
ldap \
memcached \
oci8 \
opcache \
pcntl \
pdo_mysql \
pdo_pgsql \
redis \
smbclient \
sysvsem \
xdebug \
zip \
blackfire \
@composer
# dev tools separate install so we quickly change without rebuilding all php extensions
RUN apt update && apt-get install -y --no-install-recommends \
git \
curl \
vim-tiny \
nano \
sudo \
cron \
smbclient \
iproute2 \
lnav \
wget \
iputils-ping \
gnupg2 \
jq \
ripgrep \
rsync \
&& rm -rf /var/lib/apt/lists/*
# Install PHPUnit
RUN wget -O /usr/local/bin/phpunit11 https://phar.phpunit.de/phpunit-11.phar \
&& chmod +x /usr/local/bin/phpunit11 \
&& wget -O /usr/local/bin/phpunit12 https://phar.phpunit.de/phpunit-12.phar \
&& chmod +x /usr/local/bin/phpunit12 \
&& ln -s /usr/local/bin/phpunit11 /usr/local/bin/phpunit
# Install NVM
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash \
&& export NVM_DIR="/root/.nvm" \
&& . "$NVM_DIR/nvm.sh" \
&& nvm install node \
&& nvm alias default node \
&& nvm cache clear
RUN wget https://gist.githubusercontent.com/nickvergessen/e21ee0a09ee3b3f7fd1b04c83dd3e114/raw/83142be1e50c23e8de1bd7aae88a95e5d6ae1ce2/nextcloud_log.json && lnav -i nextcloud_log.json && rm nextcloud_log.json
RUN { \
echo '[global]'; \
echo 'client min protocol = SMB2'; \
echo 'client max protocol = SMB3'; \
echo 'hide dot files = no'; \
} > /etc/samba/smb.conf
RUN mkdir --parent /var/log/cron
ADD configs/cron.conf /etc/nc-cron.conf
RUN crontab /etc/nc-cron.conf
ADD configs/php/nextcloud.ini /usr/local/etc/php/conf.d/nextcloud.ini
ADD configs/php/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
# Setup blackfire probe
RUN mv /usr/local/etc/php/conf.d/docker-php-ext-blackfire.ini /usr/local/etc/php/conf.d/docker-php-ext-blackfire.ini.disabled
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
# mod_rewrite
RUN a2enmod rewrite headers
# increase limit request body
RUN echo "LimitRequestBody 0" > /etc/apache2/conf-available/limit-request-body.conf && a2enconf limit-request-body
VOLUME /var/www/html
VOLUME /var/www/html/apps-writable
VOLUME /var/www/html/config
VOLUME /var/www/html/data
ENV SQL=sqlite
ENV NEXTCLOUD_AUTOINSTALL=YES
ENV WITH_REDIS=NO
ENV WEBROOT=/var/www/html
WORKDIR /var/www/html
ENTRYPOINT ["/usr/local/bin/bootstrap.sh"]
CMD ["apache2-foreground"]
ADD data/installing.html /root/installing.html
ADD configs/autoconfig_mysql.php configs/autoconfig_pgsql.php configs/autoconfig_oci.php configs/default.config.php configs/redis.config.php configs/apcu.config.php /root/
ADD bin/bootstrap.sh bin/occ /usr/local/bin/
-108
View File
@@ -1,108 +0,0 @@
FROM php:7.1-apache
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions
RUN install-php-extensions \
apcu \
bcmath \
excimer \
exif \
gd \
gmp \
intl \
ldap \
memcached \
oci8 \
opcache \
pcntl \
pdo_mysql \
pdo_pgsql \
redis \
smbclient \
sysvsem \
xdebug \
zip \
blackfire \
@composer
# dev tools separate install so we quickly change without rebuilding all php extensions
RUN apt update && apt-get install -y --no-install-recommends \
git \
curl \
vim-tiny \
nano \
sudo \
cron \
smbclient \
iproute2 \
lnav \
wget \
iputils-ping \
gnupg2 \
jq \
ripgrep \
rsync \
&& rm -rf /var/lib/apt/lists/*
# Install PHPUnit
RUN wget -O /usr/local/bin/phpunit11 https://phar.phpunit.de/phpunit-11.phar \
&& chmod +x /usr/local/bin/phpunit11 \
&& wget -O /usr/local/bin/phpunit12 https://phar.phpunit.de/phpunit-12.phar \
&& chmod +x /usr/local/bin/phpunit12 \
&& ln -s /usr/local/bin/phpunit11 /usr/local/bin/phpunit
# Install NVM
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash \
&& export NVM_DIR="/root/.nvm" \
&& . "$NVM_DIR/nvm.sh" \
&& nvm install node \
&& nvm alias default node \
&& nvm cache clear
RUN wget https://gist.githubusercontent.com/nickvergessen/e21ee0a09ee3b3f7fd1b04c83dd3e114/raw/83142be1e50c23e8de1bd7aae88a95e5d6ae1ce2/nextcloud_log.json && lnav -i nextcloud_log.json && rm nextcloud_log.json
RUN { \
echo '[global]'; \
echo 'client min protocol = SMB2'; \
echo 'client max protocol = SMB3'; \
echo 'hide dot files = no'; \
} > /etc/samba/smb.conf
RUN mkdir --parent /var/log/cron
ADD configs/cron.conf /etc/nc-cron.conf
RUN crontab /etc/nc-cron.conf
ADD configs/php/nextcloud.ini /usr/local/etc/php/conf.d/nextcloud.ini
ADD configs/php/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
# Setup blackfire probe
RUN mv /usr/local/etc/php/conf.d/docker-php-ext-blackfire.ini /usr/local/etc/php/conf.d/docker-php-ext-blackfire.ini.disabled
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
# mod_rewrite
RUN a2enmod rewrite headers
# increase limit request body
RUN echo "LimitRequestBody 0" > /etc/apache2/conf-available/limit-request-body.conf && a2enconf limit-request-body
VOLUME /var/www/html
VOLUME /var/www/html/apps-writable
VOLUME /var/www/html/config
VOLUME /var/www/html/data
ENV SQL=sqlite
ENV NEXTCLOUD_AUTOINSTALL=YES
ENV WITH_REDIS=NO
ENV WEBROOT=/var/www/html
WORKDIR /var/www/html
ENTRYPOINT ["/usr/local/bin/bootstrap.sh"]
CMD ["apache2-foreground"]
ADD data/installing.html /root/installing.html
ADD configs/autoconfig_mysql.php configs/autoconfig_pgsql.php configs/autoconfig_oci.php configs/default.config.php configs/redis.config.php configs/apcu.config.php /root/
ADD bin/bootstrap.sh bin/occ /usr/local/bin/
-108
View File
@@ -1,108 +0,0 @@
FROM php:7.2-apache
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions
RUN install-php-extensions \
apcu \
bcmath \
excimer \
exif \
gd \
gmp \
intl \
ldap \
memcached \
oci8 \
opcache \
pcntl \
pdo_mysql \
pdo_pgsql \
redis \
smbclient \
sysvsem \
xdebug \
zip \
blackfire \
@composer
# dev tools separate install so we quickly change without rebuilding all php extensions
RUN apt update && apt-get install -y --no-install-recommends \
git \
curl \
vim-tiny \
nano \
sudo \
cron \
smbclient \
iproute2 \
lnav \
wget \
iputils-ping \
gnupg2 \
jq \
ripgrep \
rsync \
&& rm -rf /var/lib/apt/lists/*
# Install PHPUnit
RUN wget -O /usr/local/bin/phpunit11 https://phar.phpunit.de/phpunit-11.phar \
&& chmod +x /usr/local/bin/phpunit11 \
&& wget -O /usr/local/bin/phpunit12 https://phar.phpunit.de/phpunit-12.phar \
&& chmod +x /usr/local/bin/phpunit12 \
&& ln -s /usr/local/bin/phpunit11 /usr/local/bin/phpunit
# Install NVM
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash \
&& export NVM_DIR="/root/.nvm" \
&& . "$NVM_DIR/nvm.sh" \
&& nvm install node \
&& nvm alias default node \
&& nvm cache clear
RUN wget https://gist.githubusercontent.com/nickvergessen/e21ee0a09ee3b3f7fd1b04c83dd3e114/raw/83142be1e50c23e8de1bd7aae88a95e5d6ae1ce2/nextcloud_log.json && lnav -i nextcloud_log.json && rm nextcloud_log.json
RUN { \
echo '[global]'; \
echo 'client min protocol = SMB2'; \
echo 'client max protocol = SMB3'; \
echo 'hide dot files = no'; \
} > /etc/samba/smb.conf
RUN mkdir --parent /var/log/cron
ADD configs/cron.conf /etc/nc-cron.conf
RUN crontab /etc/nc-cron.conf
ADD configs/php/nextcloud.ini /usr/local/etc/php/conf.d/nextcloud.ini
ADD configs/php/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
# Setup blackfire probe
RUN mv /usr/local/etc/php/conf.d/docker-php-ext-blackfire.ini /usr/local/etc/php/conf.d/docker-php-ext-blackfire.ini.disabled
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
# mod_rewrite
RUN a2enmod rewrite headers
# increase limit request body
RUN echo "LimitRequestBody 0" > /etc/apache2/conf-available/limit-request-body.conf && a2enconf limit-request-body
VOLUME /var/www/html
VOLUME /var/www/html/apps-writable
VOLUME /var/www/html/config
VOLUME /var/www/html/data
ENV SQL=sqlite
ENV NEXTCLOUD_AUTOINSTALL=YES
ENV WITH_REDIS=NO
ENV WEBROOT=/var/www/html
WORKDIR /var/www/html
ENTRYPOINT ["/usr/local/bin/bootstrap.sh"]
CMD ["apache2-foreground"]
ADD data/installing.html /root/installing.html
ADD configs/autoconfig_mysql.php configs/autoconfig_pgsql.php configs/autoconfig_oci.php configs/default.config.php configs/redis.config.php configs/apcu.config.php /root/
ADD bin/bootstrap.sh bin/occ /usr/local/bin/
-108
View File
@@ -1,108 +0,0 @@
FROM php:7.3-apache
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions
RUN install-php-extensions \
apcu \
bcmath \
excimer \
exif \
gd \
gmp \
intl \
ldap \
memcached \
oci8 \
opcache \
pcntl \
pdo_mysql \
pdo_pgsql \
redis \
smbclient \
sysvsem \
xdebug \
zip \
blackfire \
@composer
# dev tools separate install so we quickly change without rebuilding all php extensions
RUN apt update && apt-get install -y --no-install-recommends \
git \
curl \
vim-tiny \
nano \
sudo \
cron \
smbclient \
iproute2 \
lnav \
wget \
iputils-ping \
gnupg2 \
jq \
ripgrep \
rsync \
&& rm -rf /var/lib/apt/lists/*
# Install PHPUnit
RUN wget -O /usr/local/bin/phpunit11 https://phar.phpunit.de/phpunit-11.phar \
&& chmod +x /usr/local/bin/phpunit11 \
&& wget -O /usr/local/bin/phpunit12 https://phar.phpunit.de/phpunit-12.phar \
&& chmod +x /usr/local/bin/phpunit12 \
&& ln -s /usr/local/bin/phpunit11 /usr/local/bin/phpunit
# Install NVM
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash \
&& export NVM_DIR="/root/.nvm" \
&& . "$NVM_DIR/nvm.sh" \
&& nvm install node \
&& nvm alias default node \
&& nvm cache clear
RUN wget https://gist.githubusercontent.com/nickvergessen/e21ee0a09ee3b3f7fd1b04c83dd3e114/raw/83142be1e50c23e8de1bd7aae88a95e5d6ae1ce2/nextcloud_log.json && lnav -i nextcloud_log.json && rm nextcloud_log.json
RUN { \
echo '[global]'; \
echo 'client min protocol = SMB2'; \
echo 'client max protocol = SMB3'; \
echo 'hide dot files = no'; \
} > /etc/samba/smb.conf
RUN mkdir --parent /var/log/cron
ADD configs/cron.conf /etc/nc-cron.conf
RUN crontab /etc/nc-cron.conf
ADD configs/php/nextcloud.ini /usr/local/etc/php/conf.d/nextcloud.ini
ADD configs/php/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
# Setup blackfire probe
RUN mv /usr/local/etc/php/conf.d/docker-php-ext-blackfire.ini /usr/local/etc/php/conf.d/docker-php-ext-blackfire.ini.disabled
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
# mod_rewrite
RUN a2enmod rewrite headers
# increase limit request body
RUN echo "LimitRequestBody 0" > /etc/apache2/conf-available/limit-request-body.conf && a2enconf limit-request-body
VOLUME /var/www/html
VOLUME /var/www/html/apps-writable
VOLUME /var/www/html/config
VOLUME /var/www/html/data
ENV SQL=sqlite
ENV NEXTCLOUD_AUTOINSTALL=YES
ENV WITH_REDIS=NO
ENV WEBROOT=/var/www/html
WORKDIR /var/www/html
ENTRYPOINT ["/usr/local/bin/bootstrap.sh"]
CMD ["apache2-foreground"]
ADD data/installing.html /root/installing.html
ADD configs/autoconfig_mysql.php configs/autoconfig_pgsql.php configs/autoconfig_oci.php configs/default.config.php configs/redis.config.php configs/apcu.config.php /root/
ADD bin/bootstrap.sh bin/occ /usr/local/bin/
-108
View File
@@ -1,108 +0,0 @@
FROM php:7.4-apache
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions
RUN install-php-extensions \
apcu \
bcmath \
excimer \
exif \
gd \
gmp \
intl \
ldap \
memcached \
oci8 \
opcache \
pcntl \
pdo_mysql \
pdo_pgsql \
redis \
smbclient \
sysvsem \
xdebug \
zip \
blackfire \
@composer
# dev tools separate install so we quickly change without rebuilding all php extensions
RUN apt update && apt-get install -y --no-install-recommends \
git \
curl \
vim-tiny \
nano \
sudo \
cron \
smbclient \
iproute2 \
lnav \
wget \
iputils-ping \
gnupg2 \
jq \
ripgrep \
rsync \
&& rm -rf /var/lib/apt/lists/*
# Install PHPUnit
RUN wget -O /usr/local/bin/phpunit11 https://phar.phpunit.de/phpunit-11.phar \
&& chmod +x /usr/local/bin/phpunit11 \
&& wget -O /usr/local/bin/phpunit12 https://phar.phpunit.de/phpunit-12.phar \
&& chmod +x /usr/local/bin/phpunit12 \
&& ln -s /usr/local/bin/phpunit11 /usr/local/bin/phpunit
# Install NVM
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash \
&& export NVM_DIR="/root/.nvm" \
&& . "$NVM_DIR/nvm.sh" \
&& nvm install node \
&& nvm alias default node \
&& nvm cache clear
RUN wget https://gist.githubusercontent.com/nickvergessen/e21ee0a09ee3b3f7fd1b04c83dd3e114/raw/83142be1e50c23e8de1bd7aae88a95e5d6ae1ce2/nextcloud_log.json && lnav -i nextcloud_log.json && rm nextcloud_log.json
RUN { \
echo '[global]'; \
echo 'client min protocol = SMB2'; \
echo 'client max protocol = SMB3'; \
echo 'hide dot files = no'; \
} > /etc/samba/smb.conf
RUN mkdir --parent /var/log/cron
ADD configs/cron.conf /etc/nc-cron.conf
RUN crontab /etc/nc-cron.conf
ADD configs/php/nextcloud.ini /usr/local/etc/php/conf.d/nextcloud.ini
ADD configs/php/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
# Setup blackfire probe
RUN mv /usr/local/etc/php/conf.d/docker-php-ext-blackfire.ini /usr/local/etc/php/conf.d/docker-php-ext-blackfire.ini.disabled
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
# mod_rewrite
RUN a2enmod rewrite headers
# increase limit request body
RUN echo "LimitRequestBody 0" > /etc/apache2/conf-available/limit-request-body.conf && a2enconf limit-request-body
VOLUME /var/www/html
VOLUME /var/www/html/apps-writable
VOLUME /var/www/html/config
VOLUME /var/www/html/data
ENV SQL=sqlite
ENV NEXTCLOUD_AUTOINSTALL=YES
ENV WITH_REDIS=NO
ENV WEBROOT=/var/www/html
WORKDIR /var/www/html
ENTRYPOINT ["/usr/local/bin/bootstrap.sh"]
CMD ["apache2-foreground"]
ADD data/installing.html /root/installing.html
ADD configs/autoconfig_mysql.php configs/autoconfig_pgsql.php configs/autoconfig_oci.php configs/default.config.php configs/redis.config.php configs/apcu.config.php /root/
ADD bin/bootstrap.sh bin/occ /usr/local/bin/
-108
View File
@@ -1,108 +0,0 @@
FROM php:8.0-apache
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions
RUN install-php-extensions \
apcu \
bcmath \
excimer \
exif \
gd \
gmp \
intl \
ldap \
memcached \
oci8 \
opcache \
pcntl \
pdo_mysql \
pdo_pgsql \
redis \
smbclient \
sysvsem \
xdebug \
zip \
blackfire \
@composer
# dev tools separate install so we quickly change without rebuilding all php extensions
RUN apt update && apt-get install -y --no-install-recommends \
git \
curl \
vim-tiny \
nano \
sudo \
cron \
smbclient \
iproute2 \
lnav \
wget \
iputils-ping \
gnupg2 \
jq \
ripgrep \
rsync \
&& rm -rf /var/lib/apt/lists/*
# Install PHPUnit
RUN wget -O /usr/local/bin/phpunit11 https://phar.phpunit.de/phpunit-11.phar \
&& chmod +x /usr/local/bin/phpunit11 \
&& wget -O /usr/local/bin/phpunit12 https://phar.phpunit.de/phpunit-12.phar \
&& chmod +x /usr/local/bin/phpunit12 \
&& ln -s /usr/local/bin/phpunit11 /usr/local/bin/phpunit
# Install NVM
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash \
&& export NVM_DIR="/root/.nvm" \
&& . "$NVM_DIR/nvm.sh" \
&& nvm install node \
&& nvm alias default node \
&& nvm cache clear
RUN wget https://gist.githubusercontent.com/nickvergessen/e21ee0a09ee3b3f7fd1b04c83dd3e114/raw/83142be1e50c23e8de1bd7aae88a95e5d6ae1ce2/nextcloud_log.json && lnav -i nextcloud_log.json && rm nextcloud_log.json
RUN { \
echo '[global]'; \
echo 'client min protocol = SMB2'; \
echo 'client max protocol = SMB3'; \
echo 'hide dot files = no'; \
} > /etc/samba/smb.conf
RUN mkdir --parent /var/log/cron
ADD configs/cron.conf /etc/nc-cron.conf
RUN crontab /etc/nc-cron.conf
ADD configs/php/nextcloud.ini /usr/local/etc/php/conf.d/nextcloud.ini
ADD configs/php/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
# Setup blackfire probe
RUN mv /usr/local/etc/php/conf.d/docker-php-ext-blackfire.ini /usr/local/etc/php/conf.d/docker-php-ext-blackfire.ini.disabled
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
# mod_rewrite
RUN a2enmod rewrite headers
# increase limit request body
RUN echo "LimitRequestBody 0" > /etc/apache2/conf-available/limit-request-body.conf && a2enconf limit-request-body
VOLUME /var/www/html
VOLUME /var/www/html/apps-writable
VOLUME /var/www/html/config
VOLUME /var/www/html/data
ENV SQL=sqlite
ENV NEXTCLOUD_AUTOINSTALL=YES
ENV WITH_REDIS=NO
ENV WEBROOT=/var/www/html
WORKDIR /var/www/html
ENTRYPOINT ["/usr/local/bin/bootstrap.sh"]
CMD ["apache2-foreground"]
ADD data/installing.html /root/installing.html
ADD configs/autoconfig_mysql.php configs/autoconfig_pgsql.php configs/autoconfig_oci.php configs/default.config.php configs/redis.config.php configs/apcu.config.php /root/
ADD bin/bootstrap.sh bin/occ /usr/local/bin/
-108
View File
@@ -1,108 +0,0 @@
FROM php:8.1-apache
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions
RUN install-php-extensions \
apcu \
bcmath \
excimer \
exif \
gd \
gmp \
intl \
ldap \
memcached \
oci8 \
opcache \
pcntl \
pdo_mysql \
pdo_pgsql \
redis \
smbclient \
sysvsem \
xdebug \
zip \
blackfire \
@composer
# dev tools separate install so we quickly change without rebuilding all php extensions
RUN apt update && apt-get install -y --no-install-recommends \
git \
curl \
vim-tiny \
nano \
sudo \
cron \
smbclient \
iproute2 \
lnav \
wget \
iputils-ping \
gnupg2 \
jq \
ripgrep \
rsync \
&& rm -rf /var/lib/apt/lists/*
# Install PHPUnit
RUN wget -O /usr/local/bin/phpunit11 https://phar.phpunit.de/phpunit-11.phar \
&& chmod +x /usr/local/bin/phpunit11 \
&& wget -O /usr/local/bin/phpunit12 https://phar.phpunit.de/phpunit-12.phar \
&& chmod +x /usr/local/bin/phpunit12 \
&& ln -s /usr/local/bin/phpunit11 /usr/local/bin/phpunit
# Install NVM
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash \
&& export NVM_DIR="/root/.nvm" \
&& . "$NVM_DIR/nvm.sh" \
&& nvm install node \
&& nvm alias default node \
&& nvm cache clear
RUN wget https://gist.githubusercontent.com/nickvergessen/e21ee0a09ee3b3f7fd1b04c83dd3e114/raw/83142be1e50c23e8de1bd7aae88a95e5d6ae1ce2/nextcloud_log.json && lnav -i nextcloud_log.json && rm nextcloud_log.json
RUN { \
echo '[global]'; \
echo 'client min protocol = SMB2'; \
echo 'client max protocol = SMB3'; \
echo 'hide dot files = no'; \
} > /etc/samba/smb.conf
RUN mkdir --parent /var/log/cron
ADD configs/cron.conf /etc/nc-cron.conf
RUN crontab /etc/nc-cron.conf
ADD configs/php/nextcloud.ini /usr/local/etc/php/conf.d/nextcloud.ini
ADD configs/php/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
# Setup blackfire probe
RUN mv /usr/local/etc/php/conf.d/docker-php-ext-blackfire.ini /usr/local/etc/php/conf.d/docker-php-ext-blackfire.ini.disabled
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
# mod_rewrite
RUN a2enmod rewrite headers
# increase limit request body
RUN echo "LimitRequestBody 0" > /etc/apache2/conf-available/limit-request-body.conf && a2enconf limit-request-body
VOLUME /var/www/html
VOLUME /var/www/html/apps-writable
VOLUME /var/www/html/config
VOLUME /var/www/html/data
ENV SQL=sqlite
ENV NEXTCLOUD_AUTOINSTALL=YES
ENV WITH_REDIS=NO
ENV WEBROOT=/var/www/html
WORKDIR /var/www/html
ENTRYPOINT ["/usr/local/bin/bootstrap.sh"]
CMD ["apache2-foreground"]
ADD data/installing.html /root/installing.html
ADD configs/autoconfig_mysql.php configs/autoconfig_pgsql.php configs/autoconfig_oci.php configs/default.config.php configs/redis.config.php configs/apcu.config.php /root/
ADD bin/bootstrap.sh bin/occ /usr/local/bin/
-453
View File
@@ -1,453 +0,0 @@
#!/bin/bash
# shellcheck disable=SC2181
# set -o xtrace
DOMAIN_SUFFIX=".$(echo "$VIRTUAL_HOST" | cut -d '.' -f2-)"
IS_STANDALONE=$([ -z "$VIRTUAL_HOST" ] && echo "true" )
indent() { sed 's/^/ /'; }
# Prepare waiting page during auto installation
cp /root/installing.html /var/www/html/installing.html
tee /etc/apache2/conf-enabled/install.conf << EOF
<Directory "/var/www/html">
AllowOverride None
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !/installing.html$
RewriteRule .* /installing.html [L]
</Directory>
EOF
pkill -USR1 apache2
output() {
echo "$@"
echo "$@" >> /var/www/html/installing.html
}
fatal() {
output "======================================================================================="
output "$@"
output "======================================================================================="
exit 1
}
OCC() {
output "occ" "$@"
# shellcheck disable=SC2068
sudo -E -u www-data php "$WEBROOT/occ" $@ | indent
}
is_installed() {
STATUS=$(OCC status)
[[ "$STATUS" = *"installed: true"* ]]
}
update_permission() {
chown -R www-data:www-data "$WEBROOT"/apps-writable
chown -R www-data:www-data "$WEBROOT"/data
chown www-data:www-data "$WEBROOT"/config
chown www-data:www-data "$WEBROOT"/config/config.php 2>/dev/null
if [ -f /shared/config.php ]
then
ln -sf /shared/config.php "$WEBROOT"/config/user.config.php
fi
}
configure_xdebug_mode() {
if [ -n "$PHP_XDEBUG_MODE" ]
then
sed -i "s/^xdebug.mode\s*=.*/xdebug.mode = ${PHP_XDEBUG_MODE//\//_}/" /usr/local/etc/php/conf.d/xdebug.ini
unset PHP_XDEBUG_MODE
else
echo "⚠ No value for PHP_XDEBUG_MODE was found. Not updating the setting."
fi
}
wait_for_other_containers() {
output "⌛ Waiting for other containers"
retry_with_timeout() {
local cmd=$1
local timeout=$2
local error_message=$3
local START_TIME=$SECONDS
while ! bash -c "$cmd"; do
if [ "$((SECONDS - START_TIME))" -ge "$timeout" ]; then
fatal "$error_message"
fi
sleep 2
done
}
case "$SQL" in
"mysql" | "mariadb-replica")
output " - MySQL"
retry_with_timeout "(echo > /dev/tcp/database-$SQL/3306) 2>/dev/null" 30 "⚠ Unable to connect to the MySQL server"
sleep 2
;;
"pgsql")
retry_with_timeout "(echo > /dev/tcp/database-pgsql/5432) 2>/dev/null" 30 "⚠ Unable to connect to the PostgreSQL server"
sleep 2
;;
"maxscale")
for node in database-mariadb-primary database-mariadb-replica; do
echo " - Waiting for $node"
retry_with_timeout "(echo > /dev/tcp/$node/3306) 2>/dev/null" 30 "⚠ Unable to reach to the $node"
retry_with_timeout "mysql -u root -pnextcloud -h $node -e 'SELECT 1' 2>/dev/null" 30 "⚠ Unable to connect to the $node"
echo "✅"
done
;;
"oci")
output " - Oracle"
retry_with_timeout "(echo > /dev/tcp/database-$SQL/1521) 2>/dev/null" 30 "⚠ Unable to connect to the Oracle server"
sleep 45
;;
"sqlite")
output " - SQLite"
;;
*)
fatal 'Not implemented'
;;
esac
[ $? -eq 0 ] && output "✅ Database server ready"
}
configure_gs() {
OCC config:system:set lookup_server --value=""
if [[ "$IS_STANDALONE" = "true" ]]; then
return 0
fi
get_protocol
LOOKUP_SERVER="${PROTOCOL}://lookup${DOMAIN_SUFFIX}/index.php"
MASTER_SERVER="${PROTOCOL}://portal${DOMAIN_SUFFIX}"
if [ "$GS_MODE" = "master" ]
then
OCC app:enable globalsiteselector
OCC config:system:set lookup_server --value "$LOOKUP_SERVER"
OCC config:system:set gs.enabled --type boolean --value true
OCC config:system:set gss.jwt.key --value 'random-key'
OCC config:system:set gss.mode --value 'master'
OCC config:system:set gss.master.admin 0 --value 'admin'
OCC config:system:set gss.master.csp-allow 0 --value "*${DOMAIN_SUFFIX}"
fi
if [ "$GS_MODE" = "slave" ]
then
OCC app:enable globalsiteselector
OCC config:system:set lookup_server --value "$LOOKUP_SERVER"
OCC config:system:set gs.enabled --type boolean --value true
OCC config:system:set gs.federation --value 'global'
OCC config:system:set gss.jwt.key --value 'random-key'
OCC config:system:set gss.mode --value 'slave'
OCC config:system:set gss.master.url --value "$MASTER_SERVER"
fi
}
configure_ldap() {
if [[ "$IS_STANDALONE" = "true" ]]; then
return 0
fi
timeout 5 bash -c 'until echo > /dev/tcp/ldap/389; do sleep 0.5; done' 2>/dev/null
if [ $? -eq 0 ]; then
output "LDAP server available"
export LDAP_USER_FILTER="(|(objectclass=inetOrgPerson))"
OCC app:enable user_ldap
OCC ldap:create-empty-config
OCC ldap:set-config s01 ldapAgentName "cn=admin,dc=planetexpress,dc=com"
OCC ldap:set-config s01 ldapAgentPassword "admin"
OCC ldap:set-config s01 ldapAttributesForUserSearch "sn;givenname"
OCC ldap:set-config s01 ldapBase "dc=planetexpress,dc=com"
OCC ldap:set-config s01 ldapEmailAttribute "mail"
OCC ldap:set-config s01 ldapExpertUsernameAttr "uid"
OCC ldap:set-config s01 ldapGroupDisplayName "description"
OCC ldap:set-config s01 ldapGroupFilter '(|(objectclass=groupOfNames))'
OCC ldap:set-config s01 ldapGroupFilterObjectclass 'groupOfNames'
OCC ldap:set-config s01 ldapGroupMemberAssocAttr 'member'
OCC ldap:set-config s01 ldapHost 'ldap'
OCC ldap:set-config s01 ldapLoginFilter "(&$LDAP_USER_FILTER(uid=%uid))"
OCC ldap:set-config s01 ldapLoginFilterMode '1'
OCC ldap:set-config s01 ldapLoginFilterUsername '1'
OCC ldap:set-config s01 ldapPort '389'
OCC ldap:set-config s01 ldapTLS '0'
OCC ldap:set-config s01 ldapUserDisplayName 'cn'
OCC ldap:set-config s01 ldapUserFilter "$LDAP_USER_FILTER"
OCC ldap:set-config s01 ldapUserFilterMode "1"
OCC ldap:set-config s01 ldapConfigurationActive "1"
fi
}
configure_oidc() {
if [[ "$IS_STANDALONE" = "true" ]]; then
return 0
fi
OCC app:enable user_oidc
get_protocol
OCC user_oidc:provider Keycloak -c nextcloud -s 09e3c268-d8bc-42f1-b7c6-74d307ef5fde -d "$PROTOCOL://keycloak${DOMAIN_SUFFIX}/realms/Example/.well-known/openid-configuration"
}
PROTOCOL="${PROTOCOL:-http}"
get_protocol() {
if [[ "$IS_STANDALONE" = "true" ]]; then
PROTOCOL=http
return 0
fi
}
configure_ssl_proxy() {
if [[ "$IS_STANDALONE" = "true" ]]; then
return 0
fi
get_protocol
if [[ "$PROTOCOL" == "https" ]]; then
echo "🔑 SSL proxy available, configuring overwrite.cli.url accordingly"
OCC config:system:set overwrite.cli.url --value "https://$VIRTUAL_HOST" &
else
echo "🗝 No SSL proxy, configuring overwrite.cli.url accordingly"
OCC config:system:set overwrite.cli.url --value "http://$VIRTUAL_HOST" &
fi
update-ca-certificates
}
configure_add_user() {
export OC_PASS=$1
OCC user:add --password-from-env "$1"
}
install() {
if [ -n "$VIRTUAL_HOST" ]; then
DBNAME=$(echo "$VIRTUAL_HOST" | cut -d '.' -f1)
else
DBNAME="nextcloud"
fi
SQLHOST="database-$SQL"
echo "database name will be $DBNAME"
USER="admin"
PASSWORD="admin"
run_hook_before_install
output "🔧 Starting auto installation"
if [ "$SQL" = "oci" ]; then
OCC maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database="$SQL" --database-name=FREE --database-host="$SQLHOST" --database-port=1521 --database-user=system --database-pass=oracle
elif [ "$SQL" = "pgsql" ]; then
OCC maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database="$SQL" --database-name="$DBNAME" --database-host="$SQLHOST" --database-user=postgres --database-pass=postgres
elif [ "$SQL" = "mysql" ]; then
OCC maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database="$SQL" --database-name="$DBNAME" --database-host="$SQLHOST" --database-user=root --database-pass=nextcloud
elif [ "$SQL" = "mariadb-replica" ]; then
OCC maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database="mysql" --database-name="$DBNAME" --database-host="database-mariadb-primary" --database-user=root --database-pass=nextcloud
elif [ "$SQL" = "maxscale" ]; then
sleep 10
# FIXME only works for main container as maxscale does not pass root along
OCC maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database="mysql" --database-name="$DBNAME" --database-host="database-mariadb-primary" --database-user=nextcloud --database-pass=nextcloud
OCC config:system:set dbhost --value="database-maxscale"
OCC config:system:set dbuser --value="nextcloud"
else
OCC maintenance:install --admin-user=$USER --admin-pass=$PASSWORD --database="$SQL"
fi;
if is_installed
then
output "🔧 Server installed"
else
output "Last nextcloud.log entry:"
output "$(tail -n 1 "$WEBROOT"/data/nextcloud.log | jq)"
fatal "🚨 Server installation failed."
fi
output "🔧 Provisioning apps"
OCC app:disable password_policy
for app in $NEXTCLOUD_AUTOINSTALL_APPS; do
APP_ENABLED=$(OCC app:enable "$app")
output "$APP_ENABLED"
WAIT_TIME=0
until [[ $WAIT_TIME -eq ${NEXTCLOUD_AUTOINSTALL_APPS_WAIT_TIME:-0} ]] || [[ $APP_ENABLED =~ ${app}.*enabled$ ]]
do
# if app is not installed pause for 1 seconds and enable again
output "🔄 retrying"
sleep 1
APP_ENABLED=$(OCC app:enable "$app")
output "$APP_ENABLED"
((WAIT_TIME++))
done
done
configure_gs
configure_ldap
configure_oidc
output "🔧 Finetuning the configuration"
if [ "$WITH_REDIS" != "NO" ]; then
cp /root/redis.config.php "$WEBROOT"/config/
else
cp /root/apcu.config.php "$WEBROOT"/config/
fi
# Setup domains
# localhost is at index 0 due to the installation
INTERNAL_IP_ADDRESS=$(ip a show type veth | grep -o "inet [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*")
NEXTCLOUD_TRUSTED_DOMAINS="${NEXTCLOUD_TRUSTED_DOMAINS:-nextcloud} ${VIRTUAL_HOST} ${INTERNAL_IP_ADDRESS} localhost"
if [ -n "${NEXTCLOUD_TRUSTED_DOMAINS+x}" ]; then
echo "🔧 setting trusted domains…"
NC_TRUSTED_DOMAIN_IDX=1
for DOMAIN in $NEXTCLOUD_TRUSTED_DOMAINS ; do
DOMAIN=$(echo "$DOMAIN" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
OCC config:system:set trusted_domains $NC_TRUSTED_DOMAIN_IDX --value="$DOMAIN"
NC_TRUSTED_DOMAIN_IDX=$((NC_TRUSTED_DOMAIN_IDX + 1))
done
fi
TRUSTED_PROXY=$(ip a show type veth | awk '/scope global/ {print $2}')
OCC config:system:set trusted_proxies 0 --value="$TRUSTED_PROXY"
configure_ssl_proxy
output "🔧 Preparing cron job"
OCC dav:sync-system-addressbook
# Setup initial configuration
OCC background:cron
# Trigger initial cron run
sudo -E -u www-data php cron.php &
# run custom shell script from nc root
# [ -e /var/www/html/nc-dev-autosetup.sh ] && bash /var/www/html/nc-dev-autosetup.sh
output "🔧 Setting up users and LDAP in the background"
OCC user:setting admin settings email admin@example.net &
INSTANCENAME=$(echo "$VIRTUAL_HOST" | cut -d '.' -f1)
configure_add_user "${INSTANCENAME:-nextcloud}" &
configure_add_user user1 &
configure_add_user user2 &
configure_add_user user3 &
configure_add_user user4 &
configure_add_user user5 &
configure_add_user user6 &
configure_add_user jane &
configure_add_user john &
configure_add_user alice &
configure_add_user bob &
run_hook_after_install
output "🚀 Finished setup using $SQL database…"
}
run_hook_before_install() {
[ -e /shared/hooks/before-install.sh ] && bash /shared/hooks/before-install.sh
}
run_hook_after_install() {
[ -e /shared/hooks/after-install.sh ] && bash /shared/hooks/after-install.sh
}
run_hook_before_start() {
[ -e /shared/hooks/before-start.sh ] && bash /shared/hooks/before-start.sh
}
run_hook_after_start() {
[ -e /shared/hooks/after-start.sh ] && bash /shared/hooks/after-start.sh
}
add_hosts() {
echo "Add the host IP as host.docker.internal to /etc/hosts ..."
ip -4 route list match 0/0 | awk '{print $3 " host.docker.internal"}' >> /etc/hosts
}
setup() {
update_permission
configure_xdebug_mode
if is_installed || [[ ! -f $WEBROOT/config/config.php ]]
then
output "🚀 Nextcloud already installed ... skipping setup"
# configuration that should be applied on each start
configure_ssl_proxy
else
# We copy the default config to the container
cp /root/default.config.php "$WEBROOT"/config/config.php
chown -R www-data:www-data "$WEBROOT"/config/config.php
mkdir -p "$WEBROOT/apps-extra"
mkdir -p "$WEBROOT/apps-shared"
update_permission
if [ "$NEXTCLOUD_AUTOINSTALL" != "NO" ]
then
add_hosts
install
else
touch "${WEBROOT}/config/CAN_INSTALL"
fi
fi
}
check_source() {
FILE=/var/www/html/status.php
if [ -f "$FILE" ]; then
output "Server source is mounted, continuing"
else
# Only autoinstall when not running in docker compose
if [ -n "$VIRTUAL_HOST" ] && [ ! -f "$WEBROOT"/version.php ]
then
output "======================================================================================="
output " 🚨 Could not find a valid Nextcloud source in $WEBROOT "
output " Double check your REPO_PATH_SERVER and STABLE_ROOT_PATH environment variables in .env "
output "======================================================================================="
exit 1
fi
output "Server source is not present, fetching ${SERVER_BRANCH:-master}"
git clone --depth 1 --branch "${SERVER_BRANCH:-master}" https://github.com/nextcloud/server.git /tmp/server
(cd /tmp/server && git submodule update --init)
output "Cloning additional apps"
git clone --depth 1 --branch "${SERVER_BRANCH:-master}" https://github.com/nextcloud/viewer.git /tmp/server/apps/viewer
# shallow clone of submodules https://stackoverflow.com/questions/2144406/how-to-make-shallow-git-submodules
git config -f .gitmodules submodule.3rdparty.shallow true
(cd /tmp/server && git submodule update --init)
rsync -a --chmod=755 --chown=www-data:www-data /tmp/server/ /var/www/html
chown www-data: /var/www/html
chown www-data: /var/www/html/.htaccess
fi
output "Nextcloud server source is ready"
}
(
check_source
wait_for_other_containers
setup
run_hook_before_start
rm /etc/apache2/conf-enabled/install.conf
rm -f /var/www/html/installing.html
pkill -USR1 apache2
run_hook_after_start
) &
touch /var/log/cron/nextcloud.log "$WEBROOT"/data/nextcloud.log /var/log/xdebug.log
chown www-data /var/log/xdebug.log
echo "📰 Watching log file"
tail --follow "$WEBROOT"/data/nextcloud.log /var/log/cron/nextcloud.log /var/log/xdebug.log &
echo "⌚ Starting cron"
/usr/sbin/cron -f &
echo "🚀 Starting apache"
exec "$@"
-3
View File
@@ -1,3 +0,0 @@
#!/bin/sh
sudo -E -u www-data "$WEBROOT/occ" "$@"
-1
View File
@@ -1 +0,0 @@
FROM collabora/code
-21
View File
@@ -1,21 +0,0 @@
FROM --platform=linux/amd64 ubuntu:24.04
RUN apt update && \
apt install -y git build-essential zip ccache junit4 libkrb5-dev nasm graphviz python3 python3-dev qtbase5-dev libkf5coreaddons-dev libkf5i18n-dev libkf5config-dev libkf5windowsystem-dev libkf5kio-dev autoconf libcups2-dev libfontconfig1-dev gperf default-jdk doxygen libxslt1-dev xsltproc libxml2-utils libxrandr-dev libx11-dev bison flex libgtk-3-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev ant ant-optional libnss3-dev libavahi-client-dev libxt-dev \
sudo git vim wget curl \
dialog \
libpoco-dev python3-polib libcap-dev npm \
libpam-dev wget git build-essential libtool \
libcap2-bin python3-lxml libpng-dev libcppunit-dev \
pkg-config fontconfig \
&& rm -rf /var/lib/apt/lists/*
RUN npm install -g sass
RUN adduser --quiet --disabled-password --gecos '' --system --group --home /collabora cool
RUN adduser cool sudo
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
EXPOSE 9980
USER cool
-3
View File
@@ -1,3 +0,0 @@
<?php $CONFIG=[
'memcache.local' => '\\OC\\Memcache\\APCu',
];
-9
View File
@@ -1,9 +0,0 @@
<?php
$AUTOCONFIG = [
'dbname' => 'nextcloud',
'dbhost' => 'database-pgsql',
'dbuser' => 'postgres',
'dbpass' => 'postgres',
'dbtype' => 'pgsql'
];
-2
View File
@@ -1,2 +0,0 @@
# m h dom mon dow command
*/5 * * * * sudo -E -u www-data php -f /var/www/html/cron.php >> /var/log/cron/nextcloud.log 2>&1
-157
View File
@@ -1,157 +0,0 @@
<?php
$hostname = gethostname();
$primary = isset($_ENV['PRIMARY']) ? $_ENV['PRIMARY'] : '';
$virtualHost = isset($_ENV['VIRTUAL_HOST']) ? $_ENV['VIRTUAL_HOST'] : '';
$virtualHost = explode(".", $virtualHost);
if (count($virtualHost) > 0) {
$hostname = array_shift($virtualHost);
}
$CONFIG=[
'debug' => true,
'profiler' => true,
'apps_paths' =>
array (
0 =>
array (
'path' => '/var/www/html/apps',
'url' => '/apps',
'writable' => false,
),
1 =>
array (
'path' => '/var/www/html/apps-extra',
'url' => '/apps-extra',
'writable' => false,
),
2 =>
array (
'path' => '/var/www/html/apps-shared',
'url' => '/apps-shared',
'writable' => false,
),
3 =>
array (
'path' => '/var/www/html/apps-writable',
'url' => '/apps-writable',
'writable' => true,
),
),
// allow local remote senders
'allow_local_remote_servers' => true,
// config for mailhog
'mail_from_address' => 'admin',
'mail_smtpmode' => 'smtp',
'mail_sendmailmode' => 'smtp',
'mail_domain' => 'localhost',
'mail_smtphost' => 'mail',
'mail_smtpport' => '1025',
'skeletondirectory' => '/skeleton',
'setup_create_db_user' => false,
'debug' => true,
'loglevel' => 2,
// 'htaccess.RewriteBase' => '/',
'log_query' => false,
'query_log_file' => '/shared/log/querylog-' . $hostname .'.log',
'query_log_file_requestid' => 'yes',
'diagnostics.logging' => false,
'diagnostics.logging.threshold' => 0,
'log.condition' => [
'apps' => ['diagnostics', 'admin_audit'],
],
];
if ($primary === 'minio') {
$CONFIG += [
'objectstore' =>
array (
'class' => 'OC\\Files\\ObjectStore\\S3',
'arguments' =>
array (
'bucket' => 'nc-' . $hostname,
'key' => 'nextcloud',
'secret' => 'nextcloud',
'hostname' => 'minio',
'port' => '9000',
'use_ssl' => false,
'use_path_style' => true,
'autocreate' => true,
'verify_bucket_exists' => true,
),
)
];
}
if ($primary === 'minio-multibucket') {
$CONFIG += [
'objectstore_multibucket' => array(
'class' => 'OC\\Files\\ObjectStore\\S3',
'arguments' => array(
// optional, defaults to 64
'num_buckets' => 64,
// n integer in the range from 0 to (num_buckets-1) will be appended
'bucket' => 'nc-' . $hostname,
'key' => 'nextcloud',
'secret' => 'nextcloud',
'hostname' => 'minio',
'port' => '9000',
'use_ssl' => false,
'use_path_style' => true,
),
),
];
}
if ($primary === 'rustfs') {
$CONFIG += [
'objectstore' =>
array (
'class' => 'OC\\Files\\ObjectStore\\S3',
'arguments' =>
array (
'bucket' => 'nc-' . $hostname,
'key' => 'nextcloud',
'secret' => 'nextcloud',
'hostname' => 'rustfs.local',
'port' => '80',
'proxy' => 'rustfs:9000',
'use_ssl' => false,
'use_path_style' => true,
'use_presigned_url' => true,
'autocreate' => true,
'verify_bucket_exists' => true,
),
)
];
}
if ($primary === 'rustfs-multibucket') {
$CONFIG += [
'objectstore_multibucket' => array(
'class' => 'OC\\Files\\ObjectStore\\S3',
'arguments' => array(
// optional, defaults to 64
'num_buckets' => 64,
// n integer in the range from 0 to (num_buckets-1) will be appended
'bucket' => 'nc-' . $hostname,
'key' => 'nextcloud',
'secret' => 'nextcloud',
'hostname' => 'rustfs.local',
'port' => '80',
'proxy' => 'rustfs:9000',
'use_presigned_url' => true,
'use_ssl' => false,
'use_path_style' => true,
),
),
];
}
-17
View File
@@ -1,17 +0,0 @@
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 2384
frontend www
bind :80
mode http
default_backend nextcloud
backend nextcloud
mode http
balance roundrobin
cookie SRVNAME insert
option httpchk HEAD / HTTP/1.1\r\nHost:localhost
server nc1 nextcloud:80 check cookie nc1
server nc2 nextcloud2:80 check cookie nc2
-15
View File
@@ -1,15 +0,0 @@
display_startup_errors=0
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1
apc.enable_cli=1
memory_limit=512M
upload_max_filesize=512M
post_max_size=512M
-22
View File
@@ -1,22 +0,0 @@
; off develop debug gcstats profile trace
xdebug.mode = off
xdebug.idekey=PHPSTORM
xdebug.trace_output_name=trace.%R.%u
xdebug.profiler_output_name=profile.%R.%u
xdebug.output_dir=/shared/xdebug
xdebug.log = /var/log/xdebug.log
xdebug.log_level = 1
; Try to discover the client host, otherwise fall back to the docker host
xdebug.discover_client_host=true
xdebug.client_host=host.docker.internal
; When you cannot specify a trigger, use "xdebug.start_with_request = yes" to autostart debugging for all requests
; https://xdebug.org/docs/all_settings#start_with_request
xdebug.start_with_request = trigger
; Set xdebug.mode trace to use this
; More details at https://derickrethans.nl/flamboyant-flamegraphs.html
xdebug.trace_format=3
xdebug.trace_output_name=xdebug.%R.%u
-9
View File
@@ -1,9 +0,0 @@
<?php $CONFIG=[
'redis' =>
array (
'host' => 'redis',
'port' => 6379,
),
'memcache.local' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
];
-12
View File
@@ -1,12 +0,0 @@
'objectstore' => [
'class' => 'OC\\Files\\ObjectStore\\S3',
'arguments' => [
'bucket' => 'nextcloud',
'key' => '123',
'secret' => 'abc',
'hostname' => 's3',
'port' => '4567',
'use_ssl' => false,
'use_path_style' => true,
],
],
@@ -1,17 +0,0 @@
-----BEGIN CERTIFICATE-----
MIICrDCCAhWgAwIBAgIUNtfnC2jE/rLdxHCs2th3WaYLryAwDQYJKoZIhvcNAQEL
BQAwaDELMAkGA1UEBhMCREUxCzAJBgNVBAgMAkJZMRIwEAYDVQQHDAlXdWVyemJ1
cmcxFDASBgNVBAoMC0V4YW1wbGUgb3JnMSIwIAYDVQQDDBlzc28ubG9jYWwuZGV2
LmJpdGdyaWQubmV0MB4XDTE5MDcwMzE0MjkzOFoXDTI5MDcwMjE0MjkzOFowaDEL
MAkGA1UEBhMCREUxCzAJBgNVBAgMAkJZMRIwEAYDVQQHDAlXdWVyemJ1cmcxFDAS
BgNVBAoMC0V4YW1wbGUgb3JnMSIwIAYDVQQDDBlzc28ubG9jYWwuZGV2LmJpdGdy
aWQubmV0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHPZwU+dAc76yB6bOq
0AkP1y9g7aAi1vRtJ9GD4AEAsA3zjW1P60BYs92mvZwNWK6NxlJYw51xPak9QMk5
qRHaTdBkmq0a2mWYqh1AZNNgCII6/VnLcbEIgyoXB0CCfY+2vaavAmFsRwOMdeR9
HmtQQPlbTA4m5Y8jWGVs1qPtDQIDAQABo1MwUTAdBgNVHQ4EFgQUeZSoGKeN5uu5
K+n98o3wcitFYJ0wHwYDVR0jBBgwFoAUeZSoGKeN5uu5K+n98o3wcitFYJ0wDwYD
VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOBgQA25X/Ke+5dw7up8gcF2BNQ
ggBcJs+SVKBmPwRcPQ8plgX4D/K8JJNT13HNlxTGDmb9elXEkzSjdJ+6Oa8n3IMe
vUUejXDXUBvlmmm+ImJVwwCn27cSfIYb/RoZPeKtned4SCzpbEO9H/75z3XSqAZS
Z1tiHzYOVtEs4UNGOtz1Jg==
-----END CERTIFICATE-----
@@ -1,16 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMc9nBT50BzvrIHp
s6rQCQ/XL2DtoCLW9G0n0YPgAQCwDfONbU/rQFiz3aa9nA1Yro3GUljDnXE9qT1A
yTmpEdpN0GSarRraZZiqHUBk02AIgjr9WctxsQiDKhcHQIJ9j7a9pq8CYWxHA4x1
5H0ea1BA+VtMDibljyNYZWzWo+0NAgMBAAECgYEApKf84rTlUdSdGywZSHPu2UF7
rT4UVlaQ39jFZJfuHDRjA0GA8kg4AFZ9Onx+h+UfNJmOmj7nUZukzrNI2TcpQWtP
mhfgU8nGvXaFjuoAqPAOSktxzYS1BZuhG1RndbhbQQkoMMYBmBScplb6jrotePfh
tssuIpR494Cqy/WrNGECQQDyWIJZri+0IS55PiwZg5Obb1Xb+Nt4rncxvYeRf5Xe
/tFB+3AvfcNpcC2HBlpKHHeNEHJj760Ct2G3M2RuNPL5AkEA0ndfFRjvhDPAkuqK
EfXoTOrW+uTSDPQ0493ObQxRh4we4uNucGmd/kahEyeZWLgpBpg1YmcKbv/gU4Vh
LUr7tQJAZU9U5rKnpJC+gdbYzq2vlin75aJp9VBR6cxGkS+Z8ofp6MB5DJFxkHFh
xvGD6zltTN5UQ6zdUaZhxhlI4b1m2QJAZ8lR7Bd11Z2ns0tRdvXq7jNIfETmiFjM
1CmHKCNQ+STR/lTlGy4aKVAvEkEOz79RC913ReVGMeKgfs9hUnKNmQJALd1ZnUWB
D0hRK2RjgIsW1wBKVUmqJ0kyQ3YC+4wRKIzwMRk5JNXxbDNKHVtHEuBZRjo707b1
FhVf3Q6nryM2fg==
-----END PRIVATE KEY-----
@@ -1,412 +0,0 @@
<?php
$config = array(
// This is a authentication source which handles admin authentication.
'admin' => array(
// The default is to use core:AdminPassword, but it can be replaced with
// any authentication source.
'core:AdminPassword',
),
/*
'example-sql' => array(
'sqlauth:SQL',
'dsn' => 'pgsql:host=sql.example.org;port=5432;dbname=simplesaml',
'username' => 'simplesaml',
'password' => 'secretpassword',
'query' => 'SELECT uid, givenName, email, eduPersonPrincipalName FROM users WHERE uid = :username AND password = SHA2(CONCAT((SELECT salt FROM users WHERE uid = :username), :password),256);',
),
*/
'example-static' => array(
'exampleauth:Static',
'uid' => array('testuser'),
'eduPersonAffiliation' => array('member', 'employee'),
'cn' => array('Test User'),
),
/*
'example-userpass' => array(
'exampleauth:UserPass',
// Give the user an option to save their username for future login attempts
// And when enabled, what should the default be, to save the username or not
//'remember.username.enabled' => FALSE,
//'remember.username.checked' => FALSE,
'student:studentpass' => array(
'uid' => array('test'),
'eduPersonAffiliation' => array('member', 'student'),
),
'employee:employeepass' => array(
'uid' => array('employee'),
'eduPersonAffiliation' => array('member', 'employee'),
),
),
*/
/*
'crypto-hash' => array(
'authcrypt:Hash',
// hashed version of 'verysecret', made with bin/pwgen.php
'professor:{SSHA256}P6FDTEEIY2EnER9a6P2GwHhI5JDrwBgjQ913oVQjBngmCtrNBUMowA==' => array(
'uid' => array('prof_a'),
'eduPersonAffiliation' => array('member', 'employee', 'board'),
),
),
*/
/*
'htpasswd' => array(
'authcrypt:Htpasswd',
'htpasswd_file' => '/var/www/foo.edu/legacy_app/.htpasswd',
'static_attributes' => array(
'eduPersonAffiliation' => array('member', 'employee'),
'Organization' => array('University of Foo'),
),
),
*/
/*
// This authentication source serves as an example of integration with an
// external authentication engine. Take a look at the comment in the beginning
// of modules/exampleauth/lib/Auth/Source/External.php for a description of
// how to adjust it to your own site.
'example-external' => array(
'exampleauth:External',
),
*/
/*
'yubikey' => array(
'authYubiKey:YubiKey',
'id' => '000',
// 'key' => '012345678',
),
*/
/*
'openid' => array(
'openid:OpenIDConsumer',
'attributes.required' => array('nickname'),
'attributes.optional' => array('fullname', 'email',),
// 'sreg.validate' => FALSE,
'attributes.ax_required' => array('http://axschema.org/namePerson/friendly'),
'attributes.ax_optional' => array('http://axschema.org/namePerson','http://axschema.org/contact/email'),
// Prefer HTTP redirect over POST
// 'prefer_http_redirect' => FALSE,
),
*/
/*
// Example of an authsource that authenticates against Google.
// See: http://code.google.com/apis/accounts/docs/OpenID.html
'google' => array(
'openid:OpenIDConsumer',
// Googles OpenID endpoint.
'target' => 'https://www.google.com/accounts/o8/id',
// Custom realm
// 'realm' => 'http://*.example.org',
// Attributes that google can supply.
'attributes.ax_required' => array(
//'http://axschema.org/namePerson/first',
//'http://axschema.org/namePerson/last',
//'http://axschema.org/contact/email',
//'http://axschema.org/contact/country/home',
//'http://axschema.org/pref/language',
),
// custom extension arguments
'extension.args' => array(
//'http://specs.openid.net/extensions/ui/1.0' => array(
// 'mode' => 'popup',
// 'icon' => 'true',
//),
),
),
*/
/*
'papi' => array(
'authpapi:PAPI',
),
*/
/*
'facebook' => array(
'authfacebook:Facebook',
// Register your Facebook application on http://www.facebook.com/developers
// App ID or API key (requests with App ID should be faster; https://github.com/facebook/php-sdk/issues/214)
'api_key' => 'xxxxxxxxxxxxxxxx',
// App Secret
'secret' => 'xxxxxxxxxxxxxxxx',
// which additional data permissions to request from user
// see http://developers.facebook.com/docs/authentication/permissions/ for the full list
// 'req_perms' => 'email,user_birthday',
),
*/
/*
// LinkedIn OAuth Authentication API.
// Register your application to get an API key here:
// https://www.linkedin.com/secure/developer
'linkedin' => array(
'authlinkedin:LinkedIn',
'key' => 'xxxxxxxxxxxxxxxx',
'secret' => 'xxxxxxxxxxxxxxxx',
),
*/
/*
// Twitter OAuth Authentication API.
// Register your application to get an API key here:
// http://twitter.com/oauth_clients
'twitter' => array(
'authtwitter:Twitter',
'key' => 'xxxxxxxxxxxxxxxx',
'secret' => 'xxxxxxxxxxxxxxxx',
// Forces the user to enter their credentials to ensure the correct users account is authorized.
// Details: https://dev.twitter.com/docs/api/1/get/oauth/authenticate
'force_login' => FALSE,
),
*/
/*
// MySpace OAuth Authentication API.
// Register your application to get an API key here:
// http://developer.myspace.com/
'myspace' => array(
'authmyspace:MySpace',
'key' => 'xxxxxxxxxxxxxxxx',
'secret' => 'xxxxxxxxxxxxxxxx',
),
*/
/*
// Microsoft Account (Windows Live ID) Authentication API.
// Register your application to get an API key here:
// https://apps.dev.microsoft.com/
'windowslive' => array(
'authwindowslive:LiveID',
'key' => 'xxxxxxxxxxxxxxxx',
'secret' => 'xxxxxxxxxxxxxxxx',
),
*/
/*
// Example of a LDAP authentication source.
'example-ldap' => array(
'ldap:LDAP',
// Give the user an option to save their username for future login attempts
// And when enabled, what should the default be, to save the username or not
//'remember.username.enabled' => FALSE,
//'remember.username.checked' => FALSE,
// The hostname of the LDAP server.
'hostname' => 'ldap.example.org',
// Whether SSL/TLS should be used when contacting the LDAP server.
'enable_tls' => TRUE,
// Whether debug output from the LDAP library should be enabled.
// Default is FALSE.
'debug' => FALSE,
// The timeout for accessing the LDAP server, in seconds.
// The default is 0, which means no timeout.
'timeout' => 0,
// The port used when accessing the LDAP server.
// The default is 389.
'port' => 389,
// Set whether to follow referrals. AD Controllers may require FALSE to function.
'referrals' => TRUE,
// Which attributes should be retrieved from the LDAP server.
// This can be an array of attribute names, or NULL, in which case
// all attributes are fetched.
'attributes' => NULL,
// The pattern which should be used to create the users DN given the username.
// %username% in this pattern will be replaced with the users username.
//
// This option is not used if the search.enable option is set to TRUE.
'dnpattern' => 'uid=%username%,ou=people,dc=example,dc=org',
// As an alternative to specifying a pattern for the users DN, it is possible to
// search for the username in a set of attributes. This is enabled by this option.
'search.enable' => FALSE,
// The DN which will be used as a base for the search.
// This can be a single string, in which case only that DN is searched, or an
// array of strings, in which case they will be searched in the order given.
'search.base' => 'ou=people,dc=example,dc=org',
// The attribute(s) the username should match against.
//
// This is an array with one or more attribute names. Any of the attributes in
// the array may match the value the username.
'search.attributes' => array('uid', 'mail'),
// The username & password the SimpleSAMLphp should bind to before searching. If
// this is left as NULL, no bind will be performed before searching.
'search.username' => NULL,
'search.password' => NULL,
// If the directory uses privilege separation,
// the authenticated user may not be able to retrieve
// all required attribures, a privileged entity is required
// to get them. This is enabled with this option.
'priv.read' => FALSE,
// The DN & password the SimpleSAMLphp should bind to before
// retrieving attributes. These options are required if
// 'priv.read' is set to TRUE.
'priv.username' => NULL,
'priv.password' => NULL,
),
*/
/*
// Example of an LDAPMulti authentication source.
'example-ldapmulti' => array(
'ldap:LDAPMulti',
// Give the user an option to save their username for future login attempts
// And when enabled, what should the default be, to save the username or not
//'remember.username.enabled' => FALSE,
//'remember.username.checked' => FALSE,
// The way the organization as part of the username should be handled.
// Three possible values:
// - 'none': No handling of the organization. Allows '@' to be part
// of the username.
// - 'allow': Will allow users to type 'username@organization'.
// - 'force': Force users to type 'username@organization'. The dropdown
// list will be hidden.
//
// The default is 'none'.
'username_organization_method' => 'none',
// Whether the organization should be included as part of the username
// when authenticating. If this is set to TRUE, the username will be on
// the form <username>@<organization identifier>. If this is FALSE, the
// username will be used as the user enters it.
//
// The default is FALSE.
'include_organization_in_username' => FALSE,
// A list of available LDAP servers.
//
// The index is an identifier for the organization/group. When
// 'username_organization_method' is set to something other than 'none',
// the organization-part of the username is matched against the index.
//
// The value of each element is an array in the same format as an LDAP
// authentication source.
'employees' => array(
// A short name/description for this group. Will be shown in a dropdown list
// when the user logs on.
//
// This option can be a string or an array with language => text mappings.
'description' => 'Employees',
// The rest of the options are the same as those available for
// the LDAP authentication source.
'hostname' => 'ldap.employees.example.org',
'dnpattern' => 'uid=%username%,ou=employees,dc=example,dc=org',
),
'students' => array(
'description' => 'Students',
'hostname' => 'ldap.students.example.org',
'dnpattern' => 'uid=%username%,ou=students,dc=example,dc=org',
),
),
*/
'ldap' => array(
'ldap:LDAP',
// Give the user an option to save their username for future login attempts
// And when enabled, what should the default be, to save the username or not
//'remember.username.enabled' => FALSE,
//'remember.username.checked' => FALSE,
// The hostname of the LDAP server.
'hostname' => 'ldap',
// Whether SSL/TLS should be used when contacting the LDAP server.
'enable_tls' => FALSE,
// Whether debug output from the LDAP library should be enabled.
// Default is FALSE.
'debug' => TRUE,
// The timeout for accessing the LDAP server, in seconds.
// The default is 0, which means no timeout.
'timeout' => 0,
// The port used when accessing the LDAP server.
// The default is 389.
'port' => 389,
// Set whether to follow referrals. AD Controllers may require FALSE to function.
'referrals' => TRUE,
// Which attributes should be retrieved from the LDAP server.
// This can be an array of attribute names, or NULL, in which case
// all attributes are fetched.
'attributes' => array('cn', 'givenName', 'mail', 'sn', 'uid'),
// The pattern which should be used to create the users DN given the username.
// %username% in this pattern will be replaced with the users username.
//
// This option is not used if the search.enable option is set to TRUE.
'dnpattern' => 'uid=%username%,dc=planetexpress,dc=com',
// As an alternative to specifying a pattern for the users DN, it is possible to
// search for the username in a set of attributes. This is enabled by this option.
'search.enable' => TRUE,
// The DN which will be used as a base for the search.
// This can be a single string, in which case only that DN is searched, or an
// array of strings, in which case they will be searched in the order given.
'search.base' => 'dc=planetexpress,dc=com',
// The attribute(s) the username should match against.
//
// This is an array with one or more attribute names. Any of the attributes in
// the array may match the value the username.
'search.attributes' => array('uid'),
// The username & password the SimpleSAMLphp should bind to before searching. If
// this is left as NULL, no bind will be performed before searching.
'search.username' => 'cn=admin,dc=planetexpress,dc=com',
'search.password' => 'admin',
// If the directory uses privilege separation,
// the authenticated user may not be able to retrieve
// all required attribures, a privileged entity is required
// to get them. This is enabled with this option.
'priv.read' => FALSE,
// The DN & password the SimpleSAMLphp should bind to before
// retrieving attributes. These options are required if
// 'priv.read' is set to TRUE.
'priv.username' => NULL,
'priv.password' => NULL,
),
);
@@ -1,851 +0,0 @@
<?php
/*
* The configuration of SimpleSAMLphp
*
*/
$config = array(
/**
* Setup the following parameters to match the directory of your installation.
* See the user manual for more details.
*
* Valid format for baseurlpath is:
* [(http|https)://(hostname|fqdn)[:port]]/[path/to/simplesaml/]
* (note that it must end with a '/')
*
* The full url format is useful if your SimpleSAMLphp setup is hosted behind
* a reverse proxy. In that case you can specify the external url here.
*
* Please note that SimpleSAMLphp will then redirect all queries to the
* external url, no matter where you come from (direct access or via the
* reverse proxy).
*/
'baseurlpath' => 'https://sso.local/simplesaml/',
'certdir' => 'cert/',
'loggingdir' => 'log/',
'datadir' => 'data/',
/*
* A directory where SimpleSAMLphp can save temporary files.
*
* SimpleSAMLphp will attempt to create this directory if it doesn't exist.
*/
'tempdir' => '/tmp/simplesaml',
/*
* If you enable this option, SimpleSAMLphp will log all sent and received messages
* to the log file.
*
* This option also enables logging of the messages that are encrypted and decrypted.
*
* Note: The messages are logged with the DEBUG log level, so you also need to set
* the 'logging.level' option to LOG_DEBUG.
*/
'debug' => false,
/*
* When showerrors is enabled, all error messages and stack traces will be output
* to the browser.
*
* When errorreporting is enabled, a form will be presented for the user to report
* the error to technicalcontact_email.
*/
'showerrors' => true,
'errorreporting' => true,
/**
* Custom error show function called from SimpleSAML_Error_Error::show.
* See docs/simplesamlphp-errorhandling.txt for function code example.
*
* Example:
* 'errors.show_function' => array('sspmod_example_Error_Show', 'show'),
*/
/**
* This option allows you to enable validation of XML data against its
* schemas. A warning will be written to the log if validation fails.
*/
'debug.validatexml' => false,
/**
* This password must be kept secret, and modified from the default value 123.
* This password will give access to the installation page of SimpleSAMLphp with
* metadata listing and diagnostics pages.
* You can also put a hash here; run "bin/pwgen.php" to generate one.
*/
'auth.adminpassword' => 'admin',
'admin.protectindexpage' => false,
'admin.protectmetadata' => false,
/**
* This is a secret salt used by SimpleSAMLphp when it needs to generate a secure hash
* of a value. It must be changed from its default value to a secret value. The value of
* 'secretsalt' can be any valid string of any length.
*
* A possible way to generate a random salt is by running the following command from a unix shell:
* tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' </dev/urandom | dd bs=32 count=1 2>/dev/null;echo
*/
'secretsalt' => 'defaultsecretsalt111',
/*
* Some information about the technical persons running this installation.
* The email address will be used as the recipient address for error reports, and
* also as the technical contact in generated metadata.
*/
'technicalcontact_name' => 'Administrator',
'technicalcontact_email' => 'idp-admin@idptestbed',
/*
* The timezone of the server. This option should be set to the timezone you want
* SimpleSAMLphp to report the time in. The default is to guess the timezone based
* on your system timezone.
*
* See this page for a list of valid timezones: http://php.net/manual/en/timezones.php
*/
'timezone' => null,
/*
* Logging.
*
* define the minimum log level to log
* SimpleSAML_Logger::ERR No statistics, only errors
* SimpleSAML_Logger::WARNING No statistics, only warnings/errors
* SimpleSAML_Logger::NOTICE Statistics and errors
* SimpleSAML_Logger::INFO Verbose logs
* SimpleSAML_Logger::DEBUG Full debug logs - not recommended for production
*
* Choose logging handler.
*
* Options: [syslog,file,errorlog]
*
*/
'logging.level' => SimpleSAML_Logger::NOTICE,
'logging.handler' => 'syslog',
/*
* Specify the format of the logs. Its use varies depending on the log handler used (for instance, you cannot
* control here how dates are displayed when using the syslog or errorlog handlers), but in general the options
* are:
*
* - %date{<format>}: the date and time, with its format specified inside the brackets. See the PHP documentation
* of the strftime() function for more information on the format. If the brackets are omitted, the standard
* format is applied. This can be useful if you just want to control the placement of the date, but don't care
* about the format.
*
* - %process: the name of the SimpleSAMLphp process. Remember you can configure this in the 'logging.processname'
* option below.
*
* - %level: the log level (name or number depending on the handler used).
*
* - %stat: if the log entry is intended for statistical purposes, it will print the string 'STAT ' (bear in mind
* the trailing space).
*
* - %trackid: the track ID, an identifier that allows you to track a single session.
*
* - %srcip: the IP address of the client. If you are behind a proxy, make sure to modify the
* $_SERVER['REMOTE_ADDR'] variable on your code accordingly to the X-Forwarded-For header.
*
* - %msg: the message to be logged.
*
*/
//'logging.format' => '%date{%b %d %H:%M:%S} %process %level %stat[%trackid] %msg',
/*
* Choose which facility should be used when logging with syslog.
*
* These can be used for filtering the syslog output from SimpleSAMLphp into its
* own file by configuring the syslog daemon.
*
* See the documentation for openlog (http://php.net/manual/en/function.openlog.php) for available
* facilities. Note that only LOG_USER is valid on windows.
*
* The default is to use LOG_LOCAL5 if available, and fall back to LOG_USER if not.
*/
'logging.facility' => defined('LOG_LOCAL5') ? constant('LOG_LOCAL5') : LOG_USER,
/*
* The process name that should be used when logging to syslog.
* The value is also written out by the other logging handlers.
*/
'logging.processname' => 'simplesamlphp',
/* Logging: file - Logfilename in the loggingdir from above.
*/
'logging.logfile' => 'simplesamlphp.log',
/* (New) statistics output configuration.
*
* This is an array of outputs. Each output has at least a 'class' option, which
* selects the output.
*/
'statistics.out' => array(// Log statistics to the normal log.
/*
array(
'class' => 'core:Log',
'level' => 'notice',
),
*/
// Log statistics to files in a directory. One file per day.
/*
array(
'class' => 'core:File',
'directory' => '/var/log/stats',
),
*/
),
/*
* Database
*
* This database configuration is optional. If you are not using
* core functionality or modules that require a database, you can
* skip this configuration.
*/
/*
* Database connection string.
* Ensure that you have the required PDO database driver installed
* for your connection string.
*/
'database.dsn' => 'mysql:host=localhost;dbname=saml',
/*
* SQL database credentials
*/
'database.username' => 'simplesamlphp',
'database.password' => 'secret',
/*
* (Optional) Table prefix
*/
'database.prefix' => '',
/*
* True or false if you would like a persistent database connection
*/
'database.persistent' => false,
/*
* Database slave configuration is optional as well. If you are only
* running a single database server, leave this blank. If you have
* a master/slave configuration, you can define as many slave servers
* as you want here. Slaves will be picked at random to be queried from.
*
* Configuration options in the slave array are exactly the same as the
* options for the master (shown above) with the exception of the table
* prefix.
*/
'database.slaves' => array(
/*
array(
'dsn' => 'mysql:host=myslave;dbname=saml',
'username' => 'simplesamlphp',
'password' => 'secret',
'persistent' => false,
),
*/
),
/*
* Enable
*
* Which functionality in SimpleSAMLphp do you want to enable. Normally you would enable only
* one of the functionalities below, but in some cases you could run multiple functionalities.
* In example when you are setting up a federation bridge.
*/
'enable.saml20-idp' => true,
'enable.shib13-idp' => false,
'enable.adfs-idp' => false,
'enable.wsfed-sp' => false,
'enable.authmemcookie' => false,
/*
* Module enable configuration
*
* Configuration to override module enabling/disabling.
*
* Example:
*
* 'module.enable' => array(
* // Setting to TRUE enables.
* 'exampleauth' => TRUE,
* // Setting to FALSE disables.
* 'saml' => FALSE,
* // Unset or NULL uses default.
* 'core' => NULL,
* ),
*
*/
/*
* This value is the duration of the session in seconds. Make sure that the time duration of
* cookies both at the SP and the IdP exceeds this duration.
*/
'session.duration' => 8 * (60 * 60), // 8 hours.
/*
* Sets the duration, in seconds, data should be stored in the datastore. As the datastore is used for
* login and logout requests, thid option will control the maximum time these operations can take.
* The default is 4 hours (4*60*60) seconds, which should be more than enough for these operations.
*/
'session.datastore.timeout' => (4 * 60 * 60), // 4 hours
/*
* Sets the duration, in seconds, auth state should be stored.
*/
'session.state.timeout' => (60 * 60), // 1 hour
/*
* Option to override the default settings for the session cookie name
*/
'session.cookie.name' => 'SimpleSAMLSessionID',
/*
* Expiration time for the session cookie, in seconds.
*
* Defaults to 0, which means that the cookie expires when the browser is closed.
*
* Example:
* 'session.cookie.lifetime' => 30*60,
*/
'session.cookie.lifetime' => 0,
/*
* Limit the path of the cookies.
*
* Can be used to limit the path of the cookies to a specific subdirectory.
*
* Example:
* 'session.cookie.path' => '/simplesaml/',
*/
'session.cookie.path' => '/',
/*
* Cookie domain.
*
* Can be used to make the session cookie available to several domains.
*
* Example:
* 'session.cookie.domain' => '.example.org',
*/
'session.cookie.domain' => null,
/*
* Set the secure flag in the cookie.
*
* Set this to TRUE if the user only accesses your service
* through https. If the user can access the service through
* both http and https, this must be set to FALSE.
*/
'session.cookie.secure' => false,
/*
* Enable secure POST from HTTPS to HTTP.
*
* If you have some SP's on HTTP and IdP is normally on HTTPS, this option
* enables secure POSTing to HTTP endpoint without warning from browser.
*
* For this to work, module.php/core/postredirect.php must be accessible
* also via HTTP on IdP, e.g. if your IdP is on
* https://idp.example.org/ssp/, then
* http://idp.example.org/ssp/module.php/core/postredirect.php must be accessible.
*/
'enable.http_post' => false,
/*
* Options to override the default settings for php sessions.
*/
'session.phpsession.cookiename' => null,
'session.phpsession.savepath' => null,
'session.phpsession.httponly' => true,
/*
* Option to override the default settings for the auth token cookie
*/
'session.authtoken.cookiename' => 'SimpleSAMLAuthToken',
/*
* Options for remember me feature for IdP sessions. Remember me feature
* has to be also implemented in authentication source used.
*
* Option 'session.cookie.lifetime' should be set to zero (0), i.e. cookie
* expires on browser session if remember me is not checked.
*
* Session duration ('session.duration' option) should be set according to
* 'session.rememberme.lifetime' option.
*
* It's advised to use remember me feature with session checking function
* defined with 'session.check_function' option.
*/
'session.rememberme.enable' => false,
'session.rememberme.checked' => false,
'session.rememberme.lifetime' => (14 * 86400),
/**
* Custom function for session checking called on session init and loading.
* See docs/simplesamlphp-advancedfeatures.txt for function code example.
*
* Example:
* 'session.check_function' => array('sspmod_example_Util', 'checkSession'),
*/
/*
* Languages available, RTL languages, and what language is default
*/
'language.available' => array(
'en', 'no', 'nn', 'se', 'da', 'de', 'sv', 'fi', 'es', 'fr', 'it', 'nl', 'lb', 'cs',
'sl', 'lt', 'hr', 'hu', 'pl', 'pt', 'pt-br', 'tr', 'ja', 'zh', 'zh-tw', 'ru', 'et',
'he', 'id', 'sr', 'lv', 'ro', 'eu'
),
'language.rtl' => array('ar', 'dv', 'fa', 'ur', 'he'),
'language.default' => 'en',
/*
* Options to override the default settings for the language parameter
*/
'language.parameter.name' => 'language',
'language.parameter.setcookie' => true,
/*
* Options to override the default settings for the language cookie
*/
'language.cookie.name' => 'language',
'language.cookie.domain' => null,
'language.cookie.path' => '/',
'language.cookie.lifetime' => (60 * 60 * 24 * 900),
/**
* Custom getLanguage function called from SimpleSAML_XHTML_Template::getLanguage().
* Function should return language code of one of the available languages or NULL.
* See SimpleSAML_XHTML_Template::getLanguage() source code for more info.
*
* This option can be used to implement a custom function for determining
* the default language for the user.
*
* Example:
* 'language.get_language_function' => array('sspmod_example_Template', 'getLanguage'),
*/
/*
* Extra dictionary for attribute names.
* This can be used to define local attributes.
*
* The format of the parameter is a string with <module>:<dictionary>.
*
* Specifying this option will cause us to look for modules/<module>/dictionaries/<dictionary>.definition.json
* The dictionary should look something like:
*
* {
* "firstattribute": {
* "en": "English name",
* "no": "Norwegian name"
* },
* "secondattribute": {
* "en": "English name",
* "no": "Norwegian name"
* }
* }
*
* Note that all attribute names in the dictionary must in lowercase.
*
* Example: 'attributes.extradictionary' => 'ourmodule:ourattributes',
*/
'attributes.extradictionary' => null,
/*
* Which theme directory should be used?
*/
'theme.use' => 'default',
/*
* Default IdP for WS-Fed.
*/
'default-wsfed-idp' => 'urn:federation:pingfederate:localhost',
/*
* Whether the discovery service should allow the user to save his choice of IdP.
*/
'idpdisco.enableremember' => true,
'idpdisco.rememberchecked' => true,
// Disco service only accepts entities it knows.
'idpdisco.validate' => true,
'idpdisco.extDiscoveryStorage' => null,
/*
* IdP Discovery service look configuration.
* Wether to display a list of idp or to display a dropdown box. For many IdP' a dropdown box
* gives the best use experience.
*
* When using dropdown box a cookie is used to highlight the previously chosen IdP in the dropdown.
* This makes it easier for the user to choose the IdP
*
* Options: [links,dropdown]
*
*/
'idpdisco.layout' => 'dropdown',
/*
* Whether SimpleSAMLphp should sign the response or the assertion in SAML 1.1 authentication
* responses.
*
* The default is to sign the assertion element, but that can be overridden by setting this
* option to TRUE. It can also be overridden on a pr. SP basis by adding an option with the
* same name to the metadata of the SP.
*/
'shib13.signresponse' => true,
/*
* Authentication processing filters that will be executed for all IdPs
* Both Shibboleth and SAML 2.0
*/
'authproc.idp' => array(
/* Enable the authproc filter below to add URN Prefixces to all attributes
10 => array(
'class' => 'core:AttributeMap', 'addurnprefix'
), */
/* Enable the authproc filter below to automatically generated eduPersonTargetedID.
20 => 'core:TargetedID',
*/
// Adopts language from attribute to use in UI
30 => 'core:LanguageAdaptor',
/* Add a realm attribute from edupersonprincipalname
40 => 'core:AttributeRealm',
*/
45 => array(
'class' => 'core:StatisticsWithAttribute',
'attributename' => 'realm',
'type' => 'saml20-idp-SSO',
),
/* When called without parameters, it will fallback to filter attributes the old way
* by checking the 'attributes' parameter in metadata on IdP hosted and SP remote.
*/
50 => 'core:AttributeLimit',
/*
* Search attribute "distinguishedName" for pattern and replaces if found
60 => array(
'class' => 'core:AttributeAlter',
'pattern' => '/OU=studerende/',
'replacement' => 'Student',
'subject' => 'distinguishedName',
'%replace',
),
*/
/*
* Consent module is enabled (with no permanent storage, using cookies).
90 => array(
'class' => 'consent:Consent',
'store' => 'consent:Cookie',
'focus' => 'yes',
'checked' => TRUE
),
*/
// If language is set in Consent module it will be added as an attribute.
99 => 'core:LanguageAdaptor',
),
/*
* Authentication processing filters that will be executed for all SPs
* Both Shibboleth and SAML 2.0
*/
'authproc.sp' => array(
/*
10 => array(
'class' => 'core:AttributeMap', 'removeurnprefix'
),
*/
/*
* Generate the 'group' attribute populated from other variables, including eduPersonAffiliation.
60 => array(
'class' => 'core:GenerateGroups', 'eduPersonAffiliation'
),
*/
/*
* All users will be members of 'users' and 'members'
61 => array(
'class' => 'core:AttributeAdd', 'groups' => array('users', 'members')
),
*/
// Adopts language from attribute to use in UI
90 => 'core:LanguageAdaptor',
),
/*
* This option configures the metadata sources. The metadata sources is given as an array with
* different metadata sources. When searching for metadata, simpleSAMPphp will search through
* the array from start to end.
*
* Each element in the array is an associative array which configures the metadata source.
* The type of the metadata source is given by the 'type' element. For each type we have
* different configuration options.
*
* Flat file metadata handler:
* - 'type': This is always 'flatfile'.
* - 'directory': The directory we will load the metadata files from. The default value for
* this option is the value of the 'metadatadir' configuration option, or
* 'metadata/' if that option is unset.
*
* XML metadata handler:
* This metadata handler parses an XML file with either an EntityDescriptor element or an
* EntitiesDescriptor element. The XML file may be stored locally, or (for debugging) on a remote
* web server.
* The XML hetadata handler defines the following options:
* - 'type': This is always 'xml'.
* - 'file': Path to the XML file with the metadata.
* - 'url': The URL to fetch metadata from. THIS IS ONLY FOR DEBUGGING - THERE IS NO CACHING OF THE RESPONSE.
*
* MDX metadata handler:
* This metadata handler looks up for the metadata of an entity at the given MDX server.
* The MDX metadata handler defines the following options:
* - 'type': This is always 'mdx'.
* - 'server': URL of the MDX server (url:port). Mandatory.
* - 'validateFingerprint': The fingerprint of the certificate used to sign the metadata.
* You don't need this option if you don't want to validate the signature on the metadata. Optional.
* - 'cachedir': Directory where metadata can be cached. Optional.
* - 'cachelength': Maximum time metadata cah be cached, in seconds. Default to 24
* hours (86400 seconds). Optional.
*
* PDO metadata handler:
* This metadata handler looks up metadata of an entity stored in a database.
*
* Note: If you are using the PDO metadata handler, you must configure the database
* options in this configuration file.
*
* The PDO metadata handler defines the following options:
* - 'type': This is always 'pdo'.
*
*
* Examples:
*
* This example defines two flatfile sources. One is the default metadata directory, the other
* is a metadata directory with autogenerated metadata files.
*
* 'metadata.sources' => array(
* array('type' => 'flatfile'),
* array('type' => 'flatfile', 'directory' => 'metadata-generated'),
* ),
*
* This example defines a flatfile source and an XML source.
* 'metadata.sources' => array(
* array('type' => 'flatfile'),
* array('type' => 'xml', 'file' => 'idp.example.org-idpMeta.xml'),
* ),
*
* This example defines an mdx source.
* 'metadata.sources' => array(
* array('type' => 'mdx', server => 'http://mdx.server.com:8080', 'cachedir' => '/var/simplesamlphp/mdx-cache', 'cachelength' => 86400)
* ),
*
* This example defines an pdo source.
* 'metadata.sources' => array(
* array('type' => 'pdo')
* ),
*
* Default:
* 'metadata.sources' => array(
* array('type' => 'flatfile')
* ),
*/
'metadata.sources' => array(
array('type' => 'flatfile'),
),
/*
* Configure the datastore for SimpleSAMLphp.
*
* - 'phpsession': Limited datastore, which uses the PHP session.
* - 'memcache': Key-value datastore, based on memcache.
* - 'sql': SQL datastore, using PDO.
*
* The default datastore is 'phpsession'.
*
* (This option replaces the old 'session.handler'-option.)
*/
'store.type' => 'phpsession',
/*
* The DSN the sql datastore should connect to.
*
* See http://www.php.net/manual/en/pdo.drivers.php for the various
* syntaxes.
*/
'store.sql.dsn' => 'sqlite:/path/to/sqlitedatabase.sq3',
/*
* The username and password to use when connecting to the database.
*/
'store.sql.username' => null,
'store.sql.password' => null,
/*
* The prefix we should use on our tables.
*/
'store.sql.prefix' => 'SimpleSAMLphp',
/*
* Configuration for the 'memcache' session store. This allows you to store
* multiple redundant copies of sessions on different memcache servers.
*
* 'memcache_store.servers' is an array of server groups. Every data
* item will be mirrored in every server group.
*
* Each server group is an array of servers. The data items will be
* load-balanced between all servers in each server group.
*
* Each server is an array of parameters for the server. The following
* options are available:
* - 'hostname': This is the hostname or ip address where the
* memcache server runs. This is the only required option.
* - 'port': This is the port number of the memcache server. If this
* option isn't set, then we will use the 'memcache.default_port'
* ini setting. This is 11211 by default.
* - 'weight': This sets the weight of this server in this server
* group. http://php.net/manual/en/function.Memcache-addServer.php
* contains more information about the weight option.
* - 'timeout': The timeout for this server. By default, the timeout
* is 3 seconds.
*
* Example of redundant configuration with load balancing:
* This configuration makes it possible to lose both servers in the
* a-group or both servers in the b-group without losing any sessions.
* Note that sessions will be lost if one server is lost from both the
* a-group and the b-group.
*
* 'memcache_store.servers' => array(
* array(
* array('hostname' => 'mc_a1'),
* array('hostname' => 'mc_a2'),
* ),
* array(
* array('hostname' => 'mc_b1'),
* array('hostname' => 'mc_b2'),
* ),
* ),
*
* Example of simple configuration with only one memcache server,
* running on the same computer as the web server:
* Note that all sessions will be lost if the memcache server crashes.
*
* 'memcache_store.servers' => array(
* array(
* array('hostname' => 'localhost'),
* ),
* ),
*
*/
'memcache_store.servers' => array(
array(
array('hostname' => 'localhost'),
),
),
/*
* This value allows you to set a prefix for memcache-keys. The default
* for this value is 'simpleSAMLphp', which is fine in most cases.
*
* When running multiple instances of SSP on the same host, and more
* than one instance is using memcache, you probably want to assign
* a unique value per instance to this setting to avoid data collision.
*/
'memcache_store.prefix' => null,
/*
* This value is the duration data should be stored in memcache. Data
* will be dropped from the memcache servers when this time expires.
* The time will be reset every time the data is written to the
* memcache servers.
*
* This value should always be larger than the 'session.duration'
* option. Not doing this may result in the session being deleted from
* the memcache servers while it is still in use.
*
* Set this value to 0 if you don't want data to expire.
*
* Note: The oldest data will always be deleted if the memcache server
* runs out of storage space.
*/
'memcache_store.expires' => 36 * (60 * 60), // 36 hours.
/*
* Should signing of generated metadata be enabled by default.
*
* Metadata signing can also be enabled for a individual SP or IdP by setting the
* same option in the metadata for the SP or IdP.
*/
'metadata.sign.enable' => false,
/*
* The default key & certificate which should be used to sign generated metadata. These
* are files stored in the cert dir.
* These values can be overridden by the options with the same names in the SP or
* IdP metadata.
*
* If these aren't specified here or in the metadata for the SP or IdP, then
* the 'certificate' and 'privatekey' option in the metadata will be used.
* if those aren't set, signing of metadata will fail.
*/
'metadata.sign.privatekey' => 'example.org.pem',
'metadata.sign.privatekey_pass' => null,
'metadata.sign.certificate' => 'example.org.crt',
/*
* Proxy to use for retrieving URLs.
*
* Example:
* 'proxy' => 'tcp://proxy.example.com:5100'
*/
'proxy' => null,
/*
* Array of domains that are allowed when generating links or redirections
* to URLs. SimpleSAMLphp will use this option to determine whether to
* to consider a given URL valid or not, but you should always validate
* URLs obtained from the input on your own (i.e. ReturnTo or RelayState
* parameters obtained from the $_REQUEST array).
*
* SimpleSAMLphp will automatically add your own domain (either by checking
* it dynamically, or by using the domain defined in the 'baseurlpath'
* directive, the latter having precedence) to the list of trusted domains,
* in case this option is NOT set to NULL. In that case, you are explicitly
* telling SimpleSAMLphp to verify URLs.
*
* Set to an empty array to disallow ALL redirections or links pointing to
* an external URL other than your own domain. This is the default behaviour.
*
* Set to NULL to disable checking of URLs. DO NOT DO THIS UNLESS YOU KNOW
* WHAT YOU ARE DOING!
*
* Example:
* 'trusted.url.domains' => array('sp.example.com', 'app.example.com'),
*/
'trusted.url.domains' => NULL,
);
@@ -1,31 +0,0 @@
<?php
$metadata['__DYNAMIC:1__'] = [
/*
* The hostname for this IdP. This makes it possible to run multiple
* IdPs from the same configuration. '__DEFAULT__' means that this one
* should be used by default.
*/
'host' => '__DEFAULT__',
/*
* The private key and certificate to use when signing responses.
* These are stored in the cert-directory.
*/
'privatekey' => 'example.org.pem',
'certificate' => 'example.org.crt',
'signature.privatekey' => 'example.org.pem',
'signature.certificate' => 'example.org.crt',
/*
* The authentication source which should be used to authenticate the
* user. This must match one of the entries in config/authsources.php.
*/
'auth' => 'ldap',
'attributes.NameFormat' => 'urn:oasis:names:tc:SAML:2.0:attrname-format:uri',
'authproc' => [
// Convert LDAP names to oids.
100 => ['class' => 'core:AttributeMap', 'name2oid'],
],
];
@@ -1,39 +0,0 @@
<?php
$metadata['https://nextcloud.local/index.php/apps/user_saml/saml/metadata'] = array (
'entityid' => 'https://nextcloud.local/index.php/apps/user_saml/saml/metadata',
'contacts' =>
array (
),
'metadata-set' => 'saml20-sp-remote',
'expire' => 2212072296,
'AssertionConsumerService' =>
array (
0 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
'Location' => 'https://nextcloud.local/index.php/apps/user_saml/saml/acs',
'index' => 1,
),
),
'SingleLogoutService' =>
array (
0 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://nextcloud.local/index.php/apps/user_saml/saml/sls',
),
),
'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified',
'keys' =>
array (
0 =>
array (
'encryption' => false,
'signing' => true,
'type' => 'X509Certificate',
'X509Certificate' => 'MIIEazCCAtOgAwIBAgIUXZLzr3z5Rd+YJDgaXfbISQXSkXcwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xOTA3MDMxMjA3MjJaFw0yOTA3MDIxMjA3MjJaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCySq3L3jGZI78Q21NtKWKSY8uw7ts+Z7yUwT/Ot0l0NSTefZhhzh/eIg/ISq9VoLws0HYdHD4EYGVWOCUW6VHnDLhoKfXgyaWxXd4z2XgzmBdVThuN8uoFw9IoHvEPCm+OH9nviKsF0uX2+N6utNc1dmW5lY9+b0Vts+yckXk7QhBW+06FsfC6J0jRJmaQJi3D8MFrhER5SUEKZrSL5pRqnL6iyoINbUgZs8VvaHKBmh+l4+L0z4lu8ZZSiHCYGqxokXgCAlDzChxnsEnGi+kbyEblkUkzPS5Mu3di+o9DTUtJ5DDT8og9yVfIlPR3iIBvnuqHp03SQpndn6fxdORISuP0iBiCeTiwr3eM/lNqeA0KPN6Xx8kxGrikqXIOpFv0aSM2W0EnPUhOSfymnF7doFWhbFvYk9IuaiTuIHXZvsQBJk5Ektid4GVmtMf84pZNVgfv2Sfg5JRme0FI+mV3nVUhNoZj6e5Z8FYp4RIGZVAR8i4vdrey2mp2lfyQbKsCAwEAAaNTMFEwHQYDVR0OBBYEFGW70fG73HidEnhm12J6ggYm4TeCMB8GA1UdIwQYMBaAFGW70fG73HidEnhm12J6ggYm4TeCMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggGBACLbjoNIdG5oUVmkIFwx2RvLR3Xax9TkHGB+afAWeYX2HDMKnMMZTO98jeJKUQFJTiiUNJ33E9XHCQvg6nXCRAJesbSIikuRan+80TFeAmbb4EJqqI1ZAmvhQzZ7OhtLHRlnrqb80x1Av5GseiPXeG3KHv1rkasqzHEhxhJWY5llXSNe2rINNz/n1LFD1eorNzI8FFiW3d0zAB2NelEcWp1UgHeluVDrLIMVdOlmmN5XQpMAMgoAd8RgYpdcsZ/s4gDK1kotXH8lmhI238TP7Wl3n5FrxP8cSui5dIGMPgzr3jR+0pqfnn7BJhIk+mPbl8hDgsHOuSK0wMQ3C7qQeiCUtha4O5sPIAQqwtvQDDdR2tc58or9ui3s1NtsiU5Eb+ZBKSPRsPfd4yqcFG5IFzUTZ2EM+mw2GOMBegoDpbqBUiSHdgD0lNrTYrSCDw3DDoAVykPPv1nTXAdy+O0VX07RJCBiLXeDWyaJypf92gqa5ejgjFw+wGnPQ/ibujlCrQ==',
),
),
'validate.authnrequest' => false,
'saml20.sign.assertion' => false,
);
-106
View File
@@ -1,106 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="refresh" content="1" />
<meta charset="utf-8">
<style>
:root {
--font-color: #333;
--background-color: #fff;
}
@media (prefers-color-scheme: dark) {
:root {
--font-color: #eee;
--background-color: #1a1a1a;
}
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
margin: auto;
max-width: 800px;
color: var(--font-color);
background-color: var(--background-color);
}
.lds-ellipsis {
display: inline-block;
position: relative;
width: 80px;
height: 80px;
}
.lds-ellipsis div {
position: absolute;
top: 33px;
width: 13px;
height: 13px;
border-radius: 50%;
background: var(--font-color);
animation-timing-function: cubic-bezier(0, 1, 1, 0);
}
.lds-ellipsis div:nth-child(1) {
left: 8px;
animation: lds-ellipsis1 0.6s infinite;
}
.lds-ellipsis div:nth-child(2) {
left: 8px;
animation: lds-ellipsis2 0.6s infinite;
}
.lds-ellipsis div:nth-child(3) {
left: 32px;
animation: lds-ellipsis2 0.6s infinite;
}
.lds-ellipsis div:nth-child(4) {
left: 56px;
animation: lds-ellipsis3 0.6s infinite;
}
@keyframes lds-ellipsis1 {
0% {
transform: scale(0);
}
100% {
transform: scale(1);
}
}
@keyframes lds-ellipsis3 {
0% {
transform: scale(1);
}
100% {
transform: scale(0);
}
}
@keyframes lds-ellipsis2 {
0% {
transform: translate(0, 0);
}
100% {
transform: translate(24px, 0);
}
}
</style>
</head>
<body>
<h1>Installing container</h1>
<p>Please wait until the server is ready. This page will redirect you to the login once done.</p>
<h2>Log:</h2>
<div class="lds-ellipsis">
<div></div>
<div></div>
<div></div>
<div></div>
</div>
<pre>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 331 KiB

@@ -1,5 +0,0 @@
Welcome to your Nextcloud account!
This is just an example file for developers and git users.
The packaged and released versions will come with better examples.
-3
View File
@@ -1,3 +0,0 @@
FROM elasticsearch:7.17.25
RUN bin/elasticsearch-plugin install --batch ingest-attachment
-9
View File
@@ -1,9 +0,0 @@
FROM quay.io/keycloak/keycloak:26.4
RUN mkdir -p /opt/keycloak/data/import
ADD keycloak/Example-realm.json /opt/keycloak/data/import/Example-realm.json
ADD keycloak/prepare.sh /opt/keycloak/bin/custom-kc.sh
ENTRYPOINT ["/opt/keycloak/bin/custom-kc.sh"]
File diff suppressed because it is too large Load Diff
-26
View File
@@ -1,26 +0,0 @@
#!/bin/bash
KEYCLOAK_REALM_CONFIG="/opt/keycloak/data/import/Example-realm.json"
PROTOCOL="${PROTOCOL:-http}"
NEXTCLOUD_URL=${PROTOCOL}://${NEXTCLOUD_URL:-nextcloud}${DOMAIN_SUFFIX}
KEYCLOAK_URL=${PROTOCOL}://${KEYCLOAK_URL:-keycloak}${DOMAIN_SUFFIX}
if [ -f "$KEYCLOAK_REALM_CONFIG" ]; then
echo "Preparing Keycloak realm configuration..."
echo "Using NEXTCLOUD_URL: ${NEXTCLOUD_URL}"
echo "Using KEYCLOAK_URL: ${KEYCLOAK_URL}"
# Replace placeholder with actual NEXTCLOUD_URL
sed -i.bak "s|http://nextcloud\\.local|${NEXTCLOUD_URL//./\\.}|g" "$KEYCLOAK_REALM_CONFIG"
sed -i.bak "s|http://keycloak\\.local|${KEYCLOAK_URL//./\\.}|g" "$KEYCLOAK_REALM_CONFIG"
rm -f "${KEYCLOAK_REALM_CONFIG}.bak"
cat "$KEYCLOAK_REALM_CONFIG"
echo "Realm configuration prepared."
else
echo "Realm configuration file not found: $KEYCLOAK_REALM_CONFIG"
fi
exec /opt/keycloak/bin/kc.sh "$@"
-6
View File
@@ -1,6 +0,0 @@
FROM osixia/openldap:latest
ENV LDAP_DOMAIN="planetexpress.com"
ENV LDAP_BASE_DN="dc=planetexpress,dc=com"
COPY ./ldap/seed /container/service/slapd/assets/config/bootstrap/ldif/custom
-11
View File
@@ -1,11 +0,0 @@
dn: ou=people,dc=planetexpress,dc=com
objectClass: top
objectClass: organizationalUnit
description: Planet Express crew
ou: people
dn: ou=groups,dc=planetexpress,dc=com
objectClass: top
objectClass: organizationalUnit
description: Planet Express Groups
ou: groups

Some files were not shown because too many files have changed in this diff Show More