Archived
1
0
Fork 0

Compare commits

...

19 commits

Author SHA1 Message Date
b58c283a4b Release 2.26 which incorporates the following changes
All checks were successful
continuous-integration/drone/push Build is passing
- Add a ENV_DIR for docker containers to allow changing the env file location changes where the rest of the configuration is bootstrapped from
- Add log_dir and snapshot_dir in env file configuration to determine the log and snapshot directories
- Massively cleaned up README and provide better examples
2023-04-06 22:56:41 +02:00
5805279633 Release 2.26 which incorporates the following changes (#1)
Some checks reported errors
continuous-integration/drone/push Build was killed
- Add a ENV_DIR for docker containers to allow changing the env file location changes where the rest of the configuration is bootstrapped from
- Add log_dir and snapshot_dir in env file configuration to determine the log and snapshot directories
- Massively cleaned up README and provide better examples

Co-authored-by: Varakh <varakh@varakh.de>
Reviewed-on: #1
2023-04-06 20:55:21 +00:00
b61677ebe8 Use master as release branch, add drone pipeline and periodic rebuilds #noissue
All checks were successful
continuous-integration/drone/push Build is passing
2023-03-25 09:28:18 +01:00
fc7abd4ba1 Prepare 2.2.6 dev cycle 2022-12-17 00:44:58 +01:00
00e96ef7ae Update version and make ts3web docker image use alpine 3.15 as base, partially upgrade symfony dependencies and prepare for 2.2.5 release 2022-12-17 00:42:16 +01:00
21e2758323 Align with default umask 022 #noissue 2022-09-05 20:38:08 +02:00
3d4c3e6e42 Update external git reference #noissue 2022-07-05 22:09:17 +02:00
f327088771 Change links for moving away from GitHub 2022-07-05 17:46:47 +02:00
fb578fd670 Adapt README to outline permissions even more required for docker setup 2022-01-23 11:20:18 +01:00
ab546d6536 Prepare next release cycle 2022-01-19 20:45:30 +01:00
c842685155 Release 2.2.4 with updated dependencies and fixed composer install in docker image 2022-01-19 20:45:29 +01:00
7241874e5d Be more precise on the README #noissue 2021-05-24 15:40:31 +02:00
41234b34bf Use 4 spaces as tabs and reformat 2021-05-21 01:05:38 +02:00
df2d9520ca Prepare next release cycle 2021-02-08 17:21:49 +01:00
31c99cc668 Release 2.2.3 with an updated docker base 2021-02-08 17:19:59 +01:00
36023ec566
Adapt README to changed docker image paths 2021-02-08 10:05:58 +01:00
0df0cadede Add new docker image based on latest alpine 2021-02-08 09:55:35 +01:00
b3f201e87d Adapt README 2021-02-07 14:46:40 +01:00
fe5b6f72f6 Prepare next dev cycle 2020-03-22 13:45:04 +01:00
343 changed files with 3091 additions and 679 deletions

57
.drone.yml Normal file
View file

@ -0,0 +1,57 @@
---
kind: pipeline
type: docker
name: default
trigger:
event:
include:
- push
- cron
branch:
- master
environment: &default_environment
REVISION: ${DRONE_COMMIT_SHA}
CREATED: ${DRONE_BUILD_CREATED}
SOURCE_URL: ${DRONE_GIT_HTTP_URL}
# also change in 'tags' of build docker
TS3WEB_VERSION: 2.2.6
steps:
- name: build docker image
image: plugins/docker
environment:
<<: *default_environment
settings:
purge: true
repo: varakh/ts3web
username:
from_secret: dockerhub_user
password:
from_secret: dockerhub_key
tags:
- latest
- 2.2.6
- name: notify
image: drillster/drone-email
settings:
subject: "Build failed"
body: "URL ${DRONE_BUILD_LINK}"
host:
from_secret: mail_host
username:
from_secret: mail_user
password:
from_secret: mail_password
from:
from_secret: mail_from
when:
status:
- failure
---
kind: signature
hmac: f575a63bd85c4a95593be5e077373216fbd50ad57e6b3d1db56f950e881ed2a5
...

6
.editorconfig Normal file
View file

@ -0,0 +1,6 @@
[*]
end_of_line = lf
insert_final_newline = true
charset = utf-8
indent_style = space
indent_size = 4

2
.gitignore vendored
View file

@ -1,7 +1,7 @@
bin/* bin/*
!bin/.gitkeep !bin/.gitkeep
config/env config/env
composer.lock composer.phar
cache/* cache/*
!cache/.gitkeep !cache/.gitkeep
public/images/* public/images/*

View file

@ -1,17 +1,41 @@
# CHANGELOG # CHANGELOG
## UNRELEASED ## 2.2.6 - 2023/04/06
_Quick update for an outdated application to make it more useful for docker setups. Keep in mind that PHP 7.4 which is used by ts3web is still EOL!_
* Made it possible to use environment variable to define location of bootstrapping `env` file in docker containers (natively, set php-fpm `ENV[]` properly!)
* `ENV_DIR`: location of the **PARENT** folder which has the `env` file inside
* Falls back to application `$appDir/config/env` file if not set
* Added new `env` file variables to easily configure
* `log_dir`: location of the log dir, _without trailing slash_
* `snapshot_dir` location of the snapshots dir, _without trailing slash_
## 2.2.5 - 2022/12/17
* Updated `Dockerfile` (as long as alpine 3.15 shipping PHP7 is kept updated, `ts3web` docker images are kept)
* Updated some symfony dependencies
## 2.2.4 - 2022/01/19
* Updated dependencies
* This application will be EOL once PHP7 is not supported anymore
## 2.2.3 - 2021/01/08
* Change docker base to alpine
## 2.2.2 - 2020/03/22 ## 2.2.2 - 2020/03/22
* Stop auto-sorting tables * Stop auto-sorting tables
* Add bandwidth formatter * Add bandwidth formatter
* Check PHP 7.4 compatibility * Check PHP 7.4 compatibility
* Increase docker image base to PHP 7.4 * Increase docker image base to PHP 7.4
## 2.2.1 - 2019/11/10 ## 2.2.1 - 2019/11/10
* Use separate JavaScript file to initialize DataTables * Use separate JavaScript file to initialize DataTables
## 2.2.0 - 2019/11/10 ## 2.2.0 - 2019/11/10
* Add version tag to footer * Add version tag to footer
* Add sortable tables * Add sortable tables
* Add search on tables * Add search on tables
@ -20,22 +44,27 @@
* Fix dependency version * Fix dependency version
## 2.1.4 - 2019/11/08 ## 2.1.4 - 2019/11/08
* Use autofocus on username input field instead of the password field * Use autofocus on username input field instead of the password field
* Fill missing cells on incorrect cell count in table views when only partial data is available * Fill missing cells on incorrect cell count in table views when only partial data is available
## 2.1.3 - 2019/08/08 ## 2.1.3 - 2019/08/08
* Fixed false rendering of forms * Fixed false rendering of forms
* Fixed channel tree view showing the wrong virtual server after selection * Fixed channel tree view showing the wrong virtual server after selection
* Minor code refactor * Minor code refactor
## 2.1.2 - 2019/08/07 ## 2.1.2 - 2019/08/07
* Minor refactoring * Minor refactoring
* Update documentation * Update documentation
## 2.1.1 - 2019/08/07 ## 2.1.1 - 2019/08/07
* Updated translation * Updated translation
## 2.1.0 - 2019/08/07 ## 2.1.0 - 2019/08/07
* Fixed file handling on snapshots * Fixed file handling on snapshots
* Cleaned up template links * Cleaned up template links
* Updated documentation * Updated documentation
@ -46,6 +75,7 @@
* Removed about modal * Removed about modal
## 2.0.0 - 2019/08/06 ## 2.0.0 - 2019/08/06
* Replace material design with bootstrap4 theme * Replace material design with bootstrap4 theme
* Add an about modal * Add an about modal
* Add tree view for online clients * Add tree view for online clients
@ -53,34 +83,45 @@
* Update dependencies and force PHP 7.3 * Update dependencies and force PHP 7.3
## 1.2.4 - 2019/01/18 ## 1.2.4 - 2019/01/18
* No info text * No info text
## 1.2.3 - 2019/01/18 ## 1.2.3 - 2019/01/18
* No info text * No info text
## 1.2.2 - 2018/09/01 ## 1.2.2 - 2018/09/01
* No info text * No info text
## 1.2.1 - 2018/06/04 ## 1.2.1 - 2018/06/04
* No info text * No info text
## 1.2.0 - 2018/06/04 ## 1.2.0 - 2018/06/04
* No info text * No info text
## 1.1.1 - 2018/05/04 ## 1.1.1 - 2018/05/04
* No info text * No info text
## 1.1.0 - 2018/05/04 ## 1.1.0 - 2018/05/04
* No info text * No info text
## 1.0.3 - 2018/04/04 ## 1.0.3 - 2018/04/04
* No info text * No info text
## 1.0.2 - 2018/04/04 ## 1.0.2 - 2018/04/04
* No info text * No info text
## 1.0.1 - 2018/04/03 ## 1.0.1 - 2018/04/03
* No info text * No info text
## 1.0.0 - 2018/04/03 ## 1.0.0 - 2018/04/03
* No info text * No info text

85
Dockerfile Normal file
View file

@ -0,0 +1,85 @@
FROM alpine:3.15
LABEL maintainer="Varakh<varakh@varakh.de>"
ENV APP_HOME=/var/www/html/application \
PHP_MEMORY_LIMIT=512M \
MAX_UPLOAD=1024M \
PHP_MAX_FILE_UPLOAD=200 \
PHP_MAX_POST=1024M
# setup folder structure
RUN mkdir -p ${APP_HOME}/data/snapshots && \
mkdir -p ${APP_HOME}/log && \
touch ${APP_HOME}/log/application.log && \
mkdir -p ${APP_HOME}/config
# entrypoint
ADD docker/configure.php /configure.php
# add upstream application
ADD src ${APP_HOME}/src
ADD public ${APP_HOME}/public
ADD composer.json ${APP_HOME}/composer.json
ADD composer.lock ${APP_HOME}/composer.lock
ADD data ${APP_HOME}/data
ADD config ${APP_HOME}/config
# install dependencies
RUN cp ${APP_HOME}/config/env.example ${APP_HOME}/config/env && \
apk add --update --no-cache \
bash \
nginx \
s6 \
curl \
git \
php7 \
php7-fpm \
php7-cli \
php7-intl \
php7-curl \
php7-json \
php7-dom \
php7-simplexml \
php7-pcntl \
php7-posix \
php7-mcrypt \
php7-session \
php7-gd \
php7-phar \
php7-fileinfo \
php7-mbstring \
php7-ctype \
php7-ldap \
php7-openssl \
php7-pecl-memcached \
memcached \
ca-certificates && \
rm -rf /var/cache/apk/* && \
apk add gnu-libiconv --update-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ --allow-untrusted && \
# set environments/php
sed -i "s|;*memory_limit =.*|memory_limit = ${PHP_MEMORY_LIMIT}|i" /etc/php7/php.ini && \
sed -i "s|;*upload_max_filesize =.*|upload_max_filesize = ${MAX_UPLOAD}|i" /etc/php7/php.ini && \
sed -i "s|;*max_file_uploads =.*|max_file_uploads = ${PHP_MAX_FILE_UPLOAD}|i" /etc/php7/php.ini && \
sed -i "s|;*post_max_size =.*|post_max_size = ${PHP_MAX_POST}|i" /etc/php7/php.ini && \
# prepare php
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
# prepare application
cd ${APP_HOME} && composer install && \
# clean up and permissions
rm -rf /var/cache/apk/* && \
chown nobody:nginx -R ${APP_HOME}
# Add nginx config
ADD docker/nginx.conf /etc/nginx/nginx.conf
# Add required environment variables to php-fpm
RUN echo "env[ENV_DIR]=%%%ENV_DIR%%%" >> /etc/php7/php-fpm.d/www.conf
EXPOSE 80
# add overlay
ADD docker/s6 /etc/s6/
# expose start
CMD /usr/bin/php /configure.php && exec s6-svscan /etc/s6/

288
README.md Executable file → Normal file
View file

@ -1,10 +1,22 @@
# README # README
[![Build Status](https://drone.myservermanager.com/api/badges/varakh/ts3web/status.svg)](https://drone.myservermanager.com/varakh/ts3web)
ts3web is a free and open-source web interface for TeamSpeak 3 instances. ts3web is a free and open-source web interface for TeamSpeak 3 instances.
The minimalistic approach of this application is intentional. The minimalistic approach of this application is intentional.
* Docker images available on [https://hub.docker.com/r/varakh/ts3web](https://hub.docker.com/r/varakh/ts3web) * Docker images available on [https://hub.docker.com/r/varakh/ts3web](https://hub.docker.com/r/varakh/ts3web)
* Sources are hosted on [https://github.com/v4rakh/ts3web](https://github.com/v4rakh/ts3web) * Sources are hosted on [https://git.myservermanager.com/varakh/ts3web](https://git.myservermanager.com/varakh/ts3web)
There are many TeamSpeak 3 web interfaces out. Why should I pick ts3web? Free, simple, stateless, easy to extend,
standard bootstrap theme.
The main git repository is hosted at
_[https://git.myservermanager.com/varakh/ts3web](https://git.myservermanager.com/varakh/ts3web)_.
Other repositories are mirrors and pull requests, issues, and planning are managed there.
Contributions are very welcome!
## Limitations ## Limitations
@ -14,120 +26,147 @@ supported:
* uploading files (only viewing and deleting, use the official client for uploading) * uploading files (only viewing and deleting, use the official client for uploading)
* editing permissions (only viewing, use the client for editing) * editing permissions (only viewing, use the client for editing)
## F.A.Q ## READ BEFORE USING
###### There are lots of TeamSpeak 3 web interfaces out. Why should I pick ts3web? This web interface makes **heavy use of TeamSpeak 3 server query commands**. Please ensure that you _increase query
Free, simple, stateless, easy to extend, standard bootstrap theme. limits_ and whitelist the requesting IP address to a `whitelist.txt` when in a docker environment (see below).
###### I always get `TSException: Error: host isn't a ts3 instance!` when selecting a server. Please read the next sections carefully.
You probably got query banned from your server. You need to properly define your `whitelist.txt` file and include it in
your TeamSpeak application.
## Configuration ## Setup
The main configuration file is the `env` file located in `config/`. There's an example file called `env.example`
which you **need** to copy to `config/env`. Defaults will assume you're running your TeamSpeak server on `localhost` with
default port. Docker deployments can and *should* host bind this file into the container directly and just maintain the
`env` file.
## Deployment _ts3web_ can be deployed natively or via docker. It's recommended to use docker with docker-compose. Those steps are
The application can be deployed in different ways. See below for more information. For each deployment type a running outlined below.
TeamSpeak 3 instance is a prerequisite (except for the `docker-compose.yml` type which will start also the server if
needed).
### Exposed volumes on docker images ### docker-compose
* Snapshots are saved in `/var/www/html/application/data/snapshots`. You should create a volume for this location if
you're using docker as deployment type.
* Logs are saved in `/var/www/html/application/log` for docker containers. You should create a volume
for this location if you're using docker as deployment type. You should also create the log file `application.log` already.
**Important**: Ensure that host binds have permissions set up properly. The user which is used in the docker container General remarks:
is `www-data` with id `82`. If, e.g. logs are host bound, then execute `chown -R 82:82 host/path/to/log`.
The same holds true for snapshots.
### Usage with docker-compose * By default, `/var/www/html/application/config/env` is used for bootstrapping necessary configuration, can be set to another parent directory with `ENV_DIR` in docker environment variable, e.g., `ENV_DIR=/data`
The recommended way is to use docker-compose. The `network_mode = "host"` is required in order to show correct IP * By default, `/var/www/html/application/data/snapshots` is used for storing snapshots, path can be changed in the `env` file with `snapshot_dir`
addresses of connected TeamSpeak users. * By default, `/var/www/html/application/log` is used for storing and reading logs, path can be changed in the `env` file with `log_dir`
* Other `env` configuration values are outlined in the [env.example](./config/env.example) file which is also present in the default docker image.
1. The web interface will not be able to use `localhost` as TeamSpeak 3 server address because it's not available in a It's recommended to use the `network=HOST` option for the docker setup, and it will be the only example in this `README` file.
docker container when _not_ using the `host` network. Thus the`whitelist.txt` **must** include your public TeamSpeak 3
server IP for this example setup.
2. The public address also has to match the environment variable `teamspeak_host=your-public-address` within
the `env` file referenced in the example `docker-compose`.
Let's create the docker volumes first. You could also use automatically generated ones by the `docker-compose` file, you
would need to remove the `external: true` in the `volumes` section of the `docker-compose.yml` then.
Create the external volumes:
```shell
docker volume create ts3-vol
docker volume create ts3web-vol
``` ```
Paste the example `docker-compose.yml` into a file on your machine:
```yaml
version: '2.1' version: '2.1'
networks: networks:
teamspeak: teamspeak:
external: false external: false
services: services:
app: app:
container_name: teamspeak_app container_name: teamspeak_app
image: teamspeak:latest image: teamspeak:latest
volumes: volumes:
- ./app:/var/ts3server - ts3-vol:/var/ts3server
- ./whitelist.txt:/whitelist.txt # ports are all public here in the HOST mode example
ports:
- 10011:10011
- 30033:30033
- 9987:9987/udp
environment: environment:
- TS3SERVER_LICENSE=accept - TS3SERVER_LICENSE=accept
- TS3SERVER_IP_WHITELIST=/whitelist.txt - TS3SERVER_IP_WHITELIST=/var/ts3server/whitelist.txt
restart: always restart: unless-stopped
network_mode: "host" network_mode: "host"
web: web:
container_name: teamspeak_web container_name: teamspeak_web
image: teamspeak_web:latest image: varakh/ts3web:latest
volumes: volumes:
- ./env:/var/www/html/application/config/env - ts3web-vol:/data
- ./snapshots:/var/www/html/application/data/snapshots environment:
- ./log:/var/www/html/application/log # volume needs to contain the env file!
- ENV_DIR=/data
ports: ports:
- 127.0.0.1:8181:80 - 127.0.0.1:8181:80
depends_on: depends_on:
- app - app
restart: always restart: unless-stopped
networks: networks:
- teamspeak - teamspeak
volumes:
ts3-vol:
ts3web-vol:
``` ```
Now execute `docker-compose up -d` to start those containers. If you like to update, do `docker-compose down`, Let's populate our docker volumes **before** we start!
`docker-compose pull` and then `docker-compose up -d` again.
Your TeamSpeak 3 Server will be available under `public-server-ip:9987`. The web interface will be available on ```shell
`127.0.0.1:8181`. You need to add a reverse proxy and probably you also want SSL configured if you expose it via domain. docker run -d --rm --name ts3web_creator -v ts3web-vol:/mnt alpine tail -f /dev/null
For testing purposes, change `- 127.0.0.1:8181:80` to `- 8181:80`. The web interface will then be available under docker exec -it ts3web_creator sh
`public-server-ip:8181`. This is **not recommended**! Secure your setup properly via reverse proxy and SSL!
### Usage as single docker container # inside the container, edit the env by copying the example to the docker volume mount path at /data/env
* Copy `env.example` to `env` and adjust to your needs. It's recommended to make it persistent outside of the container. cp /var/www/html/application/config/env /data/env
* Create a container with the image, e.g. `docker run --name teamspeak_web -v ./env:/var/www/html/application/config/env -p 8181:80 varakh/ts3web:latest`.
* Make sure that if TeamSpeak and ts3web share the same docker instance and that they should be put into one network and the subnet **needs be added to teamspeak's query whitelist**.
* Point your browser to `8181` to see the web interface.
### Usage as native application # edit the env file to your liking
**Prerequisite**: `php`, `composer` and probably `php-fpm` installed on the server. #
# the teamspeak_host should point to your public ip address and must be whitelisted inside the teamspeak server itself
vi env
To install: # create necessary directories and set permissions
* Clone repository mkdir -p /data/log
* Change directory to project home touch /data/log/application.log
* Execute `composer install` mkdir -p /data/snapshots
* `composer install` chown -R 65534:65534 /data
* Do the configuration by coping the `env.example` file (see information above)
* Use a web server or run directly via PHP server: `php -S localhost:8080 -t public public/index.php` (point browser to [localhost:8080](http://localhost:8080))
To upgrade: # exit the container
* Change directory to project home exit
* `git pull`
* `composer update`
### Web server setup
* Example `nginx.conf` for **standalone** deployment without SSL:
# on the host system, stop the creator container
docker stop ts3web_creator
``` ```
Let's populate the teamspeak container with a proper `whitelist.txt` file. See [ensure that you're whitelisting the IP from which the webinterface will issue commands](#whitelisttextfile).
```shell
docker run -d --rm --name ts3_creator -v ts3-vol:/mnt alpine tail -f /dev/null
docker exec -it ts3_creator sh
# edit the whitelist.txt file at /var/ts3server/whitelist.txt
# it should contain the following entries
#
# 127.0.0.1
# ::1
# your-public-ip
#
vi /var/ts3server/whitelist.txt
# exit the container
exit
# on the host system, stop the creator container
docker stop ts3_creator
```
Maybe you like to copy valid license files into the `ts3-vol` docker volume before stopping.
_Finally_, start the stack with `docker-compose up -d`. Please see the **Reverse proxy** section for a nginx example.
### Reverse proxy
Here's an example on how to configure a reverse proxy for the web interface docker container
```shell
root .../public; root .../public;
index index.php; index index.php;
# enable and setup if you have a certificate (highly recommended)
#ssl on;
#ssl_certificate fullchain.pem;
#ssl_certificate_key privkey.pem;
rewrite_log on; rewrite_log on;
location / { location / {
@ -146,36 +185,94 @@ To upgrade:
} }
``` ```
* Example `nginx.conf` as **reverse proxy** with SSL: ## Native application
**Prerequisite**: `php`, `composer` and probably `php-fpm` installed on the server.
### Install
* Clone repository
* Change directory to project home
* Execute `composer install`
* `composer install`
* Do the configuration by coping the `env.example` file (see information above)
* Use a web server _or_ run directly via the embedded PHP server: `php -S localhost:8080 -t public public/index.php`.
* Point your browser to [localhost:8080](http://localhost:8080)
* Apply any [whitelist.txt](#whitelist-text-file) changes if you configured `teamspeak_host` differently
than `localhost`
### Upgrade
* Change directory to project home
* `git pull`
* `composer update`
## Troubleshooting / F.A.Q
<a name="flood"></a>
### How to overcome server query limit?
You might get one of these messages:
> I always get `flood client` message when clicking anywhere in the web interface.
The web UI uses query commands _a lot_! When your instance is up and running, you should be able to change the following
setting, e.g. directly in your database (MySQL or sqlite).
```ini
serverinstance_serverquery_flood_commands = 9999
serverinstance_serverquery_max_connections_per_ip = 999
serverinstance_serverquery_flood_time = 1
```
<a name="whitelist"></a>
> I always get `TSException: Error: host isn't a ts3 instance!` when selecting a server.
You're probably on a docker environment and the TeamSpeak server is queried through the web UI which
resides behind a web server, so the TeamSpeak server thinks that the _remote web server IP address_ invokes the query
commands and thus blacklists it.
You need define an exception for you server's IP in a [`whitelist.txt`](#whitelisttextfile) file and include it in
your TeamSpeak application.
You can also add the desired IP to `query_ip_allowlist.txt` and `query_ip_whitelist.txt` within the TeamSpeak 3 Server
data directory.
<a name="dockerperms"></a>
### I always get `no write permissions` or something similar when trying to save snapshots or when a log entry is created.
This probably happens when you're in the docker setup. Ensure that host binds have permissions set up properly and also files inside any
docker volume has the correct permissions. The user which is used in the docker container is `nobody` with id `65534`.
Change owner permissions recursively with `chown -R 65534:65534 /path/to/dir`.
<a name="whitelisttextfile"></a>
### What's a whitelist.txt and why do I need it?
The following illustrates a valid `whitelist.txt` file which can be used for the above `docker-compose` setups. You need
to replace `your-public-ip` with the TeamSpeak's public IP address if required or remove the fixed internal docker IP if
you're on 'host' mode.
``` ```
server { 127.0.0.1
listen 443 ssl http2; ::1
server_name teamspeak.domain.tld; 10.5.0.5
your-public-ip
ssl on;
ssl_certificate fullchain.pem;
ssl_certificate_key privkey.pem;
location / {
proxy_pass http://localhost:8181;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
``` ```
## Development ## Development
Contributions are welcome!
### Release ### Release
* Set a date in the `CHANGELOG.md` file * Set a date in the `CHANGELOG.md` file
* Remove `SNAPSHOT` from the version in `Constants.php` * Remove `SNAPSHOT` from the version in `Constants.php`
* Build the docker image from the project * Build the docker image from the project
* if necessary, add GitHub access token to let composer pull dependencies within the image correctly: * if necessary, add GitHub access token to let composer pull dependencies within the image correctly:
add `&& composer config --global --auth github-oauth.github.com <token> \` before the `composer install` command, add `&& composer config --global --auth github-oauth.github.com <token> \` before the `composer install` command,
where `<token>` can be retrieved from [GitHub settings](https://github.com/settings/tokens) where `<token>` can be retrieved from [GitHub settings](https://github.com/settings/tokens)
* execute `docker build -t varakh/ts3web:latest -t varakh/ts3web:<releaseTag> -f docker/Dockerfile .` to build * execute `sudo docker build --no-cache -t varakh/ts3web:latest .` to build
* publish it * publish it
* Tag the release git commit and create a new release in the VCS web interface * Tag the release git commit and create a new release in the VCS web interface
@ -187,7 +284,9 @@ To upgrade:
4. Don't forget to clean up all created branches 4. Don't forget to clean up all created branches
### Helpers ### Helpers
Attributes can be defined when including `table`, `keyvalues` and `form` templates of twig. This helps to generate tables and forms without the need to specify all attributes.
Attributes can be defined when including `table`, `keyvalues` and `form` templates of twig. This helps to generate
tables and forms without the need to specify all attributes.
``` ```
hiddenDependingOnAttribute // hides a row depending on a value in a table hiddenDependingOnAttribute // hides a row depending on a value in a table
@ -202,10 +301,15 @@ fields // define fields for a form
See example usage in the folder `View/bootstrap4`. See example usage in the folder `View/bootstrap4`.
### Translations ### Translations
- This app uses Symfony Translator. It's bootstrapped in `Util\BootstrapHelper` and locales are placed under `data/locale/` and the data table `.json` file, e.g. `en_dataTable.json`. Adjust to your needs or help translating.
- Form fields (name/id should be the same) are also translated. For a field named `content` or `ConT enT` translate `form_field_content`. - This app uses Symfony Translator. It's bootstrapped in `Util\BootstrapHelper` and locales are placed
under `data/locale/` and the data table `.json` file, e.g. `en_dataTable.json`. Adjust to your needs or help
translating.
- Form fields (name/id should be the same) are also translated. For a field named `content` or `ConT enT`
translate `form_field_content`.
### Theme ### Theme
Themes can be chosen in the `env` file by editing the `theme` variable. Templates are mapped to the corresponding view Themes can be chosen in the `env` file by editing the `theme` variable. Templates are mapped to the corresponding view
folder in `src/View/<themeName>`. `.css`, `.js` and other style files like `.ttf` or `.woff2` for fonts should be placed folder in `src/View/<themeName>`. `.css`, `.js` and other style files like `.ttf` or `.woff2` for fonts should be placed
in `public/theme/<themeName>` and accessed accordingly. See an example in `src/View/boostrap4/layout.twig`. in `public/theme/<themeName>` and accessed accordingly. See an example in `src/View/boostrap4/layout.twig`.

View file

@ -1,6 +1,6 @@
{ {
"require": { "require": {
"php": ">= 7.3", "php": "^7.4",
"slim/slim": "3.12.2", "slim/slim": "3.12.2",
"monolog/monolog": "1.25.1", "monolog/monolog": "1.25.1",
"slim/twig-view": "2.5.0", "slim/twig-view": "2.5.0",

2110
composer.lock generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -8,15 +8,15 @@ class Constants
/** /**
* Years tag * Years tag
*/ */
const YEARS = '2020'; const YEARS = '2020-2023';
/** /**
* Version tag * Version tag
*/ */
const VERSION = '2.2.2'; const VERSION = '2.2.6';
/** /**
* Return constant by it's class name * Return constant by its class name
* *
* @param $value * @param $value
* @return string|null * @return string|null

View file

@ -8,12 +8,27 @@ class EnvConstants
/** /**
* Example env file * Example env file
*/ */
const ENV_FILE_EXAMPLE = "env.example"; const FILE_NAME_EXAMPLE_ENV = "env.example";
/** /**
* Custom env file * Custom env file
*/ */
const ENV_FILE = "env"; const FILE_NAME_ENV = "env";
/**
* The path to the env file
*/
const ENV_DIR = "ENV_DIR";
/**
* The path to the logs directory
*/
const LOG_DIR = "log_dir";
/**
* The path to the snapshots directory
*/
const SNAPSHOT_DIR = "snapshot_dir";
/** /**
* Site title * Site title
@ -31,7 +46,7 @@ class EnvConstants
const SITE_DATE_FORMAT = "site_date_format"; const SITE_DATE_FORMAT = "site_date_format";
/** /**
* THeme * Theme
*/ */
const THEME = "theme"; const THEME = "theme";

View file

@ -8,12 +8,16 @@ theme="bootstrap4" # values: bootstrap4 (foldernames are used to determine theme
theme_cache=false # values: true|false (cache view/twig. makes it faster, disable for debug) theme_cache=false # values: true|false (cache view/twig. makes it faster, disable for debug)
# teamspeak # teamspeak
teamspeak_host="localhost" # 'localhost' or 'name_of_docker_container' if running locally teamspeak_host="app" # 'localhost' or 'name_of_docker_container|name_of_the_docker-compose_service' if running locally
teamspeak_query_port=10011 teamspeak_query_port=10011
teamspeak_user="serveradmin" teamspeak_user="serveradmin"
teamspeak_tree_view="true" # show a tree view in the details of online clients if a server has been selected teamspeak_tree_view="true" # show a tree view in the details of online clients if a server has been selected
teamspeak_log_lines=100 # show this amount of latest log lines teamspeak_log_lines=100 # show this amount of latest log lines
# log # log
log_dir=/var/www/html/application/log
log_name="ts3web" # values: all strings log_name="ts3web" # values: all strings
log_level="INFO" # values: DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY log_level="INFO" # values: DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY
# snapshots
snapshot_dir=/var/www/html/application/data/snapshots

View file

@ -1,26 +0,0 @@
FROM phpearth/php:7.4-nginx
# install deps
RUN apk add --no-cache git \
&& apk add --no-cache composer
# adjust nginx
COPY docker/default.conf /etc/nginx/conf.d/default.conf
COPY docker/nginx.conf /etc/nginx/nginx.conf
RUN sed -i "s|upload_max_filesize = 2M|upload_max_filesize = 1024M|g" /etc/php/7.4/php.ini \
&& sed -i "s|post_max_size = 8M|post_max_size = 1024M|g" /etc/php/7.4/php.ini \
&& sed -i "s|max_execution_time = 30|max_execution_time = 86400|g" /etc/php/7.4/php.ini
# copy application and set permissions
COPY config/ /var/www/html/application/config/
COPY data/ /var/www/html/application/data/
COPY public/ /var/www/html/application/public/
COPY src/ /var/www/html/application/src/
COPY composer.json /var/www/html/application/composer.json
RUN mkdir -p /var/www/html/application/bin/ \
&& mkdir -p /var/www/html/application/cache/ \
&& chown -R www-data:www-data /var/www/html/application
# initialize app
RUN cd /var/www/html/application/ \
&& composer install

22
docker/configure.php Normal file
View file

@ -0,0 +1,22 @@
#!/usr/bin/env php
<?php
echo "Adapting ENV_DIR..." . PHP_EOL;
$path = '/etc/php7/php-fpm.d/www.conf';
$env = "ENV_DIR";
$fileContent = file_get_contents($path);
$fileContent = preg_replace("/%%%" . strtoupper($env) . "%%%/", env($env, "/var/www/html/application/config"), $fileContent);
file_put_contents($path, $fileContent);
function env($name, $default = null)
{
$v = getenv($name) ?: $default;
if ($v === null) {
return "''";
}
return "'" . $v . "'";
}

View file

@ -1,30 +0,0 @@
# copied to /etc/nginx/conf.d/default.conf
server {
listen 80 default_server;
root /var/www/html/application/public;
index index.html index.htm index.php;
server_name _;
charset utf-8;
location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; access_log off; }
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php-fpm.sock;
include fastcgi.conf;
}
error_page 404 /index.php;
location ~ /\.ht {
deny all;
}
}

