From 86a3f773dce1b4c8eb60520902fd85d27a7df6dd Mon Sep 17 00:00:00 2001 From: franv Date: Thu, 13 Aug 2020 13:55:10 -0700 Subject: [PATCH] first commit --- LICENSE | 21 +++++++ README.md | 102 ++++++++++++++++++++++++++++++++ data/ca.pem | Bin 0 -> 1112 bytes data/client-cert.pem | Bin 0 -> 1112 bytes data/public_key.pem | Bin 0 -> 452 bytes data/server-cert.pem | Bin 0 -> 1112 bytes docker-compose.yml | 49 +++++++++++++++ docker-compose.yml.bak | 57 ++++++++++++++++++ docker-compose.yml.good | 38 ++++++++++++ index.html | 16 +++++ mysql/my.cnf | 32 ++++++++++ traccar/conf/sample_traccar.xml | 26 ++++++++ traccar/conf/traccar.xml | 33 +++++++++++ traccar/conf/traccar.xml.good | 26 ++++++++ traccar/web/app_sample.css | 55 +++++++++++++++++ traccar/web/favicon_sample.ico | Bin 0 -> 15086 bytes traccar/web/icon_sample.png | Bin 0 -> 7941 bytes traccar/web/logo_sample.svg | 33 +++++++++++ traccar/web/release_sample.html | 16 +++++ traefik/traefik_sample.toml | 5 ++ 20 files changed, 509 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 data/ca.pem create mode 100644 data/client-cert.pem create mode 100644 data/public_key.pem create mode 100644 data/server-cert.pem create mode 100644 docker-compose.yml create mode 100644 docker-compose.yml.bak create mode 100644 docker-compose.yml.good create mode 100644 index.html create mode 100644 mysql/my.cnf create mode 100644 traccar/conf/sample_traccar.xml create mode 100644 traccar/conf/traccar.xml create mode 100644 traccar/conf/traccar.xml.good create mode 100644 traccar/web/app_sample.css create mode 100644 traccar/web/favicon_sample.ico create mode 100644 traccar/web/icon_sample.png create mode 100644 traccar/web/logo_sample.svg create mode 100644 traccar/web/release_sample.html create mode 100644 traefik/traefik_sample.toml diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..49abf6e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 RafaelMiquelino + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ec8bb11 --- /dev/null +++ b/README.md @@ -0,0 +1,102 @@ +# Traccar server +This is the repository to create the traccar-server with a standalone MySQL database and Traefik reverse proxy via docker-compose file. +## Minimum VPS configuration +- OS: Ubuntu 16.04 x64 +- RAM: 512 MB +- CPU: 1 +- Disk space: 10 GB +- 1GB swap: see https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-16-04 +## Setup Instructions +### Install Docker +1. First, in order to ensure the downloads are valid, add the GPG key for the official Docker repository to your system: +`curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -` +2. Add the Docker repository to APT sources: +`sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"` +3. Next, update the package database with the Docker packages from the newly added repo: +`sudo apt-get update` +4. Make sure you are about to install from the Docker repo instead of the default Ubuntu 16.04 repo: +`apt-cache policy docker-ce` + You should see output similar to the follow: +``` +docker-ce: + Candidate: 18.06.1~ce~3-0~ubuntu + Version table: + 18.06.1~ce~3-0~ubuntu 500 + 500 https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages +``` +5. Finally, install Docker: +`sudo apt-get install -y docker-ce` +6. Docker should now be installed, the daemon started, and the process enabled to start on boot. Check that it's running: +`sudo systemctl status docker` +7. If you want to avoid typing sudo whenever you run the docker command, add your username to the docker group: +`sudo usermod -aG docker ${USER}` +8. To apply the new group membership, log out of the server and back in. +9. Afterwards, you can confirm that your user is now added to the docker group by typing: +`id -nG` + +- For more info, visit: https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04 +### Install Docker Compose +1. We'll check the current release and if necessary, update it in the command below: +`ssudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose` +2. Next we'll set the permissions: +`sudo chmod +x /usr/local/bin/docker-compose` +3. Then we'll verify that the installation was successful by checking the version: +`docker-compose -v` + +- For more info, visit: https://www.digitalocean.com/community/tutorials/how-to-install-docker-compose-on-ubuntu-16-04 +### Install the repository into the VPS +1. Clone the repository. +1. Step into the just created folder + +### Configure environment variables +1. Set your mysql username and password parameters as environment variables: +`export MYSQL_USER=YOUR_USERNAME` `export MYSQL_ROOT_PASSWORD=YOUR_ROOT_PASSWORD` `export MYSQL_PASSWORD=YOUR_USER_PASSWORD` `export MYSQL_DATABASE=YOUR_DATABASE_NAME` +2. Set your domain: +`export DOMAIN=YOUR_DOMAIN.com` +2. Alternatively you can set all these variables in `.env` file and export all at once on the system startup by adding the following command to your .bashrc: +`export $(!q zxT8LZRT2cMs%qYycp-x|87Gk?tjc{wq)vsFh}SkZUCu*+Oe-&MI;kVxgR7eBGwhSL zsp2SXTqs72icRXOSL$MO_VDVpE>f|(viR%&%ji)>dsi)VusI_@>5QWWpU-p7oCWf| zwd5Nu#pEjD>~3Uui^5OD-1DzJ)Lusdga31{IT`qH(&Trl(eM zme6&_DpV`M@EJ4t3pm3xlhcP{fK>ZkNqgK5Bw())(KH zGONOjq1V~AM`@c%Uz3#2(Goi;9K+>muHV0t19Ev9pW*)mS(y+YrEy0qN&TkcFVj` zZaZxA{p^t=xG1AGE;;G)D#R~B1st2Syh1VyP1YEWI%HDKFN8B?rSctO=slyz4cD_v W9fZ4F3x54#{#g^qQ~$d<{`w7fiDdBr literal 0 HcmV?d00001 diff --git a/data/client-cert.pem b/data/client-cert.pem new file mode 100644 index 0000000000000000000000000000000000000000..51510a58ce93e4f5dce4866483f016daa865e4d2 GIT binary patch literal 1112 zcmZXU$F8eL5Qb;XQ_S8vGQj~BvuJ3*geIBTJA%nLVj6h*;oQwErlembeN|E=seXPo z6J=Gi{+49V*Az_xzWfV+D5PmnTqOzIb`>C+2&zphu*9l+)m@_sgcgDOQ2+!y@*l(o z2@G8qLa11`(DEo>5quo$?55I|4#aHbHKrA&P=(TC!|%rHLJhl^w!}?+e)pbu=-VXr zdL$lV3i=vBFek{@X3O8a@`$02HkK^*e~h?L-XTa-zyvZNgz@9v4}!U*0ybQVAzb3M z`XcEtBSsL5*qdUy=(COgR>Fz^GqvxtyH~ou`D#C;k+pRe5UQ%=1_4@?t}pefWgK+n zZRP-ggC;@($QC!iW7~@>Wy_IP8F=*~Y{aMTGrC;iP|LYU46|9r{Ns&J5ZsU7*HYc1 z>S1MTC-6lf;K07-5cSE&E8}ju%RO64;{~dGax(%ZtHc>M zGpVy@(sQ)3bSL(ok^eTw-rH5_n*tRQ0Z>~R0vmxpcP?Zii+kcq2mk`zL^mE-tEb!o zu55}ffZJt6Ag@{J2@dsbA znb(K$)J3@&QfDHiWaNsv&|HB}`f~z2AG#9uisU%!mKgPXQyNy^=YKvyACU5n| z(S%@G6xG!pO|)p)kwSSthH2&3PcqxNtMA-zc~7Tr3=3iZ zC5R0dn=g)){HsNj@xso6N^PtynoWbt&y*(el>KHtIoL zx!*Lz=jC~~GSLe*(mWT7ta0w)VtN%j1DsrJDI63z zFE=rB1S?<9&KzHw_^~Br1YHwtLh+tYN-uqwc412^fgJ+%!ym>1y~dpPsrk_*r_U5O zW4JqQBsE5s0lz~KHxv3&Sn Hr(b^ocFB)x literal 0 HcmV?d00001 diff --git a/data/server-cert.pem b/data/server-cert.pem new file mode 100644 index 0000000000000000000000000000000000000000..0f421fde3cf06b7841c49af6d54ba8543874ad10 GIT binary patch literal 1112 zcmZXUOOK;C6oqHaub4e56|bbiVitY?#XAr~fL(w9;Z0SDfnVQLZ>FWTbY$tXB_H2o z-?z7YKtFY+c82LkQg25>Oq2a#sx;STYNTCic$a)%~AQ4=b#VsRsB!0hID2YDo|*1rrG2ns?zE zZRKnuX|Z`3=8^x3xV%kw{&Q0DhfD8gzt(oQtFt=`C{vco!v>s&E|YfAQxSX0e&+xH zNr#vMy04pH*z4k96OwL_I@ylEScsRxZuz)mRB+PgC&?Zs_XK?L(G8^SQN}ugx(q#B zv#m#D?h9&}-EeZ+Sf|q=FJHmodpN2DFrR(&*dF&MyIEq@NiThn zK1+*U(l0UH6ArI4uT)C4G7d1mUYVQ5u{mtymPZALzD$nmt|u6_i6BYFEY+c9pk^A! zST5ls;BR%B*}yHcbYVbgLjbf|!N9e_@0@dmD)60p$OeF7FE-2}(W_VH08g=?2k@Q@ z1c+qq7vY$-XijI+ZB80f@IonY}zs)tJCCKB83W_5F!P1)E*%cXYF+dI^lO zZuc@V<(WqLp+5kKlk^3U&Nq@I4OsCBS~?J7q09JTlZ z%so@&L}ss%+fCj)&)9vB(eQqh3`0TA>gZ8r1)sSU_UDmzhfy%I%>oUQW%JcYaHu9` z6O)MLKetRfyn2IsG)f`6S&}-3r1sG_v1njD&t+Hupq^tvBa$)WYt?(;H#7?qlPMM1R>ZX`_dG|S^j Vkw^?Bq=EmK-)%y1@ZYWDpI@dYW|RN` literal 0 HcmV?d00001 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e487929 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,49 @@ +version: "3" +services: + db: + image: mysql:8.0.13 + container_name: db + command: --default-authentication-plugin=mysql_native_password + restart: always + env_file: .env + volumes: + - /etc/localtime:/etc/localtime:ro + - db-datavolume:/var/lib/mysql +# - ./data:/var/lib/mysql + - ./mysql:/etc/mysql/conf.d +# ports: +# - "3306:3306" + + traccar: + image: traccar/traccar:4.8-alpine + container_name: traccar + depends_on: + - db + restart: always + volumes: + - ./traccar/conf/traccar.xml:/opt/traccar/conf/traccar.xml:ro + - ./var/log/traccar:/opt/traccar/logs:rw + - ./traccar/web/favicon.ico:/opt/traccar/web/favicon.ico:ro + - ./traccar/web/icon.png:/opt/traccar/web/icon.png:ro + - ./traccar/web/logo.svg:/opt/traccar/web/logo.svg:ro + - ./traccar/web/release.html:/opt/traccar/web/release.html:ro + - ./traccar/web/app.css:/opt/traccar/web/app.css:ro + environment: + - VIRTUAL_HOST=track.franv.site + - LETSENCRYPT_HOST=track.franv.site + - LETSENCRYPT_EMAIL=ouch@thetrauma.org + - VIRTUAL_PORT=8082 + - TRUSTED_PROXY=nginx-proxy + + ports: + - "5055:5055" + - "8082:8082" + + volumes: + - /var/run/docker.sock:/var/run/docker.sock +volumes: + db-datavolume: +networks: + default: + external: + name: franvproxy_proxy-tier diff --git a/docker-compose.yml.bak b/docker-compose.yml.bak new file mode 100644 index 0000000..f892f35 --- /dev/null +++ b/docker-compose.yml.bak @@ -0,0 +1,57 @@ +version: "3" +services: + db: + image: mysql:8.0.13 + container_name: db + command: --default-authentication-plugin=mysql_native_password + restart: always + env_file: .env + volumes: + - /etc/localtime:/etc/localtime:ro + - db-datavolume:/var/lib/mysql + - ./mysql:/etc/mysql/conf.d + ports: + - "3306:3306" + labels: + - traefik.enable=false + traccar: + image: traccar/traccar:4.8-alpine + container_name: traccar + depends_on: + - db + restart: always + volumes: + - ./traccar/conf/traccar.xml:/opt/traccar/conf/traccar.xml:ro + - /var/log/traccar:/opt/traccar/logs:rw + - ./traccar/web/favicon.ico:/opt/traccar/web/favicon.ico:ro + - ./traccar/web/icon.png:/opt/traccar/web/icon.png:ro + - ./traccar/web/logo.svg:/opt/traccar/web/logo.svg:ro + - ./traccar/web/release.html:/opt/traccar/web/release.html:ro + - ./traccar/web/app.css:/opt/traccar/web/app.css:ro + ports: + - "5000-5150:5000-5150" + - "8082:8082" + labels: + - traefik.http.routers.traccar.rule=Host(`web.${DOMAIN}`) + - traefik.http.services.traccar_web.loadbalancer.server.port=8082 + rev_proxy: + image: traefik:v2.2 + container_name: rev_proxy + restart: always + env_file: .env + ports: + - "80:80" + - "443:443" + - "8080:8080" + labels: + - traefik.http.routers.api.rule=Host(`proxy.${DOMAIN}`) + - traefik.http.routers.api.service=api@internal + - traefik.http.routers.api.middlewares=auth + - traefik.http.middlewares.auth.basicauth.users=${AUTH_USER_PASSWORD} + volumes: + - ./traefik/traefik.toml:/traefik.toml + - ./traefik/acme.json:/acme.json + - /var/log/traefik:/logs + - /var/run/docker.sock:/var/run/docker.sock +volumes: + db-datavolume: diff --git a/docker-compose.yml.good b/docker-compose.yml.good new file mode 100644 index 0000000..2752ae7 --- /dev/null +++ b/docker-compose.yml.good @@ -0,0 +1,38 @@ +version: "3" +services: + db: + image: mysql:8.0.13 + container_name: db + command: --default-authentication-plugin=mysql_native_password + restart: always + env_file: .env + volumes: + - /etc/localtime:/etc/localtime:ro +# - db-datavolume:/var/lib/mysql + - ./data:/var/lib/mysql + - ./mysql:/etc/mysql/conf.d + ports: + - "3306:3306" + + traccar: + image: traccar/traccar:4.8-alpine + container_name: traccar + depends_on: + - db + restart: always + volumes: + - ./traccar/conf/traccar.xml:/opt/traccar/conf/traccar.xml:ro + - /var/log/traccar:/opt/traccar/logs:rw + - ./traccar/web/favicon.ico:/opt/traccar/web/favicon.ico:ro + - ./traccar/web/icon.png:/opt/traccar/web/icon.png:ro + - ./traccar/web/logo.svg:/opt/traccar/web/logo.svg:ro + - ./traccar/web/release.html:/opt/traccar/web/release.html:ro + - ./traccar/web/app.css:/opt/traccar/web/app.css:ro + ports: + - "5055:5055" + - "8083:8082" + + volumes: + - /var/run/docker.sock:/var/run/docker.sock +#volumes: +# db-datavolume: diff --git a/index.html b/index.html new file mode 100644 index 0000000..76b146d --- /dev/null +++ b/index.html @@ -0,0 +1,16 @@ + + + + + +Traccar + + + + + +
+ + + + diff --git a/mysql/my.cnf b/mysql/my.cnf new file mode 100644 index 0000000..f006ec5 --- /dev/null +++ b/mysql/my.cnf @@ -0,0 +1,32 @@ +[mysqld] +local_infile=ON +performance_schema=OFF +# innodb +#innodb_buffer_pool_size=5M +#innodb_log_buffer_size=256K +#innodb_ft_cache_size=1600000 +#innodb_ft_total_cache_size=32000000 + +# caches +#thread_cache_size=0 +#host_cache_size=0 +#query_cache_size=0 + +#max_connections=10 +#key_buffer_size=8 + +# per thread or per operation settings +#thread_stack=131072 +#sort_buffer_size=32K +#read_buffer_size=8200 +#read_rnd_buffer_size=8200 +#max_heap_table_size=16K +#tmp_table_size=1K +#bulk_insert_buffer_size=0 +#join_buffer_size=128 +#net_buffer_length=1K +#innodb_sort_buffer_size=64K + +#settings that relate to the binary log (if enabled) +#binlog_cache_size=4K +#binlog_stmt_cache_size=4K diff --git a/traccar/conf/sample_traccar.xml b/traccar/conf/sample_traccar.xml new file mode 100644 index 0000000..13525c7 --- /dev/null +++ b/traccar/conf/sample_traccar.xml @@ -0,0 +1,26 @@ + + + + + + + ./conf/default.xml + + + com.mysql.jdbc.Driver + jdbc:mysql://db:3306/[DATABASE]?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false&allowMultiQueries=true&autoReconnect=true&useUnicode=yes&characterEncoding=UTF-8&sessionVariables=sql_mode='' + [USER] + [PASSWORD] + true + + diff --git a/traccar/conf/traccar.xml b/traccar/conf/traccar.xml new file mode 100644 index 0000000..8b370f8 --- /dev/null +++ b/traccar/conf/traccar.xml @@ -0,0 +1,33 @@ + + + + + + + ./conf/default.xml + + + com.mysql.jdbc.Driver + jdbc:mysql://db:3306/traccar_db?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false&allowMultiQueries=true&autoReconnect=true&useUnicode=yes&characterEncoding=UTF-8&sessionVariables=sql_mode='' + airdog + chengli197 + true + mail.desart.ca + 465 + true + xx@desart.ca + true + xx@desart.ca + chengli47 + + diff --git a/traccar/conf/traccar.xml.good b/traccar/conf/traccar.xml.good new file mode 100644 index 0000000..93a9586 --- /dev/null +++ b/traccar/conf/traccar.xml.good @@ -0,0 +1,26 @@ + + + + + + + ./conf/default.xml + + + com.mysql.jdbc.Driver + jdbc:mysql://db:3306/traccar_db?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false&allowMultiQueries=true&autoReconnect=true&useUnicode=yes&characterEncoding=UTF-8&sessionVariables=sql_mode='' + airdog + chengli197 + true + + diff --git a/traccar/web/app_sample.css b/traccar/web/app_sample.css new file mode 100644 index 0000000..5be90dd --- /dev/null +++ b/traccar/web/app_sample.css @@ -0,0 +1,55 @@ +.view-color-green { + background-color: rgba(77, 250, 144, 0.3); +} +.view-color-yellow { + background-color: rgba(250, 190, 77, 0.3); +} +.view-color-red { + background-color: rgba(255, 84, 104, 0.3); +} + +.view-item-disabled { + opacity: 0.5; +} + +.toolbar-header-style { + background-color: #5fa2dd !important; +} + +body.x-border-layout-ct, div.x-border-layout-ct { + background-color: #bbbbbb !important; +} + +.x-fieldset { + overflow: visible !important; /* workaround for Safari issue */ +} + +#attribution { + position: absolute; + bottom: 10px; + right: 15px; + font-size: x-small; +} + +#spinner:before { + content: ''; + box-sizing: border-box; + position: absolute; + top: 50%; + left: 50%; + width: 60px; + height: 60px; + margin-top: -30px; + margin-left: -30px; + border-radius: 50%; + border-top: 6px solid #5fa2dd; + border-right: 6px solid transparent; + animation: spinner .6s linear infinite; +} + +@keyframes spinner { + to { + transform: rotate(360deg); + } +} + diff --git a/traccar/web/favicon_sample.ico b/traccar/web/favicon_sample.ico new file mode 100644 index 0000000000000000000000000000000000000000..6be99ddac98bee21c431d6bda4e61f486fe0daf0 GIT binary patch literal 15086 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 bGPiV>3E7**b&~2}WDTh)YbjMJ*o6KMAM^49 literal 0 HcmV?d00001 diff --git a/traccar/web/logo_sample.svg b/traccar/web/logo_sample.svg new file mode 100644 index 0000000..008b46d --- /dev/null +++ b/traccar/web/logo_sample.svg @@ -0,0 +1,33 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/traccar/web/release_sample.html b/traccar/web/release_sample.html new file mode 100644 index 0000000..76b146d --- /dev/null +++ b/traccar/web/release_sample.html @@ -0,0 +1,16 @@ + + + + + +Traccar + + + + + +
+ + + + diff --git a/traefik/traefik_sample.toml b/traefik/traefik_sample.toml new file mode 100644 index 0000000..2b09aec --- /dev/null +++ b/traefik/traefik_sample.toml @@ -0,0 +1,5 @@ +[api] + dashboard = true + +[providers.docker] +