├── .docker ├── nginx-proxy │ └── etc │ │ └── nginx │ │ ├── conf.d │ │ ├── client_max_body_size.conf │ │ ├── server_tokens.conf │ │ └── timeout.conf │ │ └── vhost.d │ │ └── default_location ├── tevun-aws │ ├── Dockerfile │ └── build.sh └── tevun │ ├── Dockerfile │ ├── build.sh │ └── etc │ └── nginx │ ├── .users │ ├── nginx.conf │ ├── ssl │ ├── server.crt │ ├── server.csr │ └── server.key │ └── tevun.conf ├── .env.sample ├── .gitignore ├── .users.sample ├── PROJECT.md ├── README.md ├── badge.png ├── cgi ├── create.sh ├── destroy.sh └── ping.sh ├── commands ├── compress │ ├── do.sh │ └── undo.sh ├── credential │ ├── password.sh │ ├── register.sh │ ├── ssh.sh │ └── user.sh ├── database │ ├── mysql-export.sh │ └── mysql-import.sh ├── down.sh ├── project │ ├── create.sh │ ├── destroy.sh │ ├── projects.sh │ └── pull.sh ├── setup.sh ├── start.sh ├── stop.sh ├── up.sh └── utils │ ├── colors.sh │ ├── compose.sh │ ├── lets-encrypt │ ├── renew.sh │ └── status.sh │ ├── ps.sh │ └── ubuntu │ └── locale.sh ├── composer.json ├── composer.lock ├── docker-compose.yml.sample ├── images ├── output-create.png ├── output-destroy.png ├── output-register.png ├── output-setup.png ├── pair.jpg ├── setup.png ├── topology.jpg └── works.png ├── installers └── ubuntu.sh ├── logo.png ├── logo.svg ├── projects ├── .gitignore └── index.html ├── samples ├── html │ ├── app │ │ ├── .env.stage │ │ ├── .gitlab-ci.yml │ │ ├── .tevun │ │ │ └── hooks │ │ │ │ ├── install.sh │ │ │ │ ├── post-checkout.sh │ │ │ │ ├── pre-checkout.sh │ │ │ │ └── setup.sh │ │ ├── docker-compose.yml.stage │ │ └── public │ │ │ └── index.html │ ├── configure.sh │ └── repo │ │ └── hooks │ │ └── post-receive ├── laravel │ ├── app │ │ ├── .env.stage │ │ ├── .gitlab-ci.yml │ │ ├── .tevun │ │ │ └── hooks │ │ │ │ ├── install.sh │ │ │ │ ├── post-checkout.sh │ │ │ │ ├── pre-checkout.sh │ │ │ │ └── setup.sh │ │ └── docker-compose.yml.stage │ ├── configure.sh │ └── repo │ │ └── hooks │ │ ├── post-receive │ │ └── pre-receive ├── php │ ├── app │ │ ├── .env.stage │ │ ├── .gitlab-ci.yml │ │ ├── .tevun │ │ │ └── hooks │ │ │ │ ├── install.sh │ │ │ │ ├── post-checkout.sh │ │ │ │ ├── pre-checkout.sh │ │ │ │ └── setup.sh │ │ ├── docker-compose.yml.stage │ │ └── public │ │ │ └── index.php │ ├── configure.sh │ └── repo │ │ └── hooks │ │ ├── post-receive │ │ └── pre-receive └── wordpress │ ├── app │ ├── .env.stage │ ├── .gitlab-ci.yml │ ├── .tevun │ │ └── hooks │ │ │ ├── install.sh │ │ │ ├── post-checkout.sh │ │ │ ├── pre-checkout.sh │ │ │ └── setup.sh │ ├── docker-compose.yml.stage │ └── public │ │ └── index.php │ ├── configure.sh │ └── repo │ └── hooks │ ├── post-receive │ └── pre-receive ├── tevun-functions.sh └── tevun.sh /.docker/nginx-proxy/etc/nginx/conf.d/client_max_body_size.conf: -------------------------------------------------------------------------------- 1 | client_max_body_size 0; 2 | 3 | -------------------------------------------------------------------------------- /.docker/nginx-proxy/etc/nginx/conf.d/server_tokens.conf: -------------------------------------------------------------------------------- 1 | server_tokens off; 2 | -------------------------------------------------------------------------------- /.docker/nginx-proxy/etc/nginx/conf.d/timeout.conf: -------------------------------------------------------------------------------- 1 | fastcgi_read_timeout 3600; 2 | proxy_read_timeout 3600; 3 | uwsgi_read_timeout 3600; 4 | 5 | fastcgi_buffers 16 32k; 6 | fastcgi_buffer_size 64k; 7 | fastcgi_busy_buffers_size 64k; 8 | proxy_buffer_size 128k; 9 | proxy_buffers 4 256k; 10 | proxy_busy_buffers_size 256k; 11 | -------------------------------------------------------------------------------- /.docker/nginx-proxy/etc/nginx/vhost.d/default_location: -------------------------------------------------------------------------------- 1 | if ($request_method = 'OPTIONS') { 2 | add_header 'Access-Control-Allow-Origin' "$http_origin" always; 3 | add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, PATCH, DELETE, OPTIONS' always; 4 | add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With,Bearer,Device,Context,PrivateToken,Meta' always; 5 | add_header 'Access-Control-Allow-Credentials' 'true' always; 6 | 7 | # required to be able to read Authorization header in frontend 8 | add_header 'Access-Control-Expose-Headers' 'Authorization,Bearer,Device,Context,PrivateToken,Meta'; 9 | 10 | # Tell client that this pre-flight info is valid for 20 days 11 | add_header 'Access-Control-Max-Age' 1728000; 12 | add_header 'Content-Type' 'text/plain charset=UTF-8'; 13 | add_header 'Content-Length' 0; 14 | return 204; 15 | } 16 | 17 | -------------------------------------------------------------------------------- /.docker/tevun-aws/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM tevun/server:1.0 2 | 3 | RUN apk add --update \ 4 | python \ 5 | python-dev \ 6 | py-pip \ 7 | curl \ 8 | build-base \ 9 | && pip install awscli --upgrade --user \ 10 | && apk --purge -v del py-pip \ 11 | && rm -rf /var/cache/apk/* \ 12 | && ln -s /root/.local/bin/aws /usr/bin/aws 13 | -------------------------------------------------------------------------------- /.docker/tevun-aws/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | docker build -t tevun/server:aws-${1} . 4 | 5 | docker tag tevun/server:aws-${1} tevun/server:aws-${1} 6 | docker push tevun/server:aws-${1} 7 | 8 | docker tag tevun/server:aws-${1} tevun/server:aws-latest 9 | docker push tevun/server:aws-latest 10 | -------------------------------------------------------------------------------- /.docker/tevun/Dockerfile: -------------------------------------------------------------------------------- 1 | # small is beautiful 2 | FROM docker:18.06.3-ce 3 | 4 | # The container listens on port 8110, map as needed 5 | EXPOSE 80 6 | EXPOSE 443 7 | 8 | # This is where the repositories will be stored, and 9 | # should be mounted from the host (or a volume container) 10 | VOLUME ["/app"] 11 | 12 | # We need the following: 13 | # - git, because that gets us the git-http-backend CGI script 14 | # - fcgiwrap, because that is how nginx does CGI 15 | # - spawn-fcgi, to launch fcgiwrap and to create the unix socket 16 | # - nginx, because it is our frontend 17 | RUN apk add --update nginx && \ 18 | apk add --update bash && \ 19 | apk add --update git && \ 20 | apk add --update git-daemon && \ 21 | apk add --update fcgiwrap && \ 22 | apk add --update spawn-fcgi && \ 23 | apk add --update apache2-utils && \ 24 | apk add --update py-pip && \ 25 | apk add --update python-dev libffi-dev openssl-dev gcc libc-dev make && \ 26 | rm -rf /var/cache/apk/* 27 | 28 | COPY ./etc/nginx/.users /etc/nginx/.users 29 | COPY ./etc/nginx/tevun.conf /etc/nginx/tevun.conf 30 | COPY ./etc/nginx/ssl /etc/nginx/ssl 31 | COPY ./etc/nginx/nginx.conf /etc/nginx/nginx.conf 32 | 33 | RUN pip install docker-compose 34 | 35 | RUN addgroup -S tevun && adduser -u 1000 -S tevun -G tevun 36 | 37 | # launch fcgiwrap via spawn-fcgi; launch nginx in the foreground 38 | # so the container doesn't die on us; supposedly we should be 39 | # using supervisord or something like that instead, but this 40 | # will do 41 | CMD spawn-fcgi -s /run/fcgi.sock /usr/bin/fcgiwrap && \ 42 | nginx -g "daemon off;" -------------------------------------------------------------------------------- /.docker/tevun/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | docker build -t tevun/server . 4 | docker tag tevun/server tevun/server:${1} 5 | docker push tevun/server:${1} 6 | docker push tevun/server:latest -------------------------------------------------------------------------------- /.docker/tevun/etc/nginx/.users: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tevun/server/0f557f62ba4c37ccaf75f048fb571e1e37f98a99/.docker/tevun/etc/nginx/.users -------------------------------------------------------------------------------- /.docker/tevun/etc/nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | worker_processes 1; 2 | 3 | error_log /var/log/nginx/error.log; 4 | pid /run/nginx.pid; 5 | user root; 6 | 7 | events { 8 | worker_connections 1024; 9 | } 10 | 11 | http { 12 | 13 | server { 14 | server_name tevun; 15 | 16 | listen 80 default_server; 17 | listen [::]:80 default_server; 18 | root /app/projects; 19 | 20 | include "/etc/nginx/tevun.conf"; 21 | } 22 | 23 | server { 24 | server_name tevun; 25 | 26 | listen 443 default_server; 27 | listen [::]:443 default_server; 28 | root /app/projects; 29 | 30 | ssl on; 31 | ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # not possible to do exclusive 32 | ssl_ciphers 'EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA'; 33 | ssl_prefer_server_ciphers on; 34 | 35 | ssl_certificate /etc/nginx/ssl/server.crt; 36 | ssl_certificate_key /etc/nginx/ssl/server.key; 37 | 38 | include "/etc/nginx/tevun.conf"; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /.docker/tevun/etc/nginx/ssl/server.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIE1DCCArwCCQDMMwGnSuK0tTANBgkqhkiG9w0BAQsFADAsMRswGQYDVQQKExJE 3 | b2NrZXIgQm9pbGVycGxhdGUxDTALBgNVBAMUBCoudm0wHhcNMTUwNTA0MTcxNDQw 4 | WhcNMjUwNTAxMTcxNDQwWjAsMRswGQYDVQQKExJEb2NrZXIgQm9pbGVycGxhdGUx 5 | DTALBgNVBAMUBCoudm0wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDK 6 | 3TIUiyDvXelWeY9VXMrpjuZtYpVSDsACLpjFUhMnsP5/iKT0VbeZyqHvmwZjAg4G 7 | Y10d+yZDdgv/xeu0HPOFbtR6pCp10d1tdLHZto5Cyuxu7IQsAVjnD6Ko7XFwtNk7 8 | 9o6JZfAFaGL4w5MokrVmCtspnsMZH7/7zU4f96cbF39zLopnpuXGD6t6DA8Qj3gy 9 | 0duaTjs42bYRN+rwLzVKAev99iQ4kPMJn4vV6/Xk6rtoSzC67GQyVZYaFypicD1S 10 | NtsRmgEVvjCBDbrLOneUiRwff6qxEsZi7Hxv7BKFj4iUWnII7K/nP7T6uBHQjHO+ 11 | FpsGkU9lCMrCeVFBe8kKz/cbhd+yLUxXwAPr6gSOPmwn232Gy4tozvqZHpbUxsgx 12 | 7sT3ej9K66h1D7J+BjNFWYM1hbnC1r7H/xS7EBzBV8qRoQCVe08Juf5xsouXFakD 13 | clLV4+L+1cxkpwsCQDly5g3tm/TBqA2O+ZJ+YHQDHKkzMyhLs6i0X/M5qvJBiLg1 14 | GLTCS20rpQ5gXTEGuINqHgwXQWkUO6bhgSYqdHGX3zbZ5+qWpI4eui3dHZ1Ll0VH 15 | 6Icpb7ORTQwhc6W8KBlybssYPSlGOEBGUjYGNheoz9FpoSkxCis+P8ZNKtrmpPoq 16 | Su0eOOGFOFHG02eOgPVxSwrDeN9MVJo7BPysGMHJmQIDAQABMA0GCSqGSIb3DQEB 17 | CwUAA4ICAQC63g6NHmQKbiy3G6iaDkpUSbr5Mq2YgU61XnvWVyREqDcy/BXCw9oY 18 | SJ/KUvCpqPnACNOFqjadRAmPiA9nf2WduoCgwQGV/YRFGswSuVvh/3X2TX5NWvbS 19 | t8MQDttQg1dxpiMUjlu3rqhfohBdWJvp2lVSdpDb/MOlXBc/+p7HfOHwhqB7wwPN 20 | NNbSKUbZqZxmD8cOf1X0hASr1yfFPj+2vST3ESaON8S0T2p63YX/sD5jvOUiEuyw 21 | I5WcvLmiRZA07SH8nWyckLY3qWL+OlhSZrlAnolWS00b+7h5LNuRYEjKzwVgntoA 22 | aCopyQih6wIk0+AfJO4sfhJBmQhnIrAaP/zwBH5g9zVizLf5H7U+hNXrMwgw55Sq 23 | vjMdkZHvPKUXTvVit/rYE9H+PY3brkRWzOl4V/i/ZLJJm5805H/NyTbz9kPMJw2Q 24 | nn+KOpfXXySD39f8iuRgSKXsYNul38hxWgcZZ6g+sOOp2n/VUmf0eZUWNnJ8i7AP 25 | 4Qif7aDKMcibOwSwsB+DKZXDvZ5XSdnMphtuLS5rPSL81rVRmWC2DMfQ2eP8j0WN 26 | VTroSk0xedQ7Qr+9TNooi9IyzX6n1a2S1UiciEZ3ZcDbXPl/P01m+IYZyPnLv0+9 27 | ZeioZYh1JLv3/OKsMrMLTfh2ZCj3aXwmc2Owi/wU2LS5QUOMcHH7CQ== 28 | -----END CERTIFICATE----- 29 | -------------------------------------------------------------------------------- /.docker/tevun/etc/nginx/ssl/server.csr: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIIEcTCCAlkCAQAwLDEbMBkGA1UEChMSRG9ja2VyIEJvaWxlcnBsYXRlMQ0wCwYD 3 | VQQDFAQqLnZtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyt0yFIsg 4 | 713pVnmPVVzK6Y7mbWKVUg7AAi6YxVITJ7D+f4ik9FW3mcqh75sGYwIOBmNdHfsm 5 | Q3YL/8XrtBzzhW7UeqQqddHdbXSx2baOQsrsbuyELAFY5w+iqO1xcLTZO/aOiWXw 6 | BWhi+MOTKJK1ZgrbKZ7DGR+/+81OH/enGxd/cy6KZ6blxg+regwPEI94MtHbmk47 7 | ONm2ETfq8C81SgHr/fYkOJDzCZ+L1ev15Oq7aEswuuxkMlWWGhcqYnA9UjbbEZoB 8 | Fb4wgQ26yzp3lIkcH3+qsRLGYux8b+wShY+IlFpyCOyv5z+0+rgR0IxzvhabBpFP 9 | ZQjKwnlRQXvJCs/3G4Xfsi1MV8AD6+oEjj5sJ9t9hsuLaM76mR6W1MbIMe7E93o/ 10 | SuuodQ+yfgYzRVmDNYW5wta+x/8UuxAcwVfKkaEAlXtPCbn+cbKLlxWpA3JS1ePi 11 | /tXMZKcLAkA5cuYN7Zv0wagNjvmSfmB0AxypMzMoS7OotF/zOaryQYi4NRi0wktt 12 | K6UOYF0xBriDah4MF0FpFDum4YEmKnRxl9822efqlqSOHrot3R2dS5dFR+iHKW+z 13 | kU0MIXOlvCgZcm7LGD0pRjhARlI2BjYXqM/RaaEpMQorPj/GTSra5qT6KkrtHjjh 14 | hThRxtNnjoD1cUsKw3jfTFSaOwT8rBjByZkCAwEAAaAAMA0GCSqGSIb3DQEBCwUA 15 | A4ICAQBsEBgC2YepuZq/8UqvKMZKVy/etDKXj7BB+QPb+leNiKD7p4LDxHJsZSH8 16 | Ku9uMPeLfiQDn5jA41k5SlGttzvObd65RdEbO3yHpqsg05EGSDDLfaE1k2Al/qmX 17 | /o8roPZF7+2kZthgMAgkcokS54LYqEYTGqOf3J9Ss0yRIZwhaOVebfFIbIOdpw0B 18 | JNMIJPHTMdZrcuRVI+wR1uPLIlEJzBvxTGbTrvPU25WJFtu+EajKqXO0SHdy0yx8 19 | uH4ykRBJRc36+oYo7nZ5D56dh7pZn3+9J64FKAOV0Q3KqMFieGy053ezuhJd70eZ 20 | UozTgfjs3WpMzoYmKETSyl3XZSdInRe+sUlKPruTsKyg69oYxjPlrGfAmmGcCFca 21 | TnZinT18dI92zK7OtOVkmYeYKC1lwuhftVrNMXzZuHOGpS9NNYtc4nDqDMIEOfV3 22 | 6rCdu03WjEgJ+Z67tJs16xOx9du4/EHxS2Ijn9DPfVJvYy0TgzDi1BUpjWx0KTLx 23 | C4OQbEZ/QTWmHVbSch/hcZhzbf7SNh5RpnW4EtmcpDFjIKMfxJmoKeiTf7qnilx0 24 | 7uRvsZFKoDKRDOFiPfgMg5AOtLHziYsd9m0tJjC2GHvFuPjzOtzhnUUjmmvht170 25 | 2aqKakjST4amg7jzLcs871HX0/WjOtt29NpOz140blkKf1bisg== 26 | -----END CERTIFICATE REQUEST----- 27 | -------------------------------------------------------------------------------- /.docker/tevun/etc/nginx/ssl/server.key: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | 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 51 | -----END RSA PRIVATE KEY----- 52 | -------------------------------------------------------------------------------- /.docker/tevun/etc/nginx/tevun.conf: -------------------------------------------------------------------------------- 1 | access_log /var/log/nginx/access.log; 2 | 3 | #Adjust client timeouts 4 | client_max_body_size 0; 5 | client_body_buffer_size 1k; 6 | client_header_buffer_size 1k; 7 | large_client_header_buffers 1 2k; 8 | client_body_timeout 15s; 9 | client_header_timeout 15s; 10 | keepalive_timeout 15s; 11 | send_timeout 15s; 12 | sendfile on; 13 | tcp_nopush on; 14 | tcp_nodelay on; 15 | 16 | #Adjust output buffers 17 | fastcgi_buffers 256 48k; 18 | fastcgi_buffer_size 48k; 19 | fastcgi_connect_timeout 15s; 20 | fastcgi_send_timeout 15s; 21 | fastcgi_read_timeout 15s; 22 | fastcgi_busy_buffers_size 256k; 23 | fastcgi_max_temp_file_size 0; 24 | reset_timedout_connection on; 25 | 26 | location /ping { 27 | add_header Content-Type text/plain; 28 | auth_basic off; 29 | return 200 'pong'; 30 | } 31 | 32 | location ~ ^.*/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ { 33 | auth_basic "Restricted"; 34 | auth_basic_user_file /etc/nginx/.users; 35 | 36 | fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend; 37 | include fastcgi_params; 38 | fastcgi_param GIT_HTTP_EXPORT_ALL ""; 39 | fastcgi_param GIT_PROJECT_ROOT /app/projects; 40 | fastcgi_param PATH_INFO $uri; 41 | 42 | # Forward REMOTE_USER as we want to know when we are authenticated 43 | fastcgi_param REMOTE_USER tevun; 44 | fastcgi_pass unix:/run/fcgi.sock; 45 | } 46 | 47 | location ~ ^/cgi { 48 | auth_basic "Restricted"; 49 | auth_basic_user_file /etc/nginx/.users; 50 | 51 | add_header Content-Type text/plain; 52 | 53 | root /app/cgi; 54 | rewrite ^/cgi/(.*) /$1 break; 55 | 56 | include fastcgi_params; 57 | 58 | fastcgi_param QUERY_STRING $query_string; 59 | fastcgi_param REQUEST_METHOD $request_method; 60 | fastcgi_param CONTENT_TYPE $content_type; 61 | fastcgi_param CONTENT_LENGTH $content_length; 62 | 63 | fastcgi_param SCRIPT_NAME $fastcgi_script_name; 64 | fastcgi_param REQUEST_URI $request_uri; 65 | fastcgi_param DOCUMENT_URI $document_uri; 66 | fastcgi_param DOCUMENT_ROOT $document_root; 67 | fastcgi_param SERVER_PROTOCOL $server_protocol; 68 | fastcgi_param HTTPS $https if_not_empty; 69 | 70 | fastcgi_param GATEWAY_INTERFACE CGI/1.1; 71 | fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; 72 | 73 | fastcgi_param REMOTE_ADDR $remote_addr; 74 | fastcgi_param REMOTE_PORT $remote_port; 75 | fastcgi_param SERVER_ADDR $server_addr; 76 | fastcgi_param SERVER_PORT $server_port; 77 | fastcgi_param SERVER_NAME $server_name; 78 | 79 | fastcgi_pass unix:/run/fcgi.sock; 80 | fastcgi_param SCRIPT_FILENAME /app/cgi$fastcgi_script_name; 81 | } 82 | 83 | location / { 84 | try_files $uri $uri/ =404; 85 | } 86 | -------------------------------------------------------------------------------- /.env.sample: -------------------------------------------------------------------------------- 1 | TEVUN_HOST={TEVUN_HOST} 2 | TEVUN_PORT_HTTP={TEVUN_PORT_HTTP} 3 | TEVUN_PORT_HTTPS={TEVUN_PORT_HTTPS} 4 | TEVUN_PORT_SSH={TEVUN_PORT_SSH} 5 | 6 | TEVUN_USER_ID="{TEVUN_USER_ID}" 7 | 8 | TEVUN_USER_EMAIL="setup@tevun.com" 9 | TEVUN_USER_NAME="Tevun Setup" 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | 3 | /.env 4 | /.key 5 | /.users 6 | /docker-compose.yml 7 | 8 | /vendor 9 | *.cache 10 | -------------------------------------------------------------------------------- /.users.sample: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tevun/server/0f557f62ba4c37ccaf75f048fb571e1e37f98a99/.users.sample -------------------------------------------------------------------------------- /PROJECT.md: -------------------------------------------------------------------------------- 1 |

2 | logo 7 |

8 | 9 | # Tevun ~ WIP 10 | 11 | ### Disclaimer 12 | ---- 13 | > No momento não há ainda como fazer os procedimentos abaixo. 14 | > 15 | > Para entender o estado do projeto atualmente clique [aqui](https://github.com/tevun/server#versões-iniciais) 16 | ---- 17 | 18 | # O Projeto 19 | 20 | Este projeto é uma API para gerenciamento de domínios destinada à gerenciar múltiplos hosts em contêineres gerenciados por arquivos que seguem o padrão "docker-compose". 21 | Utilizando ele você transforma seu VPS em um ambiente simples e rápido para deploy de aplicações. 22 | 23 | Para publicar uma aplicação basta executar um comando para criação de um `git remote` com um hook `post-receive` configurado para parar e subir seu projeto `docker-compose`. 24 | Com essa estratégia você pode instalar bancos de dados, criar volumes e manipular todo o ambiente remoto do seu servidor apenas com um comando `git push`. 25 | 26 | ## Objetivo do Projeto 27 | 28 | Se você tem trabalhado no seu ambiente de desenvolvimento com Docker deve ter encontrado pelo caminho alguns desafios na hora de publicar sua aplicação no ambiente de homologação, ou mesmo em produção. Costumeiramente deve ter sido preciso publicar sua aplicação em um ambiente não homogêneo ao seu, como servidores de hospedagem, ou mesmo em VPS's onde é tudo instalado diretamente na máquina e é complicado ficar mudando as versões dos serviços. Provavelmente você precisa fazer vários acessos via ssh para poder obter as configurações necessárias. 29 | 30 | O Tevun atua justamente nesse ponto: integrar seu ambiente de desenvolvimento aos seus ambientes remotos. O processo é simples e não há nenhum milagre. Ao criar uma entrada no servidor que tem o Docker, Docker-Compose e Tevun instalados você recebe um `docker-compose.yml` básico e a URL de um repositório remoto para o Git. Quando faz um `git push` para esse **remote** um script _post-receive_, previamente configurado, no repositório se encarrega de fazer checkout do seu código para a pasta do projeto no servidor e parar e subir os containers. 31 | 32 | Sendo assim ao usar o Tevun você passa a ter um gerenciador de sites que cria os domínios e vhosts para você (inclusive com a parte do ssl - https - fornecido pelo Let's Encrypt) de forma automatizada e roda seus projetos através de seus containers. Ao fazer um `git push` ou usar `webhooks` (e incluir as devidas configurações) você pode reconfigurar tudo o que você tinha de infra no seu projeto remoto, replicando o mesmo ambiente que você tinha em desenvolvimento. 33 | 34 | ### Acompanhe 35 | - [Telegram](https://t.me/tevun) 36 | - [Twitter](https://twitter.com/tevunapp) 37 | - [Site](https://tevun.com) 38 | 39 | ## Como isso funciona? 40 | 41 | Você vai instalar este projeto no seu servidor. 42 | Durante a instalação será gerada uma `server key`, guarde-a. 43 | Depois de instalado ele irá disponibilizar para você um conjunto de comandos e endpoints para que você possa adicionar e remover `sites` do seu servidor de forma automatizada. 44 | 45 | A topologia do projeto é semelhante à imagem abaixo. 46 |

47 | Pairing 51 |

52 | 53 | Para garantir a identidade do cliente é preciso pareá-lo antes de rodar os primeiros comandos. 54 | Para fazer este processo é preciso informar o `server key`, que será validado para ativação do cliente que fez o pedido como apto a se comunicar com o servidor. 55 |

56 | Pairing 60 |

61 | 62 | Para realizar essas configurações você pode usar o CLI para parear com o servidor, e, dai pra frente poderá usar esse servidor para adicionar seus domínios: 63 | ``` 64 | $ tevun pair 65 | $ tevun add example.com 66 | ``` 67 | 68 | E quando acessar no navegador verá: 69 |

70 | Pairing 74 |

75 | 76 | Da mesma forma você pode usar o CLI para remover o domínio 77 | ``` 78 | $ tevun rm example.com 79 | ``` 80 | 81 | Você pode ver os arquivos que são gerados para esse setup inicial [aqui](https://github.com/tevun/server/tree/master/samples) 82 | 83 | ### O Servidor 84 | 85 | A API Rest para gerenciar o servidor contém os endpoints: 86 | 87 | | METHOD | URL | 88 | |--------|--------------------------------| 89 | | GET | /v1/projects | 90 | | POST | /v1/projects | 91 | | GET | /v1/projects/`` | 92 | | DELETE | /v1/projects/`` | 93 | | PATCH | /v1/projects/``/down | 94 | | PATCH | /v1/projects/``/up | 95 | | PUT | /v1/projects/``/env | 96 | | GET | /v1/projects/``/env | 97 | 98 | E conta com os seguintes comandos: 99 | 100 | | COMMAND | OUTPUT | 101 | |---------------------------|--------------------------------------| 102 | | install `` | generated key | 103 | | info | ``, `` and generated key | 104 | | ls | domains list | 105 | | create `` | docker-compose.yml & git remote | 106 | | destroy `` | docker output | 107 | | start `` | docker output | 108 | | stop `` | docker output | 109 | 110 | ### O Cliente 111 | 112 | O Cliente disponibiliza os seguintes comandos: 113 | 114 | | COMMAND | OUTPUT | 115 | |---------------------------|--------------------------------------| 116 | | pair `` | pair host confirmation | 117 | | unpair `` | hosts list | 118 | | paired | hosts list | 119 | | use `` | selection confirmation | 120 | | ls | domains list | 121 | | add `` | docker-compose.yml & git remote | 122 | | rm `` | docker output | 123 | | up `` | docker output | 124 | | down `` | docker output | 125 | 126 | ### Versões Iniciais 127 | 128 | Nestas versões iniciais ainda não temos vários recursos disponíveis, como a API e o CLI, mas temos um conjunto de comandos que já pode dar uma ideia do que está por vir. 129 | 130 | Como requisitos para rodar o projeto você precisa ter o `docker` e o `docker-compose` instalados. 131 | Caso não tenha você pode ver se o seu sistema é compatível com algum dos nossos instaladores disponíveis. 132 | Dê uma olha [nesta pasta](https://github.com/tevun/server/tree/master/installers) para ver se encontra seu sitema na lista. 133 | Obtenha Mais informações sobre uso do nossos instaladores [aqui](https://github.com/tevun/server#instalação-de-requisitos). 134 | 135 | Para instalar o projeto em suas versões iniciais é preciso fazer os passos abaixo: 136 | 137 | ##### Instalação 138 | 139 | Instale o tevun no seu servidor 140 | ``` 141 | $ ssh root@ 142 | # mkdir -p /usr/share/tevun 143 | # cd /usr/share/tevun 144 | # git clone https://github.com/tevun/server.git . 145 | # ln -s $(pwd)/tevun.sh /usr/bin/tevun 146 | ``` 147 | 148 | Configure as credenciais adequadamente 149 | ``` 150 | # tevun password (gere uma senha para usar adiante) 151 | # passwd [opcional] (use para ter uma senha do seu root para usar como SU) 152 | # tevun user {user} 153 | ``` 154 | 155 | Reinicie seu servidor e entre com o usuário sem privilégios para fazer o setup do Tevun 156 | ``` 157 | # tevun ubuntu/locale [opcional] (use para configurar o locale do Ubuntu) 158 | # reboot 159 | $ ssh {user}@ 160 | $ sudo tevun setup {user} 161 | ``` 162 | 163 | #### Gerenciando os Domínios 164 | 165 | Para gerencias os domínios você tem os seguintes comandos: 166 | 167 | - `tevun create [