forked from coop-cloud/outline
		
	Compare commits
	
		
			63 Commits
		
	
	
		
			0.3.0+0.62
			...
			add-local-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 907597aab3 | |||
| d9ce8fb168 | |||
| 73de12d12f | |||
| 8c3521b87f | |||
| 4273faad76 | |||
| 0e84bbc2ee | |||
| ca60a0f1a3 | |||
| 3b1eeb6160 | |||
| 52f3bf31ed | |||
| e229ab6e30 | |||
| 0ab6c0c244 | |||
| 5e2a13a93a | |||
| 8796269ad2 | |||
| a4f75f2da0 | |||
| 76523535ca | |||
| 68f23084aa | |||
| e487a36bb5 | |||
| 8426058959 | |||
| 277a5d2343 | |||
| 56be9efd22 | |||
| 7d2f35277b | |||
| 53913b92cd | |||
| e0cc0ff9af | |||
| 5e3e8a655b | |||
| 53e4d82aa3 | |||
| 361908fe84 | |||
| ecb5314fe7 | |||
| a016995516 | |||
| 2daf487bb8 | |||
| 0354892c74 | |||
| 86c215cbc9 | |||
| 8e7a7b9932 | |||
| d1f7c765dd | |||
| 4f923ad0c1 | |||
| 672557c7fb | |||
| 00576231e5 | |||
| beeffe65f6 | |||
| 7685fe6abf | |||
| c5c9dcfd31 | |||
| be55317dd0 | |||
| 9a698a557b | |||
| cfbeb3be67 | |||
| 08ec0295c5 | |||
| 9bc4e9855a | |||
| 0351cf3e80 | |||
| 3cfd546e5b | |||
| b0939968af | |||
| 042c5a71a6 | |||
| 6051ea5b37 | |||
| 4745b2e836 | |||
| 758d4d6af8 | |||
| 3736e7efbb | |||
| 758d1615f8 | |||
| 18002e6276 | |||
| 37fb7cd5d0 | |||
| a748dce34b | |||
| cce7b26929 | |||
| 85324a477c | |||
| 8bac424b47 | |||
| 39c98d7d53 | |||
| 4c242219e1 | |||
| 0841e85a57 | |||
| 6ee580b9de | 
							
								
								
									
										42
									
								
								.drone.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								.drone.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,42 @@ | ||||
| --- | ||||
| kind: pipeline | ||||
| name: deploy to swarm-test.autonomic.zone | ||||
| steps: | ||||
|   - name: deployment | ||||
|     image: git.coopcloud.tech/coop-cloud/stack-ssh-deploy:latest | ||||
|     settings: | ||||
|       host: swarm-test.autonomic.zone | ||||
|       stack: outline | ||||
|       generate_secrets: true | ||||
|       purge: true | ||||
|       deploy_key: | ||||
|         from_secret: drone_ssh_swarm_test | ||||
|       networks: | ||||
|         - proxy | ||||
|     environment: | ||||
|       DOMAIN: outline.swarm-test.autonomic.zone | ||||
|       STACK_NAME: outline | ||||
|       LETS_ENCRYPT_ENV: production | ||||
|       APP_ENTRYPOINT_VERSION: v1 | ||||
|       SECRET_DB_PASSWORD_VERSION: v1 | ||||
|       SECRET_SECRET_KEY_VERSION: v1  # length=64 | ||||
|       SECRET_UTILS_SECRET_VERSION: v1  # length=64 | ||||
| trigger: | ||||
|   branch: | ||||
|     - main | ||||
| --- | ||||
| kind: pipeline | ||||
| name: generate recipe catalogue | ||||
| steps: | ||||
|   - name: release a new version | ||||
|     image: plugins/downstream | ||||
|     settings: | ||||
|       server: https://build.coopcloud.tech | ||||
|       token: | ||||
|         from_secret: drone_abra-bot_token | ||||
|       fork: true | ||||
|       repositories: | ||||
|         - coop-cloud/auto-recipes-catalogue-json | ||||
|  | ||||
| trigger: | ||||
|   event: tag | ||||
							
								
								
									
										57
									
								
								.env.sample
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								.env.sample
									
									
									
									
									
								
							| @ -8,32 +8,16 @@ DOMAIN=outline.example.com | ||||
