mirror of
https://github.com/OneUptime/oneuptime.git
synced 2026-04-06 00:32:12 +02:00
add certs
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -78,4 +78,7 @@ Nginx/default.conf
|
||||
Certs/StatusPageCerts/*.crt
|
||||
Certs/StatusPageCerts/*.key
|
||||
|
||||
Certs/ServerCerts/*.crt
|
||||
Certs/ServerCerts/*.key
|
||||
|
||||
Backups/*.backup
|
||||
|
||||
1
Certs/ServerCerts/Readme.md
Normal file
1
Certs/ServerCerts/Readme.md
Normal file
@@ -0,0 +1 @@
|
||||
This project is for Automatic Acme Certificate verification or renewal for the OneUptime server.
|
||||
@@ -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: {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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={{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
14
get-certs.sh
Normal 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
|
||||
@@ -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
8
renew-certs.sh
Normal 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
|
||||
Reference in New Issue
Block a user