Skip to content

Commit e83da75

Browse files
committed
Ported lab 5
1 parent 8c8580e commit e83da75

File tree

7 files changed

+244
-5
lines changed

7 files changed

+244
-5
lines changed
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
---
2+
title: "Lab 5: Upgrade NGINX Plus to the latest version"
3+
weight: 500
4+
toc: true
5+
nd-content-type: tutorial
6+
nd-product:
7+
- nginx-one
8+
- nginx-plus
9+
---
10+
11+
## Overview
12+
13+
In this lab, you upgrade NGINX Plus from R32 (or earlier) to the latest version in two ways:
14+
15+
- **Docker**: Deploy a new container running the latest NGINX Plus image, add it to your Config Sync Group, then shift traffic and retire older containers.
16+
- **VM**: Push your JWT license to an existing VM instance, install the new NGINX Plus package, and restart the service.
17+
18+
Pick the scenario that matches your setup.
19+
20+
## What you’ll learn
21+
22+
By the end of this lab, you’ll know how to:
23+
24+
- Upgrade NGINX Plus Docker containers to R34
25+
- Add a VM to a Config Sync Group and push your JWT license
26+
- Upgrade NGINX Plus on a VM to R34
27+
- Verify the new version and sync status in NGINX One Console
28+
29+
## Before you begin
30+
31+
Make sure you have:
32+
33+
- Completed [Lab 4: Config Sync Groups]({{< ref "nginx-one/workshops/lab4/config-sync-groups.md" >}})
34+
- Docker and Docker Compose installed and running (for Docker scenario)
35+
- A VM with NGINX Plus R32 (or earlier), SSH access, and the NGINX Agent installed (for VM scenario)
36+
- Your data plane key in the `TOKEN` environment variable:
37+
38+
```shell
39+
export TOKEN="your-data-plane-key"
40+
```
41+
42+
- Your NGINX Plus JWT license file saved as `nginx-repo.jwt` and JWT set:
43+
44+
```shell
45+
export JWT=$(cat path/to/nginx-repo.jwt)
46+
```
47+
48+
- Your unique identifier in the NAME environment variable (for example s.jobs):
49+
50+
```shell
51+
export NAME="s.jobs"
52+
```
53+
54+
- Basic familiarity with Linux command line and NGINX Plus
55+
56+
## Scenario A: Upgrade NGINX Plus in Docker
57+
58+
### Exercise A1: Pull and run the latest NGINX Plus image
59+
60+
1. In your shell, log in to the private registry:
61+
62+
```shell
63+
echo "$JWT" | docker login private-registry.nginx.com \
64+
--username "$JWT" --password-stdin
65+
```
66+
67+
2. Open `docker-compose.yaml` in a text editor and uncomment the **plus4** service block (lines 74–95). This block pulls the latest Debian NGINX Plus image with the latest NGINX Agent installed, and sets your data plane key, JWT, and config sync group.
68+
69+
```yaml
70+
plus4: # Debian latest NGINX Plus Web / Load Balancer
71+
environment:
72+
NGINX_AGENT_SERVER_HOST: 'agent.connect.nginx.com'
73+
NGINX_AGENT_SERVER_GRPCPORT: '443'
74+
NGINX_AGENT_TLS_ENABLE: 'true'
75+
NGINX_AGENT_SERVER_TOKEN: $TOKEN # Data plane key from NGINX One Console
76+
NGINX_LICENSE_JWT: $JWT
77+
NGINX_AGENT_INSTANCE_GROUP: $NAME-sync-group
78+
hostname: $NAME-plus4
79+
container_name: $NAME-plus4
80+
image: private-registry.nginx.com/nginx-plus/agent:debian # From NGINX Private Registry
81+
volumes: # Sync these folders to container
82+
- ./nginx-plus/etc/nginx/nginx.conf:/etc/nginx/nginx.conf
83+
- ./nginx-plus/etc/nginx/conf.d:/etc/nginx/conf.d
84+
- ./nginx-plus/etc/nginx/includes:/etc/nginx/includes
85+
- ./nginx-plus/usr/share/nginx/html:/usr/share/nginx/html
86+
ports:
87+
- '80' # Open for HTTP
88+
- '443' # Open for HTTPS
89+
- '9000' # Open for API / Dashboard page
90+
- '9113' # Open for Prometheus Scraper page
91+
restart: always
92+
```
93+
94+
> Tip: If you use VS Code, highlight lines 74–95 and press `Ctrl` + `/` to uncomment them.
95+
96+
3. Restart your containers:
97+
98+
```shell
99+
docker compose down && docker compose up --force-recreate -d
100+
```
101+
102+
4. In the NGINX One Console, go to **Instances**.
103+
5. You should see your new instance (`$NAME-plus4`) in the list (for example, `s.jobs-plus4`).
104+
6. Select that instance and verify it runs the latest versions of NGINX Plus and NGINX Agent.
105+
7. The `$NAME-plus4` container was added to the `$NAME-sync-group` config sync group and inherited the shared config.
106+
107+
> **Tip:** Because new containers in a sync group automatically pick up the shared config, you get a consistent, tested setup across versions. You can shift traffic to the new container one at a time for a safer, zero-downtime upgrade, and avoid any manual copy-and-paste steps.
108+
109+
### Exercise A2: Delete unavailable containers
110+
111+
When you recreate containers, they re-register in the NGINX One Console. Use the filter to clean up old entries:
112+
113+
1. In the NGINX One Console, go **Instances**.
114+
2. Select **Add filter > Availability > Unavailable**.
115+
3. Check the boxes next to the unavailable hosts.
116+
4. Select **Delete selected**, then confirm.
117+
5. Remove the filter to view the full list again.
118+
119+
<span style="display: inline-block;">
120+
{{< img src="nginx-one/images/unavailable-instances.png"
121+
alt="Table of three NGINX One Console instances filtered to ‘Availability = Unavailable.’ Shows hostnames (s.jobs-plus1, s.jobs-plus2, s.jobs-plus3), NGINX versions, grey ‘Unavailable’ circles, CVE and recommendation indicators, certificate status, operating system, and last reported times. The ‘Delete selected’ button appears at top right." >}}
122+
</span>
168 KB
Loading

