Show More
@@ -0,0 +1,116 b'' | |||||
|
1 | <!DOCTYPE html> | |||
|
2 | <html xmlns="http://www.w3.org/1999/xhtml"> | |||
|
3 | <head> | |||
|
4 | <title>Error - 404 Not Found</title> | |||
|
5 | <link id="favicon" rel="shortcut icon" type="image/png" href="data:image/png;base64,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"> | |||
|
6 | <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> | |||
|
7 | <meta name="robots" content="index, nofollow"/> | |||
|
8 | <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> | |||
|
9 | <style> | |||
|
10 | * { | |||
|
11 | box-sizing: border-box; | |||
|
12 | } | |||
|
13 | body { | |||
|
14 | background:#eeeeee; | |||
|
15 | color: #323232; | |||
|
16 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; | |||
|
17 | margin: 0 auto; | |||
|
18 | max-width: 1000px; | |||
|
19 | letter-spacing: .02em; | |||
|
20 | font-size: 13px; | |||
|
21 | line-height: 1.41em; | |||
|
22 | } | |||
|
23 | h1 { | |||
|
24 | padding: 20px 0; | |||
|
25 | font-size: 1.54em; | |||
|
26 | } | |||
|
27 | ul { | |||
|
28 | padding-left: 10px; | |||
|
29 | } | |||
|
30 | li { | |||
|
31 | list-style-type: disc; | |||
|
32 | } | |||
|
33 | .error_message { | |||
|
34 | font-weight: normal; | |||
|
35 | } | |||
|
36 | .logo-container { | |||
|
37 | float: left; | |||
|
38 | width: 150px; | |||
|
39 | text-align: center; | |||
|
40 | } | |||
|
41 | a { | |||
|
42 | color: #427cc9; | |||
|
43 | text-decoration: none; | |||
|
44 | outline: none; | |||
|
45 | cursor: pointer; | |||
|
46 | } | |||
|
47 | body { | |||
|
48 | padding: 10px; | |||
|
49 | padding-top: 10%; | |||
|
50 | ||||
|
51 | } | |||
|
52 | .inner-column { | |||
|
53 | padding: 10px 30px; | |||
|
54 | width: 33%; | |||
|
55 | float: left; | |||
|
56 | border-right: 1px solid #dbd9da; | |||
|
57 | ||||
|
58 | } | |||
|
59 | .inner-column:last-child { | |||
|
60 | border: none; | |||
|
61 | } | |||
|
62 | .side { | |||
|
63 | min-height: 220px; | |||
|
64 | width: 150px; | |||
|
65 | float: left; | |||
|
66 | text-align: center; | |||
|
67 | border-right: 1px solid #ddd; | |||
|
68 | } | |||
|
69 | .logo { | |||
|
70 | width: 120px; | |||
|
71 | height: 150px; | |||
|
72 | } | |||
|
73 | .main { | |||
|
74 | padding-left: 170px; | |||
|
75 | } | |||
|
76 | @media (max-width: 979px) { | |||
|
77 | .inner-column { | |||
|
78 | width: 100%; | |||
|
79 | } | |||
|
80 | } | |||
|
81 | </style> | |||
|
82 | ||||
|
83 | </head> | |||
|
84 | <body> | |||
|
85 | <div class="side"> | |||
|
86 | <img class="logo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAScAAAFxCAYAAAAxjW6rAAAACXBIWXMAABcSAAAXEgFnn9JSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAM9BJREFUeNrsnQtwHVeZ548etmX5dQMJSZx1LANhA+us5YlhSLyLpcCw2AtYXrY2Do9YKqaAhA22h0fBEtZyDdQACcieLFMkM5TkzBRJpgBLvBwYEstbE2cZEixT4RHiwtd5OInz8JUfsmRb1vb/6hy5dX373u6+fU6f7v7/qrquJV/dc7v7nH9/33e+8x0hCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEkGxRx0tAAtLqHDn577YK7xtyjoL8d14ehFCcSE20yAPis0AKkvpdrQzK1z1SvIYoXoTiREppk1YQxGeZFJ/WGL+PsrbcwuW2wAjFiaRQhJTlsypCK8gkg9K6OuSytoZ4aylOhCJkK0qo9lO0KE4kflpdLlhWRKhW0VI/E4oTiQAVD4JFtFj+u5WXpWb3cMjlHg7yklCcSGVaXOJDayg+K0uJF4PwFCcKkZieO0TsIC9FioJFcaIQkcQI1h66hBSnJNImj2XifOCapNslHHRZWHleEoqTLVaREqI2wWA1mXT93GJF64riZAQ1c7ZKnM+uJqQagy53cFAwdkVxitBFU2JESJSuIMWK4kQxIhQrilPy3LQOihGhWFGc4qalRIwYMyJJEasBkbEAe9rFKedy0zoEp/VJ8lGzgUqs8hSn5FlHa+mqkQy5gANps6rSIk5tUoxoHZGsW1X9YjJW1S8SHqtKsjh1uASJsSNCLkRZVP1JdP+SJE65EkEihARz/3YkVahsFaRO59jpHBM87D7a2tomcrkcr4X9xz7n2GR7CMRWy4kum2W0tLRMOxYvXjzt57KP6qEhUSgUiq/Dw8NicHBw6mdinUXVZ1uMyiZxQkLkRgpSjDegtVU4lo9wLKDiz6tWrSr+jN9HTT6fnzoOHTo0JWQQMBIb/a4YVexCFbc4tUi3bYPgLJtRC0gJEQSokvUTB0q03BaX+h0xgpr1g0UV29MiLnHqFAxsG7OClAumLKJE+yCOYEGk9u/fT2vL0LPCObbH4faZFKcW6bZ10m2L3hKC8CxbtmzKKsrcCJKW1Z49e6YEjLGtyOkzaU2ZECfltrXx3oZHxX5wKBFKgyVk0tKie5gsa0qXOMEy2iQYSwptDbmFCK82xYSSjpoxxKHcQ1pZ4S6lmIxNbRUacqd0iFO3dN/ougUUIgSnVayImAeWFURKzR4ylhUIJVKRqXyU4oQRtZPuG4UojYJFC8s3XdLds0qcIEycfXOBmJAKVNM1S5dgqcC7Siwl01gehQUVlTh1SHHKtFWkhAivWZwxyyoIsEOkVNCd1lVxNq/dFnE6KDIW+Ib4QISUe0ariChUwB3WFcQqo7GrJaLGIHkU4gQTYV+WxAivjBWRMK5ghsQKwfHuuMWpV0zmMqXSTYMYdXR0UIxI5GI1MDCQZjcwL62nWMXpqEhJ2gBESIkR3TRi0g3s7++fsqxSlCRaU2C8VnFKdCAcAuQWJEJsQM0CKssqwfSJydSCWMQpcS4dYkcbNmygdUQSZ1XhNWFpC/iyF8UlTomYpYMQrV27lrEjknjcQpUQ9y+0a1eLOFk7S6dKhVCQSNrdvx07dtguVNucY7Npcep2ji02WkidnZ3suYRCZQf4MqFm7WoRp33SeqLLRoiFQtXX12dLjCpUQmZYcYIKHI3rTFVQGxYSBYkQb2BJYdYv5mB6qMXAYcXJeAqBmvbfuHEjZ9kICYia9YNFFUN6AsqprDMlTj1ispicdmAdKbeNEFI7iEkpt89QfCpUSkFYcdIab4JlBAuJbhshZtw+CJVmAsedwoiT1njTpk2bRE9PD3sNIQZBEL29vV1nXCpw3Kk+RCPaLKalS5eK6z/ZzZ5CiGEwyaTZKFgV9A/CiFObrm//8Y9/3HFMx8QfCmfYWwgxjOa4bmCjJow4LdP17VevXi1ac/Wi74/D7CmEGEbX1vMmxUnLt4dLt2DBgsl/N4+LX700xt5CiGE074UY6MODihOC4S26xEnxnssaxF1PsGg8IaZB+SCNBNKOoOKkzea78sorp/387kuE+LvfH2NvIcQgmjfmSKY4zZ8/f9rPsJ5+/sxJcfzMOfYYQgyBHEONuYWBzLKg4rRY17d2u3WK/76wXnx1P4PjhKTEekqm5VSO/3Rxg/jFcyMMjhNCcYr2w4OwcuXKC343t1GI297QKL742FH2GEIMoXnJmG/ls0acvEDsafzcOIPjhBhC84ydb+ULIk7ahKlcvMlN1+JG8a3fHRPPjYyz5xCScK8xUeKkki8rWU+XNdU57t2rvLWEaEZzIqYWy0kbpWkEXtYTAuP/eOAEew8hyWWBDnHSJqfXXHNN1ffAesK6O7p3hOhHY7VZ325dY5IuGKynjftPF927vndcwh5EUsPjjz8+7ec3velNYt68eVM/P//88+Lw4cOef1/6/ijEKe5dXIKI0wJdX+L666/3J7mO5YRDuXcfeeNc9mqSeFDT+zOf+cy03919993i2muvnfr5Rz/6kbjnnns8P6P0/TYbZTrculYbzuwL/35G8ZXuHUkDx48fF9/85jervg+WU1o8xkS5ddVm69xg1u6/LawXPzh8ju4dSTywhiq5awr3ez72sY9d8P8LFy6M9Hthxi6GXVrsE6dqeU6lfHTJTPHzI2N070ii+eMf/yjuu+++4r/hkpXGnbwsp3LilEbqk/ilsazl1tc3FP/91f0FlvUlieQb3/iGb8FRlhMsJFhbOH784x8X3cK0unZBLKc2m87uv17eKL733Fnxp5NCfPHxV8X333kpeztJDLCYlKUEq6lSMNttNUGk3IFxzNB9+tOfFu9973uTJk556y2noC6dm1tfP6mtsJxgQRGSBGDtuAWmu7vbl9Xk9Vn4+0ouId26kAQJhpfy1tc0FoPjALGnhw6fYs8n1rN169YpdwyBZ4hPqbggHuW2rB577LGp47vf/e4FS0xU7CoqNC/+9UWQTTUndHwBlErBrqNhGT5zTqz/5ZgYGa8T82bUi++/61JxRXMDRwAJxYoVKwL/DQRDVxuVPvuDH/xgUcSUgCHXKSowU4dNNjWBDx6s9qbGpHemBY4gwb2786nxYknfTz36MuNPlgJLAHsT6gLxF2RKI2iMwYqnf5RZ07aR5nNLhTiB9y2cIX7y/Bnx+xP1U/Gnzy/LUQ0yBlwlCCAOZFQX+8b73lecCbv88sut+Z5eFo5buBHkhtAqUUdQXIktzhMzdW5XMOo8J4pThHzpLU3iLx+fdO8Qf3rrJbPEOxfO5ojNOBApHBAoW/KD/CwzgTCp9yGeVCkhEoKVxtyn+rScyBWz68WHFp0/HZT2Zf4TUWB2DJZJEvOCKs3EQZhgidlkGdJyKsOHF89y3LuT4vBYQzH+hPwnLG9BoJwQDHIssI0ycBwlbuvH7abdeeedRctJBb+VKGHGLs1xtca0ndD/fsss8dHHTosZDSr+NCy+suIijkwyJVCwomx0g7y+U7UkzbSSOpPizfMbxYcXnc+Q6D90ktUzyQUuntcqfyUE6kj7jBgtJ8PcetVs8ZtjI8XZO4DZu4XNDQyQxwwGeqkF4CezGS6OV0wFrk6YOBISGTEjVkqpy4c4VRqzr9MmTkPCkppOfvjim+HejYmxiUmBQoD8inc0iqtzM3jXYwIzUKWD309CItaNVXLDYAVhRg6zWn6FClPx5cSJTBJ3Fcygbl2iFq8tciylDy+qF+cmJhPbJxM0Xym+knQBqwri9cMf/nAqN6gaEDF3gJlM59ChQ4kSp8Rx85ImsWLB+VU3z42cFZ3/9yX2vBS7jUGsoYSWG0kDg5kXJ9C9tEnUT5yd+hkzeNzePL0gpuXXeiJ2EyTmlMiaJFh79zdLZ4q/+s3ZYnoBwAzeFXMaxK1vns8ekFILKk6Uy6h2TFFr/tQriV6c9jtHR9Rf4JFHHtF+km+/eKZYc+lp8S8vnzcUsUHCwuZG0bG4mb2ARAJm9fwsNUHypG3r/UoZGhqK/TtkJnX69v8wV1zSeHra77BBAuqQk/SgFv+atLDQJjLPkXZQbVMAvBczi1iQHHUNpigpFLQ5SoM6xCnxpSZ7ls+ZFn8Ctz36CtfgpQg/2ywpYYrKxfrQhz4UaqcS1BB31xEn4cVJm533xBNPGDlZpBdg37uxs+cFCqkFmMGjQCUbxHdgvahSKdUorSRZC362dvKimhuYZbfOigzx4eFhY229+/JZ4t9ePSN+9tKEqK+rmxIo5EB9/12v4yJhC1Hr4bxE6cknnwycs2TT2jpYe1GKpeVu3R4d4pRPS2dH/OnX/zosXhmfNfU7lQPFKgZ2ilOUS0hsC0bD8kLGui07qGgUJm1unTZx2rt3r/ET7/3zeWL87PRgOFw7CBSzyNOLqoxpGza5dppdOt86EtRESM3+S8h/+va1zWLkzBkKVEa46aabxJYtW7S3U26Bsx/rMAMunVZx0iKpJnKdyrE0N0N8Ykn9tAC5EihmkacHtTOJ7oW+iBuh2sHu3buL7eHVr5Vm01Ka/fv303JSmAyIl/LRN8wR73jNuakFwgrsgUeBSo846SzWpkrlomKlOz1B1fb2K1C2LEROquWkRVJNpRJ48fXl80Wu7sINObHMhQKVfDDTh40sdYFqCJXED+LkJ+HTFutJY8wpH+TN9To/PAjPPPNMrDfkn67PiZHRkxSolIL8J11BZz/Ck6QyuxSnEp5++ulYbwgC5L1/Pv+CGTwKVPzA8nBvxw0XCgd+H2S/Nr/Z4zpI0oJfjW5dINWzIiAO4kgnKAUB8tveOEMMj1KgbEbFkFSBOaQH+AH5RDZmY9uE5usTqIJdmIC4FlmN23JS3Li42RGoxgtm8JRAMc3APpAe4Ndt2rNnDy9YPC6ddstJm/UUd1DcDWbwrsudLStQqGJAgbKP7u5uX+/jZgVVTBu95XkpTlHQc21OXDP3zAUpBoCJmvaB5Sh+4jpw7by2hSJaLafAXlcYcdImrXElY3px558tEPPECAUqIfh17Wg9eaMx5hRY9ayxnIANQXE3mMG7b+VFYuL0iYoCxXIrFCdaTVUJHOwLI07apNU2y0kJ1LfflhOjYyNl/58CZQ9+K1tSnIxbTSAf9A/C1nPSssGmbXEnBVIMkAPV9ctjorlpzgX/rwrW3XXda8VbL5nFXu5B2L3iECNyC4raLCCs5YS4E0rqKpCKoMqVlAqXn6zt0r8Jm3BZem28zlMXmtfUBTbL6kI21OscnTrOAIslly5dauXg2ouZul8eF5fPm+v5nq+seA03TagwiN2iEBYkYHoJwPvf//7AlSnd69/87EBcDSSKloIlNF4F88Kcpw6WLFmic6ffwFoTtqqaNondtWuXtYPrescq+utrmsXzx094vgebJvzjgRNUopiweUcTm4EoaRSmUP5ivcnG/GBj3MkNkjQhUEdOnPR8z1f3F5hNHhNJWsNmE5rjTaEyX8OKk7awPsQpzhIqfgWqe+nssstcFMwmj4cga+2ISz30Zs6H0otaimVrk1rbUgq8BOoLV8+oKFAqm/y5kXH2frp1VtPf36/VMDMtTtqk9qc//WkibigE6n2XTVQUKKQYfOAXLzLVgG6dtSC/SXMlglAfbqXlZHvcyc1fL8uJd7z2XEWBgmv3gYdedFy9EY4EunbWoTneFPrDG+NotBooPIecJ1tTCkr52xUXiU89dlQ89NKIuLjZO40AM3l/KJwWn3cELauiEcXOJ9XEB20ESSdwW1u6dmZRJV5sFNkdO3bo/PjQHlZdjQ3vdo42HWeEfJgvf/nLiRp8EKgHXxivmAcFkKiJhE3uj0fiBukDyG/SyEVxuHU1qWKaXDu3BfWeyxoq5kEBBMo/8IsjjEORtLt0oeNNUYiTtjODWxd3XXGdAqV2GGYcisTJwMCAVu2r5Y8barUKnWOTczTpOLNFixZFspzANKsXzhaz6s6Jnx8eEfNmzfR83+lzE+Lhw6fE4ZFx8U7nbwgxCWbourq6dDbxNef4Q1yWk1br6f7770/sjf/YVXOLmeRPF4bLlltxg4RNzOYxH4qYRHNuU7GJWv44CnHSZhcm1bVTIA/qq63zfAmUyofCZp6EmGD79u3WCpP1llPSrSclUNi0EwJ1ZrzyUhbkQ33q0VeKa/MI0Qlm6TQXl6vZaIlCnPJC41q7++67L/EdAQL17bctEK+eHC67aUIpqGpAN48k3KWr2WiJKtFGm2unEjKTDoLk3/vPF4vCyHExcqZ6CgHdPJJgl25IRLABb1TipFWGUXQrDaCiJgRq+OTxistdSt08lF9hdQMSmXI47pzG2k0gkpTzqMQpEqX0wuYCdGEE6qG/uFS8tmFUvDziL8epOJvHpE2SDKspEpcuSnHSaj2hvlPSA+NuFjU3iB+sukRcNuNM1WRNBZI2EYf6u98f4+gioUFuk+Z4U15EFIOOUpy0rh5MShkVv2BXFwgUssnzRwtVUw0U3/rdMdaIIuEtCEeYNJZHidRIqYv4ix10jhZdZ/3rX/+6mDWeNrBg+AfPjIp/N3+emNXor1AEFg1/8i3zxUfeOJcjjvhm+fLlulMIlttoOWl17UCaXDs3WI/3jT9bUMyFOjF22tffIECOfChaUcQvECXNwhSZS6dDnLS6dmnIefICuVDfue414vipE74D5WCywsGL3PGFVMVAIDzS8V+n4Qtqde3uvfdesXr16tR2oCewg/Cjr4hj443i0rlzRH2d/1uEOlHYN++K5gaORDINxJkuuugi3c0sERHO2uuodqZVntOS8+RFMdXgXa8Ti5rGfS15oRVFLLGaIk8n0mE5tUjrSRtpDYy7GT5zTnxp/7D43qERcfm8eWJuhdIrXlbU5/9jTlztiB0hmnfzBai90hflB+qw/zFP2abTtUPe05o1a1LdmZoa6opLXjArN/D0cPEx0jzDv9CgRtQ/Hzwp4BVCqEh26evr010nXInTaJQfqKuItdYrgYxx2zfejArUheq7/rXizOlR8dyxY77zoRTIi3r3rheKLh/JJgaEqU/UUI7XtDj16/iybsvpnnvuyUznggWFhM3FsyfEwaMFX5UN3KiSwFinxzV62QI1wjXXCQdaFv7rEqeC0JzzlOa0gnIgUA6BetelM4sCdfRU8GoFqHDwF44VxYA5raYIyesa6zrnnA85xyd0ffgxx8W58sorE7O3XRQgDtWxqLm49OVHzxwXY+NnxdyZM0VdgHQD1C3/1xdHxcPPnxKvnzdDXDGnkSM4pSAArrlGOMA0oBbTrE7zF9/nHK26Phwzdpi5yyJ7XxoTnXtfESPn6gIteymlY/Eccetb5jM3KoVAmBAM10ykuU2mLCeAKGyHTutp5cqVRQsqayxyLJ6b3zBHPORYQH8sjASezVP8YfhMcXsqWFSc1UsPSLq85ZZbxOjoqM5m4M5pSzzUveWs1sA4uOOOOzLbAeHePfSuS4szei+fHPG1kUI5ECRXs3qsvJkOkHSpufoA0BrQ0m05QbYvc46362oAZXyzaj0pbrisqRgwxz55L548JWY1NIqZjcFvLURq17OnxK9eHnPcvEbGoxJsNd100026rSa4crfobKDewLXSnjefZetJgXQDVNh884JG8azj7qKIXRgrCiAnCqkHKA/Mige0muIa1yaioLhKCIpfTetJv5u34fVzxTHHAtp7ZEQcGzstmhobxYyGcLcZ8SikHWAyEMtgZjXUceTTalJjOvKM8DjECbzoHJ06G4BArV+/nr1TunkrL5klfvLsiDgyMho6WO62pB7408li0JwiZTdf+9rXxIMPPqi7GRRWe0B3IyZ7mdZSKgAlSGFBkUmweBjpBkg7gAV1+by5oVMOFIhFIfWgY3EzL7CFVhMW+Bpw6bSlD8RhORXHitCYVkDr6UKQtLm+ZU7R3fuX50dEYbR2KwpB84cPnxIDh0bEvJn1rHqQPatJa/pAXJYTOOocOVpP5kERu42PvVp8jcqKoiWVSaupXWjKCI/TcgKzxWQ5FVpPhnldU8NUsPyXL49GYkW5LSmmH2TCakJBuS+YOifTlhOspoO0nuIFMSjs+PLMybNFK+p1c+fULFIKZJl/8s3zmW2eTqsp8oJyNllO2pMyaT1VB0tfbmxpFmPnJopWFLZGR07UbEeggiwiLgeK3GE5DBYWz2pgTCpFVlNeipMx4ljt+aRzbNItTlmrWBAUBMtVZvnuF8ZEYexMMS9qZn1DqOzyUl4eZeDclNVkIK8JbBYRbvtko1un6BWa856yXLEgKEg52Piro2KXXFc3b9ZM8bo5c8WMhugWEDBwrsnPMlN5AFbTEtPnFledjP26rSdULFiwYIFYsWIFe7APKwp1opQVdez0WXHMeRJjW6rZEcWiVOAcGedM5oxIMczUa4rFaorTcjJiPUGcHn/88eIr8W9F3fm7Y+KepyarZUYdMFdg4wZYUR+5ah5rSYWkvb3dRAnegrSaCqbPL85eod16GhsbE01NTZy5C2hFqeUve18+LV4dO1sMmJ85d07MmVl7wFwB6+k3r54uWlIIosPtu7iJIuUXiNLWrVtNNPU153gwjnOM267Wbj2BLOxzZ8KKanCE6eI5zeKi2bO1tIf0g4+8ca5458LZvPhVWL58uRga0u5pxWY1xW05GbGewNNPPy3WrVvHHh3SikI5ll87Vs6Lo+Pi5OkzYnhsrKZqB17AgkI9Kczw4bH5+nmNjEuVAQFwQztfx2Y12SBOUOQWobHOODhw4ABLqtSAyi7HGj2I1MjZc0VXDxsszG6cIRrqoxUQBM+xCQMqIRw8flZcnZsp5s+o540Qk6kDq1evNpE6kHeOWJ/oNjyWIE4HdTfC1IJoeMaxbr40VJhKOwBw9V7juHr1dfq6E1w+bMaQ9VQExJm6u7tNNGU0G9xGy0lZT+jVbTobYWpBNMB6QtqBCphjrd7ImTOicCra1INyLp87FWHhnMbMWVNIHTAUnsgLw9ngtlpOwMiaO6YWRAsC5n//1Alxx++OTf0OcahL58wRc2fN1N4+AudrHUsqKwF0Q6kDVlhNtlhOAA609ooFSC04cuSIWLNmDZUlAhAwv96xoFAzCqVY4PJhjd4x5zrDmoJQRR00d4N4lAqgY8v1JfNnpNaawmJ2rKEzAKYAb7HhnG2aCoHVhE04W0zcaOY+RY+72oFCx1KYSqjY1DsXNhUTPdMAguBIHYBbZ8JAE4bqNSVJnECnmMx90gqD43pRuVFw+6Zc6qYmcXFzszGRgjDB3UMAPenlWzZv3iy2bdtmoqlBKU5WYFtK7pAUKK2xJwTHkelM60kPcPU6rmx2xGlC/NZx94ou9dmz4uipU8XHIXKk6ur0PhcRNFe7GSfZ7UOipaH1cwDR9hdsOXcbM9zanGO37kYQFN+9ezczxw24egiY43XqiegI00XNs7WnH5QDC47h9t3gWFVJWNNnKBMc9AkLZuhstpxAXgpUi85GEBx/4oknWJROtws9p7EYML/SeX3CsWSQeoCtPlX6Af5twpJSoM4UEjyRkvCk833GHM/zijkNVmaiw5XbsWOHiaaQzrNaaN6HLg3iBPYIA8taWJTOHCjH8rGr5hZNdbh6qMIZp0gBzPYhd+ofnjxunVAh+G2oiByIdZlKktw6RY8JgWLuk3lKFxTb4O65QSAdbl+cM34Gc5rgqSyxsZ/YLE5GEjMB1irde++9VA3DIC8K8agH8ietFCmAmT4lVqZiVEh1MbhQHQ31U5yC0ykMpBYAiBNEipgHCZxf2l+YFjRXIoUUBJRoMZWCUAkE04tCdflsbTXRDe6kAmCatdvaL5JQjwIzd21079JPuZm9qftjOE+qGiiOB6vqBsf1i3L5DCwmWE6GMLKteJrFCeVU9ploiO6dPSIFS+oJmSNVKlILmmZFXja4ViBQk2IV3v0z7M6hjGa3zf0gCXVRkRSGuNPbdTeEuk/XXHONuOqqq6gQMYL0A9SPcqcfKJDMiVpSmOVrqKuPZBurKMDMn0pRQNInEkDBJU3+Zv8wO2eoTpMQ56sOjNrcD5JSZtBYcJzunX084Ax2uHvuNXsKLCyGu4c1fHEHz71AfOqtF88qWlZvc45yM4AGZ+eK3qOwNAieRHECHc6xk+4dRaqcSKkZvgWzmqyJS/kVq+9862+L6+cM0S9irnCZRnECRoLj4K677mL2eAJFqmj9WhqXKsdo/rfi0Jb/IcZPHjPRHKYAlwuLg+BJFqcWMRkcN+Lece1dskUKGedIQ7DZ5fvTZ95TFChDwDzblpT7m7SNwqD8mGd+j+6GuPbOftSSGLweGT1XTOp0c/bcOXHi9Oni8pjxcxNiZkNj5Jsx1MILvd3i+K9+Zqq5QWFJEbm0ihP4f2Iy/nSZ7oaw9o6lVeznqnkziouLUdccAlUqUli3d0qWbMEsHxwGWFVxMvLbR8Xz9/wvk01aVQ4ljW6dwljuE4B7x8XByQF5Uvc7Ll/psphpT+UYs88RXzpw63Wm4kzA+pymNImTkBd7i4mGEHeCQDG9IFl4rd0rBYFzFUQ38r2+/pfi+L8Zc+dQDGp5Eu9fkjenHzTl3qFy5lNPPcVdgxMGtrHCbsWIS2EzBlWqpZQzMjYFt+/0+Dkx07GkGuv1WFOv/uQ7xcMgq5PmzqVBnMAvneMTJhpC9jj3vUsmapeY266eVzbrXAHZQgZ6YXS0uOU63IrG+obIguiYlYPVZBC4c/cn9b6lYSN6Y+4dYPwpHVRaZOzl9tWSkoD40p8++1/EmSPP0p3LkDgBBMdbTTTE+FO6UHGpB587NW23GC8gUHNnzgocnzIcZxJSmIaSfG8aUtLHjLl3jD+lCxWXuvkNc8RV82d4unyK0+Pj0+JTeLpXW3z80j/3iKM//ye6cxkVJwT8hoWB5EyA+BPzn9IF4lIqqRP5Us4NntrWqhwqPoXdjd1C1dhQP60OOvKZDn/rr0yeyqCwbBeVrLt1CmNr7wB3Dk6/y4c0BORMeS2RqeT6NZ8dFX/65PUm85kStXYua+LUIgytvSu6BFx/lxl2HT7lCNVI8dUv576yXohnnzT5NWEx9aXlmtelsB8ZK60CMHMHC4oB8uxYU7ueOyXuOXCiojU1ce8WMfHoD01+tcSUQvFLQwr7zx+kBWVk9u7IkSPFY82aNRy5GQAB9GtfO3NabOrZk+PTkjshShM/udvk14IbZ92mmBSn8mBTzvWm3DtUL2CCZvZAOWH3TB848Pvfion/8z9Nf5V18qGcKupS3HeMLg4u2tUMkGfb5XvmmWK53eHhYZPNJnJRrx/qU9xXkIC22WSDGzZsKFpRJHtAkG6++WbTwjSYVmFKuzgBVP3rN9lBb7vtNtMdlFjA7bffbvrBhLSBrjRf0/oM9BvcwLypxtBBYUGR7HDHHXeI+++/P9X9muKk7wljdIr1kUceKVpQJP1AlL7+9a+n2iOIi4aM9CGjy1uUBcUZvHSDe3zjjTeabnZIpCyfKeviBFB7HDN4V5tq8OGHH+YOwikWpo6OjuJGGIa9ACxPGc3CNa7LWJ9C3hPSC1pMNQjrCSkGrAGVHjDhAWGKYWa2XUzO0GWC+oz1KxV/KpjuyMiBIRSmGtiaJWHKojgpn32z6Q4dQw4M0UAMKQMAwe/urF3rugz3s17n6DTZIBcJJxvMwMaQMjAk3blC1q53Q4b72oAwtHuLgouEkwtECflMMYUh8lm85g0Z73MPiMnyvk2mGoRLgPgTBSpZwhRT3tpNImNxJorTeTAl+zNhqP64W6CYA5UMkFAbU8Y/AuDfzvK1b2D3KyZoHpIunjGQA3XllVcyxcBi8BBZv3696VwmgAD4LVm//hSnSRB0bBGGCtQpdu3aRYGyWJiQMhDDDKvKAB/N+j2oYzechtENEqYa5UadVgFBQl2mGHLTEABvFwnfby4q6nkJprEujo4RU1If8RCmGJNmY+l/FKdkoGrkFOIYEBQoO4QppvuAfjfIu0C3rhpt0sUzCtfhxQtcuZiEqU+kvHAcLafoGIyjs3CZS3wgjykmYYqlr1Gckk2fiGGDQsQ6YpolyrQwxbAsBWSmNhPdOj1gg84O041yHV7qhSlVW4dTnOIBNaAQf2o13TAFKtXCxJQBilNkAnVQGNqkkwKVamECXXGEDJIGY07BnnTGy1bEmKmcWu6++24KEy2n1NEmYkgxoAUVHTFWGBCCKQO0nDQyGFfnogVFYaLlRPywyTl6aEFRmHyCwPdy3gVaTibYFlfcgBZUIoWpnXeBlpNpjNchpwWVKGHCBMoSkcH63xQnO8A+eK1xNEyBsl6YmMtEty5WYuuAdPEoTLScSDViyyKnBWWdMKkH1iDvBC0nG4ilDhQtKCuFiXWZKE7WEevmhxQoUdxXzgJh6uNQoFtnK63SxcvF0XhWXbyY18pRmGg50YLyY0Fde+21mSr5a4Ew9VGYKE5JEqjNcTWepZrklggTl6XQrUscnWIyUTMW0l6TnMJEy4kktPMqCwpbaqcJnBeFKf1wx18zLp7x7c4V2EobgzgtOwsrwcV27hQmihNJuECBNGx9bkksjcJEcaJA6RAoxKFWrFhBYQrHoOBuKRQnCpQe4A5h+6k1a9Yk5qKpBNMDBw7Efe9WO8couzHFiQKlcbAnRaCUMB05ciTuexZb7hrFiWROoHDccMMNoqmpyWphinlJDoUpJpjnFC+dIsY8KGDrchcLFvBSmChOFCgKFIWJXAiTMOOnT8Q8NQ33qb293YrlLrfffjuFidByogU1nbiXu1iQ9W3Fw4JQnChQlgiUWo6CPCwKE1Fwts4uYp/Fw3KXHTt2GMsmV8mVe/fupTARihMFqjomlrtYklxJYaI4kSQKlK7lLpYkV1KYKE4kpEANOMd654gtS1LHchcEvW+88caiC0lhIhSnZPKCc/wsboFSy11WrlxZczb53XffLT772c/acG1RqfQL7GL2wtm6ZBDrpgmKWpM1LUkVEIKbEVCcSPoEatGiReLee+8NFCjHjNyGDRtsqchJYUoIzBBPDohBLRExb3EN9w6BbL85Ser9FghTgcKULBhzShaoJfSAc7zHOS6L60sgkL1z586qM3mIVa1evbooUBYIE5ajPMguRIhectLFm4j7WL9+/cRLL710wXHXXXdN2PD9nOOodIkJIQbptUEAVq5cOXHgwIEpYfrc5z5nizDtozARknGBWrp06UR/f3/RkrJImHLsHoTEyyZLBIHCRAi5gE6KUvHoZVcgxD6wFu8ohYkQYiOtGRWoTt56QuynRcZdKEyEEOvIZUCgmMNESILpTakwHaQwEZJ8egRTBQghltIp0jMjR2EiJGW0iWTP5PXwFhKSXlplvIYzcoQQ60jSTN5RafERQjIkULbP5LGqACEZpltwRo4QYimdwq5AOdfIEUKmsGVN3ibeCkJIKXEGyiGMHbwFhJBKAmU6UM7ANyHEN6aqa8a+Fx8hJHnoLl7HjG9CSGhahZ44VCcvLSGkVuB27RSswUQIsZRuwcRKQoildIpwcSgmVhJCtBO0skEnLxkhxBRwz3YLltIlhFiKVwlg5i8RQmIHbps7DsX8JUKINag4FNfHEUIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCMkadWk9seuuu65FXFi7Ov/oo4/2Zf2mO9emzXlp47VJxL1CH26p9B7nvnUb/k45ObZWod84x34dfacxxfcVN3RLye8GnYMDcFKYeG2SwYYyD5JSjImTI0woKogSzP3OsUONM+f3G53XdkekChQnkjULAoMiVzJQMRCG8OoMiiFeJSMWE4Rps3Msc46N8h60y4cdyjN3JUacpAuxO8Sf5uUB9qATOh2wn10kcy7NWuGj9K/zXmX9DcACjPIJTqbA/eiHC+dcb4zprfL+dErBOur8fnNU195my6nF5Wu3yQ5YkK7HVna+VIsS7nevqBJr8XBXcfQ4n4F+spn9JFJy0lBwu5ytajw613xQ/jwYRWP1Cbw4m5zjoHMhWEg/ncLUIy3tlho/qlP2E+6bF73RoNjv8nLU/0X2MKhP6AWCSO2UZj9JjzD1yodPlP1kHx9kkQGLaIOMPQHE+RAU75DWrogy9henOLX7OLqkG+elxr18MqZKmHQ9bHplagmpAUd4BqUg7XSO7fLfanzid5ujbK8x5hP1A4Jvm2UMotwTsEcKGUmuMHVoFCZlQfWyn0QCDIYt8nrmxfldnbuinrBKRCqBDGquczrxzjIC1YanovOePPtNIoUpJ/zvEIwH2oB8YuPvYDUvE/428kQ/aQvwUCTeYxHGwmbptRR0jb2k5Tlt9uiI+N02dp1EAovJj8vVVSYLuV8KnEoMzFX5jA0iopkkEm18qRz1CbsYedUhS1jMrpJYNvp4z9ZKyyPkIFnnx3ri5U4OScwQ31/GegoVFJdP3I2y07Z4uBChE/pK1iC1lXmyD8ljR63uhithsbSdvDyXHVG5NPK8OsT5PJecx7Xrr2Tyy+tfzWrK+1k7hnNzPm+oSl9o8XFuLfLc1nqcm8pK3yPPb6iGfrG2jGCqe9UXsevsPqcWD5d5j+zveYpTvHGO3iqxijZ5bJFZr30B2+iWwlfJ1WiVR6fz/rx0XQYDttMmKicstsiB0CmT5LpqvHaY6t9S5bzUtUMy5DbhnTTrx5IJEmQdqPaggiCWExQpSj2ievwqV9I3cE03+xUpGfzvrXD9ip/tvG+DT2uwWj/f5KMflvb3fnlOsYpUfQaFCZ13n/AXRFWdsVeKja8O4Rz7fAzgciKy2287LmspSMJimzz3ZWE6upzu7wl4XpvkeeVCuuMDAdoq+Lyf5a5jkD5xwTWVou3ngbXT5/VrE/7iaJX6+e4Q/VDI67Av7jSdJFpO5QbWUACh2SnCZR8Xn5KVLBvXwshabiraWeC0s9mnxRSUXMhBuLOGmE2r/Pv2oO54QEuy38dAzJcRpt4I+iWsxGXO9+2q8CDZEuK61SJMuRrOJycfKu1xLapOlDjJwV9ugOwJcbMLsjPvcXXYnIwPdXrcWHTiJRU+v9ejQ+Hzi0lrMjaizkMtmrzA2nDes8crb8TllnpZD30lFoeKrbWEvO49Htcd54XFnxDtvBwUrXIQlrYFV6VbZ+0h6YYEsTw7IhImRae8b30eLqPJkEUugo9TKzGWx7FGMWmWUzmXIh8i+atfxnfKXfB+52Zsl0/6UqFpqRCz6PSwSC5oS/67X7a1w8PU75WWWsHDVWrxsCDL1dSB9bFNuh49ATt7myi/pASfua7kvIoBfhmzKBfT24gYlA2LcasIfC2o++a20LZEJBZ+3ego3bEW+Zndpu9RImJOrnhHOSsjaMo8ZiPWVRogsmN1VfDHy7pjHmLRVaWt4iD3eGp5xTE2elgx7VXa2iaCB8R7Pc7L8xrK33eVulA1uJSmHnReluigPApBr5lHRVYvhmQ7QyHHSUsA11GdU97HezfGcYMaYxQcP/GLFulmdXh0pG0Braa8V0ygzABTFkDpYFrlYTWVs2R8leyQrl5fmU68sfSJJdsqdy26fLaF5UCr/AwY6faEOi9ZQmN7GUttg4i54qZrKr/qg6z0XH1an+5VC37FeJ27L8vx0RPQCvJzTurBkne1VW1dI4yDDtP11OK0nHb7OHorxH82Vwsae1gXQdjjYdGUsrbckylgMHerV6eoJo5SdIO0dcjn+8qd11CAtsp15jYRP34EA/fvAsGX1qcfcd1Y4RpecO9LB768xu0iWAmSDT5FMF/SVpePdlbRrfOn/EtkJzHRVimtPjv7jiANyQ4z6KNTtNXaVo2DeCDgORXKWC5xV5LwJRgh/6/0PvkR420V3GO/+VMtovqER6Wk2GoPHOP3LInihItkTamUCt8jjAm8x0enaAnRscLGL3IRtDXk0/o0STXBKFSyDuUAryYarT77aH9EEwR+2tof8v+EqL34X2CSmiGOzrU7TOa2BnIenTtMh8OA2OI1kLzidJpW2nt1xt2yXneSqSaOQz7vVauPflqLYEQtTmtlvDGM+GRHnJwBVXXPvJI1XG1lOlhPmWnbOCy5MJ2bxGPp+hlkfu7fcAQiKESEZW0jEjBrsNqtg/UBy8g5EBjs87j5PTF/zShdlLDWFqndIgwqPH7wE0TmgyyJ4lQiVJhRKBfH6UhRCVbuFEJI3G5dSLyKzbWJdOxWmwSRjaLUrW9rAa693/idzAGrNp2+nQ8bipMO6ynvUbMnzkENt2pLjN+nxfA9iNKN3COqB43bhP+ZzxYfn+enDElUOT37RfWcqsj2efNBXgTP9aM4BRSDUnFakBILKExwXZc4FTysk9YIV6n7GShrA4hT1X4gM9dxbrkar+kqn3212nISk1Vcd+hceB01ScxzGvY5qGO1JELulbaqygDOewmGhvMaCiCgtTxoqtEZIKbo95pXFfxKbVaojlF63/yIeJvBa7k2SQM9c8XmNDFUa0eo0OEH3G6th0XTpum8BjW6PJWy4kvZ6eP6tfmweAZLr2klUazwf342/lTJldWsw9Yq60xzNfTBcm11BuyXLXENKopTROZyuae4R/XHSh2+3Pv7fQhG0FXjfl2JgRotGT9s9zmo9nm1Kwf3zgDn48dN3FJuIMu2NgZoy4/49pTrK3JBri9L1VWGpxq91ap24jrjPbKi6+64BlUjdSUS+sSFNXtUvaCqAVjZMct1+HKbKwyUcV+KncnPekM5uDprOK/iYBIB61t7rWrH72Qd7mrWHwbpQfletcxngfw7v65mv7LYfLaJgbzRJTR+98hzL/oe8HG91bn1ybDFYlF+0w0/Qu/n+/XI8+ovCZMsk222+rl3tJwSgBSQ7R7W0yYfwuRVUnVrmbb6PFyFnmomewALw8959foUpZyspLmzQn30zcL/tHubFMwtIlhhtdJdRfxWtGh1tec3prXVLb7CX+Bf1e/aIvzv5Vd6vwZFsJnNTa5zU+dX7npuiGNcUZyiY5uH3w/R2F0aV5CDFp1wn0eH2FphWc7WCk/63tJgPNqWYhKmrrTXeXXK8+rwEkIpSgddMZot5VwzGXzfrPHeFEo/X7a5VUc/KDNJstlgP/RT/iQosSQ6J9Gty3s83WK3npwb2OUhABCmNrlgdlA+tVqquAXdFdpCwbi1Hk/yTikc1QZrLuLzGpKf21rls8u6hPKchIi+dC6+U9kKobjGTpuLA7i51RgqV2NMuq79wkAVUHm/2kXtGxxcIFDC8K7a9SkRp1zIqfuoO0axhneVJ1e1WMKgz3hOlwi/LmuzCJD45/O8WkX5jUNLhWJ7JdEVwQusVesrFXcPkcui+iJoq19Uzp4Pc78KIkRGvs/7FfR75E2Pp8SJkzSZvWIuOQu+X7EYngie9VuQrly7z3K7quP2Be3sUgT2hDyvsIFRtLmkWoa5/P8l0uUq1DCY8PfL/SSMSoFaF3IAFl1GH3Xp1f3qD3ivBsNcB9f9qkV48/I6LokjIG7CrSuI6NPz8eQvN7vV4no6lWt3yMR3Vx1Rxpk2CO8a6Oo7DchYRSFEO11yB5eNFSwXdLIdJW3gvFYFuTbyb9dV2ca99NzQbn+QsjaynW65W7DaRtuPVTYozm+DHvRaqt1wOn221x+0Ldf1a5PXr8PjPPrF9JhjX5jQhat/bHXdr2qfM6juW1z71SnqBDFCuTKqOorESeHIlcRBChrPK1emwxd0dGyPtnQV2/MqfZuPsn5Y6f3SdS5V+kjk50UIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYSQ4Px/AQYAeGpRDl1A8RIAAAAASUVORK5CYII="> | |||
|
87 | </div> | |||
|
88 | <div class="main"> | |||
|
89 | <h1> | |||
|
90 | <span class="error_message"> | |||
|
91 | RhodeCode backend server is unreachable | |||
|
92 | </span> | |||
|
93 | </h1> | |||
|
94 | <pre> | |||
|
95 | check service health status: | |||
|
96 | ||||
|
97 | ./rccontrol status | |||
|
98 | ||||
|
99 | make sure rhodecode stack is running with: | |||
|
100 | ||||
|
101 | ./rccontrol stack rhodecode up --detach | |||
|
102 | </pre> | |||
|
103 | <div> | |||
|
104 | <h4>Possible Causes</h4> | |||
|
105 | <ul> | |||
|
106 | <li>The RhodeCode server is starting right now.</li> | |||
|
107 | <li>The RhodeCode server is being restarted.</li> | |||
|
108 | <li>RhodeCode Stack is not running.</li> | |||
|
109 | <li>RhodeCode Stack services are unhealthy.</li> | |||
|
110 | <li><a onclick="window.location.reload()">Reload page</a></li> | |||
|
111 | </ul> | |||
|
112 | </div> | |||
|
113 | ||||
|
114 | </div> | |||
|
115 | </body> | |||
|
116 | </html> |
@@ -0,0 +1,69 b'' | |||||
|
1 | user root; | |||
|
2 | worker_processes 1; | |||
|
3 | ||||
|
4 | pid /var/run/nginx.pid; | |||
|
5 | error_log /dev/stdout info; | |||
|
6 | ||||
|
7 | events { | |||
|
8 | worker_connections 256; | |||
|
9 | # multi_accept on; | |||
|
10 | } | |||
|
11 | ||||
|
12 | http { | |||
|
13 | include /etc/nginx/mime.types; | |||
|
14 | default_type application/octet-stream; | |||
|
15 | server_tokens off; | |||
|
16 | ||||
|
17 | log_format main '$remote_addr - $remote_user [$time_local] ' | |||
|
18 | '"$request" $status $body_bytes_sent ' | |||
|
19 | '"$http_referer" "$http_user_agent" ' | |||
|
20 | '$request_time $upstream_response_time $pipe'; | |||
|
21 | ||||
|
22 | access_log /dev/stdout main; | |||
|
23 | ||||
|
24 | keepalive_timeout 65; | |||
|
25 | types_hash_max_size 2048; | |||
|
26 | ||||
|
27 | ## custom log format | |||
|
28 | log_format http_log_custom '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $upstream_response_time $pipe'; | |||
|
29 | ||||
|
30 | log_format json_log_custom escape=json | |||
|
31 | '{' | |||
|
32 | '"source":"nginx",' | |||
|
33 | '"remote_user":"$remote_user",' | |||
|
34 | '"time_local":"$time_local",' | |||
|
35 | '"remote_addr":"$remote_addr",' | |||
|
36 | '"host":"$host",' | |||
|
37 | '"proxy_x_forwarded_for":"$proxy_add_x_forwarded_for",' | |||
|
38 | '"request":"$request",' | |||
|
39 | '"status": "$status",' | |||
|
40 | '"request_method": "$request_method",' | |||
|
41 | '"body_bytes_sent":"$body_bytes_sent",' | |||
|
42 | '"request_time":"$request_time",' | |||
|
43 | '"upstream_response_time":"$upstream_response_time",' | |||
|
44 | '"http_referrer":"$http_referer",' | |||
|
45 | '"http_scheme":"$scheme",' | |||
|
46 | '"http_user_agent":"$http_user_agent"' | |||
|
47 | '}'; | |||
|
48 | ||||
|
49 | ||||
|
50 | server { | |||
|
51 | listen 80 default; | |||
|
52 | # ensure we get the proper Docker DNS resolver for load balancing. | |||
|
53 | resolver 127.0.0.11 ipv6=off valid=10s; | |||
|
54 | server_name localhost 127.0.0.1; | |||
|
55 | access_log /dev/stdout json_log_custom; | |||
|
56 | error_log /dev/stdout; | |||
|
57 | ||||
|
58 | error_page 404 /404.html; | |||
|
59 | ||||
|
60 | location / { | |||
|
61 | root /etc/nginx/error_pages; | |||
|
62 | internal; | |||
|
63 | } | |||
|
64 | ||||
|
65 | } | |||
|
66 | ||||
|
67 | } | |||
|
68 | ||||
|
69 |
@@ -1,259 +1,299 b'' | |||||
1 | version: '3.9' |
|
1 | version: '3.9' | |
2 |
|
2 | |||
3 | x-logging: &custom-logging |
|
3 | x-logging: &custom-logging | |
4 | # docker plugin install grafana/loki-docker-driver:2.7.1 --alias loki --grant-all-permissions |
|
4 | # docker plugin install grafana/loki-docker-driver:2.7.1 --alias loki --grant-all-permissions | |
5 | # NOTE: loki logging driver ONLY works for host type networks... |
|
5 | # NOTE: loki logging driver ONLY works for host type networks... | |
6 | driver: loki |
|
6 | driver: loki | |
7 | options: |
|
7 | options: | |
8 | #loki-url: "http://${RC_LOKI_AUTH}loki:3100/loki/api/v1/push" |
|
8 | #loki-url: "http://${RC_LOKI_AUTH}loki:3100/loki/api/v1/push" | |
9 | loki-url: "http://${RC_LOKI_AUTH}127.0.0.1:3100/loki/api/v1/push" |
|
9 | loki-url: "http://${RC_LOKI_AUTH}127.0.0.1:3100/loki/api/v1/push" | |
10 | loki-retries: "5" |
|
10 | loki-retries: "5" | |
11 | loki-timeout: "1s" |
|
11 | loki-timeout: "1s" | |
12 | loki-max-backoff: "800ms" |
|
12 | loki-max-backoff: "800ms" | |
13 |
|
13 | |||
14 | volumes: |
|
14 | volumes: | |
15 |
|
15 | |||
16 | # volume for redis data store |
|
16 | # volume for redis data store | |
17 | redis_data: |
|
17 | redis_data: | |
18 | labels: |
|
18 | labels: | |
19 | "keep": 1 |
|
19 | "keep": 1 | |
20 |
|
20 | |||
21 | # volume for Postgres db store |
|
21 | # volume for Postgres db store | |
22 |
|
22 | |||
23 | # volume for Postgres Data |
|
23 | # volume for Postgres Data | |
24 | pg_data: |
|
24 | pg_data: | |
25 | labels: |
|
25 | labels: | |
26 | "keep": 1 |
|
26 | "keep": 1 | |
27 |
|
27 | |||
28 | # volume for rhodecode elasticsearch |
|
28 | # volume for rhodecode elasticsearch | |
29 | es_data: |
|
29 | es_data: | |
30 | labels: |
|
30 | labels: | |
31 | "keep": 1 |
|
31 | "keep": 1 | |
32 |
|
32 | |||
33 |
|
33 | |||
34 | services: |
|
34 | services: | |
35 |
|
35 | |||
36 | channelstream: |
|
36 | channelstream: | |
37 | networks: |
|
37 | networks: | |
38 | - rhodecode_network |
|
38 | - rhodecode_network | |
39 | image: channelstream/channelstream:0.7.1 |
|
39 | image: channelstream/channelstream:0.7.1 | |
40 |
|
40 | |||
41 | restart: always |
|
41 | restart: always | |
42 |
|
42 | |||
43 | # ports: |
|
43 | # ports: | |
44 | # - "127.0.0.1:8000:8000" |
|
44 | # - "127.0.0.1:8000:8000" | |
45 | env_file: |
|
45 | env_file: | |
46 | - ${RC_ENV_FILE:?must-specify-rc-env-file} |
|
46 | - ${RC_ENV_FILE:?must-specify-rc-env-file} | |
47 | command: ["channelstream"] |
|
47 | command: ["channelstream"] | |
48 |
|
48 | |||
49 | healthcheck: |
|
49 | healthcheck: | |
50 | test: [ "CMD", "curl", "-s", "-o", "/dev/null", "-w", "'%{http_code}'", "http://channelstream:8000/admin/sign_in" ] |
|
50 | test: [ "CMD", "curl", "-s", "-o", "/dev/null", "-w", "'%{http_code}'", "http://channelstream:8000/admin/sign_in" ] | |
51 | timeout: 5s |
|
51 | timeout: 5s | |
52 | interval: 60s |
|
52 | interval: 60s | |
53 | retries: 10 |
|
53 | retries: 10 | |
54 |
|
54 | |||
55 | volumes: |
|
55 | volumes: | |
56 | - confvolume:/etc/rhodecode/conf |
|
56 | - confvolume:/etc/rhodecode/conf | |
57 |
|
57 | |||
58 |
|
58 | |||
59 | logging: |
|
59 | logging: | |
60 | *custom-logging |
|
60 | *custom-logging | |
61 |
|
61 | |||
62 | labels: |
|
62 | labels: | |
63 | - "traefik.enable=true" |
|
63 | - "traefik.enable=true" | |
64 | - "traefik.http.routers.channelstream.entrypoints=http" |
|
64 | - "traefik.http.routers.channelstream.entrypoints=http" | |
65 | - "traefik.http.routers.channelstream.priority=20" |
|
65 | - "traefik.http.routers.channelstream.priority=20" | |
66 | - "traefik.http.routers.channelstream.rule=Host(`${RC_HOSTNAME:?must-specify-rhodecode-hostname}`) && PathPrefix(`/_channelstream`)" |
|
66 | - "traefik.http.routers.channelstream.rule=Host(`${RC_HOSTNAME:?must-specify-rhodecode-hostname}`) && PathPrefix(`/_channelstream`)" | |
67 | - "traefik.http.routers.channelstream.service=channelstream-web" |
|
67 | - "traefik.http.routers.channelstream.service=channelstream-web" | |
68 | - "traefik.http.routers.channelstream.middlewares=strip-cs" |
|
68 | - "traefik.http.routers.channelstream.middlewares=strip-cs" | |
69 | - "traefik.http.middlewares.strip-cs.stripprefix.prefixes=/_channelstream" |
|
69 | - "traefik.http.middlewares.strip-cs.stripprefix.prefixes=/_channelstream" | |
70 | - "traefik.http.services.channelstream-web.loadbalancer.server.port=8000" |
|
70 | - "traefik.http.services.channelstream-web.loadbalancer.server.port=8000" | |
71 | # HTTP + SSL example, should be put into .custom/docker-compose-services.override.yaml |
|
71 | # HTTP + SSL example, should be put into .custom/docker-compose-services.override.yaml | |
72 | #- "traefik.http.routers.channelstream.entrypoints=http,https" |
|
72 | #- "traefik.http.routers.channelstream.entrypoints=http,https" | |
73 |
|
73 | |||
74 | profiles: |
|
74 | profiles: | |
75 | ["channelstream"] |
|
75 | ["channelstream"] | |
76 |
|
76 | |||
77 | nginx: |
|
77 | nginx: | |
78 | networks: |
|
78 | networks: | |
79 | - rhodecode_network |
|
79 | - rhodecode_network | |
80 | image: library/nginx:1.23.3 |
|
80 | image: library/nginx:1.23.3 | |
81 |
|
81 | |||
82 | restart: always |
|
82 | restart: always | |
83 |
|
83 | |||
84 | environment: |
|
84 | environment: | |
85 | NGINX_ENTRYPOINT_QUIET_LOGS: 1 |
|
85 | NGINX_ENTRYPOINT_QUIET_LOGS: 1 | |
86 | env_file: |
|
86 | env_file: | |
87 | - ${RC_ENV_FILE:?must-specify-rc-env-file} |
|
87 | - ${RC_ENV_FILE:?must-specify-rc-env-file} | |
88 |
|
88 | |||
89 | healthcheck: |
|
89 | healthcheck: | |
90 | # change port 80 to 443 when only using SSL |
|
90 | # change port 80 to 443 when only using SSL | |
91 | test: [ "CMD", "curl", "-A", "RhodeCode-Healthcheck", "-s", "-o", "/dev/null", "-w", "'%{http_code}'", "http://127.0.0.1:80/_health" ] |
|
91 | test: [ "CMD", "curl", "-A", "RhodeCode-Healthcheck", "-s", "-o", "/dev/null", "-w", "'%{http_code}'", "http://127.0.0.1:80/_health" ] | |
92 | timeout: 30s |
|
92 | timeout: 30s | |
93 | interval: 60s |
|
93 | interval: 60s | |
94 | retries: 10 |
|
94 | retries: 10 | |
95 |
|
95 | |||
96 | # depends_on: |
|
96 | # depends_on: | |
97 | # - channelstream |
|
97 | # - channelstream | |
98 |
|
98 | |||
99 | volumes: |
|
99 | volumes: | |
100 | - ./config/nginx/nginx.conf:/etc/nginx/nginx.conf:ro |
|
100 | - ./config/nginx/nginx.conf:/etc/nginx/nginx.conf:ro | |
101 | - ./config/nginx/http.conf:/etc/nginx/http.conf:ro |
|
101 | - ./config/nginx/http.conf:/etc/nginx/http.conf:ro | |
102 | - ./config/nginx/proxy.conf:/etc/nginx/proxy.conf:ro |
|
102 | - ./config/nginx/proxy.conf:/etc/nginx/proxy.conf:ro | |
103 |
|
||||
104 | - rc_datavolume:/var/opt/rhodecode_data |
|
103 | - rc_datavolume:/var/opt/rhodecode_data | |
105 |
|
104 | |||
106 | logging: |
|
105 | logging: | |
107 | *custom-logging |
|
106 | *custom-logging | |
108 |
|
107 | |||
109 | labels: |
|
108 | labels: | |
110 | - "traefik.enable=true" |
|
109 | - "traefik.enable=true" | |
111 | - "traefik.http.routers.nginx.entrypoints=http" |
|
110 | - "traefik.http.routers.nginx.entrypoints=http" | |
112 | - "traefik.http.routers.nginx.priority=40" |
|
111 | - "traefik.http.routers.nginx.priority=40" | |
113 | - "traefik.http.routers.nginx.rule=Host(`${RC_HOSTNAME:?must-specify-rhodecode-hostname}`) && PathPrefix(`/_static/rhodecode`)" |
|
112 | - "traefik.http.routers.nginx.rule=Host(`${RC_HOSTNAME:?must-specify-rhodecode-hostname}`) && PathPrefix(`/_static/rhodecode`)" | |
114 |
- "traefik.http. |
|
113 | - "traefik.http.routers.nginx.service=nginx-serv" | |
|
114 | - "traefik.http.services.nginx-serv.loadbalancer.server.port=80" | |||
|
115 | ||||
|
116 | # HTTP + SSL example, should be put into .custom/docker-compose-services.override.yaml | |||
|
117 | #- "traefik.http.routers.error-router.entrypoints=http, https" | |||
|
118 | ||||
|
119 | nginx-errors: | |||
|
120 | networks: | |||
|
121 | - rhodecode_network | |||
|
122 | image: library/nginx:1.23.3 | |||
|
123 | ||||
|
124 | restart: always | |||
|
125 | ||||
|
126 | environment: | |||
|
127 | NGINX_ENTRYPOINT_QUIET_LOGS: 1 | |||
|
128 | ||||
|
129 | env_file: | |||
|
130 | - ${RC_ENV_FILE:?must-specify-rc-env-file} | |||
|
131 | ||||
|
132 | volumes: | |||
|
133 | - ./config/nginx/nginx_errors.conf:/etc/nginx/nginx.conf:ro | |||
|
134 | - ./config/nginx/error_pages:/etc/nginx/error_pages | |||
|
135 | ||||
|
136 | - rc_datavolume:/var/opt/rhodecode_data | |||
|
137 | ||||
|
138 | labels: | |||
|
139 | - "traefik.enable=true" | |||
|
140 | ||||
|
141 | # error-middleware | |||
|
142 | - "traefik.http.middlewares.error-pages-middleware.errors.status=404" | |||
|
143 | - "traefik.http.middlewares.error-pages-middleware.errors.service=error-pages-service" | |||
|
144 | - "traefik.http.middlewares.error-pages-middleware.errors.query=/{status}.html" | |||
|
145 | ||||
|
146 | # error handling router | |||
|
147 | - "traefik.http.routers.error-router.entrypoints=http" | |||
|
148 | - "traefik.http.routers.error-router.priority=5" | |||
|
149 | - "traefik.http.routers.error-router.rule=HostRegexp(`{host:.+}`)" | |||
|
150 | - "traefik.http.routers.error-router.service=error-pages-service" | |||
|
151 | - "traefik.http.routers.error-router.middlewares=error-pages-middleware" | |||
|
152 | ||||
|
153 | - "traefik.http.services.error-pages-service.loadbalancer.server.port=80" | |||
|
154 | ||||
115 | # HTTP + SSL example, should be put into .custom/docker-compose-services.override.yaml |
|
155 | # HTTP + SSL example, should be put into .custom/docker-compose-services.override.yaml | |
116 |
#- "traefik.http.routers. |
|
156 | #- "traefik.http.routers.error-router.entrypoints=http, https" | |
117 |
|
157 | |||
118 | elasticsearch: |
|
158 | elasticsearch: | |
119 | networks: |
|
159 | networks: | |
120 | - rhodecode_network |
|
160 | - rhodecode_network | |
121 | image: elasticsearch:6.8.23 |
|
161 | image: elasticsearch:6.8.23 | |
122 |
|
162 | |||
123 | environment: |
|
163 | environment: | |
124 | - cluster.name=elasticsearch-cluster |
|
164 | - cluster.name=elasticsearch-cluster | |
125 | - network.host=0.0.0.0 |
|
165 | - network.host=0.0.0.0 | |
126 | - bootstrap.memory_lock=true |
|
166 | - bootstrap.memory_lock=true | |
127 | - discovery.type=single-node |
|
167 | - discovery.type=single-node | |
128 | - "ES_JAVA_OPTS=-Xms512m -Xmx512m" |
|
168 | - "ES_JAVA_OPTS=-Xms512m -Xmx512m" | |
129 | env_file: |
|
169 | env_file: | |
130 | - ${RC_ENV_FILE:?must-specify-rc-env-file} |
|
170 | - ${RC_ENV_FILE:?must-specify-rc-env-file} | |
131 | healthcheck: |
|
171 | healthcheck: | |
132 | # change port 80 to 443 when only using SSL |
|
172 | # change port 80 to 443 when only using SSL | |
133 | test: [ "CMD", "curl", "-A", "RhodeCode-Healthcheck", "-s", "-o", "/dev/null", "-w", "'%{http_code}'", "elasticsearch:9200/_cat/health" ] |
|
173 | test: [ "CMD", "curl", "-A", "RhodeCode-Healthcheck", "-s", "-o", "/dev/null", "-w", "'%{http_code}'", "elasticsearch:9200/_cat/health" ] | |
134 | timeout: 30s |
|
174 | timeout: 30s | |
135 | interval: 60s |
|
175 | interval: 60s | |
136 | retries: 10 |
|
176 | retries: 10 | |
137 |
|
177 | |||
138 | ulimits: |
|
178 | ulimits: | |
139 | memlock: |
|
179 | memlock: | |
140 | soft: -1 |
|
180 | soft: -1 | |
141 | hard: -1 |
|
181 | hard: -1 | |
142 |
|
182 | |||
143 | volumes: |
|
183 | volumes: | |
144 | - es_data:/usr/share/elasticsearch/data |
|
184 | - es_data:/usr/share/elasticsearch/data | |
145 |
|
185 | |||
146 | logging: |
|
186 | logging: | |
147 | *custom-logging |
|
187 | *custom-logging | |
148 |
|
188 | |||
149 | profiles: |
|
189 | profiles: | |
150 | ["elasticsearch"] |
|
190 | ["elasticsearch"] | |
151 |
|
191 | |||
152 | redis: |
|
192 | redis: | |
153 | networks: |
|
193 | networks: | |
154 | - rhodecode_network |
|
194 | - rhodecode_network | |
155 | image: library/redis:7.0.8 |
|
195 | image: library/redis:7.0.8 | |
156 |
|
196 | |||
157 | restart: always |
|
197 | restart: always | |
158 | env_file: |
|
198 | env_file: | |
159 | - ${RC_ENV_FILE:?must-specify-rc-env-file} |
|
199 | - ${RC_ENV_FILE:?must-specify-rc-env-file} | |
160 | command: |
|
200 | command: | |
161 | - "redis-server" |
|
201 | - "redis-server" | |
162 | - "/etc/redis/redis.conf" |
|
202 | - "/etc/redis/redis.conf" | |
163 | - "--maxmemory-policy allkeys-lru" |
|
203 | - "--maxmemory-policy allkeys-lru" | |
164 | - "--maxmemory ${RC_REDIS_MAXMEMORY:?must-specify-redis-maxmemory}" |
|
204 | - "--maxmemory ${RC_REDIS_MAXMEMORY:?must-specify-redis-maxmemory}" | |
165 |
|
205 | |||
166 | # ports: |
|
206 | # ports: | |
167 | # - "127.0.0.1::6379" |
|
207 | # - "127.0.0.1::6379" | |
168 |
|
208 | |||
169 | healthcheck: |
|
209 | healthcheck: | |
170 | test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ] |
|
210 | test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ] | |
171 | interval: 60s |
|
211 | interval: 60s | |
172 |
|
212 | |||
173 | volumes: |
|
213 | volumes: | |
174 | - ./config/redis/redis.conf:/etc/redis/redis.conf:ro |
|
214 | - ./config/redis/redis.conf:/etc/redis/redis.conf:ro | |
175 |
|
215 | |||
176 | - redis_data:/data |
|
216 | - redis_data:/data | |
177 |
|
217 | |||
178 | profiles: |
|
218 | profiles: | |
179 | ["redis"] |
|
219 | ["redis"] | |
180 |
|
220 | |||
181 | logging: |
|
221 | logging: | |
182 | *custom-logging |
|
222 | *custom-logging | |
183 |
|
223 | |||
184 | database: |
|
224 | database: | |
185 | networks: |
|
225 | networks: | |
186 | - rhodecode_network |
|
226 | - rhodecode_network | |
187 | image: library/postgres:14.6 |
|
227 | image: library/postgres:14.6 | |
188 |
|
228 | |||
189 | environment: |
|
229 | environment: | |
190 | POSTGRES_DB: ${DB_NAME:?must-specify-db-name} |
|
230 | POSTGRES_DB: ${DB_NAME:?must-specify-db-name} | |
191 | POSTGRES_USER: ${DB_USER:?must-specify-db-user} |
|
231 | POSTGRES_USER: ${DB_USER:?must-specify-db-user} | |
192 | PGUSER: ${DB_USER:?must-specify-db-user} |
|
232 | PGUSER: ${DB_USER:?must-specify-db-user} | |
193 | POSTGRES_PASSWORD: ${DB_PASSWORD:?must-specify-db-password} |
|
233 | POSTGRES_PASSWORD: ${DB_PASSWORD:?must-specify-db-password} | |
194 | POSTGRES_HOST_AUTH_METHOD: md5 |
|
234 | POSTGRES_HOST_AUTH_METHOD: md5 | |
195 | POSTGRES_INITDB_ARGS: "--auth-host=md5 --auth-local=md5" |
|
235 | POSTGRES_INITDB_ARGS: "--auth-host=md5 --auth-local=md5" | |
196 | env_file: |
|
236 | env_file: | |
197 | - ${RC_ENV_FILE:?must-specify-rc-env-file} |
|
237 | - ${RC_ENV_FILE:?must-specify-rc-env-file} | |
198 |
|
238 | |||
199 | restart: always |
|
239 | restart: always | |
200 | command: |
|
240 | command: | |
201 | - "postgres" |
|
241 | - "postgres" | |
202 | - "-c" |
|
242 | - "-c" | |
203 | - "log_statement=ddl" |
|
243 | - "log_statement=ddl" | |
204 | - "-c" |
|
244 | - "-c" | |
205 | - "config_file=/etc/conf.d/pg_customized.conf" |
|
245 | - "config_file=/etc/conf.d/pg_customized.conf" | |
206 |
|
246 | |||
207 | # ports: |
|
247 | # ports: | |
208 | # - "127.0.0.1::5432" |
|
248 | # - "127.0.0.1::5432" | |
209 |
|
249 | |||
210 | healthcheck: |
|
250 | healthcheck: | |
211 | test: ["CMD-SHELL", "pg_isready", '-U', "$DB_USER"] |
|
251 | test: ["CMD-SHELL", "pg_isready", '-U', "$DB_USER"] | |
212 | interval: 10s |
|
252 | interval: 10s | |
213 | timeout: 5s |
|
253 | timeout: 5s | |
214 | retries: 5 |
|
254 | retries: 5 | |
215 |
|
255 | |||
216 | volumes: |
|
256 | volumes: | |
217 | - $PWD/config/database/pg_customized.conf:/etc/conf.d/pg_customized.conf:ro |
|
257 | - $PWD/config/database/pg_customized.conf:/etc/conf.d/pg_customized.conf:ro | |
218 | # db dumps reverse mount |
|
258 | # db dumps reverse mount | |
219 | - $PWD/.custom/db_dump:/var/rc-data-dump |
|
259 | - $PWD/.custom/db_dump:/var/rc-data-dump | |
220 | # save the pg_data volume |
|
260 | # save the pg_data volume | |
221 | - pg_data:/var/lib/postgresql/data |
|
261 | - pg_data:/var/lib/postgresql/data | |
222 |
|
262 | |||
223 |
|
263 | |||
224 | profiles: |
|
264 | profiles: | |
225 | ["postgres", "database"] |
|
265 | ["postgres", "database"] | |
226 |
|
266 | |||
227 | logging: |
|
267 | logging: | |
228 | *custom-logging |
|
268 | *custom-logging | |
229 |
|
269 | |||
230 | database-mysql: |
|
270 | database-mysql: | |
231 | networks: |
|
271 | networks: | |
232 | - rhodecode_network |
|
272 | - rhodecode_network | |
233 | image: library/mysql:8.0.31 |
|
273 | image: library/mysql:8.0.31 | |
234 |
|
274 | |||
235 | environment: |
|
275 | environment: | |
236 | MYSQL_DATABASE: ${DB_NAME:?must-specify-db-name} |
|
276 | MYSQL_DATABASE: ${DB_NAME:?must-specify-db-name} | |
237 | MYSQL_USER: ${DB_USER:?must-specify-db-user} |
|
277 | MYSQL_USER: ${DB_USER:?must-specify-db-user} | |
238 | MYSQL_PASSWORD: ${DB_PASSWORD:?must-specify-db-password} |
|
278 | MYSQL_PASSWORD: ${DB_PASSWORD:?must-specify-db-password} | |
239 | MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:?must-specify-db-password} |
|
279 | MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:?must-specify-db-password} | |
240 | env_file: |
|
280 | env_file: | |
241 | - ${RC_ENV_FILE:?must-specify-rc-env-file} |
|
281 | - ${RC_ENV_FILE:?must-specify-rc-env-file} | |
242 |
|
282 | |||
243 | restart: always |
|
283 | restart: always | |
244 |
|
284 | |||
245 | # ports: |
|
285 | # ports: | |
246 | # - "127.0.0.1::3306" |
|
286 | # - "127.0.0.1::3306" | |
247 |
|
287 | |||
248 | volumes: |
|
288 | volumes: | |
249 | - ./config/database/mysql_customized.conf:/etc/mysql/conf.d/config-file.cnf:ro |
|
289 | - ./config/database/mysql_customized.conf:/etc/mysql/conf.d/config-file.cnf:ro | |
250 | # save the mysql_data volume |
|
290 | # save the mysql_data volume | |
251 | - $PWD/mysql_dir:/var/lib/mysql |
|
291 | - $PWD/mysql_dir:/var/lib/mysql | |
252 |
|
292 | |||
253 |
|
293 | |||
254 | profiles: |
|
294 | profiles: | |
255 | ["mysql"] |
|
295 | ["mysql"] | |
256 |
|
296 | |||
257 | logging: |
|
297 | logging: | |
258 | *custom-logging |
|
298 | *custom-logging | |
259 |
|
299 |
General Comments 0
You need to be logged in to leave comments.
Login now