mirror of
				https://github.com/gristlabs/grist-core.git
				synced 2025-06-13 20:53:59 +00:00 
			
		
		
		
	(core) give instructions on using Grist with docker
Summary: cleans up docker build and instructions. Test Plan: docker image and instructions tested manually Reviewers: dsagal Reviewed By: dsagal Differential Revision: https://phab.getgrist.com/D2648
This commit is contained in:
		
							parent
							
								
									d7802bc7db
								
							
						
					
					
						commit
						9287439e5a
					
				| @ -46,6 +46,9 @@ ADD ormconfig.js ormconfig.js | ||||
| ADD bower_components bower_components | ||||
| ADD sandbox sandbox | ||||
| 
 | ||||
| # Keep all storage user may want to persist in a distinct directory | ||||
| RUN mkdir -p /persist/docs | ||||
| 
 | ||||
| # Set some default environment variables to give a setup that works out of the box when | ||||
| # started as: | ||||
| #   docker run -p 8484:8484 -it <image> | ||||
| @ -53,7 +56,9 @@ ADD sandbox sandbox | ||||
| ENV GRIST_ORG_IN_PATH=true | ||||
| ENV GRIST_HOST=0.0.0.0 | ||||
| ENV APP_HOME_URL=http://localhost:8484 | ||||
| ENV GRIST_DATA_DIR=docs | ||||
| RUN mkdir -p docs | ||||
| ENV APP_DOC_URL=http://localhost:8484 | ||||
| ENV GRIST_DATA_DIR=/persist/docs | ||||
| ENV GRIST_SESSION_COOKIE=grist_core | ||||
| ENV TYPEORM_DATABASE=/persist/home.sqlite3 | ||||
| EXPOSE 8484 | ||||
| CMD npm run start:prod | ||||
|  | ||||
							
								
								
									
										53
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								README.md
									
									
									
									
									
								
							| @ -5,14 +5,34 @@ robustness of a database to organize your data and make you more productive. | ||||
| 
 | ||||
| > :warning: This repository is in a pre-release state. Its release will be announced when it has | ||||
| all the planned components, and a solid independent build and test set-up. Currently, stand-alone | ||||
| server functionality is present. Release of our web client is planned, along with an extensive | ||||
| test suite. | ||||
| server functionality is present, along with a single-user web client. | ||||
| 
 | ||||