| #EXTRA_DOMAINS=', `www.outline.example.com`' | ||||
| LETS_ENCRYPT_ENV=production | ||||
|  | ||||
| # https://git.coopcloud.tech/coop-cloud-chaos-patchs/outline | ||||
| #COMPOSE_FILE="compose.yml:compose.patch.yml" | ||||
| COMPOSE_FILE="compose.yml" | ||||
|  | ||||
| # –––––––––––––––– REQUIRED –––––––––––––––– | ||||
|  | ||||
| SECRET_DB_PASSWORD_VERSION=v1 | ||||
| SECRET_SECRET_KEY_VERSION=v1  # length=64 | ||||
| SECRET_UTILS_SECRET_VERSION=v1  # length=64 | ||||
| SECRET_AWS_SECRET_KEY_VERSION=v1 | ||||
| SECRET_OIDC_CLIENT_SECRET_VERSION=v1 | ||||
|  | ||||
| AWS_ACCESS_KEY_ID= | ||||
| AWS_REGION= | ||||
| AWS_S3_UPLOAD_BUCKET_URL= | ||||
| AWS_S3_UPLOAD_BUCKET_NAME= | ||||
| AWS_S3_UPLOAD_MAX_SIZE=26214400 | ||||
| AWS_S3_FORCE_PATH_STYLE=true | ||||
| AWS_S3_ACL=private | ||||
|  | ||||
| OIDC_CLIENT_ID= | ||||
| OIDC_AUTH_URI= | ||||
| OIDC_TOKEN_URI= | ||||
| OIDC_USERINFO_URI= | ||||
| OIDC_USERNAME_CLAIM=preferred_username | ||||
| OIDC_DISPLAY_NAME="My Cool OpenId Connect Provider" | ||||
| OIDC_SCOPES="openid profile email" | ||||
| # Set to s3 to use AWS S3 bucket | ||||
| FILE_STORAGE=local | ||||
|  | ||||
| # –––––––––––––––– OPTIONAL –––––––––––––––– | ||||
|  | ||||
| @ -65,15 +49,46 @@ DEBUG=http | ||||
| # set, all domains are allowed by default when using Google OAuth to signin | ||||
| ALLOWED_DOMAINS= | ||||
|  | ||||
| # TODO: setup compose.smtp.yml | ||||
| # To support sending outgoing transactional emails such as "document updated" or | ||||
| # "you've been invited" you'll need to provide authentication for an SMTP server | ||||
| # By default, this enables email login. You can disable this in the settings | ||||
| # for configuration details see https://docs.getoutline.com/s/hosting/doc/smtp-cqCJyZGMIB | ||||
| #COMPOSE_FILE="$COMPOSE_FILE:compose.smtp.yml" | ||||
| #SMTP_ENABLED=1 | ||||
| #SMTP_HOST= | ||||
| #SMTP_PORT= | ||||
| #SMTP_USERNAME= | ||||
| #SMTP_PASSWORD= | ||||
| #SMTP_FROM_EMAIL= | ||||
| #SMTP_REPLY_EMAIL= | ||||
| #SMTP_TLS_CIPHERS= | ||||
| #SMTP_SECURE=true | ||||
| #SECRET_SMTP_PASSWORD_VERSION=v1 | ||||
|  | ||||
| #COMPOSE_FILE="$COMPOSE_FILE:compose.oidc.yml" | ||||
| #OIDC_ENABLED=1 | ||||
| #OIDC_CLIENT_ID= | ||||
| #OIDC_AUTH_URI= | ||||
| #OIDC_TOKEN_URI= | ||||
| #OIDC_USERINFO_URI= | ||||
| #OIDC_USERNAME_CLAIM=preferred_username | ||||
| #OIDC_DISPLAY_NAME="My Cool OpenId Connect Provider" | ||||
| #OIDC_SCOPES="openid profile email" | ||||
| #SECRET_OIDC_CLIENT_SECRET_VERSION=v1 | ||||
|  | ||||
| #COMPOSE_FILE="$COMPOSE_FILE:compose.google.yml" | ||||
| #GOOGLE_ENABLED=1 | ||||
| #GOOGLE_CLIENT_ID= | ||||
| #SECRET_GOOGLE_CLIENT_SECRET_VERSION=v1 | ||||
|  | ||||
| COMPOSE_FILE="$COMPOSE_FILE:compose.local.yml" | ||||
| FILE_STORAGE_UPLOAD_MAX_SIZE=26214400 | ||||
|  | ||||
| #COMPOSE_FILE="$COMPOSE_FILE:compose.aws.yml" | ||||
| #AWS_ACCESS_KEY_ID= | ||||
| #AWS_REGION= | ||||
| #AWS_S3_UPLOAD_BUCKET_URL= | ||||
| #AWS_S3_UPLOAD_BUCKET_NAME= | ||||
| #AWS_S3_UPLOAD_MAX_SIZE=26214400 | ||||
| #AWS_S3_FORCE_PATH_STYLE=true | ||||
| #AWS_S3_ACL=private | ||||
| #SECRET_AWS_SECRET_KEY_VERSION=v1 | ||||
|  | ||||
							
								
								
									
										57
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								README.md
									
									
									
									
									
								
							| @ -5,13 +5,13 @@ Wiki and knowledge base for growing teams | ||||
