cleanup
This commit is contained in:
73
INSTALL.md
Normal file
73
INSTALL.md
Normal file
@@ -0,0 +1,73 @@
|
||||
# Unraid Installation Guide - Email Signature Manager
|
||||
|
||||
Follow these steps to deploy the Email Signature Manager on your Unraid server using a local build and the Unraid Docker GUI.
|
||||
|
||||
## Step 1: Clone the Repository
|
||||
SSH into your Unraid server (or use the Terminal in the WebUI) and run:
|
||||
|
||||
```bash
|
||||
cd /mnt/user/appdata
|
||||
git clone https://github.com/JasonStedwell/email-sig-manager.git email-sigs
|
||||
cd email-sigs
|
||||
```
|
||||
|
||||
## Step 2: Add your Google Service Account Key
|
||||
Place your `sa.json` file (acquired from Google Cloud Console) into the `secrets` folder.
|
||||
|
||||
```bash
|
||||
# Example if copying via SMB from Windows:
|
||||
# Copy sa.json to \\UNRAID-IP\appdata\email-sigs\secrets\sa.json
|
||||
```
|
||||
|
||||
## Step 3: Build the Image Locally
|
||||
In the terminal, run the build command to create your local Docker image:
|
||||
|
||||
```bash
|
||||
cd /mnt/user/appdata/email-sigs
|
||||
docker build -t email-sigs:latest .
|
||||
```
|
||||
|
||||
## Step 4: Configure the Container in Unraid GUI
|
||||
Now, go to the **Docker** tab in your Unraid WebUI and click **Add Container** at the bottom. Fill out the fields exactly as follows:
|
||||
|
||||
- **Name:** `email-sig-manager`
|
||||
- **Repository:** `email-sigs:latest`
|
||||
- **Network Type:** `Bridge`
|
||||
- **WebUI Port:** `3000`
|
||||
|
||||
### Add Path Mappings
|
||||
Click **+ Add another Path, Port, Variable, Label or Device** for each of these:
|
||||
|
||||
1. **Secrets Path**
|
||||
- **Name:** `Secrets`
|
||||
- **Container Path:** `/app/secrets`
|
||||
- **Host Path:** `/mnt/user/appdata/email-sigs/secrets`
|
||||
- **Access Mode:** `Read Only`
|
||||
|
||||
2. **Data Path**
|
||||
- **Name:** `Data`
|
||||
- **Container Path:** `/app/data`
|
||||
- **Host Path:** `/mnt/user/appdata/email-sigs/data`
|
||||
- **Access Mode:** `Read/Write`
|
||||
|
||||
### Add Variables
|
||||
Click **+ Add another Path, Port, Variable, Label or Device** for each of these:
|
||||
|
||||
1. **Admin Email**
|
||||
- **Key:** `GOOGLE_ADMIN_EMAIL`
|
||||
- **Value:** *(your Workspace admin email, e.g., jason@messagepoint.tv)*
|
||||
|
||||
2. **Admin Username**
|
||||
- **Key:** `ADMIN_USERNAME`
|
||||
- **Value:** `admin`
|
||||
|
||||
3. **Admin Password**
|
||||
- **Key:** `ADMIN_PASSWORD`
|
||||
- **Value:** *(your chosen password)*
|
||||
|
||||
4. **Cron Schedule** (Optional)
|
||||
- **Key:** `CRON_SCHEDULE`
|
||||
- **Value:** `0 2 * * *`
|
||||
|
||||
## Step 5: Click Apply
|
||||
Once all fields are filled, click **Apply**. Unraid will start the container using your locally built image. You can then access the UI at `http://UNRAID-IP:3000`.
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
A self-hosted, Dockerized Google Workspace email signature manager.
|
||||
Runs as a single container — designed for Unraid but works on any Docker host.
|
||||
See [INSTALL.md](INSTALL.md) for Unraid-specific instructions.
|
||||
|
||||
## Features
|
||||
|
||||
|
||||
34
email-sig-manager.xml
Normal file
34
email-sig-manager.xml
Normal file
@@ -0,0 +1,34 @@
|
||||
<?xml version="1.0"?>
|
||||
<Container version="2.0">
|
||||
<Name>Email Signature Manager</Name>
|
||||
<Repository>email-sigs:latest</Repository>
|
||||
<Registry/>
|
||||
<Network>bridge</Network>
|
||||
<MyIP/>
|
||||
<Shell>sh</Shell>
|
||||
<Privileged>false</Privileged>
|
||||
<Support>https://github.com/JasonStedwell/email-sig-manager/issues</Support>
|
||||
<Project>https://github.com/JasonStedwell/email-sig-manager</Project>
|
||||
<Overview>A self-hosted, Dockerized Google Workspace email signature manager. Pulls user data from Google Workspace and pushes signatures directly to Gmail.</Overview>
|
||||
<Category>Tools: Productivity</Category>
|
||||
<WebUI>http://[IP]:[PORT:3000]</WebUI>
|
||||
<TemplateURL/>
|
||||
<Icon>https://raw.githubusercontent.com/google/material-design-icons/master/png/communication/email/materialicons/48dp/1x/baseline_email_black_48dp.png</Icon>
|
||||
<ExtraParams/>
|
||||
<PostArgs/>
|
||||
<CPUset/>
|
||||
<DateInstalled/>
|
||||
<DonateText/>
|
||||
<DonateLink/>
|
||||
<Description/>
|
||||
<Config Name="Web Port" Target="3000" Default="3000" Mode="tcp" Description="The port for the Web UI." Type="Port" Display="always" Required="true" Mask="false">3000</Config>
|
||||
<Config Name="Secrets Path" Target="/app/secrets" Default="/mnt/user/appdata/email-sigs/secrets" Mode="ro" Description="Path to service account JSON (sa.json)." Type="Path" Display="always" Required="true" Mask="false">/mnt/user/appdata/email-sigs/secrets</Config>
|
||||
<Config Name="Data Path" Target="/app/data" Default="/mnt/user/appdata/email-sigs/data" Mode="rw" Description="Path for SQLite database." Type="Path" Display="always" Required="true" Mask="false">/mnt/user/appdata/email-sigs/data</Config>
|
||||
<Config Name="Assets Path" Target="/app/public/assets" Default="/mnt/user/appdata/email-sigs/public/assets" Mode="rw" Description="Path for local assets (optional)." Type="Path" Display="always" Required="false" Mask="false">/mnt/user/appdata/email-sigs/public/assets</Config>
|
||||
<Config Name="Google Admin Email" Target="GOOGLE_ADMIN_EMAIL" Default="" Description="Workspace admin email (e.g. jason@messagepoint.tv)" Type="Variable" Display="always" Required="true" Mask="false"/>
|
||||
<Config Name="Google Customer ID" Target="GOOGLE_CUSTOMER_ID" Default="my_customer" Description="Use 'my_customer' for primary domain." Type="Variable" Display="always" Required="false" Mask="false">my_customer</Config>
|
||||
<Config Name="Admin Username" Target="ADMIN_USERNAME" Default="admin" Description="Web UI login username." Type="Variable" Display="always" Required="true" Mask="false">admin</Config>
|
||||
<Config Name="Admin Password" Target="ADMIN_PASSWORD" Default="" Description="Web UI login password." Type="Variable" Display="always" Required="true" Mask="true"/>
|
||||
<Config Name="Cron Schedule" Target="CRON_SCHEDULE" Default="0 2 * * *" Description="Cron expression for nightly push." Type="Variable" Display="always" Required="false" Mask="false">0 2 * * *</Config>
|
||||
<Config Name="Node Environment" Target="NODE_ENV" Default="production" Description="Set to 'production'." Type="Variable" Display="advanced" Required="false" Mask="false">production</Config>
|
||||
</Container>
|
||||
@@ -38,9 +38,13 @@ router.post('/preview', (req, res) => {
|
||||
const { templateHtml, userData } = req.body;
|
||||
try {
|
||||
const Handlebars = require('handlebars');
|
||||
Handlebars.registerHelper('if_val', function(val, options) {
|
||||
return val && val.trim() !== '' ? options.fn(this) : options.inverse(this);
|
||||
});
|
||||
// Helper is registered globally when renderer.js is loaded, but
|
||||
// since this is a separate require, we'll ensure it's there.
|
||||
if (!Handlebars.helpers.if_val) {
|
||||
Handlebars.registerHelper('if_val', function(val, options) {
|
||||
return val && val.trim() !== '' ? options.fn(this) : options.inverse(this);
|
||||
});
|
||||
}
|
||||
const template = Handlebars.compile(templateHtml);
|
||||
const rendered = template(userData || {
|
||||
fullName: 'Jason Stedwell',
|
||||
|
||||
@@ -5,7 +5,8 @@ async function pushSignatureToUser(userEmail, signatureHtml) {
|
||||
const auth = getAuthClient(userEmail);
|
||||
const gmail = google.gmail({ version: 'v1', auth });
|
||||
const sendAsRes = await gmail.users.settings.sendAs.list({ userId: 'me' });
|
||||
const primary = sendAsRes.data.sendAs.find(s => s.isPrimary);
|
||||
const sendAsList = sendAsRes.data.sendAs || [];
|
||||
const primary = sendAsList.find(s => s.isPrimary);
|
||||
if (!primary) throw new Error(`No primary sendAs found for ${userEmail}`);
|
||||
await gmail.users.settings.sendAs.patch({
|
||||
userId: 'me',
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
const Handlebars = require('handlebars');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
Handlebars.registerHelper('if_val', function(val, options) {
|
||||
|
||||
Reference in New Issue
Block a user