Browse Source
Scripts to 'one click' vaultwarden deployment into Azure Cloud as container app (cheapest option) with enabled vaultwarden external storage on fileshare. It uses official vaultwarden container docker.io/vaultwarden/server:latestpull/3151/head
4 changed files with 434 additions and 0 deletions
@ -0,0 +1,38 @@ |
|||||
|
# Creates a Vaultwarden Container App within Azurefile external storage |
||||
|
|
||||
|
[](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Fadamhnat%2Fvaultwarden%2Fmain%2FAzure%2Fmain.json) |
||||
|
[](http://armviz.io/#/?load=https%3A%2F%2Fraw.githubusercontent.com%2Fadamhnat%2Fvaultwarden%2Fmain%2FAzure%2Fmain.json) |
||||
|
|
||||
|
This template provides a way to deploy a **Vaultwarden** in a **Azure Container App** with external **file share** storage that can be used to backup restore data easly. |
||||
|
|
||||
|
Deploy: |
||||
|
1. Click above button and select |
||||
|
- Resource Group - all resources will be created in that group, you can choose also to create new one |
||||
|
- Storage Account Type - in case that you you like to be more resistant for failure you may choose Standard_GRS or any other storage with redundancy. |
||||
|
- AdminAPI Key - it will be generated automaticly or you can specify your own one. It will be used to access /admin page |
||||
|
- Choose memory and cpu sizing - I recommend to start with 0.25 cpu and 0.5 Memory |
||||
|
The total CPU and memory allocations requested for all the containers in a container app must add up to one of the following combinations. |
||||
|
vCPUs (cores) Memory |
||||
|
0.25 0.5Gi |
||||
|
0.5 1.0Gi |
||||
|
0.75 1.5Gi |
||||
|
1.0 2.0Gi |
||||
|
1.25 2.5Gi |
||||
|
1.5 3.0Gi |
||||
|
1.75 3.5Gi |
||||
|
2.0 4.0Gi |
||||
|
- **Deploy** |
||||
|
- copy db.sqlite3 (empty database, with WAL off) into fileshare (deployment bug - vaultwarden cannot create new database in SMB share) |
||||
|
|
||||
|
2. Resource vaultwarden Microsoft.App/containerApps failed - if in some case you will notice failed message, just click **redeploy** and reenter same data as before - it may happen when Azure provision resources and link to storage isn't created at time. |
||||
|
|
||||
|
Updating to new version: |
||||
|
in Azure Portal: |
||||
|
- Open Resource Group -> vaultwarden -> Revision management -> **Create revision** -> type name/suffix -> check vaultwarden in Container image section -> **create** |
||||
|
This will update your vaultwarden container app into most recent version, keeping data in place, in no downtime. |
||||
|
|
||||
|
Get Admin key: |
||||
|
- Resource Group -> vaultwarden -> Containers -> Environment Variables -> double click on ADMIN_TOKEN **value** |
||||
|
|
||||
|
Restore your backup into Azure Contaier App: |
||||
|
- The storage is accesible via SMB in contaner it means that sqlite WAL needs to be turned off, make sure before put database in fileshare that you turned off WAL [Running without WAL enabled](https://github.com/dani-garcia/vaultwarden/wiki/Running-without-WAL-enabled) |
Binary file not shown.
@ -0,0 +1,170 @@ |
|||||
|
@description('Storage Account type') |
||||
|
@allowed([ |
||||
|
'Premium_LRS' |
||||
|
'Premium_ZRS' |
||||
|
'Standard_GRS' |
||||
|
'Standard_GZRS' |
||||
|
'Standard_LRS' |
||||
|
'Standard_RAGRS' |
||||
|
'Standard_RAGZRS' |
||||
|
'Standard_ZRS' |
||||
|
]) |
||||
|
param storageAccountSKU string = 'Standard_LRS' |
||||
|
|
||||
|
@description('Vaultwarden Admin API key used to access /admin page - minLength is 20') |
||||
|
@minLength(20) |
||||
|
@secure() |
||||
|
param AdminAPIKEY string = base64(newGuid()) |
||||
|
|
||||
|
@description('Number of CPU cores the container can use. Can be with a maximum of two decimals.') |
||||
|
@allowed([ |
||||
|
'0.25' |
||||
|
'0.5' |
||||
|
'0.75' |
||||
|
'1' |
||||
|
'1.25' |
||||
|
'1.5' |
||||
|
'1.75' |
||||
|
'2' |
||||
|
]) |
||||
|
param cpuCore string = '0.25' |
||||
|
|
||||
|
@description('Amount of memory (in gibibytes, GiB) allocated to the container up to 4GiB. Can be with a maximum of two decimals. Ratio with CPU cores must be equal to 2.') |
||||
|
@allowed([ |
||||
|
'0.5' |
||||
|
'1' |
||||
|
'1.5' |
||||
|
'2' |
||||
|
'3' |
||||
|
'3.5' |
||||
|
'4' |
||||
|
]) |
||||
|
param memorySize string = '0.5' |
||||
|
|
||||
|
var logWorkspaceName = 'vw-logwks${uniqueString(resourceGroup().id)}' |
||||
|
var storageAccountName = 'vwstorage${uniqueString(resourceGroup().id)}' |
||||
|
var location = resourceGroup().location |
||||
|
|
||||
|
resource storageaccount 'Microsoft.Storage/storageAccounts@2021-02-01' = { |
||||
|
name: storageAccountName |
||||
|
location: location |
||||
|
kind: 'StorageV2' |
||||
|
sku: { |
||||
|
name: storageAccountSKU |
||||
|
} |
||||
|
properties:{ |
||||
|
accessTier: 'Hot' |
||||
|
allowSharedKeyAccess: true |
||||
|
allowBlobPublicAccess: true |
||||
|
} |
||||
|
resource fileshare 'fileServices@2022-09-01'={ |
||||
|
name: 'default' |
||||
|
resource vwardendata 'shares@2022-09-01'={ |
||||
|
name: 'vw-data' |
||||
|
properties:{ |
||||
|
accessTier: 'Hot' |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
resource logAnalyticsWorkspace 'Microsoft.OperationalInsights/workspaces@2020-10-01' = { |
||||
|
name: logWorkspaceName |
||||
|
location: location |
||||
|
properties: { |
||||
|
sku: { |
||||
|
name: 'PerGB2018' |
||||
|
} |
||||
|
retentionInDays: 30 |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
resource containerAppEnv 'Microsoft.App/managedEnvironments@2022-06-01-preview'= { |
||||
|
name: 'appenv-vaultwarden${uniqueString(resourceGroup().id)}' |
||||
|
location: location |
||||
|
sku:{ |
||||
|
name: 'Consumption' |
||||
|
} |
||||
|
properties:{ |
||||
|
appLogsConfiguration:{ |
||||
|
destination: 'log-analytics' |
||||
|
logAnalyticsConfiguration:{ |
||||
|
customerId: logAnalyticsWorkspace.properties.customerId |
||||
|
sharedKey: logAnalyticsWorkspace.listKeys().primarySharedKey |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
resource storegeLink 'storages@2022-06-01-preview'={ |
||||
|
name:'vw-data-link' |
||||
|
properties:{ |
||||
|
azureFile:{ |
||||
|
accessMode: 'ReadWrite' |
||||
|
accountKey: storageaccount.listKeys().keys[0].value |
||||
|
shareName: 'vw-data' |
||||
|
accountName: storageaccount.name |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
resource vwardenApp 'Microsoft.App/containerApps@2022-06-01-preview'= { |
||||
|
name: 'vaultwarden' |
||||
|
location: location |
||||
|
properties:{ |
||||
|
environmentId: containerAppEnv.id |
||||
|
configuration:{ |
||||
|
ingress:{ |
||||
|
external: true |
||||
|
targetPort: 80 |
||||
|
allowInsecure: true |
||||
|
traffic:[ |
||||
|
{ |
||||
|
latestRevision: true |
||||
|
weight: 100 |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
template:{ |
||||
|
containers:[ |
||||
|
{ |
||||
|
name: 'vaultwarden' |
||||
|
image: 'docker.io/vaultwarden/server:latest' |
||||
|
resources:{ |
||||
|
cpu: json(cpuCore) |
||||
|
memory: '${memorySize}Gi' |
||||
|
} |
||||
|
|
||||
|
volumeMounts:[ |
||||
|
{ |
||||
|
volumeName: 'vwdatashare' |
||||
|
mountPath: '/data' |
||||
|
} |
||||
|
] |
||||
|
env: [ |
||||
|
{ |
||||
|
name: 'ADMIN_TOKEN' |
||||
|
value: AdminAPIKEY |
||||
|
} |
||||
|
{ |
||||
|
name: 'ENABLE_DB_WAL' |
||||
|
value: 'false' |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
] |
||||
|
volumes:[ |
||||
|
{ |
||||
|
name:'vwdatashare' |
||||
|
storageName: 'vw-data-link' |
||||
|
storageType: 'AzureFile' |
||||
|
} |
||||
|
] |
||||
|
scale:{ |
||||
|
minReplicas: 1 |
||||
|
maxReplicas: 4 |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,226 @@ |
|||||
|
{ |
||||
|
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", |
||||
|
"contentVersion": "1.0.0.0", |
||||
|
"metadata": { |
||||
|
"_generator": { |
||||
|
"name": "bicep", |
||||
|
"version": "0.13.1.58284", |
||||
|
"templateHash": "5335694332706655092" |
||||
|
} |
||||
|
}, |
||||
|
"parameters": { |
||||
|
"storageAccountSKU": { |
||||
|
"type": "string", |
||||
|
"defaultValue": "Standard_LRS", |
||||
|
"allowedValues": [ |
||||
|
"Premium_LRS", |
||||
|
"Premium_ZRS", |
||||
|
"Standard_GRS", |
||||
|
"Standard_GZRS", |
||||
|
"Standard_LRS", |
||||
|
"Standard_RAGRS", |
||||
|
"Standard_RAGZRS", |
||||
|
"Standard_ZRS" |
||||
|
], |
||||
|
"metadata": { |
||||
|
"description": "Storage Account type" |
||||
|
} |
||||
|
}, |
||||
|
"AdminAPIKEY": { |
||||
|
"type": "secureString", |
||||
|
"defaultValue": "[base64(newGuid())]", |
||||
|
"minLength": 20, |
||||
|
"metadata": { |
||||
|
"description": "Vaultwarden Admin API key used to access /admin page - minLength is 20" |
||||
|
} |
||||
|
}, |
||||
|
"cpuCore": { |
||||
|
"type": "string", |
||||
|
"defaultValue": "0.25", |
||||
|
"allowedValues": [ |
||||
|
"0.25", |
||||
|
"0.5", |
||||
|
"0.75", |
||||
|
"1", |
||||
|
"1.25", |
||||
|
"1.5", |
||||
|
"1.75", |
||||
|
"2" |
||||
|
], |
||||
|
"metadata": { |
||||
|
"description": "Number of CPU cores the container can use. Can be with a maximum of two decimals." |
||||
|
} |
||||
|
}, |
||||
|
"memorySize": { |
||||
|
"type": "string", |
||||
|
"defaultValue": "0.5", |
||||
|
"allowedValues": [ |
||||
|
"0.5", |
||||
|
"1", |
||||
|
"1.5", |
||||
|
"2", |
||||
|
"3", |
||||
|
"3.5", |
||||
|
"4" |
||||
|
], |
||||
|
"metadata": { |
||||
|
"description": "Amount of memory (in gibibytes, GiB) allocated to the container up to 4GiB. Can be with a maximum of two decimals. Ratio with CPU cores must be equal to 2." |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"variables": { |
||||
|
"logWorkspaceName": "[format('vw-logwks{0}', uniqueString(resourceGroup().id))]", |
||||
|
"storageAccountName": "[format('vwstorage{0}', uniqueString(resourceGroup().id))]", |
||||
|
"location": "[resourceGroup().location]" |
||||
|
}, |
||||
|
"resources": [ |
||||
|
{ |
||||
|
"type": "Microsoft.Storage/storageAccounts/fileServices/shares", |
||||
|
"apiVersion": "2022-09-01", |
||||
|
"name": "[format('{0}/{1}/{2}', variables('storageAccountName'), 'default', 'vw-data')]", |
||||
|
"properties": { |
||||
|
"accessTier": "Hot" |
||||
|
}, |
||||
|
"dependsOn": [ |
||||
|
"[resourceId('Microsoft.Storage/storageAccounts/fileServices', variables('storageAccountName'), 'default')]" |
||||
|
] |
||||
|
}, |
||||
|
{ |
||||
|
"type": "Microsoft.Storage/storageAccounts/fileServices", |
||||
|
"apiVersion": "2022-09-01", |
||||
|
"name": "[format('{0}/{1}', variables('storageAccountName'), 'default')]", |
||||
|
"dependsOn": [ |
||||
|
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]" |
||||
|
] |
||||
|
}, |
||||
|
{ |
||||
|
"type": "Microsoft.App/managedEnvironments/storages", |
||||
|
"apiVersion": "2022-06-01-preview", |
||||
|
"name": "[format('{0}/{1}', format('appenv-vaultwarden{0}', uniqueString(resourceGroup().id)), 'vw-data-link')]", |
||||
|
"properties": { |
||||
|
"azureFile": { |
||||
|
"accessMode": "ReadWrite", |
||||
|
"accountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2021-02-01').keys[0].value]", |
||||
|
"shareName": "vw-data", |
||||
|
"accountName": "[variables('storageAccountName')]" |
||||
|
} |
||||
|
}, |
||||
|
"dependsOn": [ |
||||
|
"[resourceId('Microsoft.App/managedEnvironments', format('appenv-vaultwarden{0}', uniqueString(resourceGroup().id)))]", |
||||
|
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]" |
||||
|
] |
||||
|
}, |
||||
|
{ |
||||
|
"type": "Microsoft.Storage/storageAccounts", |
||||
|
"apiVersion": "2021-02-01", |
||||
|
"name": "[variables('storageAccountName')]", |
||||
|
"location": "[variables('location')]", |
||||
|
"kind": "StorageV2", |
||||
|
"sku": { |
||||
|
"name": "[parameters('storageAccountSKU')]" |
||||
|
}, |
||||
|
"properties": { |
||||
|
"accessTier": "Hot", |
||||
|
"allowSharedKeyAccess": true, |
||||
|
"allowBlobPublicAccess": true |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
"type": "Microsoft.OperationalInsights/workspaces", |
||||
|
"apiVersion": "2020-10-01", |
||||
|
"name": "[variables('logWorkspaceName')]", |
||||
|
"location": "[variables('location')]", |
||||
|
"properties": { |
||||
|
"sku": { |
||||
|
"name": "PerGB2018" |
||||
|
}, |
||||
|
"retentionInDays": 30 |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
"type": "Microsoft.App/managedEnvironments", |
||||
|
"apiVersion": "2022-06-01-preview", |
||||
|
"name": "[format('appenv-vaultwarden{0}', uniqueString(resourceGroup().id))]", |
||||
|
"location": "[variables('location')]", |
||||
|
"sku": { |
||||
|
"name": "Consumption" |
||||
|
}, |
||||
|
"properties": { |
||||
|
"appLogsConfiguration": { |
||||
|
"destination": "log-analytics", |
||||
|
"logAnalyticsConfiguration": { |
||||
|
"customerId": "[reference(resourceId('Microsoft.OperationalInsights/workspaces', variables('logWorkspaceName')), '2020-10-01').customerId]", |
||||
|
"sharedKey": "[listKeys(resourceId('Microsoft.OperationalInsights/workspaces', variables('logWorkspaceName')), '2020-10-01').primarySharedKey]" |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"dependsOn": [ |
||||
|
"[resourceId('Microsoft.OperationalInsights/workspaces', variables('logWorkspaceName'))]" |
||||
|
] |
||||
|
}, |
||||
|
{ |
||||
|
"type": "Microsoft.App/containerApps", |
||||
|
"apiVersion": "2022-06-01-preview", |
||||
|
"name": "vaultwarden", |
||||
|
"location": "[variables('location')]", |
||||
|
"properties": { |
||||
|
"environmentId": "[resourceId('Microsoft.App/managedEnvironments', format('appenv-vaultwarden{0}', uniqueString(resourceGroup().id)))]", |
||||
|
"configuration": { |
||||
|
"ingress": { |
||||
|
"external": true, |
||||
|
"targetPort": 80, |
||||
|
"allowInsecure": true, |
||||
|
"traffic": [ |
||||
|
{ |
||||
|
"latestRevision": true, |
||||
|
"weight": 100 |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
}, |
||||
|
"template": { |
||||
|
"containers": [ |
||||
|
{ |
||||
|
"name": "vaultwarden", |
||||
|
"image": "docker.io/vaultwarden/server:latest", |
||||
|
"resources": { |
||||
|
"cpu": "[json(parameters('cpuCore'))]", |
||||
|
"memory": "[format('{0}Gi', parameters('memorySize'))]" |
||||
|
}, |
||||
|
"volumeMounts": [ |
||||
|
{ |
||||
|
"volumeName": "vwdatashare", |
||||
|
"mountPath": "/data" |
||||
|
} |
||||
|
], |
||||
|
"env": [ |
||||
|
{ |
||||
|
"name": "ADMIN_TOKEN", |
||||
|
"value": "[parameters('AdminAPIKEY')]" |
||||
|
}, |
||||
|
{ |
||||
|
"name": "ENABLE_DB_WAL", |
||||
|
"value": "false" |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
], |
||||
|
"volumes": [ |
||||
|
{ |
||||
|
"name": "vwdatashare", |
||||
|
"storageName": "vw-data-link", |
||||
|
"storageType": "AzureFile" |
||||
|
} |
||||
|
], |
||||
|
"scale": { |
||||
|
"minReplicas": 1, |
||||
|
"maxReplicas": 4 |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"dependsOn": [ |
||||
|
"[resourceId('Microsoft.App/managedEnvironments', format('appenv-vaultwarden{0}', uniqueString(resourceGroup().id)))]" |
||||
|
] |
||||
|
} |
||||
|
] |
||||
|
} |
Loading…
Reference in new issue