From 2181947f83339632a31cf51995e6baf59bad6cba Mon Sep 17 00:00:00 2001 From: Chris Holdgraf Date: Fri, 10 Aug 2018 10:09:24 -0700 Subject: [PATCH] updating content from zexuan's user test --- docs/faq.rst | 12 +++ docs/howto/admin-users.rst | 55 ---------- docs/howto/admin/admin-users.rst | 101 ++++++++++++++++++ docs/howto/{ => admin}/https.rst | 2 +- docs/howto/{ => admin}/nbresuse.rst | 4 +- .../howto/{ => admin}/resource-estimation.rst | 0 docs/howto/auth/firstuse.rst | 36 +++++++ docs/howto/auth/github.rst | 93 ++++++++++------ docs/howto/content/add-data.rst | 95 ++++++++++++++++ .../content}/nbgitpuller.rst | 39 +++++-- docs/howto/content/share-data.rst | 80 ++++++++++++++ docs/howto/{ => envt}/notebook-interfaces.rst | 12 +-- docs/howto/{ => envt}/user-environment.rst | 14 +-- docs/howto/share-data.rst | 62 ----------- docs/images/content/file-upload-buttons.png | Bin 0 -> 22559 bytes docs/images/content/upload-button.png | Bin 0 -> 16181 bytes docs/images/notebook/new-terminal-button.png | Bin 11589 -> 7612 bytes docs/index.rst | 47 ++++---- docs/install/add_packages.txt | 2 +- docs/install/custom-server.rst | 12 +-- docs/topic/security.rst | 2 +- 21 files changed, 468 insertions(+), 200 deletions(-) create mode 100644 docs/faq.rst delete mode 100644 docs/howto/admin-users.rst create mode 100644 docs/howto/admin/admin-users.rst rename docs/howto/{ => admin}/https.rst (99%) rename docs/howto/{ => admin}/nbresuse.rst (89%) rename docs/howto/{ => admin}/resource-estimation.rst (100%) create mode 100644 docs/howto/auth/firstuse.rst create mode 100644 docs/howto/content/add-data.rst rename docs/{tutorials => howto/content}/nbgitpuller.rst (71%) create mode 100644 docs/howto/content/share-data.rst rename docs/howto/{ => envt}/notebook-interfaces.rst (87%) rename docs/howto/{ => envt}/user-environment.rst (94%) delete mode 100644 docs/howto/share-data.rst create mode 100644 docs/images/content/file-upload-buttons.png create mode 100644 docs/images/content/upload-button.png diff --git a/docs/faq.rst b/docs/faq.rst new file mode 100644 index 0000000..18718f6 --- /dev/null +++ b/docs/faq.rst @@ -0,0 +1,12 @@ +================================ +Frequently Asked Questions (FAQ) +================================ + +What is the effect of using ``sudo -E``? +======================================== + +You may notice the use of ``sudo -E`` in several commands in this guide. Using +``-E`` with ``sudo`` allows you to carry over all the environment variables +into the ``sudo`` command. Most importantly, this lets use use the contents +of ``PATH`` with ``sudo``, which gives access to the right path for ``conda``, +``pip``, etc. diff --git a/docs/howto/admin-users.rst b/docs/howto/admin-users.rst deleted file mode 100644 index 4b72fb3..0000000 --- a/docs/howto/admin-users.rst +++ /dev/null @@ -1,55 +0,0 @@ -.. _howto/admin-users: - -======================== -Add / Remove admin users -======================== - -Admin users in TLJH have the following powers: - -#. Full root access to the server with passwordless ``sudo``. - This lets them do literally whatever they want in the server -#. Access servers / home directories of all other users -#. Install new packages for everyone with ``conda``, ``pip`` or ``apt`` -#. Change configuration of TLJH - -This is a lot of power, so make sure you know who you are giving it -to. Admin users should have decent passwords / secure logni mechanisms, -so attackers can not easily gain control of the system. - -Make sure an admin user is present -================================== - -You should make sure an admin user is present when you **install** TLJH -the very first time. The ``:ref:`--admin ``` -flag passed to the installer does this. If you had forgotten to do so, the -easiest way to fix this is to run the installer again. - -Adding new admin users -====================== - -New admin users can be added by executing the following commands on an -admin terminal: - -.. code-block:: bash - - sudo -E tljh-config add-item users.admin - sudo -E tljh-config reload - -If the user is already using the JupyterHub, they might have to stop and -start their server from the control panel to gain new powers. - -Removing admin users -==================== - -You can remove an existing admin user by executing the following commands in -an admin terminal: - -.. code-block:: bash - - sudo -E tljh-config remove-item users.admin - sudo -E tljh-config reload - -If the user is already using the JupyterHub, they will continue to have -some of their admin powers until their server is stopped. Another admin -can force their server to stop by clicking 'Stop Server' in the admin -panel. diff --git a/docs/howto/admin/admin-users.rst b/docs/howto/admin/admin-users.rst new file mode 100644 index 0000000..7c897bf --- /dev/null +++ b/docs/howto/admin/admin-users.rst @@ -0,0 +1,101 @@ +.. _howto/admin/admin-users: + +======================== +Add / Remove admin users +======================== + +Admin users in TLJH have the following powers: + +#. Full root access to the server with passwordless ``sudo``. + This lets them do literally whatever they want in the server +#. Access servers / home directories of all other users +#. Install new packages for everyone with ``conda``, ``pip`` or ``apt`` +#. Change configuration of TLJH + +This is a lot of power, so make sure you know who you are giving it +to. Admin users should have decent passwords / secure logni mechanisms, +so attackers can not easily gain control of the system. + +.. important:: + + You should make sure an admin user is present when you **install** TLJH + the very first time. The ``:ref:`--admin ``` + flag passed to the installer does this. If you had forgotten to do so, the + easiest way to fix this is to run the installer again. + +Adding admin users from the JupyterHub interface +================================================ + +There are two primary user interfaces for doing work on your JupyterHub. By +default, this is the Notebook Interface, and will be used in this section. +If you are using JupyterLab, you can access the Notebook Interface by replacing +``/lab`` with ``/tree`` in your URL. + +#. First, navigate to the Jupyter Notebook interface home page. You can do this + by going to the URL ``/user//tree``. + +#. Open the **Control Panel** by clicking the control panel button on the top + right of your JupyterHub. + + .. image:: ../../images/control-panel-button.png + :alt: Control panel button in notebook, top right + +#. In the control panel, open the **Admin** link in the top left. + + .. image:: ../../images/admin/admin-access-button.png + :alt: Admin button in control panel, top left + + This opens up the JupyterHub admin page, where you can add / delete users, + start / stop peoples' servers and see who is online. + +#. Click the **Add Users** button. + + .. image:: ../../images/admin/add-users-button.png + :alt: Add Users button in the admin page + + A **Add Users** dialog box opens up. + +#. Type the names of users you want to add to this JupyterHub in the dialog box, + one per line. **Make sure to tick the Admin checkbox**. + + .. image:: ../../images/admin/add-users-dialog.png + :alt: Adding users with add users dialog + +#. Click the **Add Users** button in the dialog box. Your users are now added + to the JupyterHub with administrator privileges! + +Adding admin users from the command line +======================================== + +Sometimes it is easier to add or remove admin users from the command line (for +example, if you forgot to add an admin user when first setting up your JupyterHub). + +Adding new admin users +---------------------- + +New admin users can be added by executing the following commands on an +admin terminal: + +.. code-block:: bash + + sudo -E tljh-config add-item users.admin + sudo -E tljh-config reload + +If the user is already using the JupyterHub, they might have to stop and +start their server from the control panel to gain new powers. + +Removing admin users +-------------------- + +You can remove an existing admin user by executing the following commands in +an admin terminal: + +.. code-block:: bash + + sudo -E tljh-config remove-item users.admin + sudo -E tljh-config reload + +If the user is already using the JupyterHub, they will continue to have +some of their admin powers until their server is stopped. Another admin +can force their server to stop by clicking 'Stop Server' in the admin +panel. diff --git a/docs/howto/https.rst b/docs/howto/admin/https.rst similarity index 99% rename from docs/howto/https.rst rename to docs/howto/admin/https.rst index 5609a42..7a336b2 100644 --- a/docs/howto/https.rst +++ b/docs/howto/admin/https.rst @@ -1,4 +1,4 @@ -.. _howto/https: +.. _howto/admin/https: ============ Enable HTTPS diff --git a/docs/howto/nbresuse.rst b/docs/howto/admin/nbresuse.rst similarity index 89% rename from docs/howto/nbresuse.rst rename to docs/howto/admin/nbresuse.rst index 616146d..585c7d5 100644 --- a/docs/howto/nbresuse.rst +++ b/docs/howto/admin/nbresuse.rst @@ -1,4 +1,4 @@ -.. _howto/nbresuse: +.. _howto/admin/nbresuse: ======================= Check your memory usage @@ -11,5 +11,5 @@ top right corner of the notebook interface. Note that this is memory usage for everything your user is running through the Jupyter notebook interface, not just the specific notebook it is shown on. -.. image:: ../images/nbresuse.png +.. image:: ../../images/nbresuse.png :alt: Memory limit / usage shown with nbresuse diff --git a/docs/howto/resource-estimation.rst b/docs/howto/admin/resource-estimation.rst similarity index 100% rename from docs/howto/resource-estimation.rst rename to docs/howto/admin/resource-estimation.rst diff --git a/docs/howto/auth/firstuse.rst b/docs/howto/auth/firstuse.rst new file mode 100644 index 0000000..52b3766 --- /dev/null +++ b/docs/howto/auth/firstuse.rst @@ -0,0 +1,36 @@ +.. _howto/auth/firstuse: + +================================================== +Let users choose a password when they first log in +================================================== + +The **First Use Authenticator** lets users choose their own password. +Upon their first log-in attempt, whatever password they use will be stored +as their password for subsequent log in attempts. This is +the default authenticator that ships with TLJH. + +Enabling the authenticator +========================== + +.. note:: the FirstUseAuthenticator is enabled by default in TLJH. + +#. Enable the authenticator and reload config to apply the configuration: + + sudo -E tljh-config set auth.type firstuseauthenticator.FirstUseAuthenticator + sudo -E tljh-config reload + +Users who are currently logged in will continue to be logged in. When they +log out and try to log back in, they will be asked to provide a username and +password. + +Allowing anyone to log in to your JupyterHub +============================================ + +By default, you need to manually create user accounts before they will be able +to log in to your JupyterHub. If you wish to allow **any** user to access +the JupyterHub, run the following command. + +.. code-block:: bash + + tljh-config set auth.FirstUseAuthenticator.create_users true + tljh-config reload diff --git a/docs/howto/auth/github.rst b/docs/howto/auth/github.rst index 7962657..ef01c4f 100644 --- a/docs/howto/auth/github.rst +++ b/docs/howto/auth/github.rst @@ -9,52 +9,81 @@ GitHub user ID / password. To do so, you'll first need to register an application with GitHub, and then provide information about this application to your ``tljh`` configuration. -Enabling the authenticator -========================== - .. note:: You'll need a GitHub account in order to complete these steps. -#. Create a GitHub application - #. Go to the `GitHub OAuth app creation page `_. - #. **Application name**: Choose a descriptive application name (e.g. ``tljh``) - #. **Homepage URL**: Use the IP address or URL of your JupyterHub. e.g. ``http://```. - #. **Application description**: Use any description that you like. - #. **Authorization callback URL**: Insert text with the following form:: +Step 1: Create a GitHub application +=================================== - http:///hub/oauth_callback +#. Go to the `GitHub OAuth app creation page `_. - #. When you're done filling in the page, it should look something like this: + * **Application name**: Choose a descriptive application name (e.g. ``tljh``) + * **Homepage URL**: Use the IP address or URL of your JupyterHub. e.g. ``http://```. + * **Application description**: Use any description that you like. + * **Authorization callback URL**: Insert text with the following form:: + + http:///hub/oauth_callback + + * When you're done filling in the page, it should look something like this: .. image:: ../../images/auth/github/create_application.png :alt: Create a GitHub OAuth application - #. Click "Register application". - #. You'll be taken to a page with the registered application details. Note - the **Client ID** and **Client Secret**, as you will use these later. +#. Click "Register application". You'll be taken to a page with the registered application details. +#. Copy the **Client ID** and **Client Secret** from the application details + page. You will use these later to configure your JupyterHub authenticator. - .. image:: ../../images/auth/github/client_id_secret.png - :alt: Your client ID and secret + .. image:: ../../images/auth/github/client_id_secret.png + :alt: Your client ID and secret -#. Configure your JupyterHub to use the GitHub Oathenticator - #. Log in as an administrator account to your JupyterHub. - #. Open a terminal on your JupyterHub. - #. Configure the GitHub OAuthenticator to use your client ID and secret with the following commands:: +.. important:: - sudo -E tljh-config set auth.GitHubOAuthenticator.client_id '' - sudo -E tljh-config set auth.GitHubOAuthenticator.client_secret '' + If you are using a virtual machine from a cloud provider and + **stop the VM**, then when you re-start the VM, the provider will likely assign a **new public + IP address** to it. In this case, **you must update your GitHub application information** + with the new IP address. - #. Tell your JupyterHub to *use* the GitHub OAuthenticator for authentication:: +Configure your JupyterHub to use the GitHub Oathenticator +========================================================= - sudo -E tljh-config set auth.type oauthenticator.github.GitHubOAuthenticator +We'll use the ``tljh-config`` tool to configure your JupyterHub's authentication. +For more information on ``tljh-config``, see :ref:`topic/tljh-config`. - #. Restart your JupyterHub so that new users see these changes:: +#. Log in as an administrator account to your JupyterHub. +#. Open a terminal window. - sudo -E tljh-config reload -#. Confirm that the new authentactor works. - #. Open an **incognito window** in your browser. - #. Go to your JupyterHub URL. - #. You should see a GitHub login button like below: + .. image:: ../../images/notebook/new-terminal-button.png + :alt: New terminal button. - .. image:: ../../images/auth/github/client_id_secret.png - :alt: The GitHub authenticator login button. +#. Configure the GitHub OAuthenticator to use your client ID and secret with the following commands:: + + sudo -E tljh-config set auth.GitHubOAuthenticator.client_id '' + + :: + + sudo -E tljh-config set auth.GitHubOAuthenticator.client_secret '' + +#. Tell your JupyterHub to *use* the GitHub OAuthenticator for authentication:: + + sudo -E tljh-config set auth.type oauthenticator.github.GitHubOAuthenticator + +#. Restart your JupyterHub so that new users see these changes:: + + sudo -E tljh-config reload + +Confirm that the new authentactor works +======================================= + +#. **Open an incognito window** in your browser (do not log out until you confirm + that the new authentication method works!) +#. Go to your JupyterHub URL. +#. You should see a GitHub login button like below: + + .. image:: ../../images/auth/github/login_button.png + :alt: The GitHub authenticator login button. + +#. After you log in with your GitHub credentials, you should be directed to the + Jupyter interface used in this JupyterHub. + +#. **If this does not work** you can revert back to the default + JupyterHub authenticator by following the steps in :ref:`howto/auth/firstuse`. diff --git a/docs/howto/content/add-data.rst b/docs/howto/content/add-data.rst new file mode 100644 index 0000000..6614ecc --- /dev/null +++ b/docs/howto/content/add-data.rst @@ -0,0 +1,95 @@ +.. _howto/content/add-data: + +============================= +Adding data to the JupyterHub +============================= + +This section covers how to add data to your JupyterHub either from the internet +or from your own machine. To learn how to **share data** that is already +on your JupyterHub, see :ref:`_howto/content/share-data`. + +.. note:: + + When you add data using the methods on this page, you will **only add it + to your user directory**. This is not a place that is accessible to others. + For information on sharing this data with users on the JupyterHub, see + :ref:`_howto/content/share-data`. + +Adding data from your local machine +=================================== + +The easiest way to add data to your JupyterHub is to use the "Upload" user +interface. To do so, follow these steps: + +#. First, navigate to the Jupyter Notebook interface home page. You can do this + by going to the URL ``/user//tree``. +#. Click the "Upload" button to open the file chooser window. + + .. image:: ../../images/content/upload-button.png + :alt: The upload button in Jupyter. +#. Choose the file you wish to upload. You may select multiple files if you + wish. +#. Click "Upload" for each file that you wish to upload. + + .. image:: ../../images/content/file-upload-buttons.png + :alt: Multiple file upload buttons. +#. Wait for the progress bar to finish for each file. These files will now + be on your JupyterHub, your home user's home directory. + +To learn how to **share** this data with new users on the JupyterHub, +see :ref:`_howto/content/share-data`. + +Downloading data from the command line +====================================== + +If the data of interest is on the internet, you may also use code in order +to download it to your JupyterHub. There are several ways of doing this, so +we'll cover the simplest approach using the unix tool ``wget``. + +#. Log in to your JupyterHub and open a terminal window. + + .. image:: ../../images/notebook/new-terminal-button.png + :alt: New terminal button. + +#. Use ``wget`` to download the file to your current directory in the terminal. + + .. code-block:: bash + + wget + +Example: Downloading the `gapminder `_ dataset. +--------------------------------------------------------------------------- + +In this example we'll download the `gapminder `_ +dataset, which contains information about country GDP and live expectancy over +time. You can download it from your browser `at this link `_. + +#. Log in to your JupyterHub and open a terminal window. + + .. image:: ../../images/notebook/new-terminal-button.png + :alt: New terminal button. + +#. Use ``wget`` to download the gapminder dataset to your current directory in + the terminal. + + .. code-block:: bash + + wget https://swcarpentry.github.io/python-novice-gapminder/files/python-novice-gapminder-data.zip + +#. This is a **zip** file, so we'll need to download a unix tool called "unzip" + in order to unzip it. + + .. code-block:: bash + + sudo -E apt-get install unzip + +#. Finally, unzip the the file: + + unzip python-novice-gapminder-data.zip + +#. Confirm that your data was unzipped. It could be in a folder called ``data/``. + +To learn how to **share** this data with new users on the JupyterHub, +see :ref:`_howto/content/share-data`. + +.. TODO: Downloading data with the "download" module in Python? https://github.com/choldgraf/download diff --git a/docs/tutorials/nbgitpuller.rst b/docs/howto/content/nbgitpuller.rst similarity index 71% rename from docs/tutorials/nbgitpuller.rst rename to docs/howto/content/nbgitpuller.rst index def52b9..b35e699 100644 --- a/docs/tutorials/nbgitpuller.rst +++ b/docs/howto/content/nbgitpuller.rst @@ -1,4 +1,4 @@ -.. _tutorials/nbgitpuller: +.. _howto/content/nbgitpuller: ================================================ Distributing materials to users with nbgitpuller @@ -38,22 +38,24 @@ Pre-requisites Step 1: Generate nbgitpuller link ================================= +**Generate the link with a Binder app**. + #. The easiest way to generate an nbgitpuller link is to use the `mybinder.org based application `_. Open it, and wait for it to load. - .. image:: ../images/nbgitpuller/binder-progress.png + .. image:: ../../images/nbgitpuller/binder-progress.png :alt: Progress bar as the binder application loads #. A blank form with some help text will open up. - .. image:: ../images/nbgitpuller/blank-application.png + .. image:: ../../images/nbgitpuller/blank-application.png :alt: Blank application to make nbgitpuller links -#. Enter the URL to your hub under ``hub_url``. Include ``http://`` or - ``https://`` as appropriate. +#. Enter the IP address or URL to your JupyterHub under ``hub_url``. + Include ``http://`` or ``https://`` as appropriate. - .. image:: ../images/nbgitpuller/hub-url-application.png + .. image:: ../../images/nbgitpuller/hub-url-application.png :alt: Application with hub_url filled out #. Enter the URL to your Git repository. This could be from GitHub, @@ -62,7 +64,7 @@ Step 1: Generate nbgitpuller link typing the URL here, you'll notice that the link is already being printed below! - .. image:: ../images/nbgitpuller/git-url-application.png + .. image:: ../../images/nbgitpuller/git-url-application.png :alt: Application with git_url filled out #. If your git repository is using a non-default branch name, @@ -74,7 +76,7 @@ Step 1: Generate nbgitpuller link Make sure this file exists, otherwise users will get a 'File not found' error. - .. image:: ../images/nbgitpuller/filepath-application.png + .. image:: ../../images/nbgitpuller/filepath-application.png :alt: Application with filepath filled out If you do not specify a file path, the user will be shown the @@ -88,6 +90,25 @@ The link printed at the bottom of the form can be distributed to students now! You can also click it to test that it is working as intended, and adjust the form values until you get something you are happy with. +**Hand-craft your nbgitpuller link** + +If you'd prefer to hand-craft your ``nbgitpuller`` link (e.g. if the Binder +link above doesn't work), you can use the following pattern:: + + http:///hub/user-redirect/git-pull?repo=&branch=&subPath=&app= + +- **repo** is the URL of the git repository you want to clone. This parameter is required. +- **branch** is the branch name to use when cloning from the repository. + This parameter is optional and defaults to ``master``. +- **subPath** is the path of the directory / notebook inside the repo to launch after cloning. + This parameter is optional, and defaults to opening the base directory of the linked Git repository. +- **app** This parameter is optional and defaults to either the environment variable + `NBGITPULLER_APP`'s value or `notebook` if it is undefined. The allowed values + are `lab` and `notebook`, the value will determine in what application view + you end up in. +- **urlPath** will, if specified, override `app` and `subPath` and redirect + blindly to the specified path. + Step 2: Users click on the nbgitpuller link =========================================== @@ -102,7 +123,7 @@ Step 2: Users click on the nbgitpuller link #. Users will see a progress bar as the git repository is fetched & any automatic merging required is performed. - .. image:: ../images/nbgitpuller/pull-progress.png + .. image:: ../../images/nbgitpuller/pull-progress.png :alt: Progress bar with git repository being pulled #. Users will now be redirected to the notebook specified in the URL! diff --git a/docs/howto/content/share-data.rst b/docs/howto/content/share-data.rst new file mode 100644 index 0000000..6c0493c --- /dev/null +++ b/docs/howto/content/share-data.rst @@ -0,0 +1,80 @@ +.. _howto/content/share-data: + +========================== +Share data with your users +========================== + +There are a few options for sharing data with your users, this page covers +a few useful patterns. + +Option 1: Distributing data with `nbgitpuller` +============================================== + +For small datasets, the simplest way to share data with your users is via +``nbgitpuller`` links. In this case, users click on your link and the dataset +contained in the link's target repository is downloaded to the user's home +directory. Note that a copy of the dataset will be made for each user. + +For information on creating and sharing ``nbgitpuller`` links, see +:ref:`tutorials/nbgitpuller`. + +Option 2: Create a read-only shared folder for data +=================================================== + +If your data is large or you don't want copies of it to exist, you can create +a read-only shared folder that users have access to. To do this, follow these +steps: + +#. **Log** in to your JupyterHub as an **administrator user**. + +#. **Create a terminal session** with your JupyterHub interface. + + .. image:: ../../images/notebook/new-terminal-button.png + :alt: New terminal button. +#. **Create a folder** where your data will live. We recommend placing shared + data in ``/srv``. The following command creates two folders (``/srv/data`` and + ``/srv/data/my_shared_data_folder``). + + .. code-block:: bash + + sudo -E mkdir -p /srv/data/my_shared_data_folder + +#. **Download the data** into this folder. See :ref:`howto/content/add-data` for + details on how to do this. + +#. All users now have read access to the data in this folder. + +Add a link to the shared folder in the user home directory +---------------------------------------------------------- + +Optionally, you may also **create a symbolic link to the shared data folder** +that you created above in each **new user's** home directory. + +To do this, you can use the server's **user skeleton directory** (``/etc/skel``). +Anything that is placed in this directory will also +show up in a new user's home directory. + +To create a link to the shared folder in the user skeleton directory, +follow these steps: + +#. ``cd`` into the skeleton directory: + + .. code-block:: bash + + cd /etc/skel + +#. **Create a symbolic link** to the data folder + + .. code-block:: bash + + sudo ln -s /src/data/my_shared_data_folder my_shared_data_folder + +#. **Confirm that this worked** by logging in as a new user. You can do this + by opening a new "incognito" browser window and accessing your JupyterHub. + After you log in as a **new user**, the folder should appear in your new + user home directory. + +From now on, when a new user account is created, their home directory will +have this symbolic link (and any other files in ``/etc/skel``) in their home +directory. This will have **no effect on the directories of existing +users**. diff --git a/docs/howto/notebook-interfaces.rst b/docs/howto/envt/notebook-interfaces.rst similarity index 87% rename from docs/howto/notebook-interfaces.rst rename to docs/howto/envt/notebook-interfaces.rst index f6e69ea..e4329e6 100644 --- a/docs/howto/notebook-interfaces.rst +++ b/docs/howto/envt/notebook-interfaces.rst @@ -1,8 +1,8 @@ -.. _notebook_interfaces: +.. _howto/envt/notebook_interfaces: -=========================================== -Change default Notebook Interface for users -=========================================== +======================================= +Change default User Interface for users +======================================= By default, logging into TLJH puts you in the classic Jupyter Notebook interface we all know and love. However, there are at least two other popular notebook @@ -14,8 +14,8 @@ interfaces you can use: Both these interfaces are also shipped with tljh by default. You can try them temporarily, or set them to be the default interface whenever you login. -Trying alternate interface tempoarily -===================================== +Trying an alternate interface temporarily +========================================= When you log in & start your server, by default the URL in your browser will be something like ``/user//tree``. The ``/tree`` is what tells diff --git a/docs/howto/user-environment.rst b/docs/howto/envt/user-environment.rst similarity index 94% rename from docs/howto/user-environment.rst rename to docs/howto/envt/user-environment.rst index a206c4e..f112526 100644 --- a/docs/howto/user-environment.rst +++ b/docs/howto/envt/user-environment.rst @@ -1,4 +1,4 @@ -.. _user_environment: +.. _howto/envt/user_environment: ================================== Install conda, pip or apt packages @@ -9,7 +9,7 @@ environment. Packages / libraries installed in this environment are available to all users on the JupyterHub. Users with :ref:`admin rights ` can install packages easily. -.. _user_environment_pip: +.. _howto/envt/user_environment_pip: Installing pip packages ======================= @@ -20,7 +20,7 @@ almost 145,000 packages in it right now, so a lot of what you need is going to b 1. Log in as an admin user and open a Terminal in your Jupyter Notebook. - .. image:: ../images/notebook/new-terminal-button.png + .. image:: ../../images/notebook/new-terminal-button.png :alt: New Terminal button under New menu If you already have a terminal open as an admin user, that should work too! @@ -39,7 +39,7 @@ almost 145,000 packages in it right now, so a lot of what you need is going to b If you get an error message like ``sudo: pip: command not found``, make sure you are not missing the ``-E`` parameter after ``sudo``. -.. _user_environment_conda: +.. _howto/envt/user_environment_conda: Installing conda packages ========================= @@ -54,7 +54,7 @@ a community maintained repository of conda packages. 1. Log in as an admin user and open a Terminal in your Jupyter Notebook. - .. image:: ../images/notebook/new-terminal-button.png + .. image:: ../../images/notebook/new-terminal-button.png :alt: New Terminal button under New menu If you already have a terminal open as an admin user, that should work too! @@ -73,7 +73,7 @@ a community maintained repository of conda packages. If you get an error message like ``sudo: conda: command not found``, make sure you are not missing the ``-E`` parameter after ``sudo``. -.. _user_environment_apt: +.. _howto/envt/user_environment_apt: Installing apt packages ======================= @@ -90,7 +90,7 @@ make sure to look in the version of Ubuntu you are using! 1. Log in as an admin user and open a Terminal in your Jupyter Notebook. - .. image:: ../images/notebook/new-terminal-button.png + .. image:: ../../images/notebook/new-terminal-button.png :alt: New Terminal button under New menu If you already have a terminal open as an admin user, that should work too! diff --git a/docs/howto/share-data.rst b/docs/howto/share-data.rst deleted file mode 100644 index 8e68e88..0000000 --- a/docs/howto/share-data.rst +++ /dev/null @@ -1,62 +0,0 @@ -.. _howto/share-data: - -========================== -Share data with your users -========================== - -There are a few options for sharing data with your users, this page covers -a few useful patterns. - -Distributing data with `nbgitpuller` -==================================== - -For small datasets, the simplest way to share data with your users is via -``nbgitpuller`` links. In this case, users click on your link and the dataset -contained in the link's target repository is downloaded to the user's home -directory. Note that a copy of the dataset will be made for each user. - -For information on creating and sharing ``nbgitpuller`` links, see -:ref:`tutorials/nbgitpuller`. - -Distributing data with a read-only shared folder -================================================ - -If your data is large or you don't want copies of it to exist, you can create -a read-only shared folder that users have access to. To do this, follow these -steps: - -#. Log in to your JupyterHub as an **administrator user**. -#. Create a terminal session within your JupyterHub interface. -#. Create a folder where your data will live: - - .. code-block:: bash - - sudo mkdir /srv/data/mydatafolder - -#. Download the data into this folder. For example, using ``sudo curl`` or by running - a ``python`` script that downloads the data. - -#. All users now have read access to the data in this folder. - -Optionally, you may also **create a symbolic link to the data folder** in each -**new user's** home directory. To do this, you can use the server's "user skeleton" -directory (``/etc/skel``). Anything that is placed in this directory will also -show up in a new user's home directory. To create a link to the dataset, -follow these steps: - -#. Change into the skeleton directory: - - .. code-block:: bash - - cd /etc/skel - -#. Create a symbolic link to the data folder - - .. code-block:: bash - - sudo ln -s /src/data/mydatafolder mydatafolder - -From now on, when a new user account is created, their home directory will -have this symbolic link (and any other files in ``/etc/skel``) in their home -directory. This will have no effects on the home directories of existing -users. diff --git a/docs/images/content/file-upload-buttons.png b/docs/images/content/file-upload-buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..7662e2a94f4e759c5f1fba531f446b40c7edef8c GIT binary patch literal 22559 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 literal 0 HcmV?d00001 diff --git a/docs/images/content/upload-button.png b/docs/images/content/upload-button.png new file mode 100644 index 0000000000000000000000000000000000000000..313cb295483e3527cf927a642ab611dce938430d GIT binary patch literal 16181 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 literal 0 HcmV?d00001 diff --git a/docs/images/notebook/new-terminal-button.png b/docs/images/notebook/new-terminal-button.png index fee5d48154a053666af4a319a6ce6ff5920012fb..1abbfd935607a1ad76f072982c7f5989c6681a67 100644 GIT binary patch literal 7612 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 bHz5nIt>IVhYaPJxXbeqNU6pEOYxw^GqgJ#* diff --git a/docs/index.rst b/docs/index.rst index a03589e..f202f24 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -33,33 +33,31 @@ Ubuntu 18.04. We have a bunch of tutorials to get you started. install/custom-server Once you are ready to run your server for real, -it's a good idea to proceed directly to :doc:`howto/https`. - -Tutorials -========= - -Tutorials guide you step-by-step through accomplishing a specific task. - -.. toctree:: - :titlesonly: - - tutorials/nbgitpuller.rst +it's a good idea to proceed directly to :doc:`howto/admin/https`. How-To Guides ============= How-To guides answer the question 'How do I...?' for a lot of topics. +Content and Data +---------------- + .. toctree:: :titlesonly: - howto/https - howto/user-environment - howto/admin-users - howto/share-data - howto/notebook-interfaces - howto/resource-estimation - howto/nbresuse + howto/content/nbgitpuller + howto/content/add-data + howto/content/share-data + +The user environment +-------------------- + +.. toctree:: + :titlesonly: + + howto/envt/user-environment + howto/envt/notebook-interfaces Authentication -------------- @@ -73,6 +71,18 @@ with your JupyterHub. For more information on Authentication, see howto/auth/dummy howto/auth/github + howto/auth/firstuse + +Administration and security +--------------------------- + +.. toctree:: + :titlesonly: + + howto/admin/admin-users + howto/admin/resource-estimation + howto/admin/nbresuse + howto/admin/https Topic Guides ============ @@ -101,6 +111,7 @@ guides help you find what is broken & hopefully fix it. .. toctree:: :titlesonly: + faq troubleshooting/logs Often, your issues are not related to TLJH itself but to the cloud provider diff --git a/docs/install/add_packages.txt b/docs/install/add_packages.txt index b7f3510..a8eebc9 100644 --- a/docs/install/add_packages.txt +++ b/docs/install/add_packages.txt @@ -26,4 +26,4 @@ The packages ``gdal`` and ``there`` are now available to all users in JupyterHub If a user already had a python notebook running, they have to restart their notebook's kernel to make the new libraries available. -See :ref:`user_environment` for more information. +See :ref:`howto/envt/user_environment` for more information. diff --git a/docs/install/custom-server.rst b/docs/install/custom-server.rst index c340827..d476b72 100644 --- a/docs/install/custom-server.rst +++ b/docs/install/custom-server.rst @@ -33,16 +33,15 @@ Step 1: Installing The Littlest JupyterHub #. Copy the text below, and paste it into the terminal. Replace ```` with the name of the first **admin user** for this - JupyterHub. This admin user can log in after the JupyterHub is set up, and + JupyterHub. Choose any name you like (don't forget to replace the brackets!). + This admin user can log in after the JupyterHub is set up, and can configure it to their needs. **Remember to add your username**! .. code-block:: bash - curl https://raw.githubusercontent.com/jupyterhub/the-littlest-jupyterhub/master/bootstrap/bootstrap.py \ - | sudo python3 - \ - --admin + curl https://raw.githubusercontent.com/jupyterhub/the-littlest-jupyterhub/master/bootstrap/bootstrap.py | sudo python3 - --admin - .. note: + .. note:: See :ref:`topic/installer-actions` if you want to understand exactly what the installer is doing. :ref:`topic/customizing-installer` documents other options that can be passed to the installer. @@ -56,7 +55,8 @@ Step 1: Installing The Littlest JupyterHub .. image:: ../images/first-login.png :alt: JupyterHub log-in page -#. Login using the **admin user name** you used in step 2, and a password. Use a +#. Login using the **admin user name** you used in step 2. You can choose any + password that you wish. Use a strong password & note it down somewhere, since this will be the password for the admin user account from now on. diff --git a/docs/topic/security.rst b/docs/topic/security.rst index b4d8d8f..6399c3c 100644 --- a/docs/topic/security.rst +++ b/docs/topic/security.rst @@ -70,4 +70,4 @@ HTTPS ===== Any internet-facing JupyterHub should use HTTPS to secure its traffic. For -information on how to use HTTPS with your JupyterHub, see :ref:`howto/https`. +information on how to use HTTPS with your JupyterHub, see :ref:`_howto/admin/https`.