View file

@ -1,96 +1,41 @@
# /etc/nginx/nginx.conf daemon off;
pid /run/nginx.pid;
user nginx; worker_processes 1;
# Set number of worker processes automatically based on number of CPU cores.
worker_processes auto;
# Enables the use of JIT for regular expressions to speed-up their processing.
pcre_jit on;
# Configures default error logger.
error_log /var/log/nginx/error.log warn;
# Includes files with directives to load dynamic modules.
include /etc/nginx/modules/*.conf;
events { events {
# The maximum number of simultaneous connections that can be opened by
# a worker process.
worker_connections 1024; worker_connections 1024;
} }
http { http {
# Includes mapping of file name extensions to MIME types of responses include mime.types;
# and defines the default type.
include /etc/nginx/mime.types;
default_type application/octet-stream; default_type application/octet-stream;
# Name servers used to resolve names of upstream servers into addresses.
# It's also needed when using tcpsocket and udpsocket in Lua modules.
#resolver 208.67.222.222 208.67.220.220;
# Don't tell nginx version to clients.
server_tokens off;
# Specifies the maximum accepted body size of a client request, as
# indicated by the request header Content-Length. If the stated content
# length is greater than this size, then the client receives the HTTP
# error code 413. Set to 0 to disable.
client_max_body_size 1024m;
# Timeout for keep-alive connections. Server will close connections after
# this time.
keepalive_timeout 65;
# Sendfile copies data between one FD and other from within the kernel,
# which is more efficient than read() + write().
sendfile on; sendfile on;
keepalive_timeout 65;
gzip off;
client_max_body_size 0;
# Don't buffer data-sends (disable Nagle algorithm). server {
# Good for sending frequent small bursts of data in real time. listen 80;
tcp_nodelay on; root /var/www/html/application/public;
index index.php index.html;
# Causes nginx to attempt to send its HTTP response head in one packet, rewrite_log on;
# instead of using partial frames.
#tcp_nopush on;
location / {
# Path of the file with Diffie-Hellman parameters for EDH ciphers. try_files $uri $uri/ @ee;
#ssl_dhparam /etc/ssl/nginx/dh2048.pem; }
# Specifies that our cipher suits should be preferred over client ciphers. location @ee {
ssl_prefer_server_ciphers on; rewrite ^(.*) /index.php?$1 last;
}
# Enables a shared SSL cache with size that can hold around 8000 sessions.
ssl_session_cache shared:SSL:2m; location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# Enable gzipping of responses. fastcgi_pass 127.0.0.1:9000;
gzip on; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
# Set the Vary HTTP header as defined in the RFC 2616. include fastcgi_params;
gzip_vary on; }
}
# Enable checking the existence of precompressed files.
#gzip_static on;
# Specifies the main log format.
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# Sets the path, format, and configuration for a buffered log write.
access_log /var/log/nginx/access.log main;
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
# Includes virtual hosts configs.
include /etc/nginx/conf.d/*.conf;
} }

3
docker/s6/nginx/run Executable file
View file

@ -0,0 +1,3 @@
#!/bin/sh
exec /usr/sbin/nginx

3
docker/s6/php-fpm/run Executable file
View file

@ -0,0 +1,3 @@
#!/bin/sh
exec /usr/sbin/php-fpm7 --nodaemonize

0
public/images/flags/ad.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 643 B

After

Width:  |  Height:  |  Size: 643 B

0
public/images/flags/ae.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 408 B

After

Width:  |  Height:  |  Size: 408 B

0
public/images/flags/af.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 604 B

After

Width:  |  Height:  |  Size: 604 B

0
public/images/flags/ag.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 591 B

After

Width:  |  Height:  |  Size: 591 B

0
public/images/flags/ai.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 643 B

After

Width:  |  Height:  |  Size: 643 B

0
public/images/flags/al.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 600 B

After

Width:  |  Height:  |  Size: 600 B

0
public/images/flags/am.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 497 B

After

Width:  |  Height:  |  Size: 497 B

0
public/images/flags/an.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 488 B

After

Width:  |  Height:  |  Size: 488 B

0
public/images/flags/ao.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 428 B

After

Width:  |  Height:  |  Size: 428 B

0
public/images/flags/ar.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 506 B

After

Width:  |  Height:  |  Size: 506 B

0
public/images/flags/as.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 647 B

After

Width:  |  Height:  |  Size: 647 B

0
public/images/flags/at.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 403 B

After

Width:  |  Height:  |  Size: 403 B

0
public/images/flags/au.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 673 B

After

Width:  |  Height:  |  Size: 673 B

0
public/images/flags/aw.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 524 B

After

Width:  |  Height:  |  Size: 524 B

0
public/images/flags/ax.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 663 B

After

Width:  |  Height:  |  Size: 663 B

0
public/images/flags/az.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 589 B

After

Width:  |  Height:  |  Size: 589 B

0
public/images/flags/ba.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 593 B

After

Width:  |  Height:  |  Size: 593 B

0
public/images/flags/bb.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 585 B

After

Width:  |  Height:  |  Size: 585 B

0
public/images/flags/bd.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 504 B

After

Width:  |  Height:  |  Size: 504 B

0
public/images/flags/be.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 449 B

After

Width:  |  Height:  |  Size: 449 B

0
public/images/flags/bf.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 497 B

After

Width:  |  Height:  |  Size: 497 B

0
public/images/flags/bg.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 462 B

After

Width:  |  Height:  |  Size: 462 B

0
public/images/flags/bh.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 457 B

After

Width:  |  Height:  |  Size: 457 B

0
public/images/flags/bi.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 675 B

After

Width:  |  Height:  |  Size: 675 B

0
public/images/flags/bj.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 486 B

After

Width:  |  Height:  |  Size: 486 B

0
public/images/flags/bl.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 545 B

After

Width:  |  Height:  |  Size: 545 B

0
public/images/flags/bm.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 611 B

After

Width:  |  Height:  |  Size: 611 B

0
public/images/flags/bn.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 639 B

After

Width:  |  Height:  |  Size: 639 B

0
public/images/flags/bo.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 500 B

After

Width:  |  Height:  |  Size: 500 B

0
public/images/flags/br.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 593 B

After

Width:  |  Height:  |  Size: 593 B

0
public/images/flags/bs.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 526 B

After

Width:  |  Height:  |  Size: 526 B

0
public/images/flags/bt.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 631 B

After

Width:  |  Height:  |  Size: 631 B

0
public/images/flags/bv.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 512 B

After

Width:  |  Height:  |  Size: 512 B

0
public/images/flags/bw.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 443 B

After

Width:  |  Height:  |  Size: 443 B

0
public/images/flags/by.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 514 B

After

Width:  |  Height:  |  Size: 514 B

0
public/images/flags/bz.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 600 B

After

Width:  |  Height:  |  Size: 600 B

0
public/images/flags/ca.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 628 B

After

Width:  |  Height:  |  Size: 628 B

0
public/images/flags/cc.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 625 B

After

Width:  |  Height:  |  Size: 625 B

0
public/images/flags/cd.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 528 B

After

Width:  |  Height:  |  Size: 528 B

0
public/images/flags/cf.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 614 B

After

Width:  |  Height:  |  Size: 614 B

0
public/images/flags/cg.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 521 B

After

Width:  |  Height:  |  Size: 521 B

0
public/images/flags/ch.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 367 B

After

Width:  |  Height:  |  Size: 367 B

0
public/images/flags/ci.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 453 B

After

Width:  |  Height:  |  Size: 453 B

0
public/images/flags/ck.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 586 B

After

Width:  |  Height:  |  Size: 586 B

0
public/images/flags/cl.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 450 B

After

Width:  |  Height:  |  Size: 450 B

0
public/images/flags/cm.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 525 B

After

Width:  |  Height:  |  Size: 525 B

0
public/images/flags/cn.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 472 B

After

Width:  |  Height:  |  Size: 472 B

0
public/images/flags/co.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 483 B

After

Width:  |  Height:  |  Size: 483 B

0
public/images/flags/cr.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 477 B

After

Width:  |  Height:  |  Size: 477 B

0
public/images/flags/cs.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 439 B

After

Width:  |  Height:  |  Size: 439 B

0
public/images/flags/cu.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 563 B

After

Width:  |  Height:  |  Size: 563 B

0
public/images/flags/cv.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 529 B

After

Width:  |  Height:  |  Size: 529 B

0
public/images/flags/cx.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 608 B

After

Width:  |  Height:  |  Size: 608 B

0
public/images/flags/cy.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 428 B

After

Width:  |  Height:  |  Size: 428 B

0
public/images/flags/cz.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 476 B

After

Width:  |  Height:  |  Size: 476 B

0
public/images/flags/de.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 545 B

After

Width:  |  Height:  |  Size: 545 B

0
public/images/flags/dj.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 572 B

After

Width:  |  Height:  |  Size: 572 B

0
public/images/flags/dk.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 495 B

After

Width:  |  Height:  |  Size: 495 B

0
public/images/flags/dm.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 620 B

After

Width:  |  Height:  |  Size: 620 B

0
public/images/flags/do.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 508 B

After

Width:  |  Height:  |  Size: 508 B

0
public/images/flags/dz.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 582 B

After

Width:  |  Height:  |  Size: 582 B

0
public/images/flags/ec.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 500 B

After

Width:  |  Height:  |  Size: 500 B

0
public/images/flags/ee.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 429 B

After

Width:  |  Height:  |  Size: 429 B

0
public/images/flags/eg.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 465 B

After

Width:  |  Height:  |  Size: 465 B

0
public/images/flags/eh.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 508 B

After

Width:  |  Height:  |  Size: 508 B

0
public/images/flags/er.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 653 B

After

Width:  |  Height:  |  Size: 653 B

0
public/images/flags/es.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 469 B

After

Width:  |  Height:  |  Size: 469 B

0
public/images/flags/et.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 592 B

After

Width:  |  Height:  |  Size: 592 B

0
public/images/flags/fi.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 489 B

After

Width:  |  Height:  |  Size: 489 B

0
public/images/flags/fj.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 610 B

After

Width:  |  Height:  |  Size: 610 B

0
public/images/flags/fk.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 648 B

After

Width:  |  Height:  |  Size: 648 B

0
public/images/flags/fm.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 552 B

After

Width:  |  Height:  |  Size: 552 B

0
public/images/flags/fo.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 474 B

After

Width:  |  Height:  |  Size: 474 B

0
public/images/flags/fr.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 545 B

After

Width:  |  Height:  |  Size: 545 B

0
public/images/flags/ga.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 489 B

After

Width:  |  Height:  |  Size: 489 B

0
public/images/flags/gb.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 599 B

After

Width:  |  Height:  |  Size: 599 B

0
public/images/flags/gd.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 637 B

After

Width:  |  Height:  |  Size: 637 B

0
public/images/flags/ge.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 594 B

After

Width:  |  Height:  |  Size: 594 B

0
public/images/flags/gf.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 545 B

After

Width:  |  Height:  |  Size: 545 B

0
public/images/flags/gg.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 362 B

After

Width:  |  Height:  |  Size: 362 B

0
public/images/flags/gh.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 490 B

After

Width:  |  Height:  |  Size: 490 B

0
public/images/flags/gi.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 463 B

After

Width:  |  Height:  |  Size: 463 B

0
public/images/flags/gl.png Executable file → Normal file
View file

Before

Width:  |  Height:  |  Size: 470 B

After

Width:  |  Height:  |  Size: 470 B

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