{"id":27264301,"url":"https://github.com/stenstromen/outlinewikibackup","last_synced_at":"2026-04-25T12:36:33.585Z","repository":{"id":245930112,"uuid":"819589849","full_name":"Stenstromen/outlinewikibackup","owner":"Stenstromen","description":"OutlineWiki Backup Utility","archived":false,"fork":false,"pushed_at":"2026-04-15T12:38:15.000Z","size":195,"stargazers_count":4,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-15T13:43:55.168Z","etag":null,"topics":["backup","docker","go","minio","outline","outlinewiki","podman","s3"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Stenstromen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-06-24T20:19:40.000Z","updated_at":"2026-04-15T12:35:35.000Z","dependencies_parsed_at":"2025-04-11T06:55:43.285Z","dependency_job_id":"a0357193-b662-407a-b356-01f0b2c1b419","html_url":"https://github.com/Stenstromen/outlinewikibackup","commit_stats":null,"previous_names":["stenstromen/outlinewikibackup"],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/Stenstromen/outlinewikibackup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Stenstromen%2Foutlinewikibackup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Stenstromen%2Foutlinewikibackup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Stenstromen%2Foutlinewikibackup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Stenstromen%2Foutlinewikibackup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Stenstromen","download_url":"https://codeload.github.com/Stenstromen/outlinewikibackup/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Stenstromen%2Foutlinewikibackup/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32262801,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T09:15:33.318Z","status":"ssl_error","status_checked_at":"2026-04-25T09:15:31.997Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backup","docker","go","minio","outline","outlinewiki","podman","s3"],"created_at":"2025-04-11T06:55:29.120Z","updated_at":"2026-04-25T12:36:33.571Z","avatar_url":"https://github.com/Stenstromen.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OutlineWiki Backup\n\n![OutlineWikiLogo](outlinewikibackup_logo.webp)\n\n- [OutlineWiki Backup](#outlinewiki-backup)\n  - [Description](#description)\n  - [Usage](#usage)\n    - [Create API Key in OutlineWiki](#create-api-key-in-outlinewiki)\n    - [Run backup to MinIO bucket using Podman](#run-backup-to-minio-bucket-using-podman)\n    - [Restore from Backup](#restore-from-backup)\n    - [Example Kubernetes Cronjob](#example-kubernetes-cronjob)\n  - [Environment Variables](#environment-variables)\n\n## Description\n\nThis is a Go binary to backup an OutlineWiki instance. It uses the OutlineWiki API to export the data and saves it locally. Optionally, it can upload the backup to an S3/MinIO bucket.\n\nThis project was inspired by the lack of a built-in backup feature in OutlineWiki, and the need to have a backup of the data in case of data loss. Also, as a response to the lack of any practical backup examples in the [OutlineWiki documentation](https://docs.getoutline.com/s/hosting/doc/backups-KZtPOADCHG).\n\n## Usage\n\n### Create API Key in OutlineWiki\n\n1. Go to the OutlineWiki instance.\n2. Click on the user icon in the lower-left corner.\n3. Click on \"Preferences\".\n4. Click on \"API\".\n5. Click on \"+ New API Key\".\n\n### Run backup to MinIO bucket using Podman\n\n```bash\npodman run --rm \\\n-v /tmp:/tmp:rw \\\n-e API_BASE_URL='https://myoutlinewiki.example.com' \\\n-e AUTH_TOKEN='ol_api_abcd1234' \\\n-e AWS_ACCESS_KEY_ID='AKIA5XQW2PQEEK5FKYFS' \\\n-e AWS_SECRET_ACCESS_KEY='s3cr3t' \\\n-e MINIO_ENDPOINT='https://minio.example.com' \\\n-e S3_BUCKET_NAME='outline' \\\n-e UPLOAD_TO_S3='true' \\\nghcr.io/stenstromen/outlinewikibackup:latest\n```\n\n### Restore from Backup\n\n1. Go to the OutlineWiki instance.\n2. Click on the user icon in the lower-left corner.\n3. Click on \"Import\".\n4. Select a previously exported backup file.\n5. Click on \"StartImport\".\n\n### Example Kubernetes Cronjob\n\nMinIO requirements for the Kubernetes CronJob are:\n\n1. A running MinIO instance.\n1. A bucket named outline.\n1. The access key ID and secret access key for the MinIO instance.\n1. The MinIO instance should be accessible at the specified endpoint.\n\n```yaml\napiVersion: v1\ndata:\n  auth-token: b2xfYXBpX2FiY2QxMjM0\n  minio-access-key-id: QUtJQTVYUVcyUFFFRUs1RktZRlM=\n  minio-secret-access-key: czNjcjN0\nkind: Secret\nmetadata:\n  name: outline-backup-secrets\n  namespace: default\ntype: Opaque\n\n---\napiVersion: batch/v1\nkind: CronJob\nmetadata:\n  name: outline-backup\n  namespace: default\nspec:\n  concurrencyPolicy: Forbid\n  failedJobsHistoryLimit: 1\n  jobTemplate:\n    spec:\n      activeDeadlineSeconds: 3600\n      backoffLimit: 2\n      template:\n        spec:\n          containers:\n            - env:\n                - name: KEEP_BACKUPS\n                  value: \"7\"\n                - name: API_BASE_URL\n                  value: https://outline.example.com\n                - name: S3_BUCKET_NAME\n                  value: outline\n                - name: UPLOAD_TO_S3\n                  value: \"true\"\n                - name: MINIO_ENDPOINT\n                  value: https://minio.example.com\n                - name: AUTH_TOKEN\n                  valueFrom:\n                    secretKeyRef:\n                      key: auth-token\n                      name: outline-backup-secrets\n                - name: AWS_ACCESS_KEY_ID\n                  valueFrom:\n                    secretKeyRef:\n                      key: minio-access-key-id\n                      name: outline-backup-secrets\n                - name: AWS_SECRET_ACCESS_KEY\n                  valueFrom:\n                    secretKeyRef:\n                      key: minio-secret-access-key\n                      name: outline-backup-secrets\n              securityContext:\n                runAsUser: 65534\n                runAsGroup: 65534\n                privileged: false\n                runAsNonRoot: true\n                readOnlyRootFilesystem: true\n                allowPrivilegeEscalation: false\n                procMount: Default\n                capabilities:\n                  drop: [\"ALL\"]\n                seccompProfile:\n                  type: RuntimeDefault\n              image: ghcr.io/stenstromen/outlinewikibackup:latest\n              imagePullPolicy: IfNotPresent\n              name: outline-backup\n              terminationMessagePath: /dev/termination-log\n              terminationMessagePolicy: File\n              volumeMounts:\n                - name: tmp\n                  mountPath: /tmp\n          dnsPolicy: ClusterFirst\n          restartPolicy: Never\n          schedulerName: default-scheduler\n          terminationGracePeriodSeconds: 30\n          volumes:\n            - name: tmp\n              emptyDir: {}\n  schedule: \"@daily\"\n  successfulJobsHistoryLimit: 0\n  suspend: false\n```\n\n## Environment Variables\n\n- `SAVE_DIR`: The directory to save the file locally, defaults to `/tmp/outlinewikibackups` if not set.\n- `UPLOAD_TO_S3`: If set to `\"true\"`, the file will be uploaded to S3/MinIO.\n- `S3_BUCKET_NAME`: The S3/MinIO bucket name.\n- `AWS_REGION`: The AWS region, required if not using MinIO.\n- `MINIO_ENDPOINT`: The MinIO endpoint URL, required if using MinIO.\n- `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`: Credentials for AWS S3 or MinIO.\n- `KEEP_BACKUPS` (optional): The number of backups to keep, defaults to infinite.\n- `SLEEP_DURATION` (optional): The duration to sleep (wait) before checking export status, defaults to 10 seconds.\n- `MINIMAL_S3_PERMISSIONS` (optional): If set to `\"true\"`, skips operations that require additional S3/MinIO permissions beyond the minimal set. This includes skipping the ListBuckets connectivity check and the ListObjectsV2 backup cleanup operation. This allows the application to work with minimal S3/MinIO permissions that only include `s3:PutObject`, `s3:AbortMultipartUpload`, `s3:DeleteObject`, and `s3:ListMultipartUploadParts`. (See [minimal-policy-example.json](minimal-policy-example.json) for the minimal permissions set.)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstenstromen%2Foutlinewikibackup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstenstromen%2Foutlinewikibackup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstenstromen%2Foutlinewikibackup/lists"}