├── .github ├── dependabot.yml └── workflows │ ├── build.yml │ └── sync-readme.yml ├── Dockerfile ├── LICENSE ├── README.md ├── action.yml ├── build.bash ├── composer.bash ├── entrypoint ├── db-init │ └── application │ │ └── clicommands │ │ └── DbCommand.php ├── go.mod ├── go.sum └── main.go ├── get-mods.sh ├── mktags.bash ├── php.ini └── platforms.txt /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: gomod 4 | directory: "/entrypoint" 5 | schedule: 6 | interval: daily 7 | time: "10:00" 8 | open-pull-requests-limit: 10 9 | - package-ecosystem: docker 10 | directory: "/" 11 | schedule: 12 | interval: daily 13 | time: "10:00" 14 | open-pull-requests-limit: 10 15 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: {} 8 | 9 | jobs: 10 | build: 11 | name: build 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - name: Checkout HEAD 16 | uses: actions/checkout@v1 17 | 18 | - shell: bash 19 | run: sudo apt-get update 20 | 21 | - name: QEMU 22 | run: sudo apt-get install -y qemu-user-static binfmt-support 23 | 24 | - run: docker buildx create --use 25 | 26 | - name: Icinga Web 2 27 | run: git clone https://github.com/Icinga/icingaweb2.git 28 | 29 | - name: Build 30 | run: ./build.bash ./icingaweb2 release all 31 | -------------------------------------------------------------------------------- /.github/workflows/sync-readme.yml: -------------------------------------------------------------------------------- 1 | name: Sync README.md to Docker Hub 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | sync: 10 | name: Sync README 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Checkout HEAD 15 | uses: actions/checkout@v1 16 | 17 | - name: Sync README 18 | uses: ms-jpq/sync-dockerhub-readme@e2991ea1ba48832e73555cdbd5b82f5a2e91ee9b # v1 19 | with: 20 | username: icingaadmin 21 | password: '${{ secrets.DOCKER_HUB_PERSONAL_TOKEN }}' 22 | repository: icinga/icingaweb2 23 | readme: ./README.md 24 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Icinga Web 2 Docker image | (c) 2020 Icinga GmbH | GPLv2+ 2 | 3 | FROM golang:bookworm as entrypoint 4 | 5 | COPY entrypoint /entrypoint 6 | 7 | WORKDIR /entrypoint 8 | RUN ["go", "build", "."] 9 | 10 | 11 | FROM composer:lts as usr-share 12 | SHELL ["/bin/bash", "-exo", "pipefail", "-c"] 13 | 14 | RUN ["mkdir", "/usr-share"] 15 | WORKDIR /usr-share 16 | 17 | ARG BUILD_MODE 18 | COPY get-mods.sh / 19 | RUN /get-mods.sh $BUILD_MODE 20 | 21 | COPY composer.bash / 22 | RUN ["/composer.bash"] 23 | 24 | COPY --from=icingaweb2-git . /icingaweb2-src/.git 25 | RUN git -C /icingaweb2-src archive --prefix=icingaweb2/ HEAD |tar -x 26 | 27 | 28 | FROM debian:bookworm-slim 29 | 30 | RUN ["bash", "-exo", "pipefail", "-c", "export DEBIAN_FRONTEND=noninteractive; apt-get update; apt-get upgrade -y; apt-get install --no-install-{recommends,suggests} -y apache2 ca-certificates libapache2-mod-php8.2 libldap-common locales-all php-{imagick,redis} php8.2-{bcmath,bz2,common,curl,dba,enchant,gd,gmp,imap,interbase,intl,ldap,mbstring,mysql,odbc,opcache,pgsql,pspell,readline,snmp,soap,sqlite3,sybase,tidy,xml,xmlrpc,xsl,zip}; apt-get clean; rm -vrf /var/lib/apt/lists/*"] 31 | 32 | COPY --from=entrypoint /entrypoint/entrypoint /entrypoint 33 | COPY entrypoint/db-init /entrypoint-db-init 34 | 35 | RUN ["a2enmod", "rewrite"] 36 | RUN ["ln", "-vsf", "/dev/stdout", "/var/log/apache2/access.log"] 37 | RUN ["ln", "-vsf", "/dev/stderr", "/var/log/apache2/error.log"] 38 | RUN ["ln", "-vsf", "/dev/stdout", "/var/log/apache2/other_vhosts_access.log"] 39 | 40 | RUN ["perl", "-pi", "-e", "if (/Listen/) { s/80/8080/ }", "/etc/apache2/ports.conf"] 41 | RUN ["perl", "-pi", "-e", "if (/VirtualHost/) { s/80/8080/ }", "/etc/apache2/sites-available/000-default.conf"] 42 | EXPOSE 8080 43 | 44 | RUN ["chmod", "-R", "u=rwX,go=rX", "/entrypoint-db-init"] 45 | RUN ["chmod", "o+x", "/var/log/apache2"] 46 | RUN ["chown", "www-data:www-data", "/var/run/apache2"] 47 | RUN ["ln", "-vs", "/data/etc/icingaweb2", "/etc/icingaweb2"] 48 | RUN ["ln", "-vs", "/data/var/lib/icingaweb2", "/var/lib/icingaweb2"] 49 | RUN ["install", "-o", "www-data", "-g", "www-data", "-d", "/data"] 50 | 51 | ENTRYPOINT ["/entrypoint"] 52 | 53 | COPY --from=usr-share /usr-share/. /usr/share/ 54 | COPY php.ini /etc/php/8.2/cli/conf.d/99-docker.ini 55 | 56 | RUN ["ln", "-vs", "/usr/share/icingaweb2/bin/icingacli", "/usr/local/bin/"] 57 | RUN ["icingacli", "setup", "config", "webserver", "apache", "--path=/", "--file=/etc/apache2/conf-enabled/icingaweb2.conf"] 58 | RUN echo 'SetEnvIf X-REMOTE-USER "(.*)" REMOTE_USER=$0' > /etc/apache2/conf-enabled/allow-remote-user.conf 59 | 60 | USER www-data 61 | ENV ICINGAWEB_OFFICIAL_DOCKER_IMAGE 1 62 | CMD ["bash", "-eo", "pipefail", "-c", ". /etc/apache2/envvars; exec apache2 -DFOREGROUND"] 63 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Icinga Web 2 - Docker image 4 | 5 | This image integrates [Icinga Web 2] into your [Docker] environment. 6 | 7 | ## Usage 8 | 9 | ```bash 10 | docker run --rm -d \ 11 | -p 8080:8080 \ 12 | -v icingaweb:/data \ 13 | -e icingaweb.enabledModules=icingadb \ 14 | -e icingaweb.passwords.icingaweb2.icingaadmin=123456 \ 15 | -e icingaweb.authentication.icingaweb2.backend=db \ 16 | -e icingaweb.authentication.icingaweb2.resource=icingaweb_db \ 17 | -e icingaweb.config.global.config_backend=db \ 18 | -e icingaweb.config.global.config_resource=icingaweb_db \ 19 | -e icingaweb.config.logging.log=php \ 20 | -e icingaweb.groups.icingaweb2.backend=db \ 21 | -e icingaweb.groups.icingaweb2.resource=icingaweb_db \ 22 | -e icingaweb.modules.icingadb.config.icingadb.resource=icingadb \ 23 | -e icingaweb.modules.icingadb.redis.redis1.host=2001:db8::192.0.2.18 \ 24 | -e icingaweb.modules.icingadb.redis.redis1.port=6379 \ 25 | -e icingaweb.modules.icingadb.commandtransports.icinga2.transport=api \ 26 | -e icingaweb.modules.icingadb.commandtransports.icinga2.host=2001:db8::192.0.2.9 \ 27 | -e icingaweb.modules.icingadb.commandtransports.icinga2.username=root \ 28 | -e icingaweb.modules.icingadb.commandtransports.icinga2.password=123456 \ 29 | -e icingaweb.resources.icingaweb_db.type=db \ 30 | -e icingaweb.resources.icingaweb_db.db=mysql \ 31 | -e icingaweb.resources.icingaweb_db.host=2001:db8::192.0.2.13 \ 32 | -e icingaweb.resources.icingaweb_db.dbname=icingaweb \ 33 | -e icingaweb.resources.icingaweb_db.username=icingaweb \ 34 | -e icingaweb.resources.icingaweb_db.password=123456 \ 35 | -e icingaweb.resources.icingaweb_db.charset=utf8mb4 \ 36 | -e icingaweb.resources.icingadb.type=db \ 37 | -e icingaweb.resources.icingadb.db=mysql \ 38 | -e icingaweb.resources.icingadb.host=2001:db8::192.0.2.113 \ 39 | -e icingaweb.resources.icingadb.dbname=icingadb \ 40 | -e icingaweb.resources.icingadb.username=icingaweb \ 41 | -e icingaweb.resources.icingadb.password=123456 \ 42 | -e icingaweb.resources.icingadb.charset=utf8mb4 \ 43 | -e icingaweb.roles.Administrators.users=icingaadmin \ 44 | -e icingaweb.roles.Administrators.permissions='*' \ 45 | -e icingaweb.roles.Administrators.groups=Administrators \ 46 | icinga/icingaweb2 47 | ``` 48 | 49 | The container listens on port 8080 and expects a volume on `/data`. 50 | To configure it, do one of the following: 51 | 52 | * Run the setup wizard as usual. 53 | It will store all configuration in `/data/etc/icingaweb2`. 54 | Hint: `docker run --rm -v icingaweb:/data icinga/icingaweb2 icingacli setup token create` 55 | * Provide configuration files in `/data/etc/icingaweb2` by yourself. 56 | Consult the [Icinga Web 2 configuration documentation] 57 | on which .ini files there are. 58 | * Provide environment variables as shown above. 59 | 60 | ### Environment variables 61 | 62 | `icingaweb.enabledModules` is a comma-separated set 63 | of the only modules to be enabled. 64 | 65 | Variables like `icingaweb.passwords.backend.user=pass` 66 | ensures a user "user" with the password "pass" to be present 67 | in the database authentication backend "backend". 68 | 69 | Variables like `icingaweb.dir.subdir.file.section.option=value` create .ini 70 | files like `/data/etc/icingaweb2/dir/subdir/file.ini` with content like this: 71 | 72 | ```ini 73 | [section] 74 | option = value 75 | ``` 76 | 77 | Consult the [Icinga Web 2 configuration documentation] 78 | on which .ini files there are. 79 | 80 | ### External authentication 81 | 82 | When using `icingaweb.authentication.autologin.backend: external`, the Username needs to be passed in the `X-Remote-User` header. 83 | 84 | ## Build it yourself 85 | 86 | ```bash 87 | git clone https://github.com/Icinga/icingaweb2.git 88 | #pushd icingaweb2 89 | #git checkout v2.9.0 90 | #popd 91 | 92 | ./build.bash ./icingaweb2 93 | ``` 94 | 95 | [Icinga Web 2]: https://github.com/Icinga/icingaweb2 96 | [Docker]: https://www.docker.com 97 | [Icinga Web 2 configuration documentation]: https://icinga.com/docs/icingaweb2/latest/doc/03-Configuration/ 98 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | # Icinga Web 2 Docker image | (c) 2020 Icinga GmbH | GPLv2+ 2 | 3 | name: Icinga Web 2 Docker image 4 | inputs: 5 | dockerhub-token: 6 | default: '' 7 | runs: 8 | using: composite 9 | steps: 10 | - uses: actions/checkout@v3 11 | 12 | - shell: bash 13 | run: sudo apt-get update 14 | 15 | - shell: bash 16 | run: sudo apt-get install -y qemu-user-static binfmt-support 17 | 18 | - shell: bash 19 | run: docker buildx create --use 20 | 21 | - if: inputs.dockerhub-token != '' 22 | env: 23 | PW: ${{ inputs.dockerhub-token }} 24 | shell: bash 25 | run: | 26 | docker login -u icingaadmin --password-stdin <<<"$PW" 27 | 28 | - if: github.event_name == 'release' 29 | shell: bash 30 | run: | 31 | '${{ github.action_path }}/build.bash' . release push "$(tr -d v <<<'${{ github.ref_name }}')" 32 | '${{ github.action_path }}/mktags.bash' '${{ github.ref_name }}' 33 | 34 | - if: github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' 35 | shell: bash 36 | run: | 37 | '${{ github.action_path }}/build.bash' . snapshot push "$(tr / - <<<'${{ github.ref_name }}')" 38 | 39 | - if: github.event_name != 'release' && github.event_name != 'workflow_dispatch' && github.event_name != 'schedule' 40 | shell: bash 41 | run: | 42 | '${{ github.action_path }}/build.bash' . snapshot all 43 | -------------------------------------------------------------------------------- /build.bash: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Icinga Web 2 Docker image | (c) 2020 Icinga GmbH | GPLv2+ 3 | set -exo pipefail 4 | 5 | IW2SRC="$1" 6 | export BUILD_MODE="${2:-release}" 7 | ACTION="${3:-local}" 8 | TAG="${4:-test}" 9 | 10 | if [ -z "$IW2SRC" ]; then 11 | cat <&2 12 | Usage: ${0} /icingaweb2/source/dir [release|snapshot [local|all|push [TAG]]] 13 | EOF 14 | 15 | false 16 | fi 17 | 18 | if ! docker version; then 19 | echo 'Docker not found' >&2 20 | false 21 | fi 22 | 23 | if ! docker buildx version; then 24 | echo '"docker buildx" not found (see https://docs.docker.com/buildx/working-with-buildx/ )' >&2 25 | false 26 | fi 27 | 28 | OUR_DIR="$(realpath "$(dirname "$0")")" 29 | COMMON_ARGS=(-t "icinga/icingaweb2:$TAG" --build-context "icingaweb2-git=$(realpath "$IW2SRC")/.git/" --build-arg "BUILD_MODE=$BUILD_MODE" "$OUR_DIR") 30 | BUILDX=(docker buildx build --platform "$(cat "${OUR_DIR}/platforms.txt")") 31 | 32 | case "$ACTION" in 33 | all) 34 | "${BUILDX[@]}" "${COMMON_ARGS[@]}" 35 | ;; 36 | push) 37 | "${BUILDX[@]}" --push "${COMMON_ARGS[@]}" 38 | ;; 39 | *) 40 | docker buildx build --load "${COMMON_ARGS[@]}" 41 | ;; 42 | esac 43 | -------------------------------------------------------------------------------- /composer.bash: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Icinga Web 2 Docker image | (c) 2020 Icinga GmbH | GPLv2+ 3 | set -exo pipefail 4 | 5 | for d in icingaweb2 icingaweb2/modules/*; do 6 | pushd "$d" 7 | 8 | if [ -e composer.json ]; then 9 | composer install --no-dev --ignore-platform-reqs 10 | fi 11 | 12 | popd 13 | done 14 | -------------------------------------------------------------------------------- /entrypoint/db-init/application/clicommands/DbCommand.php: -------------------------------------------------------------------------------- 1 | get('global', 'config_backend') === 'db') { 24 | $configResource = $config->get('global', 'config_resource'); 25 | 26 | if ($configResource !== null) { 27 | $resources[$configResource] = null; 28 | } 29 | } 30 | 31 | foreach (['authentication', 'groups'] as $file) { 32 | foreach (Config::app($file) as $backend) { 33 | if ($backend->backend === 'db') { 34 | $resource = $backend->resource; 35 | 36 | if ($resource !== null) { 37 | $resources[$resource] = null; 38 | } 39 | } 40 | } 41 | } 42 | 43 | ksort($resources); 44 | 45 | echo Json::encode(array_keys($resources)); 46 | } 47 | 48 | public function initializedAction() 49 | { 50 | echo (int) (array_search('icingaweb_group', $this->getDb()->conn->listTables(), true) !== false); 51 | } 52 | 53 | public function initAction() 54 | { 55 | $db = $this->getDb(); 56 | 57 | $db->conn->import( 58 | Config::module('setup') 59 | ->get('schema', 'path', Icinga::app()->getBaseDir('schema')) . "/{$db->type}.schema.sql" 60 | ); 61 | } 62 | 63 | public function userAction() 64 | { 65 | $username = $this->params->getRequired('name'); 66 | $password = getenv('PASSWORD'); 67 | $backend = UserBackend::create($this->params->getRequired('backend')); 68 | 69 | if ($backend->select()->where('user_name', $username)->count() > 0) { 70 | $backend->update('user', ['password' => $password], Filter::where('user_name', $username)); 71 | } else { 72 | $backend->insert('user', [ 73 | 'user_name' => $username, 74 | 'password' => $password, 75 | 'is_active' => 1 76 | ]); 77 | } 78 | } 79 | 80 | /** 81 | * @return \stdClass 82 | */ 83 | protected function getDb() 84 | { 85 | $config = ResourceFactory::getResourceConfig($this->params->getRequired('resource'))->toArray(); 86 | $type = isset($config['db']) ? $config['db'] : 'mysql'; 87 | 88 | if (! isset($config['port'])) { 89 | switch ($type) { 90 | case 'mysql': 91 | $config['port'] = 3306; 92 | break; 93 | case 'pgsql': 94 | $config['port'] = 5432; 95 | } 96 | } 97 | 98 | for ($i = 0; $i < 100; ++$i) { 99 | try { 100 | (new DbTool($config))->checkConnectivity(); 101 | break; 102 | } catch (PDOException $e) { 103 | fprintf( 104 | STDERR, "[%s] [docker_entrypoint:error] [pid %d] DOCKERE: Can't connect to database: %s\n", 105 | date('D M j H:i:s.u Y'), getmypid(), $e->getMessage() 106 | ); 107 | 108 | sleep(3); 109 | } 110 | } 111 | 112 | $db = new DbTool($config); 113 | $db->connectToDb(); 114 | 115 | return (object) [ 116 | 'conn' => $db, 117 | 'type' => $type 118 | ]; 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /entrypoint/go.mod: -------------------------------------------------------------------------------- 1 | module entrypoint 2 | 3 | go 1.14 4 | 5 | require ( 6 | github.com/go-ini/ini v1.67.0 7 | github.com/stretchr/testify v1.7.0 // indirect 8 | ) 9 | -------------------------------------------------------------------------------- /entrypoint/go.sum: -------------------------------------------------------------------------------- 1 | github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 2 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 3 | github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= 4 | github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= 5 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 6 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 7 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 8 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= 9 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 10 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 11 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 12 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= 13 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 14 | -------------------------------------------------------------------------------- /entrypoint/main.go: -------------------------------------------------------------------------------- 1 | // Icinga Web 2 Docker image | (c) 2020 Icinga GmbH | GPLv2+ 2 | 3 | package main 4 | 5 | import ( 6 | "bufio" 7 | "bytes" 8 | "encoding/json" 9 | "fmt" 10 | "github.com/go-ini/ini" 11 | "io/ioutil" 12 | "os" 13 | "os/exec" 14 | "path" 15 | "path/filepath" 16 | "strings" 17 | "syscall" 18 | "time" 19 | ) 20 | 21 | const confDir = "/data/etc/icingaweb2" 22 | const modsDir = "/usr/share/icingaweb2/modules" 23 | const dirMode = 0750 24 | 25 | var enModsDir = path.Join(confDir, "enabledModules") 26 | 27 | func main() { 28 | if err := entrypoint(); err != nil { 29 | logf("crit", "%s", err.Error()) 30 | os.Exit(1) 31 | } 32 | } 33 | 34 | func entrypoint() error { 35 | if len(os.Args) < 2 { 36 | logf("warn", "Nothing to do.") 37 | return nil 38 | } 39 | 40 | if os.Getpid() == 1 { 41 | logf("info", "Initializing /data as we're the init process") 42 | 43 | for _, dir := range []string{enModsDir, "/data/var/lib/icingaweb2"} { 44 | logf("debug", "Creating %#v", dir) 45 | if errMA := os.MkdirAll(dir, dirMode); errMA != nil { 46 | return errMA 47 | } 48 | } 49 | 50 | logf("debug", "Translating env vars to .ini config") 51 | 52 | cfgs := map[string]*ini.File{} 53 | var enabledModules map[string]struct{} = nil 54 | passwords := map[string]map[string]string{} 55 | 56 | EnvVars: 57 | for _, env := range os.Environ() { 58 | if kv := strings.SplitN(env, "=", 2); len(kv) == 2 { 59 | if strings.HasPrefix(kv[0], "icingaweb") { 60 | if kv[0] = strings.TrimPrefix(kv[0], "icingaweb"); len(kv[0]) > 0 { 61 | directive := strings.Split(kv[0][1:], kv[0][:1]) 62 | for _, component := range directive { 63 | if component == "" { 64 | continue EnvVars 65 | } 66 | } 67 | 68 | if len(directive) == 1 { 69 | if directive[0] == "enabledModules" { 70 | if enabledModules == nil { 71 | enabledModules = map[string]struct{}{} 72 | } 73 | 74 | for _, mod := range strings.Split(kv[1], ",") { 75 | if mod = strings.TrimSpace(mod); mod != "" { 76 | enabledModules[mod] = struct{}{} 77 | } 78 | } 79 | } 80 | } else if len(directive) >= 3 { 81 | if len(directive) == 3 && directive[0] == "passwords" { 82 | users, ok := passwords[directive[1]] 83 | if !ok { 84 | users = map[string]string{} 85 | passwords[directive[1]] = users 86 | } 87 | 88 | users[directive[2]] = kv[1] 89 | } else { 90 | file := path.Join(directive[:len(directive)-2]...) 91 | cfg, ok := cfgs[file] 92 | 93 | if !ok { 94 | cfg = ini.Empty() 95 | cfgs[file] = cfg 96 | } 97 | 98 | _, errNK := cfg.Section(directive[len(directive)-2]).NewKey( 99 | directive[len(directive)-1], kv[1], 100 | ) 101 | if errNK != nil { 102 | return errNK 103 | } 104 | } 105 | } 106 | } 107 | } 108 | } 109 | } 110 | 111 | for file, cfg := range cfgs { 112 | file = path.Join(confDir, file+".ini") 113 | logf("trace1", "Writing %#v", file) 114 | 115 | if errMA := os.MkdirAll(path.Dir(file), dirMode); errMA != nil { 116 | return errMA 117 | } 118 | 119 | if errST := cfg.SaveTo(file); errST != nil { 120 | return errST 121 | } 122 | } 123 | 124 | if enabledModules != nil { 125 | logf("debug", "Enabling/disabling modules") 126 | 127 | mods, errRD := ioutil.ReadDir(enModsDir) 128 | if errRD != nil { 129 | return errRD 130 | } 131 | 132 | for _, mod := range mods { 133 | mod := mod.Name() 134 | if _, ok := enabledModules[mod]; ok { 135 | delete(enabledModules, mod) 136 | } else { 137 | logf("trace1", "Disabling module %#v", mod) 138 | if errRm := os.Remove(path.Join(enModsDir, mod)); errRm != nil { 139 | return errRm 140 | } 141 | } 142 | } 143 | 144 | for mod := range enabledModules { 145 | logf("trace1", "Enabling module %#v", mod) 146 | 147 | errSl := os.Symlink(path.Join(modsDir, mod), path.Join(enModsDir, mod)) 148 | if errSl != nil { 149 | return errSl 150 | } 151 | } 152 | } 153 | 154 | if errID := initDb(passwords); errID != nil { 155 | return errID 156 | } 157 | } 158 | 159 | path := os.Args[1] 160 | if filepath.Base(path) == path { 161 | logf("info", "Looking up %#v in $PATH", path) 162 | 163 | abs, errLP := exec.LookPath(path) 164 | if errLP != nil { 165 | return errLP 166 | } 167 | 168 | path = abs 169 | } 170 | 171 | logf("info", "Running %#v", path) 172 | return syscall.Exec(path, os.Args[1:], os.Environ()) 173 | } 174 | 175 | func initDb(passwords map[string]map[string]string) error { 176 | logf("info", "Checking database resources used as backends") 177 | 178 | { 179 | enMod := path.Join(enModsDir, "dockerentrypoint") 180 | if errSl := os.Symlink("/entrypoint-db-init", enMod); errSl != nil { 181 | return errSl 182 | } 183 | 184 | defer os.Remove(enMod) 185 | } 186 | 187 | { 188 | enMod := path.Join(enModsDir, "setup") 189 | 190 | errSl := os.Symlink(path.Join(modsDir, "setup"), enMod) 191 | if errSl != nil { 192 | if le, ok := errSl.(*os.LinkError); !ok || !os.IsNotExist(le.Err) { 193 | return errSl 194 | } 195 | } 196 | 197 | if errSl == nil { 198 | defer os.Remove(enMod) 199 | } 200 | } 201 | 202 | var resources []string 203 | if errIJ := icingacliJson(&resources, "dockerentrypoint", "db", "backends"); errIJ != nil { 204 | return errIJ 205 | } 206 | 207 | for _, resource := range resources { 208 | logf("debug", "Checking database resource %#v", resource) 209 | 210 | var initialized uint8 211 | 212 | errIJ := icingacliJson(&initialized, "dockerentrypoint", "db", "initialized", "--resource="+resource) 213 | if errIJ != nil { 214 | return errIJ 215 | } 216 | 217 | if initialized == 0 { 218 | logf("debug", "Importing schema into database resource %#v", resource) 219 | 220 | cmd := exec.Command("icingacli", "dockerentrypoint", "db", "init", "--resource="+resource) 221 | cmd.Stdout = os.Stderr 222 | cmd.Stderr = os.Stderr 223 | 224 | if errRn := cmd.Run(); errRn != nil { 225 | return errRn 226 | } 227 | } 228 | } 229 | 230 | for backend, users := range passwords { 231 | for name, password := range users { 232 | logf( 233 | "info", `Ensuring database authentication backend %#v to have a user %#v with the password "***"`, 234 | backend, name, 235 | ) 236 | 237 | cmd := exec.Command("icingacli", "dockerentrypoint", "db", "user", "--backend="+backend, "--name="+name) 238 | cmd.Stdout = os.Stderr 239 | cmd.Stderr = os.Stderr 240 | cmd.Env = append(os.Environ(), "PASSWORD="+password) 241 | 242 | if errRn := cmd.Run(); errRn != nil { 243 | return errRn 244 | } 245 | } 246 | } 247 | 248 | return nil 249 | } 250 | 251 | func icingacliJson(v interface{}, arg ...string) error { 252 | cmd := exec.Command("icingacli", arg...) 253 | var out bytes.Buffer 254 | 255 | cmd.Stdout = &out 256 | cmd.Stderr = os.Stderr 257 | 258 | if errRn := cmd.Run(); errRn != nil { 259 | return errRn 260 | } 261 | 262 | return json.Unmarshal(out.Bytes(), v) 263 | } 264 | 265 | var out = bufio.NewWriter(os.Stderr) 266 | 267 | func logf(severity, format string, a ...interface{}) { 268 | _, _ = fmt.Fprintf(out, "[%s] ", time.Now().Format("Mon Jan 2 15:04:05.999999999 2006")) 269 | _, _ = fmt.Fprintf(out, "[docker_entrypoint:%s] [pid %d] DOCKERE: ", severity, os.Getpid()) 270 | _, _ = fmt.Fprintf(out, format, a...) 271 | 272 | _, _ = fmt.Fprintln(out) 273 | _ = out.Flush() 274 | } 275 | -------------------------------------------------------------------------------- /get-mods.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Icinga Web 2 Docker image | (c) 2020 Icinga GmbH | GPLv2+ 3 | set -exo pipefail 4 | 5 | usage() { 6 | cat >&2 < 8 | 9 | release: download the latest release version of all external modules 10 | snapshot: download a snapshot/development version of all external modules 11 | EOF 12 | exit 1 13 | } 14 | 15 | get_first_line() { 16 | head -n 1 17 | cat >/dev/null 18 | } 19 | 20 | get_tag () { 21 | if git -C dockerweb2-temp tag |grep -vFe - >/dev/null; then # ex. RCs 22 | git -C dockerweb2-temp tag --sort=-version:refname |grep -vFe - |get_first_line 23 | else 24 | git -C dockerweb2-temp tag --sort=-version:refname |grep -Fe - |get_first_line 25 | fi 26 | } 27 | 28 | get_special () { 29 | if [ ! -e "$2" ]; then 30 | rm -rf dockerweb2-temp 31 | git clone --bare "https://github.com/Icinga/${1}.git" dockerweb2-temp 32 | 33 | case "$MODE" in 34 | release) 35 | REF="$(get_tag)" 36 | ;; 37 | snapshot) 38 | case "$2" in 39 | icingaweb2/modules/incubator) 40 | # "HINT: Do NOT install the GIT master, it will not work!" 41 | # https://github.com/Icinga/icingaweb2-module-incubator/blob/master/README.md 42 | REF="$(get_tag)" 43 | ;; 44 | icinga-php/*) 45 | # Special branch that contains vendored dependencies missing in HEAD 46 | REF=snapshot/nightly 47 | ;; 48 | *) 49 | REF=HEAD 50 | ;; 51 | esac 52 | ;; 53 | esac 54 | 55 | git -C dockerweb2-temp archive "--prefix=${2}/" "$REF" |tar -x 56 | rm -rf dockerweb2-temp 57 | fi 58 | } 59 | 60 | get_lib () { 61 | get_special "icinga-php-$1" "icinga-php/$2" 62 | } 63 | 64 | get_altname () { 65 | get_special "$1" "icingaweb2/modules/$2" 66 | } 67 | 68 | get_mod () { 69 | get_altname "icingaweb2-module-$1" "$1" 70 | } 71 | 72 | MODE="$1" 73 | case "$MODE" in 74 | release|snapshot) ;; 75 | *) usage ;; 76 | esac 77 | 78 | get_lib library ipl 79 | get_lib thirdparty vendor 80 | get_mod audit 81 | get_mod aws 82 | get_mod businessprocess 83 | get_mod cube 84 | get_mod director 85 | get_mod fileshipper 86 | get_mod graphite 87 | get_altname icingadb-web icingadb 88 | get_mod idoreports 89 | get_mod incubator 90 | get_altname icinga-kubernetes-web kubernetes 91 | get_special L10n icinga-L10n 92 | get_altname icinga-notifications-web notifications 93 | get_mod pdfexport 94 | get_mod reporting 95 | get_mod vspheredb 96 | get_mod x509 97 | -------------------------------------------------------------------------------- /mktags.bash: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Icinga Web 2 Docker image | (c) 2023 Icinga GmbH | GPLv2+ 3 | set -exo pipefail 4 | 5 | if [[ "$1" =~ ^v((([0-9]+).([0-9]+)).[0-9]+)$ ]]; then 6 | XYZ="${BASH_REMATCH[1]}" 7 | XY="${BASH_REMATCH[2]}" 8 | X="${BASH_REMATCH[3]}" 9 | Y="${BASH_REMATCH[4]}" 10 | 11 | BUILDX=(docker buildx build --platform "$(cat "$(realpath "$(dirname "$0")")/platforms.txt")" --push) 12 | cd "$(mktemp -d)" 13 | 14 | echo "FROM icinga/icingaweb2:$XYZ" >Dockerfile 15 | 16 | "${BUILDX[@]}" -t "icinga/icingaweb2:$XY" . 17 | 18 | NEXT="${X}.$(($Y+1))" 19 | 20 | case "$(curl --head -sSLo /dev/null -w '%{http_code}' "https://hub.docker.com/v2/namespaces/icinga/repositories/icingaweb2/tags/$NEXT")" in 21 | 200) 22 | ;; 23 | 404) 24 | "${BUILDX[@]}" -t "icinga/icingaweb2:$X" . 25 | "${BUILDX[@]}" -t icinga/icingaweb2 . 26 | ;; 27 | *) 28 | echo "Can't check for icinga/icingaweb2:$NEXT" 29 | false 30 | ;; 31 | esac 32 | fi 33 | -------------------------------------------------------------------------------- /php.ini: -------------------------------------------------------------------------------- 1 | [PHP] 2 | include_path = ".:/usr/share/php:/usr/share/icingaweb2/library:/usr/share/icingaweb2/library/vendor" 3 | -------------------------------------------------------------------------------- /platforms.txt: -------------------------------------------------------------------------------- 1 | linux/amd64,linux/arm64/v8 2 | --------------------------------------------------------------------------------