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/

302
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,168 +26,253 @@ 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**. # edit the env file to your liking
* Point your browser to `8181` to see the web interface. #
# the teamspeak_host should point to your public ip address and must be whitelisted inside the teamspeak server itself
vi env
# create necessary directories and set permissions
mkdir -p /data/log
touch /data/log/application.log
mkdir -p /data/snapshots
chown -R 65534:65534 /data
# exit the container
exit
# 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;
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;
location / {
try_files $uri $uri/ @ee;
}
location @ee {
rewrite ^(.*) /index.php?$1 last;
}
# php fpm
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
include fastcgi_params;
}
```
## Native application
### Usage as native application
**Prerequisite**: `php`, `composer` and probably `php-fpm` installed on the server. **Prerequisite**: `php`, `composer` and probably `php-fpm` installed on the server.
To install: ### Install
* Clone repository * Clone repository
* Change directory to project home * Change directory to project home
* Execute `composer install` * Execute `composer install`
* `composer install` * `composer install`
* Do the configuration by coping the `env.example` file (see information above) * 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)) * 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
To upgrade:
* Change directory to project home * Change directory to project home
* `git pull` * `git pull`
* `composer update` * `composer update`
### Web server setup ## Troubleshooting / F.A.Q
* Example `nginx.conf` for **standalone** deployment without SSL:
``` <a name="flood"></a>
root .../public; ### How to overcome server query limit?
index index.php;
rewrite_log on; You might get one of these messages:
location / { > I always get `flood client` message when clicking anywhere in the web interface.
try_files $uri $uri/ @ee;
}
location @ee { The web UI uses query commands _a lot_! When your instance is up and running, you should be able to change the following
rewrite ^(.*) /index.php?$1 last; setting, e.g. directly in your database (MySQL or sqlite).
}
# php fpm ```ini
location ~ \.php$ { serverinstance_serverquery_flood_commands = 9999
fastcgi_split_path_info ^(.+\.php)(/.+)$; serverinstance_serverquery_max_connections_per_ip = 999
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; serverinstance_serverquery_flood_time = 1
include fastcgi_params; ```
}
```
* Example `nginx.conf` as **reverse proxy** with SSL: <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
server { resides behind a web server, so the TeamSpeak server thinks that the _remote web server IP address_ invokes the query
listen 443 ssl http2; commands and thus blacklists it.
server_name teamspeak.domain.tld;
ssl on; You need define an exception for you server's IP in a [`whitelist.txt`](#whitelisttextfile) file and include it in
ssl_certificate fullchain.pem; your TeamSpeak application.
ssl_certificate_key privkey.pem;
location / { You can also add the desired IP to `query_ip_allowlist.txt` and `query_ip_whitelist.txt` within the TeamSpeak 3 Server
proxy_pass http://localhost:8181; data directory.
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host; <a name="dockerperms"></a>
proxy_set_header X-Forwarded-For $remote_addr; ### 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.
```
127.0.0.1
::1
10.5.0.5
your-public-ip
```
## 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 / {
try_files $uri $uri/ @ee;
}
# Path of the file with Diffie-Hellman parameters for EDH ciphers. location @ee {
#ssl_dhparam /etc/ssl/nginx/dh2048.pem; rewrite ^(.*) /index.php?$1 last;
}
# Specifies that our cipher suits should be preferred over client ciphers. location ~ \.php$ {
ssl_prefer_server_ciphers on; fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
# Enables a shared SSL cache with size that can hold around 8000 sessions. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
ssl_session_cache shared:SSL:2m; fastcgi_index index.php;
include fastcgi_params;
# Enable gzipping of responses. }
gzip on; }
# Set the Vary HTTP header as defined in the RFC 2616.
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