static/workshops/nginx-one/lab2/docker-compose.yml

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ services:
3232
NGINX_AGENT_SERVER_HOST: 'agent.connect.nginx.com'
3333
NGINX_AGENT_SERVER_GRPCPORT: '443'
3434
NGINX_AGENT_TLS_ENABLE: 'true'
35-
NGINX_AGENT_SERVER_TOKEN: $TOKEN # Datakey Fron Nginx One Console
35+
NGINX_AGENT_SERVER_TOKEN: $TOKEN # Data plane key from NGINX One Console
3636
# NGINX_AGENT_INSTANCE_GROUP: $NAME-sync-group
3737
hostname: $NAME-plus2
3838
container_name: $NAME-plus2
@@ -54,7 +54,7 @@ services:
5454
NGINX_AGENT_SERVER_HOST: 'agent.connect.nginx.com'
5555
NGINX_AGENT_SERVER_GRPCPORT: '443'
5656
NGINX_AGENT_TLS_ENABLE: 'true'
57-
NGINX_AGENT_SERVER_TOKEN: $TOKEN # Datakey Fron Nginx One Console
57+
NGINX_AGENT_SERVER_TOKEN: $TOKEN # Data plane key from NGINX One Console
5858
# NGINX_AGENT_INSTANCE_GROUP: $NAME-sync-group
5959
hostname: $NAME-plus3
6060
container_name: $NAME-plus3
@@ -71,12 +71,35 @@ services:
7171
- '9113' # Open for Prometheus Scraper page
7272
restart: always
7373
#
74+
# plus4: # Debian R34 NGINX Plus Web / Load Balancer
75+
# environment:
76+
# NGINX_AGENT_SERVER_HOST: 'agent.connect.nginx.com'
77+
# NGINX_AGENT_SERVER_GRPCPORT: '443'
78+
# NGINX_AGENT_TLS_ENABLE: 'true'
79+
# NGINX_AGENT_SERVER_TOKEN: $TOKEN # Data plane key from NGINX One Console
80+
# NGINX_LICENSE_JWT: $JWT
81+
# NGINX_AGENT_INSTANCE_GROUP: $NAME-sync-group
82+
# hostname: $NAME-plus4
83+
# container_name: $NAME-plus4
84+
# image: private-registry.nginx.com/nginx-plus/agent:debian # From NGINX Private Registry R34
85+
# volumes: # Sync these folders to container
86+
# - ./nginx-plus/etc/nginx/nginx.conf:/etc/nginx/nginx.conf
87+
# - ./nginx-plus/etc/nginx/conf.d:/etc/nginx/conf.d
88+
# - ./nginx-plus/etc/nginx/includes:/etc/nginx/includes
89+
# - ./nginx-plus/usr/share/nginx/html:/usr/share/nginx/html
90+
# ports:
91+
# - '80' # Open for HTTP
92+
# - '443' # Open for HTTPS
93+
# - '9000' # Open for API / Dashboard page
94+
# - '9113' # Open for Prometheus Scraper page
95+
# restart: always
96+
#
7497
oss1: # Debian NGINX OSS Web / Load Balancer
7598
environment:
7699
NGINX_AGENT_SERVER_HOST: 'agent.connect.nginx.com'
77100
NGINX_AGENT_SERVER_GRPCPORT: '443'
78101
NGINX_AGENT_TLS_ENABLE: 'true'
79-
NGINX_AGENT_SERVER_TOKEN: $TOKEN # Datakey Fron Nginx One Console
102+
NGINX_AGENT_SERVER_TOKEN: $TOKEN # Data plane key from NGINX One Console
80103
hostname: $NAME-oss1
81104
container_name: $NAME-oss1
82105
image: docker-registry.nginx.com/nginx/agent:mainline # From Docker Public Registry
@@ -98,7 +121,7 @@ services:
98121
NGINX_AGENT_SERVER_HOST: 'agent.connect.nginx.com'
99122
NGINX_AGENT_SERVER_GRPCPORT: '443'
100123
NGINX_AGENT_TLS_ENABLE: 'true'
101-
NGINX_AGENT_SERVER_TOKEN: $TOKEN # Datakey Fron Nginx One Console
124+
NGINX_AGENT_SERVER_TOKEN: $TOKEN # Data plane key from NGINX One Console
102125
hostname: $NAME-oss2
103126
container_name: $NAME-oss2
104127
image: docker-registry.nginx.com/nginx/agent:alpine # From Docker Public Registry
@@ -120,7 +143,7 @@ services:
120143
NGINX_AGENT_SERVER_HOST: 'agent.connect.nginx.com'
121144
NGINX_AGENT_SERVER_GRPCPORT: '443'
122145
NGINX_AGENT_TLS_ENABLE: 'true'
123-
NGINX_AGENT_SERVER_TOKEN: $TOKEN # Datakey Fron Nginx One Console
146+
NGINX_AGENT_SERVER_TOKEN: $TOKEN # Data plane key from NGINX One Console
124147
hostname: $NAME-oss3
125148
container_name: $NAME-oss3
126149
image: docker-registry.nginx.com/nginx/agent:1.26-alpine # From Docker Public Registry
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDJTCCAg2gAwIBAgIUGoqk9CeYlEvPDIuLwj3ReaiBe0wwDQYJKoZIhvcNAQEL
3+
BQAwIjEgMB4GA1UEAwwXcy5qb2JzLU5naW54T25lV29ya3Nob3AwHhcNMjUwNjIz
4+
MTYxOTE2WhcNMjUwNjI0MTYxOTE2WjAiMSAwHgYDVQQDDBdzLmpvYnMtTmdpbnhP
5+
bmVXb3Jrc2hvcDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOXs5PFS
6+
/wrb5K+xpNPXz337rXiBEXrynzaMnbkobR/ajJHhw2xd3UMhELh2kTnIu+VKrq2B
7+
F1TbA+2FT65TuU9RnGYdyFk6Asr8YVKmdi2SkD6ldWQBJXqaVM9Fm9X/88PiQzQR
8+
djrXrFgjBnQIAN2+nF3V4CZXeOK9lOL5n7z60ZaMLoS7YmmEE1lyVb3UZnXfAuVr
9+
+rs4/dFGYTfvMKkUTIWuL1vDArqDEuravzvYHVTcdMuMB6rnHJvW/OZ5LOtAuJeL
10+
gO8SeVeF24TxeKlNIvz0MDPhTBg/wHd5X3JSFqzLWqf8fyB6QSKw3sKrqrDwJ3+K
11+
9Ij9PD2NmH0mdIUCAwEAAaNTMFEwHQYDVR0OBBYEFFWdwFSYLjjJfTnMmoNq5ySA
12+
RVq9MB8GA1UdIwQYMBaAFFWdwFSYLjjJfTnMmoNq5ySARVq9MA8GA1UdEwEB/wQF
13+
MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAEFOJ5UgUj3Q/orPK/zJCe/C8t37rUKT
14+
nBplcj6+u7kOyM6eASX3oLgFmel7mk6zopdHVDx67ezRquYoaJyWontGvFEDm9n6
15+
y3h3vOgOy0XOkuQCReGFr5xN7HP0zi13LWQlMQ14DP+2Z70kqJ75JxqdWHlN7uCY
16+
/4Rqm91Yln/qWNSGUW1sf1E9NTyTFswbvrerhsGl4Q4v3P8UW402RdbyLS8dd3PW
17+
Aerql+tMEbTDOF55zljuVFPX4avnbvbfX+GRA+n4AAgTk3NLl5d1dNpqmUhUNnfn
18+
1I0xzMNG33rKydM04p1Zvcsjlp/zTvi7RoHxsehcgcjv0ybtfbZxCQo=
19+
-----END CERTIFICATE-----
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDl7OTxUv8K2+Sv
3+
saTT1899+614gRF68p82jJ25KG0f2oyR4cNsXd1DIRC4dpE5yLvlSq6tgRdU2wPt
4+
hU+uU7lPUZxmHchZOgLK/GFSpnYtkpA+pXVkASV6mlTPRZvV//PD4kM0EXY616xY
5+
IwZ0CADdvpxd1eAmV3jivZTi+Z+8+tGWjC6Eu2JphBNZclW91GZ13wLla/q7OP3R
6+
RmE37zCpFEyFri9bwwK6gxLq2r872B1U3HTLjAeq5xyb1vzmeSzrQLiXi4DvEnlX
7+
hduE8XipTSL89DAz4UwYP8B3eV9yUhasy1qn/H8gekEisN7Cq6qw8Cd/ivSI/Tw9
8+
jZh9JnSFAgMBAAECggEAMm3A0QUpFxKfl8FYq3X79l/K7lEwqkyoiuhQd5ncRU5D
9+
4oMnv47exqhr6Glo9MmIHIRCx582pM/cjq3cihmm3TTDHsqNdLR6hFbSabRE2z34
10+
ESVtF+AAfmF3FHbp9QfMSTxJDRR/X+yJylL0SWKv/fKejR4pqX8p7mEyVI33cRUP
11+
c5KyPaut1gYKHlRAyAMZ7yNdiIpq6a9+0Uqkz2M+rhbWAAex6apzxpjIpoHfXnDZ
12+
lJLNf6TKVbZszuta16wG/Iyvnp3YxMGH6cPkkyu9cdF9LfX2fz89XMfmYGst8KJ+
13+
lX1/b69bxGdz2fxTtSc6ybhL4T6RVZR8azZFNXNxiQKBgQD+a4xVi4YtIR6ENkct
14+
43haBdlfJ2mPWwRUfvuH8RrpB/QzueakfVwr2yoxgVGH1V0XsvHeRCIrChH50r20
15+
m5HYN4PY4bB1SPnqqryM3P2jOZZ5cLE9hj999VdTySjFwvjGIATXTVphU6aLbTnR
16+
jx9w+zW/72WPRQ72KXWbuNOEQwKBgQDnWmglVf/AYjksmzNvcbXiApMcGnrAylh8
17+
bSjLWUeCRYUKvxGPwpN7IfJF6JUv1+PsEVQXv/kEui4tIIHLmtGyqDPplulXC5ty
18+
zBBmAPX+3sJ4ZvuX3JVvLGVbwXx6RYO3WV/gMagA4Yk5XrEeDw5qxvLnn+ru3L5C
19+
GC1+iPg7lwKBgQCXKxfrDEfhMLiNHiMU5P9xneAWZbiW8SGVgw25LE0tAQjcYyzj
20+
t4i4ljRvzcK/zsrNdgm4YwtaP1WG9uy5D2aM7g9tIkxSo9W61U/K8tPR1DnQVmE5
21+
iTbYhJoqsm+DceGW9xdpRhDZm3Ztiay9Eyk/XEQHkxrpEcNeCCxVJnCnOQKBgCaC
22+
kQVt/EVs1DGNoBEz71+wqAYsjjRbOkFz9i9rLBEOO2gfh+/TJrN/YhGq9nJhUGoy
23+
NDpD1VKpHxiZ6aEXo0JG52VBnpPDtdt1BmHEVS5YrCxYkBamPCWmUTTlzy+XNKan
24+
dOMfwORspmfrUDY9sVuqxDI0F2otSmo8Fg6TBCb/AoGAet7wgT6wUPCLiGtw7tpm
25+
xjEhVQNKCJHr36NuF8f5Y+xSayb/UZLwTPW4NYiRtqp2zdEvMjhk4zlq45o5m4Ei
26+
P8eMZ3cVBGY9PBhstlNDOydflO3JVol/A9o81rP05fuywq63O3mWkFp6jokhp6zM
27+
b2aQz3arNweaT9ZvkYd5XD0=
28+
-----END PRIVATE KEY-----
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDJTCCAg2gAwIBAgIUeb3HmU4Hl+ty4AMJIsVC4uoTQPUwDQYJKoZIhvcNAQEL
3+
BQAwIjEgMB4GA1UEAwwXcy5qb2JzLU5naW54T25lV29ya3Nob3AwHhcNMjUwNjIz
4+
MTYxOTE2WhcNMjUwNzIzMTYxOTE2WjAiMSAwHgYDVQQDDBdzLmpvYnMtTmdpbnhP
5+
bmVXb3Jrc2hvcDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALCRVwxL
6+
0Mn1qgnM3wjpMlXB/tSovOUaX32hPK/NrGEGFC7ZI1PnaSuAV3Bnc6Tj08/+Sd+F
7+
+KkfUxPnEYSW1sWvz784wi8ejgr2IJiPQjFmE488vc2Z2CGdbIuVHYmaTwzul0Lk
8+
2rF+Q2v7Nfi88YiLCfcxAeQNgQMUWkPDTvlm0TuKwd6SKrwCHavmsWMbC+sFal5X
9+
67/tP8fh3iKpkcfxObWCF16o+xfVjYA4fny5NPQtf+cXYdpNNFw8cG25LxGiqs75
10+
UiDkDreFxkis8mH6+j6lVsmQN2nqmFstA4pqkCE1jZ9sNDonP8ECc3Kmrq4kqNtQ
11+
iTC4xyw2KfbgwnECAwEAAaNTMFEwHQYDVR0OBBYEFGARM8RWPt8hQCDv4Z7x+ftd
12+
rax1MB8GA1UdIwQYMBaAFGARM8RWPt8hQCDv4Z7x+ftdrax1MA8GA1UdEwEB/wQF
13+
MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAAHcqIxXQqfXZ1PjCaRvcGTglMqnQ3g8
14+
TYIM0wjlTE6vhJtcKVQyANM451Cycz8r2tqob6CO0Nsn/Yn8YG1O4LziZGyFsHex
15+
HHPqHMzQjEYmCArpcpriYJpub+aXO6JM7aIm2m2GOMFR3spIPaoqAtEKCgGiczpF
16+
C2gKIwKq51bzR3IV8TzNRoc1uFM9dYf87ZlrLTZND5hDDsQ3oUKeErX4WuDNx11s
17+
Z+8hDOcSPbOXWqDOhxW+XSfTyyOn9z4Ezyw4sJ8CjtkScLmozl+fSCP0gMGposH0
18+
U6Uhhc4EcMptaa9VPnX6nZOqFRHWFydxdIHAuW4ViZATjeXl5gvuSDg=
19+
-----END CERTIFICATE-----
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCwkVcMS9DJ9aoJ
3+
zN8I6TJVwf7UqLzlGl99oTyvzaxhBhQu2SNT52krgFdwZ3Ok49PP/knfhfipH1MT
4+
5xGEltbFr8+/OMIvHo4K9iCYj0IxZhOPPL3NmdghnWyLlR2Jmk8M7pdC5NqxfkNr
5+
+zX4vPGIiwn3MQHkDYEDFFpDw075ZtE7isHekiq8Ah2r5rFjGwvrBWpeV+u/7T/H
6+
4d4iqZHH8Tm1ghdeqPsX1Y2AOH58uTT0LX/nF2HaTTRcPHBtuS8RoqrO+VIg5A63
7+
hcZIrPJh+vo+pVbJkDdp6phbLQOKapAhNY2fbDQ6Jz/BAnNypq6uJKjbUIkwuMcs
8+
Nin24MJxAgMBAAECggEAAOOadptjH8E26/m2Hctez4O8jsGSweySEoXfUltMxOhM
9+
7bd2MBP4OZnZ1t0OfgQPqvpy0MdR6zgXKQB+3BYOWsx51VKp16blvDRlEZ+XC7yh
10+
2JTLt99QcUrjowhLL8gxIbWJ2XJhj4c9O6v2J5x78t4QXMhIZCeVQLi3g6PWH/dc
11+
aj1FwSWaUestWU8PdmpcNZWU6Cmj0KasB57Jx2t48qpzL5RrIelFw72juFAwGcRS
12+
Q0OMzxXMCk61TlwYEOx8LJYz/+3lohq+y1uEmWwI1iCiqrZjop8gENqHrW4RaLXr
13+
Vq/lQGA05V5fz15jsz60cnlANpFR4nVjSq0euyeAAQKBgQDv2RJwPaK1WnINTlMK
14+
x1Cw5DJVYwWPmCcIEEDAy+USJryGbCmomIvuzGPSyv5jFRNalO6qhwIlr/gh6236
15+
/AAQxWK0W318aYy4NRRHim+fIfx80LVLfc9RgAo9ygxrloC2YXkibyCPwP0l8R50
16+
bFjFmjL0Hb8G6vzTqE0tCE7sAQKBgQC8dVSjiJwXHCJ5fddRrovPbvAuARqF0hAp
17+
huXY6TDRwLQKJfevrobNcrHCgIwEKs+4j3zWbyDGK02dP5+VPItFzkjRHK3SnKv5
18+
VsI1F7xZVJLRt5dWiTliDRlZC+T8Mn7CAX5n4Al+A9DABgn0cpifPhHBSx5YjasU
19+
DB/ANcKWcQKBgQDg8gyJ+jSUs+wNsKzPihmSnaLbVFCN2RyaQmwIpfIEcRIVXHJB
20+
rjhnUYg51ap6EPUi2lVw18hawkwMu/pdD2WcVRN6peft/Cw/Q4Dui9aeP8jG4xN1
21+
Ztw+ysBQLSQy72duJcLvWZwHVu/VWuu+MzOauEEblJ5phZBzjgA7wPQMAQKBgGum
22+
qh5wHpmk3JyBoclq5zoqqM/emYPvpoPSJuFs8xId/bn+Tinwi9g3uAre2xxWSCmo
23+
7SqgeBw7CC7W9RWObBAH8dhhhXlVPXdEc9NYJ6LviJ57PNuVr02vJdeTz82wGnA/
24+
4jD77PAqxceqq20TONNd5U6A1mjHI/5jno9xJiJBAoGBAKrVZr2SFRJ9TbP6QDp9
25+
AhIvbGb8FDaziIV+jSmFUn45BuZLnIhhTf8Ox/A+GvvOqQe7b+FqUQvdR/GFSf65
26+
y/UcDouI7A7MsrgRPibtWapokNZzAogGfPDejnGFqyQfXD1anGwkUjEJieEt6rPh
27+
VI5fsSTUShoHbGxKhn8ThAW/
28+
-----END PRIVATE KEY-----

0 commit comments

Comments
 (0)