| This repository, [grist-core](https://github.com/gristlabs/grist-core), is maintained by Grist | ||||
| Labs. Our flagship product, available at https://www.getgrist.com, is built from the code you see | ||||
| here, combined with business-specific software designed to scale it to many users, handle billing, | ||||
| etc. | ||||
| 
 | ||||
| ## Opening and editing a Grist document locally | ||||
| 
 | ||||
| The easiest way to use Grist locally is with [Docker](https://www.docker.com/get-started). | ||||
| From a terminal, do: | ||||
| 
 | ||||
| ```sh | ||||
| docker pull gristlabs/grist | ||||
| docker run -p 8484:8484 -it gristlabs/grist | ||||
| ``` | ||||
| 
 | ||||
| Then visit `http://localhost:8484` in your browser. You'll be able to create and edit documents, | ||||
| and to import documents downloaded from the https://docs.getgrist.com host. You'll also be able | ||||
| to use the Grist API. | ||||
| 
 | ||||
| To preserve your work across docker runs, provide a directory to save it in: | ||||
| 
 | ||||
| ```sh | ||||
| docker pull gristlabs/grist | ||||
| docker run -p 8484:8484 -v $PWD/persist:/persist -it gristlabs/grist | ||||
| ``` | ||||
| 
 | ||||
| ## Why Open Source? | ||||
| 
 | ||||
| By opening its source code and offering an [OSI](https://opensource.org/)-approved free license, | ||||
| @ -38,25 +58,22 @@ Grist benefits its users: | ||||
|   include Grist in your pipeline. And if a feature is missing, you can just take the source code and | ||||
|   build on top of it! | ||||
| 
 | ||||
| ## How do I start? | ||||
| ## Building from source | ||||
| 
 | ||||
| For building from source, you can start with this: | ||||
| Here are the steps needed: | ||||
| 
 | ||||
|     npm install | ||||
|     npm run build:prod | ||||
|     npm run install:python | ||||
|     npm start | ||||
|     # unauthenticated grist api available at http://localhost:8484/api/ | ||||
| ```sh | ||||
| npm install | ||||
| npm run build:prod | ||||
| npm run install:python | ||||
| npm start | ||||
| # unauthenticated grist client available at http://localhost:8484 | ||||
| # unauthenticated grist api available at http://localhost:8484/api/ | ||||
| ``` | ||||
| 
 | ||||
| Then you can use the Grist API locally to work on a document. Currently you need | ||||
| to "upload" a document to work with it. This makes a copy of it that the server | ||||
| controls - you can find it in the `data` directory: | ||||
| 
 | ||||
|     curl -F 'upload=@YourDocument.grist' http://localhost:8484/api/docs | ||||
|     # Note the document ID that is returned. | ||||
| 
 | ||||
| The [Data-Tables endpoints](https://support.getgrist.com/api/#tag/Data-Tables) are | ||||
| particularly useful. | ||||
| Then you can use the Grist client, or the API. You cannot (yet) edit Grist documents | ||||
| in place on your file system. All imported/created documents will appear in the `docs` | ||||
| subdirectory. | ||||
| 
 | ||||
| For using hosted Grist, just head on over to <https://www.getgrist.com>. | ||||
| 
 | ||||
|  | ||||
| @ -222,6 +222,7 @@ export class FlexServer implements GristServer { | ||||
| 
 | ||||
|   public addLogging() { | ||||
|     if (this._check('logging')) { return; } | ||||
|     if (process.env.GRIST_LOG_SKIP_HTTP) { return; } | ||||
|     // Add a timestamp token that matches exactly the formatting of non-morgan logs.
 | ||||
|     morganLogger.token('logTime', (req: Request) => log.timestamp()); | ||||
|     // Add an optional gristInfo token that can replace the url, if the url is sensitive
 | ||||
| @ -335,7 +336,7 @@ export class FlexServer implements GristServer { | ||||
|     // Allow static files to be requested from any origin.
 | ||||
|     const options: serveStatic.ServeStaticOptions = { | ||||
|       setHeaders: (res, filepath, stat) => { | ||||
|         res.header("Access-Control-Allow-Origin", "*"); | ||||
|         res.setHeader("Access-Control-Allow-Origin", "*"); | ||||
|       } | ||||
|     }; | ||||
|     // Grist has static help files, which may be useful for standalone app,
 | ||||
| @ -385,7 +386,14 @@ export class FlexServer implements GristServer { | ||||
|     this.dbManager.setPrefix(process.env.GRIST_ID_PREFIX || ""); | ||||
|     await this.dbManager.connect(); | ||||
|     await this.dbManager.initializeSpecialIds(); | ||||
| 
 | ||||
|     // If working without a login system, make sure default user exists.
 | ||||
|     if (process.env.GRIST_DEFAULT_EMAIL) { | ||||
|       const profile: UserProfile = { | ||||
|         name: 'You', | ||||
|         email: process.env.GRIST_DEFAULT_EMAIL, | ||||
|       }; | ||||
|       await this.dbManager.getUserByLoginWithRetry(profile.email, profile); | ||||
|     } | ||||
|     // Report which database we are using, without sensitive credentials.
 | ||||
|     this.info.push(['database', getDatabaseUrl(this.dbManager.connection.options, false)]); | ||||
|   } | ||||
|  | ||||
| @ -64,7 +64,7 @@ function timestamp() { | ||||
| 
 | ||||
| const fileTransportOptions = { | ||||
|   stream: process.stderr, | ||||
|   level: 'debug', | ||||
|   level: process.env.GRIST_LOG_LEVEL || 'debug', | ||||
|   timestamp: log.timestamp, | ||||
|   colorize: true, | ||||
|   json: process.env.GRIST_HOSTED_VERSION ? true : false | ||||
|  | ||||
							
								
								
									
										20
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								package.json
									
									
									
									
									
								
							| @ -1,16 +1,26 @@ | ||||
| { | ||||
|   "name": "grist-core", | ||||
|   "version": "1.0.0", | ||||
|   "description": "", | ||||
|   "main": "index.js", | ||||
|   "version": "0.7.1", | ||||
|   "license": "Apache-2.0", | ||||
|   "description": "Grist is the evolution of spreadsheets", | ||||
|   "homepage": "https://github.com/gristlabs/grist-core", | ||||
|   "repository": "git://github.com/gristlabs/grist-core.git", | ||||
|   "scripts": { | ||||
|     "start": "tsc --build -w --preserveWatchOutput & catw app/client/*.css app/client/*/*.css -o static/bundle.css -v & webpack --config buildtools/webpack.config.js --mode development --watch --hide-modules & NODE_PATH=_build:_build/stubs nodemon -w _build/app/server -w _build/app/common _build/stubs/app/server/server.js & wait", | ||||
|     "install:python": "buildtools/prepare_python.sh", | ||||
|     "build:prod": "tsc --build && webpack --config buildtools/webpack.config.js --mode production && cat app/client/*.css app/client/*/*.css > static/bundle.css", | ||||
|     "start:prod": "NODE_PATH=_build:_build/stubs node _build/stubs/app/server/server.js" | ||||
|   }, | ||||
|   "keywords": [], | ||||
|   "author": "", | ||||
|   "keywords": [ | ||||
|     "grist", | ||||
|     "spreadsheet", | ||||
|     "database" | ||||
|   ], | ||||
|   "author": { | ||||
|     "name": "Grist Labs Inc.", | ||||
|     "email": "info@getgrist.com" | ||||
|   }, | ||||
|   "private": false, | ||||
|   "devDependencies": { | ||||
|     "@types/backbone": "1.3.43", | ||||
|     "@types/content-disposition": "0.5.2", | ||||
|  | ||||
| @ -4,6 +4,16 @@ | ||||
|  * By default, starts up on port 8484. | ||||
|  */ | ||||
| 
 | ||||
| // Set log levels before importing anything.
 | ||||
| if (!process.env.DEBUG) { | ||||
|   // Be a lot less noisy by default.
 | ||||
|   setDefaultEnv('GRIST_LOG_LEVEL', 'error'); | ||||
|   setDefaultEnv('GRIST_LOG_SKIP_HTTP', 'true'); | ||||
| } | ||||
| 
 | ||||
| // Use a distinct cookie.
 | ||||
| setDefaultEnv('GRIST_SESSION_COOKIE', 'grist_core'); | ||||
| 
 | ||||
| import {updateDb} from 'app/server/lib/dbUtils'; | ||||
| import {main as mergedServerMain} from 'app/server/mergedServerMain'; | ||||
| import * as fse from 'fs-extra'; | ||||
| @ -19,13 +29,18 @@ function setDefaultEnv(name: string, value: string) { | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // tslint:disable:no-console
 | ||||
| export async function main() { | ||||
|   // Use a distinct cookie.
 | ||||
|   setDefaultEnv('GRIST_SESSION_COOKIE', 'grist_core'); | ||||
|   console.log('Welcome to Grist.'); | ||||
|   if (!process.env.DEBUG) { | ||||
|     console.log(`In quiet mode, see http://localhost:${G.port} to use.`); | ||||
|     console.log('For full logs, re-run with DEBUG=1'); | ||||
|   } | ||||
| 
 | ||||
|   // There's no login system released yet, so set a default email address.
 | ||||
|   setDefaultEnv('GRIST_DEFAULT_EMAIL', 'support@getgrist.com'); | ||||
|   setDefaultEnv('GRIST_DEFAULT_EMAIL', 'you@example.com'); | ||||
|   // Set directory for uploaded documents.
 | ||||
|   setDefaultEnv('GRIST_DATA_DIR', 'data'); | ||||
|   setDefaultEnv('GRIST_DATA_DIR', 'docs'); | ||||
|   await fse.mkdirp(process.env.GRIST_DATA_DIR!); | ||||
|   // Make a blank db if needed.
 | ||||
|   await updateDb(); | ||||
| @ -34,6 +49,5 @@ export async function main() { | ||||
| } | ||||
| 
 | ||||
| if (require.main === module) { | ||||
|   // tslint:disable-next-line:no-console
 | ||||
|   main().catch((err) => console.error(err)); | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user