add certs

This commit is contained in:
Simon Larsen
2022-12-14 10:23:04 +00:00
parent 25daf863d3
commit 1bf2851849
14 changed files with 76 additions and 39 deletions

3
.gitignore vendored
View File

@@ -78,4 +78,7 @@ Nginx/default.conf
Certs/StatusPageCerts/*.crt
Certs/StatusPageCerts/*.key
Certs/ServerCerts/*.crt
Certs/ServerCerts/*.key
Backups/*.backup

View File

@@ -0,0 +1 @@
This project is for Automatic Acme Certificate verification or renewal for the OneUptime server.

View File

@@ -405,6 +405,7 @@ export default class StatusPageAPI extends BaseAPI<
return monitor.monitorId!;
});
const startDate: Date = OneUptimeDate.getSomeDaysAgo(90);
const endDate: Date = OneUptimeDate.getCurrentDate();
@@ -445,6 +446,8 @@ export default class StatusPageAPI extends BaseAPI<
});
}
// check if status page has active incident.
let activeIncidents: Array<Incident> = [];
if (monitorsOnStatusPage.length > 0) {
@@ -518,7 +521,7 @@ export default class StatusPageAPI extends BaseAPI<
let incidentStateTimelines: Array<IncidentStateTimeline> =
[];
console.log("HERE");
if (incidentsOnStausPage.length > 0) {
incidentStateTimelines =
await IncidentStateTimelineService.findBy({
@@ -550,7 +553,7 @@ export default class StatusPageAPI extends BaseAPI<
const activeAnnouncements: Array<StatusPageAnnouncement> =
await StatusPageAnnouncementService.findBy({
query: {
statusPages: QueryHelper.in([objectId]),
statusPages: objectId as any,
showAnnouncementAt: QueryHelper.lessThan(today),
endAnnouncementAt:
QueryHelper.greaterThan(today),
@@ -577,7 +580,7 @@ export default class StatusPageAPI extends BaseAPI<
currentScheduledMaintenanceState: {
isOngoingState: true,
} as any,
statusPages: QueryHelper.in([objectId]),
statusPages: objectId as any,
projectId: statusPage.projectId!,
},
select: {

View File

@@ -61,11 +61,12 @@ const Footer: FunctionComponent<ComponentProps> = (
{!props.copyright && (
<div className="row">
{props.links &&
props.links.filter((link: FooterLink) => {
return !link.showOnRightIfNoCopyright;
}).length > 0 && (
<div className="col-md-6">
<div className="col-md-6">
{props.links &&
props.links.filter((link: FooterLink) => {
return !link.showOnRightIfNoCopyright;
}).length > 0 && (
<p>
{props.links &&
props.links
@@ -100,8 +101,9 @@ const Footer: FunctionComponent<ComponentProps> = (
}
)}
</p>
</div>
)}
)}
</div>
{props.links &&
props.links.filter((link: FooterLink) => {
return link.showOnRightIfNoCopyright;

View File

@@ -518,7 +518,7 @@ const ModelTable: Function = <TBaseModel extends BaseModel>(
onClick: () => {
fetchItems();
},
disabled: isLoading,
disabled: isTableFilterFetchLoading,
icon: IconProp.Refresh,
});
}
@@ -534,7 +534,7 @@ const ModelTable: Function = <TBaseModel extends BaseModel>(
}
setShowTableFilter(newValue);
},
disabled: isLoading,
disabled: isTableFilterFetchLoading,
icon: IconProp.Filter,
});
}

View File

@@ -135,7 +135,7 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
icon={IconProp.Image}
/>
<SideMenuItem
{/* <SideMenuItem
link={{
title: 'Embedded Status Page',
to: RouteUtil.populateRouteParams(
@@ -146,7 +146,7 @@ const DashboardSideMenu: FunctionComponent<ComponentProps> = (
),
}}
icon={IconProp.Circle}
/>
/> */}
<SideMenuItem
link={{

View File

@@ -115,14 +115,13 @@ server {
server {
listen 443 ssl; # Port HTTPS
listen 80;
server_name localhost;
{{ if ne .Env.DOMAIN "localhost" }}
server_name {{ .Env.DOMAIN }};
{{ end }}
ssl_certificate /etc/nginx/certs/Cert.crt;
ssl_certificate_key /etc/nginx/certs/Key.key;
ssl_certificate /etc/nginx/certs/ServerCerts/Cert.crt;
ssl_certificate_key /etc/nginx/certs/ServerCerts/Key.key;
proxy_busy_buffers_size 512k;
proxy_buffers 4 512k;

View File

@@ -22,7 +22,7 @@ const StatusPageFooter: FunctionComponent<ComponentProps> = (
links={[
...props.links,
{
title: 'Powered by OneUptime',
title: 'Powered by OneUptime.',
to: URL.fromString('https://oneuptime.com'),
openInNewTab: true,
showOnRightIfNoCopyright: true,

View File

@@ -14,6 +14,11 @@ export interface ComponentProps {
const StatusPageHeader: FunctionComponent<ComponentProps> = (
props: ComponentProps
): ReactElement => {
if (!props.banner && !props.logo && props.links.length === 0) {
return <></>
}
return (
<header
id="page-topbar"

View File

@@ -35,7 +35,7 @@ const DashboardNavbar: FunctionComponent<ComponentProps> = (
: (RouteMap[PageMap.SUBSCRIBE] as Route)
)}
></NavBarItem>
<NavBarItem
{/* <NavBarItem
title="RSS"
icon={IconProp.RSS}
route={RouteUtil.populateRouteParams(
@@ -43,7 +43,7 @@ const DashboardNavbar: FunctionComponent<ComponentProps> = (
? (RouteMap[PageMap.PREVIEW_RSS] as Route)
: (RouteMap[PageMap.RSS] as Route)
)}
></NavBarItem>
></NavBarItem> */}
</>
}
maxWidth="880px"

View File

@@ -575,12 +575,12 @@ const Overview: FunctionComponent<PageComponentProps> = (
eventViewRoute={RouteUtil.populateRouteParams(
props.isPreviewPage
? (RouteMap[
PageMap
.PREVIEW_INCIDENT_DETAIL
] as Route)
PageMap
.PREVIEW_INCIDENT_DETAIL
] as Route)
: (RouteMap[
PageMap.INCIDENT_DETAIL
] as Route),
PageMap.INCIDENT_DETAIL
] as Route),
incidentGroup.incident.id!
)}
/>
@@ -621,12 +621,12 @@ const Overview: FunctionComponent<PageComponentProps> = (
eventViewRoute={RouteUtil.populateRouteParams(
props.isPreviewPage
? (RouteMap[
PageMap
.PREVIEW_SCHEDULED_EVENT_DETAIL
] as Route)
PageMap
.PREVIEW_SCHEDULED_EVENT_DETAIL
] as Route)
: (RouteMap[
PageMap.SCHEDULED_EVENT_DETAIL
] as Route),
PageMap.SCHEDULED_EVENT_DETAIL
] as Route),
scheduledEventGroup.scheduledMaintenance
.id!
)}
@@ -636,13 +636,12 @@ const Overview: FunctionComponent<PageComponentProps> = (
)}
<div>
{currentStatus && (
{currentStatus && statusPageResources.length > 0 && (
<Alert
title={`${
currentStatus.isOperationalState
title={`${currentStatus.isOperationalState
? `All`
: 'Some'
} Resources are ${currentStatus.name}`}
} Resources are ${currentStatus.name}`}
color={currentStatus.color}
doNotShowIcon={true}
size={AlertSize.Large}
@@ -650,7 +649,7 @@ const Overview: FunctionComponent<PageComponentProps> = (
)}
</div>
<div>
{statusPageResources.length > 0 && <div>
<AccordianGroup>
{statusPageResources.filter(
(resources: StatusPageResource) => {
@@ -690,7 +689,7 @@ const Overview: FunctionComponent<PageComponentProps> = (
}
isLastElement={
resourceGroups.length -
1 ===
1 ===
i
}
title={resourceGroup.name!}
@@ -704,7 +703,10 @@ const Overview: FunctionComponent<PageComponentProps> = (
)}
</div>
</AccordianGroup>
</div>
</div>}
{statusPageResources.length === 0 && <p> No resources added to this Status Page, please add some resources from OneUptime dashboard.</p>}
</div>
) : (
<></>

14
get-certs.sh Normal file
View File

@@ -0,0 +1,14 @@
# This script generates or renews certs for this server.
export $(grep -v '^#' config.env | xargs)
npm run prerun
docker compose stop nginx
sudo snap install core
sudo snap refresh core
sudo apt-get remove certbot
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot certonly --standalone
sudo certbot renew --dry-run
sudo cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem $(pwd)/Certs/ServerCerts/Cert.crt
sudo cp /etc/letsencrypt/live/$DOMAIN/privkey.pem $(pwd)/Certs/ServerCerts/Key.key
docker compose start nginx

View File

@@ -139,12 +139,12 @@ cd oneuptime
# Generate Self Signed SSL certificate.
CERT=./Certs/Cert.crt
CERT=./Certs/ServerCerts/Cert.crt
if test -f "$CERT"; then
echo "SSL Certificate exists. Skipping generating a new one."
else
echo "SSL Certificate not found. Generating a new certificate."
openssl req -new -x509 -nodes -subj "/C=GB/ST=London/L=London/O=Global Security/OU=IT Department/CN=example.com" -out ./Certs/Cert.crt -keyout ./Certs/Key.key
openssl req -new -x509 -nodes -subj "/C=GB/ST=London/L=London/O=Global Security/OU=IT Department/CN=example.com" -out ./Certs/ServerCerts/Cert.crt -keyout ./Certs/ServerCerts/Key.key
fi
# Create .env file if it does not exist.

8
renew-certs.sh Normal file
View File

@@ -0,0 +1,8 @@
# Run this cron every day to see if the cert needs renewal.
export $(grep -v '^#' config.env | xargs)
npm run prerun
docker compose nginx stop
sudo certbot renew
sudo cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem $(pwd)/Certs/ServerCerts/Cert.crt
sudo cp /etc/letsencrypt/live/$DOMAIN/privkey.pem $(pwd)/Certs/ServerCerts/Key.key
docker compose start nginx