| <!-- metadata --> | ||||
|  | ||||
| * **Category**: Apps | ||||
| * **Status**: | ||||
| * **Image**: [outlinewiki/outline](https://hub.docker.com/r/outlinewiki/outline) | ||||
| * **Healthcheck**: | ||||
| * **Backups**: | ||||
| * **Email**: | ||||
| * **Tests**: | ||||
| * **SSO**: | ||||
| * **Status**: 3, beta | ||||
| * **Image**: [outlinewiki/outline](https://hub.docker.com/r/outlinewiki/outline), 4, upstream | ||||
| * **Healthcheck**: No | ||||
| * **Backups**: Yes | ||||
| * **Email**: Yes | ||||
| * **Tests**: 2 | ||||
| * **SSO**: 3 (OAuth) | ||||
|  | ||||
| <!-- endmetadata --> | ||||
|  | ||||
| @ -19,10 +19,14 @@ Wiki and knowledge base for growing teams | ||||
|  | ||||
| 1. Set up Docker Swarm and [`abra`] | ||||
| 2. Deploy [`coop-cloud/traefik`] | ||||
| 3. `abra app new ${REPO_NAME} --secrets` (optionally with `--pass` if you'd like | ||||
|    to save secrets in `pass`) | ||||
| 3. `abra app new ${REPO_NAME}` | ||||
|    - **WARNING**: Choose "n" when `abra` asks if you'd like to generate secrets | ||||
| 4. `abra app config YOURAPPNAME` - be sure to change `$DOMAIN` to something that resolves to | ||||
|    your Docker swarm box | ||||
|    your Docker swarm box. For Minio, you'll want: | ||||
|    - `AWS_ACCESS_KEY_ID=<minio username>` | ||||
|    - `AWS_REGION="us-east-1"` | ||||
|    - `AWS_S3_UPLOAD_BUCKET_URL=https://minio.example.com` | ||||
|    - `AWS_S3_UPLOAD_BUCKET_NAME= | ||||
| 5. `abra app deploy YOURAPPNAME` | ||||
| 7. Open the configured domain in your browser to finish set-up | ||||
|  | ||||
| @ -31,19 +35,40 @@ Wiki and knowledge base for growing teams | ||||
|  | ||||
| ## Tips & Tricks | ||||
|  | ||||
| ### Create an initial admin user | ||||
|  | ||||
| ``` | ||||
| abra app cmd YOURAPPNAME app create_email_user test@example.com | ||||
| ``` | ||||
|  | ||||
| ### Post-deploy migration | ||||
|  | ||||
| ``` | ||||
| abra app run YOURAPPNAME app sh | ||||
| export DATABASE_PASSWORD=$(cat /run/secrets/db_password) | ||||
| export DATABASE_URL="postgres://outline:${DATABASE_PASSWORD}@${STACK_NAME}_postgres:5432/outline" | ||||
| yarn db:migrate --env=production-ssl-disabled | ||||
| abra app cmd YOURAPPNAME app migrate | ||||
| ``` | ||||
|  | ||||
| _As of 2022-03-30, this requires `abra` RC version, run `abra upgrade --rc`._ | ||||
|  | ||||
| ### Setting up your `.env` config | ||||
|  | ||||
| Avoid the use of quotes (`"..."`) as much as possible, the NodeJS scripts flip out for some reason on some vars. | ||||
|  | ||||
| ### Multiple users logging in & generic oauth | ||||
| ### Deleting a user (e.g. to fix SSO weirdness) | ||||
|  | ||||
| `COMPOSE_FILE="compose.yml:compose.patch.yml"` | ||||
| `abra app cmd YOURAPPNAME db delete_user <username-to-delete> <username-to-replace>` | ||||
|  | ||||
| Where `<username-to-delete>` is the username of the user to be removed, and | ||||
| `<username-to-replace>` is the username of another user, to assign documents and | ||||
| revisions to (instead of deleting them). | ||||
|  | ||||
| _As of 2022-03-30, this requires `abra` RC version, run `abra upgrade --rc`._ | ||||
|  | ||||
| ## Single Sign On with Keycloak | ||||
|  | ||||
| `abra app config YOURAPPNAME`, then uncomment everything in the `OIDC_` section. | ||||
|  | ||||
| Create a new client in Keycloak: | ||||
|  | ||||
| - **Valid Redirect URIs**: `https://YOURAPPDOMAIN/auth/oidc.callback` | ||||
|  | ||||
| `abra app deploy YOURAPPDOMAIN` | ||||
|  | ||||
							
								
								
									
										96
									
								
								abra.sh
									
									
									
									
									
								
							
							
						
						
									
										96
									
								
								abra.sh
									
									
									
									
									
								
							| @ -1 +1,95 @@ | ||||
| export APP_ENTRYPOINT_VERSION=v2 | ||||
| export APP_ENTRYPOINT_VERSION=v8 | ||||
| export DB_ENTRYPOINT_VERSION=v2 | ||||
|  | ||||
| create_email_user() { | ||||
| 	if [ -z "$1" ]; then | ||||
| 		echo "Usage: ... create_email_user <email_address>" | ||||
| 		exit 1 | ||||
| 	fi | ||||
| 	export DATABASE_PASSWORD=$(cat /run/secrets/db_password) | ||||
| 	export DATABASE_URL="postgres://outline:${DATABASE_PASSWORD}@${STACK_NAME}_db:5432/outline" | ||||
| 	export UTILS_SECRET=$(cat /run/secrets/utils_secret) | ||||
| 	export SECRET_KEY=$(cat /run/secrets/secret_key) | ||||
| 	node build/server/scripts/seed.js "$1" | ||||
| } | ||||
|  | ||||
| migrate() { | ||||
| 	export DATABASE_PASSWORD=$(cat /run/secrets/db_password) | ||||
| 	export DATABASE_URL="postgres://outline:${DATABASE_PASSWORD}@${STACK_NAME}_db:5432/outline" | ||||
| 	yarn db:migrate --env=production-ssl-disabled | ||||
| } | ||||
|  | ||||
| delete_user_by_id() { | ||||
| 	if [ -z "$1" ] || [ -z "$2" ]; then | ||||
| 		echo "Usage: ... delete_user_by_id <userid-to-delete> <userid-to-replace>" | ||||
| 		exit 1 | ||||
| 	fi | ||||
|  | ||||
| 	USERID_REPLACE="$2" | ||||
| 	USERID_REMOVE="$1" | ||||
|  | ||||
| 	psql -U outline outline <<- SQL | ||||
| 	UPDATE documents SET "userId" = '$USERID_REPLACE' WHERE "userId" = '$USERID_REMOVE'; | ||||
| 	UPDATE groups SET "createdById" = '$USERID_REPLACE' WHERE "createdById" = '$USERID_REMOVE'; | ||||
| 	UPDATE pins SET "createdById" = '$USERID_REPLACE' WHERE "createdById" = '$USERID_REMOVE'; | ||||
| 	UPDATE group_users SET "createdById" = '$USERID_REPLACE' WHERE "createdById" = '$USERID_REMOVE'; | ||||
| 	UPDATE collections SET "createdById" = '$USERID_REPLACE' WHERE "createdById" = '$USERID_REMOVE'; | ||||
| 	UPDATE collection_users SET "createdById" = '$USERID_REPLACE' WHERE "createdById" = '$USERID_REMOVE'; | ||||
| 	UPDATE collection_groups SET "createdById" = '$USERID_REPLACE' WHERE "createdById" = '$USERID_REMOVE'; | ||||
| 	UPDATE documents SET "lastModifiedById" = '$USERID_REPLACE' WHERE "lastModifiedById" = '$USERID_REMOVE'; | ||||
| 	UPDATE documents SET "createdById" = '$USERID_REPLACE' WHERE "createdById" = '$USERID_REMOVE'; | ||||
| 	UPDATE revisions SET "userId" = '$USERID_REPLACE' WHERE "userId" = '$USERID_REMOVE'; | ||||
| 	UPDATE attachments SET "userId" = '$USERID_REPLACE' WHERE "userId" = '$USERID_REMOVE'; | ||||
| 	UPDATE backlinks SET "userId" = '$USERID_REPLACE' WHERE "userId" = '$USERID_REMOVE'; | ||||
| 	UPDATE file_operations SET "userId" = '$USERID_REPLACE' WHERE "userId" = '$USERID_REMOVE'; | ||||
| 	UPDATE users SET "suspendedById" = '$USERID_REPLACE' WHERE "suspendedById" = '$USERID_REMOVE'; | ||||
| 	DELETE FROM search_queries WHERE "userId" = '$USERID_REMOVE'; | ||||
| 	DELETE FROM shares WHERE "userId" = '$USERID_REMOVE'; | ||||
| 	DELETE FROM notification_settings WHERE "userId" = '$USERID_REMOVE'; | ||||
| 	DELETE FROM events WHERE "actorId" = '$USERID_REMOVE'; | ||||
| 	DELETE FROM events WHERE "userId" = '$USERID_REMOVE'; | ||||
| 	DELETE FROM users WHERE "id" = '$USERID_REMOVE'; | ||||
| 	SQL | ||||
| } | ||||
|  | ||||
| delete_user() { | ||||
| 	if [ -z "$1" ] || [ -z "$2" ]; then | ||||
| 		echo "Usage: ... delete_user <userid-to-delete> <userid-to-replace>" | ||||
| 		exit 1 | ||||
| 	fi | ||||
|  | ||||
| 	USERID_REMOVE=$(echo "SELECT id FROM users WHERE username = '$1'" | psql -t -A -U outline outline) | ||||
| 	USERID_REPLACE=$(echo "SELECT id FROM users WHERE username = '$2'" | psql -t -A -U outline outline) | ||||
|  | ||||
| 	if [ -z "$USERID_REMOVE" ]; then | ||||
| 		echo "Can't find ID of '$1'" | ||||
| 		exit 1 | ||||
| 	fi | ||||
|  | ||||
| 	if [ -z "$USERID_REPLACE" ]; then | ||||
| 		echo "Can't find ID of '$2'" | ||||
| 		exit 1 | ||||
| 	fi | ||||
| 	 | ||||
| 	delete_user_by_id "$USERID_REMOVE" "$USERID_REPLACE" | ||||
| } | ||||
|  | ||||
| delete_duplicate_users() { | ||||
| 	if [ -z "$1" ]; then | ||||
| 		echo "Usage: ... delete_duplicate_users <username>" | ||||
| 		exit 1 | ||||
| 	fi | ||||
|  | ||||
| 	USERIDS=$(echo "SELECT id FROM users WHERE username = '$1' ORDER BY users.\"createdAt\" DESC" | psql -t -A -U outline outline) | ||||
|  | ||||
| 	if [ ! "$(echo "$USERIDS" | wc -l)" -gt 1 ]; then | ||||
| 		echo "Only one user exists, bailing" | ||||
| 		exit 1 | ||||
| 	fi | ||||
|  | ||||
| 	USERID_NEW=$(echo "$USERIDS" | head -n1) | ||||
|  | ||||
| 	for USERID_OLD in $(echo "$USERIDS" | tail -n+2); do | ||||
| 		delete_user_by_id "$USERID_OLD" "$USERID_NEW" | ||||
| 	done | ||||
| } | ||||
|  | ||||
							
								
								
									
										22
									
								
								compose.aws.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								compose.aws.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| --- | ||||
| version: "3.8" | ||||
|  | ||||
| services: | ||||
|   app: | ||||
|     secrets: | ||||
|       - aws_secret_key | ||||
|     environment: | ||||
|       - AWS_ACCESS_KEY_ID | ||||
|       - AWS_REGION | ||||
|       - AWS_S3_ACL | ||||
|       - AWS_S3_FORCE_PATH_STYLE | ||||
|       - AWS_S3_UPLOAD_BUCKET_NAME | ||||
|       - AWS_S3_UPLOAD_BUCKET_URL | ||||
|       - AWS_S3_UPLOAD_MAX_SIZE | ||||
|       - AWS_SDK_LOAD_CONFIG=0 | ||||
|       - AWS_SECRET_KEY_FILE=/run/secrets/aws_secret_key | ||||
|  | ||||
| secrets: | ||||
|   aws_secret_key: | ||||
|     name: ${STACK_NAME}_aws_secret_key_${SECRET_AWS_SECRET_KEY_VERSION} | ||||
|     external: true | ||||
							
								
								
									
										16
									
								
								compose.google.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								compose.google.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | ||||
| --- | ||||
| version: "3.8" | ||||
|  | ||||
| services: | ||||
|   app: | ||||
|     secrets: | ||||
|       - google_client_secret | ||||
|     environment: | ||||
|       - GOOGLE_CLIENT_ID | ||||
|       - GOOGLE_ENABLED | ||||
|       - ALLOWED_DOMAINS | ||||
|  | ||||
| secrets: | ||||
|   google_client_secret: | ||||
|     name: ${STACK_NAME}_google_client_secret_${SECRET_GOOGLE_CLIENT_SECRET_VERSION} | ||||
|     external: true | ||||
							
								
								
									
										13
									
								
								compose.local.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								compose.local.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| --- | ||||
| version: "3.8" | ||||
|  | ||||
| services: | ||||
|   app: | ||||
|     volumes: | ||||
|       - storage-data:/var/lib/outline/data | ||||
|     environment: | ||||
|       - FILE_STORAGE | ||||
|       - FILE_STORAGE_UPLOAD_MAX_SIZE | ||||
|  | ||||
| volumes: | ||||
|   storage-data: | ||||
							
								
								
									
										21
									
								
								compose.oidc.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								compose.oidc.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| --- | ||||
| version: "3.8" | ||||
|  | ||||
| services: | ||||
|   app: | ||||
|     secrets: | ||||
|       - oidc_client_secret | ||||
|     environment: | ||||
|       - OIDC_AUTH_URI | ||||
|       - OIDC_CLIENT_ID | ||||
|       - OIDC_DISPLAY_NAME | ||||
|       - OIDC_ENABLED | ||||
|       - OIDC_SCOPES | ||||
|       - OIDC_TOKEN_URI | ||||
|       - OIDC_USERINFO_URI | ||||
|       - OIDC_USERNAME_CLAIM | ||||
|  | ||||
| secrets: | ||||
|   oidc_client_secret: | ||||
|     name: ${STACK_NAME}_oidc_client_secret_${SECRET_OIDC_CLIENT_SECRET_VERSION} | ||||
|     external: true | ||||
| @ -1,6 +0,0 @@ | ||||
| --- | ||||
| version: "3.8" | ||||
|  | ||||
| services: | ||||
|   app: | ||||
|     image: thecoopcloud/outline-with-patch:latest | ||||
							
								
								
									
										18
									
								
								compose.smtp.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								compose.smtp.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | ||||
| version: "3.8" | ||||
| services: | ||||
|   app: | ||||
|     secrets: | ||||
|       - smtp_password | ||||
|     environment: | ||||
|       - SMTP_HOST | ||||
|       - SMTP_PORT | ||||
|       - SMTP_USERNAME | ||||
|       - SMTP_FROM_EMAIL | ||||
|       - SMTP_REPLY_EMAIL | ||||
|       - SMTP_TLS_CIPHERS | ||||
|       - SMTP_SECURE | ||||
|  | ||||
| secrets: | ||||
|   smtp_password: | ||||
|     external: true | ||||
|     name: ${STACK_NAME}_smtp_password_${SECRET_SMTP_PASSWORD_VERSION} | ||||
							
								
								
									
										60
									
								
								compose.yml
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								compose.yml
									
									
									
									
									
								
							| @ -6,41 +6,21 @@ services: | ||||
|     networks: | ||||
|       - backend | ||||
|       - proxy | ||||
|     image: outlinewiki/outline:0.62.0 | ||||
|     image: outlinewiki/outline:0.73.1 | ||||
|     secrets: | ||||
|       - aws_secret_key | ||||
|       - db_password | ||||
|       - oidc_client_secret | ||||
|       - secret_key | ||||
|       - utils_secret | ||||
|     configs: | ||||
|       - source: app_entrypoint | ||||
|         target: /docker-entrypoint.sh | ||||
|         mode: 0555 | ||||
|     volumes: | ||||
|       - outline_data:/opt/outline | ||||
|     environment: | ||||
|       - AWS_ACCESS_KEY_ID | ||||
|       - AWS_REGION | ||||
|       - AWS_S3_ACL | ||||
|       - AWS_S3_FORCE_PATH_STYLE | ||||
|       - AWS_S3_UPLOAD_BUCKET_NAME | ||||
|       - AWS_S3_UPLOAD_BUCKET_URL | ||||
|       - AWS_S3_UPLOAD_MAX_SIZE | ||||
|       - AWS_SDK_LOAD_CONFIG=0 | ||||
|       - AWS_SECRET_KEY_FILE=/run/secrets/aws_secret_key | ||||
|       - FILE_STORAGE | ||||
|       - DATABASE_PASSWORD_FILE=/run/secrets/db_password | ||||
|       - FORCE_HTTPS=true | ||||
|       - OIDC_AUTH_URI | ||||
|       - OIDC_CLIENT_ID | ||||
|       - OIDC_CLIENT_SECRET_FILE=/run/secrets/oidc_client_secret | ||||
|       - OIDC_DISPLAY_NAME | ||||
|       - OIDC_SCOPES | ||||
|       - OIDC_TOKEN_URI | ||||
|       - OIDC_USERINFO_URI | ||||
|       - OIDC_USERNAME_CLAIM | ||||
|       - PGSSLMODE=disable   | ||||
|       - REDIS_URL=redis://${STACK_NAME}_redis:6379 | ||||
|       - PGSSLMODE=disable | ||||
|       - REDIS_URL=redis://${STACK_NAME}_cache:6379 | ||||
|       - SECRET_KEY_FILE=/run/secrets/secret_key | ||||
|       - STACK_NAME | ||||
|       - TEAM_LOGO | ||||
| @ -54,29 +34,40 @@ services: | ||||
|         - "traefik.http.routers.${STACK_NAME}.rule=Host(`${DOMAIN}`${EXTRA_DOMAINS})" | ||||
|         - "traefik.http.routers.${STACK_NAME}.entrypoints=web-secure" | ||||
|         - "traefik.http.routers.${STACK_NAME}.tls.certresolver=${LETS_ENCRYPT_ENV}" | ||||
|         - "coop-cloud.${STACK_NAME}.version=0.3.0+0.62.0" | ||||
|         - "coop-cloud.${STACK_NAME}.version=1.1.0+0.73.1" | ||||
|         ## Redirect from EXTRA_DOMAINS to DOMAIN | ||||
|         #- "traefik.http.routers.${STACK_NAME}.middlewares=${STACK_NAME}-redirect" | ||||
|         #- "traefik.http.middlewares.${STACK_NAME}-redirect.headers.SSLForceHost=true" | ||||
|         #- "traefik.http.middlewares.${STACK_NAME}-redirect.headers.SSLHost=${DOMAIN}" | ||||
|  | ||||
|   redis: | ||||
|     image: redis:6.2.6 | ||||
|   cache: | ||||
|     image: redis:7.2.3 | ||||
|     networks: | ||||
|       - backend | ||||
|  | ||||
|   postgres: | ||||
|     image: postgres:11 | ||||
|   db: | ||||
|     image: postgres:15.5 | ||||
|     networks: | ||||
|       - backend | ||||
|     secrets: | ||||
|       - db_password | ||||
|     configs: | ||||
|       - source: db_entrypoint | ||||
|         target: /docker-entrypoint.sh | ||||
|         mode: 0555 | ||||
|     environment: | ||||
|       POSTGRES_DB: outline | ||||
|       POSTGRES_PASSWORD_FILE: /run/secrets/db_password | ||||
|       POSTGRES_USER: outline | ||||
|     volumes: | ||||
|       - "postgres_data:/var/lib/postgresql/data" | ||||
|     entrypoint: /docker-entrypoint.sh | ||||
|     deploy: | ||||
|       labels: | ||||
|         backupbot.backup: "true" | ||||
|         backupbot.backup.path: "/tmp/dump.sql.gz" | ||||
|         backupbot.backup.post-hook: "rm -f /tmp/dump.sql.gz" | ||||
|         backupbot.backup.pre-hook: "sh -c 'PGPASSWORD=$$(cat $${POSTGRES_PASSWORD_FILE}) pg_dump -U outline outline | gzip > /tmp/dump.sql.gz'" | ||||
|  | ||||
| secrets: | ||||
|   secret_key: | ||||
| @ -85,12 +76,6 @@ secrets: | ||||
|   utils_secret: | ||||
|     name: ${STACK_NAME}_utils_secret_${SECRET_UTILS_SECRET_VERSION} | ||||
|     external: true | ||||
|   aws_secret_key: | ||||
|     name: ${STACK_NAME}_aws_secret_key_${SECRET_AWS_SECRET_KEY_VERSION} | ||||
|     external: true | ||||
|   oidc_client_secret: | ||||
|     name: ${STACK_NAME}_oidc_client_secret_${SECRET_OIDC_CLIENT_SECRET_VERSION} | ||||
|     external: true | ||||
|   db_password: | ||||
|     name: ${STACK_NAME}_db_password_${SECRET_DB_PASSWORD_VERSION} | ||||
|     external: true | ||||
| @ -101,7 +86,6 @@ networks: | ||||
|   backend: | ||||
|  | ||||
| volumes: | ||||
|   outline_data: | ||||
|   postgres_data: | ||||
|  | ||||
| configs: | ||||
| @ -109,3 +93,7 @@ configs: | ||||
|     name: ${STACK_NAME}_app_entrypoint_${APP_ENTRYPOINT_VERSION} | ||||
|     file: entrypoint.sh.tmpl | ||||
|     template_driver: golang | ||||
|   db_entrypoint: | ||||
|     name: ${STACK_NAME}_db_entrypoint_${DB_ENTRYPOINT_VERSION} | ||||
|     file: entrypoint.postgres.sh.tmpl | ||||
|     template_driver: golang | ||||
|  | ||||
							
								
								
									
										44
									
								
								entrypoint.postgres.sh.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								entrypoint.postgres.sh.tmpl
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,44 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| set -e | ||||
|  | ||||
| MIGRATION_MARKER=$PGDATA/migration_in_progress | ||||
| OLDDATA=$PGDATA/old_data | ||||
| NEWDATA=$PGDATA/new_data | ||||
|  | ||||
| if [ -e $MIGRATION_MARKER ]; then | ||||
|   echo "FATAL: migration was started but did not complete in a previous run. manual recovery necessary" | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| if [ -f $PGDATA/PG_VERSION ]; then | ||||
|   DATA_VERSION=$(cat $PGDATA/PG_VERSION) | ||||
|  | ||||
|   if [ -n "$DATA_VERSION" -a "$PG_MAJOR" != "$DATA_VERSION" ]; then | ||||
|     echo "postgres data version $DATA_VERSION found, but need $PG_MAJOR. Starting migration" | ||||
|     echo "Installing postgres $DATA_VERSION" | ||||
|     sed -i "s/$/ $DATA_VERSION/" /etc/apt/sources.list.d/pgdg.list | ||||
|     apt-get update && apt-get install -y --no-install-recommends \ | ||||
|       postgresql-$DATA_VERSION \ | ||||
|       && rm -rf /var/lib/apt/lists/* | ||||
|     echo "shuffling around" | ||||
|     gosu postgres mkdir $OLDDATA $NEWDATA | ||||
|     chmod 700 $OLDDATA $NEWDATA | ||||
|     mv $PGDATA/* $OLDDATA/ || true | ||||
|     touch $MIGRATION_MARKER | ||||
|     echo "running initdb" | ||||
|     # abuse entrypoint script for initdb by making server error out | ||||
|     gosu postgres bash -c "export PGDATA=$NEWDATA ; /usr/local/bin/docker-entrypoint.sh --invalid-arg || true" | ||||
|     echo "running pg_upgrade" | ||||
|     cd /tmp | ||||
|     gosu postgres pg_upgrade --link -b /usr/lib/postgresql/$DATA_VERSION/bin -d $OLDDATA -D $NEWDATA -U $POSTGRES_USER | ||||
|     cp $OLDDATA/pg_hba.conf $NEWDATA/ | ||||
|     mv $NEWDATA/* $PGDATA | ||||
|     rm -rf $OLDDATA | ||||
|     rmdir $NEWDATA | ||||
|     rm $MIGRATION_MARKER | ||||
|     echo "migration complete" | ||||
|   fi | ||||
| fi | ||||
|  | ||||
| /usr/local/bin/docker-entrypoint.sh postgres | ||||
| @ -1,10 +1,27 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| {{ if eq (env "FILE_STORAGE")  "s3" }} | ||||
| export AWS_SECRET_ACCESS_KEY=$(cat /run/secrets/aws_secret_key) | ||||
| {{ end }} | ||||
|  | ||||
| {{ if eq (env "SMTP_ENABLED") "1" }} | ||||
| export SMTP_PASSWORD=$(cat /run/secrets/smtp_password) | ||||
| {{ end }} | ||||
|  | ||||
| {{ if eq (env "OIDC_ENABLED") "1" }} | ||||
| export OIDC_CLIENT_SECRET=$(cat /run/secrets/oidc_client_secret) | ||||
| {{ end }} | ||||
|  | ||||
| {{ if eq (env "GOOGLE_ENABLED") "1" }} | ||||
| export GOOGLE_CLIENT_SECRET=$(cat /run/secrets/google_client_secret) | ||||
| {{ end }} | ||||
|  | ||||
| export UTILS_SECRET=$(cat /run/secrets/utils_secret) | ||||
| export SECRET_KEY=$(cat /run/secrets/secret_key) | ||||
| export DATABASE_PASSWORD=$(cat /run/secrets/db_password) | ||||
| export DATABASE_URL="postgres://outline:${DATABASE_PASSWORD}@${STACK_NAME}_postgres:5432/outline" | ||||
| export DATABASE_URL="postgres://outline:${DATABASE_PASSWORD}@${STACK_NAME}_db:5432/outline" | ||||
|  | ||||
| /usr/local/bin/yarn start "$@" | ||||
| if [ ! "$1" = "-e" ]; then | ||||
| 	/usr/local/bin/yarn db:migrate --env=production-ssl-disabled | ||||
| 	/usr/local/bin/yarn start "$@" | ||||
| fi | ||||
|  | ||||
							
								
								
									
										30
									
								
								release/0.4.0+0.64.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								release/0.4.0+0.64.3
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | ||||
| WARNING: This is a breaking release, you will certainly need to read this & fix | ||||
| your config to have a successful deployment! There has been a lot of churn on | ||||
| this recipe due to the experimental nature of getting things up and running. | ||||
| We're hoping things will stabilise soon. It's a lovely software after all and | ||||
| users are enjoying using it. | ||||
|  | ||||
| - Additional login methods have been added e.g. Google (yep...). You now need | ||||
|   to make a choice of which authentication you want to make. This can be done by | ||||
|   using the usual `$AUTH_ENABLED=1` environment variable condition. See the | ||||
|   recipe `.env.sample` for more. | ||||
|  | ||||
| - If you were using the generic OpenID Connect authentication method (e.g. | ||||
|   Keycloak, Authentik) then you will now need to use | ||||
|   `COMPOSE_FILE=compose.yml:compose.oidc.yml` and provide the `OIDC_*` | ||||
|   environment variables in your `.env` file. See the recipe `.env.sample` for | ||||
|   more. | ||||
|  | ||||
| - We are no longer using a fork of Outline for the recipe (yay!). If you were | ||||
|   using the old patched version, you'll have to deal with some migration issues. | ||||
|   See https://git.coopcloud.tech/coop-cloud/outline#deleting-a-user-e-g-to-fix-sso-weirdness | ||||
|   for more. | ||||
|  | ||||
| - Furthermore, following https://git.coopcloud.tech/coop-cloud/outline/issues/9, you will | ||||
|   need to undeploy your stack and re-deploy as some of the services have been renamed to | ||||
|   maintain naming conventions with other recipes. | ||||
|  | ||||
| There has been a lot of changes. Please add to this file if you see more | ||||
| weirdness to help the rest of the Co-op Cloud Comrades. | ||||
|  | ||||
| @decentral1se (Autonomic Co-op) | ||||
		Reference in New Issue
	
	Block a user
	