├── .github └── workflows │ └── docker-hub.yml ├── .gitignore ├── Dockerfile ├── LICENSE.txt ├── README.md ├── docker-compose.yml ├── env ├── db.env.example └── run.env.example ├── files ├── akaunting-php-fpm-nginx-supervisord.sh ├── akaunting-php-fpm-nginx.sh ├── akaunting-php-fpm.sh ├── akaunting-v.sh ├── akaunting.sh ├── html │ └── .env ├── php.ini └── supervisord.conf ├── fpm-alpine-docker-compose.yml ├── fpm-alpine-nginx-composer-docker-compose.yml ├── fpm-alpine-nginx-composer-supervisor-docker-compose.yml ├── fpm-alpine-nginx-composer-supervisor.Dockerfile ├── fpm-alpine-nginx-composer.Dockerfile ├── fpm-alpine-nginx-docker-compose.yml ├── fpm-alpine-nginx.Dockerfile ├── fpm-alpine.Dockerfile ├── fpm-docker-compose.yml ├── fpm.Dockerfile ├── nginx ├── nginx.conf └── templates │ └── default.conf.template ├── v-docker-compose.yml └── v.Dockerfile /.github/workflows/docker-hub.yml: -------------------------------------------------------------------------------- 1 | name: Publish Docker images 2 | 3 | on: 4 | schedule: 5 | - cron: '0 10 * * *' # everyday at 10am 6 | push: 7 | branches: 8 | - '**' 9 | pull_request: 10 | 11 | jobs: 12 | docker: 13 | runs-on: ubuntu-22.04 14 | strategy: 15 | matrix: 16 | image: ['', v, fpm, fpm-alpine, fpm-alpine-nginx, fpm-alpine-nginx-composer, fpm-alpine-nginx-composer-supervisor] 17 | include: 18 | - image: '' 19 | file: Dockerfile 20 | - image: fpm 21 | file: fpm.Dockerfile 22 | - image: v 23 | file: v.Dockerfile 24 | - image: fpm-alpine 25 | file: fpm-alpine.Dockerfile 26 | - image: fpm-alpine-nginx 27 | file: fpm-alpine-nginx.Dockerfile 28 | - image: fpm-alpine-nginx-composer 29 | file: fpm-alpine-nginx-composer.Dockerfile 30 | - image: fpm-alpine-nginx-composer-supervisor 31 | file: fpm-alpine-nginx-composer-supervisor.Dockerfile 32 | steps: 33 | - name: Checkout 34 | uses: actions/checkout@v3 35 | - name: Define tag name 36 | id: tag-name 37 | run: | 38 | if [ "${GITHUB_REF}" == "refs/heads/master" -a "${GITHUB_EVENT_NAME}" != "pull_request" ]; then 39 | curl -s https://api.github.com/repos/akaunting/akaunting/releases/latest \ 40 | | jq -r .tag_name | sed \ 41 | -e 's/^/::set-output name=tag::/' 42 | else 43 | echo -n "::set-output name=tag::" 44 | echo "$GITHUB_REF" | cut -d/ -f3- | tr '/' '_' 45 | fi 46 | - name: Define images tags 47 | id: image-tags 48 | run: | 49 | if [ "${GITHUB_REF}" == "refs/heads/master" -a "${GITHUB_EVENT_NAME}" != "pull_request" ]; then 50 | if [ -z ${{ matrix.image }} ]; then 51 | echo ${{ steps.tag-name.outputs.tag }} | sed \ 52 | -e 's/\(\(\([0-9]\+\)\.[0-9]\+\)\.[0-9]\+\)/\1,\2,\3,/' \ 53 | -e 's/\([^,]\+\),/akaunting\/akaunting:\1,/g' \ 54 | -e 's/^/::set-output name=tags::/' \ 55 | -e 's/$/akaunting\/akaunting:latest/' 56 | else 57 | echo ${{ steps.tag-name.outputs.tag }} | sed \ 58 | -e 's/\(\(\([0-9]\+\)\.[0-9]\+\)\.[0-9]\+\)/\1-${{ matrix.image }},\2-${{ matrix.image }},\3-${{ matrix.image }},/' \ 59 | -e 's/\([^,]\+\),/akaunting\/akaunting:\1,/g' \ 60 | -e 's/^/::set-output name=tags::/' 61 | fi 62 | else 63 | if [ -z ${{ matrix.image }} ]; then 64 | echo -n "::set-output name=tags::akaunting/akaunting:" 65 | echo "$GITHUB_REF" | cut -d/ -f3- | tr '/' '_' 66 | else 67 | echo -n "::set-output name=tags::akaunting/akaunting:" 68 | echo "$(echo "$GITHUB_REF" | cut -d/ -f3- | tr '/' '_')-${{ matrix.image }}" 69 | fi 70 | fi 71 | - name: Set up QEMU 72 | if: matrix.image == '' || matrix.image == 'v' || matrix.image == 'fpm' || matrix.image == 'fpm-alpine' || matrix.image == 'fpm-alpine-nginx' 73 | uses: docker/setup-qemu-action@v2 74 | - name: Set up Docker Buildx 75 | if: matrix.image == '' || matrix.image == 'v' || matrix.image == 'fpm' || matrix.image == 'fpm-alpine' || matrix.image == 'fpm-alpine-nginx' 76 | uses: docker/setup-buildx-action@v2 77 | - name: Login to DockerHub 78 | if: github.event_name != 'pull_request' 79 | uses: docker/login-action@v1 80 | with: 81 | username: ${{ secrets.DOCKERHUB_USERNAME }} 82 | password: ${{ secrets.DOCKERHUB_TOKEN }} 83 | - name: Build and push images 84 | if: matrix.image == '' || matrix.image == 'v' || matrix.image == 'fpm' || matrix.image == 'fpm-alpine' || matrix.image == 'fpm-alpine-nginx' 85 | uses: docker/build-push-action@v3 86 | with: 87 | context: . 88 | file: ./${{ matrix.file }} 89 | platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7 90 | push: ${{ github.event_name != 'pull_request' }} 91 | tags: ${{ steps.image-tags.outputs.tags }} 92 | - name: Build and push images 93 | if: matrix.image == 'fpm-alpine-nginx-composer' || matrix.image == 'fpm-alpine-nginx-composer-supervisor' 94 | uses: docker/build-push-action@v3 95 | with: 96 | context: . 97 | file: ./${{ matrix.file }} 98 | platforms: linux/amd64 99 | push: ${{ github.event_name != 'pull_request' }} 100 | tags: ${{ steps.image-tags.outputs.tags }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | db.env 2 | run.env 3 | tags 4 | *.swp 5 | .DS_Store 6 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.1-apache 2 | 3 | ARG AKAUNTING_DOCKERFILE_VERSION=0.1 4 | ARG SUPPORTED_LOCALES="en_US.UTF-8" 5 | 6 | RUN apt-get update \ 7 | && apt-get -y upgrade --no-install-recommends \ 8 | && apt-get install -y \ 9 | build-essential \ 10 | imagemagick \ 11 | libfreetype6-dev \ 12 | libicu-dev \ 13 | libjpeg62-turbo-dev \ 14 | libjpeg-dev \ 15 | libmcrypt-dev \ 16 | libonig-dev \ 17 | libpng-dev \ 18 | libpq-dev \ 19 | libssl-dev \ 20 | libxml2-dev \ 21 | libxrender1 \ 22 | libzip-dev \ 23 | locales \ 24 | openssl \ 25 | unzip \ 26 | zip \ 27 | zlib1g-dev \ 28 | --no-install-recommends \ 29 | && apt-get clean && rm -rf /var/lib/apt/lists/* 30 | 31 | RUN for locale in ${SUPPORTED_LOCALES}; do \ 32 | sed -i 's/^# '"${locale}/${locale}/" /etc/locale.gen; done \ 33 | && locale-gen 34 | 35 | RUN docker-php-ext-configure gd \ 36 | --with-freetype \ 37 | --with-jpeg \ 38 | && docker-php-ext-install -j$(nproc) \ 39 | gd \ 40 | bcmath \ 41 | intl \ 42 | mbstring \ 43 | pcntl \ 44 | pdo \ 45 | pdo_mysql \ 46 | zip 47 | 48 | RUN mkdir -p /var/www/akaunting \ 49 | && curl -Lo /tmp/akaunting.zip 'https://akaunting.com/download.php?version=latest&utm_source=docker&utm_campaign=developers' \ 50 | && unzip /tmp/akaunting.zip -d /var/www/html \ 51 | && rm -f /tmp/akaunting.zip 52 | 53 | COPY files/akaunting.sh /usr/local/bin/akaunting.sh 54 | COPY files/html /var/www/html 55 | 56 | ENTRYPOINT ["/usr/local/bin/akaunting.sh"] 57 | CMD ["--start"] 58 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | {one line to give the program's name and a brief idea of what it does.} 635 | Copyright (C) {year} {name of author} 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | {project} Copyright (C) {year} {fullname} 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Akaunting Docker Image 2 | 3 | You can pull the latest image with `docker pull docker.io/akaunting/akaunting:latest` 4 | 5 | ## Description 6 | 7 | This repository defines how the official Akaunting images are built for Docker Hub. 8 | 9 | Akaunting is online, open source and free accounting software built with modern technologies. Track your income and expenses with ease. For more information on Akaunting, please visit the [website](https://akaunting.com). 10 | 11 | ## Usage 12 | 13 | ```shell 14 | git clone https://github.com/akaunting/docker 15 | cd docker 16 | cp env/db.env.example env/db.env 17 | vi env/db.env # and set things 18 | cp env/run.env.example env/run.env 19 | vi env/run.env # and set things 20 | 21 | AKAUNTING_SETUP=true docker-compose up -d 22 | ``` 23 | 24 | Then head to HTTP at port 8080 on the docker-compose host and finish configuring your Akaunting company through the interactive wizard. 25 | 26 | After setup is complete, bring the containers down before bringing them back up without the setup variable. 27 | 28 | ```shell 29 | docker-compose down 30 | docker-compose up -d 31 | ``` 32 | 33 | > Please never use `AKAUNTING_SETUP=true` environment variable again after the first time use. 34 | 35 | If you have a database cluster you can take advantage of the following environment variables: 36 | 37 | ``` 38 | # In env/run.env put: 39 | DB_HOST_WRITE: "example-write" 40 | DB_HOST_READ: "example-read" 41 | ``` 42 | 43 | You can use Redis with Akaunting for performance enhancement and scalability, if you have a Redis you can take advantage of the following environment variables: 44 | 45 | ``` 46 | # In env/run.env put: 47 | REDIS_HOST: "example-redis" 48 | # Switch cache driver to redis 49 | CACHE_DRIVER: "redis" 50 | # Switch session driver to redis 51 | SESSION_DRIVER: "redis" 52 | # Switch queue driver to redis 53 | QUEUE_CONNECTION: "redis" 54 | ``` 55 | 56 | ## Extra ways to explore containerized Akaunting! 57 | This repository contains extra compose and other files that allows you to run Akaunting in different setups like using FPM and NGINX and here is the most important commands that you may need: 58 | 59 | ```shell 60 | # Run Akaunting setup that checks for volume files before copying them. 61 | AKAUNTING_SETUP=true docker-compose -f v-docker-compose.yml up --build 62 | 63 | # Run Akaunting with FPM on Debian and use Nginx as external proxy 64 | AKAUNTING_SETUP=true docker-compose -f fpm-docker-compose.yml up --build 65 | 66 | # Run Akaunting using FPM on Alpine and using Nginx as external proxy 67 | AKAUNTING_SETUP=true docker-compose -f fpm-docker-compose.yml -f fpm-alpine-docker-compose.yml up --build 68 | 69 | # Run Akaunting using FPM on Alpine and using Nginx as internal proxy 70 | AKAUNTING_SETUP=true docker-compose -f fpm-alpine-nginx-docker-compose.yml up --build 71 | 72 | # Download Akaunting using git and install composer and npm and run Akaunting using FPM on Alpine and using Nginx as internal proxy 73 | AKAUNTING_SETUP=true docker-compose -f fpm-alpine-nginx-docker-compose.yml -f fpm-alpine-nginx-composer-docker-compose.yml up --build 74 | 75 | # Download Akaunting using git and install composer and npm and run Akaunting using FPM on Alpine and using Nginx as internal proxy and supervisor to manage the queues 76 | AKAUNTING_SETUP=true docker-compose -f fpm-alpine-nginx-docker-compose.yml -f fpm-alpine-nginx-composer-supervisor-docker-compose.yml up --build 77 | ``` 78 | 79 | ## License 80 | 81 | Akaunting is released under the [GPLv3 license](LICENSE.txt). 82 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | 3 | services: 4 | 5 | akaunting: 6 | container_name: akaunting 7 | image: docker.io/akaunting/akaunting:latest 8 | build: 9 | context: . 10 | ports: 11 | - 8080:80 12 | volumes: 13 | - akaunting-data:/var/www/html 14 | restart: unless-stopped 15 | env_file: 16 | - env/run.env 17 | environment: 18 | - AKAUNTING_SETUP 19 | depends_on: 20 | - akaunting-db 21 | 22 | akaunting-db: 23 | container_name: akaunting-db 24 | image: mariadb 25 | volumes: 26 | - akaunting-db:/var/lib/mysql 27 | restart: unless-stopped 28 | env_file: 29 | - env/db.env 30 | 31 | volumes: 32 | akaunting-data: 33 | akaunting-db: 34 | -------------------------------------------------------------------------------- /env/db.env.example: -------------------------------------------------------------------------------- 1 | # These could be changed 2 | MYSQL_DATABASE=akaunting 3 | MYSQL_USER=admin 4 | 5 | # This should definitely be changed to something long and random 6 | MYSQL_PASSWORD=akaunting_password 7 | 8 | # You should probably leave this 9 | MYSQL_RANDOM_ROOT_PASSWORD=yes 10 | -------------------------------------------------------------------------------- /env/run.env.example: -------------------------------------------------------------------------------- 1 | # You should change this to match your reverse proxy protocol, DNS name and port (if non standard port is used) 2 | APP_URL=https://akaunting.example.com 3 | LOCALE=en-US 4 | 5 | # Don't change this unless you rename your database container or use rootless podman, in case of using rootless podman you should set it to 127.0.0.1 (NOT localhost) 6 | DB_HOST=akaunting-db 7 | DB_PORT=3306 8 | 9 | # Change these to match env/db.env 10 | DB_NAME=akaunting 11 | DB_USERNAME=admin 12 | DB_PASSWORD=akaunting_password 13 | 14 | # You should change this to a random string of three numbers or letters followed by an underscore 15 | DB_PREFIX=asd_ 16 | 17 | # These define the first company to exist on this instance. They are only used during setup. 18 | COMPANY_NAME=My Company 19 | COMPANY_EMAIL=my@company.com 20 | 21 | # This will be the first administrative user created on setup. 22 | ADMIN_EMAIL=me@company.com 23 | ADMIN_PASSWORD=password 24 | -------------------------------------------------------------------------------- /files/akaunting-php-fpm-nginx-supervisord.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | mkdir -p storage/framework/{sessions,views,cache} 4 | mkdir -p storage/app/uploads 5 | 6 | if [ "$AKAUNTING_SETUP" == "true" ]; then 7 | retry_for=30 8 | retry_interval=5 9 | while sleep $retry_interval; do 10 | if php artisan install \ 11 | --db-host=$DB_HOST \ 12 | --db-port=$DB_PORT \ 13 | --db-name=$DB_NAME \ 14 | --db-username=$DB_USERNAME \ 15 | "--db-password=$DB_PASSWORD" \ 16 | --db-prefix=$DB_PREFIX \ 17 | "--company-name=$COMPANY_NAME" \ 18 | "--company-email=$COMPANY_EMAIL" \ 19 | "--admin-email=$ADMIN_EMAIL" \ 20 | "--admin-password=$ADMIN_PASSWORD" \ 21 | "--locale=$LOCALE" --no-interaction; then break 22 | else 23 | if [ $retry_for -le 0 ]; then 24 | echo "Unable to find database!" >&2 25 | exit 1 26 | fi 27 | (( retry_for -= retry_interval )) 28 | fi 29 | done 30 | else 31 | unset COMPANY_NAME COMPANY_EMAIL ADMIN_EMAIL ADMIN_PASSWORD 32 | fi 33 | 34 | chmod -R u=rwX,g=rX,o=rX /var/www/html 35 | chown -R www-data:root /var/www/html 36 | 37 | exec "$@" 38 | -------------------------------------------------------------------------------- /files/akaunting-php-fpm-nginx.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | do_start= 4 | do_shell= 5 | do_setup= 6 | 7 | while [ $# -gt 0 ]; do 8 | case "$1" in 9 | --start) 10 | do_start=true 11 | ;; 12 | --shell) 13 | do_start=false 14 | do_shell=true 15 | ;; 16 | --setup) 17 | do_setup=true 18 | do_start=true 19 | ;; 20 | esac 21 | shift 22 | done 23 | 24 | mkdir -p storage/framework/{sessions,views,cache} 25 | mkdir -p storage/app/uploads 26 | 27 | if [ "$do_setup" -o "$AKAUNTING_SETUP" == "true" ]; then 28 | retry_for=30 29 | retry_interval=5 30 | while sleep $retry_interval; do 31 | if php artisan install \ 32 | --db-host=$DB_HOST \ 33 | --db-port=$DB_PORT \ 34 | --db-name=$DB_NAME \ 35 | --db-username=$DB_USERNAME \ 36 | "--db-password=$DB_PASSWORD" \ 37 | --db-prefix=$DB_PREFIX \ 38 | "--company-name=$COMPANY_NAME" \ 39 | "--company-email=$COMPANY_EMAIL" \ 40 | "--admin-email=$ADMIN_EMAIL" \ 41 | "--admin-password=$ADMIN_PASSWORD" \ 42 | "--locale=$LOCALE" --no-interaction; then break 43 | else 44 | if [ $retry_for -le 0 ]; then 45 | echo "Unable to find database!" >&2 46 | exit 1 47 | fi 48 | (( retry_for -= retry_interval )) 49 | fi 50 | done 51 | else 52 | unset COMPANY_NAME COMPANY_EMAIL ADMIN_EMAIL ADMIN_PASSWORD 53 | fi 54 | 55 | chmod -R u=rwX,g=rX,o=rX /var/www/html 56 | chown -R www-data:root /var/www/html 57 | 58 | if [ "$do_start" ]; then 59 | php-fpm -D 60 | nginx -g "daemon off;" 61 | elif [ "$do_shell" ]; then 62 | exec /bin/bash -li 63 | fi 64 | -------------------------------------------------------------------------------- /files/akaunting-php-fpm.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | do_start= 4 | do_shell= 5 | do_setup= 6 | 7 | while [ $# -gt 0 ]; do 8 | case "$1" in 9 | --start) 10 | do_start=true 11 | ;; 12 | --shell) 13 | do_start=false 14 | do_shell=true 15 | ;; 16 | --setup) 17 | do_setup=true 18 | do_start=true 19 | ;; 20 | esac 21 | shift 22 | done 23 | 24 | mkdir -p storage/framework/{sessions,views,cache} 25 | mkdir -p storage/app/uploads 26 | 27 | if [ "$do_setup" -o "$AKAUNTING_SETUP" == "true" ]; then 28 | retry_for=30 29 | retry_interval=5 30 | while sleep $retry_interval; do 31 | if php artisan install \ 32 | --db-host=$DB_HOST \ 33 | --db-port=$DB_PORT \ 34 | --db-name=$DB_NAME \ 35 | --db-username=$DB_USERNAME \ 36 | "--db-password=$DB_PASSWORD" \ 37 | --db-prefix=$DB_PREFIX \ 38 | "--company-name=$COMPANY_NAME" \ 39 | "--company-email=$COMPANY_EMAIL" \ 40 | "--admin-email=$ADMIN_EMAIL" \ 41 | "--admin-password=$ADMIN_PASSWORD" \ 42 | "--locale=$LOCALE" --no-interaction; then break 43 | else 44 | if [ $retry_for -le 0 ]; then 45 | echo "Unable to find database!" >&2 46 | exit 1 47 | fi 48 | (( retry_for -= retry_interval )) 49 | fi 50 | done 51 | else 52 | unset COMPANY_NAME COMPANY_EMAIL ADMIN_EMAIL ADMIN_PASSWORD 53 | fi 54 | 55 | chmod -R u=rwX,g=rX,o=rX /var/www/html 56 | chown -R www-data:root /var/www/html 57 | 58 | if [ "$do_start" ]; then 59 | exec docker-php-entrypoint php-fpm 60 | elif [ "$do_shell" ]; then 61 | exec /bin/bash -li 62 | fi 63 | -------------------------------------------------------------------------------- /files/akaunting-v.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | a2enmod rewrite 4 | 5 | if [ ! -f /var/www/html/index.php ]; then 6 | unzip /tmp/akaunting.zip -d /var/www/html 7 | fi 8 | 9 | rm -f /tmp/akaunting.zip 10 | 11 | 12 | do_start= 13 | do_shell= 14 | do_setup= 15 | 16 | while [ $# -gt 0 ]; do 17 | case "$1" in 18 | --start) 19 | do_start=true 20 | ;; 21 | --shell) 22 | do_start=false 23 | do_shell=true 24 | ;; 25 | --setup) 26 | do_setup=true 27 | do_start=true 28 | ;; 29 | esac 30 | shift 31 | done 32 | 33 | mkdir -p storage/framework/{sessions,views,cache} 34 | mkdir -p storage/app/uploads 35 | 36 | if [ "$do_setup" -o "$AKAUNTING_SETUP" == "true" ]; then 37 | retry_for=30 38 | retry_interval=5 39 | 40 | if [[ -z "${DB_HOST_WRITE}" ]]; then 41 | db_host="${DB_HOST}" 42 | else 43 | db_host="${DB_HOST_WRITE}" 44 | fi 45 | 46 | 47 | while sleep $retry_interval; do 48 | if php artisan install \ 49 | --db-host=$db_host \ 50 | --db-port=$DB_PORT \ 51 | --db-name=$DB_NAME \ 52 | --db-username=$DB_USERNAME \ 53 | "--db-password=$DB_PASSWORD" \ 54 | --db-prefix=$DB_PREFIX \ 55 | "--company-name=$COMPANY_NAME" \ 56 | "--company-email=$COMPANY_EMAIL" \ 57 | "--admin-email=$ADMIN_EMAIL" \ 58 | "--admin-password=$ADMIN_PASSWORD" \ 59 | "--locale=$LOCALE" --no-interaction; then break 60 | else 61 | if [ $retry_for -le 0 ]; then 62 | echo "Unable to find database!" >&2 63 | exit 1 64 | fi 65 | (( retry_for -= retry_interval )) 66 | fi 67 | done 68 | else 69 | unset COMPANY_NAME COMPANY_EMAIL ADMIN_EMAIL ADMIN_PASSWORD 70 | fi 71 | 72 | chmod -R u=rwX,g=rX,o=rX /var/www/html 73 | chown -R www-data:root /var/www/html 74 | 75 | if [ "$do_start" ]; then 76 | exec docker-php-entrypoint apache2-foreground 77 | elif [ "$do_shell" ]; then 78 | exec /bin/bash -li 79 | fi 80 | -------------------------------------------------------------------------------- /files/akaunting.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | a2enmod rewrite 4 | 5 | do_start= 6 | do_shell= 7 | do_setup= 8 | 9 | while [ $# -gt 0 ]; do 10 | case "$1" in 11 | --start) 12 | do_start=true 13 | ;; 14 | --shell) 15 | do_start=false 16 | do_shell=true 17 | ;; 18 | --setup) 19 | do_setup=true 20 | do_start=true 21 | ;; 22 | esac 23 | shift 24 | done 25 | 26 | mkdir -p storage/framework/{sessions,views,cache} 27 | mkdir -p storage/app/uploads 28 | 29 | if [ "$do_setup" -o "$AKAUNTING_SETUP" == "true" ]; then 30 | retry_for=30 31 | retry_interval=5 32 | while sleep $retry_interval; do 33 | if php artisan install \ 34 | --db-host=$DB_HOST \ 35 | --db-port=$DB_PORT \ 36 | --db-name=$DB_NAME \ 37 | --db-username=$DB_USERNAME \ 38 | "--db-password=$DB_PASSWORD" \ 39 | --db-prefix=$DB_PREFIX \ 40 | "--company-name=$COMPANY_NAME" \ 41 | "--company-email=$COMPANY_EMAIL" \ 42 | "--admin-email=$ADMIN_EMAIL" \ 43 | "--admin-password=$ADMIN_PASSWORD" \ 44 | "--locale=$LOCALE" --no-interaction; then break 45 | else 46 | if [ $retry_for -le 0 ]; then 47 | echo "Unable to find database!" >&2 48 | exit 1 49 | fi 50 | (( retry_for -= retry_interval )) 51 | fi 52 | done 53 | else 54 | unset COMPANY_NAME COMPANY_EMAIL ADMIN_EMAIL ADMIN_PASSWORD 55 | fi 56 | 57 | chmod -R u=rwX,g=rX,o=rX /var/www/html 58 | chown -R www-data:root /var/www/html 59 | 60 | if [ "$do_start" ]; then 61 | exec docker-php-entrypoint apache2-foreground 62 | elif [ "$do_shell" ]; then 63 | exec /bin/bash -li 64 | fi 65 | -------------------------------------------------------------------------------- /files/html/.env: -------------------------------------------------------------------------------- 1 | APP_NAME=Akaunting 2 | APP_ENV=production 3 | APP_LOCALE=en-US 4 | APP_INSTALLED=false 5 | APP_DEBUG=false 6 | 7 | DB_CONNECTION=mysql 8 | DB_PORT=3306 9 | 10 | BROADCAST_DRIVER=log 11 | CACHE_DRIVER=file 12 | SESSION_DRIVER=file 13 | QUEUE_CONNECTION=sync 14 | LOG_CHANNEL=stderr 15 | 16 | MAIL_MAILER=mail 17 | MAIL_HOST=localhost 18 | MAIL_PORT=2525 19 | MAIL_USERNAME=null 20 | MAIL_PASSWORD=null 21 | MAIL_ENCRYPTION=null 22 | MAIL_FROM_NAME=null 23 | MAIL_FROM_ADDRESS=null 24 | 25 | FIREWALL_ENABLED=true 26 | 27 | MODEL_CACHE_ENABLED=true 28 | -------------------------------------------------------------------------------- /files/php.ini: -------------------------------------------------------------------------------- 1 | [PHP] 2 | 3 | ;;;;;;;;;;;;;;;;;;; 4 | ; About php.ini ; 5 | ;;;;;;;;;;;;;;;;;;; 6 | ; PHP's initialization file, generally called php.ini, is responsible for 7 | ; configuring many of the aspects of PHP's behavior. 8 | 9 | ; PHP attempts to find and load this configuration from a number of locations. 10 | ; The following is a summary of its search order: 11 | ; 1. SAPI module specific location. 12 | ; 2. The PHPRC environment variable. (As of PHP 5.2.0) 13 | ; 3. A number of predefined registry keys on Windows (As of PHP 5.2.0) 14 | ; 4. Current working directory (except CLI) 15 | ; 5. The web server's directory (for SAPI modules), or directory of PHP 16 | ; (otherwise in Windows) 17 | ; 6. The directory from the --with-config-file-path compile time option, or the 18 | ; Windows directory (usually C:\windows) 19 | ; See the PHP docs for more specific information. 20 | ; https://php.net/configuration.file 21 | 22 | ; The syntax of the file is extremely simple. Whitespace and lines 23 | ; beginning with a semicolon are silently ignored (as you probably guessed). 24 | ; Section headers (e.g. [Foo]) are also silently ignored, even though 25 | ; they might mean something in the future. 26 | 27 | ; Directives following the section heading [PATH=/www/mysite] only 28 | ; apply to PHP files in the /www/mysite directory. Directives 29 | ; following the section heading [HOST=www.example.com] only apply to 30 | ; PHP files served from www.example.com. Directives set in these 31 | ; special sections cannot be overridden by user-defined INI files or 32 | ; at runtime. Currently, [PATH=] and [HOST=] sections only work under 33 | ; CGI/FastCGI. 34 | ; https://php.net/ini.sections 35 | 36 | ; Directives are specified using the following syntax: 37 | ; directive = value 38 | ; Directive names are *case sensitive* - foo=bar is different from FOO=bar. 39 | ; Directives are variables used to configure PHP or PHP extensions. 40 | ; There is no name validation. If PHP can't find an expected 41 | ; directive because it is not set or is mistyped, a default value will be used. 42 | 43 | ; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one 44 | ; of the INI constants (On, Off, True, False, Yes, No and None) or an expression 45 | ; (e.g. E_ALL & ~E_NOTICE), a quoted string ("bar"), or a reference to a 46 | ; previously set variable or directive (e.g. ${foo}) 47 | 48 | ; Expressions in the INI file are limited to bitwise operators and parentheses: 49 | ; | bitwise OR 50 | ; ^ bitwise XOR 51 | ; & bitwise AND 52 | ; ~ bitwise NOT 53 | ; ! boolean NOT 54 | 55 | ; Boolean flags can be turned on using the values 1, On, True or Yes. 56 | ; They can be turned off using the values 0, Off, False or No. 57 | 58 | ; An empty string can be denoted by simply not writing anything after the equal 59 | ; sign, or by using the None keyword: 60 | 61 | ; foo = ; sets foo to an empty string 62 | ; foo = None ; sets foo to an empty string 63 | ; foo = "None" ; sets foo to the string 'None' 64 | 65 | ; If you use constants in your value, and these constants belong to a 66 | ; dynamically loaded extension (either a PHP extension or a Zend extension), 67 | ; you may only use these constants *after* the line that loads the extension. 68 | 69 | ;;;;;;;;;;;;;;;;;;; 70 | ; About this file ; 71 | ;;;;;;;;;;;;;;;;;;; 72 | ; PHP comes packaged with two INI files. One that is recommended to be used 73 | ; in production environments and one that is recommended to be used in 74 | ; development environments. 75 | 76 | ; php.ini-production contains settings which hold security, performance and 77 | ; best practices at its core. But please be aware, these settings may break 78 | ; compatibility with older or less security conscience applications. We 79 | ; recommending using the production ini in production and testing environments. 80 | 81 | ; php.ini-development is very similar to its production variant, except it is 82 | ; much more verbose when it comes to errors. We recommend using the 83 | ; development version only in development environments, as errors shown to 84 | ; application users can inadvertently leak otherwise secure information. 85 | 86 | ; This is the php.ini-production INI file. 87 | 88 | ;;;;;;;;;;;;;;;;;;; 89 | ; Quick Reference ; 90 | ;;;;;;;;;;;;;;;;;;; 91 | 92 | ; The following are all the settings which are different in either the production 93 | ; or development versions of the INIs with respect to PHP's default behavior. 94 | ; Please see the actual settings later in the document for more details as to why 95 | ; we recommend these changes in PHP's behavior. 96 | 97 | ; display_errors 98 | ; Default Value: On 99 | ; Development Value: On 100 | ; Production Value: Off 101 | 102 | ; display_startup_errors 103 | ; Default Value: On 104 | ; Development Value: On 105 | ; Production Value: Off 106 | 107 | ; error_reporting 108 | ; Default Value: E_ALL 109 | ; Development Value: E_ALL 110 | ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT 111 | 112 | ; log_errors 113 | ; Default Value: Off 114 | ; Development Value: On 115 | ; Production Value: On 116 | 117 | ; max_input_time 118 | ; Default Value: -1 (Unlimited) 119 | ; Development Value: 60 (60 seconds) 120 | ; Production Value: 60 (60 seconds) 121 | 122 | ; output_buffering 123 | ; Default Value: Off 124 | ; Development Value: 4096 125 | ; Production Value: 4096 126 | 127 | ; register_argc_argv 128 | ; Default Value: On 129 | ; Development Value: Off 130 | ; Production Value: Off 131 | 132 | ; request_order 133 | ; Default Value: None 134 | ; Development Value: "GP" 135 | ; Production Value: "GP" 136 | 137 | ; session.gc_divisor 138 | ; Default Value: 100 139 | ; Development Value: 1000 140 | ; Production Value: 1000 141 | 142 | ; session.sid_bits_per_character 143 | ; Default Value: 4 144 | ; Development Value: 5 145 | ; Production Value: 5 146 | 147 | ; short_open_tag 148 | ; Default Value: On 149 | ; Development Value: Off 150 | ; Production Value: Off 151 | 152 | ; variables_order 153 | ; Default Value: "EGPCS" 154 | ; Development Value: "GPCS" 155 | ; Production Value: "GPCS" 156 | 157 | ; zend.exception_ignore_args 158 | ; Default Value: Off 159 | ; Development Value: Off 160 | ; Production Value: On 161 | 162 | ; zend.exception_string_param_max_len 163 | ; Default Value: 15 164 | ; Development Value: 15 165 | ; Production Value: 0 166 | 167 | ;;;;;;;;;;;;;;;;;;;; 168 | ; php.ini Options ; 169 | ;;;;;;;;;;;;;;;;;;;; 170 | ; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini" 171 | ;user_ini.filename = ".user.ini" 172 | 173 | ; To disable this feature set this option to an empty value 174 | ;user_ini.filename = 175 | 176 | ; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes) 177 | ;user_ini.cache_ttl = 300 178 | 179 | ;;;;;;;;;;;;;;;;;;;; 180 | ; Language Options ; 181 | ;;;;;;;;;;;;;;;;;;;; 182 | 183 | ; Enable the PHP scripting language engine under Apache. 184 | ; https://php.net/engine 185 | engine = On 186 | 187 | ; This directive determines whether or not PHP will recognize code between 188 | ; tags as PHP source which should be processed as such. It is 189 | ; generally recommended that should be used and that this feature 190 | ; should be disabled, as enabling it may result in issues when generating XML 191 | ; documents, however this remains supported for backward compatibility reasons. 192 | ; Note that this directive does not control the would work. 332 | ; https://php.net/syntax-highlighting 333 | ;highlight.string = #DD0000 334 | ;highlight.comment = #FF9900 335 | ;highlight.keyword = #007700 336 | ;highlight.default = #0000BB 337 | ;highlight.html = #000000 338 | 339 | ; If enabled, the request will be allowed to complete even if the user aborts 340 | ; the request. Consider enabling it if executing long requests, which may end up 341 | ; being interrupted by the user or a browser timing out. PHP's default behavior 342 | ; is to disable this feature. 343 | ; https://php.net/ignore-user-abort 344 | ;ignore_user_abort = On 345 | 346 | ; Determines the size of the realpath cache to be used by PHP. This value should 347 | ; be increased on systems where PHP opens many files to reflect the quantity of 348 | ; the file operations performed. 349 | ; Note: if open_basedir is set, the cache is disabled 350 | ; https://php.net/realpath-cache-size 351 | ;realpath_cache_size = 4096k 352 | 353 | ; Duration of time, in seconds for which to cache realpath information for a given 354 | ; file or directory. For systems with rarely changing files, consider increasing this 355 | ; value. 356 | ; https://php.net/realpath-cache-ttl 357 | ;realpath_cache_ttl = 120 358 | 359 | ; Enables or disables the circular reference collector. 360 | ; https://php.net/zend.enable-gc 361 | zend.enable_gc = On 362 | 363 | ; If enabled, scripts may be written in encodings that are incompatible with 364 | ; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such 365 | ; encodings. To use this feature, mbstring extension must be enabled. 366 | ;zend.multibyte = Off 367 | 368 | ; Allows to set the default encoding for the scripts. This value will be used 369 | ; unless "declare(encoding=...)" directive appears at the top of the script. 370 | ; Only affects if zend.multibyte is set. 371 | ;zend.script_encoding = 372 | 373 | ; Allows to include or exclude arguments from stack traces generated for exceptions. 374 | ; In production, it is recommended to turn this setting on to prohibit the output 375 | ; of sensitive information in stack traces 376 | ; Default Value: Off 377 | ; Development Value: Off 378 | ; Production Value: On 379 | zend.exception_ignore_args = On 380 | 381 | ; Allows setting the maximum string length in an argument of a stringified stack trace 382 | ; to a value between 0 and 1000000. 383 | ; This has no effect when zend.exception_ignore_args is enabled. 384 | ; Default Value: 15 385 | ; Development Value: 15 386 | ; Production Value: 0 387 | ; In production, it is recommended to set this to 0 to reduce the output 388 | ; of sensitive information in stack traces. 389 | zend.exception_string_param_max_len = 0 390 | 391 | ;;;;;;;;;;;;;;;;; 392 | ; Miscellaneous ; 393 | ;;;;;;;;;;;;;;;;; 394 | 395 | ; Decides whether PHP may expose the fact that it is installed on the server 396 | ; (e.g. by adding its signature to the Web server header). It is no security 397 | ; threat in any way, but it makes it possible to determine whether you use PHP 398 | ; on your server or not. 399 | ; https://php.net/expose-php 400 | expose_php = On 401 | 402 | ;;;;;;;;;;;;;;;;;;; 403 | ; Resource Limits ; 404 | ;;;;;;;;;;;;;;;;;;; 405 | 406 | ; Maximum execution time of each script, in seconds 407 | ; https://php.net/max-execution-time 408 | ; Note: This directive is hardcoded to 0 for the CLI SAPI 409 | max_execution_time = 30 410 | 411 | ; Maximum amount of time each script may spend parsing request data. It's a good 412 | ; idea to limit this time on productions servers in order to eliminate unexpectedly 413 | ; long running scripts. 414 | ; Note: This directive is hardcoded to -1 for the CLI SAPI 415 | ; Default Value: -1 (Unlimited) 416 | ; Development Value: 60 (60 seconds) 417 | ; Production Value: 60 (60 seconds) 418 | ; https://php.net/max-input-time 419 | max_input_time = 60 420 | 421 | ; Maximum input variable nesting level 422 | ; https://php.net/max-input-nesting-level 423 | ;max_input_nesting_level = 64 424 | 425 | ; How many GET/POST/COOKIE input variables may be accepted 426 | ;max_input_vars = 1000 427 | 428 | ; Maximum amount of memory a script may consume 429 | ; https://php.net/memory-limit 430 | memory_limit = 128M 431 | 432 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 433 | ; Error handling and logging ; 434 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 435 | 436 | ; This directive informs PHP of which errors, warnings and notices you would like 437 | ; it to take action for. The recommended way of setting values for this 438 | ; directive is through the use of the error level constants and bitwise 439 | ; operators. The error level constants are below here for convenience as well as 440 | ; some common settings and their meanings. 441 | ; By default, PHP is set to take action on all errors, notices and warnings EXCEPT 442 | ; those related to E_NOTICE and E_STRICT, which together cover best practices and 443 | ; recommended coding standards in PHP. For performance reasons, this is the 444 | ; recommend error reporting setting. Your production server shouldn't be wasting 445 | ; resources complaining about best practices and coding standards. That's what 446 | ; development servers and development settings are for. 447 | ; Note: The php.ini-development file has this setting as E_ALL. This 448 | ; means it pretty much reports everything which is exactly what you want during 449 | ; development and early testing. 450 | ; 451 | ; Error Level Constants: 452 | ; E_ALL - All errors and warnings (includes E_STRICT as of PHP 5.4.0) 453 | ; E_ERROR - fatal run-time errors 454 | ; E_RECOVERABLE_ERROR - almost fatal run-time errors 455 | ; E_WARNING - run-time warnings (non-fatal errors) 456 | ; E_PARSE - compile-time parse errors 457 | ; E_NOTICE - run-time notices (these are warnings which often result 458 | ; from a bug in your code, but it's possible that it was 459 | ; intentional (e.g., using an uninitialized variable and 460 | ; relying on the fact it is automatically initialized to an 461 | ; empty string) 462 | ; E_STRICT - run-time notices, enable to have PHP suggest changes 463 | ; to your code which will ensure the best interoperability 464 | ; and forward compatibility of your code 465 | ; E_CORE_ERROR - fatal errors that occur during PHP's initial startup 466 | ; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's 467 | ; initial startup 468 | ; E_COMPILE_ERROR - fatal compile-time errors 469 | ; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) 470 | ; E_USER_ERROR - user-generated error message 471 | ; E_USER_WARNING - user-generated warning message 472 | ; E_USER_NOTICE - user-generated notice message 473 | ; E_DEPRECATED - warn about code that will not work in future versions 474 | ; of PHP 475 | ; E_USER_DEPRECATED - user-generated deprecation warnings 476 | ; 477 | ; Common Values: 478 | ; E_ALL (Show all errors, warnings and notices including coding standards.) 479 | ; E_ALL & ~E_NOTICE (Show all errors, except for notices) 480 | ; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.) 481 | ; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors) 482 | ; Default Value: E_ALL 483 | ; Development Value: E_ALL 484 | ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT 485 | ; https://php.net/error-reporting 486 | error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT 487 | 488 | ; This directive controls whether or not and where PHP will output errors, 489 | ; notices and warnings too. Error output is very useful during development, but 490 | ; it could be very dangerous in production environments. Depending on the code 491 | ; which is triggering the error, sensitive information could potentially leak 492 | ; out of your application such as database usernames and passwords or worse. 493 | ; For production environments, we recommend logging errors rather than 494 | ; sending them to STDOUT. 495 | ; Possible Values: 496 | ; Off = Do not display any errors 497 | ; stderr = Display errors to STDERR (affects only CGI/CLI binaries!) 498 | ; On or stdout = Display errors to STDOUT 499 | ; Default Value: On 500 | ; Development Value: On 501 | ; Production Value: Off 502 | ; https://php.net/display-errors 503 | display_errors = Off 504 | 505 | ; The display of errors which occur during PHP's startup sequence are handled 506 | ; separately from display_errors. We strongly recommend you set this to 'off' 507 | ; for production servers to avoid leaking configuration details. 508 | ; Default Value: On 509 | ; Development Value: On 510 | ; Production Value: Off 511 | ; https://php.net/display-startup-errors 512 | display_startup_errors = Off 513 | 514 | ; Besides displaying errors, PHP can also log errors to locations such as a 515 | ; server-specific log, STDERR, or a location specified by the error_log 516 | ; directive found below. While errors should not be displayed on productions 517 | ; servers they should still be monitored and logging is a great way to do that. 518 | ; Default Value: Off 519 | ; Development Value: On 520 | ; Production Value: On 521 | ; https://php.net/log-errors 522 | log_errors = On 523 | 524 | ; Set maximum length of log_errors. In error_log information about the source is 525 | ; added. The default is 1024 and 0 allows to not apply any maximum length at all. 526 | ; https://php.net/log-errors-max-len 527 | log_errors_max_len = 1024 528 | 529 | ; Do not log repeated messages. Repeated errors must occur in same file on same 530 | ; line unless ignore_repeated_source is set true. 531 | ; https://php.net/ignore-repeated-errors 532 | ignore_repeated_errors = Off 533 | 534 | ; Ignore source of message when ignoring repeated messages. When this setting 535 | ; is On you will not log errors with repeated messages from different files or 536 | ; source lines. 537 | ; https://php.net/ignore-repeated-source 538 | ignore_repeated_source = Off 539 | 540 | ; If this parameter is set to Off, then memory leaks will not be shown (on 541 | ; stdout or in the log). This is only effective in a debug compile, and if 542 | ; error reporting includes E_WARNING in the allowed list 543 | ; https://php.net/report-memleaks 544 | report_memleaks = On 545 | 546 | ; This setting is off by default. 547 | ;report_zend_debug = 0 548 | 549 | ; Turn off normal error reporting and emit XML-RPC error XML 550 | ; https://php.net/xmlrpc-errors 551 | ;xmlrpc_errors = 0 552 | 553 | ; An XML-RPC faultCode 554 | ;xmlrpc_error_number = 0 555 | 556 | ; When PHP displays or logs an error, it has the capability of formatting the 557 | ; error message as HTML for easier reading. This directive controls whether 558 | ; the error message is formatted as HTML or not. 559 | ; Note: This directive is hardcoded to Off for the CLI SAPI 560 | ; https://php.net/html-errors 561 | ;html_errors = On 562 | 563 | ; If html_errors is set to On *and* docref_root is not empty, then PHP 564 | ; produces clickable error messages that direct to a page describing the error 565 | ; or function causing the error in detail. 566 | ; You can download a copy of the PHP manual from https://php.net/docs 567 | ; and change docref_root to the base URL of your local copy including the 568 | ; leading '/'. You must also specify the file extension being used including 569 | ; the dot. PHP's default behavior is to leave these settings empty, in which 570 | ; case no links to documentation are generated. 571 | ; Note: Never use this feature for production boxes. 572 | ; https://php.net/docref-root 573 | ; Examples 574 | ;docref_root = "/phpmanual/" 575 | 576 | ; https://php.net/docref-ext 577 | ;docref_ext = .html 578 | 579 | ; String to output before an error message. PHP's default behavior is to leave 580 | ; this setting blank. 581 | ; https://php.net/error-prepend-string 582 | ; Example: 583 | ;error_prepend_string = "" 584 | 585 | ; String to output after an error message. PHP's default behavior is to leave 586 | ; this setting blank. 587 | ; https://php.net/error-append-string 588 | ; Example: 589 | ;error_append_string = "" 590 | 591 | ; Log errors to specified file. PHP's default behavior is to leave this value 592 | ; empty. 593 | ; https://php.net/error-log 594 | ; Example: 595 | ;error_log = php_errors.log 596 | ; Log errors to syslog (Event Log on Windows). 597 | ;error_log = syslog 598 | 599 | ; The syslog ident is a string which is prepended to every message logged 600 | ; to syslog. Only used when error_log is set to syslog. 601 | ;syslog.ident = php 602 | 603 | ; The syslog facility is used to specify what type of program is logging 604 | ; the message. Only used when error_log is set to syslog. 605 | ;syslog.facility = user 606 | 607 | ; Set this to disable filtering control characters (the default). 608 | ; Some loggers only accept NVT-ASCII, others accept anything that's not 609 | ; control characters. If your logger accepts everything, then no filtering 610 | ; is needed at all. 611 | ; Allowed values are: 612 | ; ascii (all printable ASCII characters and NL) 613 | ; no-ctrl (all characters except control characters) 614 | ; all (all characters) 615 | ; raw (like "all", but messages are not split at newlines) 616 | ; https://php.net/syslog.filter 617 | ;syslog.filter = ascii 618 | 619 | ;windows.show_crt_warning 620 | ; Default value: 0 621 | ; Development value: 0 622 | ; Production value: 0 623 | 624 | ;;;;;;;;;;;;;;;;; 625 | ; Data Handling ; 626 | ;;;;;;;;;;;;;;;;; 627 | 628 | ; The separator used in PHP generated URLs to separate arguments. 629 | ; PHP's default setting is "&". 630 | ; https://php.net/arg-separator.output 631 | ; Example: 632 | ;arg_separator.output = "&" 633 | 634 | ; List of separator(s) used by PHP to parse input URLs into variables. 635 | ; PHP's default setting is "&". 636 | ; NOTE: Every character in this directive is considered as separator! 637 | ; https://php.net/arg-separator.input 638 | ; Example: 639 | ;arg_separator.input = ";&" 640 | 641 | ; This directive determines which super global arrays are registered when PHP 642 | ; starts up. G,P,C,E & S are abbreviations for the following respective super 643 | ; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty 644 | ; paid for the registration of these arrays and because ENV is not as commonly 645 | ; used as the others, ENV is not recommended on productions servers. You 646 | ; can still get access to the environment variables through getenv() should you 647 | ; need to. 648 | ; Default Value: "EGPCS" 649 | ; Development Value: "GPCS" 650 | ; Production Value: "GPCS"; 651 | ; https://php.net/variables-order 652 | variables_order = "GPCS" 653 | 654 | ; This directive determines which super global data (G,P & C) should be 655 | ; registered into the super global array REQUEST. If so, it also determines 656 | ; the order in which that data is registered. The values for this directive 657 | ; are specified in the same manner as the variables_order directive, 658 | ; EXCEPT one. Leaving this value empty will cause PHP to use the value set 659 | ; in the variables_order directive. It does not mean it will leave the super 660 | ; globals array REQUEST empty. 661 | ; Default Value: None 662 | ; Development Value: "GP" 663 | ; Production Value: "GP" 664 | ; https://php.net/request-order 665 | request_order = "GP" 666 | 667 | ; This directive determines whether PHP registers $argv & $argc each time it 668 | ; runs. $argv contains an array of all the arguments passed to PHP when a script 669 | ; is invoked. $argc contains an integer representing the number of arguments 670 | ; that were passed when the script was invoked. These arrays are extremely 671 | ; useful when running scripts from the command line. When this directive is 672 | ; enabled, registering these variables consumes CPU cycles and memory each time 673 | ; a script is executed. For performance reasons, this feature should be disabled 674 | ; on production servers. 675 | ; Note: This directive is hardcoded to On for the CLI SAPI 676 | ; Default Value: On 677 | ; Development Value: Off 678 | ; Production Value: Off 679 | ; https://php.net/register-argc-argv 680 | register_argc_argv = Off 681 | 682 | ; When enabled, the ENV, REQUEST and SERVER variables are created when they're 683 | ; first used (Just In Time) instead of when the script starts. If these 684 | ; variables are not used within a script, having this directive on will result 685 | ; in a performance gain. The PHP directive register_argc_argv must be disabled 686 | ; for this directive to have any effect. 687 | ; https://php.net/auto-globals-jit 688 | auto_globals_jit = On 689 | 690 | ; Whether PHP will read the POST data. 691 | ; This option is enabled by default. 692 | ; Most likely, you won't want to disable this option globally. It causes $_POST 693 | ; and $_FILES to always be empty; the only way you will be able to read the 694 | ; POST data will be through the php://input stream wrapper. This can be useful 695 | ; to proxy requests or to process the POST data in a memory efficient fashion. 696 | ; https://php.net/enable-post-data-reading 697 | ;enable_post_data_reading = Off 698 | 699 | ; Maximum size of POST data that PHP will accept. 700 | ; Its value may be 0 to disable the limit. It is ignored if POST data reading 701 | ; is disabled through enable_post_data_reading. 702 | ; https://php.net/post-max-size 703 | post_max_size = 8M 704 | 705 | ; Automatically add files before PHP document. 706 | ; https://php.net/auto-prepend-file 707 | auto_prepend_file = 708 | 709 | ; Automatically add files after PHP document. 710 | ; https://php.net/auto-append-file 711 | auto_append_file = 712 | 713 | ; By default, PHP will output a media type using the Content-Type header. To 714 | ; disable this, simply set it to be empty. 715 | ; 716 | ; PHP's built-in default media type is set to text/html. 717 | ; https://php.net/default-mimetype 718 | default_mimetype = "text/html" 719 | 720 | ; PHP's default character set is set to UTF-8. 721 | ; https://php.net/default-charset 722 | default_charset = "UTF-8" 723 | 724 | ; PHP internal character encoding is set to empty. 725 | ; If empty, default_charset is used. 726 | ; https://php.net/internal-encoding 727 | ;internal_encoding = 728 | 729 | ; PHP input character encoding is set to empty. 730 | ; If empty, default_charset is used. 731 | ; https://php.net/input-encoding 732 | ;input_encoding = 733 | 734 | ; PHP output character encoding is set to empty. 735 | ; If empty, default_charset is used. 736 | ; See also output_buffer. 737 | ; https://php.net/output-encoding 738 | ;output_encoding = 739 | 740 | ;;;;;;;;;;;;;;;;;;;;;;;;; 741 | ; Paths and Directories ; 742 | ;;;;;;;;;;;;;;;;;;;;;;;;; 743 | 744 | ; UNIX: "/path1:/path2" 745 | ;include_path = ".:/php/includes" 746 | ; 747 | ; Windows: "\path1;\path2" 748 | ;include_path = ".;c:\php\includes" 749 | ; 750 | ; PHP's default setting for include_path is ".;/path/to/php/pear" 751 | ; https://php.net/include-path 752 | 753 | ; The root of the PHP pages, used only if nonempty. 754 | ; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root 755 | ; if you are running php as a CGI under any web server (other than IIS) 756 | ; see documentation for security issues. The alternate is to use the 757 | ; cgi.force_redirect configuration below 758 | ; https://php.net/doc-root 759 | doc_root = 760 | 761 | ; The directory under which PHP opens the script using /~username used only 762 | ; if nonempty. 763 | ; https://php.net/user-dir 764 | user_dir = 765 | 766 | ; Directory in which the loadable extensions (modules) reside. 767 | ; https://php.net/extension-dir 768 | ;extension_dir = "./" 769 | ; On windows: 770 | ;extension_dir = "ext" 771 | 772 | ; Directory where the temporary files should be placed. 773 | ; Defaults to the system default (see sys_get_temp_dir) 774 | ;sys_temp_dir = "/tmp" 775 | 776 | ; Whether or not to enable the dl() function. The dl() function does NOT work 777 | ; properly in multithreaded servers, such as IIS or Zeus, and is automatically 778 | ; disabled on them. 779 | ; https://php.net/enable-dl 780 | enable_dl = Off 781 | 782 | ; cgi.force_redirect is necessary to provide security running PHP as a CGI under 783 | ; most web servers. Left undefined, PHP turns this on by default. You can 784 | ; turn it off here AT YOUR OWN RISK 785 | ; **You CAN safely turn this off for IIS, in fact, you MUST.** 786 | ; https://php.net/cgi.force-redirect 787 | ;cgi.force_redirect = 1 788 | 789 | ; if cgi.nph is enabled it will force cgi to always sent Status: 200 with 790 | ; every request. PHP's default behavior is to disable this feature. 791 | ;cgi.nph = 1 792 | 793 | ; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape 794 | ; (iPlanet) web servers, you MAY need to set an environment variable name that PHP 795 | ; will look for to know it is OK to continue execution. Setting this variable MAY 796 | ; cause security issues, KNOW WHAT YOU ARE DOING FIRST. 797 | ; https://php.net/cgi.redirect-status-env 798 | ;cgi.redirect_status_env = 799 | 800 | ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's 801 | ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok 802 | ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting 803 | ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting 804 | ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts 805 | ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. 806 | ; https://php.net/cgi.fix-pathinfo 807 | ;cgi.fix_pathinfo=1 808 | 809 | ; if cgi.discard_path is enabled, the PHP CGI binary can safely be placed outside 810 | ; of the web tree and people will not be able to circumvent .htaccess security. 811 | ;cgi.discard_path=1 812 | 813 | ; FastCGI under IIS supports the ability to impersonate 814 | ; security tokens of the calling client. This allows IIS to define the 815 | ; security context that the request runs under. mod_fastcgi under Apache 816 | ; does not currently support this feature (03/17/2002) 817 | ; Set to 1 if running under IIS. Default is zero. 818 | ; https://php.net/fastcgi.impersonate 819 | ;fastcgi.impersonate = 1 820 | 821 | ; Disable logging through FastCGI connection. PHP's default behavior is to enable 822 | ; this feature. 823 | ;fastcgi.logging = 0 824 | 825 | ; cgi.rfc2616_headers configuration option tells PHP what type of headers to 826 | ; use when sending HTTP response code. If set to 0, PHP sends Status: header that 827 | ; is supported by Apache. When this option is set to 1, PHP will send 828 | ; RFC2616 compliant header. 829 | ; Default is zero. 830 | ; https://php.net/cgi.rfc2616-headers 831 | ;cgi.rfc2616_headers = 0 832 | 833 | ; cgi.check_shebang_line controls whether CGI PHP checks for line starting with #! 834 | ; (shebang) at the top of the running script. This line might be needed if the 835 | ; script support running both as stand-alone script and via PHP CGI<. PHP in CGI 836 | ; mode skips this line and ignores its content if this directive is turned on. 837 | ; https://php.net/cgi.check-shebang-line 838 | ;cgi.check_shebang_line=1 839 | 840 | ;;;;;;;;;;;;;;;; 841 | ; File Uploads ; 842 | ;;;;;;;;;;;;;;;; 843 | 844 | ; Whether to allow HTTP file uploads. 845 | ; https://php.net/file-uploads 846 | file_uploads = On 847 | 848 | ; Temporary directory for HTTP uploaded files (will use system default if not 849 | ; specified). 850 | ; https://php.net/upload-tmp-dir 851 | ;upload_tmp_dir = 852 | 853 | ; Maximum allowed size for uploaded files. 854 | ; https://php.net/upload-max-filesize 855 | upload_max_filesize = 2M 856 | 857 | ; Maximum number of files that can be uploaded via a single request 858 | max_file_uploads = 20 859 | 860 | ;;;;;;;;;;;;;;;;;; 861 | ; Fopen wrappers ; 862 | ;;;;;;;;;;;;;;;;;; 863 | 864 | ; Whether to allow the treatment of URLs (like http:// or ftp://) as files. 865 | ; https://php.net/allow-url-fopen 866 | allow_url_fopen = On 867 | 868 | ; Whether to allow include/require to open URLs (like https:// or ftp://) as files. 869 | ; https://php.net/allow-url-include 870 | allow_url_include = Off 871 | 872 | ; Define the anonymous ftp password (your email address). PHP's default setting 873 | ; for this is empty. 874 | ; https://php.net/from 875 | ;from="john@doe.com" 876 | 877 | ; Define the User-Agent string. PHP's default setting for this is empty. 878 | ; https://php.net/user-agent 879 | ;user_agent="PHP" 880 | 881 | ; Default timeout for socket based streams (seconds) 882 | ; https://php.net/default-socket-timeout 883 | default_socket_timeout = 60 884 | 885 | ; If your scripts have to deal with files from Macintosh systems, 886 | ; or you are running on a Mac and need to deal with files from 887 | ; unix or win32 systems, setting this flag will cause PHP to 888 | ; automatically detect the EOL character in those files so that 889 | ; fgets() and file() will work regardless of the source of the file. 890 | ; https://php.net/auto-detect-line-endings 891 | ;auto_detect_line_endings = Off 892 | 893 | ;;;;;;;;;;;;;;;;;;;;;; 894 | ; Dynamic Extensions ; 895 | ;;;;;;;;;;;;;;;;;;;;;; 896 | 897 | ; If you wish to have an extension loaded automatically, use the following 898 | ; syntax: 899 | ; 900 | ; extension=modulename 901 | ; 902 | ; For example: 903 | ; 904 | ; extension=mysqli 905 | ; 906 | ; When the extension library to load is not located in the default extension 907 | ; directory, You may specify an absolute path to the library file: 908 | ; 909 | ; extension=/path/to/extension/mysqli.so 910 | ; 911 | ; Note : The syntax used in previous PHP versions ('extension=.so' and 912 | ; 'extension='php_.dll') is supported for legacy reasons and may be 913 | ; deprecated in a future PHP major version. So, when it is possible, please 914 | ; move to the new ('extension=) syntax. 915 | ; 916 | ; Notes for Windows environments : 917 | ; 918 | ; - Many DLL files are located in the extensions/ (PHP 4) or ext/ (PHP 5+) 919 | ; extension folders as well as the separate PECL DLL download (PHP 5+). 920 | ; Be sure to appropriately set the extension_dir directive. 921 | ; 922 | ;extension=bz2 923 | ;extension=curl 924 | ;extension=ffi 925 | ;extension=ftp 926 | ;extension=fileinfo 927 | ;extension=gd 928 | ;extension=gettext 929 | ;extension=gmp 930 | ;extension=intl 931 | ;extension=imap 932 | ;extension=ldap 933 | ;extension=mbstring 934 | ;extension=exif ; Must be after mbstring as it depends on it 935 | ;extension=mysqli 936 | ;extension=oci8_12c ; Use with Oracle Database 12c Instant Client 937 | ;extension=oci8_19 ; Use with Oracle Database 19 Instant Client 938 | ;extension=odbc 939 | ;extension=openssl 940 | ;extension=pdo_firebird 941 | ;extension=pdo_mysql 942 | ;extension=pdo_oci 943 | ;extension=pdo_odbc 944 | ;extension=pdo_pgsql 945 | ;extension=pdo_sqlite 946 | ;extension=pgsql 947 | ;extension=shmop 948 | 949 | ; The MIBS data available in the PHP distribution must be installed. 950 | ; See https://www.php.net/manual/en/snmp.installation.php 951 | ;extension=snmp 952 | 953 | ;extension=soap 954 | ;extension=sockets 955 | ;extension=sodium 956 | ;extension=sqlite3 957 | ;extension=tidy 958 | ;extension=xsl 959 | 960 | ;zend_extension=opcache 961 | 962 | ;;;;;;;;;;;;;;;;;;; 963 | ; Module Settings ; 964 | ;;;;;;;;;;;;;;;;;;; 965 | 966 | [CLI Server] 967 | ; Whether the CLI web server uses ANSI color coding in its terminal output. 968 | cli_server.color = On 969 | 970 | [Date] 971 | ; Defines the default timezone used by the date functions 972 | ; https://php.net/date.timezone 973 | ;date.timezone = 974 | 975 | ; https://php.net/date.default-latitude 976 | ;date.default_latitude = 31.7667 977 | 978 | ; https://php.net/date.default-longitude 979 | ;date.default_longitude = 35.2333 980 | 981 | ; https://php.net/date.sunrise-zenith 982 | ;date.sunrise_zenith = 90.833333 983 | 984 | ; https://php.net/date.sunset-zenith 985 | ;date.sunset_zenith = 90.833333 986 | 987 | [filter] 988 | ; https://php.net/filter.default 989 | ;filter.default = unsafe_raw 990 | 991 | ; https://php.net/filter.default-flags 992 | ;filter.default_flags = 993 | 994 | [iconv] 995 | ; Use of this INI entry is deprecated, use global input_encoding instead. 996 | ; If empty, default_charset or input_encoding or iconv.input_encoding is used. 997 | ; The precedence is: default_charset < input_encoding < iconv.input_encoding 998 | ;iconv.input_encoding = 999 | 1000 | ; Use of this INI entry is deprecated, use global internal_encoding instead. 1001 | ; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. 1002 | ; The precedence is: default_charset < internal_encoding < iconv.internal_encoding 1003 | ;iconv.internal_encoding = 1004 | 1005 | ; Use of this INI entry is deprecated, use global output_encoding instead. 1006 | ; If empty, default_charset or output_encoding or iconv.output_encoding is used. 1007 | ; The precedence is: default_charset < output_encoding < iconv.output_encoding 1008 | ; To use an output encoding conversion, iconv's output handler must be set 1009 | ; otherwise output encoding conversion cannot be performed. 1010 | ;iconv.output_encoding = 1011 | 1012 | [imap] 1013 | ; rsh/ssh logins are disabled by default. Use this INI entry if you want to 1014 | ; enable them. Note that the IMAP library does not filter mailbox names before 1015 | ; passing them to rsh/ssh command, thus passing untrusted data to this function 1016 | ; with rsh/ssh enabled is insecure. 1017 | ;imap.enable_insecure_rsh=0 1018 | 1019 | [intl] 1020 | ;intl.default_locale = 1021 | ; This directive allows you to produce PHP errors when some error 1022 | ; happens within intl functions. The value is the level of the error produced. 1023 | ; Default is 0, which does not produce any errors. 1024 | ;intl.error_level = E_WARNING 1025 | ;intl.use_exceptions = 0 1026 | 1027 | [sqlite3] 1028 | ; Directory pointing to SQLite3 extensions 1029 | ; https://php.net/sqlite3.extension-dir 1030 | ;sqlite3.extension_dir = 1031 | 1032 | ; SQLite defensive mode flag (only available from SQLite 3.26+) 1033 | ; When the defensive flag is enabled, language features that allow ordinary 1034 | ; SQL to deliberately corrupt the database file are disabled. This forbids 1035 | ; writing directly to the schema, shadow tables (eg. FTS data tables), or 1036 | ; the sqlite_dbpage virtual table. 1037 | ; https://www.sqlite.org/c3ref/c_dbconfig_defensive.html 1038 | ; (for older SQLite versions, this flag has no use) 1039 | ;sqlite3.defensive = 1 1040 | 1041 | [Pcre] 1042 | ; PCRE library backtracking limit. 1043 | ; https://php.net/pcre.backtrack-limit 1044 | ;pcre.backtrack_limit=100000 1045 | 1046 | ; PCRE library recursion limit. 1047 | ; Please note that if you set this value to a high number you may consume all 1048 | ; the available process stack and eventually crash PHP (due to reaching the 1049 | ; stack size limit imposed by the Operating System). 1050 | ; https://php.net/pcre.recursion-limit 1051 | ;pcre.recursion_limit=100000 1052 | 1053 | ; Enables or disables JIT compilation of patterns. This requires the PCRE 1054 | ; library to be compiled with JIT support. 1055 | ;pcre.jit=1 1056 | 1057 | [Pdo] 1058 | ; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off" 1059 | ; https://php.net/pdo-odbc.connection-pooling 1060 | ;pdo_odbc.connection_pooling=strict 1061 | 1062 | [Pdo_mysql] 1063 | ; Default socket name for local MySQL connects. If empty, uses the built-in 1064 | ; MySQL defaults. 1065 | pdo_mysql.default_socket= 1066 | 1067 | [Phar] 1068 | ; https://php.net/phar.readonly 1069 | ;phar.readonly = On 1070 | 1071 | ; https://php.net/phar.require-hash 1072 | ;phar.require_hash = On 1073 | 1074 | ;phar.cache_list = 1075 | 1076 | [mail function] 1077 | ; For Win32 only. 1078 | ; https://php.net/smtp 1079 | SMTP = localhost 1080 | ; https://php.net/smtp-port 1081 | smtp_port = 25 1082 | 1083 | ; For Win32 only. 1084 | ; https://php.net/sendmail-from 1085 | ;sendmail_from = me@example.com 1086 | 1087 | ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). 1088 | ; https://php.net/sendmail-path 1089 | ;sendmail_path = 1090 | 1091 | ; Force the addition of the specified parameters to be passed as extra parameters 1092 | ; to the sendmail binary. These parameters will always replace the value of 1093 | ; the 5th parameter to mail(). 1094 | ;mail.force_extra_parameters = 1095 | 1096 | ; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename 1097 | mail.add_x_header = Off 1098 | 1099 | ; The path to a log file that will log all mail() calls. Log entries include 1100 | ; the full path of the script, line number, To address and headers. 1101 | ;mail.log = 1102 | ; Log mail to syslog (Event Log on Windows). 1103 | ;mail.log = syslog 1104 | 1105 | [ODBC] 1106 | ; https://php.net/odbc.default-db 1107 | ;odbc.default_db = Not yet implemented 1108 | 1109 | ; https://php.net/odbc.default-user 1110 | ;odbc.default_user = Not yet implemented 1111 | 1112 | ; https://php.net/odbc.default-pw 1113 | ;odbc.default_pw = Not yet implemented 1114 | 1115 | ; Controls the ODBC cursor model. 1116 | ; Default: SQL_CURSOR_STATIC (default). 1117 | ;odbc.default_cursortype 1118 | 1119 | ; Allow or prevent persistent links. 1120 | ; https://php.net/odbc.allow-persistent 1121 | odbc.allow_persistent = On 1122 | 1123 | ; Check that a connection is still valid before reuse. 1124 | ; https://php.net/odbc.check-persistent 1125 | odbc.check_persistent = On 1126 | 1127 | ; Maximum number of persistent links. -1 means no limit. 1128 | ; https://php.net/odbc.max-persistent 1129 | odbc.max_persistent = -1 1130 | 1131 | ; Maximum number of links (persistent + non-persistent). -1 means no limit. 1132 | ; https://php.net/odbc.max-links 1133 | odbc.max_links = -1 1134 | 1135 | ; Handling of LONG fields. Returns number of bytes to variables. 0 means 1136 | ; passthru. 1137 | ; https://php.net/odbc.defaultlrl 1138 | odbc.defaultlrl = 4096 1139 | 1140 | ; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. 1141 | ; See the documentation on odbc_binmode and odbc_longreadlen for an explanation 1142 | ; of odbc.defaultlrl and odbc.defaultbinmode 1143 | ; https://php.net/odbc.defaultbinmode 1144 | odbc.defaultbinmode = 1 1145 | 1146 | [MySQLi] 1147 | 1148 | ; Maximum number of persistent links. -1 means no limit. 1149 | ; https://php.net/mysqli.max-persistent 1150 | mysqli.max_persistent = -1 1151 | 1152 | ; Allow accessing, from PHP's perspective, local files with LOAD DATA statements 1153 | ; https://php.net/mysqli.allow_local_infile 1154 | ;mysqli.allow_local_infile = On 1155 | 1156 | ; It allows the user to specify a folder where files that can be sent via LOAD DATA 1157 | ; LOCAL can exist. It is ignored if mysqli.allow_local_infile is enabled. 1158 | ;mysqli.local_infile_directory = 1159 | 1160 | ; Allow or prevent persistent links. 1161 | ; https://php.net/mysqli.allow-persistent 1162 | mysqli.allow_persistent = On 1163 | 1164 | ; Maximum number of links. -1 means no limit. 1165 | ; https://php.net/mysqli.max-links 1166 | mysqli.max_links = -1 1167 | 1168 | ; Default port number for mysqli_connect(). If unset, mysqli_connect() will use 1169 | ; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the 1170 | ; compile-time value defined MYSQL_PORT (in that order). Win32 will only look 1171 | ; at MYSQL_PORT. 1172 | ; https://php.net/mysqli.default-port 1173 | mysqli.default_port = 3306 1174 | 1175 | ; Default socket name for local MySQL connects. If empty, uses the built-in 1176 | ; MySQL defaults. 1177 | ; https://php.net/mysqli.default-socket 1178 | mysqli.default_socket = 1179 | 1180 | ; Default host for mysqli_connect() (doesn't apply in safe mode). 1181 | ; https://php.net/mysqli.default-host 1182 | mysqli.default_host = 1183 | 1184 | ; Default user for mysqli_connect() (doesn't apply in safe mode). 1185 | ; https://php.net/mysqli.default-user 1186 | mysqli.default_user = 1187 | 1188 | ; Default password for mysqli_connect() (doesn't apply in safe mode). 1189 | ; Note that this is generally a *bad* idea to store passwords in this file. 1190 | ; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") 1191 | ; and reveal this password! And of course, any users with read access to this 1192 | ; file will be able to reveal the password as well. 1193 | ; https://php.net/mysqli.default-pw 1194 | mysqli.default_pw = 1195 | 1196 | ; Allow or prevent reconnect 1197 | mysqli.reconnect = Off 1198 | 1199 | [mysqlnd] 1200 | ; Enable / Disable collection of general statistics by mysqlnd which can be 1201 | ; used to tune and monitor MySQL operations. 1202 | mysqlnd.collect_statistics = On 1203 | 1204 | ; Enable / Disable collection of memory usage statistics by mysqlnd which can be 1205 | ; used to tune and monitor MySQL operations. 1206 | mysqlnd.collect_memory_statistics = Off 1207 | 1208 | ; Records communication from all extensions using mysqlnd to the specified log 1209 | ; file. 1210 | ; https://php.net/mysqlnd.debug 1211 | ;mysqlnd.debug = 1212 | 1213 | ; Defines which queries will be logged. 1214 | ;mysqlnd.log_mask = 0 1215 | 1216 | ; Default size of the mysqlnd memory pool, which is used by result sets. 1217 | ;mysqlnd.mempool_default_size = 16000 1218 | 1219 | ; Size of a pre-allocated buffer used when sending commands to MySQL in bytes. 1220 | ;mysqlnd.net_cmd_buffer_size = 2048 1221 | 1222 | ; Size of a pre-allocated buffer used for reading data sent by the server in 1223 | ; bytes. 1224 | ;mysqlnd.net_read_buffer_size = 32768 1225 | 1226 | ; Timeout for network requests in seconds. 1227 | ;mysqlnd.net_read_timeout = 31536000 1228 | 1229 | ; SHA-256 Authentication Plugin related. File with the MySQL server public RSA 1230 | ; key. 1231 | ;mysqlnd.sha256_server_public_key = 1232 | 1233 | [OCI8] 1234 | 1235 | ; Connection: Enables privileged connections using external 1236 | ; credentials (OCI_SYSOPER, OCI_SYSDBA) 1237 | ; https://php.net/oci8.privileged-connect 1238 | ;oci8.privileged_connect = Off 1239 | 1240 | ; Connection: The maximum number of persistent OCI8 connections per 1241 | ; process. Using -1 means no limit. 1242 | ; https://php.net/oci8.max-persistent 1243 | ;oci8.max_persistent = -1 1244 | 1245 | ; Connection: The maximum number of seconds a process is allowed to 1246 | ; maintain an idle persistent connection. Using -1 means idle 1247 | ; persistent connections will be maintained forever. 1248 | ; https://php.net/oci8.persistent-timeout 1249 | ;oci8.persistent_timeout = -1 1250 | 1251 | ; Connection: The number of seconds that must pass before issuing a 1252 | ; ping during oci_pconnect() to check the connection validity. When 1253 | ; set to 0, each oci_pconnect() will cause a ping. Using -1 disables 1254 | ; pings completely. 1255 | ; https://php.net/oci8.ping-interval 1256 | ;oci8.ping_interval = 60 1257 | 1258 | ; Connection: Set this to a user chosen connection class to be used 1259 | ; for all pooled server requests with Oracle 11g Database Resident 1260 | ; Connection Pooling (DRCP). To use DRCP, this value should be set to 1261 | ; the same string for all web servers running the same application, 1262 | ; the database pool must be configured, and the connection string must 1263 | ; specify to use a pooled server. 1264 | ;oci8.connection_class = 1265 | 1266 | ; High Availability: Using On lets PHP receive Fast Application 1267 | ; Notification (FAN) events generated when a database node fails. The 1268 | ; database must also be configured to post FAN events. 1269 | ;oci8.events = Off 1270 | 1271 | ; Tuning: This option enables statement caching, and specifies how 1272 | ; many statements to cache. Using 0 disables statement caching. 1273 | ; https://php.net/oci8.statement-cache-size 1274 | ;oci8.statement_cache_size = 20 1275 | 1276 | ; Tuning: Enables statement prefetching and sets the default number of 1277 | ; rows that will be fetched automatically after statement execution. 1278 | ; https://php.net/oci8.default-prefetch 1279 | ;oci8.default_prefetch = 100 1280 | 1281 | ; Compatibility. Using On means oci_close() will not close 1282 | ; oci_connect() and oci_new_connect() connections. 1283 | ; https://php.net/oci8.old-oci-close-semantics 1284 | ;oci8.old_oci_close_semantics = Off 1285 | 1286 | [PostgreSQL] 1287 | ; Allow or prevent persistent links. 1288 | ; https://php.net/pgsql.allow-persistent 1289 | pgsql.allow_persistent = On 1290 | 1291 | ; Detect broken persistent links always with pg_pconnect(). 1292 | ; Auto reset feature requires a little overheads. 1293 | ; https://php.net/pgsql.auto-reset-persistent 1294 | pgsql.auto_reset_persistent = Off 1295 | 1296 | ; Maximum number of persistent links. -1 means no limit. 1297 | ; https://php.net/pgsql.max-persistent 1298 | pgsql.max_persistent = -1 1299 | 1300 | ; Maximum number of links (persistent+non persistent). -1 means no limit. 1301 | ; https://php.net/pgsql.max-links 1302 | pgsql.max_links = -1 1303 | 1304 | ; Ignore PostgreSQL backends Notice message or not. 1305 | ; Notice message logging require a little overheads. 1306 | ; https://php.net/pgsql.ignore-notice 1307 | pgsql.ignore_notice = 0 1308 | 1309 | ; Log PostgreSQL backends Notice message or not. 1310 | ; Unless pgsql.ignore_notice=0, module cannot log notice message. 1311 | ; https://php.net/pgsql.log-notice 1312 | pgsql.log_notice = 0 1313 | 1314 | [bcmath] 1315 | ; Number of decimal digits for all bcmath functions. 1316 | ; https://php.net/bcmath.scale 1317 | bcmath.scale = 0 1318 | 1319 | [browscap] 1320 | ; https://php.net/browscap 1321 | ;browscap = extra/browscap.ini 1322 | 1323 | [Session] 1324 | ; Handler used to store/retrieve data. 1325 | ; https://php.net/session.save-handler 1326 | session.save_handler = files 1327 | 1328 | ; Argument passed to save_handler. In the case of files, this is the path 1329 | ; where data files are stored. Note: Windows users have to change this 1330 | ; variable in order to use PHP's session functions. 1331 | ; 1332 | ; The path can be defined as: 1333 | ; 1334 | ; session.save_path = "N;/path" 1335 | ; 1336 | ; where N is an integer. Instead of storing all the session files in 1337 | ; /path, what this will do is use subdirectories N-levels deep, and 1338 | ; store the session data in those directories. This is useful if 1339 | ; your OS has problems with many files in one directory, and is 1340 | ; a more efficient layout for servers that handle many sessions. 1341 | ; 1342 | ; NOTE 1: PHP will not create this directory structure automatically. 1343 | ; You can use the script in the ext/session dir for that purpose. 1344 | ; NOTE 2: See the section on garbage collection below if you choose to 1345 | ; use subdirectories for session storage 1346 | ; 1347 | ; The file storage module creates files using mode 600 by default. 1348 | ; You can change that by using 1349 | ; 1350 | ; session.save_path = "N;MODE;/path" 1351 | ; 1352 | ; where MODE is the octal representation of the mode. Note that this 1353 | ; does not overwrite the process's umask. 1354 | ; https://php.net/session.save-path 1355 | ;session.save_path = "/tmp" 1356 | 1357 | ; Whether to use strict session mode. 1358 | ; Strict session mode does not accept an uninitialized session ID, and 1359 | ; regenerates the session ID if the browser sends an uninitialized session ID. 1360 | ; Strict mode protects applications from session fixation via a session adoption 1361 | ; vulnerability. It is disabled by default for maximum compatibility, but 1362 | ; enabling it is encouraged. 1363 | ; https://wiki.php.net/rfc/strict_sessions 1364 | session.use_strict_mode = 0 1365 | 1366 | ; Whether to use cookies. 1367 | ; https://php.net/session.use-cookies 1368 | session.use_cookies = 1 1369 | 1370 | ; https://php.net/session.cookie-secure 1371 | ;session.cookie_secure = 1372 | 1373 | ; This option forces PHP to fetch and use a cookie for storing and maintaining 1374 | ; the session id. We encourage this operation as it's very helpful in combating 1375 | ; session hijacking when not specifying and managing your own session id. It is 1376 | ; not the be-all and end-all of session hijacking defense, but it's a good start. 1377 | ; https://php.net/session.use-only-cookies 1378 | session.use_only_cookies = 1 1379 | 1380 | ; Name of the session (used as cookie name). 1381 | ; https://php.net/session.name 1382 | session.name = PHPSESSID 1383 | 1384 | ; Initialize session on request startup. 1385 | ; https://php.net/session.auto-start 1386 | session.auto_start = 0 1387 | 1388 | ; Lifetime in seconds of cookie or, if 0, until browser is restarted. 1389 | ; https://php.net/session.cookie-lifetime 1390 | session.cookie_lifetime = 0 1391 | 1392 | ; The path for which the cookie is valid. 1393 | ; https://php.net/session.cookie-path 1394 | session.cookie_path = / 1395 | 1396 | ; The domain for which the cookie is valid. 1397 | ; https://php.net/session.cookie-domain 1398 | session.cookie_domain = 1399 | 1400 | ; Whether or not to add the httpOnly flag to the cookie, which makes it 1401 | ; inaccessible to browser scripting languages such as JavaScript. 1402 | ; https://php.net/session.cookie-httponly 1403 | session.cookie_httponly = 1404 | 1405 | ; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF) 1406 | ; Current valid values are "Strict", "Lax" or "None". When using "None", 1407 | ; make sure to include the quotes, as `none` is interpreted like `false` in ini files. 1408 | ; https://tools.ietf.org/html/draft-west-first-party-cookies-07 1409 | session.cookie_samesite = 1410 | 1411 | ; Handler used to serialize data. php is the standard serializer of PHP. 1412 | ; https://php.net/session.serialize-handler 1413 | session.serialize_handler = php 1414 | 1415 | ; Defines the probability that the 'garbage collection' process is started on every 1416 | ; session initialization. The probability is calculated by using gc_probability/gc_divisor, 1417 | ; e.g. 1/100 means there is a 1% chance that the GC process starts on each request. 1418 | ; Default Value: 1 1419 | ; Development Value: 1 1420 | ; Production Value: 1 1421 | ; https://php.net/session.gc-probability 1422 | session.gc_probability = 1 1423 | 1424 | ; Defines the probability that the 'garbage collection' process is started on every 1425 | ; session initialization. The probability is calculated by using gc_probability/gc_divisor, 1426 | ; e.g. 1/100 means there is a 1% chance that the GC process starts on each request. 1427 | ; For high volume production servers, using a value of 1000 is a more efficient approach. 1428 | ; Default Value: 100 1429 | ; Development Value: 1000 1430 | ; Production Value: 1000 1431 | ; https://php.net/session.gc-divisor 1432 | session.gc_divisor = 1000 1433 | 1434 | ; After this number of seconds, stored data will be seen as 'garbage' and 1435 | ; cleaned up by the garbage collection process. 1436 | ; https://php.net/session.gc-maxlifetime 1437 | session.gc_maxlifetime = 1440 1438 | 1439 | ; NOTE: If you are using the subdirectory option for storing session files 1440 | ; (see session.save_path above), then garbage collection does *not* 1441 | ; happen automatically. You will need to do your own garbage 1442 | ; collection through a shell script, cron entry, or some other method. 1443 | ; For example, the following script is the equivalent of setting 1444 | ; session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): 1445 | ; find /path/to/sessions -cmin +24 -type f | xargs rm 1446 | 1447 | ; Check HTTP Referer to invalidate externally stored URLs containing ids. 1448 | ; HTTP_REFERER has to contain this substring for the session to be 1449 | ; considered as valid. 1450 | ; https://php.net/session.referer-check 1451 | session.referer_check = 1452 | 1453 | ; Set to {nocache,private,public,} to determine HTTP caching aspects 1454 | ; or leave this empty to avoid sending anti-caching headers. 1455 | ; https://php.net/session.cache-limiter 1456 | session.cache_limiter = nocache 1457 | 1458 | ; Document expires after n minutes. 1459 | ; https://php.net/session.cache-expire 1460 | session.cache_expire = 180 1461 | 1462 | ; trans sid support is disabled by default. 1463 | ; Use of trans sid may risk your users' security. 1464 | ; Use this option with caution. 1465 | ; - User may send URL contains active session ID 1466 | ; to other person via. email/irc/etc. 1467 | ; - URL that contains active session ID may be stored 1468 | ; in publicly accessible computer. 1469 | ; - User may access your site with the same session ID 1470 | ; always using URL stored in browser's history or bookmarks. 1471 | ; https://php.net/session.use-trans-sid 1472 | session.use_trans_sid = 0 1473 | 1474 | ; Set session ID character length. This value could be between 22 to 256. 1475 | ; Shorter length than default is supported only for compatibility reason. 1476 | ; Users should use 32 or more chars. 1477 | ; https://php.net/session.sid-length 1478 | ; Default Value: 32 1479 | ; Development Value: 26 1480 | ; Production Value: 26 1481 | session.sid_length = 26 1482 | 1483 | ; The URL rewriter will look for URLs in a defined set of HTML tags. 1484 | ;
is special; if you include them here, the rewriter will 1485 | ; add a hidden field with the info which is otherwise appended 1486 | ; to URLs. tag's action attribute URL will not be modified 1487 | ; unless it is specified. 1488 | ; Note that all valid entries require a "=", even if no value follows. 1489 | ; Default Value: "a=href,area=href,frame=src,form=" 1490 | ; Development Value: "a=href,area=href,frame=src,form=" 1491 | ; Production Value: "a=href,area=href,frame=src,form=" 1492 | ; https://php.net/url-rewriter.tags 1493 | session.trans_sid_tags = "a=href,area=href,frame=src,form=" 1494 | 1495 | ; URL rewriter does not rewrite absolute URLs by default. 1496 | ; To enable rewrites for absolute paths, target hosts must be specified 1497 | ; at RUNTIME. i.e. use ini_set() 1498 | ; tags is special. PHP will check action attribute's URL regardless 1499 | ; of session.trans_sid_tags setting. 1500 | ; If no host is defined, HTTP_HOST will be used for allowed host. 1501 | ; Example value: php.net,www.php.net,wiki.php.net 1502 | ; Use "," for multiple hosts. No spaces are allowed. 1503 | ; Default Value: "" 1504 | ; Development Value: "" 1505 | ; Production Value: "" 1506 | ;session.trans_sid_hosts="" 1507 | 1508 | ; Define how many bits are stored in each character when converting 1509 | ; the binary hash data to something readable. 1510 | ; Possible values: 1511 | ; 4 (4 bits: 0-9, a-f) 1512 | ; 5 (5 bits: 0-9, a-v) 1513 | ; 6 (6 bits: 0-9, a-z, A-Z, "-", ",") 1514 | ; Default Value: 4 1515 | ; Development Value: 5 1516 | ; Production Value: 5 1517 | ; https://php.net/session.hash-bits-per-character 1518 | session.sid_bits_per_character = 5 1519 | 1520 | ; Enable upload progress tracking in $_SESSION 1521 | ; Default Value: On 1522 | ; Development Value: On 1523 | ; Production Value: On 1524 | ; https://php.net/session.upload-progress.enabled 1525 | ;session.upload_progress.enabled = On 1526 | 1527 | ; Cleanup the progress information as soon as all POST data has been read 1528 | ; (i.e. upload completed). 1529 | ; Default Value: On 1530 | ; Development Value: On 1531 | ; Production Value: On 1532 | ; https://php.net/session.upload-progress.cleanup 1533 | ;session.upload_progress.cleanup = On 1534 | 1535 | ; A prefix used for the upload progress key in $_SESSION 1536 | ; Default Value: "upload_progress_" 1537 | ; Development Value: "upload_progress_" 1538 | ; Production Value: "upload_progress_" 1539 | ; https://php.net/session.upload-progress.prefix 1540 | ;session.upload_progress.prefix = "upload_progress_" 1541 | 1542 | ; The index name (concatenated with the prefix) in $_SESSION 1543 | ; containing the upload progress information 1544 | ; Default Value: "PHP_SESSION_UPLOAD_PROGRESS" 1545 | ; Development Value: "PHP_SESSION_UPLOAD_PROGRESS" 1546 | ; Production Value: "PHP_SESSION_UPLOAD_PROGRESS" 1547 | ; https://php.net/session.upload-progress.name 1548 | ;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" 1549 | 1550 | ; How frequently the upload progress should be updated. 1551 | ; Given either in percentages (per-file), or in bytes 1552 | ; Default Value: "1%" 1553 | ; Development Value: "1%" 1554 | ; Production Value: "1%" 1555 | ; https://php.net/session.upload-progress.freq 1556 | ;session.upload_progress.freq = "1%" 1557 | 1558 | ; The minimum delay between updates, in seconds 1559 | ; Default Value: 1 1560 | ; Development Value: 1 1561 | ; Production Value: 1 1562 | ; https://php.net/session.upload-progress.min-freq 1563 | ;session.upload_progress.min_freq = "1" 1564 | 1565 | ; Only write session data when session data is changed. Enabled by default. 1566 | ; https://php.net/session.lazy-write 1567 | ;session.lazy_write = On 1568 | 1569 | [Assertion] 1570 | ; Switch whether to compile assertions at all (to have no overhead at run-time) 1571 | ; -1: Do not compile at all 1572 | ; 0: Jump over assertion at run-time 1573 | ; 1: Execute assertions 1574 | ; Changing from or to a negative value is only possible in php.ini! (For turning assertions on and off at run-time, see assert.active, when zend.assertions = 1) 1575 | ; Default Value: 1 1576 | ; Development Value: 1 1577 | ; Production Value: -1 1578 | ; https://php.net/zend.assertions 1579 | zend.assertions = -1 1580 | 1581 | ; Assert(expr); active by default. 1582 | ; https://php.net/assert.active 1583 | ;assert.active = On 1584 | 1585 | ; Throw an AssertionError on failed assertions 1586 | ; https://php.net/assert.exception 1587 | ;assert.exception = On 1588 | 1589 | ; Issue a PHP warning for each failed assertion. (Overridden by assert.exception if active) 1590 | ; https://php.net/assert.warning 1591 | ;assert.warning = On 1592 | 1593 | ; Don't bail out by default. 1594 | ; https://php.net/assert.bail 1595 | ;assert.bail = Off 1596 | 1597 | ; User-function to be called if an assertion fails. 1598 | ; https://php.net/assert.callback 1599 | ;assert.callback = 0 1600 | 1601 | [COM] 1602 | ; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs 1603 | ; https://php.net/com.typelib-file 1604 | ;com.typelib_file = 1605 | 1606 | ; allow Distributed-COM calls 1607 | ; https://php.net/com.allow-dcom 1608 | ;com.allow_dcom = true 1609 | 1610 | ; autoregister constants of a component's typlib on com_load() 1611 | ; https://php.net/com.autoregister-typelib 1612 | ;com.autoregister_typelib = true 1613 | 1614 | ; register constants casesensitive 1615 | ; https://php.net/com.autoregister-casesensitive 1616 | ;com.autoregister_casesensitive = false 1617 | 1618 | ; show warnings on duplicate constant registrations 1619 | ; https://php.net/com.autoregister-verbose 1620 | ;com.autoregister_verbose = true 1621 | 1622 | ; The default character set code-page to use when passing strings to and from COM objects. 1623 | ; Default: system ANSI code page 1624 | ;com.code_page= 1625 | 1626 | ; The version of the .NET framework to use. The value of the setting are the first three parts 1627 | ; of the framework's version number, separated by dots, and prefixed with "v", e.g. "v4.0.30319". 1628 | ;com.dotnet_version= 1629 | 1630 | [mbstring] 1631 | ; language for internal character representation. 1632 | ; This affects mb_send_mail() and mbstring.detect_order. 1633 | ; https://php.net/mbstring.language 1634 | ;mbstring.language = Japanese 1635 | 1636 | ; Use of this INI entry is deprecated, use global internal_encoding instead. 1637 | ; internal/script encoding. 1638 | ; Some encoding cannot work as internal encoding. (e.g. SJIS, BIG5, ISO-2022-*) 1639 | ; If empty, default_charset or internal_encoding or iconv.internal_encoding is used. 1640 | ; The precedence is: default_charset < internal_encoding < iconv.internal_encoding 1641 | ;mbstring.internal_encoding = 1642 | 1643 | ; Use of this INI entry is deprecated, use global input_encoding instead. 1644 | ; http input encoding. 1645 | ; mbstring.encoding_translation = On is needed to use this setting. 1646 | ; If empty, default_charset or input_encoding or mbstring.input is used. 1647 | ; The precedence is: default_charset < input_encoding < mbstring.http_input 1648 | ; https://php.net/mbstring.http-input 1649 | ;mbstring.http_input = 1650 | 1651 | ; Use of this INI entry is deprecated, use global output_encoding instead. 1652 | ; http output encoding. 1653 | ; mb_output_handler must be registered as output buffer to function. 1654 | ; If empty, default_charset or output_encoding or mbstring.http_output is used. 1655 | ; The precedence is: default_charset < output_encoding < mbstring.http_output 1656 | ; To use an output encoding conversion, mbstring's output handler must be set 1657 | ; otherwise output encoding conversion cannot be performed. 1658 | ; https://php.net/mbstring.http-output 1659 | ;mbstring.http_output = 1660 | 1661 | ; enable automatic encoding translation according to 1662 | ; mbstring.internal_encoding setting. Input chars are 1663 | ; converted to internal encoding by setting this to On. 1664 | ; Note: Do _not_ use automatic encoding translation for 1665 | ; portable libs/applications. 1666 | ; https://php.net/mbstring.encoding-translation 1667 | ;mbstring.encoding_translation = Off 1668 | 1669 | ; automatic encoding detection order. 1670 | ; "auto" detect order is changed according to mbstring.language 1671 | ; https://php.net/mbstring.detect-order 1672 | ;mbstring.detect_order = auto 1673 | 1674 | ; substitute_character used when character cannot be converted 1675 | ; one from another 1676 | ; https://php.net/mbstring.substitute-character 1677 | ;mbstring.substitute_character = none 1678 | 1679 | ; Enable strict encoding detection. 1680 | ;mbstring.strict_detection = Off 1681 | 1682 | ; This directive specifies the regex pattern of content types for which mb_output_handler() 1683 | ; is activated. 1684 | ; Default: mbstring.http_output_conv_mimetype=^(text/|application/xhtml\+xml) 1685 | ;mbstring.http_output_conv_mimetype= 1686 | 1687 | ; This directive specifies maximum stack depth for mbstring regular expressions. It is similar 1688 | ; to the pcre.recursion_limit for PCRE. 1689 | ;mbstring.regex_stack_limit=100000 1690 | 1691 | ; This directive specifies maximum retry count for mbstring regular expressions. It is similar 1692 | ; to the pcre.backtrack_limit for PCRE. 1693 | ;mbstring.regex_retry_limit=1000000 1694 | 1695 | [gd] 1696 | ; Tell the jpeg decode to ignore warnings and try to create 1697 | ; a gd image. The warning will then be displayed as notices 1698 | ; disabled by default 1699 | ; https://php.net/gd.jpeg-ignore-warning 1700 | ;gd.jpeg_ignore_warning = 1 1701 | 1702 | [exif] 1703 | ; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS. 1704 | ; With mbstring support this will automatically be converted into the encoding 1705 | ; given by corresponding encode setting. When empty mbstring.internal_encoding 1706 | ; is used. For the decode settings you can distinguish between motorola and 1707 | ; intel byte order. A decode setting cannot be empty. 1708 | ; https://php.net/exif.encode-unicode 1709 | ;exif.encode_unicode = ISO-8859-15 1710 | 1711 | ; https://php.net/exif.decode-unicode-motorola 1712 | ;exif.decode_unicode_motorola = UCS-2BE 1713 | 1714 | ; https://php.net/exif.decode-unicode-intel 1715 | ;exif.decode_unicode_intel = UCS-2LE 1716 | 1717 | ; https://php.net/exif.encode-jis 1718 | ;exif.encode_jis = 1719 | 1720 | ; https://php.net/exif.decode-jis-motorola 1721 | ;exif.decode_jis_motorola = JIS 1722 | 1723 | ; https://php.net/exif.decode-jis-intel 1724 | ;exif.decode_jis_intel = JIS 1725 | 1726 | [Tidy] 1727 | ; The path to a default tidy configuration file to use when using tidy 1728 | ; https://php.net/tidy.default-config 1729 | ;tidy.default_config = /usr/local/lib/php/default.tcfg 1730 | 1731 | ; Should tidy clean and repair output automatically? 1732 | ; WARNING: Do not use this option if you are generating non-html content 1733 | ; such as dynamic images 1734 | ; https://php.net/tidy.clean-output 1735 | tidy.clean_output = Off 1736 | 1737 | [soap] 1738 | ; Enables or disables WSDL caching feature. 1739 | ; https://php.net/soap.wsdl-cache-enabled 1740 | soap.wsdl_cache_enabled=1 1741 | 1742 | ; Sets the directory name where SOAP extension will put cache files. 1743 | ; https://php.net/soap.wsdl-cache-dir 1744 | soap.wsdl_cache_dir="/tmp" 1745 | 1746 | ; (time to live) Sets the number of second while cached file will be used 1747 | ; instead of original one. 1748 | ; https://php.net/soap.wsdl-cache-ttl 1749 | soap.wsdl_cache_ttl=86400 1750 | 1751 | ; Sets the size of the cache limit. (Max. number of WSDL files to cache) 1752 | soap.wsdl_cache_limit = 5 1753 | 1754 | [sysvshm] 1755 | ; A default size of the shared memory segment 1756 | ;sysvshm.init_mem = 10000 1757 | 1758 | [ldap] 1759 | ; Sets the maximum number of open links or -1 for unlimited. 1760 | ldap.max_links = -1 1761 | 1762 | [dba] 1763 | ;dba.default_handler= 1764 | 1765 | [opcache] 1766 | ; Determines if Zend OPCache is enabled 1767 | ;opcache.enable=1 1768 | 1769 | ; Determines if Zend OPCache is enabled for the CLI version of PHP 1770 | ;opcache.enable_cli=0 1771 | 1772 | ; The OPcache shared memory storage size. 1773 | ;opcache.memory_consumption=128 1774 | 1775 | ; The amount of memory for interned strings in Mbytes. 1776 | ;opcache.interned_strings_buffer=8 1777 | 1778 | ; The maximum number of keys (scripts) in the OPcache hash table. 1779 | ; Only numbers between 200 and 1000000 are allowed. 1780 | ;opcache.max_accelerated_files=10000 1781 | 1782 | ; The maximum percentage of "wasted" memory until a restart is scheduled. 1783 | ;opcache.max_wasted_percentage=5 1784 | 1785 | ; When this directive is enabled, the OPcache appends the current working 1786 | ; directory to the script key, thus eliminating possible collisions between 1787 | ; files with the same name (basename). Disabling the directive improves 1788 | ; performance, but may break existing applications. 1789 | ;opcache.use_cwd=1 1790 | 1791 | ; When disabled, you must reset the OPcache manually or restart the 1792 | ; webserver for changes to the filesystem to take effect. 1793 | ;opcache.validate_timestamps=1 1794 | 1795 | ; How often (in seconds) to check file timestamps for changes to the shared 1796 | ; memory storage allocation. ("1" means validate once per second, but only 1797 | ; once per request. "0" means always validate) 1798 | ;opcache.revalidate_freq=2 1799 | 1800 | ; Enables or disables file search in include_path optimization 1801 | ;opcache.revalidate_path=0 1802 | 1803 | ; If disabled, all PHPDoc comments are dropped from the code to reduce the 1804 | ; size of the optimized code. 1805 | ;opcache.save_comments=1 1806 | 1807 | ; If enabled, compilation warnings (including notices and deprecations) will 1808 | ; be recorded and replayed each time a file is included. Otherwise, compilation 1809 | ; warnings will only be emitted when the file is first cached. 1810 | ;opcache.record_warnings=0 1811 | 1812 | ; Allow file existence override (file_exists, etc.) performance feature. 1813 | ;opcache.enable_file_override=0 1814 | 1815 | ; A bitmask, where each bit enables or disables the appropriate OPcache 1816 | ; passes 1817 | ;opcache.optimization_level=0x7FFFBFFF 1818 | 1819 | ;opcache.dups_fix=0 1820 | 1821 | ; The location of the OPcache blacklist file (wildcards allowed). 1822 | ; Each OPcache blacklist file is a text file that holds the names of files 1823 | ; that should not be accelerated. The file format is to add each filename 1824 | ; to a new line. The filename may be a full path or just a file prefix 1825 | ; (i.e., /var/www/x blacklists all the files and directories in /var/www 1826 | ; that start with 'x'). Line starting with a ; are ignored (comments). 1827 | ;opcache.blacklist_filename= 1828 | 1829 | ; Allows exclusion of large files from being cached. By default all files 1830 | ; are cached. 1831 | ;opcache.max_file_size=0 1832 | 1833 | ; Check the cache checksum each N requests. 1834 | ; The default value of "0" means that the checks are disabled. 1835 | ;opcache.consistency_checks=0 1836 | 1837 | ; How long to wait (in seconds) for a scheduled restart to begin if the cache 1838 | ; is not being accessed. 1839 | ;opcache.force_restart_timeout=180 1840 | 1841 | ; OPcache error_log file name. Empty string assumes "stderr". 1842 | ;opcache.error_log= 1843 | 1844 | ; All OPcache errors go to the Web server log. 1845 | ; By default, only fatal errors (level 0) or errors (level 1) are logged. 1846 | ; You can also enable warnings (level 2), info messages (level 3) or 1847 | ; debug messages (level 4). 1848 | ;opcache.log_verbosity_level=1 1849 | 1850 | ; Preferred Shared Memory back-end. Leave empty and let the system decide. 1851 | ;opcache.preferred_memory_model= 1852 | 1853 | ; Protect the shared memory from unexpected writing during script execution. 1854 | ; Useful for internal debugging only. 1855 | ;opcache.protect_memory=0 1856 | 1857 | ; Allows calling OPcache API functions only from PHP scripts which path is 1858 | ; started from specified string. The default "" means no restriction 1859 | ;opcache.restrict_api= 1860 | 1861 | ; Mapping base of shared memory segments (for Windows only). All the PHP 1862 | ; processes have to map shared memory into the same address space. This 1863 | ; directive allows to manually fix the "Unable to reattach to base address" 1864 | ; errors. 1865 | ;opcache.mmap_base= 1866 | 1867 | ; Facilitates multiple OPcache instances per user (for Windows only). All PHP 1868 | ; processes with the same cache ID and user share an OPcache instance. 1869 | ;opcache.cache_id= 1870 | 1871 | ; Enables and sets the second level cache directory. 1872 | ; It should improve performance when SHM memory is full, at server restart or 1873 | ; SHM reset. The default "" disables file based caching. 1874 | ;opcache.file_cache= 1875 | 1876 | ; Enables or disables opcode caching in shared memory. 1877 | ;opcache.file_cache_only=0 1878 | 1879 | ; Enables or disables checksum validation when script loaded from file cache. 1880 | ;opcache.file_cache_consistency_checks=1 1881 | 1882 | ; Implies opcache.file_cache_only=1 for a certain process that failed to 1883 | ; reattach to the shared memory (for Windows only). Explicitly enabled file 1884 | ; cache is required. 1885 | ;opcache.file_cache_fallback=1 1886 | 1887 | ; Enables or disables copying of PHP code (text segment) into HUGE PAGES. 1888 | ; This should improve performance, but requires appropriate OS configuration. 1889 | ;opcache.huge_code_pages=1 1890 | 1891 | ; Validate cached file permissions. 1892 | ;opcache.validate_permission=0 1893 | 1894 | ; Prevent name collisions in chroot'ed environment. 1895 | ;opcache.validate_root=0 1896 | 1897 | ; If specified, it produces opcode dumps for debugging different stages of 1898 | ; optimizations. 1899 | ;opcache.opt_debug_level=0 1900 | 1901 | ; Specifies a PHP script that is going to be compiled and executed at server 1902 | ; start-up. 1903 | ; https://php.net/opcache.preload 1904 | ;opcache.preload= 1905 | 1906 | ; Preloading code as root is not allowed for security reasons. This directive 1907 | ; facilitates to let the preloading to be run as another user. 1908 | ; https://php.net/opcache.preload_user 1909 | ;opcache.preload_user= 1910 | 1911 | ; Prevents caching files that are less than this number of seconds old. It 1912 | ; protects from caching of incompletely updated files. In case all file updates 1913 | ; on your site are atomic, you may increase performance by setting it to "0". 1914 | ;opcache.file_update_protection=2 1915 | 1916 | ; Absolute path used to store shared lockfiles (for *nix only). 1917 | ;opcache.lockfile_path=/tmp 1918 | 1919 | [curl] 1920 | ; A default value for the CURLOPT_CAINFO option. This is required to be an 1921 | ; absolute path. 1922 | ;curl.cainfo = 1923 | 1924 | [openssl] 1925 | ; The location of a Certificate Authority (CA) file on the local filesystem 1926 | ; to use when verifying the identity of SSL/TLS peers. Most users should 1927 | ; not specify a value for this directive as PHP will attempt to use the 1928 | ; OS-managed cert stores in its absence. If specified, this value may still 1929 | ; be overridden on a per-stream basis via the "cafile" SSL stream context 1930 | ; option. 1931 | ;openssl.cafile= 1932 | 1933 | ; If openssl.cafile is not specified or if the CA file is not found, the 1934 | ; directory pointed to by openssl.capath is searched for a suitable 1935 | ; certificate. This value must be a correctly hashed certificate directory. 1936 | ; Most users should not specify a value for this directive as PHP will 1937 | ; attempt to use the OS-managed cert stores in its absence. If specified, 1938 | ; this value may still be overridden on a per-stream basis via the "capath" 1939 | ; SSL stream context option. 1940 | ;openssl.capath= 1941 | 1942 | [ffi] 1943 | ; FFI API restriction. Possible values: 1944 | ; "preload" - enabled in CLI scripts and preloaded files (default) 1945 | ; "false" - always disabled 1946 | ; "true" - always enabled 1947 | ;ffi.enable=preload 1948 | 1949 | ; List of headers files to preload, wildcard patterns allowed. 1950 | ;ffi.preload= 1951 | -------------------------------------------------------------------------------- /files/supervisord.conf: -------------------------------------------------------------------------------- 1 | [supervisord] 2 | nodaemon=true 3 | logfile=/dev/null 4 | logfile_maxbytes=0 5 | pidfile=/var/run/supervisord.pid 6 | loglevel = INFO 7 | 8 | [program:php-fpm] 9 | command = /usr/local/sbin/php-fpm 10 | autostart=true 11 | autorestart=true 12 | priority=5 13 | stdout_logfile=/dev/stdout 14 | stdout_logfile_maxbytes=0 15 | stderr_logfile=/dev/stderr 16 | stderr_logfile_maxbytes=0 17 | 18 | [program:nginx] 19 | command=/usr/sbin/nginx -g "daemon off;" 20 | autostart=true 21 | autorestart=true 22 | priority=10 23 | stdout_events_enabled=true 24 | stderr_events_enabled=true 25 | stdout_logfile=/dev/stdout 26 | stdout_logfile_maxbytes=0 27 | stderr_logfile=/dev/stderr 28 | stderr_logfile_maxbytes=0 29 | -------------------------------------------------------------------------------- /fpm-alpine-docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | 3 | services: 4 | 5 | akaunting: 6 | build: 7 | dockerfile: fpm-alpine.Dockerfile 8 | context: . 9 | akaunting-proxy: 10 | image: nginx:1.19.0-alpine -------------------------------------------------------------------------------- /fpm-alpine-nginx-composer-docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | services: 3 | 4 | akaunting: 5 | build: 6 | dockerfile: fpm-alpine-nginx-composer.Dockerfile 7 | context: . -------------------------------------------------------------------------------- /fpm-alpine-nginx-composer-supervisor-docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | services: 3 | 4 | akaunting: 5 | build: 6 | dockerfile: fpm-alpine-nginx-composer-supervisor.Dockerfile 7 | context: . -------------------------------------------------------------------------------- /fpm-alpine-nginx-composer-supervisor.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.1-fpm-alpine3.15 2 | 3 | # Arguments defined in docker-compose.yml 4 | ARG AKAUNTING_DOCKERFILE_VERSION=0.1 5 | ARG SUPPORTED_LOCALES="en_US.UTF-8" 6 | 7 | # Add Repositories 8 | RUN rm -f /etc/apk/repositories &&\ 9 | echo "http://dl-cdn.alpinelinux.org/alpine/v3.15/main" >> /etc/apk/repositories && \ 10 | echo "http://dl-cdn.alpinelinux.org/alpine/v3.15/community" >> /etc/apk/repositories 11 | 12 | # Add Dependencies 13 | RUN apk add --update --no-cache \ 14 | gcc \ 15 | g++ \ 16 | make \ 17 | python3 \ 18 | supervisor \ 19 | vim \ 20 | bash \ 21 | nodejs \ 22 | npm \ 23 | git \ 24 | nginx 25 | 26 | ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/ 27 | 28 | # Install PHP Extensions 29 | RUN chmod +x /usr/local/bin/install-php-extensions && sync && \ 30 | install-php-extensions gd zip intl imap xsl pgsql opcache bcmath mysqli pdo_mysql redis 31 | 32 | # Configure Extension 33 | RUN docker-php-ext-configure \ 34 | opcache --enable-opcache 35 | 36 | # Installing composer 37 | RUN curl -sS https://getcomposer.org/installer -o composer-setup.php 38 | RUN php composer-setup.php --install-dir=/usr/local/bin --filename=composer 39 | RUN rm -rf composer-setup.php 40 | 41 | # Clear npm proxy 42 | RUN npm config rm proxy 43 | RUN npm config rm https-proxy 44 | 45 | # Download Akaunting application 46 | RUN mkdir -p /var/www/html 47 | 48 | # Setup Working Dir 49 | WORKDIR /var/www/html 50 | 51 | RUN git clone https://github.com/akaunting/akaunting.git . 52 | RUN chown -R www-data:www-data /var/www/html 53 | USER www-data 54 | RUN composer prod 55 | RUN npm install 56 | RUN npm run prod 57 | 58 | COPY files/akaunting-php-fpm-nginx-supervisord.sh /usr/local/bin/akaunting-php-fpm-nginx-supervisord.sh 59 | COPY files/html /var/www/html 60 | 61 | USER root 62 | 63 | EXPOSE 9000 64 | ENTRYPOINT ["/usr/local/bin/akaunting-php-fpm-nginx-supervisord.sh"] 65 | CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/conf.d/supervisord.conf"] 66 | -------------------------------------------------------------------------------- /fpm-alpine-nginx-composer.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.1-fpm-alpine3.15 2 | 3 | # Arguments defined in docker-compose.yml 4 | ARG AKAUNTING_DOCKERFILE_VERSION=0.1 5 | ARG SUPPORTED_LOCALES="en_US.UTF-8" 6 | 7 | # Add Repositories 8 | RUN rm -f /etc/apk/repositories &&\ 9 | echo "http://dl-cdn.alpinelinux.org/alpine/v3.15/main" >> /etc/apk/repositories && \ 10 | echo "http://dl-cdn.alpinelinux.org/alpine/v3.15/community" >> /etc/apk/repositories 11 | 12 | # Add Dependencies 13 | RUN apk add --update --no-cache \ 14 | gcc \ 15 | g++ \ 16 | make \ 17 | python3 \ 18 | nano \ 19 | bash \ 20 | nodejs \ 21 | npm \ 22 | git \ 23 | nginx 24 | 25 | ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/ 26 | 27 | # Install PHP Extensions 28 | RUN chmod +x /usr/local/bin/install-php-extensions && sync && \ 29 | install-php-extensions gd zip intl imap xsl pgsql opcache bcmath mysqli pdo_mysql redis 30 | 31 | # Configure Extension 32 | RUN docker-php-ext-configure \ 33 | opcache --enable-opcache 34 | 35 | # Installing composer 36 | RUN curl -sS https://getcomposer.org/installer -o composer-setup.php 37 | RUN php composer-setup.php --install-dir=/usr/local/bin --filename=composer 38 | RUN rm -rf composer-setup.php 39 | 40 | # Clear npm proxy 41 | RUN npm config rm proxy 42 | RUN npm config rm https-proxy 43 | 44 | # Download Akaunting application 45 | RUN mkdir -p /var/www/html 46 | 47 | # Setup Working Dir 48 | WORKDIR /var/www/html 49 | 50 | RUN git clone https://github.com/akaunting/akaunting.git . 51 | RUN chown -R www-data:www-data /var/www/html 52 | USER www-data 53 | RUN composer prod 54 | RUN npm install 55 | RUN npm run prod 56 | 57 | COPY files/akaunting-php-fpm-nginx.sh /usr/local/bin/akaunting-php-fpm-nginx.sh 58 | COPY files/html /var/www/html 59 | 60 | USER root 61 | 62 | EXPOSE 9000 63 | ENTRYPOINT ["/usr/local/bin/akaunting-php-fpm-nginx.sh"] 64 | CMD ["--start"] -------------------------------------------------------------------------------- /fpm-alpine-nginx-docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | 3 | services: 4 | 5 | akaunting: 6 | container_name: akaunting 7 | build: 8 | dockerfile: fpm-alpine-nginx.Dockerfile 9 | context: . 10 | volumes: 11 | - akaunting-data:/var/www/html 12 | - ./files/php.ini:/usr/local/etc/php/php.ini 13 | - ./files/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf 14 | - ./nginx/nginx.conf:/etc/nginx/nginx.conf 15 | restart: unless-stopped 16 | ports: 17 | - 8080:80 18 | env_file: 19 | - env/run.env 20 | environment: 21 | - AKAUNTING_SETUP 22 | depends_on: 23 | - akaunting-db 24 | 25 | akaunting-db: 26 | container_name: akaunting-db 27 | image: mariadb 28 | volumes: 29 | - akaunting-db:/var/lib/mysql 30 | restart: unless-stopped 31 | env_file: 32 | - env/db.env 33 | 34 | volumes: 35 | akaunting-data: 36 | akaunting-db: 37 | -------------------------------------------------------------------------------- /fpm-alpine-nginx.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.1-fpm-alpine3.15 2 | 3 | # Arguments defined in docker-compose.yml 4 | ARG AKAUNTING_DOCKERFILE_VERSION=0.1 5 | ARG SUPPORTED_LOCALES="en_US.UTF-8" 6 | 7 | # Add Repositories 8 | RUN rm -f /etc/apk/repositories &&\ 9 | echo "http://dl-cdn.alpinelinux.org/alpine/v3.15/main" >> /etc/apk/repositories && \ 10 | echo "http://dl-cdn.alpinelinux.org/alpine/v3.15/community" >> /etc/apk/repositories 11 | 12 | # Add Dependencies 13 | RUN apk add --update --no-cache \ 14 | nano \ 15 | bash \ 16 | nginx 17 | 18 | ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/ 19 | 20 | # Install PHP Extensions 21 | RUN chmod +x /usr/local/bin/install-php-extensions && sync && \ 22 | install-php-extensions gd zip intl imap xsl pgsql opcache bcmath mysqli pdo_mysql 23 | 24 | # Configure Extension 25 | RUN docker-php-ext-configure \ 26 | opcache --enable-opcache 27 | 28 | # Download Akaunting application 29 | RUN mkdir -p /var/www/akaunting \ 30 | && curl -Lo /tmp/akaunting.zip 'https://akaunting.com/download.php?version=latest&utm_source=docker&utm_campaign=developers' \ 31 | && unzip /tmp/akaunting.zip -d /var/www/html \ 32 | && rm -f /tmp/akaunting.zip 33 | 34 | COPY files/akaunting-php-fpm-nginx.sh /usr/local/bin/akaunting-php-fpm-nginx.sh 35 | COPY files/html /var/www/html 36 | 37 | # Setup Working Dir 38 | WORKDIR /var/www/html 39 | 40 | EXPOSE 9000 41 | ENTRYPOINT ["/usr/local/bin/akaunting-php-fpm-nginx.sh"] 42 | CMD ["--start"] -------------------------------------------------------------------------------- /fpm-alpine.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.1-fpm-alpine3.15 2 | 3 | # Arguments defined in docker-compose.yml 4 | ARG AKAUNTING_DOCKERFILE_VERSION=0.1 5 | ARG SUPPORTED_LOCALES="en_US.UTF-8" 6 | 7 | # Add Repositories 8 | RUN rm -f /etc/apk/repositories &&\ 9 | echo "http://dl-cdn.alpinelinux.org/alpine/v3.15/main" >> /etc/apk/repositories && \ 10 | echo "http://dl-cdn.alpinelinux.org/alpine/v3.15/community" >> /etc/apk/repositories 11 | 12 | # Add Build Dependencies 13 | RUN apk add --no-cache --virtual .build-deps \ 14 | zlib-dev \ 15 | libjpeg-turbo-dev \ 16 | libpng-dev \ 17 | libxml2-dev \ 18 | bzip2-dev \ 19 | zip \ 20 | libzip-dev 21 | 22 | # Add Production Dependencies 23 | RUN apk add --update --no-cache \ 24 | jpegoptim \ 25 | pngquant \ 26 | optipng \ 27 | supervisor \ 28 | nano \ 29 | bash \ 30 | icu-dev \ 31 | freetype-dev \ 32 | mysql-client 33 | 34 | ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/ 35 | 36 | # Install PHP Extensions 37 | RUN chmod +x /usr/local/bin/install-php-extensions && sync && \ 38 | install-php-extensions gd zip intl imap xsl pgsql opcache bcmath mysqli pdo_mysql redis pcntl 39 | 40 | # Configure Extension 41 | RUN docker-php-ext-configure \ 42 | opcache --enable-opcache 43 | 44 | # Download Akaunting application 45 | RUN mkdir -p /var/www/akaunting \ 46 | && curl -Lo /tmp/akaunting.zip 'https://akaunting.com/download.php?version=latest&utm_source=docker&utm_campaign=developers' \ 47 | && unzip /tmp/akaunting.zip -d /var/www/html \ 48 | && rm -f /tmp/akaunting.zip 49 | 50 | COPY files/akaunting-php-fpm.sh /usr/local/bin/akaunting-php-fpm.sh 51 | COPY files/html /var/www/html 52 | 53 | # Setup Working Dir 54 | WORKDIR /var/www/html 55 | 56 | EXPOSE 9000 57 | ENTRYPOINT ["/usr/local/bin/akaunting-php-fpm.sh"] 58 | CMD ["--start"] -------------------------------------------------------------------------------- /fpm-docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | 3 | services: 4 | 5 | akaunting: 6 | container_name: akaunting 7 | build: 8 | dockerfile: fpm.Dockerfile 9 | context: . 10 | volumes: 11 | - akaunting-data:/var/www/html 12 | restart: unless-stopped 13 | env_file: 14 | - env/run.env 15 | environment: 16 | - AKAUNTING_SETUP 17 | depends_on: 18 | - akaunting-db 19 | 20 | akaunting-proxy: 21 | image: nginx:1.19.0 22 | ports: 23 | - 8080:80 24 | depends_on: 25 | - akaunting 26 | volumes: 27 | - akaunting-data:/var/www/html 28 | - ./nginx/templates:/etc/nginx/templates 29 | 30 | akaunting-db: 31 | container_name: akaunting-db 32 | image: mariadb 33 | volumes: 34 | - akaunting-db:/var/lib/mysql 35 | restart: unless-stopped 36 | env_file: 37 | - env/db.env 38 | 39 | volumes: 40 | akaunting-data: 41 | akaunting-db: 42 | -------------------------------------------------------------------------------- /fpm.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.1-fpm 2 | 3 | # Arguments defined in docker-compose.yml 4 | ARG AKAUNTING_DOCKERFILE_VERSION=0.1 5 | ARG SUPPORTED_LOCALES="en_US.UTF-8" 6 | 7 | RUN apt-get update \ 8 | && apt-get -y upgrade --no-install-recommends \ 9 | && apt-get install -y \ 10 | build-essential \ 11 | imagemagick \ 12 | libfreetype6-dev \ 13 | libicu-dev \ 14 | libjpeg62-turbo-dev \ 15 | libjpeg-dev \ 16 | libmcrypt-dev \ 17 | libonig-dev \ 18 | libpng-dev \ 19 | libpq-dev \ 20 | libssl-dev \ 21 | libxml2-dev \ 22 | libxrender1 \ 23 | libzip-dev \ 24 | locales \ 25 | openssl \ 26 | unzip \ 27 | zip \ 28 | zlib1g-dev \ 29 | --no-install-recommends \ 30 | && apt-get clean && rm -rf /var/lib/apt/lists/* 31 | 32 | RUN for locale in ${SUPPORTED_LOCALES}; do \ 33 | sed -i 's/^# '"${locale}/${locale}/" /etc/locale.gen; done \ 34 | && locale-gen 35 | 36 | RUN docker-php-ext-configure gd \ 37 | --with-freetype \ 38 | --with-jpeg \ 39 | && docker-php-ext-install -j$(nproc) \ 40 | gd \ 41 | bcmath \ 42 | intl \ 43 | mbstring \ 44 | pcntl \ 45 | pdo \ 46 | pdo_mysql \ 47 | zip 48 | 49 | # Download Akaunting application 50 | RUN mkdir -p /var/www/akaunting \ 51 | && curl -Lo /tmp/akaunting.zip 'https://akaunting.com/download.php?version=latest&utm_source=docker&utm_campaign=developers' \ 52 | && unzip /tmp/akaunting.zip -d /var/www/html \ 53 | && rm -f /tmp/akaunting.zip 54 | 55 | COPY files/akaunting-php-fpm.sh /usr/local/bin/akaunting-php-fpm.sh 56 | COPY files/html /var/www/html 57 | 58 | # Set working directory 59 | WORKDIR /var/www/html 60 | 61 | EXPOSE 9000 62 | ENTRYPOINT ["/usr/local/bin/akaunting-php-fpm.sh"] 63 | CMD ["--start"] 64 | -------------------------------------------------------------------------------- /nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | # Generic startup file. 2 | user www-data; 3 | 4 | #usually equal to number of CPUs you have. run command "grep processor /proc/cpuinfo | wc -l" to find it 5 | worker_processes auto; 6 | worker_cpu_affinity auto; 7 | 8 | error_log /var/log/nginx/error.log; 9 | pid /var/run/nginx.pid; 10 | 11 | # Keeps the logs free of messages about not being able to bind(). 12 | #daemon off; 13 | 14 | events { 15 | worker_connections 1024; 16 | } 17 | 18 | http { 19 | # rewrite_log on; 20 | 21 | include mime.types; 22 | default_type application/octet-stream; 23 | access_log /var/log/nginx/access.log; 24 | sendfile on; 25 | # tcp_nopush on; 26 | keepalive_timeout 64; 27 | # tcp_nodelay on; 28 | # gzip on; 29 | #php max upload limit cannot be larger than this 30 | client_max_body_size 13m; 31 | index index.php index.html index.htm; 32 | 33 | # Upstream to abstract backend connection(s) for PHP. 34 | upstream php { 35 | #this should match value of "listen" directive in php-fpm pool 36 | server unix:/tmp/php-fpm.sock; 37 | server localhost:9000; 38 | } 39 | 40 | server { 41 | listen 80 default_server; 42 | 43 | server_name _; 44 | 45 | root /var/www/html; 46 | 47 | add_header X-Frame-Options "SAMEORIGIN"; 48 | add_header X-XSS-Protection "1; mode=block"; 49 | add_header X-Content-Type-Options "nosniff"; 50 | 51 | index index.html index.htm index.php; 52 | 53 | charset utf-8; 54 | 55 | location / { 56 | try_files $uri $uri/ /index.php?$query_string; 57 | } 58 | 59 | # Prevent Direct Access To Protected Files 60 | location ~ \.(env|log) { 61 | deny all; 62 | } 63 | 64 | # Prevent Direct Access To Protected Folders 65 | location ~ ^/(^app$|bootstrap|config|database|overrides|resources|routes|storage|tests|artisan) { 66 | deny all; 67 | } 68 | 69 | # Prevent Direct Access To modules/vendor Folders Except Assets 70 | location ~ ^/(modules|vendor)\/(.*)\.((?!ico|gif|jpg|jpeg|png|js\b|css|less|sass|font|woff|woff2|eot|ttf|svg).)*$ { 71 | deny all; 72 | } 73 | 74 | error_page 404 /index.php; 75 | 76 | # Pass PHP Scripts To FastCGI Server 77 | location ~ \.php$ { 78 | fastcgi_split_path_info ^(.+\.php)(/.+)$; 79 | fastcgi_pass php; 80 | fastcgi_index index.php; 81 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 82 | include fastcgi_params; 83 | } 84 | 85 | location ~ /\.(?!well-known).* { 86 | deny all; 87 | } 88 | } 89 | } -------------------------------------------------------------------------------- /nginx/templates/default.conf.template: -------------------------------------------------------------------------------- 1 | upstream php { 2 | server unix:/tmp/php-fpm.sock; 3 | server akaunting:9000; 4 | } 5 | 6 | server { 7 | listen 80 default_server; 8 | 9 | server_name _; 10 | 11 | root /var/www/html; 12 | 13 | add_header X-Frame-Options "SAMEORIGIN"; 14 | add_header X-XSS-Protection "1; mode=block"; 15 | add_header X-Content-Type-Options "nosniff"; 16 | 17 | index index.html index.htm index.php; 18 | 19 | charset utf-8; 20 | 21 | location / { 22 | try_files $uri $uri/ /index.php?$query_string; 23 | } 24 | 25 | # Prevent Direct Access To Protected Files 26 | location ~ \.(env|log) { 27 | deny all; 28 | } 29 | 30 | # Prevent Direct Access To Protected Folders 31 | location ~ ^/(^app$|bootstrap|config|database|overrides|resources|routes|storage|tests|artisan) { 32 | deny all; 33 | } 34 | 35 | # Prevent Direct Access To modules/vendor Folders Except Assets 36 | location ~ ^/(modules|vendor)\/(.*)\.((?!ico|gif|jpg|jpeg|png|js\b|css|less|sass|font|woff|woff2|eot|ttf|svg).)*$ { 37 | deny all; 38 | } 39 | 40 | error_page 404 /index.php; 41 | 42 | # Pass PHP Scripts To FastCGI Server 43 | location ~ \.php$ { 44 | fastcgi_split_path_info ^(.+\.php)(/.+)$; 45 | fastcgi_pass php; 46 | fastcgi_index index.php; 47 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 48 | include fastcgi_params; 49 | } 50 | 51 | location ~ /\.(?!well-known).* { 52 | deny all; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /v-docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | 3 | services: 4 | 5 | akaunting: 6 | container_name: akaunting 7 | build: 8 | dockerfile: v.Dockerfile 9 | context: . 10 | ports: 11 | - 8080:80 12 | volumes: 13 | - akaunting-data:/var/www/html 14 | restart: unless-stopped 15 | env_file: 16 | - env/run.env 17 | environment: 18 | - AKAUNTING_SETUP 19 | depends_on: 20 | - akaunting-db 21 | 22 | akaunting-db: 23 | container_name: akaunting-db 24 | image: mariadb 25 | volumes: 26 | - akaunting-db:/var/lib/mysql 27 | restart: unless-stopped 28 | env_file: 29 | - env/db.env 30 | 31 | volumes: 32 | akaunting-data: 33 | akaunting-db: 34 | -------------------------------------------------------------------------------- /v.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.1-apache 2 | 3 | ARG AKAUNTING_DOCKERFILE_VERSION=0.1 4 | ARG SUPPORTED_LOCALES="en_US.UTF-8" 5 | 6 | RUN apt-get update \ 7 | && apt-get -y upgrade --no-install-recommends \ 8 | && apt-get install -y \ 9 | build-essential \ 10 | imagemagick \ 11 | libfreetype6-dev \ 12 | libicu-dev \ 13 | libjpeg62-turbo-dev \ 14 | libjpeg-dev \ 15 | libmcrypt-dev \ 16 | libonig-dev \ 17 | libpng-dev \ 18 | libpq-dev \ 19 | libssl-dev \ 20 | libxml2-dev \ 21 | libxrender1 \ 22 | libzip-dev \ 23 | locales \ 24 | openssl \ 25 | unzip \ 26 | zip \ 27 | zlib1g-dev \ 28 | --no-install-recommends \ 29 | && apt-get clean && rm -rf /var/lib/apt/lists/* 30 | 31 | RUN for locale in ${SUPPORTED_LOCALES}; do \ 32 | sed -i 's/^# '"${locale}/${locale}/" /etc/locale.gen; done \ 33 | && locale-gen 34 | 35 | RUN docker-php-ext-configure gd \ 36 | --with-freetype \ 37 | --with-jpeg \ 38 | && docker-php-ext-install -j$(nproc) \ 39 | gd \ 40 | bcmath \ 41 | intl \ 42 | mbstring \ 43 | pcntl \ 44 | pdo \ 45 | pdo_mysql \ 46 | zip 47 | 48 | RUN pecl install redis && docker-php-ext-enable redis 49 | 50 | RUN curl -Lo /tmp/akaunting.zip 'https://akaunting.com/download.php?version=latest&utm_source=docker&utm_campaign=developers' 51 | 52 | COPY files/akaunting-v.sh /usr/local/bin/akaunting-v.sh 53 | COPY files/html /var/www/html 54 | 55 | ENTRYPOINT ["/usr/local/bin/akaunting-v.sh"] 56 | CMD ["--start"] 57 | --------------------------------------------------------------------------------